From 934d633d4d693b808db4c6afa524f7b7f51595ff Mon Sep 17 00:00:00 2001
From: Juan Cruz Vincenti <juancruzvincenti@gmail.com>
Date: Thu, 11 Nov 2021 20:06:32 -0300
Subject: [PATCH 001/803] Add description to monitor * Add description to
 monitor model * Add description field to database * Add english and spanish
 translation for description * Closes: #482

---
 db/patch-add-description-monitor.sql | 7 +++++++
 server/database.js                   | 1 +
 server/model/monitor.js              | 2 ++
 server/server.js                     | 2 ++
 src/components/MonitorList.vue       | 3 +++
 src/icon.js                          | 2 ++
 src/languages/en.js                  | 1 +
 src/languages/es-ES.js               | 1 +
 src/pages/Details.vue                | 1 +
 src/pages/EditMonitor.vue            | 6 ++++++
 10 files changed, 26 insertions(+)
 create mode 100644 db/patch-add-description-monitor.sql

diff --git a/db/patch-add-description-monitor.sql b/db/patch-add-description-monitor.sql
new file mode 100644
index 00000000..da1aa55b
--- /dev/null
+++ b/db/patch-add-description-monitor.sql
@@ -0,0 +1,7 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+ALTER TABLE monitor
+    ADD description TEXT default null;
+
+COMMIT;
diff --git a/server/database.js b/server/database.js
index afcace70..55f08a0c 100644
--- a/server/database.js
+++ b/server/database.js
@@ -53,6 +53,7 @@ class Database {
         "patch-2fa-invalidate-used-token.sql": true,
         "patch-notification_sent_history.sql": true,
         "patch-monitor-basic-auth.sql": true,
+        "patch-add-description-monitor.sql": true,
     }
 
     /**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 6aa614b7..50f11e87 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -31,6 +31,7 @@ class Monitor extends BeanModel {
         return {
             id: this.id,
             name: this.name,
+            description: this.description,
         };
     }
 
@@ -54,6 +55,7 @@ class Monitor extends BeanModel {
         return {
             id: this.id,
             name: this.name,
+            description: this.description,
             url: this.url,
             method: this.method,
             body: this.body,
diff --git a/server/server.js b/server/server.js
index 868bbd5e..794f67b4 100644
--- a/server/server.js
+++ b/server/server.js
@@ -568,6 +568,7 @@ exports.entryPage = "dashboard";
                 }
 
                 bean.name = monitor.name;
+                bean.description = monitor.description;
                 bean.type = monitor.type;
                 bean.url = monitor.url;
                 bean.method = monitor.method;
@@ -1134,6 +1135,7 @@ exports.entryPage = "dashboard";
                             let monitor = {
                                 // Define the new variable from earlier here
                                 name: monitorListData[i].name,
+                                description: monitorListData[i].description,
                                 type: monitorListData[i].type,
                                 url: monitorListData[i].url,
                                 method: monitorListData[i].method || "GET",
diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index ef51e89c..29d14d1f 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -23,6 +23,9 @@
                         <div class="info">
                             <Uptime :monitor="item" type="24" :pill="true" />
                             {{ item.name }}
+                            <span :title="item.description">
+                                <font-awesome-icon icon="info-circle" />
+                            </span>
                         </div>
                         <div class="tags">
                             <Tag v-for="tag in item.tags" :key="tag" :item="tag" :size="'sm'" />
diff --git a/src/icon.js b/src/icon.js
index e78992f2..55e66291 100644
--- a/src/icon.js
+++ b/src/icon.js
@@ -33,6 +33,7 @@ import {
     faFile,
     faAward,
     faLink,
+    faInfoCircle,
 } from "@fortawesome/free-solid-svg-icons";
 
 library.add(
@@ -65,6 +66,7 @@ library.add(
     faFile,
     faAward,
     faLink,
+    faInfoCircle,
 );
 
 export { FontAwesomeIcon };
diff --git a/src/languages/en.js b/src/languages/en.js
index fee80a76..d238bb66 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -46,6 +46,7 @@ export default {
     Unknown: "Unknown",
     Pause: "Pause",
     Name: "Name",
+    Description: "Description",
     Status: "Status",
     DateTime: "DateTime",
     Message: "Message",
diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js
index d772db06..fe04d86a 100644
--- a/src/languages/es-ES.js
+++ b/src/languages/es-ES.js
@@ -34,6 +34,7 @@ export default {
     Unknown: "Desconocido",
     Pause: "Pausar",
     Name: "Nombre",
+    Description: "Descripción",
     Status: "Estado",
     DateTime: "Fecha y Hora",
     Message: "Mensaje",
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index d40561fe..12e86df4 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -2,6 +2,7 @@
     <transition name="slide-fade" appear>
         <div v-if="monitor">
             <h1> {{ monitor.name }}</h1>
+            <p>{{ monitor.description }}</p>
             <div class="tags">
                 <Tag v-for="tag in monitor.tags" :key="tag.id" :item="tag" :size="'sm'" />
             </div>
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 4a0d0408..a0e68676 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -41,6 +41,12 @@
                                 <input id="name" v-model="monitor.name" type="text" class="form-control" required>
                             </div>
 
+                            <!-- Description -->
+                            <div class="my-3">
+                                <label for="description" class="form-label">{{ $t("Description") }}</label>
+                                <input id="description" v-model="monitor.description" type="text" class="form-control">
+                            </div>
+
                             <!-- URL -->
                             <div v-if="monitor.type === 'http' || monitor.type === 'keyword' " class="my-3">
                                 <label for="url" class="form-label">{{ $t("URL") }}</label>

From fbf2df9e7af19bee7f02ea41d2ead5b90ccd2882 Mon Sep 17 00:00:00 2001
From: Juan Cruz Vincenti <juancruzvincenti@gmail.com>
Date: Thu, 25 Nov 2021 18:11:13 -0300
Subject: [PATCH 002/803] Add conditional rendering to description * Modify
 Details component * Modify MonitorList component

---
 src/components/MonitorList.vue | 2 +-
 src/pages/Details.vue          | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index 29d14d1f..19f2c837 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -23,7 +23,7 @@
                         <div class="info">
                             <Uptime :monitor="item" type="24" :pill="true" />
                             {{ item.name }}
-                            <span :title="item.description">
+                            <span v-if="item.description" :title="item.description">
                                 <font-awesome-icon icon="info-circle" />
                             </span>
                         </div>
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 12e86df4..d96e42eb 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -2,7 +2,7 @@
     <transition name="slide-fade" appear>
         <div v-if="monitor">
             <h1> {{ monitor.name }}</h1>
-            <p>{{ monitor.description }}</p>
+            <p v-if="monitor.description">{{ monitor.description }}</p>
             <div class="tags">
                 <Tag v-for="tag in monitor.tags" :key="tag.id" :item="tag" :size="'sm'" />
             </div>

From 0d3414c6d6089f7b41f6bb4b1729f01ab2cb5e62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sun, 23 Jan 2022 15:22:00 +0100
Subject: [PATCH 003/803] A complete maintenance planning system has been
 created

---
 db/patch-maintenance-table.sql     |  25 +++
 package-lock.json                  |  54 ++++---
 server/database.js                 |   1 +
 server/model/heartbeat.js          |   1 +
 server/model/maintenance.js        |  38 +++++
 server/model/monitor.js            |  64 +++++++-
 server/routers/api-router.js       |  38 ++++-
 server/server.js                   | 217 +++++++++++++++++++++++++
 src/assets/app.scss                |   1 +
 src/assets/vars.scss               |   1 +
 src/components/HeartbeatBar.vue    |   6 +-
 src/components/MonitorList.vue     |  91 ++++++++++-
 src/components/PingChart.vue       |  10 +-
 src/components/PublicGroupList.vue |   4 +
 src/components/Status.vue          |   8 +
 src/components/Uptime.vue          |   8 +
 src/icon.js                        |   2 +
 src/languages/en.js                |   2 +
 src/languages/zh-TW.js             |   1 -
 src/layouts/Layout.vue             |  26 ++-
 src/mixins/datetime.js             |  17 ++
 src/mixins/socket.js               |  36 ++++-
 src/pages/Dashboard.vue            |   1 +
 src/pages/DashboardHome.vue        |  22 ++-
 src/pages/Details.vue              |   4 +
 src/pages/EditMaintenance.vue      | 247 +++++++++++++++++++++++++++++
 src/pages/EditMonitor.vue          |   2 +-
 src/pages/MaintenanceDetails.vue   | 141 ++++++++++++++++
 src/pages/StatusPage.vue           |  64 +++++++-
 src/router.js                      |  22 ++-
 src/util.js                        |  10 +-
 src/util.ts                        |   8 +-
 32 files changed, 1121 insertions(+), 51 deletions(-)
 create mode 100644 db/patch-maintenance-table.sql
 create mode 100644 server/model/maintenance.js
 create mode 100644 src/pages/EditMaintenance.vue
 create mode 100644 src/pages/MaintenanceDetails.vue

diff --git a/db/patch-maintenance-table.sql b/db/patch-maintenance-table.sql
new file mode 100644
index 00000000..ee4a7f88
--- /dev/null
+++ b/db/patch-maintenance-table.sql
@@ -0,0 +1,25 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+CREATE TABLE maintenance
+(
+    id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+    title       VARCHAR(150),
+    description TEXT,
+    user_id     INTEGER REFERENCES user ON UPDATE CASCADE ON DELETE SET NULL,
+    start_date  DATETIME,
+    end_date    DATETIME
+);
+
+CREATE TABLE monitor_maintenance
+(
+    id             INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+    monitor_id     INTEGER NOT NULL,
+    maintenance_id INTEGER NOT NULL,
+    CONSTRAINT FK_maintenance FOREIGN KEY (maintenance_id) REFERENCES maintenance (id) ON DELETE CASCADE ON UPDATE CASCADE,
+    CONSTRAINT FK_monitor FOREIGN KEY (monitor_id) REFERENCES monitor (id) ON DELETE CASCADE ON UPDATE CASCADE
+);
+
+create index maintenance_user_id on maintenance (user_id);
+
+COMMIT;
diff --git a/package-lock.json b/package-lock.json
index fc21a63f..7ab00b75 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14914,7 +14914,8 @@
         "@fortawesome/vue-fontawesome": {
             "version": "3.0.0-5",
             "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.0-5.tgz",
-            "integrity": "sha512-aNmBT4bOecrFsZTog1l6AJDQHPP3ocXV+WQ3Ogy8WZCqstB/ahfhH4CPu5i4N9Hw0MBKXqE+LX+NbUxcj8cVTw=="
+            "integrity": "sha512-aNmBT4bOecrFsZTog1l6AJDQHPP3ocXV+WQ3Ogy8WZCqstB/ahfhH4CPu5i4N9Hw0MBKXqE+LX+NbUxcj8cVTw==",
+            "requires": {}
         },
         "@gar/promisify": {
             "version": "1.1.2",
@@ -16117,7 +16118,8 @@
             "version": "1.9.4",
             "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.9.4.tgz",
             "integrity": "sha512-0CZqaCoChriPTTtGkERy1LGPcYjGFpi2uYRhBPIkqJqUGV5JnJFhQAgh6oH9j5XZHfrRaisX8W0xSpO4T7S78A==",
-            "dev": true
+            "dev": true,
+            "requires": {}
         },
         "@vue/compiler-core": {
             "version": "3.2.22",
@@ -16277,7 +16279,8 @@
             "version": "5.3.2",
             "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
             "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-            "dev": true
+            "dev": true,
+            "requires": {}
         },
         "acorn-walk": {
             "version": "7.2.0",
@@ -16766,7 +16769,8 @@
         "bootstrap": {
             "version": "5.1.3",
             "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
-            "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q=="
+            "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
+            "requires": {}
         },
         "brace-expansion": {
             "version": "1.1.11",
@@ -16958,7 +16962,8 @@
         "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=="
+            "integrity": "sha512-EnbVqTJGFKLpg1TROLdCEufrzbmIa2oeLGx8O2Wdjw2EoMudoOo9+YFu+6CM0Z0hQ/v3yq/e/Y6efQMu22n8Jg==",
+            "requires": {}
         },
         "check-password-strength": {
             "version": "2.0.3",
@@ -17548,7 +17553,8 @@
                 "ws": {
                     "version": "8.2.3",
                     "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
-                    "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA=="
+                    "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+                    "requires": {}
                 }
             }
         },
@@ -17571,7 +17577,8 @@
                 "ws": {
                     "version": "8.2.3",
                     "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
-                    "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA=="
+                    "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+                    "requires": {}
                 }
             }
         },
@@ -20015,7 +20022,8 @@
             "version": "1.2.2",
             "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
             "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
-            "dev": true
+            "dev": true,
+            "requires": {}
         },
         "jest-puppeteer": {
             "version": "6.0.0",
@@ -21774,12 +21782,14 @@
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
             "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
-            "dev": true
+            "dev": true,
+            "requires": {}
         },
         "postcss-scss": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.2.tgz",
-            "integrity": "sha512-xfdkU128CkKKKVAwkyt0M8OdnelJ3MRcIRAPPQkRpoPeuzWY3RIeg7piRCpZ79MK7Q16diLXMMAD9dN5mauPlQ=="
+            "integrity": "sha512-xfdkU128CkKKKVAwkyt0M8OdnelJ3MRcIRAPPQkRpoPeuzWY3RIeg7piRCpZ79MK7Q16diLXMMAD9dN5mauPlQ==",
+            "requires": {}
         },
         "postcss-selector-parser": {
             "version": "6.0.8",
@@ -21979,7 +21989,8 @@
                     "version": "7.4.6",
                     "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
                     "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
-                    "dev": true
+                    "dev": true,
+                    "requires": {}
                 }
             }
         },
@@ -23080,7 +23091,8 @@
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz",
             "integrity": "sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==",
-            "dev": true
+            "dev": true,
+            "requires": {}
         },
         "stylelint-config-standard": {
             "version": "24.0.0",
@@ -23653,17 +23665,20 @@
         "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=="
+            "integrity": "sha512-gTo1bMDWOLd/6ihmWv8VlPxhc9QaKoE5YqlsKydUOfrrQ3Q3taljF6yI+1TMtAtJLrvZ8DYrePhgBhY1VCJzbQ==",
+            "requires": {}
         },
         "vue-contenteditable": {
             "version": "3.0.4",
             "resolved": "https://registry.npmjs.org/vue-contenteditable/-/vue-contenteditable-3.0.4.tgz",
-            "integrity": "sha512-CmtqT4zHQwLoJEyNVaXUjjUFPUVYlXXBHfSbRCHCUjODMqrn6L293LM1nc1ELx8epitZZvecTfIqOLlSzB3d+w=="
+            "integrity": "sha512-CmtqT4zHQwLoJEyNVaXUjjUFPUVYlXXBHfSbRCHCUjODMqrn6L293LM1nc1ELx8epitZZvecTfIqOLlSzB3d+w==",
+            "requires": {}
         },
         "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=="
+            "integrity": "sha512-L6Oi+BvmMv6YXvqv5rJNCFHEKSVu7llpWWJczqmAQYOdmPPw5PNYoz1KKS//Fxhi+4QP64dsPjtmvnYGo1jemA==",
+            "requires": {}
         },
         "vue-eslint-parser": {
             "version": "7.11.0",
@@ -23735,7 +23750,8 @@
                 "vue-demi": {
                     "version": "0.11.4",
                     "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.11.4.tgz",
-                    "integrity": "sha512-/3xFwzSykLW2HiiLie43a+FFgNOcokbBJ+fzvFXd0r2T8MYohqvphUyDQ8lbAwzQ3Dlcrb1c9ykifGkhSIAk6A=="
+                    "integrity": "sha512-/3xFwzSykLW2HiiLie43a+FFgNOcokbBJ+fzvFXd0r2T8MYohqvphUyDQ8lbAwzQ3Dlcrb1c9ykifGkhSIAk6A==",
+                    "requires": {}
                 }
             }
         },
@@ -23750,7 +23766,8 @@
         "vue-toastification": {
             "version": "2.0.0-rc.5",
             "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz",
-            "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA=="
+            "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==",
+            "requires": {}
         },
         "vuedraggable": {
             "version": "4.1.0",
@@ -23929,7 +23946,8 @@
             "version": "7.5.5",
             "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
             "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
-            "dev": true
+            "dev": true,
+            "requires": {}
         },
         "xml-name-validator": {
             "version": "3.0.0",
diff --git a/server/database.js b/server/database.js
index afcace70..6645e537 100644
--- a/server/database.js
+++ b/server/database.js
@@ -53,6 +53,7 @@ class Database {
         "patch-2fa-invalidate-used-token.sql": true,
         "patch-notification_sent_history.sql": true,
         "patch-monitor-basic-auth.sql": true,
+        "patch-maintenance-table.sql": true,
     }
 
     /**
diff --git a/server/model/heartbeat.js b/server/model/heartbeat.js
index e0a77c06..617ac598 100644
--- a/server/model/heartbeat.js
+++ b/server/model/heartbeat.js
@@ -10,6 +10,7 @@ const { BeanModel } = require("redbean-node/dist/bean-model");
  *      0 = DOWN
  *      1 = UP
  *      2 = PENDING
+ *      3 = MAINTENANCE
  */
 class Heartbeat extends BeanModel {
 
diff --git a/server/model/maintenance.js b/server/model/maintenance.js
new file mode 100644
index 00000000..4958a203
--- /dev/null
+++ b/server/model/maintenance.js
@@ -0,0 +1,38 @@
+const dayjs = require("dayjs");
+const utc = require("dayjs/plugin/utc");
+let timezone = require("dayjs/plugin/timezone");
+dayjs.extend(utc);
+dayjs.extend(timezone);
+const { BeanModel } = require("redbean-node/dist/bean-model");
+
+class Maintenance extends BeanModel {
+
+    /**
+     * Return a object that ready to parse to JSON for public
+     * Only show necessary data to public
+     */
+    async toPublicJSON() {
+        return {
+            id: this.id,
+            title: this.title,
+            description: this.description,
+            start_date: this.start_date,
+            end_date: this.end_date
+        };
+    }
+
+    /**
+     * Return a object that ready to parse to JSON
+     */
+    async toJSON() {
+        return {
+            id: this.id,
+            title: this.title,
+            description: this.description,
+            start_date: this.start_date,
+            end_date: this.end_date
+        };
+    }
+}
+
+module.exports = Maintenance;
diff --git a/server/model/monitor.js b/server/model/monitor.js
index c4441d63..cd62ec6b 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -6,7 +6,7 @@ dayjs.extend(utc);
 dayjs.extend(timezone);
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
-const { debug, UP, DOWN, PENDING, flipStatus, TimeLogger } = require("../../src/util");
+const { debug, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger} = require("../../src/util");
 const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, errorLog } = require("../util-server");
 const { R } = require("redbean-node");
 const { BeanModel } = require("redbean-node/dist/bean-model");
@@ -20,6 +20,7 @@ const apicache = require("../modules/apicache");
  *      0 = DOWN
  *      1 = UP
  *      2 = PENDING
+ *      3 = MAINTENANCE
  */
 class Monitor extends BeanModel {
 
@@ -28,9 +29,12 @@ class Monitor extends BeanModel {
      * Only show necessary data to public
      */
     async toPublicJSON() {
+        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now', 'localtime') AND datetime(maintenance.end_date) >= datetime('now', 'localtime')", [this.id]);
+
         return {
             id: this.id,
             name: this.name,
+            maintenance: (maintenance.length !== 0),
         };
     }
 
@@ -50,6 +54,7 @@ class Monitor extends BeanModel {
         }
 
         const tags = await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [this.id]);
+        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now', 'localtime') AND datetime(maintenance.end_date) >= datetime('now', 'localtime')", [this.id]);
 
         return {
             id: this.id,
@@ -79,6 +84,7 @@ class Monitor extends BeanModel {
             pushToken: this.pushToken,
             notificationIDList,
             tags: tags,
+            maintenance: (maintenance.length !== 0),
         };
     }
 
@@ -136,6 +142,8 @@ class Monitor extends BeanModel {
             bean.time = R.isoDateTime(dayjs.utc());
             bean.status = DOWN;
 
+            const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now', 'localtime') AND datetime(maintenance.end_date) >= datetime('now', 'localtime')", [this.id]);
+
             if (this.isUpsideDown()) {
                 bean.status = flipStatus(bean.status);
             }
@@ -148,7 +156,11 @@ class Monitor extends BeanModel {
             }
 
             try {
-                if (this.type === "http" || this.type === "keyword") {
+                if (maintenance.length !== 0) {
+                    bean.msg = "Monitor under maintenance";
+                    bean.status = MAINTENANCE;
+                }
+                else if (this.type === "http" || this.type === "keyword") {
                     // Do not do any queries/high loading things before the "bean.ping"
                     let startTime = dayjs().valueOf();
 
@@ -387,8 +399,13 @@ class Monitor extends BeanModel {
             if (isImportant) {
                 bean.important = true;
 
-                debug(`[${this.name}] sendNotification`);
-                await Monitor.sendNotification(isFirstBeat, this, bean);
+                if (Monitor.isImportantForNotification(isFirstBeat, previousBeat?.status, bean.status)) {
+                    debug(`[${this.name}] sendNotification`);
+                    await Monitor.sendNotification(isFirstBeat, this, bean);
+                }
+                else {
+                    debug(`[${this.name}] will not sendNotification because it is (or was) under maintenance`);
+                }
 
                 // Clear Status Page Cache
                 debug(`[${this.name}] apicache clear`);
@@ -405,6 +422,8 @@ class Monitor extends BeanModel {
                     beatInterval = this.retryInterval;
                 }
                 console.warn(`Monitor #${this.id} '${this.name}': Pending: ${bean.msg} | Max retries: ${this.maxretries} | Retry: ${retries} | Retry Interval: ${beatInterval} seconds | Type: ${this.type}`);
+            } else if (bean.status === MAINTENANCE) {
+                console.warn(`Monitor #${this.id} '${this.name}': Under Maintenance | Type: ${this.type}`);
             } else {
                 console.warn(`Monitor #${this.id} '${this.name}': Failing: ${bean.msg} | Interval: ${beatInterval} seconds | Type: ${this.type}`);
             }
@@ -598,7 +617,7 @@ class Monitor extends BeanModel {
                -- SUM all uptime duration, also trim off the beat out of time window
                 SUM(
                     CASE
-                        WHEN (status = 1)
+                        WHEN (status = 1 OR status = 3)
                         THEN
                             CASE
                                 WHEN (JULIANDAY(\`time\`) - JULIANDAY(?)) * 86400 < duration
@@ -659,11 +678,42 @@ class Monitor extends BeanModel {
         // DOWN -> PENDING = this case not exists
         // DOWN -> DOWN = not important
         // * DOWN -> UP = important
-        let isImportant = isFirstBeat ||
+        // MAINTENANCE -> MAINTENANCE = not important
+        // * MAINTENANCE -> UP = important
+        // * MAINTENANCE -> DOWN = important
+        // * DOWN -> MAINTENANCE = important
+        // * UP -> MAINTENANCE = important
+        return isFirstBeat ||
+            (previousBeatStatus === DOWN && currentBeatStatus === MAINTENANCE) ||
+            (previousBeatStatus === UP && currentBeatStatus === MAINTENANCE) ||
+            (previousBeatStatus === MAINTENANCE && currentBeatStatus === DOWN) ||
+            (previousBeatStatus === MAINTENANCE && currentBeatStatus === UP) ||
+            (previousBeatStatus === UP && currentBeatStatus === DOWN) ||
+            (previousBeatStatus === DOWN && currentBeatStatus === UP) ||
+            (previousBeatStatus === PENDING && currentBeatStatus === DOWN);
+    }
+
+    static isImportantForNotification(isFirstBeat, previousBeatStatus, currentBeatStatus) {
+        // * ? -> ANY STATUS = important [isFirstBeat]
+        // UP -> PENDING = not important
+        // * UP -> DOWN = important
+        // UP -> UP = not important
+        // PENDING -> PENDING = not important
+        // * PENDING -> DOWN = important
+        // PENDING -> UP = not important
+        // DOWN -> PENDING = this case not exists
+        // DOWN -> DOWN = not important
+        // * DOWN -> UP = important
+        // MAINTENANCE -> MAINTENANCE = not important
+        // MAINTENANCE -> UP = not important
+        // * MAINTENANCE -> DOWN = important
+        // DOWN -> MAINTENANCE = not important
+        // UP -> MAINTENANCE = not important
+        return isFirstBeat ||
+            (previousBeatStatus === MAINTENANCE && currentBeatStatus === DOWN) ||
             (previousBeatStatus === UP && currentBeatStatus === DOWN) ||
             (previousBeatStatus === DOWN && currentBeatStatus === UP) ||
             (previousBeatStatus === PENDING && currentBeatStatus === DOWN);
-        return isImportant;
     }
 
     static async sendNotification(isFirstBeat, monitor, bean) {
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 1920cef7..19e4fcad 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -5,7 +5,7 @@ const server = require("../server");
 const apicache = require("../modules/apicache");
 const Monitor = require("../model/monitor");
 const dayjs = require("dayjs");
-const { UP, flipStatus, debug } = require("../../src/util");
+const { UP, MAINTENANCE, flipStatus, debug} = require("../../src/util");
 let router = express.Router();
 
 let cache = apicache.middleware;
@@ -51,6 +51,12 @@ router.get("/api/push/:pushToken", async (request, response) => {
             duration = dayjs(bean.time).diff(dayjs(previousHeartbeat.time), "second");
         }
 
+        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now', 'localtime') AND datetime(maintenance.end_date) >= datetime('now', 'localtime')", [monitor.id]);
+        if (maintenance.length !== 0) {
+            msg = "Monitor under maintenance";
+            status = MAINTENANCE;
+        }
+
         debug("PreviousStatus: " + previousStatus);
         debug("Current Status: " + status);
 
@@ -70,7 +76,7 @@ router.get("/api/push/:pushToken", async (request, response) => {
             ok: true,
         });
 
-        if (bean.important) {
+        if (Monitor.isImportantForNotification(isFirstBeat, previousStatus, status)) {
             await Monitor.sendNotification(isFirstBeat, monitor, bean);
         }
 
@@ -131,6 +137,34 @@ router.get("/api/status-page/incident", async (_, response) => {
     }
 });
 
+// Status Page - Maintenance List
+// Can fetch only if published
+router.get("/api/status-page/maintenance-list", async (_request, response) => {
+    allowDevAllOrigin(response);
+
+    try {
+        await checkPublished();
+        const publicMaintenanceList = [];
+
+        let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
+            SELECT maintenance.*
+            FROM maintenance
+            WHERE datetime(maintenance.start_date) <= datetime('now', 'localtime')
+              AND datetime(maintenance.end_date) >= datetime('now', 'localtime')
+            ORDER BY maintenance.end_date
+        `));
+
+        for (const bean of maintenanceBeanList) {
+            publicMaintenanceList.push(await bean.toPublicJSON());
+        }
+
+        response.json(publicMaintenanceList);
+
+    } catch (error) {
+        send403(response, error.message);
+    }
+});
+
 // Status Page - Monitor List
 // Can fetch only if published
 router.get("/api/status-page/monitor-list", cache("5 minutes"), async (_request, response) => {
diff --git a/server/server.js b/server/server.js
index 153cac4f..2b6933d7 100644
--- a/server/server.js
+++ b/server/server.js
@@ -132,6 +132,7 @@ const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sen
 const { statusPageSocketHandler } = require("./socket-handlers/status-page-socket-handler");
 const databaseSocketHandler = require("./socket-handlers/database-socket-handler");
 const TwoFA = require("./2fa");
+const apicache = require("./modules/apicache");
 
 app.use(express.json());
 
@@ -162,6 +163,12 @@ let jwtSecret = null;
  */
 let monitorList = {};
 
+/**
+* Main maintenance list
+* @type {{}}
+*/
+let maintenanceList = {};
+
 /**
  * Show Setup Page
  * @type {boolean}
@@ -625,6 +632,101 @@ exports.entryPage = "dashboard";
             }
         });
 
+        // Add a new maintenance
+        socket.on("addMaintenance", async (maintenance, callback) => {
+            try {
+                checkLogin(socket);
+                let bean = R.dispense("maintenance");
+
+                bean.import(maintenance);
+                bean.user_id = socket.userID;
+                let maintenanceID = await R.store(bean);
+
+                await sendMaintenanceList(socket);
+
+                callback({
+                    ok: true,
+                    msg: "Added Successfully.",
+                    maintenanceID,
+                });
+
+            } catch (e) {
+                callback({
+                    ok: false,
+                    msg: e.message,
+                });
+            }
+        });
+
+        // Edit a maintenance
+        socket.on("editMaintenance", async (maintenance, callback) => {
+            try {
+                checkLogin(socket);
+
+                let bean = await R.findOne("maintenance", " id = ? ", [ maintenance.id ]);
+
+                if (bean.user_id !== socket.userID) {
+                    throw new Error("Permission denied.");
+                }
+
+                bean.title = maintenance.title;
+                bean.description = maintenance.description;
+                bean.start_date = maintenance.start_date;
+                bean.end_date = maintenance.end_date;
+
+                await R.store(bean);
+
+                await sendMaintenanceList(socket);
+
+                callback({
+                    ok: true,
+                    msg: "Saved.",
+                    maintenanceID: bean.id,
+                });
+
+            } catch (e) {
+                console.error(e);
+                callback({
+                    ok: false,
+                    msg: e.message,
+                });
+            }
+        });
+
+        // Add a new monitor_maintenance
+        socket.on("addMonitorMaintenance", async (maintenanceID, monitors, callback) => {
+            try {
+                checkLogin(socket);
+
+                await R.exec("DELETE FROM monitor_maintenance WHERE maintenance_id = ?", [
+                    maintenanceID
+                ]);
+
+                for await (const monitor of monitors) {
+                    let bean = R.dispense("monitor_maintenance");
+
+                    bean.import({
+                        monitor_id: monitor.id,
+                        maintenance_id: maintenanceID
+                    });
+                    await R.store(bean);
+                }
+
+                apicache.clear();
+
+                callback({
+                    ok: true,
+                    msg: "Added Successfully.",
+                });
+
+            } catch (e) {
+                callback({
+                    ok: false,
+                    msg: e.message,
+                });
+            }
+        });
+
         socket.on("getMonitorList", async (callback) => {
             try {
                 checkLogin(socket);
@@ -641,6 +743,22 @@ exports.entryPage = "dashboard";
             }
         });
 
+        socket.on("getMaintenanceList", async (callback) => {
+            try {
+                checkLogin(socket);
+                await sendMaintenanceList(socket);
+                callback({
+                    ok: true,
+                });
+            } catch (e) {
+                console.error(e);
+                callback({
+                    ok: false,
+                    msg: e.message,
+                });
+            }
+        });
+
         socket.on("getMonitor", async (monitorID, callback) => {
             try {
                 checkLogin(socket);
@@ -665,6 +783,54 @@ exports.entryPage = "dashboard";
             }
         });
 
+        socket.on("getMaintenance", async (maintenanceID, callback) => {
+            try {
+                checkLogin(socket);
+
+                console.log(`Get Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+                let bean = await R.findOne("maintenance", " id = ? AND user_id = ? ", [
+                    maintenanceID,
+                    socket.userID,
+                ]);
+
+                callback({
+                    ok: true,
+                    maintenance: await bean.toJSON(),
+                });
+
+            } catch (e) {
+                callback({
+                    ok: false,
+                    msg: e.message,
+                });
+            }
+        });
+
+        socket.on("getMonitorMaintenance", async (maintenanceID, callback) => {
+            try {
+                checkLogin(socket);
+
+                console.log(`Get Monitors for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+                let monitors = await R.getAll("SELECT monitor.id, monitor.name FROM monitor_maintenance mm JOIN monitor ON mm.monitor_id = monitor.id WHERE mm.maintenance_id = ? ", [
+                    maintenanceID,
+                ]);
+
+                callback({
+                    ok: true,
+                    monitors,
+                });
+
+            } catch (e) {
+                console.error(e);
+                callback({
+                    ok: false,
+                    msg: e.message,
+                });
+            }
+        });
+
         socket.on("getMonitorBeats", async (monitorID, period, callback) => {
             try {
                 checkLogin(socket);
@@ -769,6 +935,36 @@ exports.entryPage = "dashboard";
             }
         });
 
+        socket.on("deleteMaintenance", async (maintenanceID, callback) => {
+            try {
+                checkLogin(socket);
+
+                console.log(`Delete Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+                if (maintenanceID in maintenanceList) {
+                    delete maintenanceList[maintenanceID];
+                }
+
+                await R.exec("DELETE FROM maintenance WHERE id = ? AND user_id = ? ", [
+                    maintenanceID,
+                    socket.userID,
+                ]);
+
+                callback({
+                    ok: true,
+                    msg: "Deleted Successfully.",
+                });
+
+                await sendMaintenanceList(socket);
+
+            } catch (e) {
+                callback({
+                    ok: false,
+                    msg: e.message,
+                });
+            }
+        });
+
         socket.on("getTags", async (callback) => {
             try {
                 checkLogin(socket);
@@ -1394,11 +1590,18 @@ async function sendMonitorList(socket) {
     return list;
 }
 
+async function sendMaintenanceList(socket) {
+    let list = await getMaintenanceJSONList(socket.userID);
+    io.to(socket.userID).emit("maintenanceList", list);
+    return list;
+}
+
 async function afterLogin(socket, user) {
     socket.userID = user.id;
     socket.join(user.id);
 
     let monitorList = await sendMonitorList(socket);
+    sendMaintenanceList(socket);
     sendNotificationList(socket);
 
     await sleep(500);
@@ -1430,6 +1633,20 @@ async function getMonitorJSONList(userID) {
     return result;
 }
 
+async function getMaintenanceJSONList(userID) {
+    let result = {};
+
+    let maintenanceList = await R.find("maintenance", " user_id = ? ORDER BY end_date DESC, title", [
+        userID,
+    ]);
+
+    for (let maintenance of maintenanceList) {
+        result[maintenance.id] = await maintenance.toJSON();
+    }
+
+    return result;
+}
+
 async function initDatabase(testMode = false) {
     if (! fs.existsSync(Database.path)) {
         console.log("Copying Database");
diff --git a/src/assets/app.scss b/src/assets/app.scss
index cec64467..73b9d631 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -273,6 +273,7 @@ textarea.form-control {
         &.bg-info,
         &.bg-warning,
         &.bg-danger,
+        &.bg-maintenance,
         &.bg-light {
             color: $dark-font-color2;
         }
diff --git a/src/assets/vars.scss b/src/assets/vars.scss
index 91ab917e..e48a6efb 100644
--- a/src/assets/vars.scss
+++ b/src/assets/vars.scss
@@ -1,6 +1,7 @@
 $primary: #5cdd8b;
 $danger: #dc3545;
 $warning: #f8a306;
+$maintenance: #1747f5;
 $link-color: #111;
 $border-radius: 50rem;
 
diff --git a/src/components/HeartbeatBar.vue b/src/components/HeartbeatBar.vue
index be0b122e..abeed7cb 100644
--- a/src/components/HeartbeatBar.vue
+++ b/src/components/HeartbeatBar.vue
@@ -5,7 +5,7 @@
                 v-for="(beat, index) in shortBeatList"
                 :key="index"
                 class="beat"
-                :class="{ 'empty' : (beat === 0), 'down' : (beat.status === 0), 'pending' : (beat.status === 2) }"
+                :class="{ 'empty' : (beat === 0), 'down' : (beat.status === 0), 'pending' : (beat.status === 2), 'maintenance' : (beat.status === 3) }"
                 :style="beatStyle"
                 :title="getBeatTitle(beat)"
             />
@@ -200,6 +200,10 @@ export default {
             background-color: $warning;
         }
 
+        &.maintenance {
+            background-color: $maintenance;
+        }
+
         &:not(.empty):hover {
             transition: all ease-in-out 0.15s;
             opacity: 0.8;
diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index ef51e89c..d943efff 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -1,7 +1,12 @@
 <template>
     <div class="shadow-box mb-3">
         <div class="list-header">
-            <div class="placeholder"></div>
+            <div class="search-wrapper float-start">
+                <select v-model="selectedList" class="form-control">
+                    <option value="monitor" selected>{{$t('Monitor List')}}</option>
+                    <option value="maintenance">{{$t('Maintenance List')}}</option>
+                </select>
+            </div>
             <div class="search-wrapper">
                 <a v-if="searchText == ''" class="search-icon">
                     <font-awesome-icon icon="search" />
@@ -13,11 +18,25 @@
             </div>
         </div>
         <div class="monitor-list" :class="{ scrollbar: scrollbar }">
-            <div v-if="Object.keys($root.monitorList).length === 0" class="text-center mt-3">
+            <div v-if="Object.keys($root.monitorList).length === 0 && selectedList === 'monitor'" class="text-center mt-3">
                 {{ $t("No Monitors, please") }} <router-link to="/add">{{ $t("add one") }}</router-link>
             </div>
+            <div v-if="Object.keys($root.maintenanceList).length === 0 && selectedList === 'maintenance'" class="text-center mt-3">
+                {{ $t("No Maintenance, please") }} <router-link to="/addMaintenance">{{ $t("add one") }}</router-link>
+            </div>
 
-            <router-link v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)" class="item" :class="{ 'disabled': ! item.active }">
+            <router-link v-if="selectedList === 'maintenance'" v-for="(item, index) in sortedMaintenanceList" :key="index" :to="maintenanceURL(item.id)" class="item" :class="{ 'disabled': (Date.parse(item.end_date) < Date.now()) }">
+                <div class="row">
+                    <div class="col-9 col-md-8 small-padding">
+                        <div class="info">
+                            <Uptime :monitor="null" type="maintenance" :pill="true" />
+                            {{ item.title }}
+                        </div>
+                    </div>
+                </div>
+            </router-link>
+
+            <router-link v-if="selectedList === 'monitor'" v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)" class="item" :class="{ 'disabled': ! item.active }">
                 <div class="row">
                     <div class="col-9 col-md-8 small-padding" :class="{ 'monitorItem': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
                         <div class="info">
@@ -47,7 +66,7 @@
 import HeartbeatBar from "../components/HeartbeatBar.vue";
 import Uptime from "../components/Uptime.vue";
 import Tag from "../components/Tag.vue";
-import { getMonitorRelativeURL } from "../util.ts";
+import {getMaintenanceRelativeURL, getMonitorRelativeURL} from "../util.ts";
 
 export default {
     components: {
@@ -63,9 +82,60 @@ export default {
     data() {
         return {
             searchText: "",
+            selectedList: "monitor"
         };
     },
     computed: {
+        sortedMaintenanceList() {
+            let result = Object.values(this.$root.maintenanceList);
+
+            result.sort((m1, m2) => {
+                const now = Date.now();
+
+                if (Date.parse(m1.end_date) >= now !== Date.parse(m2.end_date) >= now) {
+                    if (Date.parse(m2.end_date) < now) {
+                        return -1;
+                    }
+                    if (Date.parse(m1.end_date) < now) {
+                        return 1;
+                    }
+                }
+
+                if (Date.parse(m1.end_date) >= now && Date.parse(m2.end_date) >= now) {
+                    if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
+                        return -1;
+                    }
+
+                    if (Date.parse(m2.end_date) < Date.parse(m1.end_date)) {
+                        return 1;
+                    }
+                }
+
+                if (Date.parse(m1.end_date) < now && Date.parse(m2.end_date) < now) {
+                    if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
+                        return 1;
+                    }
+
+                    if (Date.parse(m2.end_date) < Date.parse(m1.end_date)) {
+                        return -1;
+                    }
+                }
+
+                return m1.title.localeCompare(m2.title);
+            });
+
+            // Simple filter by search text
+            // finds maintenance name
+            if (this.searchText !== "") {
+                const loweredSearchText = this.searchText.toLowerCase();
+                result = result.filter(maintenance => {
+                    return maintenance.title.toLowerCase().includes(loweredSearchText)
+                    || maintenance.description.toLowerCase().includes(loweredSearchText);
+                });
+            }
+
+            return result;
+        },
         sortedMonitorList() {
             let result = Object.values(this.$root.monitorList);
 
@@ -96,7 +166,7 @@ export default {
 
             // Simple filter by search text
             // finds monitor name, tag name or tag value
-            if (this.searchText != "") {
+            if (this.searchText !== "") {
                 const loweredSearchText = this.searchText.toLowerCase();
                 result = result.filter(monitor => {
                     return monitor.name.toLowerCase().includes(loweredSearchText)
@@ -112,6 +182,9 @@ export default {
         monitorURL(id) {
             return getMonitorRelativeURL(id);
         },
+        maintenanceURL(id) {
+            return getMaintenanceRelativeURL(id);
+        },
         clearSearchText() {
             this.searchText = "";
         }
@@ -174,4 +247,12 @@ export default {
     flex-wrap: wrap;
     gap: 0;
 }
+
+.bg-maintenance {
+    background-color: $maintenance;
+}
+
+select {
+    text-align: center;
+}
 </style>
diff --git a/src/components/PingChart.vue b/src/components/PingChart.vue
index aa209fab..fb380e04 100644
--- a/src/components/PingChart.vue
+++ b/src/components/PingChart.vue
@@ -24,7 +24,7 @@ import timezone from "dayjs/plugin/timezone";
 import "chartjs-adapter-dayjs";
 import { LineChart } from "vue-chart-3";
 import { useToast } from "vue-toastification";
-import { UP, DOWN, PENDING } from "../util.ts";
+import { UP, DOWN, PENDING, MAINTENANCE } from "../util.ts";
 
 dayjs.extend(utc);
 dayjs.extend(timezone);
@@ -162,7 +162,8 @@ export default {
         },
         chartData() {
             let pingData = [];  // Ping Data for Line Chart, y-axis contains ping time
-            let downData = [];  // Down Data for Bar Chart, y-axis is 1 if target is down, 0 if target is up
+            let downData = [];  // Down Data for Bar Chart, y-axis is 1 if target is down (red color), under maintenance (blue color) or pending (orange color), 0 if target is up
+            let colorData = []; // Color Data for Bar Chart
 
             let heartbeatList = this.heartbeatList ||
              (this.monitorId in this.$root.heartbeatList && this.$root.heartbeatList[this.monitorId]) ||
@@ -184,8 +185,9 @@ export default {
                     });
                     downData.push({
                         x,
-                        y: beat.status === DOWN ? 1 : 0,
+                        y: (beat.status === DOWN || beat.status === MAINTENANCE || beat.status === PENDING) ? 1 : 0,
                     });
+                    colorData.push((beat.status === MAINTENANCE) ? "rgba(23,71,245,0.41)" : ((beat.status === PENDING) ? "rgba(245,182,23,0.41)" : "#DC354568"))
                 });
 
             return {
@@ -204,7 +206,7 @@ export default {
                         type: "bar",
                         data: downData,
                         borderColor: "#00000000",
-                        backgroundColor: "#DC354568",
+                        backgroundColor: colorData,
                         yAxisID: "y1",
                         barThickness: "flex",
                         barPercentage: 1,
diff --git a/src/components/PublicGroupList.vue b/src/components/PublicGroupList.vue
index f30edcef..a6539b8b 100644
--- a/src/components/PublicGroupList.vue
+++ b/src/components/PublicGroupList.vue
@@ -146,4 +146,8 @@ export default {
     }
 }
 
+.bg-maintenance {
+    background-color: $maintenance;
+}
+
 </style>
diff --git a/src/components/Status.vue b/src/components/Status.vue
index a3916adc..558ec3ee 100644
--- a/src/components/Status.vue
+++ b/src/components/Status.vue
@@ -22,6 +22,10 @@ export default {
                 return "warning";
             }
 
+            if (this.status === 3) {
+                return "maintenance";
+            }
+
             return "secondary";
         },
 
@@ -38,6 +42,10 @@ export default {
                 return this.$t("Pending");
             }
 
+            if (this.status === 3) {
+                return this.$t("Maintenance");
+            }
+
             return this.$t("Unknown");
         },
     },
diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index 2717672c..d7aae6c6 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -15,6 +15,10 @@ export default {
 
     computed: {
         uptime() {
+            
+            if (this.type === "maintenance") {
+                return this.$t("Maintenance");
+            }
 
             let key = this.monitor.id + "_" + this.type;
 
@@ -26,6 +30,10 @@ export default {
         },
 
         color() {
+            if (this.type === "maintenance" || this.monitor.maintenance) {
+                return "maintenance"
+            }
+            
             if (this.lastHeartBeat.status === 0) {
                 return "danger"
             }
diff --git a/src/icon.js b/src/icon.js
index 88b8a8ec..3027d958 100644
--- a/src/icon.js
+++ b/src/icon.js
@@ -34,6 +34,7 @@ import {
     faAward,
     faLink,
     faChevronDown,
+    faWrench,
 } from "@fortawesome/free-solid-svg-icons";
 
 library.add(
@@ -67,6 +68,7 @@ library.add(
     faAward,
     faLink,
     faChevronDown,
+    faWrench,
 );
 
 export { FontAwesomeIcon };
diff --git a/src/languages/en.js b/src/languages/en.js
index 47513466..3edcc556 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -7,11 +7,13 @@ export default {
     upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.",
     maxRedirectDescription: "Maximum number of redirects to follow. Set to 0 to disable redirects.",
     acceptedStatusCodesDescription: "Select status codes which are considered as a successful response.",
+    affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
     passwordNotMatchMsg: "The repeat password does not match.",
     notificationDescription: "Notifications must be assigned to a monitor to function.",
     keywordDescription: "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
     pauseDashboardHome: "Pause",
     deleteMonitorMsg: "Are you sure want to delete this monitor?",
+    deleteMaintenanceMsg: "Are you sure want to delete this maintenance?",
     deleteNotificationMsg: "Are you sure want to delete this notification for all monitors?",
     resoverserverDescription: "Cloudflare is the default server. You can change the resolver server anytime.",
     rrtypeDescription: "Select the RR type you want to monitor",
diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
index 0e905260..ec0f434d 100644
--- a/src/languages/zh-TW.js
+++ b/src/languages/zh-TW.js
@@ -340,7 +340,6 @@ export default {
     "No monitors available.": "沒有可用的監測器。",
     "Add one": "新增一個",
     "No Monitors": "無監測器",
-    "Add one": "新增一個",
     "Untitled Group": "未命名群組",
     Services: "服務",
     Discard: "捨棄",
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index 75173e1f..4d6ca27d 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -51,7 +51,7 @@
 
         <!-- Mobile Only -->
         <div v-if="$root.isMobile" style="width: 100%; height: 60px;" />
-        <nav v-if="$root.isMobile" class="bottom-nav">
+        <nav v-if="$root.isMobile" class="bottom-nav scroll">
             <router-link to="/dashboard" class="nav-link">
                 <div><font-awesome-icon icon="tachometer-alt" /></div>
                 {{ $t("Dashboard") }}
@@ -64,7 +64,12 @@
 
             <router-link to="/add" class="nav-link">
                 <div><font-awesome-icon icon="plus" /></div>
-                {{ $t("Add") }}
+                {{ $t("Add Monitor") }}
+            </router-link>
+
+            <router-link to="/addMaintenance" class="nav-link">
+                <div><font-awesome-icon icon="wrench" /></div>
+                {{ $t("Add Maintenance") }}
             </router-link>
 
             <router-link to="/settings" class="nav-link">
@@ -201,4 +206,21 @@ main {
     }
 }
 
+.scroll {
+    display: flex;
+    flex-wrap: nowrap;
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+}
+
+.scroll::-webkit-scrollbar {
+    display: none;
+}
+
+.scroll a {
+    flex: 0 0 auto;
+    min-width: fit-content;
+}
+
 </style>
diff --git a/src/mixins/datetime.js b/src/mixins/datetime.js
index 7cef22d2..08689520 100644
--- a/src/mixins/datetime.js
+++ b/src/mixins/datetime.js
@@ -22,6 +22,16 @@ export default {
             return this.datetimeFormat(value, "YYYY-MM-DD HH:mm:ss");
         },
 
+        datetimeMaintenance(value) {
+            const inputDate = new Date(value);
+            const now = new Date(Date.now());
+
+            if (inputDate.getFullYear() === now.getFullYear() && inputDate.getMonth() === now.getMonth() && inputDate.getDay() === now.getDay())
+                return this.datetimeMaintenanceFormat(value, "HH:mm");
+            else
+                return this.datetimeMaintenanceFormat(value, "YYYY-MM-DD HH:mm");
+        },
+
         date(value) {
             return this.datetimeFormat(value, "YYYY-MM-DD");
         },
@@ -41,6 +51,13 @@ export default {
                 return dayjs.utc(value).tz(this.timezone).format(format);
             }
             return "";
+        },
+
+        datetimeMaintenanceFormat(value, format) {
+            if (value !== undefined && value !== "") {
+                return dayjs(value).format(format);
+            }
+            return "";
         }
     },
 
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index affac4f8..3a475dc5 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -27,6 +27,7 @@ export default {
             allowLoginDialog: false,        // Allowed to show login dialog, but "loggedIn" have to be true too. This exists because prevent the login dialog show 0.1s in first before the socket server auth-ed.
             loggedIn: false,
             monitorList: { },
+            maintenanceList: { },
             heartbeatList: { },
             importantHeartbeatList: { },
             avgPingList: { },
@@ -99,6 +100,10 @@ export default {
                 this.monitorList = data;
             });
 
+            socket.on("maintenanceList", (data) => {
+                this.maintenanceList = data;
+            });
+
             socket.on("notificationList", (data) => {
                 this.notificationList = data;
             });
@@ -309,14 +314,37 @@ export default {
             socket.emit("getMonitorList", callback);
         },
 
+        getMaintenanceList(callback) {
+            if (! callback) {
+                callback = () => { };
+            }
+            socket.emit("getMaintenanceList", callback);
+        },
+
         add(monitor, callback) {
             socket.emit("add", monitor, callback);
         },
 
+        addMaintenance(maintenance, callback) {
+            socket.emit("addMaintenance", maintenance, callback);
+        },
+
+        addMonitorMaintenance(maintenanceID, monitors, callback) {
+            socket.emit("addMonitorMaintenance", maintenanceID, monitors, callback);
+        },
+
+        getMonitorMaintenance(maintenanceID, callback) {
+            socket.emit("getMonitorMaintenance", maintenanceID, callback);
+        },
+
         deleteMonitor(monitorID, callback) {
             socket.emit("deleteMonitor", monitorID, callback);
         },
 
+        deleteMaintenance(maintenanceID, callback) {
+            socket.emit("deleteMaintenance", maintenanceID, callback);
+        },
+
         clearData() {
             console.log("reset heartbeat list");
             this.heartbeatList = {};
@@ -368,7 +396,13 @@ export default {
             for (let monitorID in this.lastHeartbeatList) {
                 let lastHeartBeat = this.lastHeartbeatList[monitorID];
 
-                if (! lastHeartBeat) {
+                if (this.monitorList[monitorID].maintenance) {
+                    result[monitorID] = {
+                        text: this.$t("Maintenance"),
+                        color: "maintenance",
+                    };
+                }
+                else if (! lastHeartBeat) {
                     result[monitorID] = unknown;
                 } else if (lastHeartBeat.status === 1) {
                     result[monitorID] = {
diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue
index 1cf237ce..cad00963 100644
--- a/src/pages/Dashboard.vue
+++ b/src/pages/Dashboard.vue
@@ -4,6 +4,7 @@
             <div v-if="! $root.isMobile" class="col-12 col-md-5 col-xl-4">
                 <div>
                     <router-link to="/add" class="btn btn-primary mb-3"><font-awesome-icon icon="plus" /> {{ $t("Add New Monitor") }}</router-link>
+                    <router-link to="/addMaintenance" class="btn btn-primary mb-3 float-end"><font-awesome-icon icon="wrench" /> {{ $t("Add New Maintenance") }}</router-link>
                 </div>
                 <MonitorList :scrollbar="true" />
             </div>
diff --git a/src/pages/DashboardHome.vue b/src/pages/DashboardHome.vue
index 16d07983..77ef90c7 100644
--- a/src/pages/DashboardHome.vue
+++ b/src/pages/DashboardHome.vue
@@ -15,6 +15,10 @@
                         <h3>{{ $t("Down") }}</h3>
                         <span class="num text-danger">{{ stats.down }}</span>
                     </div>
+                    <div class="col">
+                        <h3>{{ $t("Maintenance") }}</h3>
+                        <span class="num text-maintenance">{{ stats.maintenance }}</span>
+                    </div>
                     <div class="col">
                         <h3>{{ $t("Unknown") }}</h3>
                         <span class="num text-secondary">{{ stats.unknown }}</span>
@@ -38,7 +42,7 @@
                     </thead>
                     <tbody>
                         <tr v-for="(beat, index) in displayedRecords" :key="index" :class="{ 'shadow-box': $root.windowWidth <= 550}">
-                            <td><router-link :to="`/dashboard/${beat.monitorID}`">{{ beat.name }}</router-link></td>
+                            <td><router-link :to="`/dashboard/monitor/${beat.monitorID}`">{{ beat.name }}</router-link></td>
                             <td><Status :status="beat.status" /></td>
                             <td :class="{ 'border-0':! beat.msg}"><Datetime :value="beat.time" /></td>
                             <td class="border-0">{{ beat.msg }}</td>
@@ -93,6 +97,7 @@ export default {
             let result = {
                 up: 0,
                 down: 0,
+                maintenance: 0,
                 unknown: 0,
                 pause: 0,
             };
@@ -100,8 +105,11 @@ export default {
             for (let monitorID in this.$root.monitorList) {
                 let beat = this.$root.lastHeartbeatList[monitorID];
                 let monitor = this.$root.monitorList[monitorID];
-
-                if (monitor && ! monitor.active) {
+                
+                if (monitor && monitor.maintenance) {
+                    result.maintenance++;
+                }
+                else if (monitor && !monitor.active) {
                     result.pause++;
                 } else if (beat) {
                     if (beat.status === 1) {
@@ -173,6 +181,14 @@ export default {
     display: block;
 }
 
+.text-maintenance {
+    color: $maintenance;
+}
+
+.bg-maintenance {
+    background-color: $maintenance;
+}
+
 .shadow-box {
     padding: 20px;
 }
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index d40561fe..096f928b 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -499,4 +499,8 @@ table {
     margin-left: 0 !important;
 }
 
+.bg-maintenance {
+    background-color: $maintenance;
+}
+
 </style>
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
new file mode 100644
index 00000000..144b398a
--- /dev/null
+++ b/src/pages/EditMaintenance.vue
@@ -0,0 +1,247 @@
+<template>
+    <transition name="slide-fade" appear>
+        <div>
+            <h1 class="mb-3">{{ pageName }}</h1>
+            <form @submit.prevent="submit">
+                <div class="shadow-box">
+                    <div class="row">
+                        <div class="col-md-6">
+                            <h2 class="mb-2">{{ $t("General") }}</h2>
+
+                            <!-- Title -->
+                            <div class="my-3">
+                                <label for="name" class="form-label">{{ $t("Title") }}</label>
+                                <input id="name" v-model="maintenance.title" type="text" class="form-control"
+                                       :placeholder="titlePlaceholder" required>
+                            </div>
+
+                            <!-- Description -->
+                            <div class="my-3">
+                                <label for="description" class="form-label">{{ $t("Description") }}</label>
+                                <textarea id="description" v-model="maintenance.description" class="form-control"
+                                          :placeholder="descriptionPlaceholder"></textarea>
+                            </div>
+
+                            <!-- Affected Monitors -->
+                            <div class="my-3">
+                                <label for="affected_monitors" class="form-label">{{ $t("Affected Monitors") }}</label>
+
+                                <VueMultiselect
+                                    id="affected_monitors"
+                                    v-model="affectedMonitors"
+                                    :options="affectedMonitorsOptions"
+                                    track-by="id"
+                                    label="name"
+                                    :multiple="true"
+                                    :allow-empty="false"
+                                    :close-on-select="false"
+                                    :clear-on-select="false"
+                                    :preserve-search="true"
+                                    :placeholder="$t('Pick Affected Monitors...')"
+                                    :preselect-first="false"
+                                    :max-height="600"
+                                    :taggable="false"
+                                ></VueMultiselect>
+
+                                <div class="form-text">
+                                    {{ $t("affectedMonitorsDescription") }}
+                                </div>
+                            </div>
+
+                            <!-- Start Date Time -->
+                            <div class="my-3">
+                                <label for="start_date" class="form-label">{{ $t("Start of maintenance") }}</label>
+                                <input :type="'datetime-local'" id="start_date" v-model="maintenance.start_date"
+                                       class="form-control" :class="{'darkCalendar': dark }" required>
+                            </div>
+
+                            <!-- End Date Time -->
+                            <div class="my-3">
+                                <label for="end_date" class="form-label">{{ $t("Expected end of maintenance") }}</label>
+                                <input :type="'datetime-local'" id="end_date" v-model="maintenance.end_date"
+                                       class="form-control" :class="{'darkCalendar': dark }" required>
+                            </div>
+
+                            <div class="mt-5 mb-1">
+                                <button id="monitor-submit-btn" class="btn btn-primary" type="submit"
+                                        :disabled="processing">{{ $t("Save") }}
+                                </button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </transition>
+</template>
+
+<script>
+import CopyableInput from "../components/CopyableInput.vue";
+
+import {useToast} from "vue-toastification";
+import VueMultiselect from "vue-multiselect";
+
+const toast = useToast();
+
+export default {
+    components: {
+        CopyableInput,
+        VueMultiselect,
+    },
+
+    data() {
+        return {
+            processing: false,
+            maintenance: {},
+            affectedMonitors: [],
+            affectedMonitorsOptions: [],
+            dark: (this.$root.theme === "dark"),
+        };
+    },
+
+    computed: {
+
+        pageName() {
+            return this.$t((this.isAdd) ? "Schedule maintenance" : "Edit");
+        },
+
+        isAdd() {
+            return this.$route.path === "/addMaintenance";
+        },
+
+        isEdit() {
+            return this.$route.path.startsWith("/editMaintenance");
+        },
+
+        titlePlaceholder() {
+            return this.$t("Network infrastructure maintenance");
+        },
+
+        descriptionPlaceholder() {
+            return this.$t("Example: Network infrastructure maintenance is underway which will affect some of our services.");
+        }
+
+    },
+    watch: {
+
+        "$route.fullPath"() {
+            this.init();
+        }
+
+    },
+    mounted() {
+        this.init();
+
+        this.$root.getMonitorList((res) => {
+            if (res.ok) {
+                Object.values(this.$root.monitorList).map(monitor => {
+                    this.affectedMonitorsOptions.push({
+                        id: monitor.id,
+                        name: monitor.name
+                    });
+                });
+            }
+        });
+    },
+    methods: {
+        init() {
+            this.affectedMonitors = [];
+            
+            if (this.isAdd) {
+                this.maintenance = {
+                    title: "",
+                    description: "",
+                    start_date: "",
+                    end_date: "",
+                };
+            } else if (this.isEdit) {
+                this.$root.getSocket().emit("getMaintenance", this.$route.params.id, (res) => {
+                    if (res.ok) {
+                        this.maintenance = res.maintenance;
+
+                        this.$root.getSocket().emit("getMonitorMaintenance", this.$route.params.id, (res) => {
+                            if (res.ok) {
+                                Object.values(res.monitors).map(monitor => {
+                                    this.affectedMonitors.push(monitor);
+                                });
+                            } else {
+                                toast.error(res.msg);
+                            }
+                        });
+                    } else {
+                        toast.error(res.msg);
+                    }
+                });
+            }
+
+        },
+
+        async submit() {
+            this.processing = true;
+
+            if (this.affectedMonitors.length === 0) {
+                toast.error(this.$t("Select at least one affected monitor"));
+                return this.processing = false;
+            }
+
+            if (this.isAdd) {
+                this.$root.addMaintenance(this.maintenance, async (res) => {
+
+                    if (res.ok) {
+                        await this.addMonitorMaintenance(res.maintenanceID, () => {
+                            toast.success(res.msg);
+                            this.processing = false;
+                            this.$root.getMaintenanceList();
+                            this.$router.push("/dashboard/maintenance/" + res.maintenanceID);
+                        });
+                    } else {
+                        toast.error(res.msg);
+                        this.processing = false;
+                    }
+
+                });
+            } else {
+                this.$root.getSocket().emit("editMaintenance", this.maintenance, async (res) => {
+                    if (res.ok) {
+                        await this.addMonitorMaintenance(res.maintenanceID, () => {
+                            this.processing = false;
+                            this.$root.toastRes(res);
+                            this.init();
+                        });
+                    }
+                    else {
+                        this.processing = false;
+                        toast.error(res.msg);
+                    }
+                });
+            }
+        },
+
+        async addMonitorMaintenance(maintenanceID, callback) {
+            await this.$root.addMonitorMaintenance(maintenanceID, this.affectedMonitors, async (res) => {
+                if (!res.ok) {
+                    toast.error(res.msg);
+                } else {
+                    this.$root.getMonitorList();
+                }
+
+                callback();
+            });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+.shadow-box {
+    padding: 20px;
+}
+
+textarea {
+    min-height: 200px;
+}
+
+.darkCalendar::-webkit-calendar-picker-indicator {
+    filter: invert(1);
+}
+</style>
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 4b6a920c..3ac05af3 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -509,7 +509,7 @@ export default {
                         toast.success(res.msg);
                         this.processing = false;
                         this.$root.getMonitorList();
-                        this.$router.push("/dashboard/" + res.monitorID);
+                        this.$router.push("/dashboard/monitor/" + res.monitorID);
                     } else {
                         toast.error(res.msg);
                         this.processing = false;
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
new file mode 100644
index 00000000..e3e4b59b
--- /dev/null
+++ b/src/pages/MaintenanceDetails.vue
@@ -0,0 +1,141 @@
+<template>
+    <transition name="slide-fade" appear>
+        <div v-if="maintenance">
+            <h1> {{ maintenance.title }}</h1>
+            <p class="url">
+                <span>Start: {{ $root.datetimeMaintenance(maintenance.start_date) }}</span>
+                <br>
+                <span>End: {{ $root.datetimeMaintenance(maintenance.end_date) }}</span>
+            </p>
+
+            <div class="functions" style="margin-top: 10px">
+                <router-link :to=" '/editMaintenance/' + maintenance.id " class="btn btn-secondary">
+                    <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
+                </router-link>
+                <button class="btn btn-danger" @click="deleteDialog">
+                    <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
+                </button>
+            </div>
+
+            <label for="description" class="form-label" style="margin-top: 20px">{{ $t("Description") }}</label>
+            <textarea id="description" class="form-control" disabled>{{ maintenance.description }}</textarea>
+
+            <label for="affected_monitors" class="form-label" style="margin-top: 20px">{{ $t("Affected Monitors") }}</label>
+            <br>
+            <button v-for="monitor in this.affectedMonitors" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold">
+                {{ monitor }}
+            </button>
+
+            <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteMaintenance">
+                {{ $t("deleteMaintenanceMsg") }}
+            </Confirm>
+        </div>
+    </transition>
+</template>
+
+<script>
+import { useToast } from "vue-toastification";
+const toast = useToast();
+import Confirm from "../components/Confirm.vue";
+
+export default {
+    components: {
+        Confirm,
+    },
+    data() {
+        return {
+            affectedMonitors: [],
+        };
+    },
+    computed: {
+        maintenance() {
+            let id = this.$route.params.id;
+            return this.$root.maintenanceList[id];
+        },
+    },
+    mounted() {
+        this.init();
+    },
+    methods: {
+        init() {
+            this.$root.getSocket().emit("getMonitorMaintenance", this.$route.params.id, (res) => {
+                if (res.ok) {
+                    this.affectedMonitors = Object.values(res.monitors).map(monitor => monitor.name);
+                } else {
+                    toast.error(res.msg);
+                }
+            });
+        },
+        
+        deleteDialog() {
+            this.$refs.confirmDelete.show();
+        },
+
+        deleteMaintenance() {
+            this.$root.deleteMaintenance(this.maintenance.id, (res) => {
+                if (res.ok) {
+                    toast.success(res.msg);
+                    this.$router.push("/dashboard");
+                } else {
+                    toast.error(res.msg);
+                }
+            });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../assets/vars.scss";
+
+@media (max-width: 550px) {
+    .functions {
+        text-align: center;
+
+        button, a {
+            margin-left: 10px !important;
+            margin-right: 10px !important;
+        }
+    }
+}
+
+@media (max-width: 400px) {
+    .btn {
+        display: inline-flex;
+        flex-direction: column;
+        align-items: center;
+        padding-top: 10px;
+    }
+
+    a.btn {
+        padding-left: 25px;
+        padding-right: 25px;
+    }
+}
+
+.url {
+    color: $primary;
+    margin-bottom: 20px;
+    font-weight: bold;
+
+    a {
+        color: $primary;
+    }
+}
+
+.functions {
+    button, a {
+        margin-right: 20px;
+    }
+}
+
+textarea {
+    min-height: 100px;
+    resize: none;
+}
+
+.btn-monitor {
+    background-color: #5cdd8b;
+}
+
+</style>
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 0dc49518..11716b45 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -144,6 +144,18 @@
             </div>
         </div>
 
+        <!-- Maintenance -->
+        <div v-if="maintenance.length !== 0" v-for="maintenanceItem in maintenance" class="shadow-box alert mb-4 p-4 maintenance" role="alert" :class="maintenanceClass">
+            <h4 v-text="maintenanceItem.title" class="alert-heading" />
+
+            <div v-text="maintenanceItem.description" class="content" />
+
+            <!-- Incident Date -->
+            <div class="date mt-3">
+                {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }} ({{ dateFromNowMaintenance(maintenanceItem.start_date) }})<br />
+            </div>
+        </div>
+
         <!-- Overall Status -->
         <div class="shadow-box list  p-4 overall-status mb-4">
             <div v-if="Object.keys($root.publicMonitorList).length === 0 && loadedData">
@@ -167,6 +179,11 @@
                     {{ $t("Degraded Service") }}
                 </div>
 
+                <div v-else-if="isMaintenance">
+                    <font-awesome-icon icon="wrench" class="statusMaintenance" />
+                    {{ $t("Maintenance") }}
+                </div>
+
                 <div v-else>
                     <font-awesome-icon icon="question-circle" style="color: #efefef;" />
                 </div>
@@ -217,7 +234,14 @@
 import axios from "axios";
 import PublicGroupList from "../components/PublicGroupList.vue";
 import ImageCropUpload from "vue-image-crop-upload";
-import { STATUS_PAGE_ALL_DOWN, STATUS_PAGE_ALL_UP, STATUS_PAGE_PARTIAL_DOWN, UP } from "../util.ts";
+import {
+    STATUS_PAGE_ALL_DOWN,
+    STATUS_PAGE_ALL_UP,
+    STATUS_PAGE_MAINTENANCE,
+    STATUS_PAGE_PARTIAL_DOWN,
+    UP,
+    MAINTENANCE
+} from "../util.ts";
 import { useToast } from "vue-toastification";
 import dayjs from "dayjs";
 const toast = useToast();
@@ -259,6 +283,7 @@ export default {
             loadedTheme: false,
             loadedData: false,
             baseURL: "",
+            maintenance: [],
         };
     },
     computed: {
@@ -320,6 +345,10 @@ export default {
             return "bg-" + this.incident.style;
         },
 
+        maintenanceClass() {
+            return "bg-maintenance";
+        },
+
         overallStatus() {
 
             if (Object.keys(this.$root.publicLastHeartbeatList).length === 0) {
@@ -332,7 +361,10 @@ export default {
             for (let id in this.$root.publicLastHeartbeatList) {
                 let beat = this.$root.publicLastHeartbeatList[id];
 
-                if (beat.status === UP) {
+                if (beat.status === MAINTENANCE) {
+                    return STATUS_PAGE_MAINTENANCE;
+                }
+                else if (beat.status === UP) {
                     hasUp = true;
                 } else {
                     status = STATUS_PAGE_PARTIAL_DOWN;
@@ -358,6 +390,10 @@ export default {
             return this.overallStatus === STATUS_PAGE_ALL_DOWN;
         },
 
+        isMaintenance() {
+            return this.overallStatus === STATUS_PAGE_MAINTENANCE;
+        },
+
     },
     watch: {
 
@@ -423,6 +459,10 @@ export default {
             }
         });
 
+        axios.get("/api/status-page/maintenance-list").then((res) => {
+            this.maintenance = res.data;
+        });
+
         axios.get("/api/status-page/monitor-list").then((res) => {
             this.$root.publicGroupList = res.data;
         });
@@ -580,6 +620,10 @@ export default {
             return dayjs.utc(date).fromNow();
         },
 
+        dateFromNowMaintenance(date) {
+            return dayjs(date).fromNow();
+        },
+
     }
 };
 </script>
@@ -671,6 +715,22 @@ footer {
     }
 }
 
+.maintenance {
+    color: white;
+
+    .date {
+        font-size: 12px;
+    }
+}
+
+.bg-maintenance {
+    background-color: $maintenance;
+}
+
+.statusMaintenance {
+    color: $maintenance;
+}
+
 .mobile {
     h1 {
         font-size: 22px;
diff --git a/src/router.js b/src/router.js
index a2414eb6..a78007ef 100644
--- a/src/router.js
+++ b/src/router.js
@@ -5,6 +5,7 @@ import Dashboard from "./pages/Dashboard.vue";
 import DashboardHome from "./pages/DashboardHome.vue";
 import Details from "./pages/Details.vue";
 import EditMonitor from "./pages/EditMonitor.vue";
+import EditMaintenance from "./pages/EditMaintenance.vue";
 import List from "./pages/List.vue";
 const Settings = () => import("./pages/Settings.vue");
 import Setup from "./pages/Setup.vue";
@@ -18,6 +19,7 @@ import MonitorHistory from "./components/settings/MonitorHistory.vue";
 import Security from "./components/settings/Security.vue";
 import Backup from "./components/settings/Backup.vue";
 import About from "./components/settings/About.vue";
+import MaintenanceDetails from "./pages/MaintenanceDetails.vue";
 
 const routes = [
     {
@@ -41,7 +43,7 @@ const routes = [
                         component: DashboardHome,
                         children: [
                             {
-                                path: "/dashboard/:id",
+                                path: "/dashboard/monitor/:id",
                                 component: EmptyLayout,
                                 children: [
                                     {
@@ -54,10 +56,28 @@ const routes = [
                                     },
                                 ],
                             },
+                            {
+                                path: "/dashboard/maintenance/:id",
+                                component: EmptyLayout,
+                                children: [
+                                    {
+                                        path: "",
+                                        component: MaintenanceDetails,
+                                    },
+                                    {
+                                        path: "/editMaintenance/:id",
+                                        component: EditMaintenance,
+                                    },
+                                ],
+                            },
                             {
                                 path: "/add",
                                 component: EditMonitor,
                             },
+                            {
+                                path: "/addMaintenance",
+                                component: EditMaintenance,
+                            },
                             {
                                 path: "/list",
                                 component: List,
diff --git a/src/util.js b/src/util.js
index b2df7ac7..dc5dea58 100644
--- a/src/util.js
+++ b/src/util.js
@@ -7,7 +7,7 @@
 // Backend uses the compiled file util.js
 // Frontend uses util.ts
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
+exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
 const _dayjs = require("dayjs");
 const dayjs = _dayjs;
 exports.isDev = process.env.NODE_ENV === "development";
@@ -15,9 +15,11 @@ exports.appName = "Uptime Kuma";
 exports.DOWN = 0;
 exports.UP = 1;
 exports.PENDING = 2;
+exports.MAINTENANCE = 3;
 exports.STATUS_PAGE_ALL_DOWN = 0;
 exports.STATUS_PAGE_ALL_UP = 1;
 exports.STATUS_PAGE_PARTIAL_DOWN = 2;
+exports.STATUS_PAGE_MAINTENANCE = 3;
 function flipStatus(s) {
     if (s === exports.UP) {
         return exports.DOWN;
@@ -162,6 +164,10 @@ function genSecret(length = 64) {
 }
 exports.genSecret = genSecret;
 function getMonitorRelativeURL(id) {
-    return "/dashboard/" + id;
+    return "/dashboard/monitor/" + id;
 }
 exports.getMonitorRelativeURL = getMonitorRelativeURL;
+function getMaintenanceRelativeURL(id) {
+    return "/dashboard/maintenance/" + id;
+}
+exports.getMaintenanceRelativeURL = getMaintenanceRelativeURL;
diff --git a/src/util.ts b/src/util.ts
index 633d933e..b9ce9e23 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -14,10 +14,12 @@ export const appName = "Uptime Kuma";
 export const DOWN = 0;
 export const UP = 1;
 export const PENDING = 2;
+export const MAINTENANCE = 3;
 
 export const STATUS_PAGE_ALL_DOWN = 0;
 export const STATUS_PAGE_ALL_UP = 1;
 export const STATUS_PAGE_PARTIAL_DOWN = 2;
+export const STATUS_PAGE_MAINTENANCE = 3;
 
 
 export function flipStatus(s: number) {
@@ -185,5 +187,9 @@ export function genSecret(length = 64) {
 }
 
 export function getMonitorRelativeURL(id: string) {
-    return "/dashboard/" + id;
+    return "/dashboard/monitor/" + id;
+}
+
+export function getMaintenanceRelativeURL(id: string) {
+    return "/dashboard/maintenance/" + id;
 }

From 1ac904d6d6260a34d08a29249fb7cc15236ee787 Mon Sep 17 00:00:00 2001
From: OidaTiftla <chm.stephan@outlook.com>
Date: Sun, 23 Jan 2022 15:22:57 +0100
Subject: [PATCH 004/803] Introduce resend interval if down

---
 package-lock.json         |  4 ++--
 package.json              |  8 ++++----
 server/model/monitor.js   | 17 +++++++++++++++++
 server/server.js          |  7 +++++++
 src/pages/EditMonitor.vue |  8 ++++++++
 5 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index fc21a63f..5253c3af 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.11.3",
+    "version": "1.11.4",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.11.3",
+            "version": "1.11.4",
             "license": "MIT",
             "dependencies": {
                 "@fortawesome/fontawesome-svg-core": "~1.2.36",
diff --git a/package.json b/package.json
index 048a5e0a..cd522a31 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.11.3",
+    "version": "1.11.4",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -30,13 +30,13 @@
         "build-docker": "npm run build && npm run build-docker-debian && npm run build-docker-alpine",
         "build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push",
         "build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push",
-        "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.11.3-alpine --target release . --push",
-        "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.11.3 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.11.3-debian --target release . --push",
+        "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.11.4-alpine --target release . --push",
+        "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.11.4 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.11.4-debian --target release . --push",
         "build-docker-nightly": "npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
         "build-docker-nightly-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push",
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.11.3 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.11.4 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "update-version": "node extra/update-version.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
diff --git a/server/model/monitor.js b/server/model/monitor.js
index c4441d63..eaba61ad 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -68,6 +68,7 @@ class Monitor extends BeanModel {
             type: this.type,
             interval: this.interval,
             retryInterval: this.retryInterval,
+            resendInterval: this.resendInterval,
             keyword: this.keyword,
             ignoreTls: this.getIgnoreTls(),
             upsideDown: this.isUpsideDown(),
@@ -135,6 +136,7 @@ class Monitor extends BeanModel {
             bean.monitor_id = this.id;
             bean.time = R.isoDateTime(dayjs.utc());
             bean.status = DOWN;
+            bean.lastNotifiedTime = previousBeat?.lastNotifiedTime || null; // after first update lastNotifiedTime will be undefined
 
             if (this.isUpsideDown()) {
                 bean.status = flipStatus(bean.status);
@@ -390,12 +392,27 @@ class Monitor extends BeanModel {
                 debug(`[${this.name}] sendNotification`);
                 await Monitor.sendNotification(isFirstBeat, this, bean);
 
+                // Set last notified time to now
+                bean.lastNotifiedTime = dayjs().valueOf();
+
                 // Clear Status Page Cache
                 debug(`[${this.name}] apicache clear`);
                 apicache.clear();
 
             } else {
                 bean.important = false;
+
+                if (bean.status === DOWN && this.resendInterval > 0) {
+                    timeSinceLastNotified = dayjs().valueOf() - (bean.lastNotifiedTime || 0);
+                    if (timeSinceLastNotified >= this.resendInterval) {
+                        // Send notification again, because we are still DOWN
+                        debug(`[${this.name}] sendNotification`);
+                        await Monitor.sendNotification(isFirstBeat, this, bean);
+
+                        // Set last notified time to now
+                        bean.lastNotifiedTime = dayjs().valueOf();
+                    }
+                }
             }
 
             if (bean.status === UP) {
diff --git a/server/server.js b/server/server.js
index 153cac4f..5a9cf944 100644
--- a/server/server.js
+++ b/server/server.js
@@ -588,6 +588,7 @@ exports.entryPage = "dashboard";
                 bean.basic_auth_pass = monitor.basic_auth_pass;
                 bean.interval = monitor.interval;
                 bean.retryInterval = monitor.retryInterval;
+                bean.resendInterval = monitor.resendInterval;
                 bean.hostname = monitor.hostname;
                 bean.maxretries = monitor.maxretries;
                 bean.port = monitor.port;
@@ -1082,6 +1083,7 @@ exports.entryPage = "dashboard";
                 let monitorListData = backupData.monitorList;
 
                 let version17x = compareVersions.compare(backupData.version, "1.7.0", ">=");
+                let version1114 = compareVersions.compare(backupData.version, "1.11.4", ">=");
 
                 // If the import option is "overwrite" it'll clear most of the tables, except "settings" and "user"
                 if (importHandle == "overwrite") {
@@ -1131,6 +1133,7 @@ exports.entryPage = "dashboard";
 
                             // Define default values
                             let retryInterval = 0;
+                            let resendInterval = 0;
 
                             /*
                             Only replace the default value with the backup file data for the specific version, where it appears the first time
@@ -1139,6 +1142,9 @@ exports.entryPage = "dashboard";
                             if (version17x) {
                                 retryInterval = monitorListData[i].retryInterval;
                             }
+                            if (version1114) {
+                                resendInterval = monitorListData[i].resendInterval;
+                            }
 
                             // --- End ---
 
@@ -1154,6 +1160,7 @@ exports.entryPage = "dashboard";
                                 basic_auth_pass: monitorListData[i].basic_auth_pass,
                                 interval: monitorListData[i].interval,
                                 retryInterval: retryInterval,
+                                resendInterval: resendInterval,
                                 hostname: monitorListData[i].hostname,
                                 maxretries: monitorListData[i].maxretries,
                                 port: monitorListData[i].port,
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 4b6a920c..b95c1098 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -137,6 +137,14 @@
                                 <input id="retry-interval" v-model="monitor.retryInterval" type="number" class="form-control" required min="20" step="1">
                             </div>
 
+                            <div class="my-3">
+                                <label for="resend-interval" class="form-label">
+                                    {{ $t("Notification resend Interval if Down") }}
+                                    <span>({{ $t("resendEverySecond", [ monitor.resendInterval ]) }})</span>
+                                </label>
+                                <input id="resend-interval" v-model="monitor.resendInterval" type="number" class="form-control" required min="20" step="1">
+                            </div>
+
                             <h2 v-if="monitor.type !== 'push'" class="mt-5 mb-2">{{ $t("Advanced") }}</h2>
 
                             <div v-if="monitor.type === 'http' || monitor.type === 'keyword' " class="my-3 form-check">

From b69a8b8493e095842bcf7daceaea21110106146a Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Sun, 23 Jan 2022 17:35:53 +0100
Subject: [PATCH 005/803] Fix formatting

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 server/server.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/server/server.js b/server/server.js
index 5a9cf944..0ad361ad 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1142,6 +1142,7 @@ exports.entryPage = "dashboard";
                             if (version17x) {
                                 retryInterval = monitorListData[i].retryInterval;
                             }
+
                             if (version1114) {
                                 resendInterval = monitorListData[i].resendInterval;
                             }

From 65fc71e4858ae61b7e1fb639ca335b8ad4f22ca4 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Sun, 23 Jan 2022 17:34:39 +0100
Subject: [PATCH 006/803] Revert version change

---
 package-lock.json | 4 ++--
 package.json      | 8 ++++----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 5253c3af..fc21a63f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.11.4",
+    "version": "1.11.3",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.11.4",
+            "version": "1.11.3",
             "license": "MIT",
             "dependencies": {
                 "@fortawesome/fontawesome-svg-core": "~1.2.36",
diff --git a/package.json b/package.json
index cd522a31..048a5e0a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.11.4",
+    "version": "1.11.3",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -30,13 +30,13 @@
         "build-docker": "npm run build && npm run build-docker-debian && npm run build-docker-alpine",
         "build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push",
         "build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push",
-        "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.11.4-alpine --target release . --push",
-        "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.11.4 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.11.4-debian --target release . --push",
+        "build-docker-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.11.3-alpine --target release . --push",
+        "build-docker-debian": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.11.3 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.11.3-debian --target release . --push",
         "build-docker-nightly": "npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
         "build-docker-nightly-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push",
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.11.4 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.11.3 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "update-version": "node extra/update-version.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",

From 11e9eee09d45996d476168d8c646962eb6104bd1 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Sun, 23 Jan 2022 17:48:09 +0100
Subject: [PATCH 007/803] Change seconds to minutes

---
 server/model/monitor.js   | 2 +-
 src/languages/en.js       | 1 +
 src/pages/EditMonitor.vue | 3 ++-
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index eaba61ad..f4803355 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -403,7 +403,7 @@ class Monitor extends BeanModel {
                 bean.important = false;
 
                 if (bean.status === DOWN && this.resendInterval > 0) {
-                    timeSinceLastNotified = dayjs().valueOf() - (bean.lastNotifiedTime || 0);
+                    timeSinceLastNotified = (dayjs().valueOf() - (bean.lastNotifiedTime || 0)) / 60; // divide by 60 to convert from seconds to minutes
                     if (timeSinceLastNotified >= this.resendInterval) {
                         // Send notification again, because we are still DOWN
                         debug(`[${this.name}] sendNotification`);
diff --git a/src/languages/en.js b/src/languages/en.js
index 47513466..21e215f7 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -2,6 +2,7 @@ export default {
     languageName: "English",
     checkEverySecond: "Check every {0} seconds",
     retryCheckEverySecond: "Retry every {0} seconds",
+    resendEveryMinute: "Resend every {0} minutes if DOWN",
     retriesDescription: "Maximum retries before the service is marked as down and a notification is sent",
     ignoreTLSError: "Ignore TLS/SSL error for HTTPS websites",
     upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.",
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index b95c1098..3b4cbcf1 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -140,7 +140,7 @@
                             <div class="my-3">
                                 <label for="resend-interval" class="form-label">
                                     {{ $t("Notification resend Interval if Down") }}
-                                    <span>({{ $t("resendEverySecond", [ monitor.resendInterval ]) }})</span>
+                                    <span>({{ $t("resendEveryMinute", [ monitor.resendInterval ]) }})</span>
                                 </label>
                                 <input id="resend-interval" v-model="monitor.resendInterval" type="number" class="form-control" required min="20" step="1">
                             </div>
@@ -439,6 +439,7 @@ export default {
                     method: "GET",
                     interval: 60,
                     retryInterval: this.interval,
+                    resendInterval: 0,
                     maxretries: 0,
                     notificationIDList: {},
                     ignoreTls: false,

From 5fda1f0f596483fe1a98d6e1731881f063e32911 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sun, 23 Jan 2022 20:33:39 +0100
Subject: [PATCH 008/803] minor fixes (missing commas, spaces, translations)

---
 server/model/maintenance.js      |  4 ++--
 server/model/monitor.js          |  2 +-
 server/routers/api-router.js     |  2 +-
 src/components/MonitorList.vue   |  4 ++--
 src/languages/en.js              | 17 +++++++++++++++++
 src/pages/EditMaintenance.vue    | 10 ++++------
 src/pages/MaintenanceDetails.vue |  4 ++--
 7 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 4958a203..55308895 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -17,7 +17,7 @@ class Maintenance extends BeanModel {
             title: this.title,
             description: this.description,
             start_date: this.start_date,
-            end_date: this.end_date
+            end_date: this.end_date,
         };
     }
 
@@ -30,7 +30,7 @@ class Maintenance extends BeanModel {
             title: this.title,
             description: this.description,
             start_date: this.start_date,
-            end_date: this.end_date
+            end_date: this.end_date,
         };
     }
 }
diff --git a/server/model/monitor.js b/server/model/monitor.js
index cd62ec6b..b6140c13 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -6,7 +6,7 @@ dayjs.extend(utc);
 dayjs.extend(timezone);
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
-const { debug, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger} = require("../../src/util");
+const { debug, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger } = require("../../src/util");
 const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, errorLog } = require("../util-server");
 const { R } = require("redbean-node");
 const { BeanModel } = require("redbean-node/dist/bean-model");
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 19e4fcad..472a837d 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -5,7 +5,7 @@ const server = require("../server");
 const apicache = require("../modules/apicache");
 const Monitor = require("../model/monitor");
 const dayjs = require("dayjs");
-const { UP, MAINTENANCE, flipStatus, debug} = require("../../src/util");
+const { UP, MAINTENANCE, flipStatus, debug } = require("../../src/util");
 let router = express.Router();
 
 let cache = apicache.middleware;
diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index d943efff..4e6610ad 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -66,7 +66,7 @@
 import HeartbeatBar from "../components/HeartbeatBar.vue";
 import Uptime from "../components/Uptime.vue";
 import Tag from "../components/Tag.vue";
-import {getMaintenanceRelativeURL, getMonitorRelativeURL} from "../util.ts";
+import {getMaintenanceRelativeURL, getMonitorRelativeURL } from "../util.ts";
 
 export default {
     components: {
@@ -82,7 +82,7 @@ export default {
     data() {
         return {
             searchText: "",
-            selectedList: "monitor"
+            selectedList: "monitor",
         };
     },
     computed: {
diff --git a/src/languages/en.js b/src/languages/en.js
index 3edcc556..ce659466 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -7,7 +7,20 @@ export default {
     upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.",
     maxRedirectDescription: "Maximum number of redirects to follow. Set to 0 to disable redirects.",
     acceptedStatusCodesDescription: "Select status codes which are considered as a successful response.",
+    Maintenance: "Maintenance",
+    "Monitor List": "Monitor List",
+    "Maintenance List": "Maintenance List",
+    "Schedule maintenance": "Schedule maintenance",
+    "Affected Monitors": "Affected Monitors",
+    "Pick Affected Monitors...": "Pick Affected Monitors...",
+    "Start of maintenance": "Start of maintenance",
+    "Expected end of maintenance": "Expected end of maintenance",
+    Start: "Start",
+    End: "End",
     affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
+    atLeastOneMonitor: "Select at least one affected monitor",
+    maintenanceTitleExample: "Network infrastructure maintenance",
+    maintenanceDescriptionExample: "Example: Network infrastructure maintenance is underway which will affect some of our services.",
     passwordNotMatchMsg: "The repeat password does not match.",
     notificationDescription: "Notifications must be assigned to a monitor to function.",
     keywordDescription: "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
@@ -40,7 +53,10 @@ export default {
     "Check Update On GitHub": "Check Update On GitHub",
     List: "List",
     Add: "Add",
+    "Add Monitor": "Add Monitor",
+    "Add Maintenance": "Add Maintenance",
     "Add New Monitor": "Add New Monitor",
+    "Add New Maintenance": "Add New Maintenance",
     "Quick Stats": "Quick Stats",
     Up: "Up",
     Down: "Down",
@@ -114,6 +130,7 @@ export default {
     "Remember me": "Remember me",
     Login: "Login",
     "No Monitors, please": "No Monitors, please",
+    "No Maintenance, please": "No Maintenance, please",
     "add one": "add one",
     "Notification Type": "Notification Type",
     Email: "Email",
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 144b398a..6b6f8057 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -114,16 +114,15 @@ export default {
         },
 
         titlePlaceholder() {
-            return this.$t("Network infrastructure maintenance");
+            return this.$t("maintenanceTitleExample");
         },
 
         descriptionPlaceholder() {
-            return this.$t("Example: Network infrastructure maintenance is underway which will affect some of our services.");
+            return this.$t("maintenanceDescriptionExample");
         }
 
     },
     watch: {
-
         "$route.fullPath"() {
             this.init();
         }
@@ -137,7 +136,7 @@ export default {
                 Object.values(this.$root.monitorList).map(monitor => {
                     this.affectedMonitorsOptions.push({
                         id: monitor.id,
-                        name: monitor.name
+                        name: monitor.name,
                     });
                 });
             }
@@ -173,14 +172,13 @@ export default {
                     }
                 });
             }
-
         },
 
         async submit() {
             this.processing = true;
 
             if (this.affectedMonitors.length === 0) {
-                toast.error(this.$t("Select at least one affected monitor"));
+                toast.error(this.$t("atLeastOneMonitor"));
                 return this.processing = false;
             }
 
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
index e3e4b59b..77d70078 100644
--- a/src/pages/MaintenanceDetails.vue
+++ b/src/pages/MaintenanceDetails.vue
@@ -3,9 +3,9 @@
         <div v-if="maintenance">
             <h1> {{ maintenance.title }}</h1>
             <p class="url">
-                <span>Start: {{ $root.datetimeMaintenance(maintenance.start_date) }}</span>
+                <span>{{$t("Start")}}: {{ $root.datetimeMaintenance(maintenance.start_date) }}</span>
                 <br>
-                <span>End: {{ $root.datetimeMaintenance(maintenance.end_date) }}</span>
+                <span>{{$t("End")}}: {{ $root.datetimeMaintenance(maintenance.end_date) }}</span>
             </p>
 
             <div class="functions" style="margin-top: 10px">

From f931e709e638f0720309d1c59cbf17fe34b622a1 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Mon, 24 Jan 2022 09:18:12 +0100
Subject: [PATCH 009/803] Add database patch

---
 db/patch-monitor-add-resend-interval.sql | 7 +++++++
 server/database.js                       | 1 +
 2 files changed, 8 insertions(+)
 create mode 100644 db/patch-monitor-add-resend-interval.sql

diff --git a/db/patch-monitor-add-resend-interval.sql b/db/patch-monitor-add-resend-interval.sql
new file mode 100644
index 00000000..e8bb08b8
--- /dev/null
+++ b/db/patch-monitor-add-resend-interval.sql
@@ -0,0 +1,7 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+ALTER TABLE monitor
+    ADD resend_interval INTEGER default 0 not null;
+
+COMMIT;
diff --git a/server/database.js b/server/database.js
index afcace70..ce4d5089 100644
--- a/server/database.js
+++ b/server/database.js
@@ -53,6 +53,7 @@ class Database {
         "patch-2fa-invalidate-used-token.sql": true,
         "patch-notification_sent_history.sql": true,
         "patch-monitor-basic-auth.sql": true,
+        "patch-monitor-add-resend-interval.sql": true,
     }
 
     /**

From 8c4ab9d652d931c44ffbc434c4d8599ee2aa5cd3 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Mon, 24 Jan 2022 09:18:22 +0100
Subject: [PATCH 010/803] Simplify

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

diff --git a/src/languages/en.js b/src/languages/en.js
index 21e215f7..33ad0a42 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -2,7 +2,7 @@ export default {
     languageName: "English",
     checkEverySecond: "Check every {0} seconds",
     retryCheckEverySecond: "Retry every {0} seconds",
-    resendEveryMinute: "Resend every {0} minutes if DOWN",
+    resendEveryMinute: "Resend every {0} minutes",
     retriesDescription: "Maximum retries before the service is marked as down and a notification is sent",
     ignoreTLSError: "Ignore TLS/SSL error for HTTPS websites",
     upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.",

From 30ce53f57c3ada92b700c14cba6be822f687ee55 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Mon, 24 Jan 2022 09:18:38 +0100
Subject: [PATCH 011/803] Fix min value of resend interval

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

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 3b4cbcf1..a297c54b 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -142,7 +142,7 @@
                                     {{ $t("Notification resend Interval if Down") }}
                                     <span>({{ $t("resendEveryMinute", [ monitor.resendInterval ]) }})</span>
                                 </label>
-                                <input id="resend-interval" v-model="monitor.resendInterval" type="number" class="form-control" required min="20" step="1">
+                                <input id="resend-interval" v-model="monitor.resendInterval" type="number" class="form-control" required min="0" step="1">
                             </div>
 
                             <h2 v-if="monitor.type !== 'push'" class="mt-5 mb-2">{{ $t("Advanced") }}</h2>

From f390a8caf1fea00348a3245b4c79d4315c125f3a Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Mon, 24 Jan 2022 21:59:25 +0100
Subject: [PATCH 012/803] Fix missing DB patch and use DATETIME as column
 format

---
 db/patch-heartbeat-add-last-notified-time.sql |  7 +++++++
 server/database.js                            |  1 +
 server/model/monitor.js                       | 10 +++++-----
 3 files changed, 13 insertions(+), 5 deletions(-)
 create mode 100644 db/patch-heartbeat-add-last-notified-time.sql

diff --git a/db/patch-heartbeat-add-last-notified-time.sql b/db/patch-heartbeat-add-last-notified-time.sql
new file mode 100644
index 00000000..af9c21c0
--- /dev/null
+++ b/db/patch-heartbeat-add-last-notified-time.sql
@@ -0,0 +1,7 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+ALTER TABLE heartbeat
+    ADD last_notified_time DATETIME default null;
+
+COMMIT;
diff --git a/server/database.js b/server/database.js
index ce4d5089..0aae8ffc 100644
--- a/server/database.js
+++ b/server/database.js
@@ -54,6 +54,7 @@ class Database {
         "patch-notification_sent_history.sql": true,
         "patch-monitor-basic-auth.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
+        "patch-heartbeat-add-last-notified-time.sql": true,
     }
 
     /**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index f4803355..85a0e944 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -136,7 +136,7 @@ class Monitor extends BeanModel {
             bean.monitor_id = this.id;
             bean.time = R.isoDateTime(dayjs.utc());
             bean.status = DOWN;
-            bean.lastNotifiedTime = previousBeat?.lastNotifiedTime || null; // after first update lastNotifiedTime will be undefined
+            bean.lastNotifiedTime = previousBeat?.lastNotifiedTime;
 
             if (this.isUpsideDown()) {
                 bean.status = flipStatus(bean.status);
@@ -393,7 +393,7 @@ class Monitor extends BeanModel {
                 await Monitor.sendNotification(isFirstBeat, this, bean);
 
                 // Set last notified time to now
-                bean.lastNotifiedTime = dayjs().valueOf();
+                bean.lastNotifiedTime = R.isoDateTime(dayjs.utc());
 
                 // Clear Status Page Cache
                 debug(`[${this.name}] apicache clear`);
@@ -403,14 +403,14 @@ class Monitor extends BeanModel {
                 bean.important = false;
 
                 if (bean.status === DOWN && this.resendInterval > 0) {
-                    timeSinceLastNotified = (dayjs().valueOf() - (bean.lastNotifiedTime || 0)) / 60; // divide by 60 to convert from seconds to minutes
+                    let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60; // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
                     if (timeSinceLastNotified >= this.resendInterval) {
                         // Send notification again, because we are still DOWN
-                        debug(`[${this.name}] sendNotification`);
+                        debug(`[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
                         await Monitor.sendNotification(isFirstBeat, this, bean);
 
                         // Set last notified time to now
-                        bean.lastNotifiedTime = dayjs().valueOf();
+                        bean.lastNotifiedTime = R.isoDateTime(dayjs.utc());
                     }
                 }
             }

From 855b12f435ca87059c2797b8695418947fc9b73e Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Mon, 24 Jan 2022 22:20:38 +0100
Subject: [PATCH 013/803] Add text for resend disabled

---
 src/languages/en.js       | 1 +
 src/pages/EditMonitor.vue | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/languages/en.js b/src/languages/en.js
index 33ad0a42..17a58543 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -3,6 +3,7 @@ export default {
     checkEverySecond: "Check every {0} seconds",
     retryCheckEverySecond: "Retry every {0} seconds",
     resendEveryMinute: "Resend every {0} minutes",
+    resendDisabled: "Resend disabled",
     retriesDescription: "Maximum retries before the service is marked as down and a notification is sent",
     ignoreTLSError: "Ignore TLS/SSL error for HTTPS websites",
     upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.",
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index a297c54b..a7bc4f78 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -140,7 +140,8 @@
                             <div class="my-3">
                                 <label for="resend-interval" class="form-label">
                                     {{ $t("Notification resend Interval if Down") }}
-                                    <span>({{ $t("resendEveryMinute", [ monitor.resendInterval ]) }})</span>
+                                    <span v-if="monitor.resendInterval > 0">({{ $t("resendEveryMinute", [ monitor.resendInterval ]) }})</span>
+                                    <span v-else>({{ $t("resendDisabled") }})</span>
                                 </label>
                                 <input id="resend-interval" v-model="monitor.resendInterval" type="number" class="form-control" required min="0" step="1">
                             </div>

From d446a57d42613490c6bd5a6bec075b289ff3caef Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Mon, 24 Jan 2022 22:20:48 +0100
Subject: [PATCH 014/803] Add german translation

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

diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index 48cdd2e3..9286a09b 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -164,6 +164,8 @@ export default {
     "Search...": "Suchen...",
     "Heartbeat Retry Interval": "Heartbeat-Wiederholungsintervall",
     retryCheckEverySecond: "Versuche alle {0} Sekunden",
+    resendEveryMinute: "Erneut versenden alle {0} Minuten",
+    resendDisabled: "Erneut versenden deaktiviert",
     "Import Backup": "Backup importieren",
     "Export Backup": "Backup exportieren",
     "Avg. Ping": "Durchschn. Ping",

From e7b2832967f6a40d85a78b482b6d46a8676e6303 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Mon, 24 Jan 2022 22:33:15 +0100
Subject: [PATCH 015/803] The start and end dates of the maintenance are now
 stored in UTC, which allows it to be converted between time zones

---
 server/model/monitor.js        |  6 +++---
 server/routers/api-router.js   |  6 +++---
 src/components/MonitorList.vue | 15 +++++++--------
 src/mixins/datetime.js         | 21 +++++++++++----------
 src/pages/EditMaintenance.vue  | 13 ++++++++-----
 src/pages/StatusPage.vue       |  6 +-----
 6 files changed, 33 insertions(+), 34 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index b6140c13..4779dd0e 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -29,7 +29,7 @@ class Monitor extends BeanModel {
      * Only show necessary data to public
      */
     async toPublicJSON() {
-        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now', 'localtime') AND datetime(maintenance.end_date) >= datetime('now', 'localtime')", [this.id]);
+        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now')", [this.id]);
 
         return {
             id: this.id,
@@ -54,7 +54,7 @@ class Monitor extends BeanModel {
         }
 
         const tags = await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [this.id]);
-        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now', 'localtime') AND datetime(maintenance.end_date) >= datetime('now', 'localtime')", [this.id]);
+        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now')", [this.id]);
 
         return {
             id: this.id,
@@ -142,7 +142,7 @@ class Monitor extends BeanModel {
             bean.time = R.isoDateTime(dayjs.utc());
             bean.status = DOWN;
 
-            const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now', 'localtime') AND datetime(maintenance.end_date) >= datetime('now', 'localtime')", [this.id]);
+            const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now')", [this.id]);
 
             if (this.isUpsideDown()) {
                 bean.status = flipStatus(bean.status);
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 472a837d..408b9450 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -51,7 +51,7 @@ router.get("/api/push/:pushToken", async (request, response) => {
             duration = dayjs(bean.time).diff(dayjs(previousHeartbeat.time), "second");
         }
 
-        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now', 'localtime') AND datetime(maintenance.end_date) >= datetime('now', 'localtime')", [monitor.id]);
+        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now')", [monitor.id]);
         if (maintenance.length !== 0) {
             msg = "Monitor under maintenance";
             status = MAINTENANCE;
@@ -149,8 +149,8 @@ router.get("/api/status-page/maintenance-list", async (_request, response) => {
         let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
             SELECT maintenance.*
             FROM maintenance
-            WHERE datetime(maintenance.start_date) <= datetime('now', 'localtime')
-              AND datetime(maintenance.end_date) >= datetime('now', 'localtime')
+            WHERE datetime(maintenance.start_date) <= datetime('now')
+              AND datetime(maintenance.end_date) >= datetime('now')
             ORDER BY maintenance.end_date
         `));
 
diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index 4e6610ad..696a02e7 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -25,7 +25,7 @@
                 {{ $t("No Maintenance, please") }} <router-link to="/addMaintenance">{{ $t("add one") }}</router-link>
             </div>
 
-            <router-link v-if="selectedList === 'maintenance'" v-for="(item, index) in sortedMaintenanceList" :key="index" :to="maintenanceURL(item.id)" class="item" :class="{ 'disabled': (Date.parse(item.end_date) < Date.now()) }">
+            <router-link v-if="selectedList === 'maintenance'" v-for="(item, index) in sortedMaintenanceList" :key="index" :to="maintenanceURL(item.id)" class="item" :class="{ 'disabled': !this.$root.isActiveMaintenance(item.end_date) }">
                 <div class="row">
                     <div class="col-9 col-md-8 small-padding">
                         <div class="info">
@@ -66,7 +66,7 @@
 import HeartbeatBar from "../components/HeartbeatBar.vue";
 import Uptime from "../components/Uptime.vue";
 import Tag from "../components/Tag.vue";
-import {getMaintenanceRelativeURL, getMonitorRelativeURL } from "../util.ts";
+import { getMaintenanceRelativeURL, getMonitorRelativeURL } from "../util.ts";
 
 export default {
     components: {
@@ -90,18 +90,17 @@ export default {
             let result = Object.values(this.$root.maintenanceList);
 
             result.sort((m1, m2) => {
-                const now = Date.now();
 
-                if (Date.parse(m1.end_date) >= now !== Date.parse(m2.end_date) >= now) {
-                    if (Date.parse(m2.end_date) < now) {
+                if (this.$root.isActiveMaintenance(m1.end_date) !== this.$root.isActiveMaintenance(m2.end_date)) {
+                    if (!this.$root.isActiveMaintenance(m2.end_date)) {
                         return -1;
                     }
-                    if (Date.parse(m1.end_date) < now) {
+                    if (!this.$root.isActiveMaintenance(m1.end_date)) {
                         return 1;
                     }
                 }
 
-                if (Date.parse(m1.end_date) >= now && Date.parse(m2.end_date) >= now) {
+                if (this.$root.isActiveMaintenance(m1.end_date) && this.$root.isActiveMaintenance(m2.end_date)) {
                     if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
                         return -1;
                     }
@@ -111,7 +110,7 @@ export default {
                     }
                 }
 
-                if (Date.parse(m1.end_date) < now && Date.parse(m2.end_date) < now) {
+                if (!this.$root.isActiveMaintenance(m1.end_date) && !this.$root.isActiveMaintenance(m2.end_date)) {
                     if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
                         return 1;
                     }
diff --git a/src/mixins/datetime.js b/src/mixins/datetime.js
index 08689520..3f4749af 100644
--- a/src/mixins/datetime.js
+++ b/src/mixins/datetime.js
@@ -18,6 +18,14 @@ export default {
     },
 
     methods: {
+        isActiveMaintenance(endDate) {
+            return (dayjs.utc(endDate).unix() >= dayjs.utc().unix());
+        },
+
+        toUTC(value) {
+            return dayjs.tz(value, this.timezone).utc().format();
+        },
+
         datetime(value) {
             return this.datetimeFormat(value, "YYYY-MM-DD HH:mm:ss");
         },
@@ -26,10 +34,10 @@ export default {
             const inputDate = new Date(value);
             const now = new Date(Date.now());
 
-            if (inputDate.getFullYear() === now.getFullYear() && inputDate.getMonth() === now.getMonth() && inputDate.getDay() === now.getDay())
-                return this.datetimeMaintenanceFormat(value, "HH:mm");
+            if (inputDate.getFullYear() === now.getUTCFullYear() && inputDate.getMonth() === now.getUTCMonth() && inputDate.getDay() === now.getUTCDay())
+                return this.datetimeFormat(value, "HH:mm");
             else
-                return this.datetimeMaintenanceFormat(value, "YYYY-MM-DD HH:mm");
+                return this.datetimeFormat(value, "YYYY-MM-DD HH:mm");
         },
 
         date(value) {
@@ -52,13 +60,6 @@ export default {
             }
             return "";
         },
-
-        datetimeMaintenanceFormat(value, format) {
-            if (value !== undefined && value !== "") {
-                return dayjs(value).format(format);
-            }
-            return "";
-        }
     },
 
     computed: {
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 6b6f8057..e50affaa 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -50,14 +50,14 @@
 
                             <!-- Start Date Time -->
                             <div class="my-3">
-                                <label for="start_date" class="form-label">{{ $t("Start of maintenance") }}</label>
+                                <label for="start_date" class="form-label">{{ $t("Start of maintenance") }} ({{this.$root.timezone}})</label>
                                 <input :type="'datetime-local'" id="start_date" v-model="maintenance.start_date"
                                        class="form-control" :class="{'darkCalendar': dark }" required>
                             </div>
 
                             <!-- End Date Time -->
                             <div class="my-3">
-                                <label for="end_date" class="form-label">{{ $t("Expected end of maintenance") }}</label>
+                                <label for="end_date" class="form-label">{{ $t("Expected end of maintenance") }} ({{this.$root.timezone}})</label>
                                 <input :type="'datetime-local'" id="end_date" v-model="maintenance.end_date"
                                        class="form-control" :class="{'darkCalendar': dark }" required>
                             </div>
@@ -156,6 +156,8 @@ export default {
             } else if (this.isEdit) {
                 this.$root.getSocket().emit("getMaintenance", this.$route.params.id, (res) => {
                     if (res.ok) {
+                        res.maintenance.start_date = this.$root.datetimeFormat(res.maintenance.start_date, "YYYY-MM-DDTHH:mm");
+                        res.maintenance.end_date = this.$root.datetimeFormat(res.maintenance.end_date, "YYYY-MM-DDTHH:mm");
                         this.maintenance = res.maintenance;
 
                         this.$root.getSocket().emit("getMonitorMaintenance", this.$route.params.id, (res) => {
@@ -182,9 +184,11 @@ export default {
                 return this.processing = false;
             }
 
+            this.maintenance.start_date = this.$root.toUTC(this.maintenance.start_date);
+            this.maintenance.end_date = this.$root.toUTC(this.maintenance.end_date);
+
             if (this.isAdd) {
                 this.$root.addMaintenance(this.maintenance, async (res) => {
-
                     if (res.ok) {
                         await this.addMonitorMaintenance(res.maintenanceID, () => {
                             toast.success(res.msg);
@@ -206,8 +210,7 @@ export default {
                             this.$root.toastRes(res);
                             this.init();
                         });
-                    }
-                    else {
+                    } else {
                         this.processing = false;
                         toast.error(res.msg);
                     }
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 11716b45..fdddba74 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -152,7 +152,7 @@
 
             <!-- Incident Date -->
             <div class="date mt-3">
-                {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }} ({{ dateFromNowMaintenance(maintenanceItem.start_date) }})<br />
+                {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }} ({{ dateFromNow(maintenanceItem.start_date) }})<br />
             </div>
         </div>
 
@@ -620,10 +620,6 @@ export default {
             return dayjs.utc(date).fromNow();
         },
 
-        dateFromNowMaintenance(date) {
-            return dayjs(date).fromNow();
-        },
-
     }
 };
 </script>

From b49e5d5c39c7b60e663237fa02bbda31a47c184c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Tue, 25 Jan 2022 19:07:27 +0100
Subject: [PATCH 016/803] The SQL query to determine if the monitor is under
 maintenance is now in its own method.

---
 server/model/monitor.js      | 16 ++++++++--------
 server/routers/api-router.js |  3 +--
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 4779dd0e..61291d63 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -29,12 +29,10 @@ class Monitor extends BeanModel {
      * Only show necessary data to public
      */
     async toPublicJSON() {
-        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now')", [this.id]);
-
         return {
             id: this.id,
             name: this.name,
-            maintenance: (maintenance.length !== 0),
+            maintenance: await Monitor.isUnderMaintenance(this.id),
         };
     }
 
@@ -54,7 +52,6 @@ class Monitor extends BeanModel {
         }
 
         const tags = await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [this.id]);
-        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now')", [this.id]);
 
         return {
             id: this.id,
@@ -84,7 +81,7 @@ class Monitor extends BeanModel {
             pushToken: this.pushToken,
             notificationIDList,
             tags: tags,
-            maintenance: (maintenance.length !== 0),
+            maintenance: await Monitor.isUnderMaintenance(this.id),
         };
     }
 
@@ -142,8 +139,6 @@ class Monitor extends BeanModel {
             bean.time = R.isoDateTime(dayjs.utc());
             bean.status = DOWN;
 
-            const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now')", [this.id]);
-
             if (this.isUpsideDown()) {
                 bean.status = flipStatus(bean.status);
             }
@@ -156,7 +151,7 @@ class Monitor extends BeanModel {
             }
 
             try {
-                if (maintenance.length !== 0) {
+                if (await Monitor.isUnderMaintenance(this.id)) {
                     bean.msg = "Monitor under maintenance";
                     bean.status = MAINTENANCE;
                 }
@@ -813,6 +808,11 @@ class Monitor extends BeanModel {
             monitorID
         ]);
     }
+
+    static async isUnderMaintenance(monitorID) {
+        const maintenance = await R.getRow("SELECT COUNT(*) AS count FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now') LIMIT 1", [monitorID]);
+        return maintenance.count !== 0;
+    }
 }
 
 module.exports = Monitor;
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 408b9450..d6ad35ce 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -51,8 +51,7 @@ router.get("/api/push/:pushToken", async (request, response) => {
             duration = dayjs(bean.time).diff(dayjs(previousHeartbeat.time), "second");
         }
 
-        const maintenance = await R.getAll("SELECT mm.*, maintenance.start_date, maintenance.end_date FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now')", [monitor.id]);
-        if (maintenance.length !== 0) {
+        if (await Monitor.isUnderMaintenance(monitor.id)) {
             msg = "Monitor under maintenance";
             status = MAINTENANCE;
         }

From d8013f31e8906aeb0188725353392581621cd121 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Sun, 27 Mar 2022 21:24:41 +0200
Subject: [PATCH 017/803] Update version after merging new master branch

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

diff --git a/server/server.js b/server/server.js
index e10df8cc..36b8590f 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1087,7 +1087,7 @@ exports.entryPage = "dashboard";
                 let monitorListData = backupData.monitorList;
 
                 let version17x = compareVersions.compare(backupData.version, "1.7.0", ">=");
-                let version1114 = compareVersions.compare(backupData.version, "1.11.4", ">=");
+                let version1132 = compareVersions.compare(backupData.version, "1.13.2", ">=");
 
                 // If the import option is "overwrite" it'll clear most of the tables, except "settings" and "user"
                 if (importHandle == "overwrite") {
@@ -1147,7 +1147,7 @@ exports.entryPage = "dashboard";
                                 retryInterval = monitorListData[i].retryInterval;
                             }
 
-                            if (version1114) {
+                            if (version1132) {
                                 resendInterval = monitorListData[i].resendInterval;
                             }
 

From 60f8ab7285fc0b3c1dfca5c8857807ba270e9956 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Thu, 21 Apr 2022 12:09:59 +0200
Subject: [PATCH 018/803] Use new logging mechanism

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index a7e0b82f..0ac2e33e 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -473,7 +473,7 @@ class Monitor extends BeanModel {
                     let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60; // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
                     if (timeSinceLastNotified >= this.resendInterval) {
                         // Send notification again, because we are still DOWN
-                        debug(`[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
+                        log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
                         await Monitor.sendNotification(isFirstBeat, this, bean);
 
                         // Set last notified time to now

From 19933bbd99d7e11dba97e61183051dc876b9581e Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Thu, 21 Apr 2022 12:18:15 +0200
Subject: [PATCH 019/803] Improve backwards compatibility

---
 server/server.js | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/server/server.js b/server/server.js
index d53fe696..58c08f9d 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1168,7 +1168,6 @@ try {
                 let monitorListData = backupData.monitorList;
 
                 let version17x = compareVersions.compare(backupData.version, "1.7.0", ">=");
-                let version1132 = compareVersions.compare(backupData.version, "1.13.2", ">=");
 
                 // If the import option is "overwrite" it'll clear most of the tables, except "settings" and "user"
                 if (importHandle == "overwrite") {
@@ -1237,7 +1236,6 @@ try {
 
                             // Define default values
                             let retryInterval = 0;
-                            let resendInterval = 0;
 
                             /*
                             Only replace the default value with the backup file data for the specific version, where it appears the first time
@@ -1247,10 +1245,6 @@ try {
                                 retryInterval = monitorListData[i].retryInterval;
                             }
 
-                            if (version1132) {
-                                resendInterval = monitorListData[i].resendInterval;
-                            }
-
                             // --- End ---
 
                             let monitor = {
@@ -1265,7 +1259,7 @@ try {
                                 basic_auth_pass: monitorListData[i].basic_auth_pass,
                                 interval: monitorListData[i].interval,
                                 retryInterval: retryInterval,
-                                resendInterval: resendInterval,
+                                resendInterval: monitorListData[i].resendInterval || 0,
                                 hostname: monitorListData[i].hostname,
                                 maxretries: monitorListData[i].maxretries,
                                 port: monitorListData[i].port,

From d6b591a513cb928c9173dab0b9042922a4b3df49 Mon Sep 17 00:00:00 2001
From: OidaTiftla <chm.stephan@outlook.com>
Date: Thu, 21 Apr 2022 17:45:58 +0200
Subject: [PATCH 020/803] Make comment more readable

Co-authored-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/model/monitor.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 0ac2e33e..1383153e 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -470,7 +470,8 @@ class Monitor extends BeanModel {
                 bean.important = false;
 
                 if (bean.status === DOWN && this.resendInterval > 0) {
-                    let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60; // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
+                    // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
+                    let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60; 
                     if (timeSinceLastNotified >= this.resendInterval) {
                         // Send notification again, because we are still DOWN
                         log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);

From 052fde5a24daa70855082c4ed9ba362c3785e463 Mon Sep 17 00:00:00 2001
From: OidaTiftla <chm.stephan@outlook.com>
Date: Thu, 21 Apr 2022 17:56:38 +0200
Subject: [PATCH 021/803] Fix casing of text label

Co-authored-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/pages/EditMonitor.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 4338b4ea..661a89c4 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -172,7 +172,7 @@
 
                             <div class="my-3">
                                 <label for="resend-interval" class="form-label">
-                                    {{ $t("Notification resend Interval if Down") }}
+                                    {{ $t("Notification resend interval if down") }}
                                     <span v-if="monitor.resendInterval > 0">({{ $t("resendEveryMinute", [ monitor.resendInterval ]) }})</span>
                                     <span v-else>({{ $t("resendDisabled") }})</span>
                                 </label>

From c7ec9a07e248a730095e725c870f8396dfaa2296 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Thu, 21 Apr 2022 17:59:38 +0200
Subject: [PATCH 022/803] Add translation for text label

---
 src/languages/de-DE.js | 1 +
 src/languages/en.js    | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index ae28bf5b..5af4c8a1 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -163,6 +163,7 @@ export default {
     Pink: "Pink",
     "Search...": "Suchen...",
     "Heartbeat Retry Interval": "Überprüfungsintervall",
+    "Notification resend interval if down": "Benachrichtigung erneut versenden wenn Inaktiv",
     retryCheckEverySecond: "Alle {0} Sekunden neu versuchen",
     resendEveryMinute: "Erneut versenden alle {0} Minuten",
     resendDisabled: "Erneut versenden deaktiviert",
diff --git a/src/languages/en.js b/src/languages/en.js
index 7726d12f..a3a375f3 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -74,6 +74,7 @@ export default {
     "Heartbeat Interval": "Heartbeat Interval",
     Retries: "Retries",
     "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+    "Notification resend interval if down": "Notification resend interval if down",
     Advanced: "Advanced",
     "Upside Down Mode": "Upside Down Mode",
     "Max. Redirects": "Max. Redirects",

From 7ed8ae9f7cc35e24c29bab087c5324d764bf67dc Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Thu, 21 Apr 2022 18:23:32 +0200
Subject: [PATCH 023/803] Fix trailing space warning

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 1383153e..84b211b8 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -471,7 +471,7 @@ class Monitor extends BeanModel {
 
                 if (bean.status === DOWN && this.resendInterval > 0) {
                     // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
-                    let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60; 
+                    let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60;
                     if (timeSinceLastNotified >= this.resendInterval) {
                         // Send notification again, because we are still DOWN
                         log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);

From 7532acc95d2347e2cc2983ca994de46fb52c9190 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sat, 30 Apr 2022 14:33:54 +0200
Subject: [PATCH 024/803] Resolve conflicts

---
 package-lock.json            | 58 ++++++++++++++++--------------------
 server/routers/api-router.js | 18 +++++------
 src/components/PingChart.vue |  4 +--
 src/icon.js                  |  2 ++
 src/mixins/socket.js         |  6 +++-
 src/pages/Dashboard.vue      | 19 ++++++++++--
 src/pages/DashboardHome.vue  |  2 +-
 src/pages/EditMonitor.vue    |  2 +-
 src/pages/StatusPage.vue     | 26 ++++++++--------
 src/util.ts                  |  2 +-
 10 files changed, 74 insertions(+), 65 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 295cc9e6..699969c1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.15.0",
+    "version": "1.15.1",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.15.0",
+            "version": "1.15.1",
             "license": "MIT",
             "dependencies": {
                 "@fortawesome/fontawesome-svg-core": "~1.2.36",
@@ -26852,9 +26852,9 @@
             "dev": true
         },
         "postcss-scss": {
-            "version": "4.0.2",
-            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.2.tgz",
-            "integrity": "sha512-xfdkU128CkKKKVAwkyt0M8OdnelJ3MRcIRAPPQkRpoPeuzWY3RIeg7piRCpZ79MK7Q16diLXMMAD9dN5mauPlQ=="
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.3.tgz",
+            "integrity": "sha512-j4KxzWovfdHsyxwl1BxkUal/O4uirvHgdzMKS1aWJBAV0qh2qj5qAZqpeBfVUYGWv+4iK9Az7SPyZ4fyNju1uA=="
         },
         "postcss-selector-parser": {
             "version": "6.0.10",
@@ -27072,21 +27072,15 @@
                     "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
                     "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
                     "dev": true
-                },
-                "progress": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz",
-                    "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==",
-                    "dev": true
-                },
-                "ws": {
-                    "version": "7.4.6",
-                    "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
-                    "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
-                    "dev": true
                 }
             }
         },
+        "qlobber": {
+            "version": "5.0.3",
+            "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
+            "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==",
+            "dev": true
+        },
         "qrcode": {
             "version": "1.5.0",
             "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.0.tgz",
@@ -28384,9 +28378,9 @@
             }
         },
         "stylelint-config-recommended": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz",
-            "integrity": "sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==",
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz",
+            "integrity": "sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==",
             "dev": true
         },
         "stylelint-config-standard": {
@@ -29101,9 +29095,9 @@
             "integrity": "sha512-CmtqT4zHQwLoJEyNVaXUjjUFPUVYlXXBHfSbRCHCUjODMqrn6L293LM1nc1ELx8epitZZvecTfIqOLlSzB3d+w=="
         },
         "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=="
+            "version": "0.11.4",
+            "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.11.4.tgz",
+            "integrity": "sha512-/3xFwzSykLW2HiiLie43a+FFgNOcokbBJ+fzvFXd0r2T8MYohqvphUyDQ8lbAwzQ3Dlcrb1c9ykifGkhSIAk6A=="
         },
         "vue-eslint-parser": {
             "version": "8.3.0",
@@ -29189,13 +29183,6 @@
             "requires": {
                 "tslib": "^2.2.0",
                 "vue-demi": "^0.11.3"
-            },
-            "dependencies": {
-                "vue-demi": {
-                    "version": "0.11.4",
-                    "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.11.4.tgz",
-                    "integrity": "sha512-/3xFwzSykLW2HiiLie43a+FFgNOcokbBJ+fzvFXd0r2T8MYohqvphUyDQ8lbAwzQ3Dlcrb1c9ykifGkhSIAk6A=="
-                }
             }
         },
         "vue-router": {
@@ -29405,9 +29392,14 @@
             }
         },
         "ws": {
-            "version": "7.5.5",
-            "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
-            "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
+            "version": "7.5.7",
+            "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz",
+            "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A=="
+        },
+        "xdg-basedir": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+            "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
             "dev": true
         },
         "xml-name-validator": {
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 99d9f85c..af305809 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -128,6 +128,8 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
             incident = incident.toPublicJSON();
         }
 
+        let maintenance = await getMaintenanceList();
+
         // Public Group List
         const publicGroupList = [];
         const showTags = !!statusPage.show_tags;
@@ -145,6 +147,7 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
         response.json({
             config: await statusPage.toPublicJSON(),
             incident,
+            maintenance,
             publicGroupList
         });
 
@@ -153,15 +156,10 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
     }
 
 });
-
-//TODO: make OK with new multi status pages
+// TODO: make slug aware
 // Status Page - Maintenance List
-// Can fetch only if published
-router.get("/api/status-page/maintenance-list", async (_request, response) => {
-    allowDevAllOrigin(response);
-
+async function getMaintenanceList() {
     try {
-        await checkPublished();
         const publicMaintenanceList = [];
 
         let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
@@ -176,12 +174,12 @@ router.get("/api/status-page/maintenance-list", async (_request, response) => {
             publicMaintenanceList.push(await bean.toPublicJSON());
         }
 
-        response.json(publicMaintenanceList);
+        return publicMaintenanceList;
 
     } catch (error) {
-        send403(response, error.message);
+        return null;
     }
-});
+}
 
 // Status Page Polling Data
 // Can fetch only if published
diff --git a/src/components/PingChart.vue b/src/components/PingChart.vue
index 90dc838a..ede31955 100644
--- a/src/components/PingChart.vue
+++ b/src/components/PingChart.vue
@@ -24,7 +24,7 @@ import timezone from "dayjs/plugin/timezone";
 import utc from "dayjs/plugin/utc";
 import { LineChart } from "vue-chart-3";
 import { useToast } from "vue-toastification";
-import { DOWN, MAINTENANCE } from "../util.ts";
+import { DOWN, PENDING, MAINTENANCE } from "../util.ts";
 
 dayjs.extend(utc);
 dayjs.extend(timezone);
@@ -187,7 +187,7 @@ export default {
                         x,
                         y: (beat.status === DOWN || beat.status === MAINTENANCE || beat.status === PENDING) ? 1 : 0,
                     });
-                    colorData.push((beat.status === MAINTENANCE) ? "rgba(23,71,245,0.41)" : ((beat.status === PENDING) ? "rgba(245,182,23,0.41)" : "#DC354568"))
+                    colorData.push((beat.status === MAINTENANCE) ? "rgba(23,71,245,0.41)" : ((beat.status === PENDING) ? "rgba(245,182,23,0.41)" : "#DC354568"));
                 });
 
             return {
diff --git a/src/icon.js b/src/icon.js
index 359fc262..c59b2a1c 100644
--- a/src/icon.js
+++ b/src/icon.js
@@ -42,6 +42,7 @@ import {
     faPlusCircle,
     faAngleDown,
     faWrench,
+    faHeartbeat,
 } from "@fortawesome/free-solid-svg-icons";
 
 library.add(
@@ -83,6 +84,7 @@ library.add(
     faPlusCircle,
     faAngleDown,
     faWrench,
+    faHeartbeat,
 );
 
 export { FontAwesomeIcon };
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index bf4b817c..8d419706 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -494,6 +494,7 @@ export default {
             let result = {
                 up: 0,
                 down: 0,
+                maintenance: 0,
                 unknown: 0,
                 pause: 0,
             };
@@ -502,7 +503,10 @@ export default {
                 let beat = this.$root.lastHeartbeatList[monitorID];
                 let monitor = this.$root.monitorList[monitorID];
 
-                if (monitor && ! monitor.active) {
+                if (monitor && monitor.maintenance) {
+                    result.maintenance++;
+                }
+                else if (monitor && ! monitor.active) {
                     result.pause++;
                 } else if (beat) {
                     if (beat.status === 1) {
diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue
index a2bd4dd2..e99422a4 100644
--- a/src/pages/Dashboard.vue
+++ b/src/pages/Dashboard.vue
@@ -2,9 +2,22 @@
     <div class="container-fluid">
         <div class="row">
             <div v-if="! $root.isMobile" class="col-12 col-md-5 col-xl-4">
-                <div>
-                    <router-link to="/add" class="btn btn-primary mb-3"><font-awesome-icon icon="plus" /> {{ $t("Add New Monitor") }}</router-link>
-                    <router-link to="/addMaintenance" class="btn btn-primary mb-3 float-end"><font-awesome-icon icon="wrench" /> {{ $t("Add New Maintenance") }}</router-link>
+                <div class="dropdown dropdown-create">
+                    <button class="btn btn-primary mb-3 dropdown-toggle" type="button" data-bs-toggle="dropdown">
+                        <font-awesome-icon icon="plus" /> {{ $t("Create") }}
+                    </button>
+                    <ul class="dropdown-menu dropdown-menu-end">
+                        <li>
+                            <button type="button" class="dropdown-item" @click="this.$router.push('/add')">
+                                <font-awesome-icon icon="heartbeat" /> {{ $t("Monitor") }}
+                            </button>
+                        </li>
+                        <li>
+                            <button type="button" class="dropdown-item" @click="this.$router.push('/addMaintenance')">
+                                <font-awesome-icon icon="exclamation-circle" /> {{ $t("Maintenance") }}
+                            </button>
+                        </li>
+                    </ul>
                 </div>
                 <MonitorList :scrollbar="true" />
             </div>
diff --git a/src/pages/DashboardHome.vue b/src/pages/DashboardHome.vue
index 7dc698f4..0f706912 100644
--- a/src/pages/DashboardHome.vue
+++ b/src/pages/DashboardHome.vue
@@ -17,7 +17,7 @@
                     </div>
                     <div class="col">
                         <h3>{{ $t("Maintenance") }}</h3>
-                        <span class="num text-maintenance">{{ stats.maintenance }}</span>
+                        <span class="num text-maintenance">{{ $root.stats.maintenance }}</span>
                     </div>
                     <div class="col">
                         <h3>{{ $t("Unknown") }}</h3>
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 899a3c52..39c114ad 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -606,7 +606,7 @@ export default {
                         toast.success(res.msg);
                         this.processing = false;
                         this.$root.getMonitorList();
-                        this.$router.push("/dashboard/monitor/" + res.monitorID);
+                        this.$router.push("/dashboard/" + res.monitorID);
                     } else {
                         toast.error(res.msg);
                         this.processing = false;
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 3cbc720b..7ae7c636 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -195,16 +195,20 @@
             </div>
 
             <!-- Maintenance -->
-            <div v-if="maintenance.length !== 0" v-for="maintenanceItem in maintenance" class="shadow-box alert mb-4 p-4 maintenance" role="alert" :class="maintenanceClass">
-                <h4 v-text="maintenanceItem.title" class="alert-heading" />
+            <template v-if="maintenance.length !== 0">
+                <div v-for="maintenanceItem in maintenance" class="shadow-box alert mb-4 p-4 maintenance" role="alert"
+                     :class="maintenanceClass">
+                    <h4 v-text="maintenanceItem.title" class="alert-heading"/>
 
-                <div v-text="maintenanceItem.description" class="content" />
+                    <div v-text="maintenanceItem.description" class="content"/>
 
-                <!-- Incident Date -->
-                <div class="date mt-3">
-                    {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }} ({{ dateFromNow(maintenanceItem.start_date) }})<br />
+                    <!-- Incident Date -->
+                    <div class="date mt-3">
+                        {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }}
+                        ({{ dateFromNow(maintenanceItem.start_date) }})<br/>
+                    </div>
                 </div>
-            </div>
+            </template>
 
             <!-- Overall Status -->
             <div class="shadow-box list  p-4 overall-status mb-4">
@@ -300,7 +304,7 @@
 import axios from "axios";
 import PublicGroupList from "../components/PublicGroupList.vue";
 import ImageCropUpload from "vue-image-crop-upload";
-import { STATUS_PAGE_ALL_DOWN, STATUS_PAGE_ALL_UP, STATUS_PAGE_MAINTENANCE, STATUS_PAGE_PARTIAL_DOWN, UP } from "../util.ts";
+import { STATUS_PAGE_ALL_DOWN, STATUS_PAGE_ALL_UP, STATUS_PAGE_MAINTENANCE, STATUS_PAGE_PARTIAL_DOWN, UP, MAINTENANCE } from "../util.ts";
 import { useToast } from "vue-toastification";
 import dayjs from "dayjs";
 import Favico from "favico.js";
@@ -579,14 +583,10 @@ export default {
             }
 
             this.incident = res.data.incident;
+            this.maintenance = res.data.maintenance;
             this.$root.publicGroupList = res.data.publicGroupList;
         });
 
-        //TODO: make OK with multi status pages
-        axios.get("/api/status-page/maintenance-list").then((res) => {
-            this.maintenance = res.data;
-        });
-
         // 5mins a loop
         this.updateHeartbeatList();
         feedInterval = setInterval(() => {
diff --git a/src/util.ts b/src/util.ts
index fa67db10..b307295a 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -280,7 +280,7 @@ export function genSecret(length = 64) {
 }
 
 export function getMonitorRelativeURL(id: string) {
-    return "/dashboard/monitor/" + id;
+    return "/dashboard/" + id;
 }
 
 export function getMaintenanceRelativeURL(id: string) {

From f78d01d770e36cb80abbb0c73858b53c4cde37f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sat, 30 Apr 2022 14:57:08 +0200
Subject: [PATCH 025/803] Resolve lint errors

---
 CNAME                            |  2 +-
 public/icon.svg                  |  2 +-
 server/model/monitor.js          |  8 ++--
 src/components/MonitorList.vue   | 71 +++++++++++++++++++-------------
 src/components/Uptime.vue        |  6 +--
 src/mixins/datetime.js           |  5 ++-
 src/mixins/socket.js             |  6 +--
 src/pages/Dashboard.vue          |  4 +-
 src/pages/EditMaintenance.vue    | 39 +++++++++++-------
 src/pages/MaintenanceDetails.vue |  8 ++--
 src/pages/StatusPage.vue         | 34 ++++++++-------
 11 files changed, 105 insertions(+), 80 deletions(-)

diff --git a/CNAME b/CNAME
index a5348b07..44250516 100644
--- a/CNAME
+++ b/CNAME
@@ -1 +1 @@
-git.kuma.pet
\ No newline at end of file
+git.kuma.pet
diff --git a/public/icon.svg b/public/icon.svg
index 825c344e..9c0bc6ca 100644
--- a/public/icon.svg
+++ b/public/icon.svg
@@ -1,3 +1,3 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 640 640" width="640" height="640"><defs><path d="M407.55 916.24C471.25 916.24 522.89 967.88 522.89 1031.57C522.89 1113.88 522.89 1245.44 522.89 1327.74C522.89 1391.44 471.25 1443.08 407.55 1443.08C325.25 1443.08 193.68 1443.08 111.38 1443.08C47.69 1443.08 -3.95 1391.44 -3.95 1327.74C-3.95 1245.44 -3.95 1113.88 -3.95 1031.57C-3.95 967.88 47.69 916.24 111.38 916.24C193.68 916.24 325.25 916.24 407.55 916.24Z" id="a1LdTs1gvU"></path><linearGradient id="gradientcoH7TNh19" gradientUnits="userSpaceOnUse" x1="256.07" y1="1132.14" x2="609.11" y2="1480.42"><stop style="stop-color: #c2efd2;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #8ff0e5;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M-467.41 394.63C-467.41 554.76 -597.42 684.76 -757.55 684.76C-917.68 684.76 -1047.69 554.76 -1047.69 394.63C-1047.69 234.5 -917.68 104.49 -757.55 104.49C-597.42 104.49 -467.41 234.5 -467.41 394.63Z" id="a1uaEBd4xM"></path><path d="M-96.99 -586.14C-57.24 -619.85 -5.79 -604.75 19.26 -580.46C31.43 -568.66 56.57 -546.36 40.97 -491.67C32.76 -462.87 10.41 -436.4 -26.05 -412.27C-15.07 -377.85 -5.6 -344.76 2.36 -313C14.29 -265.36 13.55 -189.67 -26.05 -155.4C-67.27 -119.73 -166.91 -104.09 -234.24 -103.09C-301.57 -102.1 -406.19 -113.09 -461.6 -155.4C-517.01 -197.7 -512.24 -257.07 -498.04 -313C-488.58 -350.28 -476.43 -383.38 -461.6 -412.27C-505.54 -441.3 -530.54 -467.76 -536.6 -491.67C-545.68 -527.54 -530.93 -565.61 -501.12 -586.14C-471.31 -606.67 -435.18 -606.9 -400.45 -586.14C-377.3 -572.3 -354.79 -542.13 -332.92 -495.62C-287.85 -505.25 -254.96 -509.57 -234.24 -508.6C-214.74 -507.68 -186.57 -503.36 -149.72 -495.62C-135.81 -537.95 -118.23 -568.12 -96.99 -586.14Z" id="f8p7QlEjN3"></path><linearGradient id="gradienta4Tg99ZOOp" gradientUnits="userSpaceOnUse" x1="-440.25" y1="-388.59" x2="-100.49" y2="-147.33"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #7ae6a1;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M-86.03 -10.69C-61.35 -10.69 -41.34 9.32 -41.34 34.01C-41.34 119.07 -41.34 329.58 -41.34 414.65C-41.34 439.33 -61.35 459.34 -86.03 459.34C-136.01 459.34 -241.25 459.34 -291.23 459.34C-315.92 459.34 -335.93 439.33 -335.93 414.65C-335.93 329.58 -335.93 119.07 -335.93 34.01C-335.93 9.32 -315.92 -10.69 -291.23 -10.69C-241.25 -10.69 -136.01 -10.69 -86.03 -10.69Z" id="d32ZZRxd1S"></path><linearGradient id="gradientb1JxIe4xUm" gradientUnits="userSpaceOnUse" x1="-791.65" y1="-33.27" x2="892.1" y2="418.94"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #5ae98f;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M-257.95 458.12C-247.92 449.62 -234.93 453.43 -228.61 459.56C-225.54 462.54 -219.19 468.17 -223.13 481.97C-225.2 489.24 -230.84 495.92 -240.05 502.01C-237.27 510.7 -234.88 519.06 -232.88 527.07C-229.86 539.1 -230.05 558.21 -240.05 566.86C-250.45 575.86 -275.6 579.81 -292.6 580.06C-309.6 580.31 -336.01 577.54 -349.99 566.86C-363.98 556.18 -362.77 541.19 -359.19 527.07C-356.8 517.66 -353.73 509.31 -349.99 502.01C-361.08 494.69 -367.39 488.01 -368.92 481.97C-371.22 472.92 -367.49 463.31 -359.97 458.12C-352.44 452.94 -343.32 452.88 -334.56 458.12C-328.71 461.62 -323.03 469.23 -317.51 480.97C-306.13 478.54 -297.83 477.45 -292.6 477.7C-287.68 477.93 -280.56 479.02 -271.26 480.97C-267.75 470.29 -263.32 462.67 -257.95 458.12Z" id="b19LRRbPrG"></path><path d="M490.4 235.64C544.09 358.38 544.09 435.34 490.4 466.5C409.85 513.24 199.96 527.49 139.54 455.64C99.26 407.74 99.26 334.4 139.54 235.64C180.5 168.18 238.71 134.45 314.17 134.45C389.64 134.45 448.38 168.18 490.4 235.64Z" id="bN5StdyPU"></path><linearGradient id="gradientb1HT15TsY0" gradientUnits="userSpaceOnUse" x1="259.78" y1="261.15" x2="463.85" y2="456.49"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #86e6a9;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M393.81 -775.89C428.26 -748.09 439.99 -725.54 429 -708.22C412.51 -682.24 353.16 -646.07 324.5 -657.93C305.39 -665.83 294.22 -687.32 290.97 -722.41C292.69 -748.43 304.61 -767.19 326.73 -778.69C348.85 -790.19 371.21 -789.26 393.81 -775.89Z" id="arh6miPP2"></path><linearGradient id="gradientc2g6rBSAiq" gradientUnits="userSpaceOnUse" x1="330.1" y1="-733.26" x2="419.69" y2="-707.1"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #86e6a9;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M675.36 -369.24C669.97 -325.31 657.02 -303.43 636.51 -303.61C605.74 -303.87 543.67 -335.15 538.59 -365.74C535.2 -386.14 547.54 -406.99 575.61 -428.29C598.61 -440.58 620.83 -440.37 642.29 -427.67C663.74 -414.97 674.77 -395.49 675.36 -369.24Z" id="a2VENFzCvL"></path><linearGradient id="gradientc18GuJy4sZ" gradientUnits="userSpaceOnUse" x1="605.5" y1="-400.8" x2="630.64" y2="-310.92"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #86e6a9;stop-opacity: 1" offset="100%"></stop></linearGradient></defs><g><g><g><use xlink:href="#a1LdTs1gvU" opacity="1" fill="url(#gradientcoH7TNh19)"></use></g><g><use xlink:href="#a1uaEBd4xM" opacity="1" fill="#ebf0ed" fill-opacity="1"></use></g><g><use xlink:href="#f8p7QlEjN3" opacity="1" fill="url(#gradienta4Tg99ZOOp)"></use><g><use xlink:href="#f8p7QlEjN3" opacity="1" fill-opacity="0" stroke="#ffffff" stroke-width="98" stroke-opacity="0.57"></use></g></g><g><use xlink:href="#d32ZZRxd1S" opacity="1" fill="url(#gradientb1JxIe4xUm)"></use><g><use xlink:href="#d32ZZRxd1S" opacity="1" fill-opacity="0" stroke="#f2f2f2" stroke-width="60" stroke-opacity="0.51"></use></g></g><g><use xlink:href="#b19LRRbPrG" opacity="1" fill="#d8ad9a" fill-opacity="1"></use><g><use xlink:href="#b19LRRbPrG" opacity="1" fill-opacity="0" stroke="#ffffff" stroke-width="17" stroke-opacity="1"></use></g></g><g><use xlink:href="#bN5StdyPU" opacity="1" fill="url(#gradientb1HT15TsY0)"></use><g><use xlink:href="#bN5StdyPU" opacity="1" fill-opacity="0" stroke="#f2f2f2" stroke-width="200" stroke-opacity="0.51"></use></g></g><g><use xlink:href="#arh6miPP2" opacity="1" fill="url(#gradientc2g6rBSAiq)"></use></g><g><use xlink:href="#a2VENFzCvL" opacity="1" fill="url(#gradientc18GuJy4sZ)"></use></g></g></g></svg>
\ No newline at end of file
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid meet" viewBox="0 0 640 640" width="640" height="640"><defs><path d="M407.55 916.24C471.25 916.24 522.89 967.88 522.89 1031.57C522.89 1113.88 522.89 1245.44 522.89 1327.74C522.89 1391.44 471.25 1443.08 407.55 1443.08C325.25 1443.08 193.68 1443.08 111.38 1443.08C47.69 1443.08 -3.95 1391.44 -3.95 1327.74C-3.95 1245.44 -3.95 1113.88 -3.95 1031.57C-3.95 967.88 47.69 916.24 111.38 916.24C193.68 916.24 325.25 916.24 407.55 916.24Z" id="a1LdTs1gvU"></path><linearGradient id="gradientcoH7TNh19" gradientUnits="userSpaceOnUse" x1="256.07" y1="1132.14" x2="609.11" y2="1480.42"><stop style="stop-color: #c2efd2;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #8ff0e5;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M-467.41 394.63C-467.41 554.76 -597.42 684.76 -757.55 684.76C-917.68 684.76 -1047.69 554.76 -1047.69 394.63C-1047.69 234.5 -917.68 104.49 -757.55 104.49C-597.42 104.49 -467.41 234.5 -467.41 394.63Z" id="a1uaEBd4xM"></path><path d="M-96.99 -586.14C-57.24 -619.85 -5.79 -604.75 19.26 -580.46C31.43 -568.66 56.57 -546.36 40.97 -491.67C32.76 -462.87 10.41 -436.4 -26.05 -412.27C-15.07 -377.85 -5.6 -344.76 2.36 -313C14.29 -265.36 13.55 -189.67 -26.05 -155.4C-67.27 -119.73 -166.91 -104.09 -234.24 -103.09C-301.57 -102.1 -406.19 -113.09 -461.6 -155.4C-517.01 -197.7 -512.24 -257.07 -498.04 -313C-488.58 -350.28 -476.43 -383.38 -461.6 -412.27C-505.54 -441.3 -530.54 -467.76 -536.6 -491.67C-545.68 -527.54 -530.93 -565.61 -501.12 -586.14C-471.31 -606.67 -435.18 -606.9 -400.45 -586.14C-377.3 -572.3 -354.79 -542.13 -332.92 -495.62C-287.85 -505.25 -254.96 -509.57 -234.24 -508.6C-214.74 -507.68 -186.57 -503.36 -149.72 -495.62C-135.81 -537.95 -118.23 -568.12 -96.99 -586.14Z" id="f8p7QlEjN3"></path><linearGradient id="gradienta4Tg99ZOOp" gradientUnits="userSpaceOnUse" x1="-440.25" y1="-388.59" x2="-100.49" y2="-147.33"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #7ae6a1;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M-86.03 -10.69C-61.35 -10.69 -41.34 9.32 -41.34 34.01C-41.34 119.07 -41.34 329.58 -41.34 414.65C-41.34 439.33 -61.35 459.34 -86.03 459.34C-136.01 459.34 -241.25 459.34 -291.23 459.34C-315.92 459.34 -335.93 439.33 -335.93 414.65C-335.93 329.58 -335.93 119.07 -335.93 34.01C-335.93 9.32 -315.92 -10.69 -291.23 -10.69C-241.25 -10.69 -136.01 -10.69 -86.03 -10.69Z" id="d32ZZRxd1S"></path><linearGradient id="gradientb1JxIe4xUm" gradientUnits="userSpaceOnUse" x1="-791.65" y1="-33.27" x2="892.1" y2="418.94"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #5ae98f;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M-257.95 458.12C-247.92 449.62 -234.93 453.43 -228.61 459.56C-225.54 462.54 -219.19 468.17 -223.13 481.97C-225.2 489.24 -230.84 495.92 -240.05 502.01C-237.27 510.7 -234.88 519.06 -232.88 527.07C-229.86 539.1 -230.05 558.21 -240.05 566.86C-250.45 575.86 -275.6 579.81 -292.6 580.06C-309.6 580.31 -336.01 577.54 -349.99 566.86C-363.98 556.18 -362.77 541.19 -359.19 527.07C-356.8 517.66 -353.73 509.31 -349.99 502.01C-361.08 494.69 -367.39 488.01 -368.92 481.97C-371.22 472.92 -367.49 463.31 -359.97 458.12C-352.44 452.94 -343.32 452.88 -334.56 458.12C-328.71 461.62 -323.03 469.23 -317.51 480.97C-306.13 478.54 -297.83 477.45 -292.6 477.7C-287.68 477.93 -280.56 479.02 -271.26 480.97C-267.75 470.29 -263.32 462.67 -257.95 458.12Z" id="b19LRRbPrG"></path><path d="M490.4 235.64C544.09 358.38 544.09 435.34 490.4 466.5C409.85 513.24 199.96 527.49 139.54 455.64C99.26 407.74 99.26 334.4 139.54 235.64C180.5 168.18 238.71 134.45 314.17 134.45C389.64 134.45 448.38 168.18 490.4 235.64Z" id="bN5StdyPU"></path><linearGradient id="gradientb1HT15TsY0" gradientUnits="userSpaceOnUse" x1="259.78" y1="261.15" x2="463.85" y2="456.49"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #86e6a9;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M393.81 -775.89C428.26 -748.09 439.99 -725.54 429 -708.22C412.51 -682.24 353.16 -646.07 324.5 -657.93C305.39 -665.83 294.22 -687.32 290.97 -722.41C292.69 -748.43 304.61 -767.19 326.73 -778.69C348.85 -790.19 371.21 -789.26 393.81 -775.89Z" id="arh6miPP2"></path><linearGradient id="gradientc2g6rBSAiq" gradientUnits="userSpaceOnUse" x1="330.1" y1="-733.26" x2="419.69" y2="-707.1"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #86e6a9;stop-opacity: 1" offset="100%"></stop></linearGradient><path d="M675.36 -369.24C669.97 -325.31 657.02 -303.43 636.51 -303.61C605.74 -303.87 543.67 -335.15 538.59 -365.74C535.2 -386.14 547.54 -406.99 575.61 -428.29C598.61 -440.58 620.83 -440.37 642.29 -427.67C663.74 -414.97 674.77 -395.49 675.36 -369.24Z" id="a2VENFzCvL"></path><linearGradient id="gradientc18GuJy4sZ" gradientUnits="userSpaceOnUse" x1="605.5" y1="-400.8" x2="630.64" y2="-310.92"><stop style="stop-color: #5cdd8b;stop-opacity: 1" offset="0%"></stop><stop style="stop-color: #86e6a9;stop-opacity: 1" offset="100%"></stop></linearGradient></defs><g><g><g><use xlink:href="#a1LdTs1gvU" opacity="1" fill="url(#gradientcoH7TNh19)"></use></g><g><use xlink:href="#a1uaEBd4xM" opacity="1" fill="#ebf0ed" fill-opacity="1"></use></g><g><use xlink:href="#f8p7QlEjN3" opacity="1" fill="url(#gradienta4Tg99ZOOp)"></use><g><use xlink:href="#f8p7QlEjN3" opacity="1" fill-opacity="0" stroke="#ffffff" stroke-width="98" stroke-opacity="0.57"></use></g></g><g><use xlink:href="#d32ZZRxd1S" opacity="1" fill="url(#gradientb1JxIe4xUm)"></use><g><use xlink:href="#d32ZZRxd1S" opacity="1" fill-opacity="0" stroke="#f2f2f2" stroke-width="60" stroke-opacity="0.51"></use></g></g><g><use xlink:href="#b19LRRbPrG" opacity="1" fill="#d8ad9a" fill-opacity="1"></use><g><use xlink:href="#b19LRRbPrG" opacity="1" fill-opacity="0" stroke="#ffffff" stroke-width="17" stroke-opacity="1"></use></g></g><g><use xlink:href="#bN5StdyPU" opacity="1" fill="url(#gradientb1HT15TsY0)"></use><g><use xlink:href="#bN5StdyPU" opacity="1" fill-opacity="0" stroke="#f2f2f2" stroke-width="200" stroke-opacity="0.51"></use></g></g><g><use xlink:href="#arh6miPP2" opacity="1" fill="url(#gradientc2g6rBSAiq)"></use></g><g><use xlink:href="#a2VENFzCvL" opacity="1" fill="url(#gradientc18GuJy4sZ)"></use></g></g></g></svg>
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 115f86da..23876ac7 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -212,8 +212,7 @@ class Monitor extends BeanModel {
                 if (await Monitor.isUnderMaintenance(this.id)) {
                     bean.msg = "Monitor under maintenance";
                     bean.status = MAINTENANCE;
-                }
-                else if (this.type === "http" || this.type === "keyword") {
+                } else if (this.type === "http" || this.type === "keyword") {
                     // Do not do any queries/high loading things before the "bean.ping"
                     let startTime = dayjs().valueOf();
 
@@ -482,8 +481,7 @@ class Monitor extends BeanModel {
                 if (Monitor.isImportantForNotification(isFirstBeat, previousBeat?.status, bean.status)) {
                     log.debug("monitor", `[${this.name}] sendNotification`);
                     await Monitor.sendNotification(isFirstBeat, this, bean);
-                }
-                else {
+                } else {
                     log.debug("monitor", `[${this.name}] will not sendNotification because it is (or was) under maintenance`);
                 }
 
@@ -950,7 +948,7 @@ class Monitor extends BeanModel {
     }
 
     static async isUnderMaintenance(monitorID) {
-        const maintenance = await R.getRow("SELECT COUNT(*) AS count FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now') LIMIT 1", [monitorID]);
+        const maintenance = await R.getRow("SELECT COUNT(*) AS count FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now') LIMIT 1", [ monitorID ]);
         return maintenance.count !== 0;
     }
 }
diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index 4e761e77..8662dfee 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -3,8 +3,8 @@
         <div class="list-header">
             <div class="search-wrapper float-start">
                 <select v-model="selectedList" class="form-control">
-                    <option value="monitor" selected>{{$t('Monitor List')}}</option>
-                    <option value="maintenance">{{$t('Maintenance List')}}</option>
+                    <option value="monitor" selected>{{ $t('Monitor List') }}</option>
+                    <option value="maintenance">{{ $t('Maintenance List') }}</option>
                 </select>
             </div>
             <div class="search-wrapper">
@@ -27,39 +27,55 @@
                 {{ $t("No Maintenance, please") }} <router-link to="/addMaintenance">{{ $t("add one") }}</router-link>
             </div>
 
-            <router-link v-if="selectedList === 'maintenance'" v-for="(item, index) in sortedMaintenanceList" :key="index" :to="maintenanceURL(item.id)" class="item" :class="{ 'disabled': !this.$root.isActiveMaintenance(item.end_date) }">
-                <div class="row">
-                    <div class="col-9 col-md-8 small-padding">
-                        <div class="info">
-                            <Uptime :monitor="null" type="maintenance" :pill="true" />
-                            {{ item.title }}
+            <template v-if="selectedList === 'maintenance'">
+                <router-link
+                    v-for="(item, index) in sortedMaintenanceList" :key="index" :to="maintenanceURL(item.id)"
+                    class="item" :class="{ 'disabled': !$root.isActiveMaintenance(item.end_date) }"
+                >
+                    <div class="row">
+                        <div class="col-9 col-md-8 small-padding">
+                            <div class="info">
+                                <Uptime :monitor="null" type="maintenance" :pill="true" />
+                                {{ item.title }}
+                            </div>
                         </div>
                     </div>
-                </div>
-            </router-link>
+                </router-link>
+            </template>
 
-            <router-link v-if="selectedList === 'monitor'" v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)" class="item" :class="{ 'disabled': ! item.active }">
-                <div class="row">
-                    <div class="col-9 col-md-8 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
-                        <div class="info">
-                            <Uptime :monitor="item" type="24" :pill="true" />
-                            {{ item.name }}
+            <template v-if="selectedList === 'monitor'">
+                <router-link
+                    v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)"
+                    class="item" :class="{ 'disabled': ! item.active }"
+                >
+                    <div class="row">
+                        <div
+                            class="col-9 col-md-8 small-padding"
+                            :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }"
+                        >
+                            <div class="info">
+                                <Uptime :monitor="item" type="24" :pill="true" />
+                                {{ item.name }}
+                            </div>
+                            <div class="tags">
+                                <Tag v-for="tag in item.tags" :key="tag" :item="tag" :size="'sm'" />
+                            </div>
                         </div>
-                        <div class="tags">
-                            <Tag v-for="tag in item.tags" :key="tag" :item="tag" :size="'sm'" />
+                        <div
+                            v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar"
+                            class="col-3 col-md-4"
+                        >
+                            <HeartbeatBar size="small" :monitor-id="item.id" />
                         </div>
                     </div>
-                    <div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-3 col-md-4">
-                        <HeartbeatBar size="small" :monitor-id="item.id" />
-                    </div>
-                </div>
 
-                <div v-if="$root.userHeartbeatBar == 'bottom'" class="row">
-                    <div class="col-12 bottom-style">
-                        <HeartbeatBar size="small" :monitor-id="item.id" />
+                    <div v-if="$root.userHeartbeatBar == 'bottom'" class="row">
+                        <div class="col-12 bottom-style">
+                            <HeartbeatBar size="small" :monitor-id="item.id" />
+                        </div>
                     </div>
-                </div>
-            </router-link>
+                </router-link>
+            </template>
         </div>
     </div>
 </template>
@@ -282,7 +298,6 @@ export default {
     margin-top: 5px;
 }
 
-
 .bg-maintenance {
     background-color: $maintenance;
 }
diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index 226dfae3..d663db88 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -15,7 +15,7 @@ export default {
 
     computed: {
         uptime() {
-            
+
             if (this.type === "maintenance") {
                 return this.$t("Maintenance");
             }
@@ -31,9 +31,9 @@ export default {
 
         color() {
             if (this.type === "maintenance" || this.monitor.maintenance) {
-                return "maintenance"
+                return "maintenance";
             }
-            
+
             if (this.lastHeartBeat.status === 0) {
                 return "danger";
             }
diff --git a/src/mixins/datetime.js b/src/mixins/datetime.js
index 3f4749af..c6461562 100644
--- a/src/mixins/datetime.js
+++ b/src/mixins/datetime.js
@@ -34,10 +34,11 @@ export default {
             const inputDate = new Date(value);
             const now = new Date(Date.now());
 
-            if (inputDate.getFullYear() === now.getUTCFullYear() && inputDate.getMonth() === now.getUTCMonth() && inputDate.getDay() === now.getUTCDay())
+            if (inputDate.getFullYear() === now.getUTCFullYear() && inputDate.getMonth() === now.getUTCMonth() && inputDate.getDay() === now.getUTCDay()) {
                 return this.datetimeFormat(value, "HH:mm");
-            else
+            } else {
                 return this.datetimeFormat(value, "YYYY-MM-DD HH:mm");
+            }
         },
 
         date(value) {
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 8d419706..6d4311b1 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -464,8 +464,7 @@ export default {
                         text: this.$t("Maintenance"),
                         color: "maintenance",
                     };
-                }
-                else if (! lastHeartBeat) {
+                } else if (! lastHeartBeat) {
                     result[monitorID] = unknown;
                 } else if (lastHeartBeat.status === 1) {
                     result[monitorID] = {
@@ -505,8 +504,7 @@ export default {
 
                 if (monitor && monitor.maintenance) {
                     result.maintenance++;
-                }
-                else if (monitor && ! monitor.active) {
+                } else if (monitor && ! monitor.active) {
                     result.pause++;
                 } else if (beat) {
                     if (beat.status === 1) {
diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue
index e99422a4..207e5b3a 100644
--- a/src/pages/Dashboard.vue
+++ b/src/pages/Dashboard.vue
@@ -8,12 +8,12 @@
                     </button>
                     <ul class="dropdown-menu dropdown-menu-end">
                         <li>
-                            <button type="button" class="dropdown-item" @click="this.$router.push('/add')">
+                            <button type="button" class="dropdown-item" @click="$router.push('/add')">
                                 <font-awesome-icon icon="heartbeat" /> {{ $t("Monitor") }}
                             </button>
                         </li>
                         <li>
-                            <button type="button" class="dropdown-item" @click="this.$router.push('/addMaintenance')">
+                            <button type="button" class="dropdown-item" @click="$router.push('/addMaintenance')">
                                 <font-awesome-icon icon="exclamation-circle" /> {{ $t("Maintenance") }}
                             </button>
                         </li>
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index e50affaa..84675c0c 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -11,15 +11,19 @@
                             <!-- Title -->
                             <div class="my-3">
                                 <label for="name" class="form-label">{{ $t("Title") }}</label>
-                                <input id="name" v-model="maintenance.title" type="text" class="form-control"
-                                       :placeholder="titlePlaceholder" required>
+                                <input
+                                    id="name" v-model="maintenance.title" type="text" class="form-control"
+                                    :placeholder="titlePlaceholder" required
+                                >
                             </div>
 
                             <!-- Description -->
                             <div class="my-3">
                                 <label for="description" class="form-label">{{ $t("Description") }}</label>
-                                <textarea id="description" v-model="maintenance.description" class="form-control"
-                                          :placeholder="descriptionPlaceholder"></textarea>
+                                <textarea
+                                    id="description" v-model="maintenance.description" class="form-control"
+                                    :placeholder="descriptionPlaceholder"
+                                ></textarea>
                             </div>
 
                             <!-- Affected Monitors -->
@@ -50,21 +54,28 @@
 
                             <!-- Start Date Time -->
                             <div class="my-3">
-                                <label for="start_date" class="form-label">{{ $t("Start of maintenance") }} ({{this.$root.timezone}})</label>
-                                <input :type="'datetime-local'" id="start_date" v-model="maintenance.start_date"
-                                       class="form-control" :class="{'darkCalendar': dark }" required>
+                                <label for="start_date" class="form-label">{{ $t("Start of maintenance") }} ({{ $root.timezone }})</label>
+                                <input
+                                    id="start_date" v-model="maintenance.start_date" :type="'datetime-local'"
+                                    class="form-control" :class="{'darkCalendar': dark }" required
+                                >
                             </div>
 
                             <!-- End Date Time -->
                             <div class="my-3">
-                                <label for="end_date" class="form-label">{{ $t("Expected end of maintenance") }} ({{this.$root.timezone}})</label>
-                                <input :type="'datetime-local'" id="end_date" v-model="maintenance.end_date"
-                                       class="form-control" :class="{'darkCalendar': dark }" required>
+                                <label for="end_date" class="form-label">{{ $t("Expected end of maintenance") }} ({{ $root.timezone }})</label>
+                                <input
+                                    id="end_date" v-model="maintenance.end_date" :type="'datetime-local'"
+                                    class="form-control" :class="{'darkCalendar': dark }" required
+                                >
                             </div>
 
                             <div class="mt-5 mb-1">
-                                <button id="monitor-submit-btn" class="btn btn-primary" type="submit"
-                                        :disabled="processing">{{ $t("Save") }}
+                                <button
+                                    id="monitor-submit-btn" class="btn btn-primary" type="submit"
+                                    :disabled="processing"
+                                >
+                                    {{ $t("Save") }}
                                 </button>
                             </div>
                         </div>
@@ -78,7 +89,7 @@
 <script>
 import CopyableInput from "../components/CopyableInput.vue";
 
-import {useToast} from "vue-toastification";
+import { useToast } from "vue-toastification";
 import VueMultiselect from "vue-multiselect";
 
 const toast = useToast();
@@ -145,7 +156,7 @@ export default {
     methods: {
         init() {
             this.affectedMonitors = [];
-            
+
             if (this.isAdd) {
                 this.maintenance = {
                     title: "",
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
index 77d70078..c3b9abee 100644
--- a/src/pages/MaintenanceDetails.vue
+++ b/src/pages/MaintenanceDetails.vue
@@ -3,9 +3,9 @@
         <div v-if="maintenance">
             <h1> {{ maintenance.title }}</h1>
             <p class="url">
-                <span>{{$t("Start")}}: {{ $root.datetimeMaintenance(maintenance.start_date) }}</span>
+                <span>{{ $t("Start") }}: {{ $root.datetimeMaintenance(maintenance.start_date) }}</span>
                 <br>
-                <span>{{$t("End")}}: {{ $root.datetimeMaintenance(maintenance.end_date) }}</span>
+                <span>{{ $t("End") }}: {{ $root.datetimeMaintenance(maintenance.end_date) }}</span>
             </p>
 
             <div class="functions" style="margin-top: 10px">
@@ -22,7 +22,7 @@
 
             <label for="affected_monitors" class="form-label" style="margin-top: 20px">{{ $t("Affected Monitors") }}</label>
             <br>
-            <button v-for="monitor in this.affectedMonitors" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold">
+            <button v-for="monitor in affectedMonitors" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold">
                 {{ monitor }}
             </button>
 
@@ -66,7 +66,7 @@ export default {
                 }
             });
         },
-        
+
         deleteDialog() {
             this.$refs.confirmDelete.show();
         },
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 7ae7c636..46a2c79f 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -104,15 +104,16 @@
 
                 <!-- Uploader -->
                 <!--    url="/api/status-page/upload-logo" -->
-                <ImageCropUpload v-model="showImageCropUpload"
-                                 field="img"
-                                 :width="128"
-                                 :height="128"
-                                 :langType="$i18n.locale"
-                                 img-format="png"
-                                 :noCircle="true"
-                                 :noSquare="false"
-                                 @crop-success="cropSuccess"
+                <ImageCropUpload
+                    v-model="showImageCropUpload"
+                    field="img"
+                    :width="128"
+                    :height="128"
+                    :langType="$i18n.locale"
+                    img-format="png"
+                    :noCircle="true"
+                    :noSquare="false"
+                    @crop-success="cropSuccess"
                 />
 
                 <!-- Title -->
@@ -196,16 +197,18 @@
 
             <!-- Maintenance -->
             <template v-if="maintenance.length !== 0">
-                <div v-for="maintenanceItem in maintenance" class="shadow-box alert mb-4 p-4 maintenance" role="alert"
-                     :class="maintenanceClass">
-                    <h4 v-text="maintenanceItem.title" class="alert-heading"/>
+                <div
+                    v-for="maintenanceItem in maintenance" class="shadow-box alert mb-4 p-4 maintenance" role="alert"
+                    :class="maintenanceClass"
+                >
+                    <h4 class="alert-heading" v-text="maintenanceItem.title" />
 
-                    <div v-text="maintenanceItem.description" class="content"/>
+                    <div class="content" v-text="maintenanceItem.description" />
 
                     <!-- Incident Date -->
                     <div class="date mt-3">
                         {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }}
-                        ({{ dateFromNow(maintenanceItem.start_date) }})<br/>
+                        ({{ dateFromNow(maintenanceItem.start_date) }})<br />
                     </div>
                 </div>
             </template>
@@ -448,8 +451,7 @@ export default {
 
                 if (beat.status === MAINTENANCE) {
                     return STATUS_PAGE_MAINTENANCE;
-                }
-                else if (beat.status === UP) {
+                } else if (beat.status === UP) {
                     hasUp = true;
                 } else {
                     status = STATUS_PAGE_PARTIAL_DOWN;

From 11ef22edec3502ec5a9b90c609b7f2f4f1588505 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sat, 30 Apr 2022 15:13:13 +0200
Subject: [PATCH 026/803] Fixed remaining lint errors

---
 src/languages/en.js              | 1 -
 src/pages/EditMaintenance.vue    | 2 --
 src/pages/MaintenanceDetails.vue | 6 +++---
 src/pages/StatusPage.vue         | 2 +-
 4 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/src/languages/en.js b/src/languages/en.js
index df4e583e..8bb1a73c 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -15,7 +15,6 @@ export default {
     "Pick Affected Monitors...": "Pick Affected Monitors...",
     "Start of maintenance": "Start of maintenance",
     "Expected end of maintenance": "Expected end of maintenance",
-    Start: "Start",
     End: "End",
     affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
     atLeastOneMonitor: "Select at least one affected monitor",
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 84675c0c..e8cfeb4f 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -87,7 +87,6 @@
 </template>
 
 <script>
-import CopyableInput from "../components/CopyableInput.vue";
 
 import { useToast } from "vue-toastification";
 import VueMultiselect from "vue-multiselect";
@@ -96,7 +95,6 @@ const toast = useToast();
 
 export default {
     components: {
-        CopyableInput,
         VueMultiselect,
     },
 
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
index c3b9abee..4f9779f6 100644
--- a/src/pages/MaintenanceDetails.vue
+++ b/src/pages/MaintenanceDetails.vue
@@ -1,7 +1,7 @@
 <template>
     <transition name="slide-fade" appear>
         <div v-if="maintenance">
-            <h1> {{ maintenance.title }}</h1>
+            <h1>{{ maintenance.title }}</h1>
             <p class="url">
                 <span>{{ $t("Start") }}: {{ $root.datetimeMaintenance(maintenance.start_date) }}</span>
                 <br>
@@ -18,11 +18,11 @@
             </div>
 
             <label for="description" class="form-label" style="margin-top: 20px">{{ $t("Description") }}</label>
-            <textarea id="description" class="form-control" disabled>{{ maintenance.description }}</textarea>
+            <textarea id="description" v-model="maintenance.description" class="form-control" disabled></textarea>
 
             <label for="affected_monitors" class="form-label" style="margin-top: 20px">{{ $t("Affected Monitors") }}</label>
             <br>
-            <button v-for="monitor in affectedMonitors" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold">
+            <button v-for="monitor in affectedMonitors" :key="monitor.id" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold">
                 {{ monitor }}
             </button>
 
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 46a2c79f..8914d5ca 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -198,7 +198,7 @@
             <!-- Maintenance -->
             <template v-if="maintenance.length !== 0">
                 <div
-                    v-for="maintenanceItem in maintenance" class="shadow-box alert mb-4 p-4 maintenance" role="alert"
+                    v-for="maintenanceItem in maintenance" :key="maintenanceItem.id" class="shadow-box alert mb-4 p-4 maintenance" role="alert"
                     :class="maintenanceClass"
                 >
                     <h4 class="alert-heading" v-text="maintenanceItem.title" />

From 57368c8c6caca877c1a076969327dd50bbaa4533 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sat, 30 Apr 2022 15:32:56 +0200
Subject: [PATCH 027/803] More modern look of maintenance information on status
 page (same design as for the new incident system)

---
 src/pages/StatusPage.vue | 48 +++++++++++++++++++++++++---------------
 1 file changed, 30 insertions(+), 18 deletions(-)

diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 8914d5ca..015a57be 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -196,19 +196,29 @@
             </div>
 
             <!-- Maintenance -->
-            <template v-if="maintenance.length !== 0">
+            <template v-if="maintenance.length">
                 <div
-                    v-for="maintenanceItem in maintenance" :key="maintenanceItem.id" class="shadow-box alert mb-4 p-4 maintenance" role="alert"
-                    :class="maintenanceClass"
+                    v-for="maintenanceItem in maintenance" :key="maintenanceItem.id"
+                    class="shadow-box alert mb-4 p-4 maintenance mt-4 position-relative" role="alert"
                 >
-                    <h4 class="alert-heading" v-text="maintenanceItem.title" />
+                    <div class="item">
+                        <div class="row">
+                            <div class="col-1 col-md-1 d-flex justify-content-center align-items-center">
+                                <font-awesome-icon
+                                    icon="wrench"
+                                    class="maintenance-icon maintenance-bg-info"
+                                />
+                            </div>
+                            <div class="col-11 col-md-11">
+                                <h4 class="alert-heading">{{ maintenanceItem.title }}</h4>
+                                <div class="content">{{ maintenanceItem.description }}</div>
 
-                    <div class="content" v-text="maintenanceItem.description" />
-
-                    <!-- Incident Date -->
-                    <div class="date mt-3">
-                        {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }}
-                        ({{ dateFromNow(maintenanceItem.start_date) }})<br />
+                                <div class="date mt-3">
+                                    {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }}
+                                    ({{ dateFromNow(maintenanceItem.start_date) }})<br />
+                                </div>
+                            </div>
+                        </div>
                     </div>
                 </div>
             </template>
@@ -933,20 +943,22 @@ footer {
     }
 }
 
-.maintenance {
-    color: white;
-
-    .date {
-        font-size: 12px;
-    }
+.maintenance-bg-info {
+    color: $maintenance;
 }
 
-.bg-maintenance {
-    background-color: $maintenance;
+.maintenance-icon {
+    font-size: 30px;
+    vertical-align: middle;
+}
+
+.dark .shadow-box {
+    background-color: #0d1117;
 }
 
 .statusMaintenance {
     color: $maintenance;
+    margin-right: 5px;
 }
 
 .mobile {

From b4ffcc5555bad78ea9b6828e08934517c3761825 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sat, 30 Apr 2022 15:50:05 +0200
Subject: [PATCH 028/803] Added JSDoc

---
 server/model/maintenance.js  | 6 ++++--
 server/model/monitor.js      | 5 +++++
 server/routers/api-router.js | 2 +-
 server/server.js             | 5 +++++
 4 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 55308895..1b0b9ee0 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -8,8 +8,9 @@ const { BeanModel } = require("redbean-node/dist/bean-model");
 class Maintenance extends BeanModel {
 
     /**
-     * Return a object that ready to parse to JSON for public
+     * Return an object that ready to parse to JSON for public
      * Only show necessary data to public
+     * @returns {Object}
      */
     async toPublicJSON() {
         return {
@@ -22,7 +23,8 @@ class Maintenance extends BeanModel {
     }
 
     /**
-     * Return a object that ready to parse to JSON
+     * Return an object that ready to parse to JSON
+     * @returns {Object}
      */
     async toJSON() {
         return {
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 23876ac7..6587d2cd 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -947,6 +947,11 @@ class Monitor extends BeanModel {
         ]);
     }
 
+    /**
+     * Check if monitor is under maintenance
+     * @param {number} monitorID ID of monitor to check
+     * @returns {Promise<boolean>}
+     */
     static async isUnderMaintenance(monitorID) {
         const maintenance = await R.getRow("SELECT COUNT(*) AS count FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now') LIMIT 1", [ monitorID ]);
         return maintenance.count !== 0;
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index af305809..a5a87b8c 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -156,7 +156,7 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
     }
 
 });
-// TODO: make slug aware
+
 // Status Page - Maintenance List
 async function getMaintenanceList() {
     try {
diff --git a/server/server.js b/server/server.js
index 38b0babf..b4060351 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1740,6 +1740,11 @@ async function afterLogin(socket, user) {
     }
 }
 
+/**
+ * Get a list of maintenances for the given user.
+ * @param {string} userID - The ID of the user to get maintenances for.
+ * @returns {Promise<Object>} A promise that resolves to an object with maintenance IDs as keys and maintenances objects as values.
+ */
 async function getMaintenanceJSONList(userID) {
     let result = {};
 

From 31b90d12a4ef07c0bdd45187baf31d8931e25c4b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sat, 30 Apr 2022 17:17:22 +0200
Subject: [PATCH 029/803] Added the ability to choose on which status pages
 maintenance information should be displayed

---
 db/patch-maintenance-table.sql   |   9 +++
 server/routers/api-router.js     |  19 ++---
 server/server.js                 |  58 ++++++++++++++++
 src/languages/en.js              |   5 ++
 src/mixins/socket.js             |   8 +++
 src/pages/EditMaintenance.vue    | 116 +++++++++++++++++++++++++++----
 src/pages/MaintenanceDetails.vue |  24 +++++--
 src/pages/StatusPage.vue         |   6 +-
 8 files changed, 216 insertions(+), 29 deletions(-)

diff --git a/db/patch-maintenance-table.sql b/db/patch-maintenance-table.sql
index ee4a7f88..ce14f766 100644
--- a/db/patch-maintenance-table.sql
+++ b/db/patch-maintenance-table.sql
@@ -20,6 +20,15 @@ CREATE TABLE monitor_maintenance
     CONSTRAINT FK_monitor FOREIGN KEY (monitor_id) REFERENCES monitor (id) ON DELETE CASCADE ON UPDATE CASCADE
 );
 
+CREATE TABLE maintenance_status_page
+(
+    id             INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+    status_page_id INTEGER NOT NULL,
+    maintenance_id INTEGER NOT NULL,
+    CONSTRAINT FK_maintenance FOREIGN KEY (maintenance_id) REFERENCES maintenance (id) ON DELETE CASCADE ON UPDATE CASCADE,
+    CONSTRAINT FK_status_page FOREIGN KEY (status_page_id) REFERENCES status_page (id) ON DELETE CASCADE ON UPDATE CASCADE
+);
+
 create index maintenance_user_id on maintenance (user_id);
 
 COMMIT;
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index a5a87b8c..da036ee2 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -128,7 +128,7 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
             incident = incident.toPublicJSON();
         }
 
-        let maintenance = await getMaintenanceList();
+        let maintenance = await getMaintenanceList(statusPage.id);
 
         // Public Group List
         const publicGroupList = [];
@@ -158,17 +158,20 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
 });
 
 // Status Page - Maintenance List
-async function getMaintenanceList() {
+async function getMaintenanceList(statusPageId) {
     try {
         const publicMaintenanceList = [];
 
         let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
-            SELECT maintenance.*
-            FROM maintenance
-            WHERE datetime(maintenance.start_date) <= datetime('now')
-              AND datetime(maintenance.end_date) >= datetime('now')
-            ORDER BY maintenance.end_date
-        `));
+            SELECT m.*
+            FROM maintenance m
+            JOIN maintenance_status_page msp
+            ON msp.maintenance_id = m.id
+            WHERE datetime(m.start_date) <= datetime('now')
+              AND datetime(m.end_date) >= datetime('now')
+              AND msp.status_page_id = ?
+            ORDER BY m.end_date
+        `, [ statusPageId ]));
 
         for (const bean of maintenanceBeanList) {
             publicMaintenanceList.push(await bean.toPublicJSON());
diff --git a/server/server.js b/server/server.js
index b4060351..d45b97a4 100644
--- a/server/server.js
+++ b/server/server.js
@@ -802,6 +802,40 @@ try {
             }
         });
 
+        // Add a new monitor_maintenance
+        socket.on("addMaintenanceStatusPage", async (maintenanceID, statusPages, callback) => {
+            try {
+                checkLogin(socket);
+
+                await R.exec("DELETE FROM maintenance_status_page WHERE maintenance_id = ?", [
+                    maintenanceID
+                ]);
+
+                for await (const statusPage of statusPages) {
+                    let bean = R.dispense("maintenance_status_page");
+
+                    bean.import({
+                        status_page_id: statusPage.id,
+                        maintenance_id: maintenanceID
+                    });
+                    await R.store(bean);
+                }
+
+                apicache.clear();
+
+                callback({
+                    ok: true,
+                    msg: "Added Successfully.",
+                });
+
+            } catch (e) {
+                callback({
+                    ok: false,
+                    msg: e.message,
+                });
+            }
+        });
+
         socket.on("getMonitorList", async (callback) => {
             try {
                 checkLogin(socket);
@@ -906,6 +940,30 @@ try {
             }
         });
 
+        socket.on("getMaintenanceStatusPage", async (maintenanceID, callback) => {
+            try {
+                checkLogin(socket);
+
+                console.log(`Get Status Pages for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+                let statusPages = await R.getAll("SELECT status_page.id, status_page.title FROM maintenance_status_page msp JOIN status_page ON msp.status_page_id = status_page.id WHERE msp.maintenance_id = ? ", [
+                    maintenanceID,
+                ]);
+
+                callback({
+                    ok: true,
+                    statusPages,
+                });
+
+            } catch (e) {
+                console.error(e);
+                callback({
+                    ok: false,
+                    msg: e.message,
+                });
+            }
+        });
+
         socket.on("getMonitorBeats", async (monitorID, period, callback) => {
             try {
                 checkLogin(socket);
diff --git a/src/languages/en.js b/src/languages/en.js
index 8bb1a73c..37f7cb43 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -15,9 +15,14 @@ export default {
     "Pick Affected Monitors...": "Pick Affected Monitors...",
     "Start of maintenance": "Start of maintenance",
     "Expected end of maintenance": "Expected end of maintenance",
+    "Show on all pages": "Show on all status pages",
+    "Selected status pages": "Selected status pages",
+    "Select status pages...": "Select status pages...",
     End: "End",
     affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
     atLeastOneMonitor: "Select at least one affected monitor",
+    selectedStatusPagesDescription: "Select status pages to display maintenance info on",
+    atLeastOneStatusPage: "Select at least one status page",
     maintenanceTitleExample: "Network infrastructure maintenance",
     maintenanceDescriptionExample: "Example: Network infrastructure maintenance is underway which will affect some of our services.",
     passwordNotMatchMsg: "The repeat password does not match.",
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 6d4311b1..4fa779bf 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -388,10 +388,18 @@ export default {
             socket.emit("addMonitorMaintenance", maintenanceID, monitors, callback);
         },
 
+        addMaintenanceStatusPage(maintenanceID, statusPages, callback) {
+            socket.emit("addMaintenanceStatusPage", maintenanceID, statusPages, callback);
+        },
+
         getMonitorMaintenance(maintenanceID, callback) {
             socket.emit("getMonitorMaintenance", maintenanceID, callback);
         },
 
+        getMaintenanceStatusPage(maintenanceID, callback) {
+            socket.emit("getMaintenanceStatusPage", maintenanceID, callback);
+        },
+
         deleteMonitor(monitorID, callback) {
             socket.emit("deleteMonitor", monitorID, callback);
         },
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index e8cfeb4f..26aa857f 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -54,22 +54,63 @@
 
                             <!-- Start Date Time -->
                             <div class="my-3">
-                                <label for="start_date" class="form-label">{{ $t("Start of maintenance") }} ({{ $root.timezone }})</label>
+                                <label for="start_date" class="form-label">{{ $t("Start of maintenance") }}
+                                    ({{ $root.timezone }})</label>
                                 <input
                                     id="start_date" v-model="maintenance.start_date" :type="'datetime-local'"
-                                    class="form-control" :class="{'darkCalendar': dark }" required
+                                    class="form-control" :class="{'dark-calendar': dark }" required
                                 >
                             </div>
 
                             <!-- End Date Time -->
                             <div class="my-3">
-                                <label for="end_date" class="form-label">{{ $t("Expected end of maintenance") }} ({{ $root.timezone }})</label>
+                                <label for="end_date" class="form-label">{{ $t("Expected end of maintenance") }}
+                                    ({{ $root.timezone }})</label>
                                 <input
                                     id="end_date" v-model="maintenance.end_date" :type="'datetime-local'"
-                                    class="form-control" :class="{'darkCalendar': dark }" required
+                                    class="form-control" :class="{'dark-calendar': dark }" required
                                 >
                             </div>
 
+                            <!-- Show on all pages -->
+                            <div class="my-3 form-check">
+                                <input
+                                    id="show-on-all-pages" v-model="showOnAllPages" class="form-check-input"
+                                    type="checkbox"
+                                >
+                                <label class="form-check-label" for="show-powered-by">{{
+                                    $t("Show on all pages")
+                                }}</label>
+                            </div>
+
+                            <!-- Status pages to display maintenance info on -->
+                            <div v-if="!showOnAllPages" class="my-3">
+                                <label for="selected_status_pages" class="form-label">{{
+                                    $t("Selected status pages")
+                                }}</label>
+
+                                <VueMultiselect
+                                    id="selected_status_pages"
+                                    v-model="selectedStatusPages"
+                                    :options="selectedStatusPagesOptions"
+                                    track-by="id"
+                                    label="name"
+                                    :multiple="true"
+                                    :allow-empty="false"
+                                    :close-on-select="false"
+                                    :clear-on-select="false"
+                                    :preserve-search="true"
+                                    :placeholder="$t('Select status pages...')"
+                                    :preselect-first="false"
+                                    :max-height="600"
+                                    :taggable="false"
+                                ></VueMultiselect>
+
+                                <div class="form-text">
+                                    {{ $t("selectedStatusPagesDescription") }}
+                                </div>
+                            </div>
+
                             <div class="mt-5 mb-1">
                                 <button
                                     id="monitor-submit-btn" class="btn btn-primary" type="submit"
@@ -104,6 +145,9 @@ export default {
             maintenance: {},
             affectedMonitors: [],
             affectedMonitorsOptions: [],
+            showOnAllPages: true,
+            selectedStatusPages: [],
+            selectedStatusPagesOptions: [],
             dark: (this.$root.theme === "dark"),
         };
     },
@@ -150,10 +194,18 @@ export default {
                 });
             }
         });
+
+        Object.values(this.$root.statusPageList).map(statusPage => {
+            this.selectedStatusPagesOptions.push({
+                id: statusPage.id,
+                name: statusPage.title
+            });
+        });
     },
     methods: {
         init() {
             this.affectedMonitors = [];
+            this.selectedStatusPages = [];
 
             if (this.isAdd) {
                 this.maintenance = {
@@ -178,6 +230,21 @@ export default {
                                 toast.error(res.msg);
                             }
                         });
+
+                        this.$root.getSocket().emit("getMaintenanceStatusPage", this.$route.params.id, (res) => {
+                            if (res.ok) {
+                                Object.values(res.statusPages).map(statusPage => {
+                                    this.selectedStatusPages.push({
+                                        id: statusPage.id,
+                                        name: statusPage.title
+                                    });
+                                });
+
+                                this.showOnAllPages = Object.values(res.statusPages).length === this.selectedStatusPagesOptions.length;
+                            } else {
+                                toast.error(res.msg);
+                            }
+                        });
                     } else {
                         toast.error(res.msg);
                     }
@@ -193,17 +260,24 @@ export default {
                 return this.processing = false;
             }
 
+            if (!this.showOnAllPages && this.selectedStatusPages.length === 0) {
+                toast.error(this.$t("atLeastOneStatusPage"));
+                return this.processing = false;
+            }
+
             this.maintenance.start_date = this.$root.toUTC(this.maintenance.start_date);
             this.maintenance.end_date = this.$root.toUTC(this.maintenance.end_date);
 
             if (this.isAdd) {
                 this.$root.addMaintenance(this.maintenance, async (res) => {
                     if (res.ok) {
-                        await this.addMonitorMaintenance(res.maintenanceID, () => {
-                            toast.success(res.msg);
-                            this.processing = false;
-                            this.$root.getMaintenanceList();
-                            this.$router.push("/dashboard/maintenance/" + res.maintenanceID);
+                        await this.addMonitorMaintenance(res.maintenanceID, async () => {
+                            await this.addMaintenanceStatusPage(res.maintenanceID, () => {
+                                toast.success(res.msg);
+                                this.processing = false;
+                                this.$root.getMaintenanceList();
+                                this.$router.push("/dashboard/maintenance/" + res.maintenanceID);
+                            });
                         });
                     } else {
                         toast.error(res.msg);
@@ -214,10 +288,12 @@ export default {
             } else {
                 this.$root.getSocket().emit("editMaintenance", this.maintenance, async (res) => {
                     if (res.ok) {
-                        await this.addMonitorMaintenance(res.maintenanceID, () => {
-                            this.processing = false;
-                            this.$root.toastRes(res);
-                            this.init();
+                        await this.addMonitorMaintenance(res.maintenanceID, async () => {
+                            await this.addMaintenanceStatusPage(res.maintenanceID, () => {
+                                this.processing = false;
+                                this.$root.toastRes(res);
+                                this.init();
+                            });
                         });
                     } else {
                         this.processing = false;
@@ -238,6 +314,18 @@ export default {
                 callback();
             });
         },
+
+        async addMaintenanceStatusPage(maintenanceID, callback) {
+            await this.$root.addMaintenanceStatusPage(maintenanceID, (this.showOnAllPages) ? this.selectedStatusPagesOptions : this.selectedStatusPages, async (res) => {
+                if (!res.ok) {
+                    toast.error(res.msg);
+                } else {
+                    this.$root.getMaintenanceList();
+                }
+
+                callback();
+            });
+        },
     },
 };
 </script>
@@ -251,7 +339,7 @@ textarea {
     min-height: 200px;
 }
 
-.darkCalendar::-webkit-calendar-picker-indicator {
+.dark-calendar::-webkit-calendar-picker-indicator {
     filter: invert(1);
 }
 </style>
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
index 4f9779f6..ae4b5a7b 100644
--- a/src/pages/MaintenanceDetails.vue
+++ b/src/pages/MaintenanceDetails.vue
@@ -8,7 +8,7 @@
                 <span>{{ $t("End") }}: {{ $root.datetimeMaintenance(maintenance.end_date) }}</span>
             </p>
 
-            <div class="functions" style="margin-top: 10px">
+            <div class="functions" style="margin-top: 10px;">
                 <router-link :to=" '/editMaintenance/' + maintenance.id " class="btn btn-secondary">
                     <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
                 </router-link>
@@ -17,14 +17,21 @@
                 </button>
             </div>
 
-            <label for="description" class="form-label" style="margin-top: 20px">{{ $t("Description") }}</label>
+            <label for="description" class="form-label" style="margin-top: 20px;">{{ $t("Description") }}</label>
             <textarea id="description" v-model="maintenance.description" class="form-control" disabled></textarea>
 
-            <label for="affected_monitors" class="form-label" style="margin-top: 20px">{{ $t("Affected Monitors") }}</label>
+            <label for="affected_monitors" class="form-label" style="margin-top: 20px;">{{ $t("Affected Monitors") }}</label>
             <br>
-            <button v-for="monitor in affectedMonitors" :key="monitor.id" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold">
+            <button v-for="monitor in affectedMonitors" :key="monitor.id" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold;">
                 {{ monitor }}
             </button>
+            <br />
+
+            <label for="selected_status_pages" class="form-label" style="margin-top: 20px;">{{ $t("Selected status pages") }}</label>
+            <br>
+            <button v-for="statusPage in selectedStatusPages" :key="statusPage.id" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold;">
+                {{ statusPage }}
+            </button>
 
             <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteMaintenance">
                 {{ $t("deleteMaintenanceMsg") }}
@@ -45,6 +52,7 @@ export default {
     data() {
         return {
             affectedMonitors: [],
+            selectedStatusPages: [],
         };
     },
     computed: {
@@ -65,6 +73,14 @@ export default {
                     toast.error(res.msg);
                 }
             });
+
+            this.$root.getSocket().emit("getMaintenanceStatusPage", this.$route.params.id, (res) => {
+                if (res.ok) {
+                    this.selectedStatusPages = Object.values(res.statusPages).map(statusPage => statusPage.title);
+                } else {
+                    toast.error(res.msg);
+                }
+            });
         },
 
         deleteDialog() {
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 015a57be..4d021dc4 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -247,7 +247,7 @@
                     </div>
 
                     <div v-else-if="isMaintenance">
-                        <font-awesome-icon icon="wrench" class="statusMaintenance" />
+                        <font-awesome-icon icon="wrench" class="status-maintenance" />
                         {{ $t("Maintenance") }}
                     </div>
 
@@ -595,7 +595,7 @@ export default {
             }
 
             this.incident = res.data.incident;
-            this.maintenance = res.data.maintenance;
+            this.maintenance = res.data.maintenance || [];
             this.$root.publicGroupList = res.data.publicGroupList;
         });
 
@@ -956,7 +956,7 @@ footer {
     background-color: #0d1117;
 }
 
-.statusMaintenance {
+.status-maintenance {
     color: $maintenance;
     margin-right: 5px;
 }

From 98ee9caf2cdc54a2f5edb864906d620e84196317 Mon Sep 17 00:00:00 2001
From: OidaTiftla <chm.stephan@outlook.com>
Date: Thu, 5 May 2022 15:55:33 +0200
Subject: [PATCH 030/803] Add variable for currentTime

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 server/model/monitor.js | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 15181af6..f29f6de5 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -492,11 +492,12 @@ class Monitor extends BeanModel {
                     let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60;
                     if (timeSinceLastNotified >= this.resendInterval) {
                         // Send notification again, because we are still DOWN
-                        log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${R.isoDateTime(dayjs.utc())}`);
+                        const currentTime = R.isoDateTime(dayjs.utc());
+                        log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${currentTime}`);
                         await Monitor.sendNotification(isFirstBeat, this, bean);
 
                         // Set last notified time to now
-                        bean.lastNotifiedTime = R.isoDateTime(dayjs.utc());
+                        bean.lastNotifiedTime = currentTime;
                     }
                 }
             }

From 93050208bbe9eb1c5678bf609c18e47953fb8485 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Thu, 5 May 2022 16:01:10 +0200
Subject: [PATCH 031/803] Merge database changes into single patch file

---
 db/patch-heartbeat-add-last-notified-time.sql | 7 -------
 db/patch-monitor-add-resend-interval.sql      | 3 +++
 server/database.js                            | 1 -
 3 files changed, 3 insertions(+), 8 deletions(-)
 delete mode 100644 db/patch-heartbeat-add-last-notified-time.sql

diff --git a/db/patch-heartbeat-add-last-notified-time.sql b/db/patch-heartbeat-add-last-notified-time.sql
deleted file mode 100644
index af9c21c0..00000000
--- a/db/patch-heartbeat-add-last-notified-time.sql
+++ /dev/null
@@ -1,7 +0,0 @@
--- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
-BEGIN TRANSACTION;
-
-ALTER TABLE heartbeat
-    ADD last_notified_time DATETIME default null;
-
-COMMIT;
diff --git a/db/patch-monitor-add-resend-interval.sql b/db/patch-monitor-add-resend-interval.sql
index e8bb08b8..c31dd7a2 100644
--- a/db/patch-monitor-add-resend-interval.sql
+++ b/db/patch-monitor-add-resend-interval.sql
@@ -4,4 +4,7 @@ BEGIN TRANSACTION;
 ALTER TABLE monitor
     ADD resend_interval INTEGER default 0 not null;
 
+ALTER TABLE heartbeat
+    ADD last_notified_time DATETIME default null;
+
 COMMIT;
diff --git a/server/database.js b/server/database.js
index 8e3b188b..5dbfd676 100644
--- a/server/database.js
+++ b/server/database.js
@@ -59,7 +59,6 @@ class Database {
         "patch-status-page-footer-css.sql": true,
         "patch-added-mqtt-monitor.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
-        "patch-heartbeat-add-last-notified-time.sql": true,
     };
 
     /**

From ed218e73bb17d5f3895bf56aa4d994498ebeedb6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sun, 8 May 2022 20:03:24 +0200
Subject: [PATCH 032/803] UI improvements

---
 src/components/MonitorList.vue   |  9 +++++----
 src/icon.js                      |  2 ++
 src/languages/en.js              |  3 +--
 src/pages/Dashboard.vue          | 29 +++++++++++++++++++++++++++--
 src/pages/MaintenanceDetails.vue |  8 ++++++--
 5 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index 8662dfee..01f1c0fa 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -1,10 +1,11 @@
 <template>
     <div class="shadow-box mb-3" :style="boxStyle">
         <div class="list-header">
-            <div class="search-wrapper float-start">
-                <select v-model="selectedList" class="form-control">
-                    <option value="monitor" selected>{{ $t('Monitor List') }}</option>
-                    <option value="maintenance">{{ $t('Maintenance List') }}</option>
+            <div class="search-wrapper float-start" style="margin-left: 5px;">
+                <font-awesome-icon icon="filter" />
+                <select v-model="selectedList" class="form-control" style="margin-left: 5px;">
+                    <option value="monitor" selected>{{ $t('Monitors') }}</option>
+                    <option value="maintenance">{{ $t('Maintenance') }}</option>
                 </select>
             </div>
             <div class="search-wrapper">
diff --git a/src/icon.js b/src/icon.js
index c59b2a1c..b2b670c8 100644
--- a/src/icon.js
+++ b/src/icon.js
@@ -43,6 +43,7 @@ import {
     faAngleDown,
     faWrench,
     faHeartbeat,
+    faFilter,
 } from "@fortawesome/free-solid-svg-icons";
 
 library.add(
@@ -85,6 +86,7 @@ library.add(
     faAngleDown,
     faWrench,
     faHeartbeat,
+    faFilter,
 );
 
 export { FontAwesomeIcon };
diff --git a/src/languages/en.js b/src/languages/en.js
index 37f7cb43..b235904e 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -8,8 +8,7 @@ export default {
     maxRedirectDescription: "Maximum number of redirects to follow. Set to 0 to disable redirects.",
     acceptedStatusCodesDescription: "Select status codes which are considered as a successful response.",
     Maintenance: "Maintenance",
-    "Monitor List": "Monitor List",
-    "Maintenance List": "Maintenance List",
+    "Monitors": "Monitors",
     "Schedule maintenance": "Schedule maintenance",
     "Affected Monitors": "Affected Monitors",
     "Pick Affected Monitors...": "Pick Affected Monitors...",
diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue
index 207e5b3a..e2a5275f 100644
--- a/src/pages/Dashboard.vue
+++ b/src/pages/Dashboard.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="container-fluid">
         <div class="row">
-            <div v-if="! $root.isMobile" class="col-12 col-md-5 col-xl-4">
+            <div v-if="!$root.isMobile" class="col-12 col-md-5 col-xl-4">
                 <div class="dropdown dropdown-create">
                     <button class="btn btn-primary mb-3 dropdown-toggle" type="button" data-bs-toggle="dropdown">
                         <font-awesome-icon icon="plus" /> {{ $t("Create") }}
@@ -14,7 +14,7 @@
                         </li>
                         <li>
                             <button type="button" class="dropdown-item" @click="$router.push('/addMaintenance')">
-                                <font-awesome-icon icon="exclamation-circle" /> {{ $t("Maintenance") }}
+                                <font-awesome-icon icon="wrench" /> {{ $t("Maintenance") }}
                             </button>
                         </li>
                     </ul>
@@ -45,7 +45,32 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+@import "../assets/vars.scss";
+
 .container-fluid {
     width: 98%;
 }
+
+.dropdown-create {
+    display: flex;
+    justify-content: end;
+}
+
+.dark {
+    .dropdown-create {
+        ul {
+            background-color: $dark-bg;
+            border-color: $dark-bg2;
+            border-width: 2px;
+
+            li button {
+                color: $dark-font-color;
+            }
+
+            li button:hover {
+                background-color: $dark-bg2;
+            }
+        }
+    }
+}
 </style>
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
index ae4b5a7b..432e7c3f 100644
--- a/src/pages/MaintenanceDetails.vue
+++ b/src/pages/MaintenanceDetails.vue
@@ -22,14 +22,14 @@
 
             <label for="affected_monitors" class="form-label" style="margin-top: 20px;">{{ $t("Affected Monitors") }}</label>
             <br>
-            <button v-for="monitor in affectedMonitors" :key="monitor.id" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold;">
+            <button v-for="monitor in affectedMonitors" :key="monitor.id" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: 500;">
                 {{ monitor }}
             </button>
             <br />
 
             <label for="selected_status_pages" class="form-label" style="margin-top: 20px;">{{ $t("Selected status pages") }}</label>
             <br>
-            <button v-for="statusPage in selectedStatusPages" :key="statusPage.id" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: bold;">
+            <button v-for="statusPage in selectedStatusPages" :key="statusPage.id" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: 500;">
                 {{ statusPage }}
             </button>
 
@@ -154,4 +154,8 @@ textarea {
     background-color: #5cdd8b;
 }
 
+.dark .btn-monitor {
+    color: #020b05 !important;
+}
+
 </style>

From 2fe5c090aa9c3f0ad67f7880dcaef59bf0335aa7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?= <karel.kryda@gmail.com>
Date: Sun, 8 May 2022 20:50:08 +0200
Subject: [PATCH 033/803] small fixes

---
 server/routers/api-router.js  | 2 +-
 src/languages/en.js           | 1 +
 src/pages/EditMaintenance.vue | 5 +++++
 src/pages/StatusPage.vue      | 2 +-
 4 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index da036ee2..84fc8c55 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -180,7 +180,7 @@ async function getMaintenanceList(statusPageId) {
         return publicMaintenanceList;
 
     } catch (error) {
-        return null;
+        return [];
     }
 }
 
diff --git a/src/languages/en.js b/src/languages/en.js
index b235904e..2653b029 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -20,6 +20,7 @@ export default {
     End: "End",
     affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
     atLeastOneMonitor: "Select at least one affected monitor",
+    maintenanceInvalidDate: "Invalid maintenance end date entered",
     selectedStatusPagesDescription: "Select status pages to display maintenance info on",
     atLeastOneStatusPage: "Select at least one status page",
     maintenanceTitleExample: "Network infrastructure maintenance",
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 26aa857f..281f1241 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -260,6 +260,11 @@ export default {
                 return this.processing = false;
             }
 
+            if (this.maintenance.start_date >= this.maintenance.end_date) {
+                toast.error(this.$t("maintenanceInvalidDate"));
+                return this.processing = false;
+            }
+
             if (!this.showOnAllPages && this.selectedStatusPages.length === 0) {
                 toast.error(this.$t("atLeastOneStatusPage"));
                 return this.processing = false;
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 4d021dc4..85f3803b 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -595,7 +595,7 @@ export default {
             }
 
             this.incident = res.data.incident;
-            this.maintenance = res.data.maintenance || [];
+            this.maintenance = res.data.maintenance;
             this.$root.publicGroupList = res.data.publicGroupList;
         });
 

From 398ecb76667710731bc065f35b78706125fc8077 Mon Sep 17 00:00:00 2001
From: Sascha Kruse <sascha.kruse@frederix-hotspot.de>
Date: Thu, 12 May 2022 11:48:38 +0200
Subject: [PATCH 034/803] add radius check

---
 db/patch-add-radius-monitor.sql | 18 ++++++++++++++++
 package.json                    |  1 +
 server/database.js              |  1 +
 server/model/monitor.js         | 33 +++++++++++++++++++++++++++--
 server/server.js                |  5 +++++
 server/util-server.js           | 30 ++++++++++++++++++++++++++
 src/languages/en.js             |  6 ++++++
 src/pages/EditMonitor.vue       | 37 +++++++++++++++++++++++++++++++--
 8 files changed, 127 insertions(+), 4 deletions(-)
 create mode 100644 db/patch-add-radius-monitor.sql

diff --git a/db/patch-add-radius-monitor.sql b/db/patch-add-radius-monitor.sql
new file mode 100644
index 00000000..1fd5b44f
--- /dev/null
+++ b/db/patch-add-radius-monitor.sql
@@ -0,0 +1,18 @@
+BEGIN TRANSACTION;
+
+ALTER TABLE monitor
+    ADD radius_username VARCHAR(255);
+
+ALTER TABLE monitor
+    ADD radius_password VARCHAR(255);
+
+ALTER TABLE monitor
+    ADD radius_calling_station_id VARCHAR(50);
+
+ALTER TABLE monitor
+    ADD radius_called_station_id VARCHAR(50);
+
+ALTER TABLE monitor
+    ADD radius_secret VARCHAR(255);
+
+COMMIT
diff --git a/package.json b/package.json
index e9b7003b..304a466e 100644
--- a/package.json
+++ b/package.json
@@ -93,6 +93,7 @@
         "limiter": "^2.1.0",
         "mqtt": "^4.2.8",
         "node-cloudflared-tunnel": "~1.0.9",
+        "node-radius-client": "^1.0.0",
         "nodemailer": "~6.6.5",
         "notp": "~2.0.3",
         "password-hash": "~1.2.2",
diff --git a/server/database.js b/server/database.js
index b17e7f4e..4ce509f3 100644
--- a/server/database.js
+++ b/server/database.js
@@ -58,6 +58,7 @@ class Database {
         "patch-monitor-expiry-notification.sql": true,
         "patch-status-page-footer-css.sql": true,
         "patch-added-mqtt-monitor.sql": true,
+        "patch-add-radius-monitor.sql": true,
     };
 
     /**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index f2d16524..0b8fade4 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -7,7 +7,7 @@ dayjs.extend(timezone);
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
 const { log, UP, DOWN, PENDING, flipStatus, TimeLogger } = require("../../src/util");
-const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mqttAsync } = require("../util-server");
+const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, radius, setting, mqttAsync } = require("../util-server");
 const { R } = require("redbean-node");
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { Notification } = require("../notification");
@@ -87,7 +87,12 @@ class Monitor extends BeanModel {
             mqttUsername: this.mqttUsername,
             mqttPassword: this.mqttPassword,
             mqttTopic: this.mqttTopic,
-            mqttSuccessMessage: this.mqttSuccessMessage
+            mqttSuccessMessage: this.mqttSuccessMessage,
+            radiusUsername: this.radiusUsername,
+            radiusPassword: this.radiusPassword,
+            radiusCalledStationId: this.radiusCalledStationId,
+            radiusCallingStationId: this.radiusCallingStationId,
+            radiusSecret: this.radiusSecret
         };
 
         if (includeSensitiveData) {
@@ -435,6 +440,30 @@ class Monitor extends BeanModel {
                         interval: this.interval,
                     });
                     bean.status = UP;
+                } else if (this.type === "radius") {
+                    let startTime = dayjs().valueOf();
+                    try {
+                        const resp = await radius(
+                            this.hostname,
+                            this.radiusUsername,
+                            this.radiusPassword,
+                            this.radiusCalledStationId,
+                            this.radiusCallingStationId,
+                            this.radiusSecret
+                        );
+                        if (resp.code) {
+                            bean.msg = resp.code;
+                        }
+                        bean.status = UP;
+                    } catch (error) {
+                        bean.status = DOWN;
+                        if (error.response?.code) {
+                            bean.msg = error.response.code;
+                        } else {
+                            bean.msg = error.message;
+                        }
+                    }
+                    bean.ping = dayjs().valueOf() - startTime;
                 } else {
                     bean.msg = "Unknown Monitor Type";
                     bean.status = PENDING;
diff --git a/server/server.js b/server/server.js
index 79cb2102..55b10816 100644
--- a/server/server.js
+++ b/server/server.js
@@ -674,6 +674,11 @@ try {
                 bean.mqttPassword = monitor.mqttPassword;
                 bean.mqttTopic = monitor.mqttTopic;
                 bean.mqttSuccessMessage = monitor.mqttSuccessMessage;
+                bean.radiusUsername = monitor.radiusUsername;
+                bean.radiusPassword = monitor.radiusPassword;
+                bean.radiusCalledStationId = monitor.radiusCalledStationId;
+                bean.radiusCallingStationId = monitor.radiusCallingStationId;
+                bean.radiusSecret = monitor.radiusSecret;
 
                 await R.store(bean);
 
diff --git a/server/util-server.js b/server/util-server.js
index 54974e14..5dd81e00 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -10,6 +10,12 @@ const chardet = require("chardet");
 const mqtt = require("mqtt");
 const chroma = require("chroma-js");
 const { badgeConstants } = require("./config");
+const radiusClient = require("node-radius-client");
+const {
+    dictionaries: {
+        rfc2865: { file, attributes },
+    },
+} = require("node-radius-utils");
 
 // From ping-lite
 exports.WIN = /^win/.test(process.platform);
@@ -203,6 +209,30 @@ exports.dnsResolve = function (hostname, resolverServer, rrtype) {
     });
 };
 
+exports.radius = function (
+    hostname,
+    username,
+    password,
+    calledStationId,
+    callingStationId,
+    secret,
+) {
+    const client = new radiusClient({
+        host: hostname,
+        dictionaries: [ file ],
+    });
+
+    return client.accessRequest({
+        secret: secret,
+        attributes: [
+            [ attributes.USER_NAME, username ],
+            [ attributes.USER_PASSWORD, password ],
+            [ attributes.CALLING_STATION_ID, callingStationId ],
+            [ attributes.CALLED_STATION_ID, calledStationId ],
+        ],
+    });
+};
+
 /**
  * Retrieve value of setting based on key
  * @param {string} key Key of setting to retrieve
diff --git a/src/languages/en.js b/src/languages/en.js
index ab73ce35..13826453 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -464,4 +464,10 @@ export default {
     "Domain Names": "Domain Names",
     signedInDisp: "Signed in as {0}",
     signedInDispDisabled: "Auth Disabled.",
+    RadiusSecret: "Radius Secret",
+    RadiusSecretDescription: "Shared Secret between client and server",
+    RadiusCalledStationId: "Called Station Id",
+    RadiusCalledStationIdDescription: "Identifier of the called device",
+    RadiusCallingStationId: "Calling Station Id",
+    RadiusCallingStationIdDescription: "Identifier of the calling device",
 };
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 43f34527..e2beaca1 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -35,6 +35,9 @@
                                     <option value="mqtt">
                                         MQTT
                                     </option>
+                                    <option value="radius">
+                                        Radius
+                                    </option>
                                 </select>
                             </div>
 
@@ -70,8 +73,8 @@
                             </div>
 
                             <!-- Hostname -->
-                            <!-- TCP Port / Ping / DNS / Steam / MQTT only -->
-                            <div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' || monitor.type === 'steam' || monitor.type === 'mqtt'" class="my-3">
+                            <!-- TCP Port / Ping / DNS / Steam / MQTT / Radius only -->
+                            <div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' || monitor.type === 'steam' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
                                 <label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
                                 <input id="hostname" v-model="monitor.hostname" type="text" class="form-control" :pattern="`${ipRegexPattern}|${hostnameRegexPattern}`" required>
                             </div>
@@ -148,6 +151,36 @@
                                 </div>
                             </template>
 
+                            <template v-if="monitor.type === 'radius'">
+                                <div class="my-3">
+                                    <label for="radius_username" class="form-label">Radius {{ $t("Username") }}</label>
+                                    <input id="radius_username" v-model="monitor.radiusUsername" type="text" class="form-control" required />
+                                </div>
+
+                                <div class="my-3">
+                                    <label for="radius_password" class="form-label">Radius {{ $t("Password") }}</label>
+                                    <input id="radius_password" v-model="monitor.radiusPassword" type="password" class="form-control" required />
+                                </div>
+
+                                <div class="my-3">
+                                    <label for="radius_secret" class="form-label">{{ $t("RadiusSecret") }}</label>
+                                    <input id="radius_secret" v-model="monitor.radiusSecret" type="password" class="form-control" required />
+                                    <div class="form-text"> {{ $t( "RadiusSecretDescription") }} </div>
+                                </div>
+
+                                <div class="my-3">
+                                    <label for="radius_called_station_id" class="form-label">{{ $t("RadiusCalledStationId") }}</label>
+                                    <input id="radius_called_station_id" v-model="monitor.radiusCalledStationId" type="text" class="form-control" required />
+                                    <div class="form-text"> {{ $t( "RadiusCalledStationIdDescription") }} </div>
+                                </div>
+
+                                <div class="my-3">
+                                    <label for="radius_calling_station_id" class="form-label">{{ $t("RadiusCallingStationId") }}</label>
+                                    <input id="radius_calling_station_id" v-model="monitor.radiusCallingStationId" type="text" class="form-control" required />
+                                    <div class="form-text"> {{ $t( "RadiusCallingStationIdDescription") }} </div>
+                                </div>
+                            </template>
+
                             <!-- Interval -->
                             <div class="my-3">
                                 <label for="interval" class="form-label">{{ $t("Heartbeat Interval") }} ({{ $t("checkEverySecond", [ monitor.interval ]) }})</label>

From 42d68edab07881e4d9ffe88349c8de2a0db85b1f Mon Sep 17 00:00:00 2001
From: Sascha Kruse <knopwob@knopwob.de>
Date: Wed, 18 May 2022 15:55:36 +0200
Subject: [PATCH 035/803] (style) add trailing comma

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 server/model/monitor.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 0b8fade4..71b4255c 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -92,7 +92,7 @@ class Monitor extends BeanModel {
             radiusPassword: this.radiusPassword,
             radiusCalledStationId: this.radiusCalledStationId,
             radiusCallingStationId: this.radiusCallingStationId,
-            radiusSecret: this.radiusSecret
+            radiusSecret: this.radiusSecret,
         };
 
         if (includeSensitiveData) {

From 25262cfb91d46b1ff398e05bdd9ec613f07881c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?=
 <59953812+karelkryda@users.noreply.github.com>
Date: Mon, 30 May 2022 15:31:45 +0200
Subject: [PATCH 036/803] Update server/model/monitor.js

Co-authored-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/model/monitor.js | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index cce9060d..4f483415 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -796,6 +796,13 @@ class Monitor extends BeanModel {
             (previousBeatStatus === PENDING && currentBeatStatus === DOWN);
     }
 
+    /**
+     * Is this beat important for notifications?
+     * @param {boolean} isFirstBeat Is this the first beat of this monitor?
+     * @param {const} previousBeatStatus Status of the previous beat
+     * @param {const} currentBeatStatus Status of the current beat
+     * @returns {boolean} True if is an important beat else false
+     */
     static isImportantForNotification(isFirstBeat, previousBeatStatus, currentBeatStatus) {
         // * ? -> ANY STATUS = important [isFirstBeat]
         // UP -> PENDING = not important

From 6d0683b055c8cc114347459aa5f15bab0fbc2448 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?=
 <59953812+karelkryda@users.noreply.github.com>
Date: Mon, 30 May 2022 15:32:19 +0200
Subject: [PATCH 037/803] Update server/routers/api-router.js

Co-authored-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/routers/api-router.js | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 7304d128..f298a84a 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -160,7 +160,11 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
 
 });
 
-// Status Page - Maintenance List
+/**
+ * Get list of maintenances
+ * @param {number} statusPageId ID of status page to get maintenance for
+ * @returns {Object} Object representing maintenances sanitized for public
+ */
 async function getMaintenanceList(statusPageId) {
     try {
         const publicMaintenanceList = [];

From fa777c5bc0d1aa3ae9aa8e7abe5bee0fb184e06e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Kr=C3=BDda?=
 <59953812+karelkryda@users.noreply.github.com>
Date: Mon, 30 May 2022 15:32:42 +0200
Subject: [PATCH 038/803] Update server/server.js

Co-authored-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/server.js | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/server/server.js b/server/server.js
index d18ef12f..5c9b6503 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1759,6 +1759,11 @@ async function checkOwner(userID, monitorID) {
     }
 }
 
+/**
+ * Send maintenance list to client
+ * @param {Socket} socket Socket.io instance to send to
+ * @returns {Object}
+ */
 async function sendMaintenanceList(socket) {
     let list = await getMaintenanceJSONList(socket.userID);
     io.to(socket.userID).emit("maintenanceList", list);

From 54548e34edfa17fd5930901dd66c48ce6b28684a Mon Sep 17 00:00:00 2001
From: Wooferz <85282355+woooferz@users.noreply.github.com>
Date: Wed, 8 Jun 2022 20:05:10 +1000
Subject: [PATCH 039/803] Added label to status badge

---
 server/routers/api-router.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 201efc41..d71f903a 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -136,6 +136,7 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
             const heartbeat = await Monitor.getPreviousHeartbeat(requestedMonitorId);
             const state = overrideValue !== undefined ? overrideValue : heartbeat.status === 1;
 
+            badgeValues.label = label ? label : "";
             badgeValues.color = state ? upColor : downColor;
             badgeValues.message = label ?? state ? upLabel : downLabel;
         }

From 817c941489efabe35ac08ed6a6e9158e424617fe Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Sun, 12 Jun 2022 22:30:42 +0800
Subject: [PATCH 040/803] Add Bark Notification Parameters

---
 server/notification-providers/bark.js |  15 +++-
 src/components/notifications/Bark.vue | 106 ++++++++++++++++++++++++++
 src/languages/bg-BG.js                |   2 +
 src/languages/de-DE.js                |   2 +
 src/languages/en.js                   |   2 +
 src/languages/ko-KR.js                |   2 +
 src/languages/nl-NL.js                |   2 +
 src/languages/pl.js                   |   2 +
 src/languages/th-TH.js                |   2 +
 src/languages/tr-TR.js                |   2 +
 src/languages/vi-VN.js                |   2 +
 src/languages/zh-CN.js                |   2 +
 src/languages/zh-TW.js                |   2 +
 13 files changed, 140 insertions(+), 3 deletions(-)

diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index 092511d8..a2c4966a 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -12,9 +12,7 @@ const { default: axios } = require("axios");
 
 // bark is an APN bridge that sends notifications to Apple devices.
 
-const barkNotificationGroup = "UptimeKuma";
 const barkNotificationAvatar = "https://github.com/louislam/uptime-kuma/raw/master/public/icon.png";
-const barkNotificationSound = "telegraph";
 const successMessage = "Successes!";
 
 class Bark extends NotificationProvider {
@@ -53,10 +51,21 @@ class Bark extends NotificationProvider {
     appendAdditionalParameters(postUrl) {
         // grouping all our notifications
         postUrl += "?group=" + barkNotificationGroup;
+        if (notification.barkGroup != null) {
+            postUrl += "&group=" + notification.barkGroup;
+        } else {
+            postUrl += "&group=" + "UptimeKuma";
+            // default group
+        }
         // set icon to uptime kuma icon, 11kb should be fine
         postUrl += "&icon=" + barkNotificationAvatar;
         // picked a sound, this should follow system's mute status when arrival
-        postUrl += "&sound=" + barkNotificationSound;
+        if (notification.barkSound != null) {
+            postUrl += "&sound=" + notification.barkSound;
+        } else {
+            postUrl += "&sound=" + "telegraph";
+            // default sound
+        }
         return postUrl;
     }
 
diff --git a/src/components/notifications/Bark.vue b/src/components/notifications/Bark.vue
index 014450de..70e4322d 100644
--- a/src/components/notifications/Bark.vue
+++ b/src/components/notifications/Bark.vue
@@ -12,4 +12,110 @@
             >{{ $t("here") }}</a>
         </i18n-t>
     </div>
+    <div class="mb-3">
+        <label for="Bark Group" class="form-label">{{ $t("Bark Group") }}</label>
+        <input id="Bark Group" v-model="$parent.notification.barkGroup" type="text" class="form-control" required>
+    </div>
+    <div class="mb-3">
+        <label for="Bark Sound" class="form-label">{{ $t("Bark Sound") }}</label>
+        
+        <select id="Bark Sound" v-model="$parent.notification.barkSound" class="form-select" required>
+            <option value="alarm">
+                alarm
+            </option>    
+            <option value="anticipate">
+                anticipate
+            </option>    
+            <option value="bell">
+                bell
+            </option>    
+            <option value="birdsong">
+                birdsong
+            </option>    
+            <option value="bloom">
+                bloom
+            </option>    
+            <option value="calypso">
+                calypso
+            </option>    
+            <option value="chime">
+                chime
+            </option>    
+            <option value="choo">
+                choo
+            </option>    
+            <option value="descent">
+                descent
+            </option>    
+            <option value="electronic">
+                electronic
+            </option>    
+            <option value="fanfare">
+                fanfare
+            </option>    
+            <option value="glass">
+                glass
+            </option>    
+            <option value="gotosleep">
+                gotosleep
+            </option>    
+            <option value="healthnotification">
+                healthnotification
+            </option>    
+            <option value="horn">
+                horn
+            </option>    
+            <option value="ladder">
+                ladder
+            </option>    
+            <option value="mailsent">
+                mailsent
+            </option>    
+            <option value="minuet">
+                minuet
+            </option>    
+            <option value="multiwayinvitation">
+                multiwayinvitation
+            </option>    
+            <option value="newmail">
+                newmail
+            </option>    
+            <option value="newsflash">
+                newsflash
+            </option>    
+            <option value="noir">
+                noir
+            </option>    
+            <option value="paymentsuccess">
+                paymentsuccess
+            </option>    
+            <option value="shake">
+                shake
+            </option>    
+            <option value="sherwoodforest">
+                sherwoodforest
+            </option>    
+            <option value="silence">
+                silence
+            </option>    
+            <option value="spell">
+                spell
+            </option>    
+            <option value="suspense">
+                suspense
+            </option>    
+            <option value="telegraph">
+                telegraph
+            </option>    
+            <option value="tiptoes">
+                tiptoes
+            </option>    
+            <option value="typewriters">
+                typewriters
+            </option>    
+            <option value="update">
+                update
+            </option>    
+        </select>
+    </div>
 </template>
diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 6297062a..23b1b726 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -389,6 +389,8 @@ export default {
     SignName: "Знак име",
     "Sms template must contain parameters: ": "SMS шаблонът трябва да съдържа следните параметри: ",
     "Bark Endpoint": "Bark крайна точка",
+    "Bark Group": "Bark група",
+    "Bark Sound": "Bark Звънене",
     WebHookUrl: "URL адрес на уеб кука",
     SecretKey: "Таен ключ",
     "For safety, must use secret key": "За сигурност, трябва да се използва таен ключ",
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index e679937c..aeba230f 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -389,6 +389,8 @@ export default {
     SignName: "Signaturname",
     "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
     "Bark Endpoint": "Bark Endpunkt",
+    "Bark Group": "Bark Gruppe",
+    "Bark Sound": "Bark Klingelton",
     WebHookUrl: "Webhook URL",
     SecretKey: "Geheimer Schlüssel",
     "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
diff --git a/src/languages/en.js b/src/languages/en.js
index aa6737dd..4b8f782f 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -406,6 +406,8 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms template must contain parameters: ",
     "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "For safety, must use secret key",
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index da034167..0ed7a6f2 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -406,6 +406,8 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
     "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
     WebHookUrl: "웹훅 URL",
     SecretKey: "Secret Key",
     "For safety, must use secret key": "안전을 위해 꼭 Secret Key를 사용하세요.",
diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js
index 96424a5f..93bae56d 100644
--- a/src/languages/nl-NL.js
+++ b/src/languages/nl-NL.js
@@ -397,6 +397,8 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ",
     "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken",
diff --git a/src/languages/pl.js b/src/languages/pl.js
index ab2480d3..57a5cbe6 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -396,6 +396,8 @@ export default {
     SignName: "Podpis",
     "Sms template must contain parameters: ": "Szablon sms musi posiadać parametry: ",
     "Bark Endpoint": "Punkt końcowy Bark",
+    "Bark Group": "grupa Bark",
+    "Bark Sound": "Dzwonek Bark",
     WebHookUrl: "WebHookUrl",
     SecretKey: "Tajny klucz",
     "For safety, must use secret key": "Ze względów bezpieczeństwa musisz użyć tajnego klucza",
diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
index 70138ff4..1773de7a 100644
--- a/src/languages/th-TH.js
+++ b/src/languages/th-TH.js
@@ -396,6 +396,8 @@ export default {
     SignName: "ป้ายชื่อ",
     "Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
     "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index 4904bdb7..bce1f0fd 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -397,6 +397,8 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir:",
     "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
diff --git a/src/languages/vi-VN.js b/src/languages/vi-VN.js
index 9005c393..9d8da69a 100644
--- a/src/languages/vi-VN.js
+++ b/src/languages/vi-VN.js
@@ -396,6 +396,8 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms template must contain parameters: ",
     "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "Để an toàn, hãy dùng secret key",
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index 428d56bb..003fdd7a 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -402,6 +402,8 @@ export default {
     TemplateCode: "TemplateCode",
     SignName: "SignName",
     "Bark Endpoint": "Bark 接入点",
+    "Bark Group": "Bark 群组",
+    "Bark Sound": "Bark 铃声",
     "Device Token": "Apple Device Token",
     Platform: "平台",
     iOS: "iOS",
diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
index ff849adb..1118d100 100644
--- a/src/languages/zh-TW.js
+++ b/src/languages/zh-TW.js
@@ -396,6 +396,8 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms 範本必須包含參數:",
     "Bark Endpoint": "Bark 端點",
+    "Bark Group": "Bark 群組",
+    "Bark Sound": "Bark 鈴聲",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "為了安全起見,必須使用秘密金鑰",

From a41023ca2a05f1015021d30352b9e4f752778320 Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Sun, 12 Jun 2022 22:41:24 +0800
Subject: [PATCH 041/803] Update

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

diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index a2c4966a..b9113a74 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -50,7 +50,6 @@ class Bark extends NotificationProvider {
      */
     appendAdditionalParameters(postUrl) {
         // grouping all our notifications
-        postUrl += "?group=" + barkNotificationGroup;
         if (notification.barkGroup != null) {
             postUrl += "&group=" + notification.barkGroup;
         } else {

From 404923b7c82cdc633c637f364f0f2ccbb878d346 Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Sun, 12 Jun 2022 22:49:04 +0800
Subject: [PATCH 042/803] bugfix

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

diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index b9113a74..f9215c8a 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -48,7 +48,7 @@ class Bark extends NotificationProvider {
      * @param {string} postUrl URL to append parameters to
      * @returns {string}
      */
-    appendAdditionalParameters(postUrl) {
+    appendAdditionalParameters(notification, postUrl) {
         // grouping all our notifications
         if (notification.barkGroup != null) {
             postUrl += "&group=" + notification.barkGroup;

From a23ab9d1de03e0825f6c1206c141fcec98a41a8d Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Sun, 12 Jun 2022 23:18:32 +0800
Subject: [PATCH 043/803] Update

---
 src/components/notifications/Bark.vue | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/components/notifications/Bark.vue b/src/components/notifications/Bark.vue
index 70e4322d..34d35db1 100644
--- a/src/components/notifications/Bark.vue
+++ b/src/components/notifications/Bark.vue
@@ -18,7 +18,6 @@
     </div>
     <div class="mb-3">
         <label for="Bark Sound" class="form-label">{{ $t("Bark Sound") }}</label>
-        
         <select id="Bark Sound" v-model="$parent.notification.barkSound" class="form-select" required>
             <option value="alarm">
                 alarm

From f442507cab4e4c9c3a8d03c83810d36183ed41f4 Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Mon, 13 Jun 2022 00:16:34 +0800
Subject: [PATCH 044/803] Update

---
 src/components/notifications/Bark.vue | 128 +++++++-------------------
 1 file changed, 32 insertions(+), 96 deletions(-)

diff --git a/src/components/notifications/Bark.vue b/src/components/notifications/Bark.vue
index 34d35db1..5ff01b1a 100644
--- a/src/components/notifications/Bark.vue
+++ b/src/components/notifications/Bark.vue
@@ -19,102 +19,38 @@
     <div class="mb-3">
         <label for="Bark Sound" class="form-label">{{ $t("Bark Sound") }}</label>
         <select id="Bark Sound" v-model="$parent.notification.barkSound" class="form-select" required>
-            <option value="alarm">
-                alarm
-            </option>    
-            <option value="anticipate">
-                anticipate
-            </option>    
-            <option value="bell">
-                bell
-            </option>    
-            <option value="birdsong">
-                birdsong
-            </option>    
-            <option value="bloom">
-                bloom
-            </option>    
-            <option value="calypso">
-                calypso
-            </option>    
-            <option value="chime">
-                chime
-            </option>    
-            <option value="choo">
-                choo
-            </option>    
-            <option value="descent">
-                descent
-            </option>    
-            <option value="electronic">
-                electronic
-            </option>    
-            <option value="fanfare">
-                fanfare
-            </option>    
-            <option value="glass">
-                glass
-            </option>    
-            <option value="gotosleep">
-                gotosleep
-            </option>    
-            <option value="healthnotification">
-                healthnotification
-            </option>    
-            <option value="horn">
-                horn
-            </option>    
-            <option value="ladder">
-                ladder
-            </option>    
-            <option value="mailsent">
-                mailsent
-            </option>    
-            <option value="minuet">
-                minuet
-            </option>    
-            <option value="multiwayinvitation">
-                multiwayinvitation
-            </option>    
-            <option value="newmail">
-                newmail
-            </option>    
-            <option value="newsflash">
-                newsflash
-            </option>    
-            <option value="noir">
-                noir
-            </option>    
-            <option value="paymentsuccess">
-                paymentsuccess
-            </option>    
-            <option value="shake">
-                shake
-            </option>    
-            <option value="sherwoodforest">
-                sherwoodforest
-            </option>    
-            <option value="silence">
-                silence
-            </option>    
-            <option value="spell">
-                spell
-            </option>    
-            <option value="suspense">
-                suspense
-            </option>    
-            <option value="telegraph">
-                telegraph
-            </option>    
-            <option value="tiptoes">
-                tiptoes
-            </option>    
-            <option value="typewriters">
-                typewriters
-            </option>    
-            <option value="update">
-                update
-            </option>    
+            <option value="alarm">alarm</option>
+            <option value="anticipate">anticipate</option>
+            <option value="bell">bell</option>
+            <option value="birdsong">birdsong</option>
+            <option value="bloom">bloom</option>
+            <option value="calypso">calypso</option>
+            <option value="chime">chime</option>
+            <option value="choo">choo</option>
+            <option value="descent">descent</option>
+            <option value="electronic">electronic</option>
+            <option value="fanfare">fanfare</option>
+            <option value="glass">glass</option>
+            <option value="gotosleep">gotosleep</option>
+            <option value="healthnotification">healthnotification</option>
+            <option value="horn">horn</option>
+            <option value="ladder">ladder</option>
+            <option value="mailsent">mailsent</option>
+            <option value="minuet">minuet</option>
+            <option value="multiwayinvitation">multiwayinvitation</option>
+            <option value="newmail">newmail</option>
+            <option value="newsflash">newsflash</option>
+            <option value="noir">noir</option>
+            <option value="paymentsuccess">paymentsuccess</option>
+            <option value="shake">shake</option>
+            <option value="sherwoodforest">sherwoodforest</option>
+            <option value="silence">silence</option>
+            <option value="spell">spell</option>
+            <option value="suspense">suspense</option>
+            <option value="telegraph">telegraph</option>
+            <option value="tiptoes">tiptoes</option>
+            <option value="typewriters">typewriters</option>
+            <option value="update">update</option>
         </select>
     </div>
 </template>

From 5f347b10ba88114a5c15757e4f86c96a3672e479 Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Mon, 13 Jun 2022 01:15:38 +0800
Subject: [PATCH 045/803] Update

---
 src/components/notifications/Bark.vue | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/src/components/notifications/Bark.vue b/src/components/notifications/Bark.vue
index 5ff01b1a..6cac73d3 100644
--- a/src/components/notifications/Bark.vue
+++ b/src/components/notifications/Bark.vue
@@ -2,9 +2,6 @@
     <div class="mb-3">
         <label for="Bark Endpoint" class="form-label">{{ $t("Bark Endpoint") }}<span style="color: red;"><sup>*</sup></span></label>
         <input id="Bark Endpoint" v-model="$parent.notification.barkEndpoint" type="text" class="form-control" required>
-        <div class="form-text">
-            <p><span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}</p>
-        </div>
         <i18n-t tag="div" keypath="wayToGetTeamsURL" class="form-text">
             <a
                 href="https://github.com/Finb/Bark"

From 774fe58ddca362a7d5c6fdfed8e39b0d8fdbc983 Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Mon, 13 Jun 2022 01:30:27 +0800
Subject: [PATCH 046/803] Update

---
 src/languages/bg-BG.js | 2 --
 src/languages/de-DE.js | 2 --
 src/languages/ko-KR.js | 2 --
 src/languages/nl-NL.js | 2 --
 src/languages/pl.js    | 2 --
 src/languages/th-TH.js | 2 --
 src/languages/tr-TR.js | 2 --
 src/languages/vi-VN.js | 2 --
 8 files changed, 16 deletions(-)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 23b1b726..6297062a 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -389,8 +389,6 @@ export default {
     SignName: "Знак име",
     "Sms template must contain parameters: ": "SMS шаблонът трябва да съдържа следните параметри: ",
     "Bark Endpoint": "Bark крайна точка",
-    "Bark Group": "Bark група",
-    "Bark Sound": "Bark Звънене",
     WebHookUrl: "URL адрес на уеб кука",
     SecretKey: "Таен ключ",
     "For safety, must use secret key": "За сигурност, трябва да се използва таен ключ",
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index aeba230f..e679937c 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -389,8 +389,6 @@ export default {
     SignName: "Signaturname",
     "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
     "Bark Endpoint": "Bark Endpunkt",
-    "Bark Group": "Bark Gruppe",
-    "Bark Sound": "Bark Klingelton",
     WebHookUrl: "Webhook URL",
     SecretKey: "Geheimer Schlüssel",
     "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index 0ed7a6f2..da034167 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -406,8 +406,6 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
     "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
     WebHookUrl: "웹훅 URL",
     SecretKey: "Secret Key",
     "For safety, must use secret key": "안전을 위해 꼭 Secret Key를 사용하세요.",
diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js
index 93bae56d..96424a5f 100644
--- a/src/languages/nl-NL.js
+++ b/src/languages/nl-NL.js
@@ -397,8 +397,6 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ",
     "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken",
diff --git a/src/languages/pl.js b/src/languages/pl.js
index 57a5cbe6..ab2480d3 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -396,8 +396,6 @@ export default {
     SignName: "Podpis",
     "Sms template must contain parameters: ": "Szablon sms musi posiadać parametry: ",
     "Bark Endpoint": "Punkt końcowy Bark",
-    "Bark Group": "grupa Bark",
-    "Bark Sound": "Dzwonek Bark",
     WebHookUrl: "WebHookUrl",
     SecretKey: "Tajny klucz",
     "For safety, must use secret key": "Ze względów bezpieczeństwa musisz użyć tajnego klucza",
diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
index 1773de7a..70138ff4 100644
--- a/src/languages/th-TH.js
+++ b/src/languages/th-TH.js
@@ -396,8 +396,6 @@ export default {
     SignName: "ป้ายชื่อ",
     "Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
     "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index bce1f0fd..4904bdb7 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -397,8 +397,6 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir:",
     "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
diff --git a/src/languages/vi-VN.js b/src/languages/vi-VN.js
index 9d8da69a..9005c393 100644
--- a/src/languages/vi-VN.js
+++ b/src/languages/vi-VN.js
@@ -396,8 +396,6 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms template must contain parameters: ",
     "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "Để an toàn, hãy dùng secret key",

From 252709ff494d6e16f5689d05a069e19dcb4a9aeb Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Mon, 13 Jun 2022 17:06:05 +0800
Subject: [PATCH 047/803] Update server/notification-providers/bark.js

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 server/notification-providers/bark.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index f9215c8a..8d579724 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -53,8 +53,8 @@ class Bark extends NotificationProvider {
         if (notification.barkGroup != null) {
             postUrl += "&group=" + notification.barkGroup;
         } else {
-            postUrl += "&group=" + "UptimeKuma";
             // default group
+            postUrl += "&group=" + "UptimeKuma";
         }
         // set icon to uptime kuma icon, 11kb should be fine
         postUrl += "&icon=" + barkNotificationAvatar;

From 55a6e5af425a1be2df58680aeaed4d726614050a Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Mon, 13 Jun 2022 17:06:12 +0800
Subject: [PATCH 048/803] Update server/notification-providers/bark.js

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 server/notification-providers/bark.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index 8d579724..21ee9b13 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -62,8 +62,8 @@ class Bark extends NotificationProvider {
         if (notification.barkSound != null) {
             postUrl += "&sound=" + notification.barkSound;
         } else {
-            postUrl += "&sound=" + "telegraph";
             // default sound
+            postUrl += "&sound=" + "telegraph";
         }
         return postUrl;
     }

From 1c4ddaeddf2c7d2f78ce881c73ae575a3cbfdb3a Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Mon, 13 Jun 2022 18:17:47 +0800
Subject: [PATCH 049/803] Update

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

diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index 21ee9b13..6b22ae49 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -53,7 +53,7 @@ class Bark extends NotificationProvider {
         if (notification.barkGroup != null) {
             postUrl += "&group=" + notification.barkGroup;
         } else {
-            // default group
+            // default group name
             postUrl += "&group=" + "UptimeKuma";
         }
         // set icon to uptime kuma icon, 11kb should be fine
@@ -62,7 +62,7 @@ class Bark extends NotificationProvider {
         if (notification.barkSound != null) {
             postUrl += "&sound=" + notification.barkSound;
         } else {
-            // default sound
+            // default app sound
             postUrl += "&sound=" + "telegraph";
         }
         return postUrl;

From 54b9698a05e21649ec78f64ec5187b41d885f9d9 Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Mon, 13 Jun 2022 21:44:10 +0800
Subject: [PATCH 050/803] Update

---
 server/notification-providers/bark.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index 6b22ae49..3258e7c5 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -49,20 +49,20 @@ class Bark extends NotificationProvider {
      * @returns {string}
      */
     appendAdditionalParameters(notification, postUrl) {
+        // set icon to uptime kuma icon, 11kb should be fine
+        postUrl += "&icon=" + barkNotificationAvatar;
         // grouping all our notifications
         if (notification.barkGroup != null) {
             postUrl += "&group=" + notification.barkGroup;
         } else {
-            // default group name
+            // default name
             postUrl += "&group=" + "UptimeKuma";
         }
-        // set icon to uptime kuma icon, 11kb should be fine
-        postUrl += "&icon=" + barkNotificationAvatar;
         // picked a sound, this should follow system's mute status when arrival
         if (notification.barkSound != null) {
             postUrl += "&sound=" + notification.barkSound;
         } else {
-            // default app sound
+            // default sound
             postUrl += "&sound=" + "telegraph";
         }
         return postUrl;

From ac27e6e2af5dd8140b20c6f36a51a4af608b5a69 Mon Sep 17 00:00:00 2001
From: OidaTiftla <oidatiftla@oidatiftla.de>
Date: Wed, 15 Jun 2022 16:56:26 +0200
Subject: [PATCH 051/803] Rename feature to: Resend Notification if Down X
 times consequently

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
---
 db/patch-monitor-add-resend-interval.sql |  2 +-
 server/model/monitor.js                  | 20 +++++++++-----------
 src/languages/de-DE.js                   |  4 ++--
 src/languages/en.js                      |  4 ++--
 src/pages/EditMonitor.vue                |  4 ++--
 5 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/db/patch-monitor-add-resend-interval.sql b/db/patch-monitor-add-resend-interval.sql
index c31dd7a2..8e28bf69 100644
--- a/db/patch-monitor-add-resend-interval.sql
+++ b/db/patch-monitor-add-resend-interval.sql
@@ -5,6 +5,6 @@ ALTER TABLE monitor
     ADD resend_interval INTEGER default 0 not null;
 
 ALTER TABLE heartbeat
-    ADD last_notified_time DATETIME default null;
+    ADD down_count INTEGER default 0 not null;
 
 COMMIT;
diff --git a/server/model/monitor.js b/server/model/monitor.js
index e1d02766..b3435f24 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -206,7 +206,7 @@ class Monitor extends BeanModel {
             bean.monitor_id = this.id;
             bean.time = R.isoDateTimeMillis(dayjs.utc());
             bean.status = DOWN;
-            bean.lastNotifiedTime = previousBeat?.lastNotifiedTime;
+            bean.downCount = previousBeat?.downCount || 0;
 
             if (this.isUpsideDown()) {
                 bean.status = flipStatus(bean.status);
@@ -523,8 +523,8 @@ class Monitor extends BeanModel {
                 log.debug("monitor", `[${this.name}] sendNotification`);
                 await Monitor.sendNotification(isFirstBeat, this, bean);
 
-                // Set last notified time to now
-                bean.lastNotifiedTime = R.isoDateTime(dayjs.utc());
+                // Reset down count
+                bean.downCount = 0;
 
                 // Clear Status Page Cache
                 log.debug("monitor", `[${this.name}] apicache clear`);
@@ -534,16 +534,14 @@ class Monitor extends BeanModel {
                 bean.important = false;
 
                 if (bean.status === DOWN && this.resendInterval > 0) {
-                    // divide by 1000 to convert from milliseconds to seconds and divide by 60 to convert from seconds to minutes
-                    let timeSinceLastNotified = (dayjs.utc().valueOf() - (bean.lastNotifiedTime == null ? 0 : dayjs.utc(bean.lastNotifiedTime).valueOf())) / 1000 / 60;
-                    if (timeSinceLastNotified >= this.resendInterval) {
+                    ++bean.downCount;
+                    if (bean.downCount >= this.resendInterval) {
                         // Send notification again, because we are still DOWN
-                        const currentTime = R.isoDateTime(dayjs.utc());
-                        log.debug("monitor", `[${this.name}] sendNotification again: lastNotifiedTime: ${bean.lastNotifiedTime} | current time: ${currentTime}`);
+                        log.debug("monitor", `[${this.name}] sendNotification again: Down Count: ${bean.downCount} | Resend Interval: ${this.resendInterval}`);
                         await Monitor.sendNotification(isFirstBeat, this, bean);
 
-                        // Set last notified time to now
-                        bean.lastNotifiedTime = currentTime;
+                        // Reset down count
+                        bean.downCount = 0;
                     }
                 }
             }
@@ -556,7 +554,7 @@ class Monitor extends BeanModel {
                 }
                 log.warn("monitor", `Monitor #${this.id} '${this.name}': Pending: ${bean.msg} | Max retries: ${this.maxretries} | Retry: ${retries} | Retry Interval: ${beatInterval} seconds | Type: ${this.type}`);
             } else {
-                log.warn("monitor", `Monitor #${this.id} '${this.name}': Failing: ${bean.msg} | Interval: ${beatInterval} seconds | Type: ${this.type}`);
+                log.warn("monitor", `Monitor #${this.id} '${this.name}': Failing: ${bean.msg} | Interval: ${beatInterval} seconds | Type: ${this.type} | Down Count: ${bean.downCount} | Resend Interval: ${this.resendInterval}`);
             }
 
             log.debug("monitor", `[${this.name}] Send to socket`);
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index f9f1e301..c4ef0b26 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -162,9 +162,9 @@ export default {
     Pink: "Pink",
     "Search...": "Suchen...",
     "Heartbeat Retry Interval": "Überprüfungsintervall",
-    "Notification resend interval if down": "Benachrichtigung erneut versenden wenn Inaktiv",
+    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
     retryCheckEverySecond: "Alle {0} Sekunden neu versuchen",
-    resendEveryMinute: "Erneut versenden alle {0} Minuten",
+    resendEveryXTimes: "Erneut versenden alle {0} mal",
     resendDisabled: "Erneut versenden deaktiviert",
     "Import Backup": "Backup importieren",
     "Export Backup": "Backup exportieren",
diff --git a/src/languages/en.js b/src/languages/en.js
index c3c3b740..49354a26 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -2,7 +2,7 @@ export default {
     languageName: "English",
     checkEverySecond: "Check every {0} seconds",
     retryCheckEverySecond: "Retry every {0} seconds",
-    resendEveryMinute: "Resend every {0} minutes",
+    resendEveryXTimes: "Resend every {0} times",
     resendDisabled: "Resend disabled",
     retriesDescription: "Maximum retries before the service is marked as down and a notification is sent",
     ignoreTLSError: "Ignore TLS/SSL error for HTTPS websites",
@@ -74,7 +74,7 @@ export default {
     "Heartbeat Interval": "Heartbeat Interval",
     Retries: "Retries",
     "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Notification resend interval if down": "Notification resend interval if down",
+    "Resend Notification if Down X times consequently": "Resend Notification if Down X times consequently",
     Advanced: "Advanced",
     "Upside Down Mode": "Upside Down Mode",
     "Max. Redirects": "Max. Redirects",
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 55924952..87bf1996 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -204,8 +204,8 @@
 
                             <div class="my-3">
                                 <label for="resend-interval" class="form-label">
-                                    {{ $t("Notification resend interval if down") }}
-                                    <span v-if="monitor.resendInterval > 0">({{ $t("resendEveryMinute", [ monitor.resendInterval ]) }})</span>
+                                    {{ $t("Resend Notification if Down X times consequently") }}
+                                    <span v-if="monitor.resendInterval > 0">({{ $t("resendEveryXTimes", [ monitor.resendInterval ]) }})</span>
                                     <span v-else>({{ $t("resendDisabled") }})</span>
                                 </label>
                                 <input id="resend-interval" v-model="monitor.resendInterval" type="number" class="form-control" required min="0" step="1">

From f84ae82983744ab50e7e2b9ac5d4a277b40b60e8 Mon Sep 17 00:00:00 2001
From: rmt/src <144435+rmtsrc@users.noreply.github.com>
Date: Sat, 25 Jun 2022 17:22:53 +0100
Subject: [PATCH 052/803] feat: added Home Assistant notification integration

---
 .../notification-providers/home-assistant.js  | 38 ++++++++++++++++++
 server/notification.js                        |  2 +
 .../notifications/HomeAssistant.vue           | 40 +++++++++++++++++++
 src/components/notifications/index.js         |  2 +
 src/languages/bg-BG.js                        |  1 +
 src/languages/cs-CZ.js                        |  1 +
 src/languages/da-DK.js                        |  1 +
 src/languages/de-DE.js                        |  1 +
 src/languages/en.js                           |  1 +
 src/languages/es-ES.js                        |  1 +
 src/languages/et-EE.js                        |  1 +
 src/languages/eu.js                           |  1 +
 src/languages/fa.js                           |  1 +
 src/languages/fr-FR.js                        |  1 +
 src/languages/hr-HR.js                        |  1 +
 src/languages/hu.js                           |  1 +
 src/languages/id-ID.js                        |  1 +
 src/languages/it-IT.js                        |  1 +
 src/languages/ja.js                           |  1 +
 src/languages/ko-KR.js                        |  1 +
 src/languages/nb-NO.js                        |  1 +
 src/languages/nl-NL.js                        |  1 +
 src/languages/pl.js                           |  1 +
 src/languages/pt-BR.js                        |  1 +
 src/languages/ru-RU.js                        |  1 +
 src/languages/sl-SI.js                        |  1 +
 src/languages/sr-latn.js                      |  1 +
 src/languages/sr.js                           |  1 +
 src/languages/sv-SE.js                        |  1 +
 src/languages/th-TH.js                        |  1 +
 src/languages/tr-TR.js                        |  1 +
 src/languages/uk-UA.js                        |  1 +
 src/languages/vi-VN.js                        |  1 +
 src/languages/zh-CN.js                        |  1 +
 src/languages/zh-HK.js                        |  1 +
 src/languages/zh-TW.js                        |  1 +
 36 files changed, 114 insertions(+)
 create mode 100644 server/notification-providers/home-assistant.js
 create mode 100644 src/components/notifications/HomeAssistant.vue

diff --git a/server/notification-providers/home-assistant.js b/server/notification-providers/home-assistant.js
new file mode 100644
index 00000000..285989ee
--- /dev/null
+++ b/server/notification-providers/home-assistant.js
@@ -0,0 +1,38 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+
+const defaultNotificationService = "notify";
+
+class HomeAssistant extends NotificationProvider {
+    name = "HomeAssistant";
+
+    async send(notification, message, monitor = null, heartbeat = null) {
+        const notificationService = notification?.notificationService || defaultNotificationService;
+
+        try {
+            await axios.post(
+                `${notification.homeAssistantUrl}/api/services/notify/${notificationService}`,
+                {
+                    title: "Uptime Kuma",
+                    message,
+                    ...(notificationService !== "persistent_notification" && { data: {
+                        name: monitor?.name,
+                        status: heartbeat?.status,
+                    } }),
+                },
+                {
+                    headers: {
+                        Authorization: `Bearer ${notification.longLivedAccessToken}`,
+                        "Content-Type": "application/json",
+                    },
+                }
+            );
+
+            return "Sent Successfully.";
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+}
+
+module.exports = HomeAssistant;
diff --git a/server/notification.js b/server/notification.js
index c457ed14..c86983fa 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -35,6 +35,7 @@ const Gorush = require("./notification-providers/gorush");
 const Alerta = require("./notification-providers/alerta");
 const OneBot = require("./notification-providers/onebot");
 const PushDeer = require("./notification-providers/pushdeer");
+const HomeAssistant = require("./notification-providers/home-assistant");
 
 class Notification {
 
@@ -82,6 +83,7 @@ class Notification {
             new Alerta(),
             new OneBot(),
             new PushDeer(),
+            new HomeAssistant(),
         ];
 
         for (let item of list) {
diff --git a/src/components/notifications/HomeAssistant.vue b/src/components/notifications/HomeAssistant.vue
new file mode 100644
index 00000000..67e370a1
--- /dev/null
+++ b/src/components/notifications/HomeAssistant.vue
@@ -0,0 +1,40 @@
+<template>
+    <div class="mb-3">
+        <label for="homeAssistantUrl" class="form-label">{{ $t("Home Assistant URL") }}<span style="color: red;"><sup>*</sup></span></label>
+        <input id="homeAssistantUrl" v-model="$parent.notification.homeAssistantUrl" type="url" class="form-control" required>
+    </div>
+
+    <div class="mb-3">
+        <label for="longLivedAccessToken" class="form-label">{{ $t("Long-Lived Access Token") }}<span style="color: red;"><sup>*</sup></span></label>
+        <input id="longLivedAccessToken" v-model="$parent.notification.longLivedAccessToken" type="text" class="form-control" required>
+
+        <div class="form-text">
+            <p>{{ $t("Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ") }}</p>
+        </div>
+    </div>
+
+    <div class="mb-3">
+        <label for="notificationService" class="form-label">{{ $t("Notification Service") }}</label>
+        <input id="notificationService" v-model="$parent.notification.notificationService" type="text" :placeholder="$t('default: notify all devices')" class="form-control">
+
+        <div class="form-text">
+            <p>{{ $t("A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.") }}</p>
+            <p>{{ $t("Automations can optionally be triggered in Home Assistant:") }}</p>
+            <p>
+                {{ $t("Trigger type:") }} <code>Event</code><br />
+                {{ $t("Event type:") }} <code>call_service</code><br />
+                {{ $t("Event data:") }}
+            </p>
+            <pre>domain: notify
+service: mobile_app_my_phone # change to your device name
+service_data:
+  title: Uptime Kuma
+  data:
+    status: 0 # 0=down 1=up
+    # name: Optional Uptime Kuma Monitor Name to filter by</pre>
+            <p>
+                {{ $t("Then choose an action, for example switch the scene to where an RGB light is red.") }}
+            </p>
+        </div>
+    </div>
+</template>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 18c316a5..cd0acabb 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -33,6 +33,7 @@ import Gorush from "./Gorush.vue";
 import Alerta from "./Alerta.vue";
 import OneBot from "./OneBot.vue";
 import PushDeer from "./PushDeer.vue";
+import HomeAssistant from "./HomeAssistant.vue";
 
 /**
  * Manage all notification form.
@@ -75,6 +76,7 @@ const NotificationFormList = {
     "alerta": Alerta,
     "OneBot": OneBot,
     "PushDeer": PushDeer,
+    "HomeAssistant": HomeAssistant,
 };
 
 export default NotificationFormList;
diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index b2c185d9..1a6d351a 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -536,4 +536,5 @@ export default {
     Domain: "Домейн",
     Workstation: "Работна станция",
     disableCloudflaredNoAuthMsg: "Тъй като сте в режим \"No Auth mode\", парола не се изисква.",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
index 1ad47fd3..135c0d4c 100644
--- a/src/languages/cs-CZ.js
+++ b/src/languages/cs-CZ.js
@@ -364,4 +364,5 @@ export default {
     smtpDkimHashAlgo: "Hashovací algoritmus (volitelné)",
     smtpDkimheaderFieldNames: "Podepisovat tyto hlavičky (volitelné)",
     smtpDkimskipFields: "Nepodepisovat tyto hlavičky (volitelné)",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js
index 83cd97ba..4b0f04d9 100644
--- a/src/languages/da-DK.js
+++ b/src/languages/da-DK.js
@@ -352,4 +352,5 @@ export default {
     serwersmsPhoneNumber: "Telefonnummer",
     serwersmsSenderName: "SMS Afsender Navn (registreret via kundeportal)",
     stackfield: "Stackfield",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index 3df13b94..107adca4 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -455,4 +455,5 @@ export default {
     "Domain Names": "Domainnamen",
     signedInDisp: "Angemeldet als {0}",
     signedInDispDisabled: "Authentifizierung deaktiviert.",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/en.js b/src/languages/en.js
index 9aeedd9d..d80c3c8d 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -536,4 +536,5 @@ export default {
     "Domain": "Domain",
     "Workstation": "Workstation",
     disableCloudflaredNoAuthMsg: "You are in No Auth mode, password is not require.",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js
index 31538295..7b3af365 100644
--- a/src/languages/es-ES.js
+++ b/src/languages/es-ES.js
@@ -206,4 +206,5 @@ export default {
     records: "registros",
     "One record": "Un registro",
     steamApiKeyDescription: "Para monitorear un servidor de juegos de Steam, necesita una clave Steam Web-API. Puede registrar su clave API aquí: ",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/et-EE.js b/src/languages/et-EE.js
index f581a699..448577a7 100644
--- a/src/languages/et-EE.js
+++ b/src/languages/et-EE.js
@@ -206,4 +206,5 @@ export default {
     alertaApiKey: "API võti",
     alertaAlertState: "Häireseisund",
     alertaRecoverState: "Taasta algolek",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/eu.js b/src/languages/eu.js
index c99f1eb7..00a7a5f6 100644
--- a/src/languages/eu.js
+++ b/src/languages/eu.js
@@ -536,4 +536,5 @@ export default {
     Domain: "Domeinua",
     Workstation: "Lan gunea",
     disableCloudflaredNoAuthMsg: "Ez Auth moduan zaude, pasahitza ez da beharrezkoa.",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/fa.js b/src/languages/fa.js
index 52845192..fc7eec9e 100644
--- a/src/languages/fa.js
+++ b/src/languages/fa.js
@@ -205,4 +205,5 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 00abe8d3..d6e74635 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -309,4 +309,5 @@ export default {
     alertaApiKey: "Clé de l'API",
     alertaAlertState: "État de l'Alerte",
     alertaRecoverState: "État de récupération",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js
index bebd2c56..5bdc6983 100644
--- a/src/languages/hr-HR.js
+++ b/src/languages/hr-HR.js
@@ -375,4 +375,5 @@ export default {
     alertaAlertState: "Stanje upozorenja",
     alertaRecoverState: "Stanje oporavka",
     deleteStatusPageMsg: "Sigurno želite obrisati ovu statusnu stranicu?",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/hu.js b/src/languages/hu.js
index e6118c9e..cb53ca8b 100644
--- a/src/languages/hu.js
+++ b/src/languages/hu.js
@@ -373,4 +373,5 @@ export default {
     alertaAlertState: "Figyelmeztetési állapot",
     alertaRecoverState: "Visszaállási állapot",
     deleteStatusPageMsg: "Biztos, hogy törölni akarja a státusz oldalt?",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index 0a065308..1e8499fd 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -283,4 +283,5 @@ export default {
     promosmsPhoneNumber: "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
     promosmsSMSSender: "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
     "Feishu WebHookUrl": "Feishu WebHookUrl",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js
index f5276183..5b593c0b 100644
--- a/src/languages/it-IT.js
+++ b/src/languages/it-IT.js
@@ -364,4 +364,5 @@ export default {
     smtpDkimheaderFieldNames: "Campi Intestazione da firmare (opzionale)",
     smtpDkimskipFields: "Campi Intestazione da non firmare (opzionale)",
     GoogleChat: "Google Chat (solo per Google Workspace)",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/ja.js b/src/languages/ja.js
index 187ade0c..c53a6334 100644
--- a/src/languages/ja.js
+++ b/src/languages/ja.js
@@ -198,4 +198,5 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index dbb02e65..50f6222a 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -528,4 +528,5 @@ export default {
     "Go back to the previous page.": "이전 페이지로 돌아가기",
     "Coming Soon": "Coming Soon",
     wayToGetClickSendSMSToken: "{0}에서 API 사용자 이름과 키를 얻을 수 있어요.",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/nb-NO.js b/src/languages/nb-NO.js
index 96f71d97..6d54ec82 100644
--- a/src/languages/nb-NO.js
+++ b/src/languages/nb-NO.js
@@ -282,4 +282,5 @@ export default {
     promosmsTypeSpeed: "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
     promosmsPhoneNumber: "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
     promosmsSMSSender: "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js
index 3b6ebd83..f3f95267 100644
--- a/src/languages/nl-NL.js
+++ b/src/languages/nl-NL.js
@@ -462,4 +462,5 @@ export default {
     "Footer Text": "Footer Tekst",
     "Show Powered By": "Laat 'Mogeljik gemaakt door' zien",
     "Domain Names": "Domein Namen",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/pl.js b/src/languages/pl.js
index 3e962746..fe533bba 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -467,4 +467,5 @@ export default {
     "Domain Names": "Domeny",
     signedInDisp: "Zalogowany jako {0}",
     signedInDispDisabled: "Autoryzacja wyłączona.",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/pt-BR.js b/src/languages/pt-BR.js
index 7bc8d0fd..4c03c4a6 100644
--- a/src/languages/pt-BR.js
+++ b/src/languages/pt-BR.js
@@ -200,4 +200,5 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js
index 0aaf0968..cb7b70ee 100644
--- a/src/languages/ru-RU.js
+++ b/src/languages/ru-RU.js
@@ -400,4 +400,5 @@ export default {
     proxyDescription: "Прокси должны быть привязаны к монитору, чтобы работать.",
     enableProxyDescription: "Этот прокси не будет влиять на запросы монитора, пока не будет активирован. Вы можете контролировать временное отключение прокси для всех мониторов через статус активации.",
     setAsDefaultProxyDescription: "Этот прокси будет по умолчанию включен для новых мониторов. Вы всё ещё можете отдельно отключать прокси в каждом мониторе.",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/sl-SI.js b/src/languages/sl-SI.js
index 3c8497f0..1ad70828 100644
--- a/src/languages/sl-SI.js
+++ b/src/languages/sl-SI.js
@@ -354,4 +354,5 @@ export default {
     serwersmsPhoneNumber: "Telefonska številka",
     serwersmsSenderName: "Ime SMS pošiljatelja (registrirani prek portala za stranke)",
     "stackfield": "Stackfield",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js
index 32e074ee..1bc2bb63 100644
--- a/src/languages/sr-latn.js
+++ b/src/languages/sr-latn.js
@@ -201,4 +201,5 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/sr.js b/src/languages/sr.js
index bd8e4dd3..d811ec55 100644
--- a/src/languages/sr.js
+++ b/src/languages/sr.js
@@ -201,4 +201,5 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js
index 1fc35be1..35c8d4b3 100644
--- a/src/languages/sv-SE.js
+++ b/src/languages/sv-SE.js
@@ -107,4 +107,5 @@ export default {
     "Repeat Password": "Upprepa Lösenord",
     respTime: "Svarstid (ms)",
     notAvailableShort: "Ej Tillg.",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
index a573206b..1893e442 100644
--- a/src/languages/th-TH.js
+++ b/src/languages/th-TH.js
@@ -518,4 +518,5 @@ export default {
     "Go back to the previous page.": "กลับไปที่หน้าก่อนหน้า",
     "Coming Soon": "เร็ว ๆ นี้",
     wayToGetClickSendSMSToken: "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index 215b5381..7ae7e647 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -527,4 +527,5 @@ export default {
     "do nothing": "hiçbir şey yapma",
     "auto acknowledged": "otomatik onaylama",
     "auto resolve": "otomatik çözümleme",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/uk-UA.js b/src/languages/uk-UA.js
index 51802a39..fe3da3e3 100644
--- a/src/languages/uk-UA.js
+++ b/src/languages/uk-UA.js
@@ -392,4 +392,5 @@ export default {
     alertaAlertState: "Стан алерту",
     alertaRecoverState: "Стан відновлення",
     deleteStatusPageMsg: "Дійсно хочете видалити цю сторінку статусів?",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/vi-VN.js b/src/languages/vi-VN.js
index 505776f0..38d3d970 100644
--- a/src/languages/vi-VN.js
+++ b/src/languages/vi-VN.js
@@ -466,4 +466,5 @@ export default {
     "Domain Names": "Domain Names",
     signedInDisp: "Signed in as {0}",
     signedInDispDisabled: "Auth Disabled.",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index 67077f38..8ae84b3e 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -540,4 +540,5 @@ export default {
     "ntfy Topic": "ntfy 主题",
     "Domain": "域名",
     "Workstation": "工作站",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js
index a55f4fb6..ac9069be 100644
--- a/src/languages/zh-HK.js
+++ b/src/languages/zh-HK.js
@@ -380,4 +380,5 @@ export default {
     proxyDescription: "必須將代理伺服器指派給監測器才能運作。",
     enableProxyDescription: "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
     setAsDefaultProxyDescription: "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
+    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
index ace32e17..f3ceefd5 100644
--- a/src/languages/zh-TW.js
+++ b/src/languages/zh-TW.js
@@ -465,4 +465,5 @@ export default {
     "Footer Text": "頁尾文字",
     "Show Powered By": "顯示技術支援文字",
     "Domain Names": "網域名稱",
+    HomeAssistant: "Home Assistant",
 };

From 5dd197374dff744cb765175b0e4eb65271d4dbd1 Mon Sep 17 00:00:00 2001
From: rmt/src <144435+rmtsrc@users.noreply.github.com>
Date: Sun, 26 Jun 2022 10:56:46 +0100
Subject: [PATCH 053/803] fix: only add en translation

---
 src/languages/bg-BG.js   | 1 -
 src/languages/cs-CZ.js   | 1 -
 src/languages/da-DK.js   | 1 -
 src/languages/de-DE.js   | 1 -
 src/languages/es-ES.js   | 1 -
 src/languages/et-EE.js   | 1 -
 src/languages/eu.js      | 1 -
 src/languages/fa.js      | 1 -
 src/languages/fr-FR.js   | 1 -
 src/languages/hr-HR.js   | 1 -
 src/languages/hu.js      | 1 -
 src/languages/id-ID.js   | 1 -
 src/languages/it-IT.js   | 1 -
 src/languages/ja.js      | 1 -
 src/languages/ko-KR.js   | 1 -
 src/languages/nb-NO.js   | 1 -
 src/languages/nl-NL.js   | 1 -
 src/languages/pl.js      | 1 -
 src/languages/pt-BR.js   | 1 -
 src/languages/ru-RU.js   | 1 -
 src/languages/sl-SI.js   | 1 -
 src/languages/sr-latn.js | 1 -
 src/languages/sr.js      | 1 -
 src/languages/sv-SE.js   | 1 -
 src/languages/th-TH.js   | 1 -
 src/languages/tr-TR.js   | 1 -
 src/languages/uk-UA.js   | 1 -
 src/languages/vi-VN.js   | 1 -
 src/languages/zh-CN.js   | 1 -
 src/languages/zh-HK.js   | 1 -
 src/languages/zh-TW.js   | 1 -
 31 files changed, 31 deletions(-)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 1a6d351a..b2c185d9 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -536,5 +536,4 @@ export default {
     Domain: "Домейн",
     Workstation: "Работна станция",
     disableCloudflaredNoAuthMsg: "Тъй като сте в режим \"No Auth mode\", парола не се изисква.",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
index 135c0d4c..1ad47fd3 100644
--- a/src/languages/cs-CZ.js
+++ b/src/languages/cs-CZ.js
@@ -364,5 +364,4 @@ export default {
     smtpDkimHashAlgo: "Hashovací algoritmus (volitelné)",
     smtpDkimheaderFieldNames: "Podepisovat tyto hlavičky (volitelné)",
     smtpDkimskipFields: "Nepodepisovat tyto hlavičky (volitelné)",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js
index 4b0f04d9..83cd97ba 100644
--- a/src/languages/da-DK.js
+++ b/src/languages/da-DK.js
@@ -352,5 +352,4 @@ export default {
     serwersmsPhoneNumber: "Telefonnummer",
     serwersmsSenderName: "SMS Afsender Navn (registreret via kundeportal)",
     stackfield: "Stackfield",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index 107adca4..3df13b94 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -455,5 +455,4 @@ export default {
     "Domain Names": "Domainnamen",
     signedInDisp: "Angemeldet als {0}",
     signedInDispDisabled: "Authentifizierung deaktiviert.",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js
index 7b3af365..31538295 100644
--- a/src/languages/es-ES.js
+++ b/src/languages/es-ES.js
@@ -206,5 +206,4 @@ export default {
     records: "registros",
     "One record": "Un registro",
     steamApiKeyDescription: "Para monitorear un servidor de juegos de Steam, necesita una clave Steam Web-API. Puede registrar su clave API aquí: ",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/et-EE.js b/src/languages/et-EE.js
index 448577a7..f581a699 100644
--- a/src/languages/et-EE.js
+++ b/src/languages/et-EE.js
@@ -206,5 +206,4 @@ export default {
     alertaApiKey: "API võti",
     alertaAlertState: "Häireseisund",
     alertaRecoverState: "Taasta algolek",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/eu.js b/src/languages/eu.js
index 00a7a5f6..c99f1eb7 100644
--- a/src/languages/eu.js
+++ b/src/languages/eu.js
@@ -536,5 +536,4 @@ export default {
     Domain: "Domeinua",
     Workstation: "Lan gunea",
     disableCloudflaredNoAuthMsg: "Ez Auth moduan zaude, pasahitza ez da beharrezkoa.",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/fa.js b/src/languages/fa.js
index fc7eec9e..52845192 100644
--- a/src/languages/fa.js
+++ b/src/languages/fa.js
@@ -205,5 +205,4 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index d6e74635..00abe8d3 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -309,5 +309,4 @@ export default {
     alertaApiKey: "Clé de l'API",
     alertaAlertState: "État de l'Alerte",
     alertaRecoverState: "État de récupération",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js
index 5bdc6983..bebd2c56 100644
--- a/src/languages/hr-HR.js
+++ b/src/languages/hr-HR.js
@@ -375,5 +375,4 @@ export default {
     alertaAlertState: "Stanje upozorenja",
     alertaRecoverState: "Stanje oporavka",
     deleteStatusPageMsg: "Sigurno želite obrisati ovu statusnu stranicu?",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/hu.js b/src/languages/hu.js
index cb53ca8b..e6118c9e 100644
--- a/src/languages/hu.js
+++ b/src/languages/hu.js
@@ -373,5 +373,4 @@ export default {
     alertaAlertState: "Figyelmeztetési állapot",
     alertaRecoverState: "Visszaállási állapot",
     deleteStatusPageMsg: "Biztos, hogy törölni akarja a státusz oldalt?",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index 1e8499fd..0a065308 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -283,5 +283,4 @@ export default {
     promosmsPhoneNumber: "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
     promosmsSMSSender: "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
     "Feishu WebHookUrl": "Feishu WebHookUrl",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js
index 5b593c0b..f5276183 100644
--- a/src/languages/it-IT.js
+++ b/src/languages/it-IT.js
@@ -364,5 +364,4 @@ export default {
     smtpDkimheaderFieldNames: "Campi Intestazione da firmare (opzionale)",
     smtpDkimskipFields: "Campi Intestazione da non firmare (opzionale)",
     GoogleChat: "Google Chat (solo per Google Workspace)",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/ja.js b/src/languages/ja.js
index c53a6334..187ade0c 100644
--- a/src/languages/ja.js
+++ b/src/languages/ja.js
@@ -198,5 +198,4 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index 50f6222a..dbb02e65 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -528,5 +528,4 @@ export default {
     "Go back to the previous page.": "이전 페이지로 돌아가기",
     "Coming Soon": "Coming Soon",
     wayToGetClickSendSMSToken: "{0}에서 API 사용자 이름과 키를 얻을 수 있어요.",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/nb-NO.js b/src/languages/nb-NO.js
index 6d54ec82..96f71d97 100644
--- a/src/languages/nb-NO.js
+++ b/src/languages/nb-NO.js
@@ -282,5 +282,4 @@ export default {
     promosmsTypeSpeed: "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
     promosmsPhoneNumber: "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
     promosmsSMSSender: "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js
index f3f95267..3b6ebd83 100644
--- a/src/languages/nl-NL.js
+++ b/src/languages/nl-NL.js
@@ -462,5 +462,4 @@ export default {
     "Footer Text": "Footer Tekst",
     "Show Powered By": "Laat 'Mogeljik gemaakt door' zien",
     "Domain Names": "Domein Namen",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/pl.js b/src/languages/pl.js
index fe533bba..3e962746 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -467,5 +467,4 @@ export default {
     "Domain Names": "Domeny",
     signedInDisp: "Zalogowany jako {0}",
     signedInDispDisabled: "Autoryzacja wyłączona.",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/pt-BR.js b/src/languages/pt-BR.js
index 4c03c4a6..7bc8d0fd 100644
--- a/src/languages/pt-BR.js
+++ b/src/languages/pt-BR.js
@@ -200,5 +200,4 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js
index cb7b70ee..0aaf0968 100644
--- a/src/languages/ru-RU.js
+++ b/src/languages/ru-RU.js
@@ -400,5 +400,4 @@ export default {
     proxyDescription: "Прокси должны быть привязаны к монитору, чтобы работать.",
     enableProxyDescription: "Этот прокси не будет влиять на запросы монитора, пока не будет активирован. Вы можете контролировать временное отключение прокси для всех мониторов через статус активации.",
     setAsDefaultProxyDescription: "Этот прокси будет по умолчанию включен для новых мониторов. Вы всё ещё можете отдельно отключать прокси в каждом мониторе.",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/sl-SI.js b/src/languages/sl-SI.js
index 1ad70828..3c8497f0 100644
--- a/src/languages/sl-SI.js
+++ b/src/languages/sl-SI.js
@@ -354,5 +354,4 @@ export default {
     serwersmsPhoneNumber: "Telefonska številka",
     serwersmsSenderName: "Ime SMS pošiljatelja (registrirani prek portala za stranke)",
     "stackfield": "Stackfield",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js
index 1bc2bb63..32e074ee 100644
--- a/src/languages/sr-latn.js
+++ b/src/languages/sr-latn.js
@@ -201,5 +201,4 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/sr.js b/src/languages/sr.js
index d811ec55..bd8e4dd3 100644
--- a/src/languages/sr.js
+++ b/src/languages/sr.js
@@ -201,5 +201,4 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js
index 35c8d4b3..1fc35be1 100644
--- a/src/languages/sv-SE.js
+++ b/src/languages/sv-SE.js
@@ -107,5 +107,4 @@ export default {
     "Repeat Password": "Upprepa Lösenord",
     respTime: "Svarstid (ms)",
     notAvailableShort: "Ej Tillg.",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
index 1893e442..a573206b 100644
--- a/src/languages/th-TH.js
+++ b/src/languages/th-TH.js
@@ -518,5 +518,4 @@ export default {
     "Go back to the previous page.": "กลับไปที่หน้าก่อนหน้า",
     "Coming Soon": "เร็ว ๆ นี้",
     wayToGetClickSendSMSToken: "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index 7ae7e647..215b5381 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -527,5 +527,4 @@ export default {
     "do nothing": "hiçbir şey yapma",
     "auto acknowledged": "otomatik onaylama",
     "auto resolve": "otomatik çözümleme",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/uk-UA.js b/src/languages/uk-UA.js
index fe3da3e3..51802a39 100644
--- a/src/languages/uk-UA.js
+++ b/src/languages/uk-UA.js
@@ -392,5 +392,4 @@ export default {
     alertaAlertState: "Стан алерту",
     alertaRecoverState: "Стан відновлення",
     deleteStatusPageMsg: "Дійсно хочете видалити цю сторінку статусів?",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/vi-VN.js b/src/languages/vi-VN.js
index 38d3d970..505776f0 100644
--- a/src/languages/vi-VN.js
+++ b/src/languages/vi-VN.js
@@ -466,5 +466,4 @@ export default {
     "Domain Names": "Domain Names",
     signedInDisp: "Signed in as {0}",
     signedInDispDisabled: "Auth Disabled.",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index 8ae84b3e..67077f38 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -540,5 +540,4 @@ export default {
     "ntfy Topic": "ntfy 主题",
     "Domain": "域名",
     "Workstation": "工作站",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js
index ac9069be..a55f4fb6 100644
--- a/src/languages/zh-HK.js
+++ b/src/languages/zh-HK.js
@@ -380,5 +380,4 @@ export default {
     proxyDescription: "必須將代理伺服器指派給監測器才能運作。",
     enableProxyDescription: "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
     setAsDefaultProxyDescription: "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
-    HomeAssistant: "Home Assistant",
 };
diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
index f3ceefd5..ace32e17 100644
--- a/src/languages/zh-TW.js
+++ b/src/languages/zh-TW.js
@@ -465,5 +465,4 @@ export default {
     "Footer Text": "頁尾文字",
     "Show Powered By": "顯示技術支援文字",
     "Domain Names": "網域名稱",
-    HomeAssistant: "Home Assistant",
 };

From 42e30de2099f95f3076d65f78c5e517ff56da952 Mon Sep 17 00:00:00 2001
From: Thomas Christlieb <thomaschristlieb@hotmail.com>
Date: Mon, 4 Jul 2022 10:16:33 +0200
Subject: [PATCH 054/803] change page title to " - Login" when on Login Form

---
 src/components/Login.vue | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/components/Login.vue b/src/components/Login.vue
index 3a821881..0a0266e7 100644
--- a/src/components/Login.vue
+++ b/src/components/Login.vue
@@ -54,6 +54,15 @@ export default {
             tokenRequired: false,
         };
     },
+
+    mounted() {
+        document.title += " - Login";
+    },
+
+    unmounted() {
+        document.title = document.title.replace(" - Login", "");
+    },
+
     methods: {
         /** Submit the user details and attempt to log in */
         submit() {

From 219b00f660790f04285224a33fc36d70b38ad620 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 13 Jul 2022 23:08:35 +0100
Subject: [PATCH 055/803] [empty commit] pull request for #1891 set ping size


From a54e58b4d6bc5f6eabe161fbdc0709dfadd69189 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Thu, 14 Jul 2022 08:32:51 +0100
Subject: [PATCH 056/803] Added Ping packet size #1891

This should fully implement #1891 by adding an extra field to the edit
monitor page and an extra column to the database. The user can now
set the size of the packet to send, it defaults to 56. A maximum limit
of 65500 was chosen to ensure that the total size of the packet does
not exceed the IPv4 maximum packet size and to comply with the limit
imposed by Windows.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 db/patch-ping-packet-size.sql |  5 +++++
 server/database.js            |  1 +
 server/model/monitor.js       |  5 +++--
 server/ping-lite.js           |  8 ++++----
 server/server.js              |  1 +
 server/util-server.js         | 13 ++++++++-----
 src/languages/en.js           |  1 +
 src/pages/EditMonitor.vue     |  7 +++++++
 8 files changed, 30 insertions(+), 11 deletions(-)
 create mode 100644 db/patch-ping-packet-size.sql

diff --git a/db/patch-ping-packet-size.sql b/db/patch-ping-packet-size.sql
new file mode 100644
index 00000000..d65ec8ed
--- /dev/null
+++ b/db/patch-ping-packet-size.sql
@@ -0,0 +1,5 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+ALTER TABLE monitor
+    ADD packet_size INTEGER DEFAULT 56 NOT NULL;
+COMMIT;
diff --git a/server/database.js b/server/database.js
index 00fd48d9..3d5508f7 100644
--- a/server/database.js
+++ b/server/database.js
@@ -61,6 +61,7 @@ class Database {
         "patch-add-clickable-status-page-link.sql": true,
         "patch-add-sqlserver-monitor.sql": true,
         "patch-add-other-auth.sql": { parents: [ "patch-monitor-basic-auth.sql" ] },
+        "patch-ping-packet-size.sql": true,
     };
 
     /**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index b8733a0b..6ce7322b 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -82,6 +82,7 @@ class Monitor extends BeanModel {
             expiryNotification: this.isEnabledExpiryNotification(),
             ignoreTls: this.getIgnoreTls(),
             upsideDown: this.isUpsideDown(),
+            packetSize: this.packetSize,
             maxredirects: this.maxredirects,
             accepted_statuscodes: this.getAcceptedStatuscodes(),
             dns_resolve_type: this.dns_resolve_type,
@@ -352,7 +353,7 @@ class Monitor extends BeanModel {
                     bean.status = UP;
 
                 } else if (this.type === "ping") {
-                    bean.ping = await ping(this.hostname);
+                    bean.ping = await ping(this.hostname, this.packetSize);
                     bean.msg = "";
                     bean.status = UP;
                 } else if (this.type === "dns") {
@@ -459,7 +460,7 @@ class Monitor extends BeanModel {
                         bean.msg = res.data.response.servers[0].name;
 
                         try {
-                            bean.ping = await ping(this.hostname);
+                            bean.ping = await ping(this.hostname, this.packetSize);
                         } catch (_) { }
                     } else {
                         throw new Error("Server not found on Steam");
diff --git a/server/ping-lite.js b/server/ping-lite.js
index b7d003b8..c1686dd9 100644
--- a/server/ping-lite.js
+++ b/server/ping-lite.js
@@ -28,13 +28,13 @@ function Ping(host, options) {
 
     if (util.WIN) {
         this._bin = "c:/windows/system32/ping.exe";
-        this._args = (options.args) ? options.args : [ "-n", "1", "-w", timeout * 1000, host ];
+        this._args = (options.args) ? options.args : [ "-n", "1", "-w", timeout * 1000, "-l", this._options.size, host ];
         this._regmatch = /[><=]([0-9.]+?)ms/;
 
     } else if (util.LIN) {
         this._bin = "/bin/ping";
 
-        const defaultArgs = [ "-n", "-w", timeout, "-c", "1", host ];
+        const defaultArgs = [ "-n", "-w", timeout, "-c", "1", "-s", this._options.size, host ];
 
         if (net.isIPv6(host) || options.ipv6) {
             defaultArgs.unshift("-6");
@@ -51,13 +51,13 @@ function Ping(host, options) {
             this._bin = "/sbin/ping";
         }
 
-        this._args = (options.args) ? options.args : [ "-n", "-t", timeout, "-c", "1", host ];
+        this._args = (options.args) ? options.args : [ "-n", "-t", timeout, "-c", "1", "-s", this._options.size, host ];
         this._regmatch = /=([0-9.]+?) ms/;
 
     } else if (util.BSD) {
         this._bin = "/sbin/ping";
 
-        const defaultArgs = [ "-n", "-t", timeout, "-c", "1", host ];
+        const defaultArgs = [ "-n", "-t", timeout, "-c", "1", "-s", this._options.size, host ];
 
         if (net.isIPv6(host) || options.ipv6) {
             defaultArgs.unshift("-6");
diff --git a/server/server.js b/server/server.js
index 2d3f37ee..72adbb2a 100644
--- a/server/server.js
+++ b/server/server.js
@@ -659,6 +659,7 @@ let needSetup = false;
                 bean.ignoreTls = monitor.ignoreTls;
                 bean.expiryNotification = monitor.expiryNotification;
                 bean.upsideDown = monitor.upsideDown;
+                bean.packetSize = monitor.packetSize;
                 bean.maxredirects = monitor.maxredirects;
                 bean.accepted_statuscodes_json = JSON.stringify(monitor.accepted_statuscodes);
                 bean.dns_resolve_type = monitor.dns_resolve_type;
diff --git a/server/util-server.js b/server/util-server.js
index f6a0e396..bc49a6c7 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -70,15 +70,16 @@ exports.tcping = function (hostname, port) {
 /**
  * Ping the specified machine
  * @param {string} hostname Hostname / address of machine
+ * @param {number} [size=56] Size of packet to send
  * @returns {Promise<number>} Time for ping in ms rounded to nearest integer
  */
-exports.ping = async (hostname) => {
+exports.ping = async (hostname, size = 56) => {
     try {
-        return await exports.pingAsync(hostname);
+        return await exports.pingAsync(hostname, false, size );
     } catch (e) {
         // If the host cannot be resolved, try again with ipv6
         if (e.message.includes("service not known")) {
-            return await exports.pingAsync(hostname, true);
+            return await exports.pingAsync(hostname, true, size);
         } else {
             throw e;
         }
@@ -89,12 +90,14 @@ exports.ping = async (hostname) => {
  * Ping the specified machine
  * @param {string} hostname Hostname / address of machine to ping
  * @param {boolean} ipv6 Should IPv6 be used?
+ * @param {number} [size=56] Size of ping packet to send
  * @returns {Promise<number>} Time for ping in ms rounded to nearest integer
  */
-exports.pingAsync = function (hostname, ipv6 = false) {
+exports.pingAsync = function (hostname, ipv6 = false, size = 56) {
     return new Promise((resolve, reject) => {
         const ping = new Ping(hostname, {
-            ipv6
+            ipv6,
+            size
         });
 
         ping.send(function (err, ms, stdout) {
diff --git a/src/languages/en.js b/src/languages/en.js
index 9aeedd9d..4f3b2abb 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -536,4 +536,5 @@ export default {
     "Domain": "Domain",
     "Workstation": "Workstation",
     disableCloudflaredNoAuthMsg: "You are in No Auth mode, password is not require.",
+    "Packet Size": "Packet Size",
 };
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index f8791d3f..737afa70 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -230,6 +230,12 @@
                                 </div>
                             </div>
 
+                            <!-- Ping packet size -->
+                            <div v-if="monitor.type === 'ping'" class="my-3">
+                                <label for="packet-size" class="form-label">{{ $t("Packet Size") }}</label>
+                                <input id="packet-size" v-model="monitor.packetSize" type="number" class="form-control" required min="1" max="65500" step="1">
+                            </div>
+
                             <!-- HTTP / Keyword only -->
                             <template v-if="monitor.type === 'http' || monitor.type === 'keyword' ">
                                 <div class="my-3">
@@ -589,6 +595,7 @@ export default {
                     notificationIDList: {},
                     ignoreTls: false,
                     upsideDown: false,
+                    packetSize: 56,
                     expiryNotification: false,
                     maxredirects: 10,
                     accepted_statuscodes: [ "200-299" ],

From b5f04573f2488344d3956b39d94ea04cb690be1b Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Thu, 14 Jul 2022 09:19:40 +0100
Subject: [PATCH 057/803] Added formatting to ping options

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 server/util-server.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/util-server.js b/server/util-server.js
index bc49a6c7..e924caf0 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -97,7 +97,7 @@ exports.pingAsync = function (hostname, ipv6 = false, size = 56) {
     return new Promise((resolve, reject) => {
         const ping = new Ping(hostname, {
             ipv6,
-            size
+            size,
         });
 
         ping.send(function (err, ms, stdout) {

From 90c2bf7c94ab66f3c0e12e0b2e8b81b3873f42d5 Mon Sep 17 00:00:00 2001
From: Jan Hartje <github@janhartje.com>
Date: Mon, 18 Jul 2022 15:56:53 +0000
Subject: [PATCH 058/803] [empty commit] pull request for #1919


From 95dba6dcaf3eca33cc727b91ee7545d3c33a3a1b Mon Sep 17 00:00:00 2001
From: Jan Hartje <github@janhartje.com>
Date: Mon, 18 Jul 2022 16:04:18 +0000
Subject: [PATCH 059/803] feat(notification): add Authorization Header option
 to frontend

---
 src/components/notifications/Webhook.vue | 42 +++++++++++++++++++-----
 1 file changed, 34 insertions(+), 8 deletions(-)

diff --git a/src/components/notifications/Webhook.vue b/src/components/notifications/Webhook.vue
index 84ad0a6c..241ecd9a 100644
--- a/src/components/notifications/Webhook.vue
+++ b/src/components/notifications/Webhook.vue
@@ -1,18 +1,26 @@
 <template>
     <div class="mb-3">
         <label for="webhook-url" class="form-label">{{ $t("Post URL") }}</label>
-        <input id="webhook-url" v-model="$parent.notification.webhookURL" type="url" pattern="https?://.+" class="form-control" required>
+        <input
+            id="webhook-url"
+            v-model="$parent.notification.webhookURL"
+            type="url"
+            pattern="https?://.+"
+            class="form-control"
+            required
+        />
     </div>
 
     <div class="mb-3">
         <label for="webhook-content-type" class="form-label">{{ $t("Content Type") }}</label>
-        <select id="webhook-content-type" v-model="$parent.notification.webhookContentType" class="form-select" required>
-            <option value="json">
-                application/json
-            </option>
-            <option value="form-data">
-                multipart/form-data
-            </option>
+        <select
+            id="webhook-content-type"
+            v-model="$parent.notification.webhookContentType"
+            class="form-select"
+            required
+        >
+            <option value="json">application/json</option>
+            <option value="form-data">multipart/form-data</option>
         </select>
 
         <div class="form-text">
@@ -25,4 +33,22 @@
             </i18n-t>
         </div>
     </div>
+
+    <div class="mb-3">
+        <label for="authorization-header" class="form-label">{{ $t("Authorization Header") }}</label>
+        <HiddenInput
+            id="authorization-header"
+            v-model="$parent.notification.webhookAuthorizationHeader"
+            autocomplete="one-time-code"
+        ></HiddenInput>
+    </div>
 </template>
+
+<script>
+import HiddenInput from "../HiddenInput.vue";
+export default {
+    components: {
+        HiddenInput,
+    },
+};
+</script>

From af07c7f050b1458b5b6b4cc36c7613f53e28b276 Mon Sep 17 00:00:00 2001
From: Jan Hartje <github@janhartje.com>
Date: Mon, 18 Jul 2022 16:04:27 +0000
Subject: [PATCH 060/803] feat(notification): add Authorization Header option
 to backend

---
 server/notification-providers/webhook.js | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/server/notification-providers/webhook.js b/server/notification-providers/webhook.js
index d4933cf0..ca1c106a 100644
--- a/server/notification-providers/webhook.js
+++ b/server/notification-providers/webhook.js
@@ -16,20 +16,22 @@ class Webhook extends NotificationProvider {
                 msg,
             };
             let finalData;
-            let config = {};
+            let config = {
+                headers: {}
+            };
 
             if (notification.webhookContentType === "form-data") {
                 finalData = new FormData();
                 finalData.append("data", JSON.stringify(data));
-
-                config = {
-                    headers: finalData.getHeaders(),
-                };
-
+                config.headers = finalData.getHeaders();
             } else {
                 finalData = data;
             }
 
+            if (notification.webhookAuthorizationHeader) {
+                config.headers["Authorization"] = notification.webhookAuthorizationHeader;
+            }
+
             await axios.post(notification.webhookURL, finalData, config);
             return okMsg;
 

From 31c388a6e3edeb10c2d35e305d643fde359e7806 Mon Sep 17 00:00:00 2001
From: tamasmagyar <20069588+tamasmagyar@users.noreply.github.com>
Date: Thu, 16 Jun 2022 08:06:34 +0200
Subject: [PATCH 061/803] added cypress framework and tests for setup page

---
 .gitignore                             |  3 +++
 cypress.config.ts                      | 14 ++++++++++++++
 cypress/e2e/setup.cy.ts                | 24 ++++++++++++++++++++++++
 cypress/fixtures/example.json          |  5 +++++
 cypress/plugins/index.js               |  0
 cypress/support/actors/actor.ts        |  8 ++++++++
 cypress/support/commands.ts            |  0
 cypress/support/const/user-data.ts     |  4 ++++
 cypress/support/e2e.ts                 |  1 +
 cypress/support/pages/dasboard-page.ts |  3 +++
 cypress/support/pages/setup-page.ts    |  7 +++++++
 cypress/support/tasks/setup-task.ts    | 15 +++++++++++++++
 package.json                           |  5 ++++-
 src/pages/Setup.vue                    | 10 +++++-----
 tsconfig.json                          |  8 +++++---
 15 files changed, 98 insertions(+), 9 deletions(-)
 create mode 100644 cypress.config.ts
 create mode 100644 cypress/e2e/setup.cy.ts
 create mode 100644 cypress/fixtures/example.json
 create mode 100644 cypress/plugins/index.js
 create mode 100644 cypress/support/actors/actor.ts
 create mode 100644 cypress/support/commands.ts
 create mode 100644 cypress/support/const/user-data.ts
 create mode 100644 cypress/support/e2e.ts
 create mode 100644 cypress/support/pages/dasboard-page.ts
 create mode 100644 cypress/support/pages/setup-page.ts
 create mode 100644 cypress/support/tasks/setup-task.ts

diff --git a/.gitignore b/.gitignore
index cd654d90..8eb05867 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,6 @@ dist-ssr
 /out
 /tmp
 .env
+
+cypress/videos
+cypress/screenshots
diff --git a/cypress.config.ts b/cypress.config.ts
new file mode 100644
index 00000000..ceeebca3
--- /dev/null
+++ b/cypress.config.ts
@@ -0,0 +1,14 @@
+import { defineConfig } from "cypress";
+
+export default defineConfig({
+    e2e: {
+        baseUrl: "http://localhost:3000",
+        defaultCommandTimeout: 10000,
+        pageLoadTimeout: 60000,
+        viewportWidth: 1920,
+        viewportHeight: 1080,
+    },
+    env: {
+        baseUrl: "http://localhost:3000",
+    },
+});
diff --git a/cypress/e2e/setup.cy.ts b/cypress/e2e/setup.cy.ts
new file mode 100644
index 00000000..94e18ede
--- /dev/null
+++ b/cypress/e2e/setup.cy.ts
@@ -0,0 +1,24 @@
+import { actor } from "../support/actors/actor";
+import { DEFAULT_USER_DATA } from "../support/const/user-data";
+import { DashboardPage } from "../support/pages/dasboard-page";
+import { SetupPage } from "../support/pages/setup-page";
+
+describe("user can create a new account on setup page", () => {
+    before(() => {
+        cy.visit("/setup");
+    });
+
+    it("user can create new account", () => {
+        cy.url().should("be.equal", SetupPage.url);
+        actor.setupTask.fillAndSubmitSetupForm(
+            DEFAULT_USER_DATA.username,
+            DEFAULT_USER_DATA.password,
+            DEFAULT_USER_DATA.password
+        );
+
+        cy.url().should("be.equal", DashboardPage.url);
+        cy.get('[role="alert"]')
+            .should("be.visible")
+            .and("contain.text", "Added Successfully.");
+    });
+});
diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json
new file mode 100644
index 00000000..02e42543
--- /dev/null
+++ b/cypress/fixtures/example.json
@@ -0,0 +1,5 @@
+{
+  "name": "Using fixtures to represent data",
+  "email": "hello@cypress.io",
+  "body": "Fixtures are a great way to mock data for responses to routes"
+}
diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js
new file mode 100644
index 00000000..e69de29b
diff --git a/cypress/support/actors/actor.ts b/cypress/support/actors/actor.ts
new file mode 100644
index 00000000..680c26ce
--- /dev/null
+++ b/cypress/support/actors/actor.ts
@@ -0,0 +1,8 @@
+import { SetupTask } from "../tasks/setup-task";
+
+class Actor {
+    setupTask: SetupTask = new SetupTask();
+}
+
+const actor = new Actor();
+export { actor };
diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/cypress/support/const/user-data.ts b/cypress/support/const/user-data.ts
new file mode 100644
index 00000000..ee2264dd
--- /dev/null
+++ b/cypress/support/const/user-data.ts
@@ -0,0 +1,4 @@
+export const DEFAULT_USER_DATA = {
+    username: "testuser",
+    password: "testuser123",
+};
diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts
new file mode 100644
index 00000000..f887c29a
--- /dev/null
+++ b/cypress/support/e2e.ts
@@ -0,0 +1 @@
+import "./commands";
diff --git a/cypress/support/pages/dasboard-page.ts b/cypress/support/pages/dasboard-page.ts
new file mode 100644
index 00000000..48660dc1
--- /dev/null
+++ b/cypress/support/pages/dasboard-page.ts
@@ -0,0 +1,3 @@
+export const DashboardPage = {
+    url: Cypress.env("baseUrl") + "/dashboard",
+};
diff --git a/cypress/support/pages/setup-page.ts b/cypress/support/pages/setup-page.ts
new file mode 100644
index 00000000..8c1b9cfa
--- /dev/null
+++ b/cypress/support/pages/setup-page.ts
@@ -0,0 +1,7 @@
+export const SetupPage = {
+    url: Cypress.env("baseUrl") + "/setup",
+    usernameInput: '[data-cy="username-input"]',
+    passWordInput: '[data-cy="password-input"]',
+    passwordRepeatInput: '[data-cy="password-repeat-input"]',
+    submitSetupForm: '[data-cy="submit-setup-form"]',
+};
diff --git a/cypress/support/tasks/setup-task.ts b/cypress/support/tasks/setup-task.ts
new file mode 100644
index 00000000..866e3ca5
--- /dev/null
+++ b/cypress/support/tasks/setup-task.ts
@@ -0,0 +1,15 @@
+import { SetupPage } from "../pages/setup-page";
+
+export class SetupTask {
+    fillAndSubmitSetupForm(
+        username: string,
+        password: string,
+        passwordRepeat: string
+    ) {
+        cy.get(SetupPage.usernameInput).type(username);
+        cy.get(SetupPage.passWordInput).type(password);
+        cy.get(SetupPage.passwordRepeatInput).type(passwordRepeat);
+
+        cy.get(SetupPage.submitSetupForm).click();
+    }
+}
diff --git a/package.json b/package.json
index 7a18dbdf..508722f4 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,8 @@
         "release-final": "node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js",
         "release-beta": "node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta .  --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts",
         "git-remove-tag": "git tag -d",
-        "build-dist-and-restart": "npm run build && npm run start-server-dev"
+        "build-dist-and-restart": "npm run build && npm run start-server-dev",
+        "cy:run": "npx cypress run --browser chrome --headless"
     },
     "dependencies": {
         "@louislam/sqlite3": "~15.0.6",
@@ -125,6 +126,8 @@
         "concurrently": "^7.1.0",
         "core-js": "~3.18.3",
         "cross-env": "~7.0.3",
+        "cypress": "^10.1.0",
+        "delay": "^5.0.0",
         "dns2": "~2.0.1",
         "eslint": "~8.14.0",
         "eslint-plugin-vue": "~8.7.1",
diff --git a/src/pages/Setup.vue b/src/pages/Setup.vue
index 08347b8e..cba7f8fc 100644
--- a/src/pages/Setup.vue
+++ b/src/pages/Setup.vue
@@ -1,5 +1,5 @@
 <template>
-    <div class="form-container">
+    <div class="form-container" data-cy="setup-form">
         <div class="form">
             <form @submit.prevent="submit">
                 <div>
@@ -23,21 +23,21 @@
                 </div>
 
                 <div class="form-floating mt-3">
-                    <input id="floatingInput" v-model="username" type="text" class="form-control" placeholder="Username" required>
+                    <input id="floatingInput" v-model="username" type="text" class="form-control" placeholder="Username" required data-cy="username-input">
                     <label for="floatingInput">{{ $t("Username") }}</label>
                 </div>
 
                 <div class="form-floating mt-3">
-                    <input id="floatingPassword" v-model="password" type="password" class="form-control" placeholder="Password" required>
+                    <input id="floatingPassword" v-model="password" type="password" class="form-control" placeholder="Password" required data-cy="password-input">
                     <label for="floatingPassword">{{ $t("Password") }}</label>
                 </div>
 
                 <div class="form-floating mt-3">
-                    <input id="repeat" v-model="repeatPassword" type="password" class="form-control" placeholder="Repeat Password" required>
+                    <input id="repeat" v-model="repeatPassword" type="password" class="form-control" placeholder="Repeat Password" required data-cy="password-repeat-input">
                     <label for="repeat">{{ $t("Repeat Password") }}</label>
                 </div>
 
-                <button class="w-100 btn btn-primary mt-3" type="submit" :disabled="processing">
+                <button class="w-100 btn btn-primary mt-3" type="submit" :disabled="processing" data-cy="submit-setup-form">
                     {{ $t("Create") }}
                 </button>
             </form>
diff --git a/tsconfig.json b/tsconfig.json
index c5454642..cd5f7c5d 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -11,9 +11,11 @@
         "removeComments": false,
         "preserveConstEnums": true,
         "sourceMap": false,
-        "strict": true
+        "strict": true,
+        "types": ["cypress"]
     },
     "files": [
-        "./src/util.ts"
-    ]
+        "./src/util.ts",
+    ],
+    "include": ["cypress/**/*.ts"]
 }

From 986c03aecdedef034ec4fd11735118ec25b09482 Mon Sep 17 00:00:00 2001
From: tamasmagyar <20069588+tamasmagyar@users.noreply.github.com>
Date: Thu, 16 Jun 2022 11:28:17 +0200
Subject: [PATCH 062/803] test cypress run

---
 .github/workflows/auto-test.yml | 16 ++++++++++++++++
 cypress.config.ts               |  5 +++--
 cypress/fixtures/example.json   |  5 -----
 package.json                    |  1 +
 server/server.js                |  7 ++++++-
 server/util-server.js           | 19 +++++++++++++++++++
 6 files changed, 45 insertions(+), 8 deletions(-)
 delete mode 100644 cypress/fixtures/example.json

diff --git a/.github/workflows/auto-test.yml b/.github/workflows/auto-test.yml
index d26b76e6..b49a253c 100644
--- a/.github/workflows/auto-test.yml
+++ b/.github/workflows/auto-test.yml
@@ -50,3 +50,19 @@ jobs:
         cache: 'npm'
     - run: npm install
     - run: npm run lint
+
+  e2e-tests:
+    needs: [ check-linters ]
+    runs-on: ubuntu-latest
+    steps:
+    - run: git config --global core.autocrlf false  # Mainly for Windows
+    - uses: actions/checkout@v3
+
+    - name: Use Node.js 14
+      uses: actions/setup-node@v3
+      with:
+        node-version: 14
+        cache: 'npm'
+    - run: npm install
+    - run: npm run build
+    - run: npm run cy:test
diff --git a/cypress.config.ts b/cypress.config.ts
index ceeebca3..d97e0875 100644
--- a/cypress.config.ts
+++ b/cypress.config.ts
@@ -2,13 +2,14 @@ import { defineConfig } from "cypress";
 
 export default defineConfig({
     e2e: {
-        baseUrl: "http://localhost:3000",
+        baseUrl: "http://localhost:3002",
         defaultCommandTimeout: 10000,
         pageLoadTimeout: 60000,
         viewportWidth: 1920,
         viewportHeight: 1080,
+        specPattern: ["cypress/e2e/setup.cy.ts", "cypress/e2e/**/*.ts"],
     },
     env: {
-        baseUrl: "http://localhost:3000",
+        baseUrl: "http://localhost:3002",
     },
 });
diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json
deleted file mode 100644
index 02e42543..00000000
--- a/cypress/fixtures/example.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "name": "Using fixtures to represent data",
-  "email": "hello@cypress.io",
-  "body": "Fixtures are a great way to mock data for responses to routes"
-}
diff --git a/package.json b/package.json
index 508722f4..ae0622ec 100644
--- a/package.json
+++ b/package.json
@@ -59,6 +59,7 @@
         "release-beta": "node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta .  --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts",
         "git-remove-tag": "git tag -d",
         "build-dist-and-restart": "npm run build && npm run start-server-dev",
+        "cy:test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --e2e",
         "cy:run": "npx cypress run --browser chrome --headless"
     },
     "dependencies": {
diff --git a/server/server.js b/server/server.js
index 2d3f37ee..c5777f0a 100644
--- a/server/server.js
+++ b/server/server.js
@@ -61,7 +61,7 @@ log.info("server", "Importing this project modules");
 log.debug("server", "Importing Monitor");
 const Monitor = require("./model/monitor");
 log.debug("server", "Importing Settings");
-const { getSettings, setSettings, setting, initJWTSecret, checkLogin, startUnitTest, FBSD, doubleCheckPassword } = require("./util-server");
+const { getSettings, setSettings, setting, initJWTSecret, checkLogin, startUnitTest, FBSD, doubleCheckPassword, startE2eTests } = require("./util-server");
 
 log.debug("server", "Importing Notification");
 const { Notification } = require("./notification");
@@ -112,6 +112,7 @@ const twoFAVerifyOptions = {
  * @type {boolean}
  */
 const testMode = !!args["test"] || false;
+const e2eTestMode = !!args["e2e"] || false;
 
 if (config.demoMode) {
     log.info("server", "==== Demo Mode ====");
@@ -1459,6 +1460,10 @@ let needSetup = false;
         if (testMode) {
             startUnitTest();
         }
+
+        if (e2eTestMode) {
+            startE2eTests();
+        }
     });
 
     initBackgroundJobs(args);
diff --git a/server/util-server.js b/server/util-server.js
index ec68c2f3..fd95a744 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -508,6 +508,25 @@ exports.startUnitTest = async () => {
     });
 };
 
+exports.startE2eTests = async () => {
+    console.log("Starting unit test...");
+    const npm = /^win/.test(process.platform) ? "npm.cmd" : "npm";
+    const child = childProcess.spawn(npm, [ "run", "cy:run" ]);
+
+    child.stdout.on("data", (data) => {
+        console.log(data.toString());
+    });
+
+    child.stderr.on("data", (data) => {
+        console.log(data.toString());
+    });
+
+    child.on("close", function (code) {
+        console.log("Jest exit code: " + code);
+        process.exit(code);
+    });
+};
+
 /**
  * Convert unknown string to UTF8
  * @param {Uint8Array} body Buffer

From a382f811f4bd707597672d57b680e43afaaeb921 Mon Sep 17 00:00:00 2001
From: tamasmagyar <20069588+tamasmagyar@users.noreply.github.com>
Date: Thu, 16 Jun 2022 14:40:42 +0200
Subject: [PATCH 063/803] added comment to startE2eTests function

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

diff --git a/server/util-server.js b/server/util-server.js
index fd95a744..2c0a7564 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -508,6 +508,7 @@ exports.startUnitTest = async () => {
     });
 };
 
+/** Start end-to-end tests */
 exports.startE2eTests = async () => {
     console.log("Starting unit test...");
     const npm = /^win/.test(process.platform) ? "npm.cmd" : "npm";

From c4a2ce4e78cf90fc371a62c394f9523b5d62c102 Mon Sep 17 00:00:00 2001
From: Rolf Bachmann <1196109+rolfbachmann@users.noreply.github.com>
Date: Tue, 19 Jul 2022 10:57:52 +0200
Subject: [PATCH 064/803] Add authentication support for ntfy

---
 server/notification-providers/ntfy.js | 11 +++++++++--
 src/components/notifications/Ntfy.vue | 18 +++++++++++++++++-
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/server/notification-providers/ntfy.js b/server/notification-providers/ntfy.js
index 21f358f6..17d6d812 100644
--- a/server/notification-providers/ntfy.js
+++ b/server/notification-providers/ntfy.js
@@ -8,12 +8,19 @@ class Ntfy extends NotificationProvider {
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
         try {
-            await axios.post(`${notification.ntfyserverurl}`, {
+            let headers = {};
+            if (notification.ntfyusername.length > 0) {
+                headers = {
+                    "Authorization": "Basic " + Buffer.from(notification.ntfyusername + ":" + notification.ntfypassword).toString("base64"),
+                };
+            }
+            let data = {
                 "topic": notification.ntfytopic,
                 "message": msg,
                 "priority": notification.ntfyPriority || 4,
                 "title": "Uptime-Kuma",
-            });
+            };
+            await axios.post(`${notification.ntfyserverurl}`, data, { headers: headers });
 
             return okMsg;
 
diff --git a/src/components/notifications/Ntfy.vue b/src/components/notifications/Ntfy.vue
index d9a83b49..a42dca30 100644
--- a/src/components/notifications/Ntfy.vue
+++ b/src/components/notifications/Ntfy.vue
@@ -11,7 +11,18 @@
             <input id="ntfy-server-url" v-model="$parent.notification.ntfyserverurl" type="text" class="form-control" required>
         </div>
     </div>
-
+    <div class="mb-3">
+        <label for="ntfy-username" class="form-label">{{ $t("Username") }}</label>
+        <div class="input-group mb-3">
+            <input id="ntfy-username" v-model="$parent.notification.ntfyusername" type="text" class="form-control" required>
+        </div>
+    </div>
+    <div class="mb-3">
+        <label for="ntfy-password" class="form-label">{{ $t("Password") }}</label>
+        <div class="input-group mb-3">
+            <HiddenInput id="ntfy-password" v-model="$parent.notification.ntfypassword"></HiddenInput>
+        </div>
+    </div>
     <div class="mb-3">
         <label for="ntfy-priority" class="form-label">{{ $t("Priority") }}</label>
         <input id="ntfy-priority" v-model="$parent.notification.ntfyPriority" type="number" class="form-control" required min="1" max="5" step="1">
@@ -19,7 +30,12 @@
 </template>
 
 <script>
+import HiddenInput from "../HiddenInput.vue";
+
 export default {
+    components: {
+        HiddenInput,
+    },
     mounted() {
         if (typeof this.$parent.notification.ntfyPriority === "undefined") {
             this.$parent.notification.ntfyserverurl = "https://ntfy.sh";

From f016caa51300f7b127950b5c8e81463d3fbdeafc Mon Sep 17 00:00:00 2001
From: Joseph Benguira <z51biz@gmail.com>
Date: Sun, 31 Jul 2022 18:51:53 +0300
Subject: [PATCH 065/803] Avoid error "SQLITE_BUSY: database is locked"

Avoid error "SQLITE_BUSY: database is locked" by allowing SQLITE to wait up to 5 seconds to do a write
---
 server/database.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/server/database.js b/server/database.js
index 00fd48d9..b58daf87 100644
--- a/server/database.js
+++ b/server/database.js
@@ -146,6 +146,9 @@ class Database {
         }
         await R.exec("PRAGMA cache_size = -12000");
         await R.exec("PRAGMA auto_vacuum = FULL");
+        
+        //Avoid error "SQLITE_BUSY: database is locked" by allowing SQLITE to wait up to 5 seconds to do a write
+        await R.exec("PRAGMA busy_timeout = 5000;");
 
         // This ensures that an operating system crash or power failure will not corrupt the database.
         // FULL synchronous is very safe, but it is also slower.

From 82b9bfc5a0a4fdc6492bfedbd11a0bd7bfa10b38 Mon Sep 17 00:00:00 2001
From: Joseph Benguira <z51biz@gmail.com>
Date: Sun, 31 Jul 2022 18:59:02 +0300
Subject: [PATCH 066/803] fixed Trailing spaces not allowed lint issue

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

diff --git a/server/database.js b/server/database.js
index b58daf87..4c374ca6 100644
--- a/server/database.js
+++ b/server/database.js
@@ -146,7 +146,7 @@ class Database {
         }
         await R.exec("PRAGMA cache_size = -12000");
         await R.exec("PRAGMA auto_vacuum = FULL");
-        
+
         //Avoid error "SQLITE_BUSY: database is locked" by allowing SQLITE to wait up to 5 seconds to do a write
         await R.exec("PRAGMA busy_timeout = 5000;");
 

From 71d62ee1510a5c336d3d22901e231814bba0187f Mon Sep 17 00:00:00 2001
From: Joseph Benguira <z51biz@gmail.com>
Date: Sun, 31 Jul 2022 19:00:19 +0300
Subject: [PATCH 067/803] removed ; after the PRAGMA command

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

diff --git a/server/database.js b/server/database.js
index 4c374ca6..5f87352b 100644
--- a/server/database.js
+++ b/server/database.js
@@ -148,7 +148,7 @@ class Database {
         await R.exec("PRAGMA auto_vacuum = FULL");
 
         //Avoid error "SQLITE_BUSY: database is locked" by allowing SQLITE to wait up to 5 seconds to do a write
-        await R.exec("PRAGMA busy_timeout = 5000;");
+        await R.exec("PRAGMA busy_timeout = 5000");
 
         // This ensures that an operating system crash or power failure will not corrupt the database.
         // FULL synchronous is very safe, but it is also slower.

From d6a113396a0a3512c7ac5975eaafb5fba2c46a36 Mon Sep 17 00:00:00 2001
From: Joseph Benguira <z51biz@gmail.com>
Date: Mon, 1 Aug 2022 13:18:19 +0300
Subject: [PATCH 068/803] Update server/database.js

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 server/database.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/database.js b/server/database.js
index 5f87352b..b4865b1f 100644
--- a/server/database.js
+++ b/server/database.js
@@ -147,7 +147,7 @@ class Database {
         await R.exec("PRAGMA cache_size = -12000");
         await R.exec("PRAGMA auto_vacuum = FULL");
 
-        //Avoid error "SQLITE_BUSY: database is locked" by allowing SQLITE to wait up to 5 seconds to do a write
+        // Avoid error "SQLITE_BUSY: database is locked" by allowing SQLITE to wait up to 5 seconds to do a write
         await R.exec("PRAGMA busy_timeout = 5000");
 
         // This ensures that an operating system crash or power failure will not corrupt the database.

From 19d8761305ff9335385cd141e0586dace6b12e00 Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Tue, 2 Aug 2022 07:48:54 +0300
Subject: [PATCH 069/803] Update bg-BG.js

Just a typo
---
 src/languages/bg-BG.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 56035295..1f531448 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -380,7 +380,7 @@ export default {
     deleteProxyMsg: "Сигурни ли сте, че желаете да изтриете това прокси за всички монитори?",
     proxyDescription: "За да функционират трябва да бъдат зададени към монитор.",
     enableProxyDescription: "Това прокси няма да има ефект върху заявките за мониторинг, докато не бъде активирано. Може да контролирате временното деактивиране на проксито от всички монитори чрез статуса на активиране.",
-    setAsDefaultProxyDescription: "Това проки ще бъде включено по подразбиране за новите монитори. Може да го изключите по отделно за всеки един монитор.",
+    setAsDefaultProxyDescription: "Това прокси ще бъде включено по подразбиране за новите монитори. Може да го изключите по отделно за всеки един монитор.",
     "Certificate Chain": "Верига на сертификата",
     Valid: "Валиден",
     Invalid: "Невалиден",

From dcecd10c88b8f9606e213254c40e135be9ddf978 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Minh=20Ho=C3=A0ng?= <hnminh@outlook.com>
Date: Wed, 3 Aug 2022 12:00:39 +0700
Subject: [PATCH 070/803] Feat/add gRPC protocol (#1)

* feat: added monitor with gRPC

Co-authored-by: minhhn3 <minhhn3@vng.com.vn>
---
 db/patch-grpc-monitor.sql |  25 ++
 package-lock.json         | 767 ++++++++++++++++++++++++++++++++++++--
 package.json              |   8 +
 server/database.js        |   1 +
 server/model/monitor.js   |  41 +-
 server/server.js          |   6 +
 server/util-server.js     |  50 +++
 src/languages/en.js       |   2 +
 src/pages/EditMonitor.vue |  96 ++++-
 9 files changed, 960 insertions(+), 36 deletions(-)
 create mode 100644 db/patch-grpc-monitor.sql

diff --git a/db/patch-grpc-monitor.sql b/db/patch-grpc-monitor.sql
new file mode 100644
index 00000000..bac024e8
--- /dev/null
+++ b/db/patch-grpc-monitor.sql
@@ -0,0 +1,25 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+ALTER TABLE monitor
+    ADD grpc_url VARCHAR(255) default null;
+
+ALTER TABLE monitor
+    ADD grpc_protobuf TEXT default null;
+
+ALTER TABLE monitor
+    ADD grpc_body TEXT default null;
+
+ALTER TABLE monitor
+    ADD grpc_metadata TEXT default null;
+
+ALTER TABLE monitor
+    ADD grpc_method VARCHAR(255) default null;
+
+ALTER TABLE monitor
+    ADD grpc_service_name VARCHAR(255) default null;
+
+ALTER TABLE monitor
+    ADD grpc_enable_tls BOOLEAN default 0 not null;
+
+COMMIT;
diff --git a/package-lock.json b/package-lock.json
index 778e6bc3..25c6531b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,11 @@
             "version": "1.17.1",
             "license": "MIT",
             "dependencies": {
+                "@fortawesome/fontawesome-svg-core": "~1.2.36",
+                "@fortawesome/free-regular-svg-icons": "~5.15.4",
+                "@fortawesome/free-solid-svg-icons": "~5.15.4",
+                "@fortawesome/vue-fontawesome": "~3.0.0-5",
+                "@grpc/grpc-js": "^1.6.8",
                 "@louislam/sqlite3": "~15.0.6",
                 "args-parser": "~1.3.0",
                 "axios": "~0.26.1",
@@ -29,6 +34,7 @@
                 "express-basic-auth": "~1.2.1",
                 "express-static-gzip": "^2.1.7",
                 "form-data": "~4.0.0",
+                "grpc-health-check": "^1.3.0",
                 "http-graceful-shutdown": "~3.1.7",
                 "http-proxy-agent": "^5.0.0",
                 "https-proxy-agent": "^5.0.0",
@@ -46,6 +52,8 @@
                 "pg-connection-string": "^2.5.0",
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
+                "protobufjs": "^7.0.0",
+                "qrcode": "~1.5.0",
                 "redbean-node": "0.1.4",
                 "socket.io": "~4.4.1",
                 "socket.io-client": "~4.4.1",
@@ -2208,6 +2216,53 @@
                 "vue": ">= 3.0.0 < 4"
             }
         },
+        "node_modules/@grpc/grpc-js": {
+            "version": "1.6.8",
+            "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.6.8.tgz",
+            "integrity": "sha512-Nt5tufF/O5Q310kP0cDzxznWMZW58GCTZhUUiAQ9B0K0ANKNQ4Lj/K9XK0vZg+UBKq5/7z7+8mXHHfrcwoeFJQ==",
+            "dependencies": {
+                "@grpc/proto-loader": "^0.7.0",
+                "@types/node": ">=12.12.47"
+            },
+            "engines": {
+                "node": "^8.13.0 || >=10.10.0"
+            }
+        },
+        "node_modules/@grpc/proto-loader": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.0.tgz",
+            "integrity": "sha512-SGPZtVmqOvNfPFOA/nNPn+0Weqa5wubBgQ56+JgTbeLY2VezwtMjwPPFzh0kvQccwWT3a2TXT0ZGK/pJoOTk1A==",
+            "dependencies": {
+                "@types/long": "^4.0.1",
+                "lodash.camelcase": "^4.3.0",
+                "long": "^4.0.0",
+                "protobufjs": "^7.0.0",
+                "yargs": "^16.2.0"
+            },
+            "bin": {
+                "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/@grpc/proto-loader/node_modules/yargs": {
+            "version": "16.2.0",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+            "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+            "dependencies": {
+                "cliui": "^7.0.2",
+                "escalade": "^3.1.1",
+                "get-caller-file": "^2.0.5",
+                "require-directory": "^2.1.1",
+                "string-width": "^4.2.0",
+                "y18n": "^5.0.5",
+                "yargs-parser": "^20.2.2"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/@hapi/hoek": {
             "version": "9.3.0",
             "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -3256,6 +3311,60 @@
                 "url": "https://opencollective.com/popperjs"
             }
         },
+        "node_modules/@protobufjs/aspromise": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+            "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+        },
+        "node_modules/@protobufjs/base64": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+            "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+        },
+        "node_modules/@protobufjs/codegen": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+            "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+        },
+        "node_modules/@protobufjs/eventemitter": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+            "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+        },
+        "node_modules/@protobufjs/fetch": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+            "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+            "dependencies": {
+                "@protobufjs/aspromise": "^1.1.1",
+                "@protobufjs/inquire": "^1.1.0"
+            }
+        },
+        "node_modules/@protobufjs/float": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+            "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+        },
+        "node_modules/@protobufjs/inquire": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+            "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+        },
+        "node_modules/@protobufjs/path": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+            "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+        },
+        "node_modules/@protobufjs/pool": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+            "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+        },
+        "node_modules/@protobufjs/utf8": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+            "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+        },
         "node_modules/@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -3380,6 +3489,15 @@
                 "@popperjs/core": "^2.9.2"
             }
         },
+        "node_modules/@types/bytebuffer": {
+            "version": "5.0.43",
+            "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.43.tgz",
+            "integrity": "sha512-vQnTYvy4LpSojHjKdmg4nXFI1BAiYPvZ/k3ouczZAQnbDprk1xqxJiFmFHyy8y6MuUq3slz5erNMtn6n87uVKw==",
+            "dependencies": {
+                "@types/long": "*",
+                "@types/node": "*"
+            }
+        },
         "node_modules/@types/component-emitter": {
             "version": "1.2.11",
             "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
@@ -3524,6 +3642,11 @@
             "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
             "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
         },
+        "node_modules/@types/long": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+            "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
+        },
         "node_modules/@types/mime": {
             "version": "1.3.2",
             "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
@@ -4153,6 +4276,15 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/ascli": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz",
+            "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==",
+            "dependencies": {
+                "colour": "~0.7.1",
+                "optjs": "~3.2.2"
+            }
+        },
         "node_modules/asn1": {
             "version": "0.2.6",
             "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
@@ -4809,6 +4941,25 @@
                 "readable-stream": "^3.1.1"
             }
         },
+        "node_modules/bytebuffer": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz",
+            "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==",
+            "dependencies": {
+                "long": "~3"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/bytebuffer/node_modules/long": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
+            "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==",
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
         "node_modules/bytes": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
@@ -5055,7 +5206,6 @@
             "version": "7.0.4",
             "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
             "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-            "dev": true,
             "dependencies": {
                 "string-width": "^4.2.0",
                 "strip-ansi": "^6.0.0",
@@ -5116,7 +5266,6 @@
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
             "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
-            "optional": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -5161,6 +5310,14 @@
             "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
             "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
         },
+        "node_modules/colour": {
+            "version": "0.7.1",
+            "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz",
+            "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
         "node_modules/combine-errors": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz",
@@ -5753,7 +5910,6 @@
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
             "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-            "dev": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -7894,7 +8050,6 @@
             "version": "2.0.5",
             "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
             "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-            "dev": true,
             "engines": {
                 "node": "6.* || 8.* || >= 10.*"
             }
@@ -8094,12 +8249,155 @@
             "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
             "dev": true
         },
+        "node_modules/google-protobuf": {
+            "version": "3.21.0",
+            "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.0.tgz",
+            "integrity": "sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g=="
+        },
         "node_modules/graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
             "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
             "devOptional": true
         },
+        "node_modules/grpc": {
+            "version": "1.24.11",
+            "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz",
+            "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==",
+            "deprecated": "This library will not receive further updates other than security fixes. We recommend using @grpc/grpc-js instead.",
+            "hasInstallScript": true,
+            "dependencies": {
+                "@mapbox/node-pre-gyp": "^1.0.4",
+                "@types/bytebuffer": "^5.0.40",
+                "lodash.camelcase": "^4.3.0",
+                "lodash.clone": "^4.5.0",
+                "nan": "^2.13.2",
+                "protobufjs": "^5.0.3"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/grpc-health-check": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/grpc-health-check/-/grpc-health-check-1.8.0.tgz",
+            "integrity": "sha512-Fqa35Bg4VhliZE3Yfe88mmYm0nRfKVr/QRYw5zP1jtn1R0f7wwJJqlXsjaoexJy+pVTVXZpP6CxmNGuEv/bngw==",
+            "dependencies": {
+                "google-protobuf": "^3.4.0",
+                "grpc": "^1.6.0",
+                "lodash.clone": "^4.5.0",
+                "lodash.get": "^4.4.2"
+            }
+        },
+        "node_modules/grpc/node_modules/ansi-regex": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+            "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/grpc/node_modules/camelcase": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+            "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/grpc/node_modules/cliui": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+            "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
+            "dependencies": {
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1",
+                "wrap-ansi": "^2.0.0"
+            }
+        },
+        "node_modules/grpc/node_modules/is-fullwidth-code-point": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+            "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+            "dependencies": {
+                "number-is-nan": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/grpc/node_modules/protobufjs": {
+            "version": "5.0.3",
+            "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz",
+            "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==",
+            "dependencies": {
+                "ascli": "~1",
+                "bytebuffer": "~5",
+                "glob": "^7.0.5",
+                "yargs": "^3.10.0"
+            },
+            "bin": {
+                "pbjs": "bin/pbjs"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/grpc/node_modules/string-width": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+            "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+            "dependencies": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/grpc/node_modules/strip-ansi": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+            "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+            "dependencies": {
+                "ansi-regex": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/grpc/node_modules/wrap-ansi": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+            "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
+            "dependencies": {
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/grpc/node_modules/y18n": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+            "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
+        },
+        "node_modules/grpc/node_modules/yargs": {
+            "version": "3.32.0",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
+            "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==",
+            "dependencies": {
+                "camelcase": "^2.0.1",
+                "cliui": "^3.0.3",
+                "decamelize": "^1.1.1",
+                "os-locale": "^1.4.0",
+                "string-width": "^1.0.1",
+                "window-size": "^0.1.4",
+                "y18n": "^3.2.0"
+            }
+        },
         "node_modules/har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -8522,6 +8820,14 @@
                 "node": ">= 0.10"
             }
         },
+        "node_modules/invert-kv": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+            "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
         "node_modules/ip": {
             "version": "1.1.8",
             "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
@@ -11312,6 +11618,17 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/lcid": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+            "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==",
+            "dependencies": {
+                "invert-kv": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
         "node_modules/leven": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -11410,6 +11727,16 @@
                 "lodash._basetostring": "~4.12.0"
             }
         },
+        "node_modules/lodash.camelcase": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+            "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+        },
+        "node_modules/lodash.clone": {
+            "version": "4.5.0",
+            "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
+            "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg=="
+        },
         "node_modules/lodash.debounce": {
             "version": "4.0.8",
             "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -11477,6 +11804,11 @@
                 "lodash._baseuniq": "~4.6.0"
             }
         },
+        "node_modules/long": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+            "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+        },
         "node_modules/lru-cache": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -11899,6 +12231,11 @@
                 "node": "^12.20.0 || >=14"
             }
         },
+        "node_modules/nan": {
+            "version": "2.16.0",
+            "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
+            "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA=="
+        },
         "node_modules/nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -12279,7 +12616,6 @@
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
             "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
-            "optional": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -12420,6 +12756,11 @@
                 "node": ">= 0.8.0"
             }
         },
+        "node_modules/optjs": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz",
+            "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA=="
+        },
         "node_modules/os-homedir": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
@@ -12429,6 +12770,17 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/os-locale": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+            "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==",
+            "dependencies": {
+                "lcid": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
         "node_modules/p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -13142,6 +13494,35 @@
             "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
             "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
         },
+        "node_modules/protobufjs": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.0.0.tgz",
+            "integrity": "sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w==",
+            "hasInstallScript": true,
+            "dependencies": {
+                "@protobufjs/aspromise": "^1.1.2",
+                "@protobufjs/base64": "^1.1.2",
+                "@protobufjs/codegen": "^2.0.4",
+                "@protobufjs/eventemitter": "^1.1.0",
+                "@protobufjs/fetch": "^1.1.0",
+                "@protobufjs/float": "^1.0.2",
+                "@protobufjs/inquire": "^1.1.0",
+                "@protobufjs/path": "^1.1.2",
+                "@protobufjs/pool": "^1.1.0",
+                "@protobufjs/utf8": "^1.1.0",
+                "@types/long": "^4.0.1",
+                "@types/node": ">=13.7.0",
+                "long": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/protobufjs/node_modules/long": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz",
+            "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w=="
+        },
         "node_modules/proxy-addr": {
             "version": "2.0.7",
             "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -13811,7 +14192,6 @@
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
             "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-            "dev": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -16250,6 +16630,17 @@
                 "string-width": "^1.0.2 || 2 || 3 || 4"
             }
         },
+        "node_modules/window-size": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
+            "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==",
+            "bin": {
+                "window-size": "cli.js"
+            },
+            "engines": {
+                "node": ">= 0.10.0"
+            }
+        },
         "node_modules/word-wrap": {
             "version": "1.2.3",
             "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -16263,7 +16654,6 @@
             "version": "7.0.0",
             "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
             "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-            "dev": true,
             "dependencies": {
                 "ansi-styles": "^4.0.0",
                 "string-width": "^4.1.0",
@@ -16280,7 +16670,6 @@
             "version": "4.3.0",
             "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
             "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
             "dependencies": {
                 "color-convert": "^2.0.1"
             },
@@ -16295,7 +16684,6 @@
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
             "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
             "dependencies": {
                 "color-name": "~1.1.4"
             },
@@ -16306,8 +16694,7 @@
         "node_modules/wrap-ansi/node_modules/color-name": {
             "version": "1.1.4",
             "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "node_modules/wrappy": {
             "version": "1.0.2",
@@ -16398,7 +16785,6 @@
             "version": "5.0.8",
             "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
             "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-            "dev": true,
             "engines": {
                 "node": ">=10"
             }
@@ -16439,7 +16825,6 @@
             "version": "20.2.9",
             "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
             "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-            "dev": true,
             "engines": {
                 "node": ">=10"
             }
@@ -17997,6 +18382,43 @@
             "integrity": "sha512-CdXZJoCS+aEPec26ZP7hWWU3SaJlQPZSCGdgpQ2qGl2HUmtUUNrI3zC4XWdn1JUmh3t5OuDeRG1qB4eGRNSD4A==",
             "dev": true
         },
+        "@grpc/grpc-js": {
+            "version": "1.6.8",
+            "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.6.8.tgz",
+            "integrity": "sha512-Nt5tufF/O5Q310kP0cDzxznWMZW58GCTZhUUiAQ9B0K0ANKNQ4Lj/K9XK0vZg+UBKq5/7z7+8mXHHfrcwoeFJQ==",
+            "requires": {
+                "@grpc/proto-loader": "^0.7.0",
+                "@types/node": ">=12.12.47"
+            }
+        },
+        "@grpc/proto-loader": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.0.tgz",
+            "integrity": "sha512-SGPZtVmqOvNfPFOA/nNPn+0Weqa5wubBgQ56+JgTbeLY2VezwtMjwPPFzh0kvQccwWT3a2TXT0ZGK/pJoOTk1A==",
+            "requires": {
+                "@types/long": "^4.0.1",
+                "lodash.camelcase": "^4.3.0",
+                "long": "^4.0.0",
+                "protobufjs": "^7.0.0",
+                "yargs": "^16.2.0"
+            },
+            "dependencies": {
+                "yargs": {
+                    "version": "16.2.0",
+                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+                    "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+                    "requires": {
+                        "cliui": "^7.0.2",
+                        "escalade": "^3.1.1",
+                        "get-caller-file": "^2.0.5",
+                        "require-directory": "^2.1.1",
+                        "string-width": "^4.2.0",
+                        "y18n": "^5.0.5",
+                        "yargs-parser": "^20.2.2"
+                    }
+                }
+            }
+        },
         "@hapi/hoek": {
             "version": "9.3.0",
             "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -18818,6 +19240,60 @@
             "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==",
             "dev": true
         },
+        "@protobufjs/aspromise": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+            "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+        },
+        "@protobufjs/base64": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+            "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+        },
+        "@protobufjs/codegen": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+            "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+        },
+        "@protobufjs/eventemitter": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+            "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+        },
+        "@protobufjs/fetch": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+            "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+            "requires": {
+                "@protobufjs/aspromise": "^1.1.1",
+                "@protobufjs/inquire": "^1.1.0"
+            }
+        },
+        "@protobufjs/float": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+            "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+        },
+        "@protobufjs/inquire": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+            "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+        },
+        "@protobufjs/path": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+            "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+        },
+        "@protobufjs/pool": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+            "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+        },
+        "@protobufjs/utf8": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+            "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+        },
         "@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -18939,6 +19415,15 @@
                 "@popperjs/core": "^2.9.2"
             }
         },
+        "@types/bytebuffer": {
+            "version": "5.0.43",
+            "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.43.tgz",
+            "integrity": "sha512-vQnTYvy4LpSojHjKdmg4nXFI1BAiYPvZ/k3ouczZAQnbDprk1xqxJiFmFHyy8y6MuUq3slz5erNMtn6n87uVKw==",
+            "requires": {
+                "@types/long": "*",
+                "@types/node": "*"
+            }
+        },
         "@types/component-emitter": {
             "version": "1.2.11",
             "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
@@ -19083,6 +19568,11 @@
             "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
             "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
         },
+        "@types/long": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+            "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
+        },
         "@types/mime": {
             "version": "1.3.2",
             "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
@@ -19644,6 +20134,15 @@
             "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
             "dev": true
         },
+        "ascli": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz",
+            "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==",
+            "requires": {
+                "colour": "~0.7.1",
+                "optjs": "~3.2.2"
+            }
+        },
         "asn1": {
             "version": "0.2.6",
             "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
@@ -20158,6 +20657,21 @@
                 "readable-stream": "^3.1.1"
             }
         },
+        "bytebuffer": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz",
+            "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==",
+            "requires": {
+                "long": "~3"
+            },
+            "dependencies": {
+                "long": {
+                    "version": "3.2.0",
+                    "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
+                    "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg=="
+                }
+            }
+        },
         "bytes": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
@@ -20339,7 +20853,6 @@
             "version": "7.0.4",
             "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
             "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-            "dev": true,
             "requires": {
                 "string-width": "^4.2.0",
                 "strip-ansi": "^6.0.0",
@@ -20388,8 +20901,7 @@
         "code-point-at": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-            "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
-            "optional": true
+            "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="
         },
         "collect-v8-coverage": {
             "version": "1.0.1",
@@ -20428,6 +20940,11 @@
             "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
             "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
         },
+        "colour": {
+            "version": "0.7.1",
+            "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz",
+            "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg=="
+        },
         "combine-errors": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz",
@@ -20887,8 +21404,7 @@
         "decamelize": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-            "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-            "dev": true
+            "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
         },
         "decamelize-keys": {
             "version": "1.1.0",
@@ -22411,8 +22927,7 @@
         "get-caller-file": {
             "version": "2.0.5",
             "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-            "dev": true
+            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
         },
         "get-intrinsic": {
             "version": "1.1.2",
@@ -22554,12 +23069,128 @@
             "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
             "dev": true
         },
+        "google-protobuf": {
+            "version": "3.21.0",
+            "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.0.tgz",
+            "integrity": "sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g=="
+        },
         "graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
             "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
             "devOptional": true
         },
+        "grpc": {
+            "version": "1.24.11",
+            "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz",
+            "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==",
+            "requires": {
+                "@mapbox/node-pre-gyp": "^1.0.4",
+                "@types/bytebuffer": "^5.0.40",
+                "lodash.camelcase": "^4.3.0",
+                "lodash.clone": "^4.5.0",
+                "nan": "^2.13.2",
+                "protobufjs": "^5.0.3"
+            },
+            "dependencies": {
+                "ansi-regex": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+                    "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+                },
+                "camelcase": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+                    "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw=="
+                },
+                "cliui": {
+                    "version": "3.2.0",
+                    "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+                    "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
+                    "requires": {
+                        "string-width": "^1.0.1",
+                        "strip-ansi": "^3.0.1",
+                        "wrap-ansi": "^2.0.0"
+                    }
+                },
+                "is-fullwidth-code-point": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+                    "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+                    "requires": {
+                        "number-is-nan": "^1.0.0"
+                    }
+                },
+                "protobufjs": {
+                    "version": "5.0.3",
+                    "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz",
+                    "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==",
+                    "requires": {
+                        "ascli": "~1",
+                        "bytebuffer": "~5",
+                        "glob": "^7.0.5",
+                        "yargs": "^3.10.0"
+                    }
+                },
+                "string-width": {
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+                    "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+                    "requires": {
+                        "code-point-at": "^1.0.0",
+                        "is-fullwidth-code-point": "^1.0.0",
+                        "strip-ansi": "^3.0.0"
+                    }
+                },
+                "strip-ansi": {
+                    "version": "3.0.1",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+                    "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+                    "requires": {
+                        "ansi-regex": "^2.0.0"
+                    }
+                },
+                "wrap-ansi": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+                    "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
+                    "requires": {
+                        "string-width": "^1.0.1",
+                        "strip-ansi": "^3.0.1"
+                    }
+                },
+                "y18n": {
+                    "version": "3.2.2",
+                    "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+                    "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
+                },
+                "yargs": {
+                    "version": "3.32.0",
+                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
+                    "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==",
+                    "requires": {
+                        "camelcase": "^2.0.1",
+                        "cliui": "^3.0.3",
+                        "decamelize": "^1.1.1",
+                        "os-locale": "^1.4.0",
+                        "string-width": "^1.0.1",
+                        "window-size": "^0.1.4",
+                        "y18n": "^3.2.0"
+                    }
+                }
+            }
+        },
+        "grpc-health-check": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/grpc-health-check/-/grpc-health-check-1.8.0.tgz",
+            "integrity": "sha512-Fqa35Bg4VhliZE3Yfe88mmYm0nRfKVr/QRYw5zP1jtn1R0f7wwJJqlXsjaoexJy+pVTVXZpP6CxmNGuEv/bngw==",
+            "requires": {
+                "google-protobuf": "^3.4.0",
+                "grpc": "^1.6.0",
+                "lodash.clone": "^4.5.0",
+                "lodash.get": "^4.4.2"
+            }
+        },
         "har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -22857,6 +23488,11 @@
             "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
             "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="
         },
+        "invert-kv": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+            "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ=="
+        },
         "ip": {
             "version": "1.1.8",
             "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
@@ -24932,6 +25568,14 @@
             "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
             "dev": true
         },
+        "lcid": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+            "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==",
+            "requires": {
+                "invert-kv": "^1.0.0"
+            }
+        },
         "leven": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -25021,6 +25665,16 @@
                 "lodash._basetostring": "~4.12.0"
             }
         },
+        "lodash.camelcase": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+            "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+        },
+        "lodash.clone": {
+            "version": "4.5.0",
+            "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
+            "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg=="
+        },
         "lodash.debounce": {
             "version": "4.0.8",
             "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -25088,6 +25742,11 @@
                 "lodash._baseuniq": "~4.6.0"
             }
         },
+        "long": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+            "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+        },
         "lru-cache": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -25406,6 +26065,11 @@
                 }
             }
         },
+        "nan": {
+            "version": "2.16.0",
+            "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
+            "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA=="
+        },
         "nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -25717,8 +26381,7 @@
         "number-is-nan": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-            "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
-            "optional": true
+            "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="
         },
         "numbered": {
             "version": "1.1.0",
@@ -25817,12 +26480,25 @@
                 "word-wrap": "^1.2.3"
             }
         },
+        "optjs": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz",
+            "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA=="
+        },
         "os-homedir": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
             "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
             "dev": true
         },
+        "os-locale": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+            "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==",
+            "requires": {
+                "lcid": "^1.0.0"
+            }
+        },
         "p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -26327,6 +27003,33 @@
             "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
             "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
         },
+        "protobufjs": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.0.0.tgz",
+            "integrity": "sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w==",
+            "requires": {
+                "@protobufjs/aspromise": "^1.1.2",
+                "@protobufjs/base64": "^1.1.2",
+                "@protobufjs/codegen": "^2.0.4",
+                "@protobufjs/eventemitter": "^1.1.0",
+                "@protobufjs/fetch": "^1.1.0",
+                "@protobufjs/float": "^1.0.2",
+                "@protobufjs/inquire": "^1.1.0",
+                "@protobufjs/path": "^1.1.2",
+                "@protobufjs/pool": "^1.1.0",
+                "@protobufjs/utf8": "^1.1.0",
+                "@types/long": "^4.0.1",
+                "@types/node": ">=13.7.0",
+                "long": "^5.0.0"
+            },
+            "dependencies": {
+                "long": {
+                    "version": "5.2.0",
+                    "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz",
+                    "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w=="
+                }
+            }
+        },
         "proxy-addr": {
             "version": "2.0.7",
             "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -26842,8 +27545,7 @@
         "require-directory": {
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-            "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-            "dev": true
+            "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
         },
         "require-from-string": {
             "version": "2.0.2",
@@ -28702,6 +29404,11 @@
                 "string-width": "^1.0.2 || 2 || 3 || 4"
             }
         },
+        "window-size": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
+            "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw=="
+        },
         "word-wrap": {
             "version": "1.2.3",
             "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -28712,7 +29419,6 @@
             "version": "7.0.0",
             "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
             "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-            "dev": true,
             "requires": {
                 "ansi-styles": "^4.0.0",
                 "string-width": "^4.1.0",
@@ -28723,7 +29429,6 @@
                     "version": "4.3.0",
                     "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
                     "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
                     "requires": {
                         "color-convert": "^2.0.1"
                     }
@@ -28732,7 +29437,6 @@
                     "version": "2.0.1",
                     "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
                     "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
                     "requires": {
                         "color-name": "~1.1.4"
                     }
@@ -28740,8 +29444,7 @@
                 "color-name": {
                     "version": "1.1.4",
                     "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
+                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
                 }
             }
         },
@@ -28806,8 +29509,7 @@
         "y18n": {
             "version": "5.0.8",
             "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-            "dev": true
+            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
         },
         "yallist": {
             "version": "4.0.0",
@@ -28846,8 +29548,7 @@
         "yargs-parser": {
             "version": "20.2.9",
             "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-            "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-            "dev": true
+            "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
         },
         "yauzl": {
             "version": "2.10.0",
diff --git a/package.json b/package.json
index ea6c5a79..270f757b 100644
--- a/package.json
+++ b/package.json
@@ -61,6 +61,11 @@
         "build-dist-and-restart": "npm run build && npm run start-server-dev"
     },
     "dependencies": {
+        "@fortawesome/fontawesome-svg-core": "~1.2.36",
+        "@fortawesome/free-regular-svg-icons": "~5.15.4",
+        "@fortawesome/free-solid-svg-icons": "~5.15.4",
+        "@fortawesome/vue-fontawesome": "~3.0.0-5",
+        "@grpc/grpc-js": "^1.6.8",
         "@louislam/sqlite3": "~15.0.6",
         "args-parser": "~1.3.0",
         "axios": "~0.26.1",
@@ -81,6 +86,7 @@
         "express-basic-auth": "~1.2.1",
         "express-static-gzip": "^2.1.7",
         "form-data": "~4.0.0",
+        "grpc-health-check": "^1.3.0",
         "http-graceful-shutdown": "~3.1.7",
         "http-proxy-agent": "^5.0.0",
         "https-proxy-agent": "^5.0.0",
@@ -98,6 +104,8 @@
         "pg-connection-string": "^2.5.0",
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
+        "protobufjs": "^7.0.0",
+        "qrcode": "~1.5.0",
         "redbean-node": "0.1.4",
         "socket.io": "~4.4.1",
         "socket.io-client": "~4.4.1",
diff --git a/server/database.js b/server/database.js
index 54174bfb..2ac01d2e 100644
--- a/server/database.js
+++ b/server/database.js
@@ -62,6 +62,7 @@ class Database {
         "patch-add-clickable-status-page-link.sql": true,
         "patch-add-sqlserver-monitor.sql": true,
         "patch-add-other-auth.sql": { parents: [ "patch-monitor-basic-auth.sql" ] },
+        "patch-grpc-monitor.sql": true,
     };
 
     /**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 2feef135..f53ac536 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -7,7 +7,7 @@ dayjs.extend(timezone);
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
 const { log, UP, DOWN, PENDING, flipStatus, TimeLogger } = require("../../src/util");
-const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mqttAsync, setSetting, httpNtlm } = require("../util-server");
+const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mqttAsync, setSetting, httpNtlm, grpcQuery } = require("../util-server");
 const { R } = require("redbean-node");
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { Notification } = require("../notification");
@@ -103,6 +103,11 @@ class Monitor extends BeanModel {
             authMethod: this.authMethod,
             authWorkstation: this.authWorkstation,
             authDomain: this.authDomain,
+            grpcUrl: this.grpcUrl,
+            grpcProtobuf: this.grpcProtobuf,
+            grpcMethod: this.grpcMethod,
+            grpcServiceName: this.grpcServiceName,
+            grpcEnableTls: this.grpcEnableTls,
         };
 
         if (includeSensitiveData) {
@@ -110,6 +115,8 @@ class Monitor extends BeanModel {
                 ...data,
                 headers: this.headers,
                 body: this.body,
+                grpcBody: this.grpcBody,
+                grpcMetadata: this.grpcMetadata,
                 basic_auth_user: this.basic_auth_user,
                 basic_auth_pass: this.basic_auth_pass,
                 pushToken: this.pushToken,
@@ -516,6 +523,37 @@ class Monitor extends BeanModel {
                     bean.msg = "";
                     bean.status = UP;
                     bean.ping = dayjs().valueOf() - startTime;
+                } else if (this.type === "grpc-keyword") {
+                    let startTime = dayjs().valueOf();
+                    const options = {
+                        grpcUrl: this.grpcUrl,
+                        grpcProtobufData: this.grpcProtobuf,
+                        grpcServiceName: this.grpcServiceName,
+                        grpcEnableTls: this.grpcEnableTls,
+                        grpcMethod: this.grpcMethod,
+                        grpcBody: this.grpcBody,
+                        keyword: this.keyword
+                    };
+                    const response = await grpcQuery(options);
+                    bean.ping = dayjs().valueOf() - startTime;
+                    log.debug("monitor:", `gRPC response: ${JSON.stringify(response)}`);
+                    let responseData = response.data;
+                    if (responseData.length > 50) {
+                        responseData = response.substring(0, 47) + "...";
+                    }
+                    if (response.code !== 1) {
+                        bean.status = DOWN;
+                        bean.msg = `Error in send gRPC ${response.code} ${response.errorMessage}`;
+                    } else {
+                        if (response.data.toString().includes(this.keyword)) {
+                            bean.status = UP;
+                            bean.msg = `${responseData}, keyword [${this.keyword}] is found`;
+                        } else {
+                            log.debug("monitor:", `GRPC response [${response.data}] + ", but keyword [${this.keyword}] is not in [" + ${response.data} + "]"`);
+                            bean.status = DOWN;
+                            bean.msg = `, but keyword [${this.keyword}] is not in [" + ${responseData} + "]`;
+                        }
+                    }
                 } else if (this.type === "postgres") {
                     let startTime = dayjs().valueOf();
 
@@ -1002,6 +1040,7 @@ class Monitor extends BeanModel {
             monitorID
         ]);
     }
+
 }
 
 module.exports = Monitor;
diff --git a/server/server.js b/server/server.js
index 2a2c4bf6..808402df 100644
--- a/server/server.js
+++ b/server/server.js
@@ -693,6 +693,12 @@ let needSetup = false;
                 bean.authMethod = monitor.authMethod;
                 bean.authWorkstation = monitor.authWorkstation;
                 bean.authDomain = monitor.authDomain;
+                bean.grpUrl = monitor.grpUrl;
+                bean.grpcProtobuf = monitor.grpcProtobuf;
+                bean.grpcMethod = monitor.grpcMethod;
+                bean.grpcBody = monitor.grpcBody;
+                bean.grpcMetadata = monitor.grpcMetadata;
+                bean.grpcEnableTls = monitor.grpcEnableTls;
 
                 await R.store(bean);
 
diff --git a/server/util-server.js b/server/util-server.js
index df711cf0..b5511944 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -15,6 +15,8 @@ const { Client } = require("pg");
 const postgresConParse = require("pg-connection-string").parse;
 const { NtlmClient } = require("axios-ntlm");
 const { Settings } = require("./settings");
+const grpc = require("@grpc/grpc-js");
+const protojs = require("protobufjs");
 
 // From ping-lite
 exports.WIN = /^win/.test(process.platform);
@@ -595,3 +597,51 @@ module.exports.send403 = (res, msg = "") => {
         "msg": msg,
     });
 };
+
+/**
+ * Create gRPC client stib
+ * @param {Object} options from gRPC client
+ */
+module.exports.grpcQuery = async (options) => {
+    const { grpcUrl, grpcProtobufData, grpcServiceName, grpcEnableTls, grpcMethod, grpcBody } = options;
+    const protocObject = protojs.parse(grpcProtobufData);
+    const protoServiceObject = protocObject.root.lookupService(grpcServiceName);
+    const Client = grpc.makeGenericClientConstructor({});
+    const credentials = grpcEnableTls ? grpc.credentials.createSsl() : grpc.credentials.createInsecure();
+    const client = new Client(
+        grpcUrl,
+        credentials
+    );
+    const grpcService = protoServiceObject.create(function (method, requestData, cb) {
+        const fullServiceName = method.fullName;
+        const serviceFQDN = fullServiceName.split(".");
+        const serviceMethod = serviceFQDN.pop();
+        const serviceMethodClientImpl = `/${serviceFQDN.slice(1).join(".")}/${serviceMethod}`;
+        log.debug("monitor", `gRPC method ${serviceMethodClientImpl}`);
+        client.makeUnaryRequest(
+            serviceMethodClientImpl,
+            arg => arg,
+            arg => arg,
+            requestData,
+            cb);
+    }, false, false);
+    return new Promise((resolve, _) => {
+        return grpcService[`${grpcMethod}`](JSON.parse(grpcBody), function (err, response) {
+            const responseData = JSON.stringify(response);
+            if (err) {
+                return resolve({
+                    code: err.code,
+                    errorMessage: err.details,
+                    data: ""
+                });
+            } else {
+                log.debug("monitor:", `gRPC response: ${response}`);
+                return resolve({
+                    code: 1,
+                    errorMessage: "",
+                    data: responseData
+                });
+            }
+        });
+    });
+};
diff --git a/src/languages/en.js b/src/languages/en.js
index fc777731..0e62cfef 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -6,6 +6,8 @@ export default {
     ignoreTLSError: "Ignore TLS/SSL error for HTTPS websites",
     upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.",
     maxRedirectDescription: "Maximum number of redirects to follow. Set to 0 to disable redirects.",
+    enableGRPCTls: "Allow to send gRPC request with TLS connection",
+    grpcMethodDescription: "Method name is convert to cammelCase format such as sayHello, check, etc.",
     acceptedStatusCodesDescription: "Select status codes which are considered as a successful response.",
     passwordNotMatchMsg: "The repeat password does not match.",
     notificationDescription: "Notifications must be assigned to a monitor to function.",
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index ac6a3e2e..e6c57bb7 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -24,6 +24,9 @@
                                         <option value="keyword">
                                             HTTP(s) - {{ $t("Keyword") }}
                                         </option>
+                                        <option value="grpc-keyword">
+                                            gRPC(s) - {{ $t("Keyword") }}
+                                        </option>
                                         <option value="dns">
                                             DNS
                                         </option>
@@ -67,6 +70,12 @@
                                 <input id="url" v-model="monitor.url" type="url" class="form-control" pattern="https?://.+" required>
                             </div>
 
+                            <!-- gRPC URL -->
+                            <div v-if="monitor.type === 'grpc-keyword' " class="my-3">
+                                <label for="grpc-url" class="form-label">{{ $t("URL") }}</label>
+                                <input id="grpc-url" v-model="monitor.grpcUrl" type="url" class="form-control" pattern="[^\:]+:[0-9]{5}" required>
+                            </div>
+
                             <!-- Push URL -->
                             <div v-if="monitor.type === 'push' " class="my-3">
                                 <label for="push-url" class="form-label">{{ $t("PushUrl") }}</label>
@@ -78,7 +87,7 @@
                             </div>
 
                             <!-- Keyword -->
-                            <div v-if="monitor.type === 'keyword' " class="my-3">
+                            <div v-if="monitor.type === 'keyword' || monitor.type === 'grpc-keyword' " class="my-3">
                                 <label for="keyword" class="form-label">{{ $t("Keyword") }}</label>
                                 <input id="keyword" v-model="monitor.keyword" type="text" class="form-control" required>
                                 <div class="form-text">
@@ -271,7 +280,7 @@
                             </div>
 
                             <!-- HTTP / Keyword only -->
-                            <template v-if="monitor.type === 'http' || monitor.type === 'keyword' ">
+                            <template v-if="monitor.type === 'http' || monitor.type === 'keyword' || monitor.type === 'grpc-keyword' ">
                                 <div class="my-3">
                                     <label for="maxRedirects" class="form-label">{{ $t("Max. Redirects") }}</label>
                                     <input id="maxRedirects" v-model="monitor.maxredirects" type="number" class="form-control" required min="0" step="1">
@@ -449,6 +458,55 @@
                                     </template>
                                 </template>
                             </template>
+
+                            <!-- gRPC Options -->
+                            <template v-if="monitor.type === 'grpc-keyword' ">
+                                <!-- Proto service enable TLS -->
+                                <h2 class="mt-5 mb-2">{{ $t("HTTP Options") }}</h2>
+                                <div class="my-3 form-check">
+                                    <input id="grpc-tls" v-model="monitor.grpcEnableTls" class="form-check-input" type="checkbox">
+                                    <label class="form-check-label" for="upside-down">
+                                        {{ $t("Enable TLS") }}
+                                    </label>
+                                    <div class="form-text">
+                                        {{ $t("enableGRPCTls") }}
+                                    </div>
+                                </div>
+                                <!-- Proto service name data -->
+                                <div class="my-3">
+                                    <label for="protobuf" class="form-label">{{ $t("Proto Service Name") }}</label>
+                                    <input id="name" v-model="monitor.grpcServiceName" type="text" class="form-control" :placeholder="protoServicePlaceholder" required>
+                                </div>
+
+                                <!-- Proto method data -->
+                                <div class="my-3">
+                                    <label for="protobuf" class="form-label">{{ $t("Proto Method") }}</label>
+                                    <input id="name" v-model="monitor.grpcMethod" type="text" class="form-control" :placeholder="protoMethodPlaceholder" required>
+                                    <div class="form-text">
+                                        {{ $t("grpcMethodDescription") }}
+                                    </div>
+                                </div>
+
+                                <!-- Proto data -->
+                                <div class="my-3">
+                                    <label for="protobuf" class="form-label">{{ $t("Proto Content") }}</label>
+                                    <textarea id="protobuf" v-model="monitor.grpcProtobuf" class="form-control" :placeholder="protoBufDataPlaceholder"></textarea>
+                                </div>
+
+                                <!-- Body -->
+                                <div class="my-3">
+                                    <label for="body" class="form-label">{{ $t("Body") }}</label>
+                                    <textarea id="body" v-model="monitor.grpcBody" class="form-control" :placeholder="bodyPlaceholder"></textarea>
+                                </div>
+
+                                <!-- Metadata: temporary disable waiting for next PR allow to send gRPC with metadata -->
+                                <template v-if="false">
+                                    <div class="my-3">
+                                        <label for="metadata" class="form-label">{{ $t("Metadata") }}</label>
+                                        <textarea id="metadata" v-model="monitor.grpcMetadata" class="form-control" :placeholder="headersPlaceholder"></textarea>
+                                    </div>
+                                </template>
+                            </template>
                         </div>
                     </div>
                 </div>
@@ -527,6 +585,40 @@ export default {
             return this.$root.baseURL + "/api/push/" + this.monitor.pushToken + "?status=up&msg=OK&ping=";
         },
 
+        protoServicePlaceholder() {
+            return this.$t("Example:", [ "Health" ]);
+        },
+
+        protoMethodPlaceholder() {
+            return this.$t("Example:", [ "check" ]);
+        },
+
+        protoBufDataPlaceholder() {
+            return this.$t("Example:", [ `
+syntax = "proto3";
+
+package grpc.health.v1;
+
+service Health {
+  rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
+  rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
+}
+
+message HealthCheckRequest {
+  string service = 1;
+}
+
+message HealthCheckResponse {
+  enum ServingStatus {
+    UNKNOWN = 0;
+    SERVING = 1;
+    NOT_SERVING = 2;
+    SERVICE_UNKNOWN = 3;  // Used only by the Watch method.
+  }
+  ServingStatus status = 1;
+}
+            ` ]);
+        },
         bodyPlaceholder() {
             return this.$t("Example:", [ `
 {

From 2232236a7ada728c7547f96251b30c31d0a91579 Mon Sep 17 00:00:00 2001
From: minhhn3 <minhhn3@vng.com.vn>
Date: Wed, 3 Aug 2022 13:39:31 +0700
Subject: [PATCH 071/803] [empty commit] pull request for add gRPC protocol

---
 package-lock.json         | 452 +-------------------------------------
 package.json              |   1 -
 server/model/monitor.js   |  10 +-
 src/pages/EditMonitor.vue |   6 +-
 4 files changed, 21 insertions(+), 448 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 25c6531b..c297455c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -34,7 +34,6 @@
                 "express-basic-auth": "~1.2.1",
                 "express-static-gzip": "^2.1.7",
                 "form-data": "~4.0.0",
-                "grpc-health-check": "^1.3.0",
                 "http-graceful-shutdown": "~3.1.7",
                 "http-proxy-agent": "^5.0.0",
                 "https-proxy-agent": "^5.0.0",
@@ -3489,15 +3488,6 @@
                 "@popperjs/core": "^2.9.2"
             }
         },
-        "node_modules/@types/bytebuffer": {
-            "version": "5.0.43",
-            "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.43.tgz",
-            "integrity": "sha512-vQnTYvy4LpSojHjKdmg4nXFI1BAiYPvZ/k3ouczZAQnbDprk1xqxJiFmFHyy8y6MuUq3slz5erNMtn6n87uVKw==",
-            "dependencies": {
-                "@types/long": "*",
-                "@types/node": "*"
-            }
-        },
         "node_modules/@types/component-emitter": {
             "version": "1.2.11",
             "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
@@ -4276,15 +4266,6 @@
                 "node": ">=0.10.0"
             }
         },
-        "node_modules/ascli": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz",
-            "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==",
-            "dependencies": {
-                "colour": "~0.7.1",
-                "optjs": "~3.2.2"
-            }
-        },
         "node_modules/asn1": {
             "version": "0.2.6",
             "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
@@ -4941,25 +4922,6 @@
                 "readable-stream": "^3.1.1"
             }
         },
-        "node_modules/bytebuffer": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz",
-            "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==",
-            "dependencies": {
-                "long": "~3"
-            },
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/bytebuffer/node_modules/long": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
-            "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==",
-            "engines": {
-                "node": ">=0.6"
-            }
-        },
         "node_modules/bytes": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
@@ -5266,6 +5228,7 @@
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
             "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
+            "optional": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -5310,14 +5273,6 @@
             "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
             "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
         },
-        "node_modules/colour": {
-            "version": "0.7.1",
-            "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz",
-            "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==",
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
         "node_modules/combine-errors": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz",
@@ -5910,6 +5865,7 @@
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
             "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+            "dev": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -8249,155 +8205,12 @@
             "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
             "dev": true
         },
-        "node_modules/google-protobuf": {
-            "version": "3.21.0",
-            "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.0.tgz",
-            "integrity": "sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g=="
-        },
         "node_modules/graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
             "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
             "devOptional": true
         },
-        "node_modules/grpc": {
-            "version": "1.24.11",
-            "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz",
-            "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==",
-            "deprecated": "This library will not receive further updates other than security fixes. We recommend using @grpc/grpc-js instead.",
-            "hasInstallScript": true,
-            "dependencies": {
-                "@mapbox/node-pre-gyp": "^1.0.4",
-                "@types/bytebuffer": "^5.0.40",
-                "lodash.camelcase": "^4.3.0",
-                "lodash.clone": "^4.5.0",
-                "nan": "^2.13.2",
-                "protobufjs": "^5.0.3"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/grpc-health-check": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/grpc-health-check/-/grpc-health-check-1.8.0.tgz",
-            "integrity": "sha512-Fqa35Bg4VhliZE3Yfe88mmYm0nRfKVr/QRYw5zP1jtn1R0f7wwJJqlXsjaoexJy+pVTVXZpP6CxmNGuEv/bngw==",
-            "dependencies": {
-                "google-protobuf": "^3.4.0",
-                "grpc": "^1.6.0",
-                "lodash.clone": "^4.5.0",
-                "lodash.get": "^4.4.2"
-            }
-        },
-        "node_modules/grpc/node_modules/ansi-regex": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-            "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/grpc/node_modules/camelcase": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-            "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/grpc/node_modules/cliui": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-            "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
-            "dependencies": {
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1",
-                "wrap-ansi": "^2.0.0"
-            }
-        },
-        "node_modules/grpc/node_modules/is-fullwidth-code-point": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-            "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
-            "dependencies": {
-                "number-is-nan": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/grpc/node_modules/protobufjs": {
-            "version": "5.0.3",
-            "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz",
-            "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==",
-            "dependencies": {
-                "ascli": "~1",
-                "bytebuffer": "~5",
-                "glob": "^7.0.5",
-                "yargs": "^3.10.0"
-            },
-            "bin": {
-                "pbjs": "bin/pbjs"
-            },
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/grpc/node_modules/string-width": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-            "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
-            "dependencies": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/grpc/node_modules/strip-ansi": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-            "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
-            "dependencies": {
-                "ansi-regex": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/grpc/node_modules/wrap-ansi": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-            "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
-            "dependencies": {
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/grpc/node_modules/y18n": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
-            "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
-        },
-        "node_modules/grpc/node_modules/yargs": {
-            "version": "3.32.0",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
-            "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==",
-            "dependencies": {
-                "camelcase": "^2.0.1",
-                "cliui": "^3.0.3",
-                "decamelize": "^1.1.1",
-                "os-locale": "^1.4.0",
-                "string-width": "^1.0.1",
-                "window-size": "^0.1.4",
-                "y18n": "^3.2.0"
-            }
-        },
         "node_modules/har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -8820,14 +8633,6 @@
                 "node": ">= 0.10"
             }
         },
-        "node_modules/invert-kv": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-            "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/ip": {
             "version": "1.1.8",
             "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
@@ -11618,17 +11423,6 @@
                 "node": ">=0.10.0"
             }
         },
-        "node_modules/lcid": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
-            "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==",
-            "dependencies": {
-                "invert-kv": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/leven": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -11732,11 +11526,6 @@
             "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
             "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
         },
-        "node_modules/lodash.clone": {
-            "version": "4.5.0",
-            "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
-            "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg=="
-        },
         "node_modules/lodash.debounce": {
             "version": "4.0.8",
             "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -12231,11 +12020,6 @@
                 "node": "^12.20.0 || >=14"
             }
         },
-        "node_modules/nan": {
-            "version": "2.16.0",
-            "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
-            "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA=="
-        },
         "node_modules/nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -12616,6 +12400,7 @@
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
             "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
+            "optional": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -12756,11 +12541,6 @@
                 "node": ">= 0.8.0"
             }
         },
-        "node_modules/optjs": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz",
-            "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA=="
-        },
         "node_modules/os-homedir": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
@@ -12770,17 +12550,6 @@
                 "node": ">=0.10.0"
             }
         },
-        "node_modules/os-locale": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-            "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==",
-            "dependencies": {
-                "lcid": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -16630,17 +16399,6 @@
                 "string-width": "^1.0.2 || 2 || 3 || 4"
             }
         },
-        "node_modules/window-size": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
-            "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==",
-            "bin": {
-                "window-size": "cli.js"
-            },
-            "engines": {
-                "node": ">= 0.10.0"
-            }
-        },
         "node_modules/word-wrap": {
             "version": "1.2.3",
             "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -19415,15 +19173,6 @@
                 "@popperjs/core": "^2.9.2"
             }
         },
-        "@types/bytebuffer": {
-            "version": "5.0.43",
-            "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.43.tgz",
-            "integrity": "sha512-vQnTYvy4LpSojHjKdmg4nXFI1BAiYPvZ/k3ouczZAQnbDprk1xqxJiFmFHyy8y6MuUq3slz5erNMtn6n87uVKw==",
-            "requires": {
-                "@types/long": "*",
-                "@types/node": "*"
-            }
-        },
         "@types/component-emitter": {
             "version": "1.2.11",
             "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
@@ -20134,15 +19883,6 @@
             "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
             "dev": true
         },
-        "ascli": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz",
-            "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==",
-            "requires": {
-                "colour": "~0.7.1",
-                "optjs": "~3.2.2"
-            }
-        },
         "asn1": {
             "version": "0.2.6",
             "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
@@ -20657,21 +20397,6 @@
                 "readable-stream": "^3.1.1"
             }
         },
-        "bytebuffer": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz",
-            "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==",
-            "requires": {
-                "long": "~3"
-            },
-            "dependencies": {
-                "long": {
-                    "version": "3.2.0",
-                    "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
-                    "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg=="
-                }
-            }
-        },
         "bytes": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
@@ -20901,7 +20626,8 @@
         "code-point-at": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-            "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="
+            "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
+            "optional": true
         },
         "collect-v8-coverage": {
             "version": "1.0.1",
@@ -20940,11 +20666,6 @@
             "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
             "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
         },
-        "colour": {
-            "version": "0.7.1",
-            "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz",
-            "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg=="
-        },
         "combine-errors": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz",
@@ -21404,7 +21125,8 @@
         "decamelize": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-            "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
+            "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+            "dev": true
         },
         "decamelize-keys": {
             "version": "1.1.0",
@@ -23069,128 +22791,12 @@
             "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
             "dev": true
         },
-        "google-protobuf": {
-            "version": "3.21.0",
-            "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.0.tgz",
-            "integrity": "sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g=="
-        },
         "graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
             "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
             "devOptional": true
         },
-        "grpc": {
-            "version": "1.24.11",
-            "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz",
-            "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==",
-            "requires": {
-                "@mapbox/node-pre-gyp": "^1.0.4",
-                "@types/bytebuffer": "^5.0.40",
-                "lodash.camelcase": "^4.3.0",
-                "lodash.clone": "^4.5.0",
-                "nan": "^2.13.2",
-                "protobufjs": "^5.0.3"
-            },
-            "dependencies": {
-                "ansi-regex": {
-                    "version": "2.1.1",
-                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-                    "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
-                },
-                "camelcase": {
-                    "version": "2.1.1",
-                    "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-                    "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw=="
-                },
-                "cliui": {
-                    "version": "3.2.0",
-                    "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-                    "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
-                    "requires": {
-                        "string-width": "^1.0.1",
-                        "strip-ansi": "^3.0.1",
-                        "wrap-ansi": "^2.0.0"
-                    }
-                },
-                "is-fullwidth-code-point": {
-                    "version": "1.0.0",
-                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-                    "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
-                    "requires": {
-                        "number-is-nan": "^1.0.0"
-                    }
-                },
-                "protobufjs": {
-                    "version": "5.0.3",
-                    "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz",
-                    "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==",
-                    "requires": {
-                        "ascli": "~1",
-                        "bytebuffer": "~5",
-                        "glob": "^7.0.5",
-                        "yargs": "^3.10.0"
-                    }
-                },
-                "string-width": {
-                    "version": "1.0.2",
-                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-                    "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
-                    "requires": {
-                        "code-point-at": "^1.0.0",
-                        "is-fullwidth-code-point": "^1.0.0",
-                        "strip-ansi": "^3.0.0"
-                    }
-                },
-                "strip-ansi": {
-                    "version": "3.0.1",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-                    "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
-                    "requires": {
-                        "ansi-regex": "^2.0.0"
-                    }
-                },
-                "wrap-ansi": {
-                    "version": "2.1.0",
-                    "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-                    "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
-                    "requires": {
-                        "string-width": "^1.0.1",
-                        "strip-ansi": "^3.0.1"
-                    }
-                },
-                "y18n": {
-                    "version": "3.2.2",
-                    "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
-                    "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
-                },
-                "yargs": {
-                    "version": "3.32.0",
-                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
-                    "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==",
-                    "requires": {
-                        "camelcase": "^2.0.1",
-                        "cliui": "^3.0.3",
-                        "decamelize": "^1.1.1",
-                        "os-locale": "^1.4.0",
-                        "string-width": "^1.0.1",
-                        "window-size": "^0.1.4",
-                        "y18n": "^3.2.0"
-                    }
-                }
-            }
-        },
-        "grpc-health-check": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/grpc-health-check/-/grpc-health-check-1.8.0.tgz",
-            "integrity": "sha512-Fqa35Bg4VhliZE3Yfe88mmYm0nRfKVr/QRYw5zP1jtn1R0f7wwJJqlXsjaoexJy+pVTVXZpP6CxmNGuEv/bngw==",
-            "requires": {
-                "google-protobuf": "^3.4.0",
-                "grpc": "^1.6.0",
-                "lodash.clone": "^4.5.0",
-                "lodash.get": "^4.4.2"
-            }
-        },
         "har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -23488,11 +23094,6 @@
             "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
             "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="
         },
-        "invert-kv": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-            "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ=="
-        },
         "ip": {
             "version": "1.1.8",
             "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
@@ -25568,14 +25169,6 @@
             "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
             "dev": true
         },
-        "lcid": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
-            "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==",
-            "requires": {
-                "invert-kv": "^1.0.0"
-            }
-        },
         "leven": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -25670,11 +25263,6 @@
             "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
             "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
         },
-        "lodash.clone": {
-            "version": "4.5.0",
-            "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
-            "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg=="
-        },
         "lodash.debounce": {
             "version": "4.0.8",
             "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -26065,11 +25653,6 @@
                 }
             }
         },
-        "nan": {
-            "version": "2.16.0",
-            "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
-            "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA=="
-        },
         "nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -26381,7 +25964,8 @@
         "number-is-nan": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-            "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="
+            "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
+            "optional": true
         },
         "numbered": {
             "version": "1.1.0",
@@ -26480,25 +26064,12 @@
                 "word-wrap": "^1.2.3"
             }
         },
-        "optjs": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz",
-            "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA=="
-        },
         "os-homedir": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
             "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
             "dev": true
         },
-        "os-locale": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-            "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==",
-            "requires": {
-                "lcid": "^1.0.0"
-            }
-        },
         "p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -29404,11 +28975,6 @@
                 "string-width": "^1.0.2 || 2 || 3 || 4"
             }
         },
-        "window-size": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
-            "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw=="
-        },
         "word-wrap": {
             "version": "1.2.3",
             "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
diff --git a/package.json b/package.json
index 270f757b..71c363b1 100644
--- a/package.json
+++ b/package.json
@@ -86,7 +86,6 @@
         "express-basic-auth": "~1.2.1",
         "express-static-gzip": "^2.1.7",
         "form-data": "~4.0.0",
-        "grpc-health-check": "^1.3.0",
         "http-graceful-shutdown": "~3.1.7",
         "http-proxy-agent": "^5.0.0",
         "https-proxy-agent": "^5.0.0",
diff --git a/server/model/monitor.js b/server/model/monitor.js
index f53ac536..60fb6a52 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -107,7 +107,7 @@ class Monitor extends BeanModel {
             grpcProtobuf: this.grpcProtobuf,
             grpcMethod: this.grpcMethod,
             grpcServiceName: this.grpcServiceName,
-            grpcEnableTls: this.grpcEnableTls,
+            grpcEnableTls: this.getGrpcEnableTls(),
         };
 
         if (includeSensitiveData) {
@@ -167,6 +167,14 @@ class Monitor extends BeanModel {
         return Boolean(this.upsideDown);
     }
 
+    /**
+     * Parse to boolean
+     * @returns {boolean}
+     */
+    getGrpcEnableTls() {
+        return Boolean(this.grpcEnableTls);
+    }
+
     /**
      * Get accepted status codes
      * @returns {Object}
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index e6c57bb7..a0e9e732 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -462,10 +462,10 @@
                             <!-- gRPC Options -->
                             <template v-if="monitor.type === 'grpc-keyword' ">
                                 <!-- Proto service enable TLS -->
-                                <h2 class="mt-5 mb-2">{{ $t("HTTP Options") }}</h2>
+                                <h2 class="mt-5 mb-2">{{ $t("GRPC Options") }}</h2>
                                 <div class="my-3 form-check">
-                                    <input id="grpc-tls" v-model="monitor.grpcEnableTls" class="form-check-input" type="checkbox">
-                                    <label class="form-check-label" for="upside-down">
+                                    <input id="grpc-enable-tls" v-model="monitor.grpcEnableTls" class="form-check-input" type="checkbox" value="">
+                                    <label class="form-check-label" for="grpc-enable-tls">
                                         {{ $t("Enable TLS") }}
                                     </label>
                                     <div class="form-text">

From 34ab6142db7b63ebb2b1600d2a73e7432a522437 Mon Sep 17 00:00:00 2001
From: minhhn3 <minhhn3@vng.com.vn>
Date: Mon, 8 Aug 2022 19:38:43 +0700
Subject: [PATCH 072/803] fix: remove new space line

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 60fb6a52..216ec3bd 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1048,7 +1048,6 @@ class Monitor extends BeanModel {
             monitorID
         ]);
     }
-
 }
 
 module.exports = Monitor;

From 3a188017228b2437820133827c36b03a7b9597f7 Mon Sep 17 00:00:00 2001
From: Justin Tisdale <jtisdale@Admins-MacBook-Pro.local>
Date: Wed, 10 Aug 2022 21:46:43 -0400
Subject: [PATCH 073/803] Add Body Encoding field

---
 src/languages/en.js       |  1 +
 src/pages/EditMonitor.vue | 17 +++++++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/src/languages/en.js b/src/languages/en.js
index b9951612..4433e2a5 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -553,4 +553,5 @@ export default {
     disableCloudflaredNoAuthMsg: "You are in No Auth mode, password is not require.",
     trustProxyDescription: "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
     wayToGetLineNotifyToken: "You can get an access token from {0}",
+    "Body Encoding": "Body Encoding"
 };
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index ac6a3e2e..7dcc7d64 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -396,6 +396,22 @@
                                     </select>
                                 </div>
 
+                                <!-- Encoding -->
+                                <div class="my-3">
+                                    <label for="bodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
+                                    <select id="bodyEncoding" v-model="monitor.bodyEncoding" class="form-select">
+                                        <option value="json">
+                                            JSON
+                                        </option>
+                                        <option value="form">
+                                            x-www-form-urlencoded
+                                        </option>
+                                        <option value="xml">
+                                            XML
+                                        </option>
+                                    </select>
+                                </div>
+
                                 <!-- Body -->
                                 <div class="my-3">
                                     <label for="body" class="form-label">{{ $t("Body") }}</label>
@@ -644,6 +660,7 @@ export default {
                     mqttTopic: "",
                     mqttSuccessMessage: "",
                     authMethod: null,
+                    bodyEncoding: null
                 };
 
                 if (this.$root.proxyList && !this.monitor.proxyId) {

From 2af754b5e85e36b8f1f3b4b376cd970c116d7c3f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 11 Aug 2022 21:09:16 +0800
Subject: [PATCH 074/803] Update package-lock.json

---
 package-lock.json | 114 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)

diff --git a/package-lock.json b/package-lock.json
index 778e6bc3..0cf62fa7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -39,6 +39,7 @@
                 "mqtt": "^4.2.8",
                 "mssql": "^8.1.0",
                 "node-cloudflared-tunnel": "~1.0.9",
+                "node-radius-client": "^1.0.0",
                 "nodemailer": "~6.6.5",
                 "notp": "~2.0.3",
                 "password-hash": "~1.2.2",
@@ -8215,6 +8216,12 @@
                 "readable-stream": "^3.6.0"
             }
         },
+        "node_modules/hoek": {
+            "version": "6.1.3",
+            "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz",
+            "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==",
+            "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues."
+        },
         "node_modules/homedir-polyfill": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
@@ -8915,6 +8922,17 @@
             "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
             "devOptional": true
         },
+        "node_modules/isemail": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz",
+            "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
+            "dependencies": {
+                "punycode": "2.x.x"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
         "node_modules/isexe": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -12151,6 +12169,32 @@
             "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
             "dev": true
         },
+        "node_modules/node-radius-client": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/node-radius-client/-/node-radius-client-1.0.0.tgz",
+            "integrity": "sha512-FkR9cMV5hNoX+kKDUTzuagvEixlLiaEJQ1/ywOdhahsihKrGDhVZmnCvmrCStA589MT3yuC/J2eKc6z68IGdBw==",
+            "dependencies": {
+                "joi": "^14.3.1",
+                "node-radius-utils": "^1.2.0",
+                "radius": "^1.1.4"
+            }
+        },
+        "node_modules/node-radius-client/node_modules/joi": {
+            "version": "14.3.1",
+            "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
+            "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
+            "deprecated": "This module has moved and is now available at @hapi/joi. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
+            "dependencies": {
+                "hoek": "6.x.x",
+                "isemail": "3.x.x",
+                "topo": "3.x.x"
+            }
+        },
+        "node_modules/node-radius-utils": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/node-radius-utils/-/node-radius-utils-1.2.0.tgz",
+            "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
+        },
         "node_modules/node-releases": {
             "version": "2.0.5",
             "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
@@ -13429,6 +13473,14 @@
                 "node": ">=8"
             }
         },
+        "node_modules/radius": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/radius/-/radius-1.1.4.tgz",
+            "integrity": "sha512-UWuzdF6xf3NpsXFZZmUEkxtEalDXj8hdmMXgbGzn7vOk6zXNsiIY2I6SJ1euHt7PTQuMoz2qDEJB+AfJDJgQYw==",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
         "node_modules/range-parser": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -15261,6 +15313,15 @@
                 "node": ">=0.6"
             }
         },
+        "node_modules/topo": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz",
+            "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
+            "deprecated": "This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
+            "dependencies": {
+                "hoek": "6.x.x"
+            }
+        },
         "node_modules/toposort": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
@@ -22641,6 +22702,11 @@
                 "readable-stream": "^3.6.0"
             }
         },
+        "hoek": {
+            "version": "6.1.3",
+            "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz",
+            "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ=="
+        },
         "homedir-polyfill": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
@@ -23123,6 +23189,14 @@
             "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
             "devOptional": true
         },
+        "isemail": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz",
+            "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
+            "requires": {
+                "punycode": "2.x.x"
+            }
+        },
         "isexe": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -25618,6 +25692,33 @@
             "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
             "dev": true
         },
+        "node-radius-client": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/node-radius-client/-/node-radius-client-1.0.0.tgz",
+            "integrity": "sha512-FkR9cMV5hNoX+kKDUTzuagvEixlLiaEJQ1/ywOdhahsihKrGDhVZmnCvmrCStA589MT3yuC/J2eKc6z68IGdBw==",
+            "requires": {
+                "joi": "^14.3.1",
+                "node-radius-utils": "^1.2.0",
+                "radius": "^1.1.4"
+            },
+            "dependencies": {
+                "joi": {
+                    "version": "14.3.1",
+                    "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
+                    "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
+                    "requires": {
+                        "hoek": "6.x.x",
+                        "isemail": "3.x.x",
+                        "topo": "3.x.x"
+                    }
+                }
+            }
+        },
+        "node-radius-utils": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/node-radius-utils/-/node-radius-utils-1.2.0.tgz",
+            "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
+        },
         "node-releases": {
             "version": "2.0.5",
             "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
@@ -26532,6 +26633,11 @@
             "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
             "dev": true
         },
+        "radius": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/radius/-/radius-1.1.4.tgz",
+            "integrity": "sha512-UWuzdF6xf3NpsXFZZmUEkxtEalDXj8hdmMXgbGzn7vOk6zXNsiIY2I6SJ1euHt7PTQuMoz2qDEJB+AfJDJgQYw=="
+        },
         "range-parser": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -27967,6 +28073,14 @@
             "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
             "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
         },
+        "topo": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz",
+            "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
+            "requires": {
+                "hoek": "6.x.x"
+            }
+        },
         "toposort": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",

From 2b9bf095a609bbf2f2c517209b13cb57dbd1e1b1 Mon Sep 17 00:00:00 2001
From: Justin Tisdale <justin@justintisdale.com>
Date: Thu, 11 Aug 2022 20:57:03 -0400
Subject: [PATCH 075/803] Add non-json support for http body

---
 db/patch-http-body-encoding.sql |  6 ++++++
 server/database.js              |  1 +
 server/model/monitor.js         | 20 +++++++++++++++++++-
 server/server.js                |  1 +
 src/pages/EditMonitor.vue       | 13 +++++++------
 5 files changed, 34 insertions(+), 7 deletions(-)
 create mode 100644 db/patch-http-body-encoding.sql

diff --git a/db/patch-http-body-encoding.sql b/db/patch-http-body-encoding.sql
new file mode 100644
index 00000000..de02bede
--- /dev/null
+++ b/db/patch-http-body-encoding.sql
@@ -0,0 +1,6 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+ALTER TABLE [monitor] ADD http_body_encoding TEXT;
+
+COMMIT;
diff --git a/server/database.js b/server/database.js
index b234d67d..ecf6af72 100644
--- a/server/database.js
+++ b/server/database.js
@@ -62,6 +62,7 @@ class Database {
         "patch-add-clickable-status-page-link.sql": true,
         "patch-add-sqlserver-monitor.sql": true,
         "patch-add-other-auth.sql": { parents: [ "patch-monitor-basic-auth.sql" ] },
+        "patch-http-body-encoding.sql": true
     };
 
     /**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 2feef135..af3d162a 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -103,6 +103,7 @@ class Monitor extends BeanModel {
             authMethod: this.authMethod,
             authWorkstation: this.authWorkstation,
             authDomain: this.authDomain,
+            httpBodyEncoding: this.httpBodyEncoding
         };
 
         if (includeSensitiveData) {
@@ -241,16 +242,33 @@ class Monitor extends BeanModel {
 
                     log.debug("monitor", `[${this.name}] Prepare Options for axios`);
 
+                    // Set content-type header and body values based on the httpBodyEncoding type selected
+                    // TODO: Check if this.headers already contains a content-type header set by the user; if so, don't inject one
+                    let bodyValue = null;
+                    let contentType = null;
+
+                    if (this.body && !this.httpBodyEncoding || this.httpBodyEncoding === "json"){
+                        bodyValue = JSON.parse(this.body);
+                        contentType = "application/json";
+                    } else if (this.body && (this.httpBodyEncoding === "xml")) {
+                        bodyValue = this.body;
+                        contentType = "text/xml";
+                    } else if (this.body && (this.httpBodyEncoding === "form")) {
+                        bodyValue = this.body;
+                        contentType = "application/x-www-form-urlencoded";
+                    }
+
                     const options = {
                         url: this.url,
                         method: (this.method || "get").toLowerCase(),
-                        ...(this.body ? { data: JSON.parse(this.body) } : {}),
+                        ...(bodyValue ? { data: bodyValue } : {}),
                         timeout: this.interval * 1000 * 0.8,
                         headers: {
                             "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
                             "User-Agent": "Uptime-Kuma/" + version,
                             ...(this.headers ? JSON.parse(this.headers) : {}),
                             ...(basicAuthHeader),
+                            ...(contentType ? { "Content-Type": contentType } : {})
                         },
                         maxRedirects: this.maxredirects,
                         validateStatus: (status) => {
diff --git a/server/server.js b/server/server.js
index 2a2c4bf6..616a10cd 100644
--- a/server/server.js
+++ b/server/server.js
@@ -693,6 +693,7 @@ let needSetup = false;
                 bean.authMethod = monitor.authMethod;
                 bean.authWorkstation = monitor.authWorkstation;
                 bean.authDomain = monitor.authDomain;
+                bean.httpBodyEncoding = monitor.httpBodyEncoding;
 
                 await R.store(bean);
 
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 7dcc7d64..b4aceba7 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -398,8 +398,8 @@
 
                                 <!-- Encoding -->
                                 <div class="my-3">
-                                    <label for="bodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
-                                    <select id="bodyEncoding" v-model="monitor.bodyEncoding" class="form-select">
+                                    <label for="httpBodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
+                                    <select id="httpBodyEncoding" v-model="monitor.httpBodyEncoding" class="form-select">
                                         <option value="json">
                                             JSON
                                         </option>
@@ -660,7 +660,7 @@ export default {
                     mqttTopic: "",
                     mqttSuccessMessage: "",
                     authMethod: null,
-                    bodyEncoding: null
+                    httpBodyEncoding: "json"
                 };
 
                 if (this.$root.proxyList && !this.monitor.proxyId) {
@@ -698,7 +698,8 @@ export default {
          * @returns {boolean} Is the form input valid?
          */
         isInputValid() {
-            if (this.monitor.body) {
+            //TODO: Handle validation for all 3 possible options + null value
+            if (this.monitor.body && (!this.monitor.httpBodyEncoding || this.monitor.httpBodyEncoding === "json")) {
                 try {
                     JSON.parse(this.monitor.body);
                 } catch (err) {
@@ -729,8 +730,8 @@ export default {
                 return;
             }
 
-            // Beautify the JSON format
-            if (this.monitor.body) {
+            // Beautify the JSON format (only if httpBodyEncoding is not set or === json)
+            if (this.monitor.body && (!this.monitor.httpBodyEncoding || this.monitor.httpBodyEncoding === "json")) {
                 this.monitor.body = JSON.stringify(JSON.parse(this.monitor.body), null, 4);
             }
 

From 31cc328839c9462169070b4b67ba4044fb6716d8 Mon Sep 17 00:00:00 2001
From: Justin Tisdale <justin@justintisdale.com>
Date: Thu, 11 Aug 2022 21:08:13 -0400
Subject: [PATCH 076/803] fix lint

---
 server/model/monitor.js | 2 +-
 src/languages/en.js     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 5d9c4cd4..8f30a0c1 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -252,7 +252,7 @@ class Monitor extends BeanModel {
                     let bodyValue = null;
                     let contentType = null;
 
-                    if (this.body && !this.httpBodyEncoding || this.httpBodyEncoding === "json"){
+                    if (this.body && !this.httpBodyEncoding || this.httpBodyEncoding === "json") {
                         bodyValue = JSON.parse(this.body);
                         contentType = "application/json";
                     } else if (this.body && (this.httpBodyEncoding === "xml")) {
diff --git a/src/languages/en.js b/src/languages/en.js
index e338d778..31d92628 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -559,5 +559,5 @@ export default {
     disableCloudflaredNoAuthMsg: "You are in No Auth mode, password is not require.",
     trustProxyDescription: "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
     wayToGetLineNotifyToken: "You can get an access token from {0}",
-    "Body Encoding": "Body Encoding"
+    "Body Encoding": "Body Encoding",
 };

From a6007adce38755cb924d980fccf5250a9b040adc Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 13 Aug 2022 13:32:16 +0800
Subject: [PATCH 077/803] Update to 1.18.0-beta.1

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

diff --git a/package.json b/package.json
index bac451d5..68a5863d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.17.1",
+    "version": "1.18.0-beta.1",
     "license": "MIT",
     "repository": {
         "type": "git",

From 728e811969a2ecc4c3550d37fb75e1c893750d3c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 13 Aug 2022 13:35:03 +0800
Subject: [PATCH 078/803] Update Apprise to 1.0.0

---
 docker/alpine-base.dockerfile | 2 +-
 docker/debian-base.dockerfile | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/docker/alpine-base.dockerfile b/docker/alpine-base.dockerfile
index cde65bb6..1d74de05 100644
--- a/docker/alpine-base.dockerfile
+++ b/docker/alpine-base.dockerfile
@@ -4,5 +4,5 @@ WORKDIR /app
 
 # Install apprise, iputils for non-root ping, setpriv
 RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
-    pip3 --no-cache-dir install apprise==0.9.9 && \
+    pip3 --no-cache-dir install apprise==1.0.0 && \
     rm -rf /root/.cache
diff --git a/docker/debian-base.dockerfile b/docker/debian-base.dockerfile
index f90968a8..20bef3dd 100644
--- a/docker/debian-base.dockerfile
+++ b/docker/debian-base.dockerfile
@@ -11,7 +11,7 @@ WORKDIR /app
 RUN apt update && \
     apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
         sqlite3 iputils-ping util-linux dumb-init && \
-    pip3 --no-cache-dir install apprise==0.9.9 && \
+    pip3 --no-cache-dir install apprise==1.0.0 && \
     rm -rf /var/lib/apt/lists/* && \
     apt --yes autoremove
 

From af944242839616ed0a990fdba2e2f43fd043d4c4 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 13 Aug 2022 14:04:17 +0800
Subject: [PATCH 079/803] Update to 1.18.0-beta.0

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

diff --git a/package.json b/package.json
index 68a5863d..981ca191 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.0-beta.1",
+    "version": "1.18.0-beta.0",
     "license": "MIT",
     "repository": {
         "type": "git",

From b3712ee1ccb4715dc2464fc0a3cd821e80eab4d1 Mon Sep 17 00:00:00 2001
From: AnnAngela <naganjue@vip.qq.com>
Date: Sat, 13 Aug 2022 16:19:51 +0800
Subject: [PATCH 080/803] fix: Update en language file to match up newest
 development

---
 src/languages/en.js | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/languages/en.js b/src/languages/en.js
index 3bb02585..f281cade 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -562,4 +562,18 @@ export default {
     disableCloudflaredNoAuthMsg: "You are in No Auth mode, password is not require.",
     trustProxyDescription: "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
     wayToGetLineNotifyToken: "You can get an access token from {0}",
+    Examples: "Examples",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "default: notify all devices",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
+    "Automations can optionally be triggered in Home Assistant:": "Automations can optionally be triggered in Home Assistant:",
+    "Trigger type:": "Trigger type:",
+    "Event type:": "Event type:",
+    "Event data:": "Event data:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
+    "Frontend Version": "Frontend Version",
+    "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
 };

From 684d0a7eb8113ccdd85f8b8c7d9aa3ac902db33b Mon Sep 17 00:00:00 2001
From: AnnAngela <naganjue@vip.qq.com>
Date: Sat, 13 Aug 2022 16:23:51 +0800
Subject: [PATCH 081/803] feat: Update zh-CN languages file
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Due to no Radius server and Home Assistant device or server in my hands, the translation may be incorrect.\nRef:\n- Radius secret → Radius 共享机密: https://docs.microsoft.com/zh-cn/azure/active-directory/authentication/howto-mfaserver-dir-radius#:~:text=%E5%8F%AF%E9%80%89%EF%BC%89%E5%92%8C-,%E5%85%B1%E4%BA%AB%E6%9C%BA%E5%AF%86,-%E3%80%82\n- Called Station Id → NAS 网络访问服务器号码: https://docs.microsoft.com/zh-cn/windows-server/networking/technologies/nps/nps-plan-proxy#:~:text=Called%2DStation%2DID%E3%80%82-,NAS%20%E7%BD%91%E7%BB%9C%E8%AE%BF%E9%97%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%20(%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81),-%E3%80%82%20%E6%AD%A4%E5%B1%9E%E6%80%A7%E7%9A%84\n- Calling Station Id → 呼叫方号码: https://docs.microsoft.com/zh-cn/windows-server/networking/technologies/nps/nps-plan-proxy#:~:text=Calling%2DStation%2DID%E3%80%82-,%E5%91%BC%E5%8F%AB%E6%96%B9%E4%BD%BF%E7%94%A8%E7%9A%84%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81,-%E3%80%82%20%E6%AD%A4%E5%B1%9E%E6%80%A7%E7%9A%84
---
 src/languages/zh-CN.js | 43 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 41 insertions(+), 2 deletions(-)

diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index 8dbe05f0..a37d4ae4 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -540,6 +540,45 @@ export default {
     settingsCertificateExpiry: "TLS 证书过期通知",
     certificationExpiryDescription: "HTTPS 监控项发现被监控目标的 TLS 证书剩余有效期少于以下天数时将发出通知:",
     "ntfy Topic": "ntfy 主题",
-    "Domain": "域名",
-    "Workstation": "工作站",
+    Domain: "域名",
+    Workstation: "工作站",
+    resendEveryXTimes: "每 {0} 次失败则重复发送一次",
+    resendDisabled: "为 0 时禁用重复发送",
+    "Resend Notification if Down X times consequently": "连续失败时重复发送通知的间隔次数",
+    "HTTP Headers": "HTTP 头",
+    "Trust Proxy": "可信的代理类字段",
+    HomeAssistant: "Home Assistant",
+    RadiusSecret: "Radius 共享机密",
+    RadiusSecretDescription: "客户端和服务器之间共享的密钥",
+    RadiusCalledStationId: "NAS 网络访问服务器号码(Called Station Id)",
+    RadiusCalledStationIdDescription: "所访问的服务器的标识",
+    RadiusCallingStationId: "呼叫方号码(Calling Station Id)",
+    RadiusCallingStationIdDescription: "发出请求的设备的标识",
+    "Setup Docker Host": "配置 Docker 宿主信息",
+    "Connection Type": "连接方式",
+    "Docker Daemon": "Docker 守护进程",
+    deleteDockerHostMsg: "您确定您要删除此 Docker 宿主设置吗?这会影响所有 Docker 监控项",
+    socket: "Socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker 容器",
+    "Container Name / ID": "容器名称 / ID",
+    "Docker Host": "Docker 宿主",
+    "Docker Hosts": "Docker 宿主",
+    disableCloudflaredNoAuthMsg: "您现在正处于 No Auth 模式,无需输入密码",
+    trustProxyDescription: "信任 'X-Forwarded-*' 头。如果您的 Uptime Kuma 是通过 Nginx 或 Apache 等反代服务对外提供访问的话,则您应当启用本功能以获取正确的客户端 IP。",
+    wayToGetLineNotifyToken: "您可以在 {0} 获取 Access token",
+    Examples: "例如",
+    "Home Assistant URL": "Home Assistant 地址",
+    "Long-Lived Access Token": "长期访问令牌",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "长期访问令牌可通过点击左下角您的用户名,滚动到页面底部并点击 Create Token 按钮获取。",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "默认:通知所有设备",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "通知服务的列表可在 Home Assistant 中的 Developer Tools > Services 通过搜索您的设备或手机的名称来获得。",
+    "Automations can optionally be triggered in Home Assistant:": "可以在 Home Assistant 使用下列模板设置自动化操作的触发条件:",
+    "Trigger type:": "触发类型:",
+    "Event type:": "事件类型:",
+    "Event data:": "事件数据:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "然后您可以选择关联操作,例如切换到 RGB 灯发出红光的场景",
+    "Frontend Version": "前端版本",
+    "Frontend Version do not match backend version!": "前端版本与后端版本不符!",
 };

From fac2f1cbc65811f2c52dda005dea7bcbc69c958b Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Sun, 14 Aug 2022 08:52:53 +0300
Subject: [PATCH 082/803] Update bg-BG.js

Translated new fields for the upcoming 1.18.0 release.
---
 src/languages/bg-BG.js | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 1f531448..a234e56f 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -537,4 +537,29 @@ export default {
     Workstation: "Работна станция",
     disableCloudflaredNoAuthMsg: "Тъй като сте в режим \"No Auth mode\", парола не се изисква.",
     wayToGetLineNotifyToken: "Може да получите токен код за достъп от {0}",
+    resendEveryXTimes: "Изпращай повторно на всеки {0} пъти",
+    resendDisabled: "Повторното изпращане е изключено",
+    "Resend Notification if Down X times consequently": "Повторно изпращане на известие, ако е недостъпен X пъти последователно",
+    "Bark Group": "Bark група",
+    "Bark Sound": "Bark звук",
+    "HTTP Headers": "HTTP хедъри",
+    "Trust Proxy": "Trust Proxy",
+    HomeAssistant: "Home Assistant",
+    RadiusSecret: "Radius таен код",
+    RadiusSecretDescription: "Споделен таен код между клиент и сървър",
+    RadiusCalledStationId: "Повиквана станция ID",
+    RadiusCalledStationIdDescription: "Идентификатор на повикваното устройство",
+    RadiusCallingStationId: "Повикваща станция ID",
+    RadiusCallingStationIdDescription: "Идентификатор на повикващото устройство",
+    "Setup Docker Host": "Настройка на Docker хост",
+    "Connection Type": "Тип свързване",
+    "Docker Daemon": "Docker демон",
+    deleteDockerHostMsg: "Сигурни ли сте, че желаете да изтриете този Docker хост за всички монитори?",
+    socket: "Сокет",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker контейнер",
+    "Container Name / ID": "Име на контейнер / ID",
+    "Docker Host": "Docker хост",
+    "Docker Hosts": "Docker хостове",
+    trustProxyDescription: "Trust 'X-Forwarded-*' headers.  Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
 };

From 3a90d246a4176f90690a83e1b68d0fe314612147 Mon Sep 17 00:00:00 2001
From: minhhn3 <minhhn3@vng.com.vn>
Date: Sat, 20 Aug 2022 22:45:11 +0700
Subject: [PATCH 083/803] fix: wrong type

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

diff --git a/server/server.js b/server/server.js
index c3451638..13d55536 100644
--- a/server/server.js
+++ b/server/server.js
@@ -694,7 +694,7 @@ let needSetup = false;
                 bean.authMethod = monitor.authMethod;
                 bean.authWorkstation = monitor.authWorkstation;
                 bean.authDomain = monitor.authDomain;
-                bean.grpUrl = monitor.grpUrl;
+                bean.grpcUrl = monitor.grpcUrl;
                 bean.grpcProtobuf = monitor.grpcProtobuf;
                 bean.grpcMethod = monitor.grpcMethod;
                 bean.grpcBody = monitor.grpcBody;

From 04fc12492841f9cb0078cb47385c8e8150ff01c4 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Tue, 23 Aug 2022 21:14:09 +0430
Subject: [PATCH 084/803] [empty commit] pull request for GoAlert Notification


From 65e6921a41b709fbf344ed3c802b291cc292a1db Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Tue, 23 Aug 2022 22:22:54 +0430
Subject: [PATCH 085/803] goalert notification provider added

---
 server/notification-providers/goalert.js | 32 ++++++++++++++++++++++++
 server/notification.js                   |  2 ++
 2 files changed, 34 insertions(+)
 create mode 100644 server/notification-providers/goalert.js

diff --git a/server/notification-providers/goalert.js b/server/notification-providers/goalert.js
new file mode 100644
index 00000000..9a63ca5b
--- /dev/null
+++ b/server/notification-providers/goalert.js
@@ -0,0 +1,32 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const { UP } = require("../../src/util");
+
+class GoAlert extends NotificationProvider {
+
+    name = "goalert";
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+        let closeAction = "close";
+        let parameters = {
+            token: notification.goAlertToken,
+            summary: msg,
+        }
+        if (heartbeatJSON["status"] === UP) {
+            parameters["action"] = closeAction;
+        }
+        try {
+            await axios.get(`${notification.goAlertBaseURL}/api/v2/generic/incoming`, {
+                params: parameters,
+            });
+            return okMsg;
+
+        } catch (error) {
+            let msg = (error.response.data) ? error.response.data : "Error without response";
+            throw new Error(msg);
+        }
+    }
+}
+
+module.exports = GoAlert;
diff --git a/server/notification.js b/server/notification.js
index 8093572a..e7afbdc9 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -38,6 +38,7 @@ const TechulusPush = require("./notification-providers/techulus-push");
 const Telegram = require("./notification-providers/telegram");
 const Webhook = require("./notification-providers/webhook");
 const WeCom = require("./notification-providers/wecom");
+const GoAlert = require("./notification-providers/goalert")
 
 class Notification {
 
@@ -88,6 +89,7 @@ class Notification {
             new Telegram(),
             new Webhook(),
             new WeCom(),
+            new GoAlert(),
         ];
 
         for (let item of list) {

From 40b9d9ed171c368aa428b572e0666d0af44bacc5 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Tue, 23 Aug 2022 22:26:20 +0430
Subject: [PATCH 086/803] goalert provider missing semicolon fix for linter

---
 server/notification-providers/goalert.js | 2 +-
 server/notification.js                   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/notification-providers/goalert.js b/server/notification-providers/goalert.js
index 9a63ca5b..f3ab18d5 100644
--- a/server/notification-providers/goalert.js
+++ b/server/notification-providers/goalert.js
@@ -12,7 +12,7 @@ class GoAlert extends NotificationProvider {
         let parameters = {
             token: notification.goAlertToken,
             summary: msg,
-        }
+        };
         if (heartbeatJSON["status"] === UP) {
             parameters["action"] = closeAction;
         }
diff --git a/server/notification.js b/server/notification.js
index e7afbdc9..3306a53a 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -38,7 +38,7 @@ const TechulusPush = require("./notification-providers/techulus-push");
 const Telegram = require("./notification-providers/telegram");
 const Webhook = require("./notification-providers/webhook");
 const WeCom = require("./notification-providers/wecom");
-const GoAlert = require("./notification-providers/goalert")
+const GoAlert = require("./notification-providers/goalert");
 
 class Notification {
 

From af89c4d8aeac9339d65f5c4e87888d5ca4b47c29 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Tue, 23 Aug 2022 23:49:28 +0430
Subject: [PATCH 087/803] GoAlert Notification added done

needs test
---
 src/components/notifications/GoAlert.vue | 30 ++++++++++++++++++++++++
 src/components/notifications/index.js    |  2 ++
 src/languages/en.js                      |  4 ++++
 3 files changed, 36 insertions(+)
 create mode 100644 src/components/notifications/GoAlert.vue

diff --git a/src/components/notifications/GoAlert.vue b/src/components/notifications/GoAlert.vue
new file mode 100644
index 00000000..30995fd5
--- /dev/null
+++ b/src/components/notifications/GoAlert.vue
@@ -0,0 +1,30 @@
+<template>
+    <div class="mb-3">
+        <label for="goalert-base-url" class="form-label">{{ $t("Base URL") }}</label>
+        <div class="input-group mb-3">
+            <input class="form-control" id="goalert-base-url" v-model="$parent.notification.goAlertBaseURL" type="text" required>
+        </div>
+        <i18n-t tag="div" keypath="goAlertInfo" class="form-text">
+            <a href="https://goalert.me" target="_blank">https://goalert.me</a>
+        </i18n-t>
+    </div>
+
+    <div class="mb-3">
+        <label for="goalert-token" class="form-label">{{ $t("Token") }}</label>
+        <HiddenInput id="goalert-token" v-model="$parent.notification.goAlertToken" autocomplete="one-time-code" :required="true"></HiddenInput>
+
+        <div class="form-text">
+            {{ $t("goAlertIntegrationKeyInfo") }}
+        </div>
+    </div>
+</template>
+
+<script>
+import HiddenInput from "../HiddenInput.vue";
+
+export default {
+    components: {
+        HiddenInput,
+    },
+}
+</script>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index ff523052..2ea178a9 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -36,6 +36,7 @@ import TechulusPush from "./TechulusPush.vue";
 import Telegram from "./Telegram.vue";
 import Webhook from "./Webhook.vue";
 import WeCom from "./WeCom.vue";
+import GoAlert from "./GoAlert.vue";
 
 /**
  * Manage all notification form.
@@ -81,6 +82,7 @@ const NotificationFormList = {
     "telegram": Telegram,
     "webhook": Webhook,
     "WeCom": WeCom,
+    "GoAlert": GoAlert
 };
 
 export default NotificationFormList;
diff --git a/src/languages/en.js b/src/languages/en.js
index f281cade..95b0df69 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -576,4 +576,8 @@ export default {
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
     "Frontend Version": "Frontend Version",
     "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
+    "Base URL": "Base URL",
+    goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time!",
+    goAlertIntegrationKeyInfo: "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
+    goAlert: "GoAlert"
 };

From 4ac80cfc025b2afabf42e081988157574b532812 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Tue, 23 Aug 2022 23:54:26 +0430
Subject: [PATCH 088/803] goAlertInfo language fix

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

diff --git a/src/languages/en.js b/src/languages/en.js
index 95b0df69..97362a16 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -577,7 +577,7 @@ export default {
     "Frontend Version": "Frontend Version",
     "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
     "Base URL": "Base URL",
-    goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time!",
+    goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
     goAlertIntegrationKeyInfo: "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
     goAlert: "GoAlert"
 };

From 055948d1b9e2e792c0755a2e54cb072b4c731a10 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Tue, 23 Aug 2022 23:58:46 +0430
Subject: [PATCH 089/803] [Linter] typo fixes

---
 src/components/notifications/GoAlert.vue | 4 ++--
 src/languages/en.js                      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/components/notifications/GoAlert.vue b/src/components/notifications/GoAlert.vue
index 30995fd5..a1465b50 100644
--- a/src/components/notifications/GoAlert.vue
+++ b/src/components/notifications/GoAlert.vue
@@ -2,7 +2,7 @@
     <div class="mb-3">
         <label for="goalert-base-url" class="form-label">{{ $t("Base URL") }}</label>
         <div class="input-group mb-3">
-            <input class="form-control" id="goalert-base-url" v-model="$parent.notification.goAlertBaseURL" type="text" required>
+            <input id="goalert-base-url" v-model="$parent.notification.goAlertBaseURL" type="text" class="form-control" required>
         </div>
         <i18n-t tag="div" keypath="goAlertInfo" class="form-text">
             <a href="https://goalert.me" target="_blank">https://goalert.me</a>
@@ -26,5 +26,5 @@ export default {
     components: {
         HiddenInput,
     },
-}
+};
 </script>
diff --git a/src/languages/en.js b/src/languages/en.js
index 97362a16..f8f8b87a 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -579,5 +579,5 @@ export default {
     "Base URL": "Base URL",
     goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
     goAlertIntegrationKeyInfo: "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
-    goAlert: "GoAlert"
+    goAlert: "GoAlert",
 };

From e557545c970cebb134ca2d9be811707ba35b2f10 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Wed, 24 Aug 2022 08:46:20 +0430
Subject: [PATCH 090/803] goalert needs post instead of get

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

diff --git a/server/notification-providers/goalert.js b/server/notification-providers/goalert.js
index f3ab18d5..cbd5e3d8 100644
--- a/server/notification-providers/goalert.js
+++ b/server/notification-providers/goalert.js
@@ -17,7 +17,7 @@ class GoAlert extends NotificationProvider {
             parameters["action"] = closeAction;
         }
         try {
-            await axios.get(`${notification.goAlertBaseURL}/api/v2/generic/incoming`, {
+            await axios.post(`${notification.goAlertBaseURL}/api/v2/generic/incoming`, {
                 params: parameters,
             });
             return okMsg;

From d44663c57c4105077f1329fefcb178b082444b56 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Wed, 24 Aug 2022 09:37:15 +0430
Subject: [PATCH 091/803] provider name fix

---
 server/notification-providers/goalert.js | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/server/notification-providers/goalert.js b/server/notification-providers/goalert.js
index cbd5e3d8..dce83941 100644
--- a/server/notification-providers/goalert.js
+++ b/server/notification-providers/goalert.js
@@ -4,7 +4,7 @@ const { UP } = require("../../src/util");
 
 class GoAlert extends NotificationProvider {
 
-    name = "goalert";
+    name = "GoAlert";
 
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
@@ -13,9 +13,9 @@ class GoAlert extends NotificationProvider {
             token: notification.goAlertToken,
             summary: msg,
         };
-        if (heartbeatJSON["status"] === UP) {
-            parameters["action"] = closeAction;
-        }
+        // if (heartbeatJSON["status"] === UP) {
+        //     parameters["action"] = closeAction;
+        // }
         try {
             await axios.post(`${notification.goAlertBaseURL}/api/v2/generic/incoming`, {
                 params: parameters,
@@ -24,6 +24,7 @@ class GoAlert extends NotificationProvider {
 
         } catch (error) {
             let msg = (error.response.data) ? error.response.data : "Error without response";
+            console.log(error)
             throw new Error(msg);
         }
     }

From 82dd9a7c16b4266f17dd9aaef2c9d54e70611d9b Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Wed, 24 Aug 2022 10:36:29 +0430
Subject: [PATCH 092/803] golaert req fix and axios update for formdata

---
 package-lock.json                        | 16694 +--------------------
 package.json                             |     2 +-
 server/notification-providers/goalert.js |    27 +-
 3 files changed, 102 insertions(+), 16621 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 0cf62fa7..bb9dac9f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,16564 +1,8 @@
 {
     "name": "uptime-kuma",
-    "version": "1.17.1",
-    "lockfileVersion": 2,
+    "version": "1.18.0-beta.0",
+    "lockfileVersion": 1,
     "requires": true,
-    "packages": {
-        "": {
-            "name": "uptime-kuma",
-            "version": "1.17.1",
-            "license": "MIT",
-            "dependencies": {
-                "@louislam/sqlite3": "~15.0.6",
-                "args-parser": "~1.3.0",
-                "axios": "~0.26.1",
-                "axios-ntlm": "^1.3.0",
-                "badge-maker": "^3.3.1",
-                "bcryptjs": "~2.4.3",
-                "bree": "~7.1.5",
-                "cacheable-lookup": "~6.0.4",
-                "chardet": "^1.3.0",
-                "check-password-strength": "^2.0.5",
-                "cheerio": "^1.0.0-rc.10",
-                "chroma-js": "^2.1.2",
-                "command-exists": "~1.2.9",
-                "compare-versions": "~3.6.0",
-                "compression": "^1.7.4",
-                "dayjs": "^1.11.0",
-                "express": "~4.17.3",
-                "express-basic-auth": "~1.2.1",
-                "express-static-gzip": "^2.1.7",
-                "form-data": "~4.0.0",
-                "http-graceful-shutdown": "~3.1.7",
-                "http-proxy-agent": "^5.0.0",
-                "https-proxy-agent": "^5.0.0",
-                "iconv-lite": "^0.6.3",
-                "jsonwebtoken": "~8.5.1",
-                "jwt-decode": "^3.1.2",
-                "limiter": "^2.1.0",
-                "mqtt": "^4.2.8",
-                "mssql": "^8.1.0",
-                "node-cloudflared-tunnel": "~1.0.9",
-                "node-radius-client": "^1.0.0",
-                "nodemailer": "~6.6.5",
-                "notp": "~2.0.3",
-                "password-hash": "~1.2.2",
-                "pg": "^8.7.3",
-                "pg-connection-string": "^2.5.0",
-                "prom-client": "~13.2.0",
-                "prometheus-api-metrics": "~3.2.1",
-                "redbean-node": "0.1.4",
-                "socket.io": "~4.4.1",
-                "socket.io-client": "~4.4.1",
-                "socks-proxy-agent": "6.1.1",
-                "tar": "^6.1.11",
-                "tcp-ping": "~0.1.1",
-                "thirty-two": "~1.0.2"
-            },
-            "devDependencies": {
-                "@actions/github": "~5.0.1",
-                "@babel/eslint-parser": "~7.17.0",
-                "@babel/preset-env": "^7.15.8",
-                "@fortawesome/fontawesome-svg-core": "~1.2.36",
-                "@fortawesome/free-regular-svg-icons": "~5.15.4",
-                "@fortawesome/free-solid-svg-icons": "~5.15.4",
-                "@fortawesome/vue-fontawesome": "~3.0.0-5",
-                "@popperjs/core": "~2.10.2",
-                "@types/bootstrap": "~5.1.9",
-                "@vitejs/plugin-legacy": "~1.8.2",
-                "@vitejs/plugin-vue": "~2.3.3",
-                "@vue/compiler-sfc": "~3.2.36",
-                "aedes": "^0.46.3",
-                "babel-plugin-rewire": "~1.2.0",
-                "bootstrap": "5.1.3",
-                "chart.js": "~3.6.2",
-                "chartjs-adapter-dayjs": "~1.0.0",
-                "concurrently": "^7.1.0",
-                "core-js": "~3.18.3",
-                "cross-env": "~7.0.3",
-                "dns2": "~2.0.1",
-                "eslint": "~8.14.0",
-                "eslint-plugin-vue": "~8.7.1",
-                "favico.js": "^0.3.10",
-                "jest": "~27.2.5",
-                "jest-puppeteer": "~6.0.3",
-                "postcss-html": "^1.3.1",
-                "postcss-rtlcss": "~3.4.1",
-                "postcss-scss": "~4.0.3",
-                "prismjs": "^1.27.0",
-                "puppeteer": "~13.1.3",
-                "qrcode": "~1.5.0",
-                "rollup-plugin-visualizer": "^5.6.0",
-                "sass": "~1.42.1",
-                "stylelint": "~14.7.1",
-                "stylelint-config-standard": "~25.0.0",
-                "timezones-list": "~3.0.1",
-                "typescript": "~4.4.4",
-                "v-pagination-3": "~0.1.7",
-                "vite": "~2.9.9",
-                "vite-plugin-compression": "^0.5.1",
-                "vue": "next",
-                "vue-chart-3": "3.0.9",
-                "vue-confirm-dialog": "~1.0.2",
-                "vue-contenteditable": "~3.0.4",
-                "vue-i18n": "~9.1.9",
-                "vue-image-crop-upload": "~3.0.3",
-                "vue-multiselect": "~3.0.0-alpha.2",
-                "vue-prism-editor": "^2.0.0-alpha.2",
-                "vue-qrcode": "~1.0.0",
-                "vue-router": "~4.0.14",
-                "vue-toastification": "~2.0.0-rc.5",
-                "vuedraggable": "~4.1.0",
-                "wait-on": "^6.0.1"
-            },
-            "engines": {
-                "node": "14.* || >=16.*"
-            }
-        },
-        "node_modules/@actions/github": {
-            "version": "5.0.3",
-            "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.3.tgz",
-            "integrity": "sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A==",
-            "dev": true,
-            "dependencies": {
-                "@actions/http-client": "^2.0.1",
-                "@octokit/core": "^3.6.0",
-                "@octokit/plugin-paginate-rest": "^2.17.0",
-                "@octokit/plugin-rest-endpoint-methods": "^5.13.0"
-            }
-        },
-        "node_modules/@actions/http-client": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
-            "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
-            "dev": true,
-            "dependencies": {
-                "tunnel": "^0.0.6"
-            }
-        },
-        "node_modules/@ampproject/remapping": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
-            "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
-            "dev": true,
-            "dependencies": {
-                "@jridgewell/gen-mapping": "^0.1.0",
-                "@jridgewell/trace-mapping": "^0.3.9"
-            },
-            "engines": {
-                "node": ">=6.0.0"
-            }
-        },
-        "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
-            "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
-            "dev": true,
-            "dependencies": {
-                "@jridgewell/set-array": "^1.0.0",
-                "@jridgewell/sourcemap-codec": "^1.4.10"
-            },
-            "engines": {
-                "node": ">=6.0.0"
-            }
-        },
-        "node_modules/@azure/abort-controller": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
-            "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==",
-            "dependencies": {
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-auth": {
-            "version": "1.3.2",
-            "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.3.2.tgz",
-            "integrity": "sha512-7CU6DmCHIZp5ZPiZ9r3J17lTKMmYsm/zGvNkjArQwPkrLlZ1TZ+EUYfGgh2X31OLMVAQCTJZW4cXHJi02EbJnA==",
-            "dependencies": {
-                "@azure/abort-controller": "^1.0.0",
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-client": {
-            "version": "1.6.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.0.tgz",
-            "integrity": "sha512-YhSf4cb61ApSjItscp9XoaLq8KRnacPDAhmjAZSMnn/gs6FhFbZNfOBOErG2dDj7JRknVtCmJ5mLmfR2sLa11A==",
-            "dependencies": {
-                "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
-                "@azure/core-rest-pipeline": "^1.5.0",
-                "@azure/core-tracing": "^1.0.0",
-                "@azure/core-util": "^1.0.0",
-                "@azure/logger": "^1.0.0",
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-client/node_modules/@azure/core-tracing": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
-            "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
-            "dependencies": {
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-http": {
-            "version": "2.2.5",
-            "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-2.2.5.tgz",
-            "integrity": "sha512-kctMqSQ6zfnlFpuYzfUKadeTyOQYbIQ+3Rj7dzVC3Dk1dOnHroTwR9hLYKX8/n85iJpkyaksaXpuh5L7GJRYuQ==",
-            "dependencies": {
-                "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
-                "@azure/core-tracing": "1.0.0-preview.13",
-                "@azure/logger": "^1.0.0",
-                "@types/node-fetch": "^2.5.0",
-                "@types/tunnel": "^0.0.3",
-                "form-data": "^4.0.0",
-                "node-fetch": "^2.6.7",
-                "process": "^0.11.10",
-                "tough-cookie": "^4.0.0",
-                "tslib": "^2.2.0",
-                "tunnel": "^0.0.6",
-                "uuid": "^8.3.0",
-                "xml2js": "^0.4.19"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-lro": {
-            "version": "2.2.4",
-            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.4.tgz",
-            "integrity": "sha512-e1I2v2CZM0mQo8+RSix0x091Av493e4bnT22ds2fcQGslTHzM2oTbswkB65nP4iEpCxBrFxOSDPKExmTmjCVtQ==",
-            "dependencies": {
-                "@azure/abort-controller": "^1.0.0",
-                "@azure/core-tracing": "1.0.0-preview.13",
-                "@azure/logger": "^1.0.0",
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-paging": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.3.0.tgz",
-            "integrity": "sha512-H6Tg9eBm0brHqLy0OSAGzxIh1t4UL8eZVrSUMJ60Ra9cwq2pOskFqVpz2pYoHDsBY1jZ4V/P8LRGb5D5pmC6rg==",
-            "dependencies": {
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-rest-pipeline": {
-            "version": "1.9.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.0.tgz",
-            "integrity": "sha512-uvM3mY+Vegk0F2r4Eh0yPdsXTUyafTQkeX0USnz1Eyangxm2Bib0w0wkJVZW8fpks7Lcv0ztIdCFTrN7H8uptg==",
-            "dependencies": {
-                "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
-                "@azure/core-tracing": "^1.0.1",
-                "@azure/core-util": "^1.0.0",
-                "@azure/logger": "^1.0.0",
-                "form-data": "^4.0.0",
-                "http-proxy-agent": "^4.0.1",
-                "https-proxy-agent": "^5.0.0",
-                "tslib": "^2.2.0",
-                "uuid": "^8.3.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
-            "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
-            "dependencies": {
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-rest-pipeline/node_modules/@tootallnate/once": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-            "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-            "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-            "dependencies": {
-                "@tootallnate/once": "1",
-                "agent-base": "6",
-                "debug": "4"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/@azure/core-tracing": {
-            "version": "1.0.0-preview.13",
-            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
-            "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
-            "dependencies": {
-                "@opentelemetry/api": "^1.0.1",
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-util": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.0.0.tgz",
-            "integrity": "sha512-yWshY9cdPthlebnb3Zuz/j0Lv4kjU6u7PR5sW7A9FF7EX+0irMRJAtyTq5TPiDHJfjH8gTSlnIYFj9m7Ed76IQ==",
-            "dependencies": {
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/identity": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.0.5.tgz",
-            "integrity": "sha512-fSQTu9dS0P+lw1Gfct6t7TuRYybULL/E3wJjXLc1xr6RQXpmenJspi0lKzq3XFjLP5MzBlToKY3ZkYoAXPz1zA==",
-            "dependencies": {
-                "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
-                "@azure/core-client": "^1.4.0",
-                "@azure/core-rest-pipeline": "^1.1.0",
-                "@azure/core-tracing": "1.0.0-preview.13",
-                "@azure/core-util": "^1.0.0-beta.1",
-                "@azure/logger": "^1.0.0",
-                "@azure/msal-browser": "^2.16.0",
-                "@azure/msal-common": "^4.5.1",
-                "@azure/msal-node": "^1.3.0",
-                "events": "^3.0.0",
-                "jws": "^4.0.0",
-                "open": "^8.0.0",
-                "stoppable": "^1.1.0",
-                "tslib": "^2.2.0",
-                "uuid": "^8.3.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/identity/node_modules/jwa": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
-            "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
-            "dependencies": {
-                "buffer-equal-constant-time": "1.0.1",
-                "ecdsa-sig-formatter": "1.0.11",
-                "safe-buffer": "^5.0.1"
-            }
-        },
-        "node_modules/@azure/identity/node_modules/jws": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
-            "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
-            "dependencies": {
-                "jwa": "^2.0.0",
-                "safe-buffer": "^5.0.1"
-            }
-        },
-        "node_modules/@azure/keyvault-keys": {
-            "version": "4.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.4.0.tgz",
-            "integrity": "sha512-W9sPZebXYa3aar7BGIA+fAsq/sy1nf2TZAETbkv7DRawzVLrWv8QoVVceqNHjy3cigT4HNxXjaPYCI49ez5CUA==",
-            "dependencies": {
-                "@azure/abort-controller": "^1.0.0",
-                "@azure/core-http": "^2.0.0",
-                "@azure/core-lro": "^2.2.0",
-                "@azure/core-paging": "^1.1.1",
-                "@azure/core-tracing": "1.0.0-preview.13",
-                "@azure/logger": "^1.0.0",
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/logger": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.3.tgz",
-            "integrity": "sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==",
-            "dependencies": {
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/msal-browser": {
-            "version": "2.26.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.26.0.tgz",
-            "integrity": "sha512-mSyZORSgeMEWz5Wo5alUqjxP/HKt/XcViZqc3dnKFM9347qYPIWsAlzHkEmmafNr1VGUo7MeqB0emZCOQrl04w==",
-            "dependencies": {
-                "@azure/msal-common": "^7.0.0"
-            },
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
-        "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz",
-            "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA==",
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
-        "node_modules/@azure/msal-common": {
-            "version": "4.5.1",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.5.1.tgz",
-            "integrity": "sha512-/i5dXM+QAtO+6atYd5oHGBAx48EGSISkXNXViheliOQe+SIFMDo3gSq3lL54W0suOSAsVPws3XnTaIHlla0PIQ==",
-            "dependencies": {
-                "debug": "^4.1.1"
-            },
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
-        "node_modules/@azure/msal-node": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.10.0.tgz",
-            "integrity": "sha512-oSv9mg199FpRTe+fZ3o9NDYpKShOHqeceaNcCHJcKUaAaCojAbfbxD1Cvsti8BEsLKE6x0HcnjilnM1MKmZekA==",
-            "dependencies": {
-                "@azure/msal-common": "^7.0.0",
-                "jsonwebtoken": "^8.5.1",
-                "uuid": "^8.3.0"
-            },
-            "engines": {
-                "node": "10 || 12 || 14 || 16 || 18"
-            }
-        },
-        "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz",
-            "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA==",
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
-        "node_modules/@babel/code-frame": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
-            "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
-            "dev": true,
-            "dependencies": {
-                "@babel/highlight": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/compat-data": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz",
-            "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/core": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz",
-            "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==",
-            "dev": true,
-            "dependencies": {
-                "@ampproject/remapping": "^2.1.0",
-                "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.18.6",
-                "@babel/helpers": "^7.18.6",
-                "@babel/parser": "^7.18.6",
-                "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6",
-                "convert-source-map": "^1.7.0",
-                "debug": "^4.1.0",
-                "gensync": "^1.0.0-beta.2",
-                "json5": "^2.2.1",
-                "semver": "^6.3.0"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/babel"
-            }
-        },
-        "node_modules/@babel/eslint-parser": {
-            "version": "7.17.0",
-            "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz",
-            "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==",
-            "dev": true,
-            "dependencies": {
-                "eslint-scope": "^5.1.1",
-                "eslint-visitor-keys": "^2.1.0",
-                "semver": "^6.3.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
-            },
-            "peerDependencies": {
-                "@babel/core": ">=7.11.0",
-                "eslint": "^7.5.0 || ^8.0.0"
-            }
-        },
-        "node_modules/@babel/generator": {
-            "version": "7.18.7",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz",
-            "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.7",
-                "@jridgewell/gen-mapping": "^0.3.2",
-                "jsesc": "^2.5.1"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-annotate-as-pure": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
-            "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz",
-            "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-explode-assignable-expression": "^7.18.6",
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-compilation-targets": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz",
-            "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/compat-data": "^7.18.6",
-                "@babel/helper-validator-option": "^7.18.6",
-                "browserslist": "^4.20.2",
-                "semver": "^6.3.0"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0"
-            }
-        },
-        "node_modules/@babel/helper-create-class-features-plugin": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz",
-            "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/helper-member-expression-to-functions": "^7.18.6",
-                "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.18.6",
-                "@babel/helper-split-export-declaration": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0"
-            }
-        },
-        "node_modules/@babel/helper-create-regexp-features-plugin": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz",
-            "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.18.6",
-                "regexpu-core": "^5.1.0"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0"
-            }
-        },
-        "node_modules/@babel/helper-define-polyfill-provider": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
-            "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-compilation-targets": "^7.13.0",
-                "@babel/helper-module-imports": "^7.12.13",
-                "@babel/helper-plugin-utils": "^7.13.0",
-                "@babel/traverse": "^7.13.0",
-                "debug": "^4.1.1",
-                "lodash.debounce": "^4.0.8",
-                "resolve": "^1.14.2",
-                "semver": "^6.1.2"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.4.0-0"
-            }
-        },
-        "node_modules/@babel/helper-environment-visitor": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz",
-            "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-explode-assignable-expression": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz",
-            "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-function-name": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz",
-            "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/template": "^7.18.6",
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-hoist-variables": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
-            "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-member-expression-to-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz",
-            "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-module-imports": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
-            "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-module-transforms": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz",
-            "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-module-imports": "^7.18.6",
-                "@babel/helper-simple-access": "^7.18.6",
-                "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/helper-validator-identifier": "^7.18.6",
-                "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-optimise-call-expression": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
-            "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-plugin-utils": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz",
-            "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==",
-            "dev": true,
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-remap-async-to-generator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz",
-            "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-wrap-function": "^7.18.6",
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0"
-            }
-        },
-        "node_modules/@babel/helper-replace-supers": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz",
-            "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-member-expression-to-functions": "^7.18.6",
-                "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-simple-access": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz",
-            "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz",
-            "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-split-export-declaration": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
-            "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-validator-identifier": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
-            "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==",
-            "dev": true,
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-validator-option": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
-            "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
-            "dev": true,
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helper-wrap-function": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz",
-            "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/helpers": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz",
-            "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/highlight": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
-            "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-validator-identifier": "^7.18.6",
-                "chalk": "^2.0.0",
-                "js-tokens": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/parser": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz",
-            "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==",
-            "dev": true,
-            "bin": {
-                "parser": "bin/babel-parser.js"
-            },
-            "engines": {
-                "node": ">=6.0.0"
-            }
-        },
-        "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz",
-            "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0"
-            }
-        },
-        "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz",
-            "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.13.0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-async-generator-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz",
-            "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-remap-async-to-generator": "^7.18.6",
-                "@babel/plugin-syntax-async-generators": "^7.8.4"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-class-properties": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
-            "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-class-static-block": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz",
-            "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-class-static-block": "^7.14.5"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.12.0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-dynamic-import": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz",
-            "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-dynamic-import": "^7.8.3"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-export-namespace-from": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz",
-            "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-json-strings": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz",
-            "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-json-strings": "^7.8.3"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz",
-            "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
-            "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-numeric-separator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
-            "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-numeric-separator": "^7.10.4"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-object-rest-spread": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz",
-            "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/compat-data": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-optional-catch-binding": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz",
-            "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-optional-chaining": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz",
-            "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6",
-                "@babel/plugin-syntax-optional-chaining": "^7.8.3"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-private-methods": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
-            "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-private-property-in-object": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz",
-            "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-proposal-unicode-property-regex": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz",
-            "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=4"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-async-generators": {
-            "version": "7.8.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
-            "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.8.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-bigint": {
-            "version": "7.8.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
-            "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.8.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-class-properties": {
-            "version": "7.12.13",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
-            "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.12.13"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-class-static-block": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
-            "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.14.5"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-dynamic-import": {
-            "version": "7.8.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
-            "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.8.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-export-namespace-from": {
-            "version": "7.8.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
-            "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.8.3"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-import-assertions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz",
-            "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-import-meta": {
-            "version": "7.10.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
-            "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.10.4"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-json-strings": {
-            "version": "7.8.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
-            "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.8.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
-            "version": "7.10.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
-            "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.10.4"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
-            "version": "7.8.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
-            "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.8.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-numeric-separator": {
-            "version": "7.10.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-            "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.10.4"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-object-rest-spread": {
-            "version": "7.8.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
-            "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.8.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-optional-catch-binding": {
-            "version": "7.8.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
-            "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.8.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-optional-chaining": {
-            "version": "7.8.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
-            "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.8.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-private-property-in-object": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
-            "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.14.5"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-top-level-await": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
-            "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.14.5"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-syntax-typescript": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz",
-            "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-arrow-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz",
-            "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-async-to-generator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
-            "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-module-imports": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-remap-async-to-generator": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-block-scoped-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz",
-            "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-block-scoping": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz",
-            "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-classes": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz",
-            "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.18.6",
-                "@babel/helper-split-export-declaration": "^7.18.6",
-                "globals": "^11.1.0"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-computed-properties": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz",
-            "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-destructuring": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz",
-            "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-dotall-regex": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz",
-            "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-duplicate-keys": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz",
-            "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-exponentiation-operator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz",
-            "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-for-of": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz",
-            "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-function-name": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz",
-            "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-literals": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz",
-            "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-member-expression-literals": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz",
-            "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-modules-amd": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz",
-            "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-module-transforms": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "babel-plugin-dynamic-import-node": "^2.3.3"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-modules-commonjs": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz",
-            "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-module-transforms": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-simple-access": "^7.18.6",
-                "babel-plugin-dynamic-import-node": "^2.3.3"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-modules-systemjs": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz",
-            "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-hoist-variables": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-validator-identifier": "^7.18.6",
-                "babel-plugin-dynamic-import-node": "^2.3.3"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-modules-umd": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz",
-            "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-module-transforms": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz",
-            "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-new-target": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz",
-            "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-object-super": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz",
-            "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-parameters": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz",
-            "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-property-literals": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz",
-            "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-regenerator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz",
-            "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "regenerator-transform": "^0.15.0"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-reserved-words": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz",
-            "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-shorthand-properties": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz",
-            "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-spread": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz",
-            "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-sticky-regex": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz",
-            "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-template-literals": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz",
-            "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-typeof-symbol": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz",
-            "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-unicode-escapes": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz",
-            "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/plugin-transform-unicode-regex": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz",
-            "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/preset-env": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz",
-            "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/compat-data": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-validator-option": "^7.18.6",
-                "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
-                "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6",
-                "@babel/plugin-proposal-async-generator-functions": "^7.18.6",
-                "@babel/plugin-proposal-class-properties": "^7.18.6",
-                "@babel/plugin-proposal-class-static-block": "^7.18.6",
-                "@babel/plugin-proposal-dynamic-import": "^7.18.6",
-                "@babel/plugin-proposal-export-namespace-from": "^7.18.6",
-                "@babel/plugin-proposal-json-strings": "^7.18.6",
-                "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6",
-                "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
-                "@babel/plugin-proposal-numeric-separator": "^7.18.6",
-                "@babel/plugin-proposal-object-rest-spread": "^7.18.6",
-                "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.6",
-                "@babel/plugin-proposal-private-methods": "^7.18.6",
-                "@babel/plugin-proposal-private-property-in-object": "^7.18.6",
-                "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
-                "@babel/plugin-syntax-async-generators": "^7.8.4",
-                "@babel/plugin-syntax-class-properties": "^7.12.13",
-                "@babel/plugin-syntax-class-static-block": "^7.14.5",
-                "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-                "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-                "@babel/plugin-syntax-import-assertions": "^7.18.6",
-                "@babel/plugin-syntax-json-strings": "^7.8.3",
-                "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
-                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-                "@babel/plugin-syntax-numeric-separator": "^7.10.4",
-                "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-                "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-                "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
-                "@babel/plugin-syntax-top-level-await": "^7.14.5",
-                "@babel/plugin-transform-arrow-functions": "^7.18.6",
-                "@babel/plugin-transform-async-to-generator": "^7.18.6",
-                "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
-                "@babel/plugin-transform-block-scoping": "^7.18.6",
-                "@babel/plugin-transform-classes": "^7.18.6",
-                "@babel/plugin-transform-computed-properties": "^7.18.6",
-                "@babel/plugin-transform-destructuring": "^7.18.6",
-                "@babel/plugin-transform-dotall-regex": "^7.18.6",
-                "@babel/plugin-transform-duplicate-keys": "^7.18.6",
-                "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
-                "@babel/plugin-transform-for-of": "^7.18.6",
-                "@babel/plugin-transform-function-name": "^7.18.6",
-                "@babel/plugin-transform-literals": "^7.18.6",
-                "@babel/plugin-transform-member-expression-literals": "^7.18.6",
-                "@babel/plugin-transform-modules-amd": "^7.18.6",
-                "@babel/plugin-transform-modules-commonjs": "^7.18.6",
-                "@babel/plugin-transform-modules-systemjs": "^7.18.6",
-                "@babel/plugin-transform-modules-umd": "^7.18.6",
-                "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6",
-                "@babel/plugin-transform-new-target": "^7.18.6",
-                "@babel/plugin-transform-object-super": "^7.18.6",
-                "@babel/plugin-transform-parameters": "^7.18.6",
-                "@babel/plugin-transform-property-literals": "^7.18.6",
-                "@babel/plugin-transform-regenerator": "^7.18.6",
-                "@babel/plugin-transform-reserved-words": "^7.18.6",
-                "@babel/plugin-transform-shorthand-properties": "^7.18.6",
-                "@babel/plugin-transform-spread": "^7.18.6",
-                "@babel/plugin-transform-sticky-regex": "^7.18.6",
-                "@babel/plugin-transform-template-literals": "^7.18.6",
-                "@babel/plugin-transform-typeof-symbol": "^7.18.6",
-                "@babel/plugin-transform-unicode-escapes": "^7.18.6",
-                "@babel/plugin-transform-unicode-regex": "^7.18.6",
-                "@babel/preset-modules": "^0.1.5",
-                "@babel/types": "^7.18.6",
-                "babel-plugin-polyfill-corejs2": "^0.3.1",
-                "babel-plugin-polyfill-corejs3": "^0.5.2",
-                "babel-plugin-polyfill-regenerator": "^0.3.1",
-                "core-js-compat": "^3.22.1",
-                "semver": "^6.3.0"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/preset-modules": {
-            "version": "0.1.5",
-            "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
-            "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.0.0",
-                "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
-                "@babel/plugin-transform-dotall-regex": "^7.4.4",
-                "@babel/types": "^7.4.4",
-                "esutils": "^2.0.2"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/@babel/runtime": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz",
-            "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==",
-            "dependencies": {
-                "regenerator-runtime": "^0.13.4"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/standalone": {
-            "version": "7.18.7",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.18.7.tgz",
-            "integrity": "sha512-AIOn3ON0KhYqAbvmkT11vi/YAlhrPn6RSPQb8Hl3PUZoE1yFwut5fQ9/oJ4Dvf2SGmO41pF7xmwP2W1RT0uJCA==",
-            "dev": true,
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/template": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz",
-            "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/code-frame": "^7.18.6",
-                "@babel/parser": "^7.18.6",
-                "@babel/types": "^7.18.6"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/traverse": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz",
-            "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/helper-hoist-variables": "^7.18.6",
-                "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.18.6",
-                "@babel/types": "^7.18.6",
-                "debug": "^4.1.0",
-                "globals": "^11.1.0"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@babel/types": {
-            "version": "7.18.7",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz",
-            "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-validator-identifier": "^7.18.6",
-                "to-fast-properties": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/@bcoe/v8-coverage": {
-            "version": "0.2.3",
-            "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
-            "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
-            "dev": true
-        },
-        "node_modules/@breejs/later": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.1.0.tgz",
-            "integrity": "sha512-QgGnZ9b7o4k0Ai1ZbTJWwZpZcFK9d+Gb+DyNt4UT9x6IEIs5HVu0iIlmgzGqN+t9MoJSpSPo9S/Mm51UtHr3JA==",
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@eslint/eslintrc": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
-            "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
-            "dev": true,
-            "dependencies": {
-                "ajv": "^6.12.4",
-                "debug": "^4.3.2",
-                "espree": "^9.3.2",
-                "globals": "^13.15.0",
-                "ignore": "^5.2.0",
-                "import-fresh": "^3.2.1",
-                "js-yaml": "^4.1.0",
-                "minimatch": "^3.1.2",
-                "strip-json-comments": "^3.1.1"
-            },
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            }
-        },
-        "node_modules/@eslint/eslintrc/node_modules/globals": {
-            "version": "13.15.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
-            "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
-            "dev": true,
-            "dependencies": {
-                "type-fest": "^0.20.2"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/@eslint/eslintrc/node_modules/type-fest": {
-            "version": "0.20.2",
-            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/@fortawesome/fontawesome-common-types": {
-            "version": "0.2.36",
-            "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz",
-            "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==",
-            "dev": true,
-            "hasInstallScript": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/@fortawesome/fontawesome-svg-core": {
-            "version": "1.2.36",
-            "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz",
-            "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==",
-            "dev": true,
-            "hasInstallScript": true,
-            "dependencies": {
-                "@fortawesome/fontawesome-common-types": "^0.2.36"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/@fortawesome/free-regular-svg-icons": {
-            "version": "5.15.4",
-            "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz",
-            "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==",
-            "dev": true,
-            "hasInstallScript": true,
-            "dependencies": {
-                "@fortawesome/fontawesome-common-types": "^0.2.36"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/@fortawesome/free-solid-svg-icons": {
-            "version": "5.15.4",
-            "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz",
-            "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==",
-            "dev": true,
-            "hasInstallScript": true,
-            "dependencies": {
-                "@fortawesome/fontawesome-common-types": "^0.2.36"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/@fortawesome/vue-fontawesome": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.1.tgz",
-            "integrity": "sha512-CdXZJoCS+aEPec26ZP7hWWU3SaJlQPZSCGdgpQ2qGl2HUmtUUNrI3zC4XWdn1JUmh3t5OuDeRG1qB4eGRNSD4A==",
-            "dev": true,
-            "peerDependencies": {
-                "@fortawesome/fontawesome-svg-core": "~1 || ~6",
-                "vue": ">= 3.0.0 < 4"
-            }
-        },
-        "node_modules/@hapi/hoek": {
-            "version": "9.3.0",
-            "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
-            "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
-            "dev": true
-        },
-        "node_modules/@hapi/topo": {
-            "version": "5.1.0",
-            "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
-            "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
-            "dev": true,
-            "dependencies": {
-                "@hapi/hoek": "^9.0.0"
-            }
-        },
-        "node_modules/@humanwhocodes/config-array": {
-            "version": "0.9.5",
-            "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
-            "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
-            "dev": true,
-            "dependencies": {
-                "@humanwhocodes/object-schema": "^1.2.1",
-                "debug": "^4.1.1",
-                "minimatch": "^3.0.4"
-            },
-            "engines": {
-                "node": ">=10.10.0"
-            }
-        },
-        "node_modules/@humanwhocodes/object-schema": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
-            "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
-            "dev": true
-        },
-        "node_modules/@intlify/core-base": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.10.tgz",
-            "integrity": "sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==",
-            "dev": true,
-            "dependencies": {
-                "@intlify/devtools-if": "9.1.10",
-                "@intlify/message-compiler": "9.1.10",
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/runtime": "9.1.10",
-                "@intlify/shared": "9.1.10",
-                "@intlify/vue-devtools": "9.1.10"
-            },
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@intlify/devtools-if": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.10.tgz",
-            "integrity": "sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==",
-            "dev": true,
-            "dependencies": {
-                "@intlify/shared": "9.1.10"
-            },
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@intlify/message-compiler": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.10.tgz",
-            "integrity": "sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==",
-            "dev": true,
-            "dependencies": {
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/shared": "9.1.10",
-                "source-map": "0.6.1"
-            },
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@intlify/message-resolver": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.10.tgz",
-            "integrity": "sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==",
-            "dev": true,
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@intlify/runtime": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.10.tgz",
-            "integrity": "sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==",
-            "dev": true,
-            "dependencies": {
-                "@intlify/message-compiler": "9.1.10",
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/shared": "9.1.10"
-            },
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@intlify/shared": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.10.tgz",
-            "integrity": "sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==",
-            "dev": true,
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@intlify/vue-devtools": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.10.tgz",
-            "integrity": "sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==",
-            "dev": true,
-            "dependencies": {
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/runtime": "9.1.10",
-                "@intlify/shared": "9.1.10"
-            },
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@istanbuljs/load-nyc-config": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
-            "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
-            "dev": true,
-            "dependencies": {
-                "camelcase": "^5.3.1",
-                "find-up": "^4.1.0",
-                "get-package-type": "^0.1.0",
-                "js-yaml": "^3.13.1",
-                "resolve-from": "^5.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
-            "version": "1.0.10",
-            "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-            "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-            "dev": true,
-            "dependencies": {
-                "sprintf-js": "~1.0.2"
-            }
-        },
-        "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
-            "version": "3.14.1",
-            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-            "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-            "dev": true,
-            "dependencies": {
-                "argparse": "^1.0.7",
-                "esprima": "^4.0.0"
-            },
-            "bin": {
-                "js-yaml": "bin/js-yaml.js"
-            }
-        },
-        "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-            "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
-            "dev": true
-        },
-        "node_modules/@istanbuljs/schema": {
-            "version": "0.1.3",
-            "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
-            "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/console": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
-            "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "chalk": "^4.0.0",
-                "jest-message-util": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "slash": "^3.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/@jest/console/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/@jest/console/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/@jest/console/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/@jest/console/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/@jest/console/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/console/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/core": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
-            "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
-            "dev": true,
-            "dependencies": {
-                "@jest/console": "^27.5.1",
-                "@jest/reporters": "^27.5.1",
-                "@jest/test-result": "^27.5.1",
-                "@jest/transform": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "ansi-escapes": "^4.2.1",
-                "chalk": "^4.0.0",
-                "emittery": "^0.8.1",
-                "exit": "^0.1.2",
-                "graceful-fs": "^4.2.9",
-                "jest-changed-files": "^27.5.1",
-                "jest-config": "^27.5.1",
-                "jest-haste-map": "^27.5.1",
-                "jest-message-util": "^27.5.1",
-                "jest-regex-util": "^27.5.1",
-                "jest-resolve": "^27.5.1",
-                "jest-resolve-dependencies": "^27.5.1",
-                "jest-runner": "^27.5.1",
-                "jest-runtime": "^27.5.1",
-                "jest-snapshot": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "jest-validate": "^27.5.1",
-                "jest-watcher": "^27.5.1",
-                "micromatch": "^4.0.4",
-                "rimraf": "^3.0.0",
-                "slash": "^3.0.0",
-                "strip-ansi": "^6.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            },
-            "peerDependencies": {
-                "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-            },
-            "peerDependenciesMeta": {
-                "node-notifier": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/@jest/core/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/@jest/core/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/@jest/core/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/@jest/core/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/@jest/core/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/core/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/environment": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
-            "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
-            "dev": true,
-            "dependencies": {
-                "@jest/fake-timers": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "jest-mock": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/@jest/fake-timers": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
-            "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "@sinonjs/fake-timers": "^8.0.1",
-                "@types/node": "*",
-                "jest-message-util": "^27.5.1",
-                "jest-mock": "^27.5.1",
-                "jest-util": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/@jest/globals": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
-            "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
-            "dev": true,
-            "dependencies": {
-                "@jest/environment": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "expect": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/@jest/reporters": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
-            "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
-            "dev": true,
-            "dependencies": {
-                "@bcoe/v8-coverage": "^0.2.3",
-                "@jest/console": "^27.5.1",
-                "@jest/test-result": "^27.5.1",
-                "@jest/transform": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "chalk": "^4.0.0",
-                "collect-v8-coverage": "^1.0.0",
-                "exit": "^0.1.2",
-                "glob": "^7.1.2",
-                "graceful-fs": "^4.2.9",
-                "istanbul-lib-coverage": "^3.0.0",
-                "istanbul-lib-instrument": "^5.1.0",
-                "istanbul-lib-report": "^3.0.0",
-                "istanbul-lib-source-maps": "^4.0.0",
-                "istanbul-reports": "^3.1.3",
-                "jest-haste-map": "^27.5.1",
-                "jest-resolve": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "jest-worker": "^27.5.1",
-                "slash": "^3.0.0",
-                "source-map": "^0.6.0",
-                "string-length": "^4.0.1",
-                "terminal-link": "^2.0.0",
-                "v8-to-istanbul": "^8.1.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            },
-            "peerDependencies": {
-                "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-            },
-            "peerDependenciesMeta": {
-                "node-notifier": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/@jest/reporters/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/@jest/reporters/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/@jest/reporters/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/@jest/reporters/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/@jest/reporters/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/reporters/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/source-map": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
-            "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
-            "dev": true,
-            "dependencies": {
-                "callsites": "^3.0.0",
-                "graceful-fs": "^4.2.9",
-                "source-map": "^0.6.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/@jest/test-result": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
-            "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
-            "dev": true,
-            "dependencies": {
-                "@jest/console": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/istanbul-lib-coverage": "^2.0.0",
-                "collect-v8-coverage": "^1.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/@jest/test-sequencer": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
-            "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
-            "dev": true,
-            "dependencies": {
-                "@jest/test-result": "^27.5.1",
-                "graceful-fs": "^4.2.9",
-                "jest-haste-map": "^27.5.1",
-                "jest-runtime": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/@jest/transform": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
-            "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/core": "^7.1.0",
-                "@jest/types": "^27.5.1",
-                "babel-plugin-istanbul": "^6.1.1",
-                "chalk": "^4.0.0",
-                "convert-source-map": "^1.4.0",
-                "fast-json-stable-stringify": "^2.0.0",
-                "graceful-fs": "^4.2.9",
-                "jest-haste-map": "^27.5.1",
-                "jest-regex-util": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "micromatch": "^4.0.4",
-                "pirates": "^4.0.4",
-                "slash": "^3.0.0",
-                "source-map": "^0.6.1",
-                "write-file-atomic": "^3.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/@jest/transform/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/@jest/transform/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/@jest/transform/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/@jest/transform/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/@jest/transform/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/transform/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/types": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
-            "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
-            "dev": true,
-            "dependencies": {
-                "@types/istanbul-lib-coverage": "^2.0.0",
-                "@types/istanbul-reports": "^3.0.0",
-                "@types/node": "*",
-                "@types/yargs": "^16.0.0",
-                "chalk": "^4.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/@jest/types/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/@jest/types/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/@jest/types/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/@jest/types/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/@jest/types/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jest/types/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/@jridgewell/gen-mapping": {
-            "version": "0.3.2",
-            "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
-            "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
-            "dev": true,
-            "dependencies": {
-                "@jridgewell/set-array": "^1.0.1",
-                "@jridgewell/sourcemap-codec": "^1.4.10",
-                "@jridgewell/trace-mapping": "^0.3.9"
-            },
-            "engines": {
-                "node": ">=6.0.0"
-            }
-        },
-        "node_modules/@jridgewell/resolve-uri": {
-            "version": "3.0.8",
-            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
-            "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
-            "dev": true,
-            "engines": {
-                "node": ">=6.0.0"
-            }
-        },
-        "node_modules/@jridgewell/set-array": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
-            "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
-            "dev": true,
-            "engines": {
-                "node": ">=6.0.0"
-            }
-        },
-        "node_modules/@jridgewell/sourcemap-codec": {
-            "version": "1.4.14",
-            "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-            "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
-            "dev": true
-        },
-        "node_modules/@jridgewell/trace-mapping": {
-            "version": "0.3.14",
-            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
-            "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
-            "dev": true,
-            "dependencies": {
-                "@jridgewell/resolve-uri": "^3.0.3",
-                "@jridgewell/sourcemap-codec": "^1.4.10"
-            }
-        },
-        "node_modules/@js-joda/core": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.2.0.tgz",
-            "integrity": "sha512-0OriPYIaMLB3XiLQMe0BXKVIqeriTn3H7JMOzTsHEtt7Zqq+TetCu97KnAhU3ckiQZKBxfZshft+H1OC4D1lXw=="
-        },
-        "node_modules/@louislam/sqlite3": {
-            "version": "15.0.6",
-            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-15.0.6.tgz",
-            "integrity": "sha512-+HF/4OEy+yakYzJlSPJbLDtf499t0s0eaglXC9y3Oa9OBZ+dKAaTW5+Ft1RCvfUJLFw/oyYjHtMsg9V+7NT05g==",
-            "hasInstallScript": true,
-            "dependencies": {
-                "@mapbox/node-pre-gyp": "^1.0.0",
-                "node-addon-api": "^4.2.0",
-                "tar": "^6.1.11"
-            },
-            "optionalDependencies": {
-                "node-gyp": "^7.1.2"
-            },
-            "peerDependencies": {
-                "node-gyp": "7.x"
-            },
-            "peerDependenciesMeta": {
-                "node-gyp": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/@mapbox/node-pre-gyp": {
-            "version": "1.0.9",
-            "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz",
-            "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==",
-            "dependencies": {
-                "detect-libc": "^2.0.0",
-                "https-proxy-agent": "^5.0.0",
-                "make-dir": "^3.1.0",
-                "node-fetch": "^2.6.7",
-                "nopt": "^5.0.0",
-                "npmlog": "^5.0.1",
-                "rimraf": "^3.0.2",
-                "semver": "^7.3.5",
-                "tar": "^6.1.11"
-            },
-            "bin": {
-                "node-pre-gyp": "bin/node-pre-gyp"
-            }
-        },
-        "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
-            "version": "7.3.7",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-            "dependencies": {
-                "lru-cache": "^6.0.0"
-            },
-            "bin": {
-                "semver": "bin/semver.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/@nodelib/fs.scandir": {
-            "version": "2.1.5",
-            "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-            "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-            "dev": true,
-            "dependencies": {
-                "@nodelib/fs.stat": "2.0.5",
-                "run-parallel": "^1.1.9"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/@nodelib/fs.stat": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-            "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-            "dev": true,
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/@nodelib/fs.walk": {
-            "version": "1.2.8",
-            "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-            "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-            "dev": true,
-            "dependencies": {
-                "@nodelib/fs.scandir": "2.1.5",
-                "fastq": "^1.6.0"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/@octokit/auth-token": {
-            "version": "2.5.0",
-            "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
-            "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
-            "dev": true,
-            "dependencies": {
-                "@octokit/types": "^6.0.3"
-            }
-        },
-        "node_modules/@octokit/core": {
-            "version": "3.6.0",
-            "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
-            "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
-            "dev": true,
-            "dependencies": {
-                "@octokit/auth-token": "^2.4.4",
-                "@octokit/graphql": "^4.5.8",
-                "@octokit/request": "^5.6.3",
-                "@octokit/request-error": "^2.0.5",
-                "@octokit/types": "^6.0.3",
-                "before-after-hook": "^2.2.0",
-                "universal-user-agent": "^6.0.0"
-            }
-        },
-        "node_modules/@octokit/endpoint": {
-            "version": "6.0.12",
-            "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
-            "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
-            "dev": true,
-            "dependencies": {
-                "@octokit/types": "^6.0.3",
-                "is-plain-object": "^5.0.0",
-                "universal-user-agent": "^6.0.0"
-            }
-        },
-        "node_modules/@octokit/graphql": {
-            "version": "4.8.0",
-            "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
-            "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
-            "dev": true,
-            "dependencies": {
-                "@octokit/request": "^5.6.0",
-                "@octokit/types": "^6.0.3",
-                "universal-user-agent": "^6.0.0"
-            }
-        },
-        "node_modules/@octokit/openapi-types": {
-            "version": "12.6.1",
-            "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.6.1.tgz",
-            "integrity": "sha512-zirGmxkSQuZIQYsOLtCxNoKi7ByKLwGhrGhHz6YUI7h/c8xOES9bEoHOeq4z81uNf2AGAqNfPW9i3GOrpgKoJQ==",
-            "dev": true
-        },
-        "node_modules/@octokit/plugin-paginate-rest": {
-            "version": "2.21.1",
-            "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.1.tgz",
-            "integrity": "sha512-NVNTK63yoTFp07GqISWK+uDfGH1CAPhQXS7LzsJBvaK5W+UlvG549pLZC55FK0FqANVl6q/9ra3SR5c97xF/sw==",
-            "dev": true,
-            "dependencies": {
-                "@octokit/types": "^6.38.2"
-            },
-            "peerDependencies": {
-                "@octokit/core": ">=2"
-            }
-        },
-        "node_modules/@octokit/plugin-rest-endpoint-methods": {
-            "version": "5.16.1",
-            "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.1.tgz",
-            "integrity": "sha512-RMHD3aJZvOpjR2fGzD2an6eU7LG8MsknhUHvP+wRUnKdbt7eDdhTMLQsZ4xsHZcLNsxPO/K4DDIZPhI2s571Ag==",
-            "dev": true,
-            "dependencies": {
-                "@octokit/types": "^6.38.2",
-                "deprecation": "^2.3.1"
-            },
-            "peerDependencies": {
-                "@octokit/core": ">=3"
-            }
-        },
-        "node_modules/@octokit/request": {
-            "version": "5.6.3",
-            "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
-            "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
-            "dev": true,
-            "dependencies": {
-                "@octokit/endpoint": "^6.0.1",
-                "@octokit/request-error": "^2.1.0",
-                "@octokit/types": "^6.16.1",
-                "is-plain-object": "^5.0.0",
-                "node-fetch": "^2.6.7",
-                "universal-user-agent": "^6.0.0"
-            }
-        },
-        "node_modules/@octokit/request-error": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
-            "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
-            "dev": true,
-            "dependencies": {
-                "@octokit/types": "^6.0.3",
-                "deprecation": "^2.0.0",
-                "once": "^1.4.0"
-            }
-        },
-        "node_modules/@octokit/types": {
-            "version": "6.38.2",
-            "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.38.2.tgz",
-            "integrity": "sha512-McFegRKQ1qaMSnDt8ScJzv26IFR1zhXveYaqx8wF7QEgiy4GHMrnX4xbP+Yl+kAr12DCplL3WJq4xkeD1VMfmw==",
-            "dev": true,
-            "dependencies": {
-                "@octokit/openapi-types": "^12.6.1"
-            }
-        },
-        "node_modules/@opentelemetry/api": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.1.0.tgz",
-            "integrity": "sha512-hf+3bwuBwtXsugA2ULBc95qxrOqP2pOekLz34BJhcAKawt94vfeNyUKpYc0lZQ/3sCP6LqRa7UAdHA7i5UODzQ==",
-            "engines": {
-                "node": ">=8.0.0"
-            }
-        },
-        "node_modules/@popperjs/core": {
-            "version": "2.10.2",
-            "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
-            "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==",
-            "dev": true,
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/popperjs"
-            }
-        },
-        "node_modules/@sideway/address": {
-            "version": "4.1.4",
-            "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
-            "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
-            "dev": true,
-            "dependencies": {
-                "@hapi/hoek": "^9.0.0"
-            }
-        },
-        "node_modules/@sideway/formula": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
-            "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
-            "dev": true
-        },
-        "node_modules/@sideway/pinpoint": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
-            "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
-            "dev": true
-        },
-        "node_modules/@sinonjs/commons": {
-            "version": "1.8.3",
-            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
-            "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
-            "dev": true,
-            "dependencies": {
-                "type-detect": "4.0.8"
-            }
-        },
-        "node_modules/@sinonjs/fake-timers": {
-            "version": "8.1.0",
-            "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
-            "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
-            "dev": true,
-            "dependencies": {
-                "@sinonjs/commons": "^1.7.0"
-            }
-        },
-        "node_modules/@socket.io/component-emitter": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz",
-            "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q=="
-        },
-        "node_modules/@tediousjs/connection-string": {
-            "version": "0.3.0",
-            "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.3.0.tgz",
-            "integrity": "sha512-d/keJiNKfpHo+GmSB8QcsAwBx8h+V1UbdozA5TD+eSLXprNY53JAYub47J9evsSKWDdNG5uVj0FiMozLKuzowQ=="
-        },
-        "node_modules/@tootallnate/once": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
-            "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@types/accepts": {
-            "version": "1.3.5",
-            "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
-            "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
-            "dependencies": {
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/babel__core": {
-            "version": "7.1.19",
-            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
-            "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/parser": "^7.1.0",
-                "@babel/types": "^7.0.0",
-                "@types/babel__generator": "*",
-                "@types/babel__template": "*",
-                "@types/babel__traverse": "*"
-            }
-        },
-        "node_modules/@types/babel__generator": {
-            "version": "7.6.4",
-            "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
-            "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.0.0"
-            }
-        },
-        "node_modules/@types/babel__template": {
-            "version": "7.4.1",
-            "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
-            "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
-            "dev": true,
-            "dependencies": {
-                "@babel/parser": "^7.1.0",
-                "@babel/types": "^7.0.0"
-            }
-        },
-        "node_modules/@types/babel__traverse": {
-            "version": "7.17.1",
-            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz",
-            "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/types": "^7.3.0"
-            }
-        },
-        "node_modules/@types/body-parser": {
-            "version": "1.19.2",
-            "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
-            "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
-            "dependencies": {
-                "@types/connect": "*",
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/bootstrap": {
-            "version": "5.1.12",
-            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.12.tgz",
-            "integrity": "sha512-pSS5BGEgepwzdbsBGswBWFmgrnYpp7c4UfuYe1FJWwkrcjm/JVwfG4gBkOYtd92Otd3RdJK0ByBWMkBROfLEPw==",
-            "dev": true,
-            "dependencies": {
-                "@popperjs/core": "^2.9.2"
-            }
-        },
-        "node_modules/@types/component-emitter": {
-            "version": "1.2.11",
-            "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
-            "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ=="
-        },
-        "node_modules/@types/connect": {
-            "version": "3.4.35",
-            "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
-            "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
-            "dependencies": {
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/content-disposition": {
-            "version": "0.5.5",
-            "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz",
-            "integrity": "sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA=="
-        },
-        "node_modules/@types/cookie": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
-            "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
-        },
-        "node_modules/@types/cookies": {
-            "version": "0.7.7",
-            "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz",
-            "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==",
-            "dependencies": {
-                "@types/connect": "*",
-                "@types/express": "*",
-                "@types/keygrip": "*",
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/cors": {
-            "version": "2.8.12",
-            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
-            "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
-        },
-        "node_modules/@types/es-aggregate-error": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.2.tgz",
-            "integrity": "sha512-erqUpFXksaeR2kejKnhnjZjbFxUpGZx4Z7ydNL9ie8tEhXPiZTsLeUDJ6aR1F8j5wWUAtOAQWUqkc7givBJbBA==",
-            "dependencies": {
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/express": {
-            "version": "4.17.13",
-            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
-            "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
-            "dependencies": {
-                "@types/body-parser": "*",
-                "@types/express-serve-static-core": "^4.17.18",
-                "@types/qs": "*",
-                "@types/serve-static": "*"
-            }
-        },
-        "node_modules/@types/express-serve-static-core": {
-            "version": "4.17.29",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz",
-            "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==",
-            "dependencies": {
-                "@types/node": "*",
-                "@types/qs": "*",
-                "@types/range-parser": "*"
-            }
-        },
-        "node_modules/@types/graceful-fs": {
-            "version": "4.1.5",
-            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-            "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
-            "dev": true,
-            "dependencies": {
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/http-assert": {
-            "version": "1.5.3",
-            "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
-            "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
-        },
-        "node_modules/@types/http-errors": {
-            "version": "1.8.2",
-            "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz",
-            "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w=="
-        },
-        "node_modules/@types/istanbul-lib-coverage": {
-            "version": "2.0.4",
-            "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
-            "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
-            "dev": true
-        },
-        "node_modules/@types/istanbul-lib-report": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-            "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
-            "dev": true,
-            "dependencies": {
-                "@types/istanbul-lib-coverage": "*"
-            }
-        },
-        "node_modules/@types/istanbul-reports": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-            "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-            "dev": true,
-            "dependencies": {
-                "@types/istanbul-lib-report": "*"
-            }
-        },
-        "node_modules/@types/keygrip": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
-            "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
-        },
-        "node_modules/@types/koa": {
-            "version": "2.13.4",
-            "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
-            "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
-            "dependencies": {
-                "@types/accepts": "*",
-                "@types/content-disposition": "*",
-                "@types/cookies": "*",
-                "@types/http-assert": "*",
-                "@types/http-errors": "*",
-                "@types/keygrip": "*",
-                "@types/koa-compose": "*",
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/koa-compose": {
-            "version": "3.2.5",
-            "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz",
-            "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==",
-            "dependencies": {
-                "@types/koa": "*"
-            }
-        },
-        "node_modules/@types/lodash": {
-            "version": "4.14.182",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
-            "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
-        },
-        "node_modules/@types/mime": {
-            "version": "1.3.2",
-            "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
-            "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
-        },
-        "node_modules/@types/minimist": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
-            "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
-            "dev": true
-        },
-        "node_modules/@types/node": {
-            "version": "18.0.1",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz",
-            "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg=="
-        },
-        "node_modules/@types/node-fetch": {
-            "version": "2.6.2",
-            "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
-            "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
-            "dependencies": {
-                "@types/node": "*",
-                "form-data": "^3.0.0"
-            }
-        },
-        "node_modules/@types/node-fetch/node_modules/form-data": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-            "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-            "dependencies": {
-                "asynckit": "^0.4.0",
-                "combined-stream": "^1.0.8",
-                "mime-types": "^2.1.12"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/@types/normalize-package-data": {
-            "version": "2.4.1",
-            "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
-            "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
-            "dev": true
-        },
-        "node_modules/@types/parse-json": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
-            "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
-            "dev": true
-        },
-        "node_modules/@types/prettier": {
-            "version": "2.6.3",
-            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz",
-            "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==",
-            "dev": true
-        },
-        "node_modules/@types/qs": {
-            "version": "6.9.7",
-            "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
-            "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
-        },
-        "node_modules/@types/range-parser": {
-            "version": "1.2.4",
-            "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
-            "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
-        },
-        "node_modules/@types/serve-static": {
-            "version": "1.13.10",
-            "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
-            "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
-            "dependencies": {
-                "@types/mime": "^1",
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/stack-utils": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
-            "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
-            "dev": true
-        },
-        "node_modules/@types/tunnel": {
-            "version": "0.0.3",
-            "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz",
-            "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==",
-            "dependencies": {
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@types/yargs": {
-            "version": "16.0.4",
-            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
-            "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
-            "dev": true,
-            "dependencies": {
-                "@types/yargs-parser": "*"
-            }
-        },
-        "node_modules/@types/yargs-parser": {
-            "version": "21.0.0",
-            "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
-            "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
-            "dev": true
-        },
-        "node_modules/@types/yauzl": {
-            "version": "2.10.0",
-            "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
-            "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
-            "dev": true,
-            "optional": true,
-            "dependencies": {
-                "@types/node": "*"
-            }
-        },
-        "node_modules/@vitejs/plugin-legacy": {
-            "version": "1.8.2",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.8.2.tgz",
-            "integrity": "sha512-NCOKU+pU+cxLMR9P9RTolEuOK+h+zYBXlknj+zGcKSj/NXBZYgA1GAH1FnO4zijoWRiTaiOm2ha9LQrELE7XHg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/standalone": "^7.17.11",
-                "core-js": "^3.22.3",
-                "magic-string": "^0.26.1",
-                "regenerator-runtime": "^0.13.9",
-                "systemjs": "^6.12.1"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            },
-            "peerDependencies": {
-                "vite": "^2.8.0"
-            }
-        },
-        "node_modules/@vitejs/plugin-legacy/node_modules/core-js": {
-            "version": "3.23.3",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.3.tgz",
-            "integrity": "sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q==",
-            "dev": true,
-            "hasInstallScript": true,
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/core-js"
-            }
-        },
-        "node_modules/@vitejs/plugin-vue": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.3.tgz",
-            "integrity": "sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==",
-            "dev": true,
-            "engines": {
-                "node": ">=12.0.0"
-            },
-            "peerDependencies": {
-                "vite": "^2.5.10",
-                "vue": "^3.2.25"
-            }
-        },
-        "node_modules/@vue/compiler-core": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
-            "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.37",
-                "estree-walker": "^2.0.2",
-                "source-map": "^0.6.1"
-            }
-        },
-        "node_modules/@vue/compiler-dom": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz",
-            "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==",
-            "dev": true,
-            "dependencies": {
-                "@vue/compiler-core": "3.2.37",
-                "@vue/shared": "3.2.37"
-            }
-        },
-        "node_modules/@vue/compiler-sfc": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz",
-            "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.37",
-                "@vue/compiler-dom": "3.2.37",
-                "@vue/compiler-ssr": "3.2.37",
-                "@vue/reactivity-transform": "3.2.37",
-                "@vue/shared": "3.2.37",
-                "estree-walker": "^2.0.2",
-                "magic-string": "^0.25.7",
-                "postcss": "^8.1.10",
-                "source-map": "^0.6.1"
-            }
-        },
-        "node_modules/@vue/compiler-sfc/node_modules/magic-string": {
-            "version": "0.25.9",
-            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
-            "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
-            "dev": true,
-            "dependencies": {
-                "sourcemap-codec": "^1.4.8"
-            }
-        },
-        "node_modules/@vue/compiler-ssr": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz",
-            "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==",
-            "dev": true,
-            "dependencies": {
-                "@vue/compiler-dom": "3.2.37",
-                "@vue/shared": "3.2.37"
-            }
-        },
-        "node_modules/@vue/devtools-api": {
-            "version": "6.2.0",
-            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.0.tgz",
-            "integrity": "sha512-pF1G4wky+hkifDiZSWn8xfuLOJI1ZXtuambpBEYaf7Xaf6zC/pM29rvAGpd3qaGXnr4BAXU1Pxz/VfvBGwexGA==",
-            "dev": true
-        },
-        "node_modules/@vue/reactivity": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.36.tgz",
-            "integrity": "sha512-c2qvopo0crh9A4GXi2/2kfGYMxsJW4tVILrqRPydVGZHhq0fnzy6qmclWOhBFckEhmyxmpHpdJtIRYGeKcuhnA==",
-            "dev": true,
-            "dependencies": {
-                "@vue/shared": "3.2.36"
-            }
-        },
-        "node_modules/@vue/reactivity-transform": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz",
-            "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.37",
-                "@vue/shared": "3.2.37",
-                "estree-walker": "^2.0.2",
-                "magic-string": "^0.25.7"
-            }
-        },
-        "node_modules/@vue/reactivity-transform/node_modules/magic-string": {
-            "version": "0.25.9",
-            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
-            "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
-            "dev": true,
-            "dependencies": {
-                "sourcemap-codec": "^1.4.8"
-            }
-        },
-        "node_modules/@vue/reactivity/node_modules/@vue/shared": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
-            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
-            "dev": true
-        },
-        "node_modules/@vue/runtime-core": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.36.tgz",
-            "integrity": "sha512-PTWBD+Lub+1U3/KhbCExrfxyS14hstLX+cBboxVHaz+kXoiDLNDEYAovPtxeTutbqtClIXtft+wcGdC+FUQ9qQ==",
-            "dev": true,
-            "dependencies": {
-                "@vue/reactivity": "3.2.36",
-                "@vue/shared": "3.2.36"
-            }
-        },
-        "node_modules/@vue/runtime-core/node_modules/@vue/shared": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
-            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
-            "dev": true
-        },
-        "node_modules/@vue/runtime-dom": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.36.tgz",
-            "integrity": "sha512-gYPYblm7QXHVuBohqNRRT7Wez0f2Mx2D40rb4fleehrJU9CnkjG0phhcGEZFfGwCmHZRqBCRgbFWE98bPULqkg==",
-            "dev": true,
-            "dependencies": {
-                "@vue/runtime-core": "3.2.36",
-                "@vue/shared": "3.2.36",
-                "csstype": "^2.6.8"
-            }
-        },
-        "node_modules/@vue/runtime-dom/node_modules/@vue/shared": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
-            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
-            "dev": true
-        },
-        "node_modules/@vue/server-renderer": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.36.tgz",
-            "integrity": "sha512-uZE0+jfye6yYXWvAQYeHZv+f50sRryvy16uiqzk3jn8hEY8zTjI+rzlmZSGoE915k+W/Ol9XSw6vxOUD8dGkUg==",
-            "dev": true,
-            "dependencies": {
-                "@vue/compiler-ssr": "3.2.36",
-                "@vue/shared": "3.2.36"
-            },
-            "peerDependencies": {
-                "vue": "3.2.36"
-            }
-        },
-        "node_modules/@vue/server-renderer/node_modules/@vue/compiler-core": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.36.tgz",
-            "integrity": "sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.36",
-                "estree-walker": "^2.0.2",
-                "source-map": "^0.6.1"
-            }
-        },
-        "node_modules/@vue/server-renderer/node_modules/@vue/compiler-dom": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.36.tgz",
-            "integrity": "sha512-tcOTAOiW4s24QLnq+ON6J+GRONXJ+A/mqKCORi0LSlIh8XQlNnlm24y8xIL8la+ZDgkdbjarQ9ZqYSvEja6gVA==",
-            "dev": true,
-            "dependencies": {
-                "@vue/compiler-core": "3.2.36",
-                "@vue/shared": "3.2.36"
-            }
-        },
-        "node_modules/@vue/server-renderer/node_modules/@vue/compiler-ssr": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.36.tgz",
-            "integrity": "sha512-+KugInUFRvOxEdLkZwE+W43BqHyhBh0jpYXhmqw1xGq2dmE6J9eZ8UUSOKNhdHtQ/iNLWWeK/wPZkVLUf3YGaw==",
-            "dev": true,
-            "dependencies": {
-                "@vue/compiler-dom": "3.2.36",
-                "@vue/shared": "3.2.36"
-            }
-        },
-        "node_modules/@vue/server-renderer/node_modules/@vue/shared": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
-            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
-            "dev": true
-        },
-        "node_modules/@vue/shared": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz",
-            "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==",
-            "dev": true
-        },
-        "node_modules/abab": {
-            "version": "2.0.6",
-            "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
-            "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
-            "dev": true
-        },
-        "node_modules/abbrev": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-            "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
-        },
-        "node_modules/accepts": {
-            "version": "1.3.8",
-            "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
-            "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
-            "dependencies": {
-                "mime-types": "~2.1.34",
-                "negotiator": "0.6.3"
-            },
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/acorn": {
-            "version": "8.7.1",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
-            "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
-            "dev": true,
-            "bin": {
-                "acorn": "bin/acorn"
-            },
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
-        "node_modules/acorn-globals": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
-            "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
-            "dev": true,
-            "dependencies": {
-                "acorn": "^7.1.1",
-                "acorn-walk": "^7.1.1"
-            }
-        },
-        "node_modules/acorn-globals/node_modules/acorn": {
-            "version": "7.4.1",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-            "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-            "dev": true,
-            "bin": {
-                "acorn": "bin/acorn"
-            },
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
-        "node_modules/acorn-jsx": {
-            "version": "5.3.2",
-            "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
-            "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-            "dev": true,
-            "peerDependencies": {
-                "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
-            }
-        },
-        "node_modules/acorn-walk": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
-            "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
-        "node_modules/aedes": {
-            "version": "0.46.3",
-            "resolved": "https://registry.npmjs.org/aedes/-/aedes-0.46.3.tgz",
-            "integrity": "sha512-i3B+H74uNRhlqcs/JdrMp7e3daz4Cwls0x4yLcfjGXz2tIwnxhF6od4m86O6yyNdz/Gg3jfY3q0sc/Cz8qzg6g==",
-            "dev": true,
-            "dependencies": {
-                "aedes-packet": "^2.3.1",
-                "aedes-persistence": "^8.1.3",
-                "bulk-write-stream": "^2.0.1",
-                "end-of-stream": "^1.4.4",
-                "fastfall": "^1.5.1",
-                "fastparallel": "^2.4.1",
-                "fastseries": "^2.0.0",
-                "hyperid": "^3.0.0",
-                "mqemitter": "^4.5.0",
-                "mqtt-packet": "^7.1.2",
-                "readable-stream": "^3.6.0",
-                "retimer": "^3.0.0",
-                "reusify": "^1.0.4",
-                "uuid": "^8.3.2"
-            },
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/aedes-packet": {
-            "version": "2.3.1",
-            "resolved": "https://registry.npmjs.org/aedes-packet/-/aedes-packet-2.3.1.tgz",
-            "integrity": "sha512-LqBd57uc2rui2RbjycW17dylglejG26mM4ewVXGNDnVp/SUHFVEgm7d1HTmYrnSkSCNoHti042qgcTwv/F+BtQ==",
-            "dev": true,
-            "dependencies": {
-                "mqtt-packet": "^6.3.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/aedes-packet/node_modules/mqtt-packet": {
-            "version": "6.10.0",
-            "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz",
-            "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==",
-            "dev": true,
-            "dependencies": {
-                "bl": "^4.0.2",
-                "debug": "^4.1.1",
-                "process-nextick-args": "^2.0.1"
-            }
-        },
-        "node_modules/aedes-persistence": {
-            "version": "8.1.3",
-            "resolved": "https://registry.npmjs.org/aedes-persistence/-/aedes-persistence-8.1.3.tgz",
-            "integrity": "sha512-VMCjEV+2g1TNJb/IlDEUy6SP9crT+QUhe2xc6UjyqrFNBNgTvHmOefXY7FxWrwmR2QA02vwg3+5p/JXkyg/Dkw==",
-            "dev": true,
-            "dependencies": {
-                "aedes-packet": "^2.3.1",
-                "from2": "^2.3.0",
-                "qlobber": "^5.0.3"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/agent-base": {
-            "version": "6.0.2",
-            "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-            "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-            "dependencies": {
-                "debug": "4"
-            },
-            "engines": {
-                "node": ">= 6.0.0"
-            }
-        },
-        "node_modules/ajv": {
-            "version": "6.12.6",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-            "devOptional": true,
-            "dependencies": {
-                "fast-deep-equal": "^3.1.1",
-                "fast-json-stable-stringify": "^2.0.0",
-                "json-schema-traverse": "^0.4.1",
-                "uri-js": "^4.2.2"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/epoberezkin"
-            }
-        },
-        "node_modules/anafanafo": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-2.0.0.tgz",
-            "integrity": "sha512-Nlfq7NC4AOkTJerWRIZcOAiMNtIDVIGWGvQ98O7Jl6Kr2Dk0dX5u4MqN778kSRTy5KRqchpLdF2RtLFEz9FVkQ==",
-            "dependencies": {
-                "char-width-table-consumer": "^1.0.0"
-            }
-        },
-        "node_modules/ansi-escapes": {
-            "version": "4.3.2",
-            "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
-            "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
-            "dev": true,
-            "dependencies": {
-                "type-fest": "^0.21.3"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/ansi-regex": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/ansi-styles": {
-            "version": "3.2.1",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^1.9.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/anymatch": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-            "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
-            "dev": true,
-            "dependencies": {
-                "normalize-path": "^3.0.0",
-                "picomatch": "^2.0.4"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/aproba": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
-            "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
-        },
-        "node_modules/are-we-there-yet": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
-            "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
-            "dependencies": {
-                "delegates": "^1.0.0",
-                "readable-stream": "^3.6.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/argparse": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-            "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-            "dev": true
-        },
-        "node_modules/args-parser": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/args-parser/-/args-parser-1.3.0.tgz",
-            "integrity": "sha512-If3Zi4BSjlQIJ9fgAhSiKi0oJtgMzSqh0H4wvl7XSeO16FKx7QqaHld8lZeEajPX7y1C5qKKeNgyrfyvmjmjUQ=="
-        },
-        "node_modules/arr-union": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-            "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/array-flatten": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-            "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
-        },
-        "node_modules/array-union": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-            "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/arrify": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-            "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/asn1": {
-            "version": "0.2.6",
-            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
-            "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
-            "optional": true,
-            "dependencies": {
-                "safer-buffer": "~2.1.0"
-            }
-        },
-        "node_modules/assert-plus": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-            "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
-            "optional": true,
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/astral-regex": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-            "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/asynckit": {
-            "version": "0.4.0",
-            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-            "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
-        },
-        "node_modules/await-lock": {
-            "version": "2.2.2",
-            "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
-            "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw=="
-        },
-        "node_modules/aws-sign2": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-            "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
-            "optional": true,
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/aws4": {
-            "version": "1.11.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-            "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
-            "optional": true
-        },
-        "node_modules/axios": {
-            "version": "0.26.1",
-            "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
-            "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
-            "dependencies": {
-                "follow-redirects": "^1.14.8"
-            }
-        },
-        "node_modules/axios-ntlm": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.0.tgz",
-            "integrity": "sha512-NPNsIMO1SGX5scs3ZWJqsV7iRLvET+DlRl94aZ7Sx14zA8RTQh9EDxsJmxB9cKjardKfp2Vge444uYYLfvWC0Q==",
-            "dependencies": {
-                "axios": "^0.21.3",
-                "dev-null": "^0.1.1"
-            }
-        },
-        "node_modules/axios-ntlm/node_modules/axios": {
-            "version": "0.21.4",
-            "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
-            "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
-            "dependencies": {
-                "follow-redirects": "^1.14.0"
-            }
-        },
-        "node_modules/babel-jest": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
-            "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
-            "dev": true,
-            "dependencies": {
-                "@jest/transform": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/babel__core": "^7.1.14",
-                "babel-plugin-istanbul": "^6.1.1",
-                "babel-preset-jest": "^27.5.1",
-                "chalk": "^4.0.0",
-                "graceful-fs": "^4.2.9",
-                "slash": "^3.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.8.0"
-            }
-        },
-        "node_modules/babel-jest/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/babel-jest/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/babel-jest/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/babel-jest/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/babel-jest/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/babel-jest/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/babel-plugin-add-module-exports": {
-            "version": "0.2.1",
-            "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz",
-            "integrity": "sha512-3AN/9V/rKuv90NG65m4tTHsI04XrCKsWbztIcW7a8H5iIN7WlvWucRtVV0V/rT4QvtA11n5Vmp20fLwfMWqp6g==",
-            "dev": true
-        },
-        "node_modules/babel-plugin-dynamic-import-node": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
-            "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
-            "dev": true,
-            "dependencies": {
-                "object.assign": "^4.1.0"
-            }
-        },
-        "node_modules/babel-plugin-istanbul": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
-            "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-plugin-utils": "^7.0.0",
-                "@istanbuljs/load-nyc-config": "^1.0.0",
-                "@istanbuljs/schema": "^0.1.2",
-                "istanbul-lib-instrument": "^5.0.4",
-                "test-exclude": "^6.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/babel-plugin-jest-hoist": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
-            "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/template": "^7.3.3",
-                "@babel/types": "^7.3.3",
-                "@types/babel__core": "^7.0.0",
-                "@types/babel__traverse": "^7.0.6"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/babel-plugin-polyfill-corejs2": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
-            "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
-            "dev": true,
-            "dependencies": {
-                "@babel/compat-data": "^7.13.11",
-                "@babel/helper-define-polyfill-provider": "^0.3.1",
-                "semver": "^6.1.1"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/babel-plugin-polyfill-corejs3": {
-            "version": "0.5.2",
-            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
-            "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-define-polyfill-provider": "^0.3.1",
-                "core-js-compat": "^3.21.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/babel-plugin-polyfill-regenerator": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
-            "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
-            "dev": true,
-            "dependencies": {
-                "@babel/helper-define-polyfill-provider": "^0.3.1"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0-0"
-            }
-        },
-        "node_modules/babel-plugin-rewire": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/babel-plugin-rewire/-/babel-plugin-rewire-1.2.0.tgz",
-            "integrity": "sha512-JBZxczHw3tScS+djy6JPLMjblchGhLI89ep15H3SyjujIzlxo5nr6Yjo7AXotdeVczeBmWs0tF8PgJWDdgzAkQ==",
-            "dev": true
-        },
-        "node_modules/babel-preset-current-node-syntax": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
-            "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
-            "dev": true,
-            "dependencies": {
-                "@babel/plugin-syntax-async-generators": "^7.8.4",
-                "@babel/plugin-syntax-bigint": "^7.8.3",
-                "@babel/plugin-syntax-class-properties": "^7.8.3",
-                "@babel/plugin-syntax-import-meta": "^7.8.3",
-                "@babel/plugin-syntax-json-strings": "^7.8.3",
-                "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
-                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-                "@babel/plugin-syntax-numeric-separator": "^7.8.3",
-                "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-                "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-                "@babel/plugin-syntax-top-level-await": "^7.8.3"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0"
-            }
-        },
-        "node_modules/babel-preset-jest": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
-            "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
-            "dev": true,
-            "dependencies": {
-                "babel-plugin-jest-hoist": "^27.5.1",
-                "babel-preset-current-node-syntax": "^1.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            },
-            "peerDependencies": {
-                "@babel/core": "^7.0.0"
-            }
-        },
-        "node_modules/babel-runtime": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-            "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
-            "dev": true,
-            "dependencies": {
-                "core-js": "^2.4.0",
-                "regenerator-runtime": "^0.11.0"
-            }
-        },
-        "node_modules/babel-runtime/node_modules/core-js": {
-            "version": "2.6.12",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
-            "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
-            "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
-            "dev": true,
-            "hasInstallScript": true
-        },
-        "node_modules/babel-runtime/node_modules/regenerator-runtime": {
-            "version": "0.11.1",
-            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-            "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
-            "dev": true
-        },
-        "node_modules/backo2": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
-            "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA=="
-        },
-        "node_modules/badge-maker": {
-            "version": "3.3.1",
-            "resolved": "https://registry.npmjs.org/badge-maker/-/badge-maker-3.3.1.tgz",
-            "integrity": "sha512-OO/PS7Zg2E6qaUWzHEHt21Q5VjcFBAJVA8ztgT/fIdSZFBUwoyeo0ZhA6V5tUM8Vcjq8DJl6jfGhpjESssyqMQ==",
-            "dependencies": {
-                "anafanafo": "2.0.0",
-                "css-color-converter": "^2.0.0"
-            },
-            "bin": {
-                "badge": "lib/badge-cli.js"
-            },
-            "engines": {
-                "node": ">= 10",
-                "npm": ">= 5"
-            }
-        },
-        "node_modules/balanced-match": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-        },
-        "node_modules/base64-js": {
-            "version": "1.5.1",
-            "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-            "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
-                    "url": "https://feross.org/support"
-                }
-            ]
-        },
-        "node_modules/base64id": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
-            "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
-            "engines": {
-                "node": "^4.5.0 || >= 5.9"
-            }
-        },
-        "node_modules/basic-auth": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
-            "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
-            "dependencies": {
-                "safe-buffer": "5.1.2"
-            },
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/bcrypt-pbkdf": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-            "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
-            "optional": true,
-            "dependencies": {
-                "tweetnacl": "^0.14.3"
-            }
-        },
-        "node_modules/bcryptjs": {
-            "version": "2.4.3",
-            "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
-            "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
-        },
-        "node_modules/before-after-hook": {
-            "version": "2.2.2",
-            "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
-            "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==",
-            "dev": true
-        },
-        "node_modules/binary-extensions": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/binary-search": {
-            "version": "1.3.6",
-            "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz",
-            "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA=="
-        },
-        "node_modules/bintrees": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz",
-            "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw=="
-        },
-        "node_modules/bl": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
-            "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
-            "dependencies": {
-                "buffer": "^5.5.0",
-                "inherits": "^2.0.4",
-                "readable-stream": "^3.4.0"
-            }
-        },
-        "node_modules/body-parser": {
-            "version": "1.19.2",
-            "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
-            "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
-            "dependencies": {
-                "bytes": "3.1.2",
-                "content-type": "~1.0.4",
-                "debug": "2.6.9",
-                "depd": "~1.1.2",
-                "http-errors": "1.8.1",
-                "iconv-lite": "0.4.24",
-                "on-finished": "~2.3.0",
-                "qs": "6.9.7",
-                "raw-body": "2.4.3",
-                "type-is": "~1.6.18"
-            },
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/body-parser/node_modules/bytes": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
-            "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/body-parser/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/body-parser/node_modules/iconv-lite": {
-            "version": "0.4.24",
-            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-            "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-            "dependencies": {
-                "safer-buffer": ">= 2.1.2 < 3"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/body-parser/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
-        "node_modules/boolbase": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-            "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
-        },
-        "node_modules/boolean": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
-            "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="
-        },
-        "node_modules/bootstrap": {
-            "version": "5.1.3",
-            "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
-            "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
-            "dev": true,
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/bootstrap"
-            },
-            "peerDependencies": {
-                "@popperjs/core": "^2.10.2"
-            }
-        },
-        "node_modules/brace-expansion": {
-            "version": "1.1.11",
-            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-            "dependencies": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-            }
-        },
-        "node_modules/braces": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-            "dev": true,
-            "dependencies": {
-                "fill-range": "^7.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/bree": {
-            "version": "7.1.5",
-            "resolved": "https://registry.npmjs.org/bree/-/bree-7.1.5.tgz",
-            "integrity": "sha512-YAs4VQDjc6p3NhNNHBkS9NXK4wryeMq7Y/SCMcgFh0cSD4oXk7B9v53/cqzoejdelD30KEliumzrd4awka+YhQ==",
-            "dependencies": {
-                "@breejs/later": "^4.1.0",
-                "boolean": "^3.1.4",
-                "combine-errors": "^3.0.3",
-                "cron-validate": "^1.4.3",
-                "debug": "^4.3.3",
-                "human-interval": "^2.0.1",
-                "is-string-and-not-blank": "^0.0.2",
-                "is-valid-path": "^0.1.1",
-                "ms": "^2.1.3",
-                "p-wait-for": "3",
-                "safe-timers": "^1.1.0"
-            },
-            "engines": {
-                "node": ">= 12.11.0"
-            }
-        },
-        "node_modules/browser-process-hrtime": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
-            "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
-            "dev": true
-        },
-        "node_modules/browserslist": {
-            "version": "4.21.1",
-            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz",
-            "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==",
-            "dev": true,
-            "funding": [
-                {
-                    "type": "opencollective",
-                    "url": "https://opencollective.com/browserslist"
-                },
-                {
-                    "type": "tidelift",
-                    "url": "https://tidelift.com/funding/github/npm/browserslist"
-                }
-            ],
-            "dependencies": {
-                "caniuse-lite": "^1.0.30001359",
-                "electron-to-chromium": "^1.4.172",
-                "node-releases": "^2.0.5",
-                "update-browserslist-db": "^1.0.4"
-            },
-            "bin": {
-                "browserslist": "cli.js"
-            },
-            "engines": {
-                "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-            }
-        },
-        "node_modules/bser": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
-            "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
-            "dev": true,
-            "dependencies": {
-                "node-int64": "^0.4.0"
-            }
-        },
-        "node_modules/buffer": {
-            "version": "5.7.1",
-            "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-            "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
-                    "url": "https://feross.org/support"
-                }
-            ],
-            "dependencies": {
-                "base64-js": "^1.3.1",
-                "ieee754": "^1.1.13"
-            }
-        },
-        "node_modules/buffer-crc32": {
-            "version": "0.2.13",
-            "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-            "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
-            "dev": true,
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/buffer-equal-constant-time": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
-            "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
-        },
-        "node_modules/buffer-from": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-            "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
-        },
-        "node_modules/buffer-writer": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
-            "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/bulk-write-stream": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz",
-            "integrity": "sha512-XWOLjgHtpDasHfwM8oO4df1JoZwa7/OwTsXDzh4rUTo+9CowzeOFBZz43w+H14h1fyq+xl28tVIBrdjcjj4Gug==",
-            "dev": true,
-            "dependencies": {
-                "inherits": "^2.0.3",
-                "readable-stream": "^3.1.1"
-            }
-        },
-        "node_modules/bytes": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
-            "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/cacheable-lookup": {
-            "version": "6.0.4",
-            "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz",
-            "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A==",
-            "engines": {
-                "node": ">=10.6.0"
-            }
-        },
-        "node_modules/call-bind": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-            "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-            "dependencies": {
-                "function-bind": "^1.1.1",
-                "get-intrinsic": "^1.0.2"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/callsites": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-            "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/camelcase": {
-            "version": "5.3.1",
-            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/camelcase-keys": {
-            "version": "6.2.2",
-            "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
-            "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
-            "dev": true,
-            "dependencies": {
-                "camelcase": "^5.3.1",
-                "map-obj": "^4.0.0",
-                "quick-lru": "^4.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/caniuse-lite": {
-            "version": "1.0.30001362",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001362.tgz",
-            "integrity": "sha512-PFykHuC7BQTzCGQFaV6wD8IDRM3HpI83BXr99nNJhoOyDufgSuKlt0QVlWYt5ZJtEYFeuNVF5QY3kJcu8hVFjQ==",
-            "dev": true,
-            "funding": [
-                {
-                    "type": "opencollective",
-                    "url": "https://opencollective.com/browserslist"
-                },
-                {
-                    "type": "tidelift",
-                    "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
-                }
-            ]
-        },
-        "node_modules/caseless": {
-            "version": "0.12.0",
-            "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-            "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
-            "optional": true
-        },
-        "node_modules/chalk": {
-            "version": "2.4.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^3.2.1",
-                "escape-string-regexp": "^1.0.5",
-                "supports-color": "^5.3.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/char-regex": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
-            "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/char-width-table-consumer": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/char-width-table-consumer/-/char-width-table-consumer-1.0.0.tgz",
-            "integrity": "sha512-Fz4UD0LBpxPgL9i29CJ5O4KANwaMnX/OhhbxzvNa332h+9+nRKyeuLw4wA51lt/ex67+/AdsoBQJF3kgX2feYQ==",
-            "dependencies": {
-                "binary-search": "^1.3.5"
-            }
-        },
-        "node_modules/chardet": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.4.0.tgz",
-            "integrity": "sha512-NpwMDdSIprbYx1CLnfbxEIarI0Z+s9MssEgggMNheGM+WD68yOhV7IEA/3r6tr0yTRgQD0HuZJDw32s99i6L+A=="
-        },
-        "node_modules/chart.js": {
-            "version": "3.6.2",
-            "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.2.tgz",
-            "integrity": "sha512-Xz7f/fgtVltfQYWq0zL1Xbv7N2inpG+B54p3D5FSvpCdy3sM+oZhbqa42eNuYXltaVvajgX5UpKCU2GeeJIgxg==",
-            "dev": true
-        },
-        "node_modules/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==",
-            "dev": true,
-            "peerDependencies": {
-                "chart.js": ">= 2.8.0 < 3",
-                "dayjs": "^1.8.15"
-            }
-        },
-        "node_modules/check-password-strength": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/check-password-strength/-/check-password-strength-2.0.5.tgz",
-            "integrity": "sha512-b61T/+4OIGWSMRxJUsYOY44Cf9w7orIt2OQmF/WgH16qbJKIT1jG3XHx3jP+o090eH7rq13DRleKgXCiROBzMQ=="
-        },
-        "node_modules/cheerio": {
-            "version": "1.0.0-rc.12",
-            "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
-            "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
-            "dependencies": {
-                "cheerio-select": "^2.1.0",
-                "dom-serializer": "^2.0.0",
-                "domhandler": "^5.0.3",
-                "domutils": "^3.0.1",
-                "htmlparser2": "^8.0.1",
-                "parse5": "^7.0.0",
-                "parse5-htmlparser2-tree-adapter": "^7.0.0"
-            },
-            "engines": {
-                "node": ">= 6"
-            },
-            "funding": {
-                "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
-            }
-        },
-        "node_modules/cheerio-select": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
-            "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
-            "dependencies": {
-                "boolbase": "^1.0.0",
-                "css-select": "^5.1.0",
-                "css-what": "^6.1.0",
-                "domelementtype": "^2.3.0",
-                "domhandler": "^5.0.3",
-                "domutils": "^3.0.1"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/fb55"
-            }
-        },
-        "node_modules/chokidar": {
-            "version": "3.5.3",
-            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
-            "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
-            "dev": true,
-            "funding": [
-                {
-                    "type": "individual",
-                    "url": "https://paulmillr.com/funding/"
-                }
-            ],
-            "dependencies": {
-                "anymatch": "~3.1.2",
-                "braces": "~3.0.2",
-                "glob-parent": "~5.1.2",
-                "is-binary-path": "~2.1.0",
-                "is-glob": "~4.0.1",
-                "normalize-path": "~3.0.0",
-                "readdirp": "~3.6.0"
-            },
-            "engines": {
-                "node": ">= 8.10.0"
-            },
-            "optionalDependencies": {
-                "fsevents": "~2.3.2"
-            }
-        },
-        "node_modules/chokidar/node_modules/glob-parent": {
-            "version": "5.1.2",
-            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-            "dev": true,
-            "dependencies": {
-                "is-glob": "^4.0.1"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/chownr": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-            "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/chroma-js": {
-            "version": "2.4.2",
-            "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz",
-            "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
-        },
-        "node_modules/ci-info": {
-            "version": "3.3.2",
-            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz",
-            "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==",
-            "dev": true
-        },
-        "node_modules/cjs-module-lexer": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
-            "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
-            "dev": true
-        },
-        "node_modules/cliui": {
-            "version": "7.0.4",
-            "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-            "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-            "dev": true,
-            "dependencies": {
-                "string-width": "^4.2.0",
-                "strip-ansi": "^6.0.0",
-                "wrap-ansi": "^7.0.0"
-            }
-        },
-        "node_modules/clone-deep": {
-            "version": "0.2.4",
-            "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
-            "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==",
-            "dev": true,
-            "dependencies": {
-                "for-own": "^0.1.3",
-                "is-plain-object": "^2.0.1",
-                "kind-of": "^3.0.2",
-                "lazy-cache": "^1.0.3",
-                "shallow-clone": "^0.1.2"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/clone-deep/node_modules/is-plain-object": {
-            "version": "2.0.4",
-            "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-            "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-            "dev": true,
-            "dependencies": {
-                "isobject": "^3.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/clone-regexp": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
-            "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==",
-            "dev": true,
-            "dependencies": {
-                "is-regexp": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/co": {
-            "version": "4.6.0",
-            "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-            "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
-            "dev": true,
-            "engines": {
-                "iojs": ">= 1.0.0",
-                "node": ">= 0.12.0"
-            }
-        },
-        "node_modules/code-point-at": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-            "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
-            "optional": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/collect-v8-coverage": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
-            "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
-            "dev": true
-        },
-        "node_modules/color-convert": {
-            "version": "1.9.3",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "1.1.3"
-            }
-        },
-        "node_modules/color-name": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-            "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-            "dev": true
-        },
-        "node_modules/color-support": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
-            "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
-            "bin": {
-                "color-support": "bin.js"
-            }
-        },
-        "node_modules/colord": {
-            "version": "2.9.2",
-            "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
-            "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==",
-            "dev": true
-        },
-        "node_modules/colorette": {
-            "version": "2.0.16",
-            "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
-            "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
-        },
-        "node_modules/combine-errors": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz",
-            "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==",
-            "dependencies": {
-                "custom-error-instance": "2.1.1",
-                "lodash.uniqby": "4.5.0"
-            }
-        },
-        "node_modules/combined-stream": {
-            "version": "1.0.8",
-            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-            "dependencies": {
-                "delayed-stream": "~1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/command-exists": {
-            "version": "1.2.9",
-            "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
-            "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="
-        },
-        "node_modules/commander": {
-            "version": "5.1.0",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
-            "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
-            "dev": true,
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/commist": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz",
-            "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==",
-            "dependencies": {
-                "leven": "^2.1.0",
-                "minimist": "^1.1.0"
-            }
-        },
-        "node_modules/commist/node_modules/leven": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
-            "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/compare-versions": {
-            "version": "3.6.0",
-            "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
-            "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
-        },
-        "node_modules/component-emitter": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-            "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
-        },
-        "node_modules/compressible": {
-            "version": "2.0.18",
-            "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
-            "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
-            "dependencies": {
-                "mime-db": ">= 1.43.0 < 2"
-            },
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/compression": {
-            "version": "1.7.4",
-            "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
-            "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
-            "dependencies": {
-                "accepts": "~1.3.5",
-                "bytes": "3.0.0",
-                "compressible": "~2.0.16",
-                "debug": "2.6.9",
-                "on-headers": "~1.0.2",
-                "safe-buffer": "5.1.2",
-                "vary": "~1.1.2"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/compression/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/compression/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
-        "node_modules/concat-map": {
-            "version": "0.0.1",
-            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
-        },
-        "node_modules/concat-stream": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
-            "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
-            "engines": [
-                "node >= 6.0"
-            ],
-            "dependencies": {
-                "buffer-from": "^1.0.0",
-                "inherits": "^2.0.3",
-                "readable-stream": "^3.0.2",
-                "typedarray": "^0.0.6"
-            }
-        },
-        "node_modules/concurrently": {
-            "version": "7.2.2",
-            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.2.tgz",
-            "integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.1.0",
-                "date-fns": "^2.16.1",
-                "lodash": "^4.17.21",
-                "rxjs": "^7.0.0",
-                "shell-quote": "^1.7.3",
-                "spawn-command": "^0.0.2-1",
-                "supports-color": "^8.1.0",
-                "tree-kill": "^1.2.2",
-                "yargs": "^17.3.1"
-            },
-            "bin": {
-                "concurrently": "dist/bin/concurrently.js"
-            },
-            "engines": {
-                "node": "^12.20.0 || ^14.13.0 || >=16.0.0"
-            }
-        },
-        "node_modules/concurrently/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/concurrently/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/concurrently/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/concurrently/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/concurrently/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/concurrently/node_modules/supports-color": {
-            "version": "8.1.1",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-            "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/supports-color?sponsor=1"
-            }
-        },
-        "node_modules/console-control-strings": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-            "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
-        },
-        "node_modules/content-disposition": {
-            "version": "0.5.4",
-            "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
-            "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
-            "dependencies": {
-                "safe-buffer": "5.2.1"
-            },
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/content-disposition/node_modules/safe-buffer": {
-            "version": "5.2.1",
-            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
-                    "url": "https://feross.org/support"
-                }
-            ]
-        },
-        "node_modules/content-type": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-            "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/convert-source-map": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
-            "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
-            "dev": true,
-            "dependencies": {
-                "safe-buffer": "~5.1.1"
-            }
-        },
-        "node_modules/cookie": {
-            "version": "0.4.2",
-            "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
-            "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/cookie-signature": {
-            "version": "1.0.6",
-            "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-            "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
-        },
-        "node_modules/core-js": {
-            "version": "3.18.3",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz",
-            "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==",
-            "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
-            "dev": true,
-            "hasInstallScript": true,
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/core-js"
-            }
-        },
-        "node_modules/core-js-compat": {
-            "version": "3.23.3",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz",
-            "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==",
-            "dev": true,
-            "dependencies": {
-                "browserslist": "^4.21.0",
-                "semver": "7.0.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/core-js"
-            }
-        },
-        "node_modules/core-js-compat/node_modules/semver": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
-            "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
-            "dev": true,
-            "bin": {
-                "semver": "bin/semver.js"
-            }
-        },
-        "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
-            "devOptional": true
-        },
-        "node_modules/cors": {
-            "version": "2.8.5",
-            "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
-            "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
-            "dependencies": {
-                "object-assign": "^4",
-                "vary": "^1"
-            },
-            "engines": {
-                "node": ">= 0.10"
-            }
-        },
-        "node_modules/cosmiconfig": {
-            "version": "7.0.1",
-            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
-            "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
-            "dev": true,
-            "dependencies": {
-                "@types/parse-json": "^4.0.0",
-                "import-fresh": "^3.2.1",
-                "parse-json": "^5.0.0",
-                "path-type": "^4.0.0",
-                "yaml": "^1.10.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/cron-validate": {
-            "version": "1.4.3",
-            "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.3.tgz",
-            "integrity": "sha512-N+qKw019oQBEPIP5Qwi8Z5XelQ00ThN6Maahwv+9UGu2u/b/MPb35zngMQI0T8pBoNiBrIXGlhvsmspNSYae/w==",
-            "dependencies": {
-                "yup": "0.32.9"
-            }
-        },
-        "node_modules/cross-env": {
-            "version": "7.0.3",
-            "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
-            "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
-            "dev": true,
-            "dependencies": {
-                "cross-spawn": "^7.0.1"
-            },
-            "bin": {
-                "cross-env": "src/bin/cross-env.js",
-                "cross-env-shell": "src/bin/cross-env-shell.js"
-            },
-            "engines": {
-                "node": ">=10.14",
-                "npm": ">=6",
-                "yarn": ">=1"
-            }
-        },
-        "node_modules/cross-spawn": {
-            "version": "7.0.3",
-            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-            "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-            "dev": true,
-            "dependencies": {
-                "path-key": "^3.1.0",
-                "shebang-command": "^2.0.0",
-                "which": "^2.0.1"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/css-color-converter": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/css-color-converter/-/css-color-converter-2.0.0.tgz",
-            "integrity": "sha512-oLIG2soZz3wcC3aAl/7Us5RS8Hvvc6I8G8LniF/qfMmrm7fIKQ8RIDDRZeKyGL2SrWfNqYspuLShbnjBMVWm8g==",
-            "dependencies": {
-                "color-convert": "^0.5.2",
-                "color-name": "^1.1.4",
-                "css-unit-converter": "^1.1.2"
-            }
-        },
-        "node_modules/css-color-converter/node_modules/color-convert": {
-            "version": "0.5.3",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz",
-            "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling=="
-        },
-        "node_modules/css-color-converter/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-        },
-        "node_modules/css-functions-list": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz",
-            "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==",
-            "dev": true,
-            "engines": {
-                "node": ">=12.22"
-            }
-        },
-        "node_modules/css-select": {
-            "version": "5.1.0",
-            "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
-            "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
-            "dependencies": {
-                "boolbase": "^1.0.0",
-                "css-what": "^6.1.0",
-                "domhandler": "^5.0.2",
-                "domutils": "^3.0.1",
-                "nth-check": "^2.0.1"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/fb55"
-            }
-        },
-        "node_modules/css-unit-converter": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
-            "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA=="
-        },
-        "node_modules/css-what": {
-            "version": "6.1.0",
-            "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
-            "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
-            "engines": {
-                "node": ">= 6"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/fb55"
-            }
-        },
-        "node_modules/cssesc": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
-            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
-            "dev": true,
-            "bin": {
-                "cssesc": "bin/cssesc"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/cssom": {
-            "version": "0.4.4",
-            "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
-            "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
-            "dev": true
-        },
-        "node_modules/cssstyle": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-            "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
-            "dev": true,
-            "dependencies": {
-                "cssom": "~0.3.6"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/cssstyle/node_modules/cssom": {
-            "version": "0.3.8",
-            "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-            "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-            "dev": true
-        },
-        "node_modules/csstype": {
-            "version": "2.6.20",
-            "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
-            "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
-            "dev": true
-        },
-        "node_modules/custom-error-instance": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz",
-            "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg=="
-        },
-        "node_modules/cwd": {
-            "version": "0.10.0",
-            "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz",
-            "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==",
-            "dev": true,
-            "dependencies": {
-                "find-pkg": "^0.1.2",
-                "fs-exists-sync": "^0.1.0"
-            },
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/dashdash": {
-            "version": "1.14.1",
-            "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-            "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
-            "optional": true,
-            "dependencies": {
-                "assert-plus": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10"
-            }
-        },
-        "node_modules/data-urls": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
-            "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
-            "dev": true,
-            "dependencies": {
-                "abab": "^2.0.3",
-                "whatwg-mimetype": "^2.3.0",
-                "whatwg-url": "^8.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/date-fns": {
-            "version": "2.28.0",
-            "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
-            "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.11"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/date-fns"
-            }
-        },
-        "node_modules/dayjs": {
-            "version": "1.11.3",
-            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz",
-            "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A=="
-        },
-        "node_modules/debug": {
-            "version": "4.3.4",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-            "dependencies": {
-                "ms": "2.1.2"
-            },
-            "engines": {
-                "node": ">=6.0"
-            },
-            "peerDependenciesMeta": {
-                "supports-color": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/debug/node_modules/ms": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        },
-        "node_modules/decamelize": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-            "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/decamelize-keys": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
-            "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
-            "dev": true,
-            "dependencies": {
-                "decamelize": "^1.1.0",
-                "map-obj": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/decamelize-keys/node_modules/map-obj": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-            "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/decimal.js": {
-            "version": "10.3.1",
-            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
-            "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
-            "dev": true
-        },
-        "node_modules/dedent": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-            "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
-            "dev": true
-        },
-        "node_modules/deep-is": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
-            "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-            "dev": true
-        },
-        "node_modules/deepmerge": {
-            "version": "4.2.2",
-            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-            "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/define-lazy-prop": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
-            "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/define-properties": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
-            "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
-            "dependencies": {
-                "has-property-descriptors": "^1.0.0",
-                "object-keys": "^1.1.1"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/delayed-stream": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-            "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
-        "node_modules/delegates": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-            "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
-        },
-        "node_modules/depd": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-            "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/deprecation": {
-            "version": "2.3.1",
-            "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
-            "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
-            "dev": true
-        },
-        "node_modules/destroy": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
-            "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg=="
-        },
-        "node_modules/detect-libc": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
-            "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/detect-newline": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
-            "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/dev-null": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz",
-            "integrity": "sha512-nMNZG0zfMgmdv8S5O0TM5cpwNbGKRGPCxVsr0SmA3NZZy9CYBbuNLL0PD3Acx9e5LIUgwONXtM9kM6RlawPxEQ=="
-        },
-        "node_modules/devtools-protocol": {
-            "version": "0.0.948846",
-            "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.948846.tgz",
-            "integrity": "sha512-5fGyt9xmMqUl2VI7+rnUkKCiAQIpLns8sfQtTENy5L70ktbNw0Z3TFJ1JoFNYdx/jffz4YXU45VF75wKZD7sZQ==",
-            "dev": true
-        },
-        "node_modules/diff-sequences": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
-            "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
-            "dev": true,
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/dijkstrajs": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
-            "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==",
-            "dev": true
-        },
-        "node_modules/dir-glob": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-            "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-            "dev": true,
-            "dependencies": {
-                "path-type": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/dns2": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/dns2/-/dns2-2.0.2.tgz",
-            "integrity": "sha512-XYBUv6/CyGAGkeyXOeHhjKscHm2b70oSl1as1C2qLVWvZKJLdzxv/LsyyEJeMdbkCS48OyajfBhP6NpO55gQww==",
-            "dev": true
-        },
-        "node_modules/doctrine": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-            "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-            "dev": true,
-            "dependencies": {
-                "esutils": "^2.0.2"
-            },
-            "engines": {
-                "node": ">=6.0.0"
-            }
-        },
-        "node_modules/dom-serializer": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-            "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-            "dependencies": {
-                "domelementtype": "^2.3.0",
-                "domhandler": "^5.0.2",
-                "entities": "^4.2.0"
-            },
-            "funding": {
-                "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
-            }
-        },
-        "node_modules/domelementtype": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
-            "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/fb55"
-                }
-            ]
-        },
-        "node_modules/domexception": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
-            "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
-            "dev": true,
-            "dependencies": {
-                "webidl-conversions": "^5.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/domexception/node_modules/webidl-conversions": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
-            "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/domhandler": {
-            "version": "5.0.3",
-            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-            "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-            "dependencies": {
-                "domelementtype": "^2.3.0"
-            },
-            "engines": {
-                "node": ">= 4"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/domhandler?sponsor=1"
-            }
-        },
-        "node_modules/domutils": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-            "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
-            "dependencies": {
-                "dom-serializer": "^2.0.0",
-                "domelementtype": "^2.3.0",
-                "domhandler": "^5.0.1"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/domutils?sponsor=1"
-            }
-        },
-        "node_modules/duplexify": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
-            "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
-            "dependencies": {
-                "end-of-stream": "^1.4.1",
-                "inherits": "^2.0.3",
-                "readable-stream": "^3.1.1",
-                "stream-shift": "^1.0.0"
-            }
-        },
-        "node_modules/ecc-jsbn": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-            "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
-            "optional": true,
-            "dependencies": {
-                "jsbn": "~0.1.0",
-                "safer-buffer": "^2.1.0"
-            }
-        },
-        "node_modules/ecdsa-sig-formatter": {
-            "version": "1.0.11",
-            "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
-            "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
-            "dependencies": {
-                "safe-buffer": "^5.0.1"
-            }
-        },
-        "node_modules/ee-first": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-            "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
-        },
-        "node_modules/electron-to-chromium": {
-            "version": "1.4.177",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.177.tgz",
-            "integrity": "sha512-FYPir3NSBEGexSZUEeht81oVhHfLFl6mhUKSkjHN/iB/TwEIt/WHQrqVGfTLN5gQxwJCQkIJBe05eOXjI7omgg==",
-            "dev": true
-        },
-        "node_modules/emittery": {
-            "version": "0.8.1",
-            "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
-            "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sindresorhus/emittery?sponsor=1"
-            }
-        },
-        "node_modules/emoji-regex": {
-            "version": "8.0.0",
-            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-        },
-        "node_modules/encode-utf8": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
-            "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==",
-            "dev": true
-        },
-        "node_modules/encodeurl": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-            "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/end-of-stream": {
-            "version": "1.4.4",
-            "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-            "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-            "dependencies": {
-                "once": "^1.4.0"
-            }
-        },
-        "node_modules/engine.io": {
-            "version": "6.1.3",
-            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz",
-            "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==",
-            "dependencies": {
-                "@types/cookie": "^0.4.1",
-                "@types/cors": "^2.8.12",
-                "@types/node": ">=10.0.0",
-                "accepts": "~1.3.4",
-                "base64id": "2.0.0",
-                "cookie": "~0.4.1",
-                "cors": "~2.8.5",
-                "debug": "~4.3.1",
-                "engine.io-parser": "~5.0.3",
-                "ws": "~8.2.3"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/engine.io-client": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz",
-            "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==",
-            "dependencies": {
-                "@socket.io/component-emitter": "~3.0.0",
-                "debug": "~4.3.1",
-                "engine.io-parser": "~5.0.0",
-                "has-cors": "1.1.0",
-                "parseqs": "0.0.6",
-                "parseuri": "0.0.6",
-                "ws": "~8.2.3",
-                "xmlhttprequest-ssl": "~2.0.0",
-                "yeast": "0.1.2"
-            }
-        },
-        "node_modules/engine.io-client/node_modules/ws": {
-            "version": "8.2.3",
-            "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
-            "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
-            "engines": {
-                "node": ">=10.0.0"
-            },
-            "peerDependencies": {
-                "bufferutil": "^4.0.1",
-                "utf-8-validate": "^5.0.2"
-            },
-            "peerDependenciesMeta": {
-                "bufferutil": {
-                    "optional": true
-                },
-                "utf-8-validate": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/engine.io-parser": {
-            "version": "5.0.4",
-            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
-            "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/engine.io/node_modules/ws": {
-            "version": "8.2.3",
-            "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
-            "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
-            "engines": {
-                "node": ">=10.0.0"
-            },
-            "peerDependencies": {
-                "bufferutil": "^4.0.1",
-                "utf-8-validate": "^5.0.2"
-            },
-            "peerDependenciesMeta": {
-                "bufferutil": {
-                    "optional": true
-                },
-                "utf-8-validate": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/entities": {
-            "version": "4.3.1",
-            "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
-            "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
-            "engines": {
-                "node": ">=0.12"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/entities?sponsor=1"
-            }
-        },
-        "node_modules/env-paths": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
-            "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
-            "optional": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/error-ex": {
-            "version": "1.3.2",
-            "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-            "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-            "dev": true,
-            "dependencies": {
-                "is-arrayish": "^0.2.1"
-            }
-        },
-        "node_modules/es-abstract": {
-            "version": "1.20.1",
-            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz",
-            "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==",
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "es-to-primitive": "^1.2.1",
-                "function-bind": "^1.1.1",
-                "function.prototype.name": "^1.1.5",
-                "get-intrinsic": "^1.1.1",
-                "get-symbol-description": "^1.0.0",
-                "has": "^1.0.3",
-                "has-property-descriptors": "^1.0.0",
-                "has-symbols": "^1.0.3",
-                "internal-slot": "^1.0.3",
-                "is-callable": "^1.2.4",
-                "is-negative-zero": "^2.0.2",
-                "is-regex": "^1.1.4",
-                "is-shared-array-buffer": "^1.0.2",
-                "is-string": "^1.0.7",
-                "is-weakref": "^1.0.2",
-                "object-inspect": "^1.12.0",
-                "object-keys": "^1.1.1",
-                "object.assign": "^4.1.2",
-                "regexp.prototype.flags": "^1.4.3",
-                "string.prototype.trimend": "^1.0.5",
-                "string.prototype.trimstart": "^1.0.5",
-                "unbox-primitive": "^1.0.2"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/es-aggregate-error": {
-            "version": "1.0.8",
-            "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.8.tgz",
-            "integrity": "sha512-AKUb5MKLWMozPlFRHOKqWD7yta5uaEhH21qwtnf6FlKjNjTJOoqFi0/G14+FfSkIQhhu6X68Af4xgRC6y8qG4A==",
-            "dependencies": {
-                "define-properties": "^1.1.4",
-                "es-abstract": "^1.19.5",
-                "function-bind": "^1.1.1",
-                "functions-have-names": "^1.2.3",
-                "get-intrinsic": "^1.1.1",
-                "globalthis": "^1.0.2",
-                "has-property-descriptors": "^1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/es-to-primitive": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-            "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-            "dependencies": {
-                "is-callable": "^1.1.4",
-                "is-date-object": "^1.0.1",
-                "is-symbol": "^1.0.2"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/esbuild": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz",
-            "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==",
-            "dev": true,
-            "hasInstallScript": true,
-            "bin": {
-                "esbuild": "bin/esbuild"
-            },
-            "engines": {
-                "node": ">=12"
-            },
-            "optionalDependencies": {
-                "esbuild-android-64": "0.14.48",
-                "esbuild-android-arm64": "0.14.48",
-                "esbuild-darwin-64": "0.14.48",
-                "esbuild-darwin-arm64": "0.14.48",
-                "esbuild-freebsd-64": "0.14.48",
-                "esbuild-freebsd-arm64": "0.14.48",
-                "esbuild-linux-32": "0.14.48",
-                "esbuild-linux-64": "0.14.48",
-                "esbuild-linux-arm": "0.14.48",
-                "esbuild-linux-arm64": "0.14.48",
-                "esbuild-linux-mips64le": "0.14.48",
-                "esbuild-linux-ppc64le": "0.14.48",
-                "esbuild-linux-riscv64": "0.14.48",
-                "esbuild-linux-s390x": "0.14.48",
-                "esbuild-netbsd-64": "0.14.48",
-                "esbuild-openbsd-64": "0.14.48",
-                "esbuild-sunos-64": "0.14.48",
-                "esbuild-windows-32": "0.14.48",
-                "esbuild-windows-64": "0.14.48",
-                "esbuild-windows-arm64": "0.14.48"
-            }
-        },
-        "node_modules/esbuild-android-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz",
-            "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==",
-            "cpu": [
-                "x64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "android"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-android-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz",
-            "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==",
-            "cpu": [
-                "arm64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "android"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-darwin-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz",
-            "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==",
-            "cpu": [
-                "x64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "darwin"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-darwin-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz",
-            "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==",
-            "cpu": [
-                "arm64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "darwin"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-freebsd-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz",
-            "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==",
-            "cpu": [
-                "x64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "freebsd"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-freebsd-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz",
-            "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==",
-            "cpu": [
-                "arm64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "freebsd"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-linux-32": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz",
-            "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==",
-            "cpu": [
-                "ia32"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "linux"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-linux-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz",
-            "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==",
-            "cpu": [
-                "x64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "linux"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-linux-arm": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz",
-            "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==",
-            "cpu": [
-                "arm"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "linux"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-linux-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz",
-            "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==",
-            "cpu": [
-                "arm64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "linux"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-linux-mips64le": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz",
-            "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==",
-            "cpu": [
-                "mips64el"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "linux"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-linux-ppc64le": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz",
-            "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==",
-            "cpu": [
-                "ppc64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "linux"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-linux-riscv64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz",
-            "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==",
-            "cpu": [
-                "riscv64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "linux"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-linux-s390x": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz",
-            "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==",
-            "cpu": [
-                "s390x"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "linux"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-netbsd-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz",
-            "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==",
-            "cpu": [
-                "x64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "netbsd"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-openbsd-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz",
-            "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==",
-            "cpu": [
-                "x64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "openbsd"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-sunos-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz",
-            "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==",
-            "cpu": [
-                "x64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "sunos"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-windows-32": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz",
-            "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==",
-            "cpu": [
-                "ia32"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "win32"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-windows-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz",
-            "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==",
-            "cpu": [
-                "x64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "win32"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/esbuild-windows-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz",
-            "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==",
-            "cpu": [
-                "arm64"
-            ],
-            "dev": true,
-            "optional": true,
-            "os": [
-                "win32"
-            ],
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/escalade": {
-            "version": "3.1.1",
-            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/escape-html": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-            "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
-        },
-        "node_modules/escape-string-regexp": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-            "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
-        "node_modules/escodegen": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
-            "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
-            "dev": true,
-            "dependencies": {
-                "esprima": "^4.0.1",
-                "estraverse": "^5.2.0",
-                "esutils": "^2.0.2",
-                "optionator": "^0.8.1"
-            },
-            "bin": {
-                "escodegen": "bin/escodegen.js",
-                "esgenerate": "bin/esgenerate.js"
-            },
-            "engines": {
-                "node": ">=6.0"
-            },
-            "optionalDependencies": {
-                "source-map": "~0.6.1"
-            }
-        },
-        "node_modules/escodegen/node_modules/estraverse": {
-            "version": "5.3.0",
-            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-            "dev": true,
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/escodegen/node_modules/levn": {
-            "version": "0.3.0",
-            "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-            "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-            "dev": true,
-            "dependencies": {
-                "prelude-ls": "~1.1.2",
-                "type-check": "~0.3.2"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/escodegen/node_modules/optionator": {
-            "version": "0.8.3",
-            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-            "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-            "dev": true,
-            "dependencies": {
-                "deep-is": "~0.1.3",
-                "fast-levenshtein": "~2.0.6",
-                "levn": "~0.3.0",
-                "prelude-ls": "~1.1.2",
-                "type-check": "~0.3.2",
-                "word-wrap": "~1.2.3"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/escodegen/node_modules/prelude-ls": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-            "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-            "dev": true,
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/escodegen/node_modules/type-check": {
-            "version": "0.3.2",
-            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-            "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-            "dev": true,
-            "dependencies": {
-                "prelude-ls": "~1.1.2"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/eslint": {
-            "version": "8.14.0",
-            "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz",
-            "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==",
-            "dev": true,
-            "dependencies": {
-                "@eslint/eslintrc": "^1.2.2",
-                "@humanwhocodes/config-array": "^0.9.2",
-                "ajv": "^6.10.0",
-                "chalk": "^4.0.0",
-                "cross-spawn": "^7.0.2",
-                "debug": "^4.3.2",
-                "doctrine": "^3.0.0",
-                "escape-string-regexp": "^4.0.0",
-                "eslint-scope": "^7.1.1",
-                "eslint-utils": "^3.0.0",
-                "eslint-visitor-keys": "^3.3.0",
-                "espree": "^9.3.1",
-                "esquery": "^1.4.0",
-                "esutils": "^2.0.2",
-                "fast-deep-equal": "^3.1.3",
-                "file-entry-cache": "^6.0.1",
-                "functional-red-black-tree": "^1.0.1",
-                "glob-parent": "^6.0.1",
-                "globals": "^13.6.0",
-                "ignore": "^5.2.0",
-                "import-fresh": "^3.0.0",
-                "imurmurhash": "^0.1.4",
-                "is-glob": "^4.0.0",
-                "js-yaml": "^4.1.0",
-                "json-stable-stringify-without-jsonify": "^1.0.1",
-                "levn": "^0.4.1",
-                "lodash.merge": "^4.6.2",
-                "minimatch": "^3.0.4",
-                "natural-compare": "^1.4.0",
-                "optionator": "^0.9.1",
-                "regexpp": "^3.2.0",
-                "strip-ansi": "^6.0.1",
-                "strip-json-comments": "^3.1.0",
-                "text-table": "^0.2.0",
-                "v8-compile-cache": "^2.0.3"
-            },
-            "bin": {
-                "eslint": "bin/eslint.js"
-            },
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            },
-            "funding": {
-                "url": "https://opencollective.com/eslint"
-            }
-        },
-        "node_modules/eslint-plugin-vue": {
-            "version": "8.7.1",
-            "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-            "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
-            "dev": true,
-            "dependencies": {
-                "eslint-utils": "^3.0.0",
-                "natural-compare": "^1.4.0",
-                "nth-check": "^2.0.1",
-                "postcss-selector-parser": "^6.0.9",
-                "semver": "^7.3.5",
-                "vue-eslint-parser": "^8.0.1"
-            },
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            },
-            "peerDependencies": {
-                "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
-            }
-        },
-        "node_modules/eslint-plugin-vue/node_modules/semver": {
-            "version": "7.3.7",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-            "dev": true,
-            "dependencies": {
-                "lru-cache": "^6.0.0"
-            },
-            "bin": {
-                "semver": "bin/semver.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/eslint-scope": {
-            "version": "5.1.1",
-            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-            "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-            "dev": true,
-            "dependencies": {
-                "esrecurse": "^4.3.0",
-                "estraverse": "^4.1.1"
-            },
-            "engines": {
-                "node": ">=8.0.0"
-            }
-        },
-        "node_modules/eslint-utils": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
-            "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
-            "dev": true,
-            "dependencies": {
-                "eslint-visitor-keys": "^2.0.0"
-            },
-            "engines": {
-                "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/mysticatea"
-            },
-            "peerDependencies": {
-                "eslint": ">=5"
-            }
-        },
-        "node_modules/eslint-visitor-keys": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-            "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/eslint/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/eslint/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/eslint/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/eslint/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/eslint/node_modules/escape-string-regexp": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-            "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/eslint/node_modules/eslint-scope": {
-            "version": "7.1.1",
-            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-            "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
-            "dev": true,
-            "dependencies": {
-                "esrecurse": "^4.3.0",
-                "estraverse": "^5.2.0"
-            },
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            }
-        },
-        "node_modules/eslint/node_modules/eslint-visitor-keys": {
-            "version": "3.3.0",
-            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-            "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
-            "dev": true,
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            }
-        },
-        "node_modules/eslint/node_modules/estraverse": {
-            "version": "5.3.0",
-            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-            "dev": true,
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/eslint/node_modules/globals": {
-            "version": "13.15.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
-            "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
-            "dev": true,
-            "dependencies": {
-                "type-fest": "^0.20.2"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/eslint/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/eslint/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/eslint/node_modules/type-fest": {
-            "version": "0.20.2",
-            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/esm": {
-            "version": "3.2.25",
-            "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
-            "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/espree": {
-            "version": "9.3.2",
-            "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
-            "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
-            "dev": true,
-            "dependencies": {
-                "acorn": "^8.7.1",
-                "acorn-jsx": "^5.3.2",
-                "eslint-visitor-keys": "^3.3.0"
-            },
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            }
-        },
-        "node_modules/espree/node_modules/eslint-visitor-keys": {
-            "version": "3.3.0",
-            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-            "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
-            "dev": true,
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            }
-        },
-        "node_modules/esprima": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-            "dev": true,
-            "bin": {
-                "esparse": "bin/esparse.js",
-                "esvalidate": "bin/esvalidate.js"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/esquery": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-            "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
-            "dev": true,
-            "dependencies": {
-                "estraverse": "^5.1.0"
-            },
-            "engines": {
-                "node": ">=0.10"
-            }
-        },
-        "node_modules/esquery/node_modules/estraverse": {
-            "version": "5.3.0",
-            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-            "dev": true,
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/esrecurse": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-            "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-            "dev": true,
-            "dependencies": {
-                "estraverse": "^5.2.0"
-            },
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/esrecurse/node_modules/estraverse": {
-            "version": "5.3.0",
-            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-            "dev": true,
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/estraverse": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-            "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-            "dev": true,
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/estree-walker": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-            "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-            "dev": true
-        },
-        "node_modules/esutils": {
-            "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/etag": {
-            "version": "1.8.1",
-            "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-            "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/events": {
-            "version": "3.3.0",
-            "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-            "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-            "engines": {
-                "node": ">=0.8.x"
-            }
-        },
-        "node_modules/execa": {
-            "version": "5.1.1",
-            "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-            "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-            "dev": true,
-            "dependencies": {
-                "cross-spawn": "^7.0.3",
-                "get-stream": "^6.0.0",
-                "human-signals": "^2.1.0",
-                "is-stream": "^2.0.0",
-                "merge-stream": "^2.0.0",
-                "npm-run-path": "^4.0.1",
-                "onetime": "^5.1.2",
-                "signal-exit": "^3.0.3",
-                "strip-final-newline": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sindresorhus/execa?sponsor=1"
-            }
-        },
-        "node_modules/execall": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz",
-            "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==",
-            "dev": true,
-            "dependencies": {
-                "clone-regexp": "^2.1.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/exit": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-            "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
-            "dev": true,
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/expand-tilde": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
-            "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==",
-            "dev": true,
-            "dependencies": {
-                "os-homedir": "^1.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/expect": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
-            "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "jest-get-type": "^27.5.1",
-                "jest-matcher-utils": "^27.5.1",
-                "jest-message-util": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/expect-puppeteer": {
-            "version": "6.1.0",
-            "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-6.1.0.tgz",
-            "integrity": "sha512-5yk64xOe+yTRLeZTg1uuGYmUw5bMsI/YX7Q9tXsovYFBq8bvagJH4XMYLQ7/nU+1dJawLH0KJehuJULD33oU+w==",
-            "dev": true
-        },
-        "node_modules/express": {
-            "version": "4.17.3",
-            "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
-            "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
-            "dependencies": {
-                "accepts": "~1.3.8",
-                "array-flatten": "1.1.1",
-                "body-parser": "1.19.2",
-                "content-disposition": "0.5.4",
-                "content-type": "~1.0.4",
-                "cookie": "0.4.2",
-                "cookie-signature": "1.0.6",
-                "debug": "2.6.9",
-                "depd": "~1.1.2",
-                "encodeurl": "~1.0.2",
-                "escape-html": "~1.0.3",
-                "etag": "~1.8.1",
-                "finalhandler": "~1.1.2",
-                "fresh": "0.5.2",
-                "merge-descriptors": "1.0.1",
-                "methods": "~1.1.2",
-                "on-finished": "~2.3.0",
-                "parseurl": "~1.3.3",
-                "path-to-regexp": "0.1.7",
-                "proxy-addr": "~2.0.7",
-                "qs": "6.9.7",
-                "range-parser": "~1.2.1",
-                "safe-buffer": "5.2.1",
-                "send": "0.17.2",
-                "serve-static": "1.14.2",
-                "setprototypeof": "1.2.0",
-                "statuses": "~1.5.0",
-                "type-is": "~1.6.18",
-                "utils-merge": "1.0.1",
-                "vary": "~1.1.2"
-            },
-            "engines": {
-                "node": ">= 0.10.0"
-            }
-        },
-        "node_modules/express-basic-auth": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz",
-            "integrity": "sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==",
-            "dependencies": {
-                "basic-auth": "^2.0.1"
-            }
-        },
-        "node_modules/express-static-gzip": {
-            "version": "2.1.7",
-            "resolved": "https://registry.npmjs.org/express-static-gzip/-/express-static-gzip-2.1.7.tgz",
-            "integrity": "sha512-QOCZUC+lhPPCjIJKpQGu1Oa61Axg9Mq09Qvit8Of7kzpMuwDeMSqjjQteQS3OVw/GkENBoSBheuQDWPlngImvw==",
-            "dependencies": {
-                "serve-static": "^1.14.1"
-            }
-        },
-        "node_modules/express/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/express/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
-        "node_modules/express/node_modules/safe-buffer": {
-            "version": "5.2.1",
-            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
-                    "url": "https://feross.org/support"
-                }
-            ]
-        },
-        "node_modules/extend": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-            "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-            "optional": true
-        },
-        "node_modules/extract-zip": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
-            "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
-            "dev": true,
-            "dependencies": {
-                "debug": "^4.1.1",
-                "get-stream": "^5.1.0",
-                "yauzl": "^2.10.0"
-            },
-            "bin": {
-                "extract-zip": "cli.js"
-            },
-            "engines": {
-                "node": ">= 10.17.0"
-            },
-            "optionalDependencies": {
-                "@types/yauzl": "^2.9.1"
-            }
-        },
-        "node_modules/extract-zip/node_modules/get-stream": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-            "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-            "dev": true,
-            "dependencies": {
-                "pump": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/extsprintf": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-            "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
-            "engines": [
-                "node >=0.6.0"
-            ],
-            "optional": true
-        },
-        "node_modules/fast-deep-equal": {
-            "version": "3.1.3",
-            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-            "devOptional": true
-        },
-        "node_modules/fast-glob": {
-            "version": "3.2.11",
-            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
-            "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
-            "dev": true,
-            "dependencies": {
-                "@nodelib/fs.stat": "^2.0.2",
-                "@nodelib/fs.walk": "^1.2.3",
-                "glob-parent": "^5.1.2",
-                "merge2": "^1.3.0",
-                "micromatch": "^4.0.4"
-            },
-            "engines": {
-                "node": ">=8.6.0"
-            }
-        },
-        "node_modules/fast-glob/node_modules/glob-parent": {
-            "version": "5.1.2",
-            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-            "dev": true,
-            "dependencies": {
-                "is-glob": "^4.0.1"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/fast-json-stable-stringify": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-            "devOptional": true
-        },
-        "node_modules/fast-levenshtein": {
-            "version": "2.0.6",
-            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-            "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
-            "dev": true
-        },
-        "node_modules/fastest-levenshtein": {
-            "version": "1.0.12",
-            "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
-            "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
-            "dev": true
-        },
-        "node_modules/fastfall": {
-            "version": "1.5.1",
-            "resolved": "https://registry.npmjs.org/fastfall/-/fastfall-1.5.1.tgz",
-            "integrity": "sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==",
-            "dev": true,
-            "dependencies": {
-                "reusify": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/fastparallel": {
-            "version": "2.4.1",
-            "resolved": "https://registry.npmjs.org/fastparallel/-/fastparallel-2.4.1.tgz",
-            "integrity": "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==",
-            "dev": true,
-            "dependencies": {
-                "reusify": "^1.0.4",
-                "xtend": "^4.0.2"
-            }
-        },
-        "node_modules/fastq": {
-            "version": "1.13.0",
-            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-            "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
-            "dev": true,
-            "dependencies": {
-                "reusify": "^1.0.4"
-            }
-        },
-        "node_modules/fastseries": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/fastseries/-/fastseries-2.0.0.tgz",
-            "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==",
-            "dev": true
-        },
-        "node_modules/favico.js": {
-            "version": "0.3.10",
-            "resolved": "https://registry.npmjs.org/favico.js/-/favico.js-0.3.10.tgz",
-            "integrity": "sha512-S5KvqAOczRjlyjQPPZPSlUEybBkfBgKosY/pzTIxkvKgigB+DkITvIEI70dxQarbv4PZ+UD77QzquCAcU/6LHQ==",
-            "dev": true
-        },
-        "node_modules/fb-watchman": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
-            "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
-            "dev": true,
-            "dependencies": {
-                "bser": "2.1.1"
-            }
-        },
-        "node_modules/fd-slicer": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-            "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
-            "dev": true,
-            "dependencies": {
-                "pend": "~1.2.0"
-            }
-        },
-        "node_modules/file-entry-cache": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-            "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
-            "dev": true,
-            "dependencies": {
-                "flat-cache": "^3.0.4"
-            },
-            "engines": {
-                "node": "^10.12.0 || >=12.0.0"
-            }
-        },
-        "node_modules/fill-range": {
-            "version": "7.0.1",
-            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-            "dev": true,
-            "dependencies": {
-                "to-regex-range": "^5.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/finalhandler": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
-            "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
-            "dependencies": {
-                "debug": "2.6.9",
-                "encodeurl": "~1.0.2",
-                "escape-html": "~1.0.3",
-                "on-finished": "~2.3.0",
-                "parseurl": "~1.3.3",
-                "statuses": "~1.5.0",
-                "unpipe": "~1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/finalhandler/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/finalhandler/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
-        "node_modules/find-file-up": {
-            "version": "0.1.3",
-            "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz",
-            "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==",
-            "dev": true,
-            "dependencies": {
-                "fs-exists-sync": "^0.1.0",
-                "resolve-dir": "^0.1.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/find-pkg": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz",
-            "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==",
-            "dev": true,
-            "dependencies": {
-                "find-file-up": "^0.1.2"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/find-process": {
-            "version": "1.4.7",
-            "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz",
-            "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.0.0",
-                "commander": "^5.1.0",
-                "debug": "^4.1.1"
-            },
-            "bin": {
-                "find-process": "bin/find-process.js"
-            }
-        },
-        "node_modules/find-process/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/find-process/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/find-process/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/find-process/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/find-process/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/find-process/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/find-up": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-            "dev": true,
-            "dependencies": {
-                "locate-path": "^5.0.0",
-                "path-exists": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/flat-cache": {
-            "version": "3.0.4",
-            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-            "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-            "dev": true,
-            "dependencies": {
-                "flatted": "^3.1.0",
-                "rimraf": "^3.0.2"
-            },
-            "engines": {
-                "node": "^10.12.0 || >=12.0.0"
-            }
-        },
-        "node_modules/flatted": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz",
-            "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
-            "dev": true
-        },
-        "node_modules/follow-redirects": {
-            "version": "1.15.1",
-            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
-            "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
-            "funding": [
-                {
-                    "type": "individual",
-                    "url": "https://github.com/sponsors/RubenVerborgh"
-                }
-            ],
-            "engines": {
-                "node": ">=4.0"
-            },
-            "peerDependenciesMeta": {
-                "debug": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/for-in": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-            "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/for-own": {
-            "version": "0.1.5",
-            "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
-            "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==",
-            "dev": true,
-            "dependencies": {
-                "for-in": "^1.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/forever-agent": {
-            "version": "0.6.1",
-            "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-            "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
-            "optional": true,
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/form-data": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-            "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-            "dependencies": {
-                "asynckit": "^0.4.0",
-                "combined-stream": "^1.0.8",
-                "mime-types": "^2.1.12"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/forwarded": {
-            "version": "0.2.0",
-            "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
-            "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/fresh": {
-            "version": "0.5.2",
-            "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-            "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/from2": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
-            "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
-            "dev": true,
-            "dependencies": {
-                "inherits": "^2.0.1",
-                "readable-stream": "^2.0.0"
-            }
-        },
-        "node_modules/from2/node_modules/readable-stream": {
-            "version": "2.3.7",
-            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-            "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-            "dev": true,
-            "dependencies": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.3",
-                "isarray": "~1.0.0",
-                "process-nextick-args": "~2.0.0",
-                "safe-buffer": "~5.1.1",
-                "string_decoder": "~1.1.1",
-                "util-deprecate": "~1.0.1"
-            }
-        },
-        "node_modules/from2/node_modules/string_decoder": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-            "dev": true,
-            "dependencies": {
-                "safe-buffer": "~5.1.0"
-            }
-        },
-        "node_modules/fs-constants": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
-            "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
-            "dev": true
-        },
-        "node_modules/fs-exists-sync": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
-            "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/fs-extra": {
-            "version": "10.1.0",
-            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
-            "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
-            "dev": true,
-            "dependencies": {
-                "graceful-fs": "^4.2.0",
-                "jsonfile": "^6.0.1",
-                "universalify": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/fs-extra/node_modules/universalify": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-            "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-            "dev": true,
-            "engines": {
-                "node": ">= 10.0.0"
-            }
-        },
-        "node_modules/fs-minipass": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-            "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-            "dependencies": {
-                "minipass": "^3.0.0"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/fs.realpath": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-            "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
-        },
-        "node_modules/fsevents": {
-            "version": "2.3.2",
-            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-            "dev": true,
-            "hasInstallScript": true,
-            "optional": true,
-            "os": [
-                "darwin"
-            ],
-            "engines": {
-                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-            }
-        },
-        "node_modules/function-bind": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-        },
-        "node_modules/function.prototype.name": {
-            "version": "1.1.5",
-            "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
-            "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "define-properties": "^1.1.3",
-                "es-abstract": "^1.19.0",
-                "functions-have-names": "^1.2.2"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/functional-red-black-tree": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-            "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
-            "dev": true
-        },
-        "node_modules/functions-have-names": {
-            "version": "1.2.3",
-            "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
-            "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/gauge": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
-            "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
-            "dependencies": {
-                "aproba": "^1.0.3 || ^2.0.0",
-                "color-support": "^1.1.2",
-                "console-control-strings": "^1.0.0",
-                "has-unicode": "^2.0.1",
-                "object-assign": "^4.1.1",
-                "signal-exit": "^3.0.0",
-                "string-width": "^4.2.3",
-                "strip-ansi": "^6.0.1",
-                "wide-align": "^1.1.2"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/gensync": {
-            "version": "1.0.0-beta.2",
-            "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-            "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-            "dev": true,
-            "engines": {
-                "node": ">=6.9.0"
-            }
-        },
-        "node_modules/get-caller-file": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-            "dev": true,
-            "engines": {
-                "node": "6.* || 8.* || >= 10.*"
-            }
-        },
-        "node_modules/get-intrinsic": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
-            "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
-            "dependencies": {
-                "function-bind": "^1.1.1",
-                "has": "^1.0.3",
-                "has-symbols": "^1.0.3"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/get-package-type": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
-            "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=8.0.0"
-            }
-        },
-        "node_modules/get-stdin": {
-            "version": "8.0.0",
-            "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
-            "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/get-stream": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-            "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/get-symbol-description": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
-            "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "get-intrinsic": "^1.1.1"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/getopts": {
-            "version": "2.2.5",
-            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
-            "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="
-        },
-        "node_modules/getpass": {
-            "version": "0.1.7",
-            "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-            "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
-            "optional": true,
-            "dependencies": {
-                "assert-plus": "^1.0.0"
-            }
-        },
-        "node_modules/glob": {
-            "version": "7.2.3",
-            "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-            "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
-            "dependencies": {
-                "fs.realpath": "^1.0.0",
-                "inflight": "^1.0.4",
-                "inherits": "2",
-                "minimatch": "^3.1.1",
-                "once": "^1.3.0",
-                "path-is-absolute": "^1.0.0"
-            },
-            "engines": {
-                "node": "*"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/glob-parent": {
-            "version": "6.0.2",
-            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-            "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-            "dev": true,
-            "dependencies": {
-                "is-glob": "^4.0.3"
-            },
-            "engines": {
-                "node": ">=10.13.0"
-            }
-        },
-        "node_modules/global-modules": {
-            "version": "0.2.3",
-            "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
-            "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==",
-            "dev": true,
-            "dependencies": {
-                "global-prefix": "^0.1.4",
-                "is-windows": "^0.2.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/global-prefix": {
-            "version": "0.1.5",
-            "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
-            "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==",
-            "dev": true,
-            "dependencies": {
-                "homedir-polyfill": "^1.0.0",
-                "ini": "^1.3.4",
-                "is-windows": "^0.2.0",
-                "which": "^1.2.12"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/global-prefix/node_modules/which": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-            "dev": true,
-            "dependencies": {
-                "isexe": "^2.0.0"
-            },
-            "bin": {
-                "which": "bin/which"
-            }
-        },
-        "node_modules/globals": {
-            "version": "11.12.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-            "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-            "dev": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/globalthis": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
-            "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
-            "dependencies": {
-                "define-properties": "^1.1.3"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/globby": {
-            "version": "11.1.0",
-            "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
-            "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
-            "dev": true,
-            "dependencies": {
-                "array-union": "^2.1.0",
-                "dir-glob": "^3.0.1",
-                "fast-glob": "^3.2.9",
-                "ignore": "^5.2.0",
-                "merge2": "^1.4.1",
-                "slash": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/globjoin": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
-            "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
-            "dev": true
-        },
-        "node_modules/graceful-fs": {
-            "version": "4.2.10",
-            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-            "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
-            "devOptional": true
-        },
-        "node_modules/har-schema": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-            "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
-            "optional": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/har-validator": {
-            "version": "5.1.5",
-            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
-            "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
-            "deprecated": "this library is no longer supported",
-            "optional": true,
-            "dependencies": {
-                "ajv": "^6.12.3",
-                "har-schema": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/hard-rejection": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
-            "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/has": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-            "dependencies": {
-                "function-bind": "^1.1.1"
-            },
-            "engines": {
-                "node": ">= 0.4.0"
-            }
-        },
-        "node_modules/has-bigints": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
-            "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/has-cors": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
-            "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA=="
-        },
-        "node_modules/has-flag": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-            "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-            "dev": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/has-property-descriptors": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
-            "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
-            "dependencies": {
-                "get-intrinsic": "^1.1.1"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/has-symbols": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-            "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/has-tostringtag": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
-            "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
-            "dependencies": {
-                "has-symbols": "^1.0.2"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/has-unicode": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-            "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
-        },
-        "node_modules/help-me": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz",
-            "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==",
-            "dependencies": {
-                "glob": "^7.1.6",
-                "readable-stream": "^3.6.0"
-            }
-        },
-        "node_modules/hoek": {
-            "version": "6.1.3",
-            "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz",
-            "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==",
-            "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues."
-        },
-        "node_modules/homedir-polyfill": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
-            "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
-            "dev": true,
-            "dependencies": {
-                "parse-passwd": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/hosted-git-info": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
-            "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
-            "dev": true,
-            "dependencies": {
-                "lru-cache": "^6.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/html-encoding-sniffer": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
-            "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
-            "dev": true,
-            "dependencies": {
-                "whatwg-encoding": "^1.0.5"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/html-escaper": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
-            "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
-            "dev": true
-        },
-        "node_modules/html-tags": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz",
-            "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/htmlparser2": {
-            "version": "8.0.1",
-            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
-            "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
-            "funding": [
-                "https://github.com/fb55/htmlparser2?sponsor=1",
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/fb55"
-                }
-            ],
-            "dependencies": {
-                "domelementtype": "^2.3.0",
-                "domhandler": "^5.0.2",
-                "domutils": "^3.0.1",
-                "entities": "^4.3.0"
-            }
-        },
-        "node_modules/http-errors": {
-            "version": "1.8.1",
-            "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
-            "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
-            "dependencies": {
-                "depd": "~1.1.2",
-                "inherits": "2.0.4",
-                "setprototypeof": "1.2.0",
-                "statuses": ">= 1.5.0 < 2",
-                "toidentifier": "1.0.1"
-            },
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/http-graceful-shutdown": {
-            "version": "3.1.7",
-            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.7.tgz",
-            "integrity": "sha512-00tmCsvemcZLfhii3sB7sfoUjvTzhg/WdOzVI7WEt2Vai9h1ybzSoEhJeQIck8gCz8pt/4YMXWPjGZxe+KukTA==",
-            "dependencies": {
-                "debug": "^4.3.4"
-            },
-            "engines": {
-                "node": ">=4.0.0"
-            }
-        },
-        "node_modules/http-proxy-agent": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
-            "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
-            "dependencies": {
-                "@tootallnate/once": "2",
-                "agent-base": "6",
-                "debug": "4"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/http-signature": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-            "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
-            "optional": true,
-            "dependencies": {
-                "assert-plus": "^1.0.0",
-                "jsprim": "^1.2.2",
-                "sshpk": "^1.7.0"
-            },
-            "engines": {
-                "node": ">=0.8",
-                "npm": ">=1.3.7"
-            }
-        },
-        "node_modules/https-proxy-agent": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
-            "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
-            "dependencies": {
-                "agent-base": "6",
-                "debug": "4"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/human-interval": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/human-interval/-/human-interval-2.0.1.tgz",
-            "integrity": "sha512-r4Aotzf+OtKIGQCB3odUowy4GfUDTy3aTWTfLd7ZF2gBCy3XW3v/dJLRefZnOFFnjqs5B1TypvS8WarpBkYUNQ==",
-            "dependencies": {
-                "numbered": "^1.1.0"
-            }
-        },
-        "node_modules/human-signals": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-            "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
-            "dev": true,
-            "engines": {
-                "node": ">=10.17.0"
-            }
-        },
-        "node_modules/hyperid": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.0.1.tgz",
-            "integrity": "sha512-I+tl7TS5nsoVhkxqX1rS3Qmqlq44eoPUcgPthW8v3IW8CvWL7lwtd6HQbkDUMrBKJTG0vgEaRsjT35imW/D+9Q==",
-            "dev": true,
-            "dependencies": {
-                "uuid": "^8.3.2",
-                "uuid-parse": "^1.1.0"
-            }
-        },
-        "node_modules/iconv-lite": {
-            "version": "0.6.3",
-            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-            "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-            "dependencies": {
-                "safer-buffer": ">= 2.1.2 < 3.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/ieee754": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-            "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
-                    "url": "https://feross.org/support"
-                }
-            ]
-        },
-        "node_modules/ignore": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-            "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
-            "dev": true,
-            "engines": {
-                "node": ">= 4"
-            }
-        },
-        "node_modules/import-fresh": {
-            "version": "3.3.0",
-            "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-            "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-            "dev": true,
-            "dependencies": {
-                "parent-module": "^1.0.0",
-                "resolve-from": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=6"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/import-lazy": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
-            "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/import-local": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
-            "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
-            "dev": true,
-            "dependencies": {
-                "pkg-dir": "^4.2.0",
-                "resolve-cwd": "^3.0.0"
-            },
-            "bin": {
-                "import-local-fixture": "fixtures/cli.js"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/imurmurhash": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-            "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.8.19"
-            }
-        },
-        "node_modules/indent-string": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-            "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/inflight": {
-            "version": "1.0.6",
-            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-            "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-            "dependencies": {
-                "once": "^1.3.0",
-                "wrappy": "1"
-            }
-        },
-        "node_modules/inherits": {
-            "version": "2.0.4",
-            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-        },
-        "node_modules/ini": {
-            "version": "1.3.8",
-            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
-            "dev": true
-        },
-        "node_modules/internal-slot": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-            "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
-            "dependencies": {
-                "get-intrinsic": "^1.1.0",
-                "has": "^1.0.3",
-                "side-channel": "^1.0.4"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            }
-        },
-        "node_modules/interpret": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
-            "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
-            "engines": {
-                "node": ">= 0.10"
-            }
-        },
-        "node_modules/ip": {
-            "version": "1.1.8",
-            "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
-            "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
-        },
-        "node_modules/ipaddr.js": {
-            "version": "1.9.1",
-            "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-            "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
-            "engines": {
-                "node": ">= 0.10"
-            }
-        },
-        "node_modules/is-arrayish": {
-            "version": "0.2.1",
-            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-            "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-            "dev": true
-        },
-        "node_modules/is-bigint": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
-            "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-            "dependencies": {
-                "has-bigints": "^1.0.1"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-binary-path": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-            "dev": true,
-            "dependencies": {
-                "binary-extensions": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/is-boolean-object": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
-            "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "has-tostringtag": "^1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-buffer": {
-            "version": "1.1.6",
-            "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-            "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-            "dev": true
-        },
-        "node_modules/is-callable": {
-            "version": "1.2.4",
-            "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
-            "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-core-module": {
-            "version": "2.9.0",
-            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
-            "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
-            "dependencies": {
-                "has": "^1.0.3"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-date-object": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
-            "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-            "dependencies": {
-                "has-tostringtag": "^1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-docker": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
-            "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
-            "bin": {
-                "is-docker": "cli.js"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/is-extendable": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-            "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-extglob": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-fullwidth-code-point": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/is-generator-fn": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
-            "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/is-glob": {
-            "version": "4.0.3",
-            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-            "dev": true,
-            "dependencies": {
-                "is-extglob": "^2.1.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-invalid-path": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz",
-            "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==",
-            "dependencies": {
-                "is-glob": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-invalid-path/node_modules/is-extglob": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-            "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-invalid-path/node_modules/is-glob": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-            "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==",
-            "dependencies": {
-                "is-extglob": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-negative-zero": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
-            "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-number": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.12.0"
-            }
-        },
-        "node_modules/is-number-object": {
-            "version": "1.0.7",
-            "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
-            "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
-            "dependencies": {
-                "has-tostringtag": "^1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-plain-obj": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-            "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-plain-object": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
-            "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-potential-custom-element-name": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
-            "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
-            "dev": true
-        },
-        "node_modules/is-regex": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
-            "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "has-tostringtag": "^1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-regexp": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
-            "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/is-shared-array-buffer": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
-            "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
-            "dependencies": {
-                "call-bind": "^1.0.2"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-stream": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-            "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/is-string": {
-            "version": "1.0.7",
-            "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
-            "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-            "dependencies": {
-                "has-tostringtag": "^1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-string-and-not-blank": {
-            "version": "0.0.2",
-            "resolved": "https://registry.npmjs.org/is-string-and-not-blank/-/is-string-and-not-blank-0.0.2.tgz",
-            "integrity": "sha512-FyPGAbNVyZpTeDCTXnzuwbu9/WpNXbCfbHXLpCRpN4GANhS00eEIP5Ef+k5HYSNIzIhdN9zRDoBj6unscECvtQ==",
-            "dependencies": {
-                "is-string-blank": "^1.0.1"
-            },
-            "engines": {
-                "node": ">=6.4.0"
-            }
-        },
-        "node_modules/is-string-blank": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz",
-            "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw=="
-        },
-        "node_modules/is-symbol": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
-            "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-            "dependencies": {
-                "has-symbols": "^1.0.2"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-typedarray": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-            "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
-            "devOptional": true
-        },
-        "node_modules/is-valid-path": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz",
-            "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==",
-            "dependencies": {
-                "is-invalid-path": "^0.1.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-weakref": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
-            "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
-            "dependencies": {
-                "call-bind": "^1.0.2"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/is-windows": {
-            "version": "0.2.0",
-            "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
-            "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-wsl": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-            "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
-            "dependencies": {
-                "is-docker": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/isarray": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-            "devOptional": true
-        },
-        "node_modules/isemail": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz",
-            "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
-            "dependencies": {
-                "punycode": "2.x.x"
-            },
-            "engines": {
-                "node": ">=4.0.0"
-            }
-        },
-        "node_modules/isexe": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-            "devOptional": true
-        },
-        "node_modules/isobject": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-            "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/isstream": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-            "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
-            "optional": true
-        },
-        "node_modules/istanbul-lib-coverage": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
-            "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/istanbul-lib-instrument": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz",
-            "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==",
-            "dev": true,
-            "dependencies": {
-                "@babel/core": "^7.12.3",
-                "@babel/parser": "^7.14.7",
-                "@istanbuljs/schema": "^0.1.2",
-                "istanbul-lib-coverage": "^3.2.0",
-                "semver": "^6.3.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/istanbul-lib-report": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-            "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
-            "dev": true,
-            "dependencies": {
-                "istanbul-lib-coverage": "^3.0.0",
-                "make-dir": "^3.0.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/istanbul-lib-report/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/istanbul-lib-report/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/istanbul-lib-source-maps": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
-            "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
-            "dev": true,
-            "dependencies": {
-                "debug": "^4.1.1",
-                "istanbul-lib-coverage": "^3.0.0",
-                "source-map": "^0.6.1"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/istanbul-reports": {
-            "version": "3.1.4",
-            "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz",
-            "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==",
-            "dev": true,
-            "dependencies": {
-                "html-escaper": "^2.0.0",
-                "istanbul-lib-report": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest": {
-            "version": "27.2.5",
-            "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.5.tgz",
-            "integrity": "sha512-vDMzXcpQN4Ycaqu+vO7LX8pZwNNoKMhc+gSp6q1D8S6ftRk8gNW8cni3YFxknP95jxzQo23Lul0BI2FrWgnwYQ==",
-            "dev": true,
-            "dependencies": {
-                "@jest/core": "^27.2.5",
-                "import-local": "^3.0.2",
-                "jest-cli": "^27.2.5"
-            },
-            "bin": {
-                "jest": "bin/jest.js"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            },
-            "peerDependencies": {
-                "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-            },
-            "peerDependenciesMeta": {
-                "node-notifier": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/jest-changed-files": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
-            "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "execa": "^5.0.0",
-                "throat": "^6.0.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-circus": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
-            "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
-            "dev": true,
-            "dependencies": {
-                "@jest/environment": "^27.5.1",
-                "@jest/test-result": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "chalk": "^4.0.0",
-                "co": "^4.6.0",
-                "dedent": "^0.7.0",
-                "expect": "^27.5.1",
-                "is-generator-fn": "^2.0.0",
-                "jest-each": "^27.5.1",
-                "jest-matcher-utils": "^27.5.1",
-                "jest-message-util": "^27.5.1",
-                "jest-runtime": "^27.5.1",
-                "jest-snapshot": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "pretty-format": "^27.5.1",
-                "slash": "^3.0.0",
-                "stack-utils": "^2.0.3",
-                "throat": "^6.0.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-circus/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-circus/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-circus/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-circus/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-circus/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-circus/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-cli": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
-            "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
-            "dev": true,
-            "dependencies": {
-                "@jest/core": "^27.5.1",
-                "@jest/test-result": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "chalk": "^4.0.0",
-                "exit": "^0.1.2",
-                "graceful-fs": "^4.2.9",
-                "import-local": "^3.0.2",
-                "jest-config": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "jest-validate": "^27.5.1",
-                "prompts": "^2.0.1",
-                "yargs": "^16.2.0"
-            },
-            "bin": {
-                "jest": "bin/jest.js"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            },
-            "peerDependencies": {
-                "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-            },
-            "peerDependenciesMeta": {
-                "node-notifier": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/jest-cli/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-cli/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-cli/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-cli/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-cli/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-cli/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-cli/node_modules/yargs": {
-            "version": "16.2.0",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-            "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
-            "dev": true,
-            "dependencies": {
-                "cliui": "^7.0.2",
-                "escalade": "^3.1.1",
-                "get-caller-file": "^2.0.5",
-                "require-directory": "^2.1.1",
-                "string-width": "^4.2.0",
-                "y18n": "^5.0.5",
-                "yargs-parser": "^20.2.2"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/jest-config": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
-            "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/core": "^7.8.0",
-                "@jest/test-sequencer": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "babel-jest": "^27.5.1",
-                "chalk": "^4.0.0",
-                "ci-info": "^3.2.0",
-                "deepmerge": "^4.2.2",
-                "glob": "^7.1.1",
-                "graceful-fs": "^4.2.9",
-                "jest-circus": "^27.5.1",
-                "jest-environment-jsdom": "^27.5.1",
-                "jest-environment-node": "^27.5.1",
-                "jest-get-type": "^27.5.1",
-                "jest-jasmine2": "^27.5.1",
-                "jest-regex-util": "^27.5.1",
-                "jest-resolve": "^27.5.1",
-                "jest-runner": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "jest-validate": "^27.5.1",
-                "micromatch": "^4.0.4",
-                "parse-json": "^5.2.0",
-                "pretty-format": "^27.5.1",
-                "slash": "^3.0.0",
-                "strip-json-comments": "^3.1.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            },
-            "peerDependencies": {
-                "ts-node": ">=9.0.0"
-            },
-            "peerDependenciesMeta": {
-                "ts-node": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/jest-config/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-config/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-config/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-config/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-config/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-config/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-dev-server": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.0.3.tgz",
-            "integrity": "sha512-joKPQQWSaBMsNNdCWvwCQvhD6ox4IH+5H5pecbRRSxiRi2BfVCGGOWQ4/MGwV1NJ9z9XEq1qy5JLYTJlv9RVzA==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.1.2",
-                "cwd": "^0.10.0",
-                "find-process": "^1.4.7",
-                "prompts": "^2.4.2",
-                "spawnd": "^6.0.2",
-                "tree-kill": "^1.2.2",
-                "wait-on": "^6.0.0"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-dev-server/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-diff": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
-            "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.0.0",
-                "diff-sequences": "^27.5.1",
-                "jest-get-type": "^27.5.1",
-                "pretty-format": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-diff/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-diff/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-diff/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-diff/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-diff/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-diff/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-docblock": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
-            "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
-            "dev": true,
-            "dependencies": {
-                "detect-newline": "^3.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-each": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
-            "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "chalk": "^4.0.0",
-                "jest-get-type": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "pretty-format": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-each/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-each/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-each/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-each/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-each/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-each/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-environment-jsdom": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
-            "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
-            "dev": true,
-            "dependencies": {
-                "@jest/environment": "^27.5.1",
-                "@jest/fake-timers": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "jest-mock": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "jsdom": "^16.6.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-environment-node": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
-            "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
-            "dev": true,
-            "dependencies": {
-                "@jest/environment": "^27.5.1",
-                "@jest/fake-timers": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "jest-mock": "^27.5.1",
-                "jest-util": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-environment-puppeteer": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-6.0.3.tgz",
-            "integrity": "sha512-oZE/W8swhDSZpZ+Vm1C2JyoKECsvqcFOlaf3/+G0AtizZfGNkRILdi1U7k9MHLOqGEB5sfFWXG0vpJ8bTNP1dQ==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.1.2",
-                "cwd": "^0.10.0",
-                "jest-dev-server": "^6.0.3",
-                "jest-environment-node": "^27.4.4",
-                "merge-deep": "^3.0.3"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-get-type": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
-            "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
-            "dev": true,
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-haste-map": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
-            "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "@types/graceful-fs": "^4.1.2",
-                "@types/node": "*",
-                "anymatch": "^3.0.3",
-                "fb-watchman": "^2.0.0",
-                "graceful-fs": "^4.2.9",
-                "jest-regex-util": "^27.5.1",
-                "jest-serializer": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "jest-worker": "^27.5.1",
-                "micromatch": "^4.0.4",
-                "walker": "^1.0.7"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            },
-            "optionalDependencies": {
-                "fsevents": "^2.3.2"
-            }
-        },
-        "node_modules/jest-jasmine2": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
-            "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
-            "dev": true,
-            "dependencies": {
-                "@jest/environment": "^27.5.1",
-                "@jest/source-map": "^27.5.1",
-                "@jest/test-result": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "chalk": "^4.0.0",
-                "co": "^4.6.0",
-                "expect": "^27.5.1",
-                "is-generator-fn": "^2.0.0",
-                "jest-each": "^27.5.1",
-                "jest-matcher-utils": "^27.5.1",
-                "jest-message-util": "^27.5.1",
-                "jest-runtime": "^27.5.1",
-                "jest-snapshot": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "pretty-format": "^27.5.1",
-                "throat": "^6.0.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-jasmine2/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-jasmine2/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-jasmine2/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-jasmine2/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-jasmine2/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-jasmine2/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-leak-detector": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
-            "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
-            "dev": true,
-            "dependencies": {
-                "jest-get-type": "^27.5.1",
-                "pretty-format": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-matcher-utils": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
-            "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.0.0",
-                "jest-diff": "^27.5.1",
-                "jest-get-type": "^27.5.1",
-                "pretty-format": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-matcher-utils/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-matcher-utils/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-matcher-utils/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-matcher-utils/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-matcher-utils/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-message-util": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
-            "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
-            "dev": true,
-            "dependencies": {
-                "@babel/code-frame": "^7.12.13",
-                "@jest/types": "^27.5.1",
-                "@types/stack-utils": "^2.0.0",
-                "chalk": "^4.0.0",
-                "graceful-fs": "^4.2.9",
-                "micromatch": "^4.0.4",
-                "pretty-format": "^27.5.1",
-                "slash": "^3.0.0",
-                "stack-utils": "^2.0.3"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-message-util/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-message-util/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-message-util/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-message-util/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-message-util/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-message-util/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-mock": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
-            "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "@types/node": "*"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-pnp-resolver": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-            "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            },
-            "peerDependencies": {
-                "jest-resolve": "*"
-            },
-            "peerDependenciesMeta": {
-                "jest-resolve": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/jest-puppeteer": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-6.0.3.tgz",
-            "integrity": "sha512-6GRdbkWwNu8dfzo4icpwc50+K5ECYpWyD9sxpRa03PA8Hi3byl0dcAx+NjCivSezWjAl2Iwwhujqb+bczei0Bg==",
-            "dev": true,
-            "dependencies": {
-                "expect-puppeteer": "^6.0.2",
-                "jest-environment-puppeteer": "^6.0.3"
-            },
-            "peerDependencies": {
-                "puppeteer": ">= 1.5.0"
-            }
-        },
-        "node_modules/jest-regex-util": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
-            "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
-            "dev": true,
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-resolve": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
-            "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "chalk": "^4.0.0",
-                "graceful-fs": "^4.2.9",
-                "jest-haste-map": "^27.5.1",
-                "jest-pnp-resolver": "^1.2.2",
-                "jest-util": "^27.5.1",
-                "jest-validate": "^27.5.1",
-                "resolve": "^1.20.0",
-                "resolve.exports": "^1.1.0",
-                "slash": "^3.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-resolve-dependencies": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
-            "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "jest-regex-util": "^27.5.1",
-                "jest-snapshot": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-resolve/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-resolve/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-resolve/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-resolve/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-resolve/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-resolve/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-runner": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
-            "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
-            "dev": true,
-            "dependencies": {
-                "@jest/console": "^27.5.1",
-                "@jest/environment": "^27.5.1",
-                "@jest/test-result": "^27.5.1",
-                "@jest/transform": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "chalk": "^4.0.0",
-                "emittery": "^0.8.1",
-                "graceful-fs": "^4.2.9",
-                "jest-docblock": "^27.5.1",
-                "jest-environment-jsdom": "^27.5.1",
-                "jest-environment-node": "^27.5.1",
-                "jest-haste-map": "^27.5.1",
-                "jest-leak-detector": "^27.5.1",
-                "jest-message-util": "^27.5.1",
-                "jest-resolve": "^27.5.1",
-                "jest-runtime": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "jest-worker": "^27.5.1",
-                "source-map-support": "^0.5.6",
-                "throat": "^6.0.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-runner/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-runner/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-runner/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-runner/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-runner/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-runner/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-runtime": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
-            "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
-            "dev": true,
-            "dependencies": {
-                "@jest/environment": "^27.5.1",
-                "@jest/fake-timers": "^27.5.1",
-                "@jest/globals": "^27.5.1",
-                "@jest/source-map": "^27.5.1",
-                "@jest/test-result": "^27.5.1",
-                "@jest/transform": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "chalk": "^4.0.0",
-                "cjs-module-lexer": "^1.0.0",
-                "collect-v8-coverage": "^1.0.0",
-                "execa": "^5.0.0",
-                "glob": "^7.1.3",
-                "graceful-fs": "^4.2.9",
-                "jest-haste-map": "^27.5.1",
-                "jest-message-util": "^27.5.1",
-                "jest-mock": "^27.5.1",
-                "jest-regex-util": "^27.5.1",
-                "jest-resolve": "^27.5.1",
-                "jest-snapshot": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "slash": "^3.0.0",
-                "strip-bom": "^4.0.0"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-runtime/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-runtime/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-runtime/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-runtime/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-runtime/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-runtime/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-serializer": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
-            "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
-            "dev": true,
-            "dependencies": {
-                "@types/node": "*",
-                "graceful-fs": "^4.2.9"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-snapshot": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
-            "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/core": "^7.7.2",
-                "@babel/generator": "^7.7.2",
-                "@babel/plugin-syntax-typescript": "^7.7.2",
-                "@babel/traverse": "^7.7.2",
-                "@babel/types": "^7.0.0",
-                "@jest/transform": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/babel__traverse": "^7.0.4",
-                "@types/prettier": "^2.1.5",
-                "babel-preset-current-node-syntax": "^1.0.0",
-                "chalk": "^4.0.0",
-                "expect": "^27.5.1",
-                "graceful-fs": "^4.2.9",
-                "jest-diff": "^27.5.1",
-                "jest-get-type": "^27.5.1",
-                "jest-haste-map": "^27.5.1",
-                "jest-matcher-utils": "^27.5.1",
-                "jest-message-util": "^27.5.1",
-                "jest-util": "^27.5.1",
-                "natural-compare": "^1.4.0",
-                "pretty-format": "^27.5.1",
-                "semver": "^7.3.2"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-snapshot/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-snapshot/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-snapshot/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-snapshot/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-snapshot/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-snapshot/node_modules/semver": {
-            "version": "7.3.7",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-            "dev": true,
-            "dependencies": {
-                "lru-cache": "^6.0.0"
-            },
-            "bin": {
-                "semver": "bin/semver.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/jest-snapshot/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-util": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
-            "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "chalk": "^4.0.0",
-                "ci-info": "^3.2.0",
-                "graceful-fs": "^4.2.9",
-                "picomatch": "^2.2.3"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-util/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-util/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-util/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-util/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-util/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-util/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-validate": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
-            "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
-            "dev": true,
-            "dependencies": {
-                "@jest/types": "^27.5.1",
-                "camelcase": "^6.2.0",
-                "chalk": "^4.0.0",
-                "jest-get-type": "^27.5.1",
-                "leven": "^3.1.0",
-                "pretty-format": "^27.5.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-validate/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-validate/node_modules/camelcase": {
-            "version": "6.3.0",
-            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-            "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/jest-validate/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-validate/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-validate/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-validate/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-validate/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-watcher": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
-            "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
-            "dev": true,
-            "dependencies": {
-                "@jest/test-result": "^27.5.1",
-                "@jest/types": "^27.5.1",
-                "@types/node": "*",
-                "ansi-escapes": "^4.2.1",
-                "chalk": "^4.0.0",
-                "jest-util": "^27.5.1",
-                "string-length": "^4.0.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/jest-watcher/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-watcher/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-watcher/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-watcher/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-watcher/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-watcher/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-worker": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
-            "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
-            "dev": true,
-            "dependencies": {
-                "@types/node": "*",
-                "merge-stream": "^2.0.0",
-                "supports-color": "^8.0.0"
-            },
-            "engines": {
-                "node": ">= 10.13.0"
-            }
-        },
-        "node_modules/jest-worker/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-worker/node_modules/supports-color": {
-            "version": "8.1.1",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-            "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/supports-color?sponsor=1"
-            }
-        },
-        "node_modules/joi": {
-            "version": "17.6.0",
-            "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz",
-            "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==",
-            "dev": true,
-            "dependencies": {
-                "@hapi/hoek": "^9.0.0",
-                "@hapi/topo": "^5.0.0",
-                "@sideway/address": "^4.1.3",
-                "@sideway/formula": "^3.0.0",
-                "@sideway/pinpoint": "^2.0.0"
-            }
-        },
-        "node_modules/js-sdsl": {
-            "version": "2.1.4",
-            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-2.1.4.tgz",
-            "integrity": "sha512-/Ew+CJWHNddr7sjwgxaVeIORIH4AMVC9dy0hPf540ZGMVgS9d3ajwuVdyhDt6/QUvT8ATjR3yuYBKsS79F+H4A=="
-        },
-        "node_modules/js-tokens": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-            "dev": true
-        },
-        "node_modules/js-yaml": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-            "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-            "dev": true,
-            "dependencies": {
-                "argparse": "^2.0.1"
-            },
-            "bin": {
-                "js-yaml": "bin/js-yaml.js"
-            }
-        },
-        "node_modules/jsbi": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz",
-            "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g=="
-        },
-        "node_modules/jsbn": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-            "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
-            "optional": true
-        },
-        "node_modules/jsdom": {
-            "version": "16.7.0",
-            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
-            "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
-            "dev": true,
-            "dependencies": {
-                "abab": "^2.0.5",
-                "acorn": "^8.2.4",
-                "acorn-globals": "^6.0.0",
-                "cssom": "^0.4.4",
-                "cssstyle": "^2.3.0",
-                "data-urls": "^2.0.0",
-                "decimal.js": "^10.2.1",
-                "domexception": "^2.0.1",
-                "escodegen": "^2.0.0",
-                "form-data": "^3.0.0",
-                "html-encoding-sniffer": "^2.0.1",
-                "http-proxy-agent": "^4.0.1",
-                "https-proxy-agent": "^5.0.0",
-                "is-potential-custom-element-name": "^1.0.1",
-                "nwsapi": "^2.2.0",
-                "parse5": "6.0.1",
-                "saxes": "^5.0.1",
-                "symbol-tree": "^3.2.4",
-                "tough-cookie": "^4.0.0",
-                "w3c-hr-time": "^1.0.2",
-                "w3c-xmlserializer": "^2.0.0",
-                "webidl-conversions": "^6.1.0",
-                "whatwg-encoding": "^1.0.5",
-                "whatwg-mimetype": "^2.3.0",
-                "whatwg-url": "^8.5.0",
-                "ws": "^7.4.6",
-                "xml-name-validator": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "peerDependencies": {
-                "canvas": "^2.5.0"
-            },
-            "peerDependenciesMeta": {
-                "canvas": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/jsdom/node_modules/@tootallnate/once": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-            "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
-            "dev": true,
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/jsdom/node_modules/form-data": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-            "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-            "dev": true,
-            "dependencies": {
-                "asynckit": "^0.4.0",
-                "combined-stream": "^1.0.8",
-                "mime-types": "^2.1.12"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/jsdom/node_modules/http-proxy-agent": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-            "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-            "dev": true,
-            "dependencies": {
-                "@tootallnate/once": "1",
-                "agent-base": "6",
-                "debug": "4"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/jsdom/node_modules/parse5": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
-            "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
-            "dev": true
-        },
-        "node_modules/jsesc": {
-            "version": "2.5.2",
-            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-            "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-            "dev": true,
-            "bin": {
-                "jsesc": "bin/jsesc"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/json-parse-even-better-errors": {
-            "version": "2.3.1",
-            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-            "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-            "dev": true
-        },
-        "node_modules/json-schema": {
-            "version": "0.4.0",
-            "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
-            "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
-            "optional": true
-        },
-        "node_modules/json-schema-traverse": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-            "devOptional": true
-        },
-        "node_modules/json-stable-stringify-without-jsonify": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-            "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
-            "dev": true
-        },
-        "node_modules/json-stringify-safe": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-            "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
-            "optional": true
-        },
-        "node_modules/json5": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-            "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
-            "dev": true,
-            "bin": {
-                "json5": "lib/cli.js"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/jsonfile": {
-            "version": "6.1.0",
-            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-            "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-            "dev": true,
-            "dependencies": {
-                "universalify": "^2.0.0"
-            },
-            "optionalDependencies": {
-                "graceful-fs": "^4.1.6"
-            }
-        },
-        "node_modules/jsonfile/node_modules/universalify": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-            "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-            "dev": true,
-            "engines": {
-                "node": ">= 10.0.0"
-            }
-        },
-        "node_modules/jsonwebtoken": {
-            "version": "8.5.1",
-            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
-            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
-            "dependencies": {
-                "jws": "^3.2.2",
-                "lodash.includes": "^4.3.0",
-                "lodash.isboolean": "^3.0.3",
-                "lodash.isinteger": "^4.0.4",
-                "lodash.isnumber": "^3.0.3",
-                "lodash.isplainobject": "^4.0.6",
-                "lodash.isstring": "^4.0.1",
-                "lodash.once": "^4.0.0",
-                "ms": "^2.1.1",
-                "semver": "^5.6.0"
-            },
-            "engines": {
-                "node": ">=4",
-                "npm": ">=1.4.28"
-            }
-        },
-        "node_modules/jsonwebtoken/node_modules/semver": {
-            "version": "5.7.1",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-            "bin": {
-                "semver": "bin/semver"
-            }
-        },
-        "node_modules/jsprim": {
-            "version": "1.4.2",
-            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
-            "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
-            "optional": true,
-            "dependencies": {
-                "assert-plus": "1.0.0",
-                "extsprintf": "1.3.0",
-                "json-schema": "0.4.0",
-                "verror": "1.10.0"
-            },
-            "engines": {
-                "node": ">=0.6.0"
-            }
-        },
-        "node_modules/just-performance": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/just-performance/-/just-performance-4.3.0.tgz",
-            "integrity": "sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q=="
-        },
-        "node_modules/jwa": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
-            "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
-            "dependencies": {
-                "buffer-equal-constant-time": "1.0.1",
-                "ecdsa-sig-formatter": "1.0.11",
-                "safe-buffer": "^5.0.1"
-            }
-        },
-        "node_modules/jws": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
-            "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
-            "dependencies": {
-                "jwa": "^1.4.1",
-                "safe-buffer": "^5.0.1"
-            }
-        },
-        "node_modules/jwt-decode": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
-            "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
-        },
-        "node_modules/kind-of": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-            "dev": true,
-            "dependencies": {
-                "is-buffer": "^1.1.5"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/kleur": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
-            "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/knex": {
-            "version": "0.95.15",
-            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.15.tgz",
-            "integrity": "sha512-Loq6WgHaWlmL2bfZGWPsy4l8xw4pOE+tmLGkPG0auBppxpI0UcK+GYCycJcqz9W54f2LiGewkCVLBm3Wq4ur/w==",
-            "dependencies": {
-                "colorette": "2.0.16",
-                "commander": "^7.1.0",
-                "debug": "4.3.2",
-                "escalade": "^3.1.1",
-                "esm": "^3.2.25",
-                "getopts": "2.2.5",
-                "interpret": "^2.2.0",
-                "lodash": "^4.17.21",
-                "pg-connection-string": "2.5.0",
-                "rechoir": "0.7.0",
-                "resolve-from": "^5.0.0",
-                "tarn": "^3.0.1",
-                "tildify": "2.0.0"
-            },
-            "bin": {
-                "knex": "bin/cli.js"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "peerDependenciesMeta": {
-                "mysql": {
-                    "optional": true
-                },
-                "mysql2": {
-                    "optional": true
-                },
-                "pg": {
-                    "optional": true
-                },
-                "pg-native": {
-                    "optional": true
-                },
-                "sqlite3": {
-                    "optional": true
-                },
-                "tedious": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/knex/node_modules/commander": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-            "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/knex/node_modules/debug": {
-            "version": "4.3.2",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-            "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-            "dependencies": {
-                "ms": "2.1.2"
-            },
-            "engines": {
-                "node": ">=6.0"
-            },
-            "peerDependenciesMeta": {
-                "supports-color": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/knex/node_modules/ms": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        },
-        "node_modules/knex/node_modules/resolve-from": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/known-css-properties": {
-            "version": "0.24.0",
-            "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.24.0.tgz",
-            "integrity": "sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==",
-            "dev": true
-        },
-        "node_modules/lazy-cache": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
-            "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/leven": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-            "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/levn": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-            "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-            "dev": true,
-            "dependencies": {
-                "prelude-ls": "^1.2.1",
-                "type-check": "~0.4.0"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/limiter": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/limiter/-/limiter-2.1.0.tgz",
-            "integrity": "sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw==",
-            "dependencies": {
-                "just-performance": "4.3.0"
-            }
-        },
-        "node_modules/lines-and-columns": {
-            "version": "1.2.4",
-            "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
-            "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-            "dev": true
-        },
-        "node_modules/locate-path": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-            "dev": true,
-            "dependencies": {
-                "p-locate": "^4.1.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/lodash": {
-            "version": "4.17.21",
-            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-        },
-        "node_modules/lodash-es": {
-            "version": "4.17.21",
-            "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
-            "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
-        },
-        "node_modules/lodash._baseiteratee": {
-            "version": "4.7.0",
-            "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz",
-            "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==",
-            "dependencies": {
-                "lodash._stringtopath": "~4.8.0"
-            }
-        },
-        "node_modules/lodash._basetostring": {
-            "version": "4.12.0",
-            "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz",
-            "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw=="
-        },
-        "node_modules/lodash._baseuniq": {
-            "version": "4.6.0",
-            "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz",
-            "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==",
-            "dependencies": {
-                "lodash._createset": "~4.0.0",
-                "lodash._root": "~3.0.0"
-            }
-        },
-        "node_modules/lodash._createset": {
-            "version": "4.0.3",
-            "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz",
-            "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA=="
-        },
-        "node_modules/lodash._root": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
-            "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ=="
-        },
-        "node_modules/lodash._stringtopath": {
-            "version": "4.8.0",
-            "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz",
-            "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==",
-            "dependencies": {
-                "lodash._basetostring": "~4.12.0"
-            }
-        },
-        "node_modules/lodash.debounce": {
-            "version": "4.0.8",
-            "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-            "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-            "dev": true
-        },
-        "node_modules/lodash.get": {
-            "version": "4.4.2",
-            "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
-            "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
-        },
-        "node_modules/lodash.includes": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
-            "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
-        },
-        "node_modules/lodash.isboolean": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
-            "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
-        },
-        "node_modules/lodash.isinteger": {
-            "version": "4.0.4",
-            "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
-            "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
-        },
-        "node_modules/lodash.isnumber": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
-            "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
-        },
-        "node_modules/lodash.isplainobject": {
-            "version": "4.0.6",
-            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-            "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
-        },
-        "node_modules/lodash.isstring": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
-            "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
-        },
-        "node_modules/lodash.merge": {
-            "version": "4.6.2",
-            "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
-            "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-            "dev": true
-        },
-        "node_modules/lodash.once": {
-            "version": "4.1.1",
-            "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
-        },
-        "node_modules/lodash.truncate": {
-            "version": "4.4.2",
-            "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
-            "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
-            "dev": true
-        },
-        "node_modules/lodash.uniqby": {
-            "version": "4.5.0",
-            "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz",
-            "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==",
-            "dependencies": {
-                "lodash._baseiteratee": "~4.7.0",
-                "lodash._baseuniq": "~4.6.0"
-            }
-        },
-        "node_modules/lru-cache": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/magic-string": {
-            "version": "0.26.2",
-            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz",
-            "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==",
-            "dev": true,
-            "dependencies": {
-                "sourcemap-codec": "^1.4.8"
-            },
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/make-dir": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-            "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-            "dependencies": {
-                "semver": "^6.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/makeerror": {
-            "version": "1.0.12",
-            "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
-            "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
-            "dev": true,
-            "dependencies": {
-                "tmpl": "1.0.5"
-            }
-        },
-        "node_modules/map-obj": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
-            "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/mathml-tag-names": {
-            "version": "2.1.3",
-            "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
-            "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
-            "dev": true,
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/wooorm"
-            }
-        },
-        "node_modules/media-typer": {
-            "version": "0.3.0",
-            "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-            "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/meow": {
-            "version": "9.0.0",
-            "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
-            "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
-            "dev": true,
-            "dependencies": {
-                "@types/minimist": "^1.2.0",
-                "camelcase-keys": "^6.2.2",
-                "decamelize": "^1.2.0",
-                "decamelize-keys": "^1.1.0",
-                "hard-rejection": "^2.1.0",
-                "minimist-options": "4.1.0",
-                "normalize-package-data": "^3.0.0",
-                "read-pkg-up": "^7.0.1",
-                "redent": "^3.0.0",
-                "trim-newlines": "^3.0.0",
-                "type-fest": "^0.18.0",
-                "yargs-parser": "^20.2.3"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/meow/node_modules/type-fest": {
-            "version": "0.18.1",
-            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
-            "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/merge": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz",
-            "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
-            "dev": true
-        },
-        "node_modules/merge-deep": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
-            "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
-            "dev": true,
-            "dependencies": {
-                "arr-union": "^3.1.0",
-                "clone-deep": "^0.2.4",
-                "kind-of": "^3.0.2"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/merge-descriptors": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-            "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
-        },
-        "node_modules/merge-stream": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-            "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-            "dev": true
-        },
-        "node_modules/merge2": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-            "dev": true,
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/methods": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-            "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/micromatch": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-            "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
-            "dev": true,
-            "dependencies": {
-                "braces": "^3.0.2",
-                "picomatch": "^2.3.1"
-            },
-            "engines": {
-                "node": ">=8.6"
-            }
-        },
-        "node_modules/mime": {
-            "version": "1.6.0",
-            "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-            "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-            "bin": {
-                "mime": "cli.js"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/mime-db": {
-            "version": "1.52.0",
-            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-            "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/mime-types": {
-            "version": "2.1.35",
-            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-            "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-            "dependencies": {
-                "mime-db": "1.52.0"
-            },
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/mimic-fn": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-            "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/min-indent": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
-            "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
-            "dev": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/minimatch": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-            "dependencies": {
-                "brace-expansion": "^1.1.7"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/minimist": {
-            "version": "1.2.6",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
-            "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
-        },
-        "node_modules/minimist-options": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
-            "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
-            "dev": true,
-            "dependencies": {
-                "arrify": "^1.0.1",
-                "is-plain-obj": "^1.1.0",
-                "kind-of": "^6.0.3"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/minimist-options/node_modules/kind-of": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-            "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/minipass": {
-            "version": "3.3.4",
-            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
-            "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/minizlib": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-            "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-            "dependencies": {
-                "minipass": "^3.0.0",
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/mixin-object": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
-            "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==",
-            "dev": true,
-            "dependencies": {
-                "for-in": "^0.1.3",
-                "is-extendable": "^0.1.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/mixin-object/node_modules/for-in": {
-            "version": "0.1.8",
-            "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
-            "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/mkdirp": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-            "bin": {
-                "mkdirp": "bin/cmd.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/mkdirp-classic": {
-            "version": "0.5.3",
-            "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
-            "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
-            "dev": true
-        },
-        "node_modules/mqemitter": {
-            "version": "4.5.0",
-            "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
-            "integrity": "sha512-Mp/zytFeIv6piJQkEKnncHcP4R/ErJc5C7dfonkhkNUT2LA/nTayrfNxbipp3M5iCJUTQSUtzfQAQA3XVcKz6w==",
-            "dev": true,
-            "dependencies": {
-                "fastparallel": "^2.3.0",
-                "qlobber": "^5.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/mqtt": {
-            "version": "4.3.7",
-            "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz",
-            "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==",
-            "dependencies": {
-                "commist": "^1.0.0",
-                "concat-stream": "^2.0.0",
-                "debug": "^4.1.1",
-                "duplexify": "^4.1.1",
-                "help-me": "^3.0.0",
-                "inherits": "^2.0.3",
-                "lru-cache": "^6.0.0",
-                "minimist": "^1.2.5",
-                "mqtt-packet": "^6.8.0",
-                "number-allocator": "^1.0.9",
-                "pump": "^3.0.0",
-                "readable-stream": "^3.6.0",
-                "reinterval": "^1.1.0",
-                "rfdc": "^1.3.0",
-                "split2": "^3.1.0",
-                "ws": "^7.5.5",
-                "xtend": "^4.0.2"
-            },
-            "bin": {
-                "mqtt": "bin/mqtt.js",
-                "mqtt_pub": "bin/pub.js",
-                "mqtt_sub": "bin/sub.js"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/mqtt-packet": {
-            "version": "7.1.2",
-            "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-7.1.2.tgz",
-            "integrity": "sha512-FFZbcZ2omsf4c5TxEQfcX9hI+JzDpDKPT46OmeIBpVA7+t32ey25UNqlqNXTmeZOr5BLsSIERpQQLsFWJS94SQ==",
-            "dev": true,
-            "dependencies": {
-                "bl": "^4.0.2",
-                "debug": "^4.1.1",
-                "process-nextick-args": "^2.0.1"
-            }
-        },
-        "node_modules/mqtt/node_modules/mqtt-packet": {
-            "version": "6.10.0",
-            "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz",
-            "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==",
-            "dependencies": {
-                "bl": "^4.0.2",
-                "debug": "^4.1.1",
-                "process-nextick-args": "^2.0.1"
-            }
-        },
-        "node_modules/ms": {
-            "version": "2.1.3",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-            "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
-        },
-        "node_modules/mssql": {
-            "version": "8.1.2",
-            "resolved": "https://registry.npmjs.org/mssql/-/mssql-8.1.2.tgz",
-            "integrity": "sha512-xkTw3Sp1Jpq2f7CG3rFQn6YK4XZbnL8HfZhaB/KRC/hjDZlJB3pSWYN2Cp/WwxIeA1iUJkdFa6GTfdMY8+DAjg==",
-            "dependencies": {
-                "@tediousjs/connection-string": "^0.3.0",
-                "commander": "^9.1.0",
-                "debug": "^4.3.3",
-                "rfdc": "^1.3.0",
-                "tarn": "^3.0.2",
-                "tedious": "^14.0.0"
-            },
-            "bin": {
-                "mssql": "bin/mssql"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/mssql/node_modules/commander": {
-            "version": "9.3.0",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz",
-            "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==",
-            "engines": {
-                "node": "^12.20.0 || >=14"
-            }
-        },
-        "node_modules/nanoclone": {
-            "version": "0.2.1",
-            "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
-            "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA=="
-        },
-        "node_modules/nanoid": {
-            "version": "3.3.4",
-            "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
-            "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
-            "dev": true,
-            "bin": {
-                "nanoid": "bin/nanoid.cjs"
-            },
-            "engines": {
-                "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-            }
-        },
-        "node_modules/native-duplexpair": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz",
-            "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA=="
-        },
-        "node_modules/natural-compare": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-            "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
-            "dev": true
-        },
-        "node_modules/negotiator": {
-            "version": "0.6.3",
-            "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
-            "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/node-abort-controller": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz",
-            "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw=="
-        },
-        "node_modules/node-addon-api": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
-            "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="
-        },
-        "node_modules/node-cloudflared-tunnel": {
-            "version": "1.0.9",
-            "resolved": "https://registry.npmjs.org/node-cloudflared-tunnel/-/node-cloudflared-tunnel-1.0.9.tgz",
-            "integrity": "sha512-d0mhIM5P2ldE2yHChehC6EvnpFCkifWRzWrW81gVWdcCWqNcyISXuDdOYzRW5mwmjWuT6WNtLJoGQ84uqS4EmA==",
-            "dependencies": {
-                "command-exists": "^1.2.9"
-            }
-        },
-        "node_modules/node-fetch": {
-            "version": "2.6.7",
-            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-            "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-            "dependencies": {
-                "whatwg-url": "^5.0.0"
-            },
-            "engines": {
-                "node": "4.x || >=6.0.0"
-            },
-            "peerDependencies": {
-                "encoding": "^0.1.0"
-            },
-            "peerDependenciesMeta": {
-                "encoding": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/node-fetch/node_modules/tr46": {
-            "version": "0.0.3",
-            "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-            "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-        },
-        "node_modules/node-fetch/node_modules/webidl-conversions": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-            "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-        },
-        "node_modules/node-fetch/node_modules/whatwg-url": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-            "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-            "dependencies": {
-                "tr46": "~0.0.3",
-                "webidl-conversions": "^3.0.0"
-            }
-        },
-        "node_modules/node-gyp": {
-            "version": "7.1.2",
-            "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz",
-            "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==",
-            "optional": true,
-            "dependencies": {
-                "env-paths": "^2.2.0",
-                "glob": "^7.1.4",
-                "graceful-fs": "^4.2.3",
-                "nopt": "^5.0.0",
-                "npmlog": "^4.1.2",
-                "request": "^2.88.2",
-                "rimraf": "^3.0.2",
-                "semver": "^7.3.2",
-                "tar": "^6.0.2",
-                "which": "^2.0.2"
-            },
-            "bin": {
-                "node-gyp": "bin/node-gyp.js"
-            },
-            "engines": {
-                "node": ">= 10.12.0"
-            }
-        },
-        "node_modules/node-gyp/node_modules/ansi-regex": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-            "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
-            "optional": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/node-gyp/node_modules/aproba": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-            "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
-            "optional": true
-        },
-        "node_modules/node-gyp/node_modules/are-we-there-yet": {
-            "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==",
-            "optional": true,
-            "dependencies": {
-                "delegates": "^1.0.0",
-                "readable-stream": "^2.0.6"
-            }
-        },
-        "node_modules/node-gyp/node_modules/gauge": {
-            "version": "2.7.4",
-            "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-            "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
-            "optional": true,
-            "dependencies": {
-                "aproba": "^1.0.3",
-                "console-control-strings": "^1.0.0",
-                "has-unicode": "^2.0.0",
-                "object-assign": "^4.1.0",
-                "signal-exit": "^3.0.0",
-                "string-width": "^1.0.1",
-                "strip-ansi": "^3.0.1",
-                "wide-align": "^1.1.0"
-            }
-        },
-        "node_modules/node-gyp/node_modules/is-fullwidth-code-point": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-            "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
-            "optional": true,
-            "dependencies": {
-                "number-is-nan": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/node-gyp/node_modules/npmlog": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
-            "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
-            "optional": true,
-            "dependencies": {
-                "are-we-there-yet": "~1.1.2",
-                "console-control-strings": "~1.1.0",
-                "gauge": "~2.7.3",
-                "set-blocking": "~2.0.0"
-            }
-        },
-        "node_modules/node-gyp/node_modules/readable-stream": {
-            "version": "2.3.7",
-            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-            "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-            "optional": true,
-            "dependencies": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.3",
-                "isarray": "~1.0.0",
-                "process-nextick-args": "~2.0.0",
-                "safe-buffer": "~5.1.1",
-                "string_decoder": "~1.1.1",
-                "util-deprecate": "~1.0.1"
-            }
-        },
-        "node_modules/node-gyp/node_modules/semver": {
-            "version": "7.3.7",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-            "optional": true,
-            "dependencies": {
-                "lru-cache": "^6.0.0"
-            },
-            "bin": {
-                "semver": "bin/semver.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/node-gyp/node_modules/string_decoder": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-            "optional": true,
-            "dependencies": {
-                "safe-buffer": "~5.1.0"
-            }
-        },
-        "node_modules/node-gyp/node_modules/string-width": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-            "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
-            "optional": true,
-            "dependencies": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/node-gyp/node_modules/strip-ansi": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-            "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
-            "optional": true,
-            "dependencies": {
-                "ansi-regex": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/node-int64": {
-            "version": "0.4.0",
-            "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
-            "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
-            "dev": true
-        },
-        "node_modules/node-radius-client": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/node-radius-client/-/node-radius-client-1.0.0.tgz",
-            "integrity": "sha512-FkR9cMV5hNoX+kKDUTzuagvEixlLiaEJQ1/ywOdhahsihKrGDhVZmnCvmrCStA589MT3yuC/J2eKc6z68IGdBw==",
-            "dependencies": {
-                "joi": "^14.3.1",
-                "node-radius-utils": "^1.2.0",
-                "radius": "^1.1.4"
-            }
-        },
-        "node_modules/node-radius-client/node_modules/joi": {
-            "version": "14.3.1",
-            "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
-            "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
-            "deprecated": "This module has moved and is now available at @hapi/joi. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
-            "dependencies": {
-                "hoek": "6.x.x",
-                "isemail": "3.x.x",
-                "topo": "3.x.x"
-            }
-        },
-        "node_modules/node-radius-utils": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/node-radius-utils/-/node-radius-utils-1.2.0.tgz",
-            "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
-        },
-        "node_modules/node-releases": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
-            "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
-            "dev": true
-        },
-        "node_modules/nodemailer": {
-            "version": "6.6.5",
-            "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.5.tgz",
-            "integrity": "sha512-C/v856DBijUzHcHIgGpQoTrfsH3suKIRAGliIzCstatM2cAa+MYX3LuyCrABiO/cdJTxgBBHXxV1ztiqUwst5A==",
-            "engines": {
-                "node": ">=6.0.0"
-            }
-        },
-        "node_modules/nopt": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
-            "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
-            "dependencies": {
-                "abbrev": "1"
-            },
-            "bin": {
-                "nopt": "bin/nopt.js"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/normalize-package-data": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
-            "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
-            "dev": true,
-            "dependencies": {
-                "hosted-git-info": "^4.0.1",
-                "is-core-module": "^2.5.0",
-                "semver": "^7.3.4",
-                "validate-npm-package-license": "^3.0.1"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/normalize-package-data/node_modules/semver": {
-            "version": "7.3.7",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-            "dev": true,
-            "dependencies": {
-                "lru-cache": "^6.0.0"
-            },
-            "bin": {
-                "semver": "bin/semver.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/normalize-path": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/normalize-selector": {
-            "version": "0.2.0",
-            "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
-            "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
-            "dev": true
-        },
-        "node_modules/notp": {
-            "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz",
-            "integrity": "sha512-oBig/2uqkjQ5AkBuw4QJYwkEWa/q+zHxI5/I5z6IeP2NT0alpJFsP/trrfCC+9xOAgQSZXssNi962kp5KBmypQ==",
-            "engines": {
-                "node": "> v0.6.0"
-            }
-        },
-        "node_modules/npm-run-path": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-            "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-            "dev": true,
-            "dependencies": {
-                "path-key": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npmlog": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
-            "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
-            "dependencies": {
-                "are-we-there-yet": "^2.0.0",
-                "console-control-strings": "^1.1.0",
-                "gauge": "^3.0.0",
-                "set-blocking": "^2.0.0"
-            }
-        },
-        "node_modules/nth-check": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
-            "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
-            "dependencies": {
-                "boolbase": "^1.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/nth-check?sponsor=1"
-            }
-        },
-        "node_modules/number-allocator": {
-            "version": "1.0.10",
-            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.10.tgz",
-            "integrity": "sha512-K4AvNGKo9lP6HqsZyfSr9KDaqnwFzW203inhQEOwFrmFaYevpdX4VNwdOLk197aHujzbT//z6pCBrCOUYSM5iw==",
-            "dependencies": {
-                "debug": "^4.3.1",
-                "js-sdsl": "^2.1.2"
-            }
-        },
-        "node_modules/number-is-nan": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-            "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
-            "optional": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/numbered": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/numbered/-/numbered-1.1.0.tgz",
-            "integrity": "sha512-pv/ue2Odr7IfYOO0byC1KgBI10wo5YDauLhxY6/saNzAdAs0r1SotGCPzzCLNPL0xtrAwWRialLu23AAu9xO1g=="
-        },
-        "node_modules/nwsapi": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz",
-            "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==",
-            "dev": true
-        },
-        "node_modules/oauth-sign": {
-            "version": "0.9.0",
-            "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-            "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-            "optional": true,
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/object-assign": {
-            "version": "4.1.1",
-            "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-            "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/object-inspect": {
-            "version": "1.12.2",
-            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
-            "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/object-keys": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-            "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-            "engines": {
-                "node": ">= 0.4"
-            }
-        },
-        "node_modules/object.assign": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-            "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-            "dependencies": {
-                "call-bind": "^1.0.0",
-                "define-properties": "^1.1.3",
-                "has-symbols": "^1.0.1",
-                "object-keys": "^1.1.1"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/on-finished": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-            "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
-            "dependencies": {
-                "ee-first": "1.1.1"
-            },
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/on-headers": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
-            "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/once": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-            "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-            "dependencies": {
-                "wrappy": "1"
-            }
-        },
-        "node_modules/onetime": {
-            "version": "5.1.2",
-            "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-            "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-            "dev": true,
-            "dependencies": {
-                "mimic-fn": "^2.1.0"
-            },
-            "engines": {
-                "node": ">=6"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/open": {
-            "version": "8.4.0",
-            "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
-            "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
-            "dependencies": {
-                "define-lazy-prop": "^2.0.0",
-                "is-docker": "^2.1.1",
-                "is-wsl": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/optionator": {
-            "version": "0.9.1",
-            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-            "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
-            "dev": true,
-            "dependencies": {
-                "deep-is": "^0.1.3",
-                "fast-levenshtein": "^2.0.6",
-                "levn": "^0.4.1",
-                "prelude-ls": "^1.2.1",
-                "type-check": "^0.4.0",
-                "word-wrap": "^1.2.3"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/os-homedir": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-            "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/p-finally": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-            "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/p-limit": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-            "dev": true,
-            "dependencies": {
-                "p-try": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=6"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/p-locate": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-            "dev": true,
-            "dependencies": {
-                "p-limit": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/p-timeout": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
-            "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
-            "dependencies": {
-                "p-finally": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/p-try": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/p-wait-for": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-3.2.0.tgz",
-            "integrity": "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==",
-            "dependencies": {
-                "p-timeout": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/packet-reader": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
-            "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
-        },
-        "node_modules/parent-module": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-            "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-            "dev": true,
-            "dependencies": {
-                "callsites": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/parse-json": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-            "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/code-frame": "^7.0.0",
-                "error-ex": "^1.3.1",
-                "json-parse-even-better-errors": "^2.3.0",
-                "lines-and-columns": "^1.1.6"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/parse-passwd": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-            "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/parse5": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz",
-            "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==",
-            "dependencies": {
-                "entities": "^4.3.0"
-            },
-            "funding": {
-                "url": "https://github.com/inikulin/parse5?sponsor=1"
-            }
-        },
-        "node_modules/parse5-htmlparser2-tree-adapter": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
-            "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
-            "dependencies": {
-                "domhandler": "^5.0.2",
-                "parse5": "^7.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/inikulin/parse5?sponsor=1"
-            }
-        },
-        "node_modules/parseqs": {
-            "version": "0.0.6",
-            "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
-            "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
-        },
-        "node_modules/parseuri": {
-            "version": "0.0.6",
-            "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
-            "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
-        },
-        "node_modules/parseurl": {
-            "version": "1.3.3",
-            "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-            "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/password-hash": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/password-hash/-/password-hash-1.2.2.tgz",
-            "integrity": "sha512-Dy/5+Srojwv+1XnMrK2bn7f2jN3k2p90DfBVA0Zd6PrjWF7lXHOTWgKT4uBp1gIsqV7/llYqm+hj+gwDBF/Fmg==",
-            "bin": {
-                "nodepw": "bin/nodepw"
-            },
-            "engines": {
-                "node": ">= 0.4.0"
-            }
-        },
-        "node_modules/path-exists": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/path-is-absolute": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-            "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/path-key": {
-            "version": "3.1.1",
-            "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-            "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/path-parse": {
-            "version": "1.0.7",
-            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-        },
-        "node_modules/path-to-regexp": {
-            "version": "0.1.7",
-            "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-            "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
-        },
-        "node_modules/path-type": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-            "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/pend": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-            "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
-            "dev": true
-        },
-        "node_modules/performance-now": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-            "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
-            "optional": true
-        },
-        "node_modules/pg": {
-            "version": "8.7.3",
-            "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
-            "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
-            "dependencies": {
-                "buffer-writer": "2.0.0",
-                "packet-reader": "1.0.0",
-                "pg-connection-string": "^2.5.0",
-                "pg-pool": "^3.5.1",
-                "pg-protocol": "^1.5.0",
-                "pg-types": "^2.1.0",
-                "pgpass": "1.x"
-            },
-            "engines": {
-                "node": ">= 8.0.0"
-            },
-            "peerDependencies": {
-                "pg-native": ">=2.0.0"
-            },
-            "peerDependenciesMeta": {
-                "pg-native": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/pg-connection-string": {
-            "version": "2.5.0",
-            "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
-            "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
-        },
-        "node_modules/pg-int8": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
-            "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
-            "engines": {
-                "node": ">=4.0.0"
-            }
-        },
-        "node_modules/pg-pool": {
-            "version": "3.5.1",
-            "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
-            "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
-            "peerDependencies": {
-                "pg": ">=8.0"
-            }
-        },
-        "node_modules/pg-protocol": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
-            "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
-        },
-        "node_modules/pg-types": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
-            "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
-            "dependencies": {
-                "pg-int8": "1.0.1",
-                "postgres-array": "~2.0.0",
-                "postgres-bytea": "~1.0.0",
-                "postgres-date": "~1.0.4",
-                "postgres-interval": "^1.1.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/pgpass": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
-            "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
-            "dependencies": {
-                "split2": "^4.1.0"
-            }
-        },
-        "node_modules/pgpass/node_modules/split2": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
-            "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==",
-            "engines": {
-                "node": ">= 10.x"
-            }
-        },
-        "node_modules/picocolors": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-            "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-            "dev": true
-        },
-        "node_modules/picomatch": {
-            "version": "2.3.1",
-            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-            "dev": true,
-            "engines": {
-                "node": ">=8.6"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/jonschlinkert"
-            }
-        },
-        "node_modules/pirates": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
-            "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
-            "dev": true,
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/pkg-dir": {
-            "version": "4.2.0",
-            "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-            "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-            "dev": true,
-            "dependencies": {
-                "find-up": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/pkginfo": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
-            "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==",
-            "engines": {
-                "node": ">= 0.4.0"
-            }
-        },
-        "node_modules/pngjs": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
-            "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
-            "dev": true,
-            "engines": {
-                "node": ">=10.13.0"
-            }
-        },
-        "node_modules/postcss": {
-            "version": "8.4.14",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
-            "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
-            "dev": true,
-            "funding": [
-                {
-                    "type": "opencollective",
-                    "url": "https://opencollective.com/postcss/"
-                },
-                {
-                    "type": "tidelift",
-                    "url": "https://tidelift.com/funding/github/npm/postcss"
-                }
-            ],
-            "dependencies": {
-                "nanoid": "^3.3.4",
-                "picocolors": "^1.0.0",
-                "source-map-js": "^1.0.2"
-            },
-            "engines": {
-                "node": "^10 || ^12 || >=14"
-            }
-        },
-        "node_modules/postcss-html": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.4.1.tgz",
-            "integrity": "sha512-OKihuWxPuBQrQeLNsavP7ytJ9IYNj/ViAXB2v7Qjh56LnfESKrkahKA9si4VfPN8xtz6oqUE6KdL0bTPrHJr6g==",
-            "dev": true,
-            "dependencies": {
-                "htmlparser2": "^7.1.2",
-                "postcss": "^8.4.0",
-                "postcss-safe-parser": "^6.0.0"
-            },
-            "engines": {
-                "node": "^12 || >=14"
-            }
-        },
-        "node_modules/postcss-html/node_modules/dom-serializer": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
-            "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
-            "dev": true,
-            "dependencies": {
-                "domelementtype": "^2.0.1",
-                "domhandler": "^4.2.0",
-                "entities": "^2.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/dom-serializer/node_modules/entities": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-            "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-            "dev": true,
-            "funding": {
-                "url": "https://github.com/fb55/entities?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/domhandler": {
-            "version": "4.3.1",
-            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
-            "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
-            "dev": true,
-            "dependencies": {
-                "domelementtype": "^2.2.0"
-            },
-            "engines": {
-                "node": ">= 4"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/domhandler?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/domutils": {
-            "version": "2.8.0",
-            "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
-            "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
-            "dev": true,
-            "dependencies": {
-                "dom-serializer": "^1.0.1",
-                "domelementtype": "^2.2.0",
-                "domhandler": "^4.2.0"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/domutils?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/entities": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
-            "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.12"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/entities?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/htmlparser2": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
-            "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
-            "dev": true,
-            "funding": [
-                "https://github.com/fb55/htmlparser2?sponsor=1",
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/fb55"
-                }
-            ],
-            "dependencies": {
-                "domelementtype": "^2.0.1",
-                "domhandler": "^4.2.2",
-                "domutils": "^2.8.0",
-                "entities": "^3.0.1"
-            }
-        },
-        "node_modules/postcss-media-query-parser": {
-            "version": "0.2.3",
-            "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
-            "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
-            "dev": true
-        },
-        "node_modules/postcss-resolve-nested-selector": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
-            "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
-            "dev": true
-        },
-        "node_modules/postcss-rtlcss": {
-            "version": "3.4.1",
-            "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.4.1.tgz",
-            "integrity": "sha512-4SOkC34IJ086dYjmqGCeIOqQe4JTDk+jwETvq1M/57+bQA6CXEWAjGtqifjcSH75nd0vfW7+hve0Ec4ZYHmMtA==",
-            "dev": true,
-            "dependencies": {
-                "rtlcss": "^3.3.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            },
-            "peerDependencies": {
-                "postcss": "^8.0.0"
-            }
-        },
-        "node_modules/postcss-safe-parser": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
-            "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=12.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/postcss/"
-            },
-            "peerDependencies": {
-                "postcss": "^8.3.3"
-            }
-        },
-        "node_modules/postcss-scss": {
-            "version": "4.0.4",
-            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.4.tgz",
-            "integrity": "sha512-aBBbVyzA8b3hUL0MGrpydxxXKXFZc5Eqva0Q3V9qsBOLEMsjb6w49WfpsoWzpEgcqJGW4t7Rio8WXVU9Gd8vWg==",
-            "dev": true,
-            "engines": {
-                "node": ">=12.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/postcss/"
-            },
-            "peerDependencies": {
-                "postcss": "^8.3.3"
-            }
-        },
-        "node_modules/postcss-selector-parser": {
-            "version": "6.0.10",
-            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
-            "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
-            "dev": true,
-            "dependencies": {
-                "cssesc": "^3.0.0",
-                "util-deprecate": "^1.0.2"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/postcss-value-parser": {
-            "version": "4.2.0",
-            "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
-            "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
-            "dev": true
-        },
-        "node_modules/postgres-array": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
-            "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/postgres-bytea": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
-            "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/postgres-date": {
-            "version": "1.0.7",
-            "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
-            "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/postgres-interval": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
-            "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
-            "dependencies": {
-                "xtend": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/prelude-ls": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-            "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-            "dev": true,
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/pretty-format": {
-            "version": "27.5.1",
-            "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
-            "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
-            "dev": true,
-            "dependencies": {
-                "ansi-regex": "^5.0.1",
-                "ansi-styles": "^5.0.0",
-                "react-is": "^17.0.1"
-            },
-            "engines": {
-                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-            }
-        },
-        "node_modules/pretty-format/node_modules/ansi-styles": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-            "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/prismjs": {
-            "version": "1.28.0",
-            "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
-            "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/process": {
-            "version": "0.11.10",
-            "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-            "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
-            "engines": {
-                "node": ">= 0.6.0"
-            }
-        },
-        "node_modules/process-nextick-args": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-            "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-        },
-        "node_modules/progress": {
-            "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-            "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
-        "node_modules/prom-client": {
-            "version": "13.2.0",
-            "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-13.2.0.tgz",
-            "integrity": "sha512-wGr5mlNNdRNzEhRYXgboUU2LxHWIojxscJKmtG3R8f4/KiWqyYgXTLHs0+Ted7tG3zFT7pgHJbtomzZ1L0ARaQ==",
-            "dependencies": {
-                "tdigest": "^0.1.1"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/prometheus-api-metrics": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/prometheus-api-metrics/-/prometheus-api-metrics-3.2.2.tgz",
-            "integrity": "sha512-5hT17HAjflPkrHSYQ7lorsKygo0PhLau/FQ6SQhw0XWAm10GwKfLQmIVP6b3LJBnc4WNOf/QKHce2RfcZMLjJQ==",
-            "dependencies": {
-                "@types/express": "^4.17.13",
-                "@types/express-serve-static-core": "^4.17.28",
-                "@types/koa": "^2.13.4",
-                "debug": "^3.2.6",
-                "lodash.get": "^4.4.2",
-                "pkginfo": "^0.4.1"
-            },
-            "peerDependencies": {
-                "prom-client": ">=12 <15"
-            }
-        },
-        "node_modules/prometheus-api-metrics/node_modules/debug": {
-            "version": "3.2.7",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-            "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-            "dependencies": {
-                "ms": "^2.1.1"
-            }
-        },
-        "node_modules/prompts": {
-            "version": "2.4.2",
-            "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
-            "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
-            "dev": true,
-            "dependencies": {
-                "kleur": "^3.0.3",
-                "sisteransi": "^1.0.5"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/property-expr": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
-            "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
-        },
-        "node_modules/proxy-addr": {
-            "version": "2.0.7",
-            "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
-            "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
-            "dependencies": {
-                "forwarded": "0.2.0",
-                "ipaddr.js": "1.9.1"
-            },
-            "engines": {
-                "node": ">= 0.10"
-            }
-        },
-        "node_modules/proxy-from-env": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
-            "dev": true
-        },
-        "node_modules/psl": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
-        },
-        "node_modules/pump": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-            "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-            "dependencies": {
-                "end-of-stream": "^1.1.0",
-                "once": "^1.3.1"
-            }
-        },
-        "node_modules/punycode": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/puppeteer": {
-            "version": "13.1.3",
-            "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.1.3.tgz",
-            "integrity": "sha512-nqcJNThLUG0Dgo++2mMtGR2FCyg7olJJhj/rm0A65muyN3nrH6lGvnNRzEaNmSnHWvjaDIG9ox5kxQB+nXTg5A==",
-            "dev": true,
-            "hasInstallScript": true,
-            "dependencies": {
-                "debug": "4.3.2",
-                "devtools-protocol": "0.0.948846",
-                "extract-zip": "2.0.1",
-                "https-proxy-agent": "5.0.0",
-                "node-fetch": "2.6.7",
-                "pkg-dir": "4.2.0",
-                "progress": "2.0.3",
-                "proxy-from-env": "1.1.0",
-                "rimraf": "3.0.2",
-                "tar-fs": "2.1.1",
-                "unbzip2-stream": "1.4.3",
-                "ws": "8.2.3"
-            },
-            "engines": {
-                "node": ">=10.18.1"
-            }
-        },
-        "node_modules/puppeteer/node_modules/debug": {
-            "version": "4.3.2",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-            "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-            "dev": true,
-            "dependencies": {
-                "ms": "2.1.2"
-            },
-            "engines": {
-                "node": ">=6.0"
-            },
-            "peerDependenciesMeta": {
-                "supports-color": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/puppeteer/node_modules/https-proxy-agent": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
-            "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
-            "dev": true,
-            "dependencies": {
-                "agent-base": "6",
-                "debug": "4"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/puppeteer/node_modules/ms": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-            "dev": true
-        },
-        "node_modules/puppeteer/node_modules/ws": {
-            "version": "8.2.3",
-            "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
-            "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
-            "dev": true,
-            "engines": {
-                "node": ">=10.0.0"
-            },
-            "peerDependencies": {
-                "bufferutil": "^4.0.1",
-                "utf-8-validate": "^5.0.2"
-            },
-            "peerDependenciesMeta": {
-                "bufferutil": {
-                    "optional": true
-                },
-                "utf-8-validate": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/qlobber": {
-            "version": "5.0.3",
-            "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
-            "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==",
-            "dev": true,
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/qrcode": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.0.tgz",
-            "integrity": "sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==",
-            "dev": true,
-            "dependencies": {
-                "dijkstrajs": "^1.0.1",
-                "encode-utf8": "^1.0.3",
-                "pngjs": "^5.0.0",
-                "yargs": "^15.3.1"
-            },
-            "bin": {
-                "qrcode": "bin/qrcode"
-            },
-            "engines": {
-                "node": ">=10.13.0"
-            }
-        },
-        "node_modules/qrcode/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/qrcode/node_modules/cliui": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-            "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
-            "dev": true,
-            "dependencies": {
-                "string-width": "^4.2.0",
-                "strip-ansi": "^6.0.0",
-                "wrap-ansi": "^6.2.0"
-            }
-        },
-        "node_modules/qrcode/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/qrcode/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/qrcode/node_modules/wrap-ansi": {
-            "version": "6.2.0",
-            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-            "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.0.0",
-                "string-width": "^4.1.0",
-                "strip-ansi": "^6.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/qrcode/node_modules/y18n": {
-            "version": "4.0.3",
-            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
-            "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
-            "dev": true
-        },
-        "node_modules/qrcode/node_modules/yargs": {
-            "version": "15.4.1",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
-            "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
-            "dev": true,
-            "dependencies": {
-                "cliui": "^6.0.0",
-                "decamelize": "^1.2.0",
-                "find-up": "^4.1.0",
-                "get-caller-file": "^2.0.1",
-                "require-directory": "^2.1.1",
-                "require-main-filename": "^2.0.0",
-                "set-blocking": "^2.0.0",
-                "string-width": "^4.2.0",
-                "which-module": "^2.0.0",
-                "y18n": "^4.0.0",
-                "yargs-parser": "^18.1.2"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/qrcode/node_modules/yargs-parser": {
-            "version": "18.1.3",
-            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-            "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-            "dev": true,
-            "dependencies": {
-                "camelcase": "^5.0.0",
-                "decamelize": "^1.2.0"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/qs": {
-            "version": "6.9.7",
-            "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
-            "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
-            "engines": {
-                "node": ">=0.6"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/queue-microtask": {
-            "version": "1.2.3",
-            "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-            "dev": true,
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
-                    "url": "https://feross.org/support"
-                }
-            ]
-        },
-        "node_modules/quick-lru": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
-            "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/radius": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/radius/-/radius-1.1.4.tgz",
-            "integrity": "sha512-UWuzdF6xf3NpsXFZZmUEkxtEalDXj8hdmMXgbGzn7vOk6zXNsiIY2I6SJ1euHt7PTQuMoz2qDEJB+AfJDJgQYw==",
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
-        "node_modules/range-parser": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-            "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/raw-body": {
-            "version": "2.4.3",
-            "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
-            "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
-            "dependencies": {
-                "bytes": "3.1.2",
-                "http-errors": "1.8.1",
-                "iconv-lite": "0.4.24",
-                "unpipe": "1.0.0"
-            },
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/raw-body/node_modules/bytes": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
-            "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/raw-body/node_modules/iconv-lite": {
-            "version": "0.4.24",
-            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-            "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-            "dependencies": {
-                "safer-buffer": ">= 2.1.2 < 3"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/react-is": {
-            "version": "17.0.2",
-            "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-            "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-            "dev": true
-        },
-        "node_modules/read-pkg": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-            "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
-            "dev": true,
-            "dependencies": {
-                "@types/normalize-package-data": "^2.4.0",
-                "normalize-package-data": "^2.5.0",
-                "parse-json": "^5.0.0",
-                "type-fest": "^0.6.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/read-pkg-up": {
-            "version": "7.0.1",
-            "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
-            "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
-            "dev": true,
-            "dependencies": {
-                "find-up": "^4.1.0",
-                "read-pkg": "^5.2.0",
-                "type-fest": "^0.8.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/read-pkg-up/node_modules/type-fest": {
-            "version": "0.8.1",
-            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-            "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/read-pkg/node_modules/hosted-git-info": {
-            "version": "2.8.9",
-            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
-            "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-            "dev": true
-        },
-        "node_modules/read-pkg/node_modules/normalize-package-data": {
-            "version": "2.5.0",
-            "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-            "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-            "dev": true,
-            "dependencies": {
-                "hosted-git-info": "^2.1.4",
-                "resolve": "^1.10.0",
-                "semver": "2 || 3 || 4 || 5",
-                "validate-npm-package-license": "^3.0.1"
-            }
-        },
-        "node_modules/read-pkg/node_modules/semver": {
-            "version": "5.7.1",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-            "dev": true,
-            "bin": {
-                "semver": "bin/semver"
-            }
-        },
-        "node_modules/read-pkg/node_modules/type-fest": {
-            "version": "0.6.0",
-            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-            "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/readable-stream": {
-            "version": "3.6.0",
-            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-            "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-            "dependencies": {
-                "inherits": "^2.0.3",
-                "string_decoder": "^1.1.1",
-                "util-deprecate": "^1.0.1"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/readdirp": {
-            "version": "3.6.0",
-            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-            "dev": true,
-            "dependencies": {
-                "picomatch": "^2.2.1"
-            },
-            "engines": {
-                "node": ">=8.10.0"
-            }
-        },
-        "node_modules/rechoir": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
-            "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
-            "dependencies": {
-                "resolve": "^1.9.0"
-            },
-            "engines": {
-                "node": ">= 0.10"
-            }
-        },
-        "node_modules/redbean-node": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.1.4.tgz",
-            "integrity": "sha512-c1U6wnTeWS0c44tn9hkJWzjGgckLNJ8sN1E2bxnnnQsULOfvEVFLf8dLMjqhyyMrZ1L1mp8UvV4OfhRtH/ZrgQ==",
-            "dependencies": {
-                "@types/node": "^14.18.12",
-                "await-lock": "^2.1.0",
-                "dayjs": "^1.11.0",
-                "glob": "^7.2.0",
-                "knex": "^0.95.15",
-                "lodash": "^4.17.21"
-            }
-        },
-        "node_modules/redbean-node/node_modules/@types/node": {
-            "version": "14.18.21",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz",
-            "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q=="
-        },
-        "node_modules/redent": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
-            "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
-            "dev": true,
-            "dependencies": {
-                "indent-string": "^4.0.0",
-                "strip-indent": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/regenerate": {
-            "version": "1.4.2",
-            "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
-            "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
-            "dev": true
-        },
-        "node_modules/regenerate-unicode-properties": {
-            "version": "10.0.1",
-            "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz",
-            "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==",
-            "dev": true,
-            "dependencies": {
-                "regenerate": "^1.4.2"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/regenerator-runtime": {
-            "version": "0.13.9",
-            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
-            "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
-        },
-        "node_modules/regenerator-transform": {
-            "version": "0.15.0",
-            "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
-            "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
-            "dev": true,
-            "dependencies": {
-                "@babel/runtime": "^7.8.4"
-            }
-        },
-        "node_modules/regexp.prototype.flags": {
-            "version": "1.4.3",
-            "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
-            "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "define-properties": "^1.1.3",
-                "functions-have-names": "^1.2.2"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/regexpp": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
-            "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/mysticatea"
-            }
-        },
-        "node_modules/regexpu-core": {
-            "version": "5.1.0",
-            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz",
-            "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==",
-            "dev": true,
-            "dependencies": {
-                "regenerate": "^1.4.2",
-                "regenerate-unicode-properties": "^10.0.1",
-                "regjsgen": "^0.6.0",
-                "regjsparser": "^0.8.2",
-                "unicode-match-property-ecmascript": "^2.0.0",
-                "unicode-match-property-value-ecmascript": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/regjsgen": {
-            "version": "0.6.0",
-            "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz",
-            "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==",
-            "dev": true
-        },
-        "node_modules/regjsparser": {
-            "version": "0.8.4",
-            "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz",
-            "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==",
-            "dev": true,
-            "dependencies": {
-                "jsesc": "~0.5.0"
-            },
-            "bin": {
-                "regjsparser": "bin/parser"
-            }
-        },
-        "node_modules/regjsparser/node_modules/jsesc": {
-            "version": "0.5.0",
-            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-            "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
-            "dev": true,
-            "bin": {
-                "jsesc": "bin/jsesc"
-            }
-        },
-        "node_modules/reinterval": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz",
-            "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ=="
-        },
-        "node_modules/request": {
-            "version": "2.88.2",
-            "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
-            "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
-            "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
-            "optional": true,
-            "dependencies": {
-                "aws-sign2": "~0.7.0",
-                "aws4": "^1.8.0",
-                "caseless": "~0.12.0",
-                "combined-stream": "~1.0.6",
-                "extend": "~3.0.2",
-                "forever-agent": "~0.6.1",
-                "form-data": "~2.3.2",
-                "har-validator": "~5.1.3",
-                "http-signature": "~1.2.0",
-                "is-typedarray": "~1.0.0",
-                "isstream": "~0.1.2",
-                "json-stringify-safe": "~5.0.1",
-                "mime-types": "~2.1.19",
-                "oauth-sign": "~0.9.0",
-                "performance-now": "^2.1.0",
-                "qs": "~6.5.2",
-                "safe-buffer": "^5.1.2",
-                "tough-cookie": "~2.5.0",
-                "tunnel-agent": "^0.6.0",
-                "uuid": "^3.3.2"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/request/node_modules/form-data": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-            "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-            "optional": true,
-            "dependencies": {
-                "asynckit": "^0.4.0",
-                "combined-stream": "^1.0.6",
-                "mime-types": "^2.1.12"
-            },
-            "engines": {
-                "node": ">= 0.12"
-            }
-        },
-        "node_modules/request/node_modules/qs": {
-            "version": "6.5.3",
-            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-            "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
-            "optional": true,
-            "engines": {
-                "node": ">=0.6"
-            }
-        },
-        "node_modules/request/node_modules/tough-cookie": {
-            "version": "2.5.0",
-            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-            "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-            "optional": true,
-            "dependencies": {
-                "psl": "^1.1.28",
-                "punycode": "^2.1.1"
-            },
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
-        "node_modules/request/node_modules/uuid": {
-            "version": "3.4.0",
-            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-            "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-            "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
-            "optional": true,
-            "bin": {
-                "uuid": "bin/uuid"
-            }
-        },
-        "node_modules/require-directory": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-            "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/require-from-string": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-            "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/require-main-filename": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-            "dev": true
-        },
-        "node_modules/resolve": {
-            "version": "1.22.1",
-            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
-            "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
-            "dependencies": {
-                "is-core-module": "^2.9.0",
-                "path-parse": "^1.0.7",
-                "supports-preserve-symlinks-flag": "^1.0.0"
-            },
-            "bin": {
-                "resolve": "bin/resolve"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/resolve-cwd": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
-            "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
-            "dev": true,
-            "dependencies": {
-                "resolve-from": "^5.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/resolve-cwd/node_modules/resolve-from": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/resolve-dir": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
-            "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==",
-            "dev": true,
-            "dependencies": {
-                "expand-tilde": "^1.2.2",
-                "global-modules": "^0.2.3"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/resolve-from": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-            "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-            "dev": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/resolve.exports": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
-            "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/retimer": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz",
-            "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==",
-            "dev": true
-        },
-        "node_modules/reusify": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-            "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-            "dev": true,
-            "engines": {
-                "iojs": ">=1.0.0",
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/rfdc": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
-            "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
-        },
-        "node_modules/rimraf": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-            "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-            "dependencies": {
-                "glob": "^7.1.3"
-            },
-            "bin": {
-                "rimraf": "bin.js"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/rollup": {
-            "version": "2.75.7",
-            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz",
-            "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==",
-            "dev": true,
-            "bin": {
-                "rollup": "dist/bin/rollup"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            },
-            "optionalDependencies": {
-                "fsevents": "~2.3.2"
-            }
-        },
-        "node_modules/rollup-plugin-visualizer": {
-            "version": "5.6.0",
-            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.6.0.tgz",
-            "integrity": "sha512-CKcc8GTUZjC+LsMytU8ocRr/cGZIfMR7+mdy4YnlyetlmIl/dM8BMnOEpD4JPIGt+ZVW7Db9ZtSsbgyeBH3uTA==",
-            "dev": true,
-            "dependencies": {
-                "nanoid": "^3.1.32",
-                "open": "^8.4.0",
-                "source-map": "^0.7.3",
-                "yargs": "^17.3.1"
-            },
-            "bin": {
-                "rollup-plugin-visualizer": "dist/bin/cli.js"
-            },
-            "engines": {
-                "node": ">=12"
-            },
-            "peerDependencies": {
-                "rollup": "^2.0.0"
-            }
-        },
-        "node_modules/rollup-plugin-visualizer/node_modules/source-map": {
-            "version": "0.7.4",
-            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
-            "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
-            "dev": true,
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/rtlcss": {
-            "version": "3.5.0",
-            "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz",
-            "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==",
-            "dev": true,
-            "dependencies": {
-                "find-up": "^5.0.0",
-                "picocolors": "^1.0.0",
-                "postcss": "^8.3.11",
-                "strip-json-comments": "^3.1.1"
-            },
-            "bin": {
-                "rtlcss": "bin/rtlcss.js"
-            }
-        },
-        "node_modules/rtlcss/node_modules/find-up": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-            "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-            "dev": true,
-            "dependencies": {
-                "locate-path": "^6.0.0",
-                "path-exists": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/rtlcss/node_modules/locate-path": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-            "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-            "dev": true,
-            "dependencies": {
-                "p-locate": "^5.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/rtlcss/node_modules/p-limit": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-            "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-            "dev": true,
-            "dependencies": {
-                "yocto-queue": "^0.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/rtlcss/node_modules/p-locate": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-            "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-            "dev": true,
-            "dependencies": {
-                "p-limit": "^3.0.2"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/run-parallel": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-            "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-            "dev": true,
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
-                    "url": "https://feross.org/support"
-                }
-            ],
-            "dependencies": {
-                "queue-microtask": "^1.2.2"
-            }
-        },
-        "node_modules/rxjs": {
-            "version": "7.5.5",
-            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
-            "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
-            "dev": true,
-            "dependencies": {
-                "tslib": "^2.1.0"
-            }
-        },
-        "node_modules/safe-buffer": {
-            "version": "5.1.2",
-            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-            "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-        },
-        "node_modules/safe-timers": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/safe-timers/-/safe-timers-1.1.0.tgz",
-            "integrity": "sha512-9aqY+v5eMvmRaluUEtdRThV1EjlSElzO7HuCj0sTW9xvp++8iJ9t/RWGNWV6/WHcUJLHpyT2SNf/apoKTU2EpA=="
-        },
-        "node_modules/safer-buffer": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-            "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-        },
-        "node_modules/sass": {
-            "version": "1.42.1",
-            "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz",
-            "integrity": "sha512-/zvGoN8B7dspKc5mC6HlaygyCBRvnyzzgD5khiaCfglWztY99cYoiTUksVx11NlnemrcfH5CEaCpsUKoW0cQqg==",
-            "dev": true,
-            "dependencies": {
-                "chokidar": ">=3.0.0 <4.0.0"
-            },
-            "bin": {
-                "sass": "sass.js"
-            },
-            "engines": {
-                "node": ">=8.9.0"
-            }
-        },
-        "node_modules/sax": {
-            "version": "1.2.4",
-            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
-        },
-        "node_modules/saxes": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
-            "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
-            "dev": true,
-            "dependencies": {
-                "xmlchars": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/semver": {
-            "version": "6.3.0",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-            "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-            "bin": {
-                "semver": "bin/semver.js"
-            }
-        },
-        "node_modules/send": {
-            "version": "0.17.2",
-            "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
-            "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
-            "dependencies": {
-                "debug": "2.6.9",
-                "depd": "~1.1.2",
-                "destroy": "~1.0.4",
-                "encodeurl": "~1.0.2",
-                "escape-html": "~1.0.3",
-                "etag": "~1.8.1",
-                "fresh": "0.5.2",
-                "http-errors": "1.8.1",
-                "mime": "1.6.0",
-                "ms": "2.1.3",
-                "on-finished": "~2.3.0",
-                "range-parser": "~1.2.1",
-                "statuses": "~1.5.0"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/send/node_modules/debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "dependencies": {
-                "ms": "2.0.0"
-            }
-        },
-        "node_modules/send/node_modules/debug/node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
-        "node_modules/serve-static": {
-            "version": "1.14.2",
-            "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
-            "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
-            "dependencies": {
-                "encodeurl": "~1.0.2",
-                "escape-html": "~1.0.3",
-                "parseurl": "~1.3.3",
-                "send": "0.17.2"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/set-blocking": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-            "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
-        },
-        "node_modules/setprototypeof": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
-            "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
-        },
-        "node_modules/shallow-clone": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
-            "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==",
-            "dev": true,
-            "dependencies": {
-                "is-extendable": "^0.1.1",
-                "kind-of": "^2.0.1",
-                "lazy-cache": "^0.2.3",
-                "mixin-object": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/shallow-clone/node_modules/kind-of": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
-            "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==",
-            "dev": true,
-            "dependencies": {
-                "is-buffer": "^1.0.2"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/shallow-clone/node_modules/lazy-cache": {
-            "version": "0.2.7",
-            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
-            "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/shebang-command": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-            "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-            "dev": true,
-            "dependencies": {
-                "shebang-regex": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/shebang-regex": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-            "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/shell-quote": {
-            "version": "1.7.3",
-            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
-            "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
-            "dev": true
-        },
-        "node_modules/side-channel": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-            "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
-            "dependencies": {
-                "call-bind": "^1.0.0",
-                "get-intrinsic": "^1.0.2",
-                "object-inspect": "^1.9.0"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/signal-exit": {
-            "version": "3.0.7",
-            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-            "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
-        },
-        "node_modules/sisteransi": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
-            "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
-            "dev": true
-        },
-        "node_modules/slash": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-            "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/slice-ansi": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-            "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.0.0",
-                "astral-regex": "^2.0.0",
-                "is-fullwidth-code-point": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/slice-ansi?sponsor=1"
-            }
-        },
-        "node_modules/slice-ansi/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/slice-ansi/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/slice-ansi/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/smart-buffer": {
-            "version": "4.2.0",
-            "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
-            "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
-            "engines": {
-                "node": ">= 6.0.0",
-                "npm": ">= 3.0.0"
-            }
-        },
-        "node_modules/socket.io": {
-            "version": "4.4.1",
-            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz",
-            "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==",
-            "dependencies": {
-                "accepts": "~1.3.4",
-                "base64id": "~2.0.0",
-                "debug": "~4.3.2",
-                "engine.io": "~6.1.0",
-                "socket.io-adapter": "~2.3.3",
-                "socket.io-parser": "~4.0.4"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/socket.io-adapter": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
-            "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ=="
-        },
-        "node_modules/socket.io-client": {
-            "version": "4.4.1",
-            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz",
-            "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==",
-            "dependencies": {
-                "@socket.io/component-emitter": "~3.0.0",
-                "backo2": "~1.0.2",
-                "debug": "~4.3.2",
-                "engine.io-client": "~6.1.1",
-                "parseuri": "0.0.6",
-                "socket.io-parser": "~4.1.1"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/socket.io-client/node_modules/socket.io-parser": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz",
-            "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==",
-            "dependencies": {
-                "@socket.io/component-emitter": "~3.0.0",
-                "debug": "~4.3.1"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/socket.io-parser": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz",
-            "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==",
-            "dependencies": {
-                "@types/component-emitter": "^1.2.10",
-                "component-emitter": "~1.3.0",
-                "debug": "~4.3.1"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/socks": {
-            "version": "2.6.2",
-            "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
-            "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
-            "dependencies": {
-                "ip": "^1.1.5",
-                "smart-buffer": "^4.2.0"
-            },
-            "engines": {
-                "node": ">= 10.13.0",
-                "npm": ">= 3.0.0"
-            }
-        },
-        "node_modules/socks-proxy-agent": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz",
-            "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==",
-            "dependencies": {
-                "agent-base": "^6.0.2",
-                "debug": "^4.3.1",
-                "socks": "^2.6.1"
-            },
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/sortablejs": {
-            "version": "1.14.0",
-            "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz",
-            "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==",
-            "dev": true
-        },
-        "node_modules/source-map": {
-            "version": "0.6.1",
-            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/source-map-js": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-            "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/source-map-support": {
-            "version": "0.5.21",
-            "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-            "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-            "dev": true,
-            "dependencies": {
-                "buffer-from": "^1.0.0",
-                "source-map": "^0.6.0"
-            }
-        },
-        "node_modules/sourcemap-codec": {
-            "version": "1.4.8",
-            "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-            "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
-            "dev": true
-        },
-        "node_modules/spawn-command": {
-            "version": "0.0.2-1",
-            "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
-            "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==",
-            "dev": true
-        },
-        "node_modules/spawnd": {
-            "version": "6.0.2",
-            "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-6.0.2.tgz",
-            "integrity": "sha512-+YJtx0dvy2wt304MrHD//tASc84zinBUYU1jacPBzrjhZUd7RsDo25krxr4HUHAQzEQFuMAs4/p+yLYU5ciZ1w==",
-            "dev": true,
-            "dependencies": {
-                "exit": "^0.1.2",
-                "signal-exit": "^3.0.6",
-                "tree-kill": "^1.2.2"
-            }
-        },
-        "node_modules/spdx-correct": {
-            "version": "3.1.1",
-            "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
-            "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-            "dev": true,
-            "dependencies": {
-                "spdx-expression-parse": "^3.0.0",
-                "spdx-license-ids": "^3.0.0"
-            }
-        },
-        "node_modules/spdx-exceptions": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-            "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-            "dev": true
-        },
-        "node_modules/spdx-expression-parse": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-            "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-            "dev": true,
-            "dependencies": {
-                "spdx-exceptions": "^2.1.0",
-                "spdx-license-ids": "^3.0.0"
-            }
-        },
-        "node_modules/spdx-license-ids": {
-            "version": "3.0.11",
-            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
-            "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
-            "dev": true
-        },
-        "node_modules/specificity": {
-            "version": "0.4.1",
-            "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
-            "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
-            "dev": true,
-            "bin": {
-                "specificity": "bin/specificity"
-            }
-        },
-        "node_modules/split2": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
-            "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
-            "dependencies": {
-                "readable-stream": "^3.0.0"
-            }
-        },
-        "node_modules/sprintf-js": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
-            "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
-        },
-        "node_modules/sshpk": {
-            "version": "1.17.0",
-            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
-            "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
-            "optional": true,
-            "dependencies": {
-                "asn1": "~0.2.3",
-                "assert-plus": "^1.0.0",
-                "bcrypt-pbkdf": "^1.0.0",
-                "dashdash": "^1.12.0",
-                "ecc-jsbn": "~0.1.1",
-                "getpass": "^0.1.1",
-                "jsbn": "~0.1.0",
-                "safer-buffer": "^2.0.2",
-                "tweetnacl": "~0.14.0"
-            },
-            "bin": {
-                "sshpk-conv": "bin/sshpk-conv",
-                "sshpk-sign": "bin/sshpk-sign",
-                "sshpk-verify": "bin/sshpk-verify"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/stack-utils": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
-            "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
-            "dev": true,
-            "dependencies": {
-                "escape-string-regexp": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/stack-utils/node_modules/escape-string-regexp": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-            "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/statuses": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-            "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/stoppable": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
-            "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==",
-            "engines": {
-                "node": ">=4",
-                "npm": ">=6"
-            }
-        },
-        "node_modules/stream-shift": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
-            "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
-        },
-        "node_modules/string_decoder": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-            "dependencies": {
-                "safe-buffer": "~5.2.0"
-            }
-        },
-        "node_modules/string_decoder/node_modules/safe-buffer": {
-            "version": "5.2.1",
-            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
-                    "url": "https://feross.org/support"
-                }
-            ]
-        },
-        "node_modules/string-length": {
-            "version": "4.0.2",
-            "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
-            "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
-            "dev": true,
-            "dependencies": {
-                "char-regex": "^1.0.2",
-                "strip-ansi": "^6.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/string-width": {
-            "version": "4.2.3",
-            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-            "dependencies": {
-                "emoji-regex": "^8.0.0",
-                "is-fullwidth-code-point": "^3.0.0",
-                "strip-ansi": "^6.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/string.prototype.trimend": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
-            "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "define-properties": "^1.1.4",
-                "es-abstract": "^1.19.5"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/string.prototype.trimstart": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
-            "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "define-properties": "^1.1.4",
-                "es-abstract": "^1.19.5"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/strip-ansi": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-            "dependencies": {
-                "ansi-regex": "^5.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/strip-bom": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-            "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/strip-final-newline": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-            "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-            "dev": true,
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/strip-indent": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
-            "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
-            "dev": true,
-            "dependencies": {
-                "min-indent": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/strip-json-comments": {
-            "version": "3.1.1",
-            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-            "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/style-search": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
-            "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
-            "dev": true
-        },
-        "node_modules/stylelint": {
-            "version": "14.7.1",
-            "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.7.1.tgz",
-            "integrity": "sha512-rUOWm67hrzGXXyO/cInENEejF4urh1dLgOb9cr/3XLDb/t/A+rXQp3p6+no8o8QCKTgBUdhVUq/bXMgE988PJw==",
-            "dev": true,
-            "dependencies": {
-                "balanced-match": "^2.0.0",
-                "colord": "^2.9.2",
-                "cosmiconfig": "^7.0.1",
-                "css-functions-list": "^3.0.1",
-                "debug": "^4.3.4",
-                "execall": "^2.0.0",
-                "fast-glob": "^3.2.11",
-                "fastest-levenshtein": "^1.0.12",
-                "file-entry-cache": "^6.0.1",
-                "get-stdin": "^8.0.0",
-                "global-modules": "^2.0.0",
-                "globby": "^11.1.0",
-                "globjoin": "^0.1.4",
-                "html-tags": "^3.2.0",
-                "ignore": "^5.2.0",
-                "import-lazy": "^4.0.0",
-                "imurmurhash": "^0.1.4",
-                "is-plain-object": "^5.0.0",
-                "known-css-properties": "^0.24.0",
-                "mathml-tag-names": "^2.1.3",
-                "meow": "^9.0.0",
-                "micromatch": "^4.0.5",
-                "normalize-path": "^3.0.0",
-                "normalize-selector": "^0.2.0",
-                "picocolors": "^1.0.0",
-                "postcss": "^8.4.12",
-                "postcss-media-query-parser": "^0.2.3",
-                "postcss-resolve-nested-selector": "^0.1.1",
-                "postcss-safe-parser": "^6.0.0",
-                "postcss-selector-parser": "^6.0.10",
-                "postcss-value-parser": "^4.2.0",
-                "resolve-from": "^5.0.0",
-                "specificity": "^0.4.1",
-                "string-width": "^4.2.3",
-                "strip-ansi": "^6.0.1",
-                "style-search": "^0.1.0",
-                "supports-hyperlinks": "^2.2.0",
-                "svg-tags": "^1.0.0",
-                "table": "^6.8.0",
-                "v8-compile-cache": "^2.3.0",
-                "write-file-atomic": "^4.0.1"
-            },
-            "bin": {
-                "stylelint": "bin/stylelint.js"
-            },
-            "engines": {
-                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/stylelint"
-            }
-        },
-        "node_modules/stylelint-config-recommended": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz",
-            "integrity": "sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==",
-            "dev": true,
-            "peerDependencies": {
-                "stylelint": "^14.4.0"
-            }
-        },
-        "node_modules/stylelint-config-standard": {
-            "version": "25.0.0",
-            "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-25.0.0.tgz",
-            "integrity": "sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==",
-            "dev": true,
-            "dependencies": {
-                "stylelint-config-recommended": "^7.0.0"
-            },
-            "peerDependencies": {
-                "stylelint": "^14.4.0"
-            }
-        },
-        "node_modules/stylelint/node_modules/balanced-match": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
-            "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
-            "dev": true
-        },
-        "node_modules/stylelint/node_modules/global-modules": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
-            "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
-            "dev": true,
-            "dependencies": {
-                "global-prefix": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/stylelint/node_modules/global-prefix": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
-            "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
-            "dev": true,
-            "dependencies": {
-                "ini": "^1.3.5",
-                "kind-of": "^6.0.2",
-                "which": "^1.3.1"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/stylelint/node_modules/kind-of": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-            "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/stylelint/node_modules/resolve-from": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/stylelint/node_modules/which": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-            "dev": true,
-            "dependencies": {
-                "isexe": "^2.0.0"
-            },
-            "bin": {
-                "which": "bin/which"
-            }
-        },
-        "node_modules/stylelint/node_modules/write-file-atomic": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz",
-            "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==",
-            "dev": true,
-            "dependencies": {
-                "imurmurhash": "^0.1.4",
-                "signal-exit": "^3.0.7"
-            },
-            "engines": {
-                "node": "^12.13.0 || ^14.15.0 || >=16"
-            }
-        },
-        "node_modules/supports-color": {
-            "version": "5.5.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/supports-hyperlinks": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
-            "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0",
-                "supports-color": "^7.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/supports-hyperlinks/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/supports-hyperlinks/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/supports-preserve-symlinks-flag": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-            "engines": {
-                "node": ">= 0.4"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/svg-tags": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
-            "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
-            "dev": true
-        },
-        "node_modules/symbol-tree": {
-            "version": "3.2.4",
-            "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-            "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
-            "dev": true
-        },
-        "node_modules/systemjs": {
-            "version": "6.12.1",
-            "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.12.1.tgz",
-            "integrity": "sha512-hqTN6kW+pN6/qro6G9OZ7ceDQOcYno020zBQKpZQLsJhYTDMCMNfXi/Y8duF5iW+4WWZr42ry0MMkcRGpbwG2A==",
-            "dev": true
-        },
-        "node_modules/table": {
-            "version": "6.8.0",
-            "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
-            "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
-            "dev": true,
-            "dependencies": {
-                "ajv": "^8.0.1",
-                "lodash.truncate": "^4.4.2",
-                "slice-ansi": "^4.0.0",
-                "string-width": "^4.2.3",
-                "strip-ansi": "^6.0.1"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/table/node_modules/ajv": {
-            "version": "8.11.0",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
-            "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
-            "dev": true,
-            "dependencies": {
-                "fast-deep-equal": "^3.1.1",
-                "json-schema-traverse": "^1.0.0",
-                "require-from-string": "^2.0.2",
-                "uri-js": "^4.2.2"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/epoberezkin"
-            }
-        },
-        "node_modules/table/node_modules/json-schema-traverse": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-            "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-            "dev": true
-        },
-        "node_modules/tar": {
-            "version": "6.1.11",
-            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-            "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
-            "dependencies": {
-                "chownr": "^2.0.0",
-                "fs-minipass": "^2.0.0",
-                "minipass": "^3.0.0",
-                "minizlib": "^2.1.1",
-                "mkdirp": "^1.0.3",
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/tar-fs": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
-            "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
-            "dev": true,
-            "dependencies": {
-                "chownr": "^1.1.1",
-                "mkdirp-classic": "^0.5.2",
-                "pump": "^3.0.0",
-                "tar-stream": "^2.1.4"
-            }
-        },
-        "node_modules/tar-fs/node_modules/chownr": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-            "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
-            "dev": true
-        },
-        "node_modules/tar-stream": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
-            "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
-            "dev": true,
-            "dependencies": {
-                "bl": "^4.0.3",
-                "end-of-stream": "^1.4.1",
-                "fs-constants": "^1.0.0",
-                "inherits": "^2.0.3",
-                "readable-stream": "^3.1.1"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/tarn": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
-            "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==",
-            "engines": {
-                "node": ">=8.0.0"
-            }
-        },
-        "node_modules/tcp-ping": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/tcp-ping/-/tcp-ping-0.1.1.tgz",
-            "integrity": "sha512-7Ed10Ds0hYnF+O1lfiZ2iSZ1bCAj+96Madctebmq7Y1ALPWlBY4YI8C6pCL+UTlshFY5YogixKLpgDP/4BlHrw=="
-        },
-        "node_modules/tdigest": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz",
-            "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==",
-            "dependencies": {
-                "bintrees": "1.0.2"
-            }
-        },
-        "node_modules/tedious": {
-            "version": "14.6.1",
-            "resolved": "https://registry.npmjs.org/tedious/-/tedious-14.6.1.tgz",
-            "integrity": "sha512-45Xsvsjm6j41JVXXwKAseAGM/jD6ty8CcSdcxPT4B2dqZ00tIkYsGlI7n8DU8xDoatnvyT4BIYKZZCe3eE16PA==",
-            "dependencies": {
-                "@azure/identity": "^2.0.4",
-                "@azure/keyvault-keys": "^4.4.0",
-                "@js-joda/core": "^5.2.0",
-                "@types/es-aggregate-error": "^1.0.2",
-                "bl": "^5.0.0",
-                "es-aggregate-error": "^1.0.8",
-                "iconv-lite": "^0.6.3",
-                "jsbi": "^4.3.0",
-                "native-duplexpair": "^1.0.0",
-                "node-abort-controller": "^3.0.1",
-                "punycode": "^2.1.0",
-                "sprintf-js": "^1.1.2"
-            },
-            "engines": {
-                "node": ">=12.3.0"
-            }
-        },
-        "node_modules/tedious/node_modules/bl": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz",
-            "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==",
-            "dependencies": {
-                "buffer": "^6.0.3",
-                "inherits": "^2.0.4",
-                "readable-stream": "^3.4.0"
-            }
-        },
-        "node_modules/tedious/node_modules/buffer": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
-            "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
-                    "url": "https://feross.org/support"
-                }
-            ],
-            "dependencies": {
-                "base64-js": "^1.3.1",
-                "ieee754": "^1.2.1"
-            }
-        },
-        "node_modules/terminal-link": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
-            "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
-            "dev": true,
-            "dependencies": {
-                "ansi-escapes": "^4.2.1",
-                "supports-hyperlinks": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/test-exclude": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
-            "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
-            "dev": true,
-            "dependencies": {
-                "@istanbuljs/schema": "^0.1.2",
-                "glob": "^7.1.4",
-                "minimatch": "^3.0.4"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/text-table": {
-            "version": "0.2.0",
-            "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-            "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
-            "dev": true
-        },
-        "node_modules/thirty-two": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz",
-            "integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==",
-            "engines": {
-                "node": ">=0.2.6"
-            }
-        },
-        "node_modules/throat": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
-            "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
-            "dev": true
-        },
-        "node_modules/through": {
-            "version": "2.3.8",
-            "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-            "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
-            "dev": true
-        },
-        "node_modules/tildify": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz",
-            "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/timezones-list": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/timezones-list/-/timezones-list-3.0.1.tgz",
-            "integrity": "sha512-yfOzyuVwzgD0LkldD3Epkr+JUdUIxEUL147Fa6ZgG/23KU28iOv3e3M7vQOCFMPyopAhDX7dqOLWttIP7tkTKg==",
-            "dev": true
-        },
-        "node_modules/tmpl": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
-            "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
-            "dev": true
-        },
-        "node_modules/to-fast-properties": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-            "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
-            "dev": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/to-regex-range": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-            "dev": true,
-            "dependencies": {
-                "is-number": "^7.0.0"
-            },
-            "engines": {
-                "node": ">=8.0"
-            }
-        },
-        "node_modules/toidentifier": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
-            "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
-            "engines": {
-                "node": ">=0.6"
-            }
-        },
-        "node_modules/topo": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz",
-            "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
-            "deprecated": "This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
-            "dependencies": {
-                "hoek": "6.x.x"
-            }
-        },
-        "node_modules/toposort": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
-            "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
-        },
-        "node_modules/tough-cookie": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
-            "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
-            "dependencies": {
-                "psl": "^1.1.33",
-                "punycode": "^2.1.1",
-                "universalify": "^0.1.2"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/tr46": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
-            "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
-            "dev": true,
-            "dependencies": {
-                "punycode": "^2.1.1"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/tree-kill": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
-            "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
-            "dev": true,
-            "bin": {
-                "tree-kill": "cli.js"
-            }
-        },
-        "node_modules/trim-newlines": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
-            "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/tslib": {
-            "version": "2.4.0",
-            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
-            "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
-        },
-        "node_modules/tunnel": {
-            "version": "0.0.6",
-            "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
-            "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
-            "engines": {
-                "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
-            }
-        },
-        "node_modules/tunnel-agent": {
-            "version": "0.6.0",
-            "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-            "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
-            "optional": true,
-            "dependencies": {
-                "safe-buffer": "^5.0.1"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
-        "node_modules/tweetnacl": {
-            "version": "0.14.5",
-            "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-            "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
-            "optional": true
-        },
-        "node_modules/type-check": {
-            "version": "0.4.0",
-            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-            "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-            "dev": true,
-            "dependencies": {
-                "prelude-ls": "^1.2.1"
-            },
-            "engines": {
-                "node": ">= 0.8.0"
-            }
-        },
-        "node_modules/type-detect": {
-            "version": "4.0.8",
-            "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-            "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
-            "dev": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/type-fest": {
-            "version": "0.21.3",
-            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-            "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/type-is": {
-            "version": "1.6.18",
-            "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
-            "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
-            "dependencies": {
-                "media-typer": "0.3.0",
-                "mime-types": "~2.1.24"
-            },
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/typedarray": {
-            "version": "0.0.6",
-            "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-            "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
-        },
-        "node_modules/typedarray-to-buffer": {
-            "version": "3.1.5",
-            "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
-            "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-            "dev": true,
-            "dependencies": {
-                "is-typedarray": "^1.0.0"
-            }
-        },
-        "node_modules/typescript": {
-            "version": "4.4.4",
-            "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
-            "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
-            "dev": true,
-            "bin": {
-                "tsc": "bin/tsc",
-                "tsserver": "bin/tsserver"
-            },
-            "engines": {
-                "node": ">=4.2.0"
-            }
-        },
-        "node_modules/unbox-primitive": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
-            "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
-            "dependencies": {
-                "call-bind": "^1.0.2",
-                "has-bigints": "^1.0.2",
-                "has-symbols": "^1.0.3",
-                "which-boxed-primitive": "^1.0.2"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/unbzip2-stream": {
-            "version": "1.4.3",
-            "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
-            "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
-            "dev": true,
-            "dependencies": {
-                "buffer": "^5.2.1",
-                "through": "^2.3.8"
-            }
-        },
-        "node_modules/unicode-canonical-property-names-ecmascript": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
-            "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/unicode-match-property-ecmascript": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
-            "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
-            "dev": true,
-            "dependencies": {
-                "unicode-canonical-property-names-ecmascript": "^2.0.0",
-                "unicode-property-aliases-ecmascript": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/unicode-match-property-value-ecmascript": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
-            "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
-            "dev": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/unicode-property-aliases-ecmascript": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
-            "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/universal-user-agent": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
-            "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==",
-            "dev": true
-        },
-        "node_modules/universalify": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-            "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-            "engines": {
-                "node": ">= 4.0.0"
-            }
-        },
-        "node_modules/unpipe": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-            "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/update-browserslist-db": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz",
-            "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==",
-            "dev": true,
-            "funding": [
-                {
-                    "type": "opencollective",
-                    "url": "https://opencollective.com/browserslist"
-                },
-                {
-                    "type": "tidelift",
-                    "url": "https://tidelift.com/funding/github/npm/browserslist"
-                }
-            ],
-            "dependencies": {
-                "escalade": "^3.1.1",
-                "picocolors": "^1.0.0"
-            },
-            "bin": {
-                "browserslist-lint": "cli.js"
-            },
-            "peerDependencies": {
-                "browserslist": ">= 4.21.0"
-            }
-        },
-        "node_modules/uri-js": {
-            "version": "4.4.1",
-            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-            "devOptional": true,
-            "dependencies": {
-                "punycode": "^2.1.0"
-            }
-        },
-        "node_modules/util-deprecate": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-            "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
-        },
-        "node_modules/utils-merge": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-            "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
-            "engines": {
-                "node": ">= 0.4.0"
-            }
-        },
-        "node_modules/uuid": {
-            "version": "8.3.2",
-            "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-            "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
-            "bin": {
-                "uuid": "dist/bin/uuid"
-            }
-        },
-        "node_modules/uuid-parse": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz",
-            "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==",
-            "dev": true
-        },
-        "node_modules/v-pagination-3": {
-            "version": "0.1.7",
-            "resolved": "https://registry.npmjs.org/v-pagination-3/-/v-pagination-3-0.1.7.tgz",
-            "integrity": "sha512-b5H+SdL+yIhkqyWI+Uj5lGk1VK3Q/hjqN44okerMa9smtk55DJX3Jg+ecU/vJAFrEhNCqgNzLsJ8pLRcHrbjrg==",
-            "dev": true,
-            "dependencies": {
-                "babel-plugin-add-module-exports": "^0.2.1",
-                "merge": "^2.1.1",
-                "vue": ">=3.0.0"
-            }
-        },
-        "node_modules/v8-compile-cache": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
-            "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
-            "dev": true
-        },
-        "node_modules/v8-to-istanbul": {
-            "version": "8.1.1",
-            "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
-            "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
-            "dev": true,
-            "dependencies": {
-                "@types/istanbul-lib-coverage": "^2.0.1",
-                "convert-source-map": "^1.6.0",
-                "source-map": "^0.7.3"
-            },
-            "engines": {
-                "node": ">=10.12.0"
-            }
-        },
-        "node_modules/v8-to-istanbul/node_modules/source-map": {
-            "version": "0.7.4",
-            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
-            "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
-            "dev": true,
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/validate-npm-package-license": {
-            "version": "3.0.4",
-            "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-            "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-            "dev": true,
-            "dependencies": {
-                "spdx-correct": "^3.0.0",
-                "spdx-expression-parse": "^3.0.0"
-            }
-        },
-        "node_modules/vary": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-            "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
-            "engines": {
-                "node": ">= 0.8"
-            }
-        },
-        "node_modules/verror": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-            "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
-            "engines": [
-                "node >=0.6.0"
-            ],
-            "optional": true,
-            "dependencies": {
-                "assert-plus": "^1.0.0",
-                "core-util-is": "1.0.2",
-                "extsprintf": "^1.2.0"
-            }
-        },
-        "node_modules/vite": {
-            "version": "2.9.13",
-            "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.13.tgz",
-            "integrity": "sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==",
-            "dev": true,
-            "dependencies": {
-                "esbuild": "^0.14.27",
-                "postcss": "^8.4.13",
-                "resolve": "^1.22.0",
-                "rollup": "^2.59.0"
-            },
-            "bin": {
-                "vite": "bin/vite.js"
-            },
-            "engines": {
-                "node": ">=12.2.0"
-            },
-            "optionalDependencies": {
-                "fsevents": "~2.3.2"
-            },
-            "peerDependencies": {
-                "less": "*",
-                "sass": "*",
-                "stylus": "*"
-            },
-            "peerDependenciesMeta": {
-                "less": {
-                    "optional": true
-                },
-                "sass": {
-                    "optional": true
-                },
-                "stylus": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/vite-plugin-compression": {
-            "version": "0.5.1",
-            "resolved": "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz",
-            "integrity": "sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.1.2",
-                "debug": "^4.3.3",
-                "fs-extra": "^10.0.0"
-            },
-            "peerDependencies": {
-                "vite": ">=2.0.0"
-            }
-        },
-        "node_modules/vite-plugin-compression/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/vite-plugin-compression/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/vite-plugin-compression/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/vite-plugin-compression/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/vite-plugin-compression/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/vite-plugin-compression/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/vue": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.36.tgz",
-            "integrity": "sha512-5yTXmrE6gW8IQgttzHW5bfBiFA6mx35ZXHjGLDmKYzW6MMmYvCwuKybANRepwkMYeXw2v1buGg3/lPICY5YlZw==",
-            "dev": true,
-            "dependencies": {
-                "@vue/compiler-dom": "3.2.36",
-                "@vue/compiler-sfc": "3.2.36",
-                "@vue/runtime-dom": "3.2.36",
-                "@vue/server-renderer": "3.2.36",
-                "@vue/shared": "3.2.36"
-            }
-        },
-        "node_modules/vue-chart-3": {
-            "version": "3.0.9",
-            "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-3.0.9.tgz",
-            "integrity": "sha512-RyVaOhSem0v4v645zAkdi1mgZjuD3KMQr11KrEZGFupoHzV2qn/sBpEDvplR9i57YnRxZ3KDnKqw/1rx2CkOZA==",
-            "dev": true,
-            "dependencies": {
-                "@vue/runtime-core": "latest",
-                "@vue/runtime-dom": "latest",
-                "csstype": "3.0.10",
-                "lodash": "latest",
-                "nanoid": "3.1.31"
-            },
-            "peerDependencies": {
-                "chart.js": "=> ^3.1.0",
-                "vue": ">= 3"
-            }
-        },
-        "node_modules/vue-chart-3/node_modules/csstype": {
-            "version": "3.0.10",
-            "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
-            "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==",
-            "dev": true
-        },
-        "node_modules/vue-chart-3/node_modules/nanoid": {
-            "version": "3.1.31",
-            "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz",
-            "integrity": "sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A==",
-            "dev": true,
-            "bin": {
-                "nanoid": "bin/nanoid.cjs"
-            },
-            "engines": {
-                "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-            }
-        },
-        "node_modules/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==",
-            "dev": true,
-            "peerDependencies": {
-                "vue": "^2.6.10"
-            }
-        },
-        "node_modules/vue-contenteditable": {
-            "version": "3.0.4",
-            "resolved": "https://registry.npmjs.org/vue-contenteditable/-/vue-contenteditable-3.0.4.tgz",
-            "integrity": "sha512-CmtqT4zHQwLoJEyNVaXUjjUFPUVYlXXBHfSbRCHCUjODMqrn6L293LM1nc1ELx8epitZZvecTfIqOLlSzB3d+w==",
-            "dev": true,
-            "peerDependencies": {
-                "vue": "^3.0.0"
-            }
-        },
-        "node_modules/vue-demi": {
-            "version": "0.12.5",
-            "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.5.tgz",
-            "integrity": "sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==",
-            "dev": true,
-            "hasInstallScript": true,
-            "bin": {
-                "vue-demi-fix": "bin/vue-demi-fix.js",
-                "vue-demi-switch": "bin/vue-demi-switch.js"
-            },
-            "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/antfu"
-            },
-            "peerDependencies": {
-                "@vue/composition-api": "^1.0.0-rc.1",
-                "vue": "^3.0.0-0 || ^2.6.0"
-            },
-            "peerDependenciesMeta": {
-                "@vue/composition-api": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/vue-eslint-parser": {
-            "version": "8.3.0",
-            "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-            "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
-            "dev": true,
-            "dependencies": {
-                "debug": "^4.3.2",
-                "eslint-scope": "^7.0.0",
-                "eslint-visitor-keys": "^3.1.0",
-                "espree": "^9.0.0",
-                "esquery": "^1.4.0",
-                "lodash": "^4.17.21",
-                "semver": "^7.3.5"
-            },
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/mysticatea"
-            },
-            "peerDependencies": {
-                "eslint": ">=6.0.0"
-            }
-        },
-        "node_modules/vue-eslint-parser/node_modules/eslint-scope": {
-            "version": "7.1.1",
-            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-            "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
-            "dev": true,
-            "dependencies": {
-                "esrecurse": "^4.3.0",
-                "estraverse": "^5.2.0"
-            },
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            }
-        },
-        "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
-            "version": "3.3.0",
-            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-            "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
-            "dev": true,
-            "engines": {
-                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-            }
-        },
-        "node_modules/vue-eslint-parser/node_modules/estraverse": {
-            "version": "5.3.0",
-            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-            "dev": true,
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/vue-eslint-parser/node_modules/semver": {
-            "version": "7.3.7",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-            "dev": true,
-            "dependencies": {
-                "lru-cache": "^6.0.0"
-            },
-            "bin": {
-                "semver": "bin/semver.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/vue-i18n": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.1.10.tgz",
-            "integrity": "sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==",
-            "dev": true,
-            "dependencies": {
-                "@intlify/core-base": "9.1.10",
-                "@intlify/shared": "9.1.10",
-                "@intlify/vue-devtools": "9.1.10",
-                "@vue/devtools-api": "^6.0.0-beta.7"
-            },
-            "engines": {
-                "node": ">= 10"
-            },
-            "peerDependencies": {
-                "vue": "^3.0.0"
-            }
-        },
-        "node_modules/vue-image-crop-upload": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/vue-image-crop-upload/-/vue-image-crop-upload-3.0.3.tgz",
-            "integrity": "sha512-VeBsU0oI1hXeCvdpnu19DM/r3KTlI8SUXTxsHsU4MhDXR0ahRziiL9tf4FbILGx+gRVNZhGbl32yuM6TiaGNhA==",
-            "dev": true,
-            "dependencies": {
-                "babel-runtime": "^6.11.6"
-            }
-        },
-        "node_modules/vue-multiselect": {
-            "version": "3.0.0-alpha.2",
-            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-alpha.2.tgz",
-            "integrity": "sha512-Xp9fGJECns45v+v8jXbCIsAkCybYkEg0lNwr7Z6HDUSMyx2TEIK2giipPE+qXiShEc1Ipn+ZtttH2iq9hwXP4Q==",
-            "dev": true,
-            "engines": {
-                "node": ">= 4.0.0",
-                "npm": ">= 3.0.0"
-            }
-        },
-        "node_modules/vue-prism-editor": {
-            "version": "2.0.0-alpha.2",
-            "resolved": "https://registry.npmjs.org/vue-prism-editor/-/vue-prism-editor-2.0.0-alpha.2.tgz",
-            "integrity": "sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "peerDependencies": {
-                "vue": "^3.0.0"
-            }
-        },
-        "node_modules/vue-qrcode": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/vue-qrcode/-/vue-qrcode-1.0.1.tgz",
-            "integrity": "sha512-LHEsHA8mVR+mL8REKeLrvP0h0lelwzkJjFe3ToygKjQS9Mo85m9I7/axdCnRl9ZiZIFjTWkAW1dCK+f8rq0wIg==",
-            "dev": true,
-            "dependencies": {
-                "tslib": "^2.2.0",
-                "vue-demi": "^0.12.5"
-            },
-            "peerDependencies": {
-                "@vue/composition-api": "^1.0.0",
-                "qrcode": "^1.0.0",
-                "vue": "^2.0.0 || ^3.0.0"
-            },
-            "peerDependenciesMeta": {
-                "@vue/composition-api": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/vue-router": {
-            "version": "4.0.16",
-            "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.16.tgz",
-            "integrity": "sha512-JcO7cb8QJLBWE+DfxGUL3xUDOae/8nhM1KVdnudadTAORbuxIC/xAydC5Zr/VLHUDQi1ppuTF5/rjBGzgzrJNA==",
-            "dev": true,
-            "dependencies": {
-                "@vue/devtools-api": "^6.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/posva"
-            },
-            "peerDependencies": {
-                "vue": "^3.2.0"
-            }
-        },
-        "node_modules/vue-toastification": {
-            "version": "2.0.0-rc.5",
-            "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz",
-            "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==",
-            "dev": true,
-            "peerDependencies": {
-                "vue": "^3.0.2"
-            }
-        },
-        "node_modules/vue/node_modules/@vue/compiler-core": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.36.tgz",
-            "integrity": "sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==",
-            "dev": true,
-            "dependencies": {
-                "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.36",
-                "estree-walker": "^2.0.2",
-                "source-map": "^0.6.1"
-            }
-        },
-        "node_modules/vue/node_modules/@vue/compiler-dom": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.36.tgz",
-            "integrity": "sha512-tcOTAOiW4s24QLnq+ON6J+GRONXJ+A/mqKCORi0LSlIh8XQlNnlm24y8xIL8la+ZDgkdbjarQ9ZqYSvEja6gVA==",
-            "dev": true,
-            "dependencies": {
-                "@vue/compiler-core": "3.2.36",
-                "@vue/shared": "3.2.36"
-            }
-        },
-        "node_modules/vue/node_modules/@vue/compiler-sfc": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.36.tgz",
-            "integrity": "sha512-AvGb4bTj4W8uQ4BqaSxo7UwTEqX5utdRSMyHy58OragWlt8nEACQ9mIeQh3K4di4/SX+41+pJrLIY01lHAOFOA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.36",
-                "@vue/compiler-dom": "3.2.36",
-                "@vue/compiler-ssr": "3.2.36",
-                "@vue/reactivity-transform": "3.2.36",
-                "@vue/shared": "3.2.36",
-                "estree-walker": "^2.0.2",
-                "magic-string": "^0.25.7",
-                "postcss": "^8.1.10",
-                "source-map": "^0.6.1"
-            }
-        },
-        "node_modules/vue/node_modules/@vue/compiler-ssr": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.36.tgz",
-            "integrity": "sha512-+KugInUFRvOxEdLkZwE+W43BqHyhBh0jpYXhmqw1xGq2dmE6J9eZ8UUSOKNhdHtQ/iNLWWeK/wPZkVLUf3YGaw==",
-            "dev": true,
-            "dependencies": {
-                "@vue/compiler-dom": "3.2.36",
-                "@vue/shared": "3.2.36"
-            }
-        },
-        "node_modules/vue/node_modules/@vue/reactivity-transform": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.36.tgz",
-            "integrity": "sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==",
-            "dev": true,
-            "dependencies": {
-                "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.36",
-                "@vue/shared": "3.2.36",
-                "estree-walker": "^2.0.2",
-                "magic-string": "^0.25.7"
-            }
-        },
-        "node_modules/vue/node_modules/@vue/shared": {
-            "version": "3.2.36",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
-            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
-            "dev": true
-        },
-        "node_modules/vue/node_modules/magic-string": {
-            "version": "0.25.9",
-            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
-            "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
-            "dev": true,
-            "dependencies": {
-                "sourcemap-codec": "^1.4.8"
-            }
-        },
-        "node_modules/vuedraggable": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz",
-            "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
-            "dev": true,
-            "dependencies": {
-                "sortablejs": "1.14.0"
-            },
-            "peerDependencies": {
-                "vue": "^3.0.1"
-            }
-        },
-        "node_modules/w3c-hr-time": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
-            "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
-            "dev": true,
-            "dependencies": {
-                "browser-process-hrtime": "^1.0.0"
-            }
-        },
-        "node_modules/w3c-xmlserializer": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
-            "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
-            "dev": true,
-            "dependencies": {
-                "xml-name-validator": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/wait-on": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz",
-            "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==",
-            "dev": true,
-            "dependencies": {
-                "axios": "^0.25.0",
-                "joi": "^17.6.0",
-                "lodash": "^4.17.21",
-                "minimist": "^1.2.5",
-                "rxjs": "^7.5.4"
-            },
-            "bin": {
-                "wait-on": "bin/wait-on"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/wait-on/node_modules/axios": {
-            "version": "0.25.0",
-            "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz",
-            "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
-            "dev": true,
-            "dependencies": {
-                "follow-redirects": "^1.14.7"
-            }
-        },
-        "node_modules/walker": {
-            "version": "1.0.8",
-            "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
-            "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
-            "dev": true,
-            "dependencies": {
-                "makeerror": "1.0.12"
-            }
-        },
-        "node_modules/webidl-conversions": {
-            "version": "6.1.0",
-            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-            "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
-            "dev": true,
-            "engines": {
-                "node": ">=10.4"
-            }
-        },
-        "node_modules/whatwg-encoding": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
-            "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
-            "dev": true,
-            "dependencies": {
-                "iconv-lite": "0.4.24"
-            }
-        },
-        "node_modules/whatwg-encoding/node_modules/iconv-lite": {
-            "version": "0.4.24",
-            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-            "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-            "dev": true,
-            "dependencies": {
-                "safer-buffer": ">= 2.1.2 < 3"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/whatwg-mimetype": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
-            "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
-            "dev": true
-        },
-        "node_modules/whatwg-url": {
-            "version": "8.7.0",
-            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
-            "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
-            "dev": true,
-            "dependencies": {
-                "lodash": "^4.7.0",
-                "tr46": "^2.1.0",
-                "webidl-conversions": "^6.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/which": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-            "devOptional": true,
-            "dependencies": {
-                "isexe": "^2.0.0"
-            },
-            "bin": {
-                "node-which": "bin/node-which"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/which-boxed-primitive": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-            "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
-            "dependencies": {
-                "is-bigint": "^1.0.1",
-                "is-boolean-object": "^1.1.0",
-                "is-number-object": "^1.0.4",
-                "is-string": "^1.0.5",
-                "is-symbol": "^1.0.3"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/which-module": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-            "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
-            "dev": true
-        },
-        "node_modules/wide-align": {
-            "version": "1.1.5",
-            "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
-            "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
-            "dependencies": {
-                "string-width": "^1.0.2 || 2 || 3 || 4"
-            }
-        },
-        "node_modules/word-wrap": {
-            "version": "1.2.3",
-            "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-            "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/wrap-ansi": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.0.0",
-                "string-width": "^4.1.0",
-                "strip-ansi": "^6.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-            }
-        },
-        "node_modules/wrap-ansi/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/wrap-ansi/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/wrap-ansi/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/wrappy": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-            "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
-        },
-        "node_modules/write-file-atomic": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
-            "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-            "dev": true,
-            "dependencies": {
-                "imurmurhash": "^0.1.4",
-                "is-typedarray": "^1.0.0",
-                "signal-exit": "^3.0.2",
-                "typedarray-to-buffer": "^3.1.5"
-            }
-        },
-        "node_modules/ws": {
-            "version": "7.5.8",
-            "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz",
-            "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==",
-            "engines": {
-                "node": ">=8.3.0"
-            },
-            "peerDependencies": {
-                "bufferutil": "^4.0.1",
-                "utf-8-validate": "^5.0.2"
-            },
-            "peerDependenciesMeta": {
-                "bufferutil": {
-                    "optional": true
-                },
-                "utf-8-validate": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/xml-name-validator": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
-            "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
-            "dev": true
-        },
-        "node_modules/xml2js": {
-            "version": "0.4.23",
-            "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
-            "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
-            "dependencies": {
-                "sax": ">=0.6.0",
-                "xmlbuilder": "~11.0.0"
-            },
-            "engines": {
-                "node": ">=4.0.0"
-            }
-        },
-        "node_modules/xmlbuilder": {
-            "version": "11.0.1",
-            "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-            "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
-        "node_modules/xmlchars": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
-            "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
-            "dev": true
-        },
-        "node_modules/xmlhttprequest-ssl": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
-            "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
-        "node_modules/xtend": {
-            "version": "4.0.2",
-            "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-            "engines": {
-                "node": ">=0.4"
-            }
-        },
-        "node_modules/y18n": {
-            "version": "5.0.8",
-            "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/yallist": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-        },
-        "node_modules/yaml": {
-            "version": "1.10.2",
-            "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-            "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
-            "dev": true,
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/yargs": {
-            "version": "17.5.1",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
-            "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
-            "dev": true,
-            "dependencies": {
-                "cliui": "^7.0.2",
-                "escalade": "^3.1.1",
-                "get-caller-file": "^2.0.5",
-                "require-directory": "^2.1.1",
-                "string-width": "^4.2.3",
-                "y18n": "^5.0.5",
-                "yargs-parser": "^21.0.0"
-            },
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/yargs-parser": {
-            "version": "20.2.9",
-            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-            "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/yargs/node_modules/yargs-parser": {
-            "version": "21.0.1",
-            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
-            "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==",
-            "dev": true,
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/yauzl": {
-            "version": "2.10.0",
-            "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-            "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
-            "dev": true,
-            "dependencies": {
-                "buffer-crc32": "~0.2.3",
-                "fd-slicer": "~1.1.0"
-            }
-        },
-        "node_modules/yeast": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
-            "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg=="
-        },
-        "node_modules/yocto-queue": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-            "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/yup": {
-            "version": "0.32.9",
-            "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz",
-            "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==",
-            "dependencies": {
-                "@babel/runtime": "^7.10.5",
-                "@types/lodash": "^4.14.165",
-                "lodash": "^4.17.20",
-                "lodash-es": "^4.17.15",
-                "nanoclone": "^0.2.1",
-                "property-expr": "^2.0.4",
-                "toposort": "^2.0.2"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        }
-    },
     "dependencies": {
         "@actions/github": {
             "version": "5.0.3",
@@ -19608,7 +3052,6 @@
             "version": "6.12.6",
             "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
             "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-            "devOptional": true,
             "requires": {
                 "fast-deep-equal": "^3.1.1",
                 "fast-json-stable-stringify": "^2.0.0",
@@ -19749,11 +3192,12 @@
             "optional": true
         },
         "axios": {
-            "version": "0.26.1",
-            "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
-            "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+            "version": "0.27.2",
+            "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+            "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
             "requires": {
-                "follow-redirects": "^1.14.8"
+                "follow-redirects": "^1.14.9",
+                "form-data": "^4.0.0"
             }
         },
         "axios-ntlm": {
@@ -20746,8 +4190,7 @@
         "core-util-is": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
-            "devOptional": true
+            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
         },
         "cors": {
             "version": "2.8.5",
@@ -22030,8 +5473,7 @@
         "fast-deep-equal": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-            "devOptional": true
+            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
         },
         "fast-glob": {
             "version": "3.2.11",
@@ -22060,8 +5502,7 @@
         "fast-json-stable-stringify": {
             "version": "2.1.0",
             "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-            "devOptional": true
+            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
         },
         "fast-levenshtein": {
             "version": "2.0.6",
@@ -22618,8 +6059,7 @@
         "graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-            "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
-            "devOptional": true
+            "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
         },
         "har-schema": {
             "version": "2.0.0",
@@ -23150,8 +6590,7 @@
         "is-typedarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-            "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
-            "devOptional": true
+            "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
         },
         "is-valid-path": {
             "version": "0.1.1",
@@ -23186,8 +6625,7 @@
         "isarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-            "devOptional": true
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
         },
         "isemail": {
             "version": "3.2.0",
@@ -23200,8 +6638,7 @@
         "isexe": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-            "devOptional": true
+            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
         },
         "isobject": {
             "version": "3.0.1",
@@ -24830,8 +8267,7 @@
         "json-schema-traverse": {
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-            "devOptional": true
+            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
         },
         "json-stable-stringify-without-jsonify": {
             "version": "1.0.1",
@@ -25655,15 +9091,6 @@
                         "lru-cache": "^6.0.0"
                     }
                 },
-                "string_decoder": {
-                    "version": "1.1.1",
-                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-                    "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-                    "optional": true,
-                    "requires": {
-                        "safe-buffer": "~5.1.0"
-                    }
-                },
                 "string-width": {
                     "version": "1.0.2",
                     "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
@@ -25675,6 +9102,15 @@
                         "strip-ansi": "^3.0.0"
                     }
                 },
+                "string_decoder": {
+                    "version": "1.1.1",
+                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+                    "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+                    "optional": true,
+                    "requires": {
+                        "safe-buffer": "~5.1.0"
+                    }
+                },
                 "strip-ansi": {
                     "version": "3.0.1",
                     "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
@@ -27577,21 +11013,6 @@
             "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
             "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
         },
-        "string_decoder": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-            "requires": {
-                "safe-buffer": "~5.2.0"
-            },
-            "dependencies": {
-                "safe-buffer": {
-                    "version": "5.2.1",
-                    "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-                    "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-                }
-            }
-        },
         "string-length": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@@ -27632,6 +11053,21 @@
                 "es-abstract": "^1.19.5"
             }
         },
+        "string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "requires": {
+                "safe-buffer": "~5.2.0"
+            },
+            "dependencies": {
+                "safe-buffer": {
+                    "version": "5.2.1",
+                    "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+                    "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+                }
+            }
+        },
         "strip-ansi": {
             "version": "6.0.1",
             "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -28271,7 +11707,6 @@
             "version": "4.4.1",
             "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
             "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-            "devOptional": true,
             "requires": {
                 "punycode": "^2.1.0"
             }
@@ -28533,19 +11968,63 @@
             "integrity": "sha512-RyVaOhSem0v4v645zAkdi1mgZjuD3KMQr11KrEZGFupoHzV2qn/sBpEDvplR9i57YnRxZ3KDnKqw/1rx2CkOZA==",
             "dev": true,
             "requires": {
-                "@vue/runtime-core": "latest",
-                "@vue/runtime-dom": "latest",
+                "@vue/runtime-core": "^3.2.37",
+                "@vue/runtime-dom": "^3.2.37",
                 "csstype": "3.0.10",
-                "lodash": "latest",
+                "lodash": "^4.17.21",
                 "nanoid": "3.1.31"
             },
             "dependencies": {
+                "@vue/reactivity": {
+                    "version": "3.2.37",
+                    "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz",
+                    "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==",
+                    "dev": true,
+                    "requires": {
+                        "@vue/shared": "3.2.37"
+                    }
+                },
+                "@vue/runtime-core": {
+                    "version": "3.2.37",
+                    "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz",
+                    "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==",
+                    "dev": true,
+                    "requires": {
+                        "@vue/reactivity": "3.2.37",
+                        "@vue/shared": "3.2.37"
+                    }
+                },
+                "@vue/runtime-dom": {
+                    "version": "3.2.37",
+                    "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz",
+                    "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==",
+                    "dev": true,
+                    "requires": {
+                        "@vue/runtime-core": "3.2.37",
+                        "@vue/shared": "3.2.37",
+                        "csstype": "^2.6.8"
+                    },
+                    "dependencies": {
+                        "csstype": {
+                            "version": "2.6.20",
+                            "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
+                            "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
+                            "dev": true
+                        }
+                    }
+                },
                 "csstype": {
                     "version": "3.0.10",
                     "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
                     "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==",
                     "dev": true
                 },
+                "lodash": {
+                    "version": "4.17.21",
+                    "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+                    "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+                    "dev": true
+                },
                 "nanoid": {
                     "version": "3.1.31",
                     "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz",
@@ -28785,7 +12264,6 @@
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
             "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-            "devOptional": true,
             "requires": {
                 "isexe": "^2.0.0"
             }
diff --git a/package.json b/package.json
index 981ca191..4b964922 100644
--- a/package.json
+++ b/package.json
@@ -63,7 +63,7 @@
     "dependencies": {
         "@louislam/sqlite3": "~15.0.6",
         "args-parser": "~1.3.0",
-        "axios": "~0.26.1",
+        "axios": "~0.27.0",
         "axios-ntlm": "^1.3.0",
         "badge-maker": "^3.3.1",
         "bcryptjs": "~2.4.3",
diff --git a/server/notification-providers/goalert.js b/server/notification-providers/goalert.js
index dce83941..75e309db 100644
--- a/server/notification-providers/goalert.js
+++ b/server/notification-providers/goalert.js
@@ -8,23 +8,26 @@ class GoAlert extends NotificationProvider {
 
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
-        let closeAction = "close";
-        let parameters = {
-            token: notification.goAlertToken,
-            summary: msg,
-        };
-        // if (heartbeatJSON["status"] === UP) {
-        //     parameters["action"] = closeAction;
-        // }
         try {
-            await axios.post(`${notification.goAlertBaseURL}/api/v2/generic/incoming`, {
-                params: parameters,
-            });
+            let closeAction = "close";
+            let data = {
+                summary: msg,
+            };
+            if (heartbeatJSON != null && heartbeatJSON["status"] === UP) {
+                data["action"] = closeAction;
+            }
+            let headers = {
+                'Content-Type': 'multipart/form-data',
+            };
+            let config = {
+                headers: headers
+            };
+            let resp = await axios.post(`${notification.goAlertBaseURL}/api/v2/generic/incoming?token=${notification.goAlertToken}`, data, config);
+            console.log(resp);
             return okMsg;
 
         } catch (error) {
             let msg = (error.response.data) ? error.response.data : "Error without response";
-            console.log(error)
             throw new Error(msg);
         }
     }

From 584d52517a114c16163ed333c72e8138b0b4bc7f Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Wed, 24 Aug 2022 10:41:42 +0430
Subject: [PATCH 093/803] [Linter] fixing quotes with doublequote

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

diff --git a/server/notification-providers/goalert.js b/server/notification-providers/goalert.js
index 75e309db..bcb1843c 100644
--- a/server/notification-providers/goalert.js
+++ b/server/notification-providers/goalert.js
@@ -17,7 +17,7 @@ class GoAlert extends NotificationProvider {
                 data["action"] = closeAction;
             }
             let headers = {
-                'Content-Type': 'multipart/form-data',
+                "Content-Type": "multipart/form-data",
             };
             let config = {
                 headers: headers

From 3c5c49c16dd99ef3217970f975ce7d135e6194c9 Mon Sep 17 00:00:00 2001
From: Yoswaris Lawpaiboon <22832362+kiznick@users.noreply.github.com>
Date: Fri, 26 Aug 2022 00:57:44 +0700
Subject: [PATCH 094/803] Update th-TH.js

---
 src/languages/th-TH.js | 1100 +++++++++++++++++++++-------------------
 1 file changed, 579 insertions(+), 521 deletions(-)

diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
index 92c4eb80..e1df4085 100644
--- a/src/languages/th-TH.js
+++ b/src/languages/th-TH.js
@@ -1,522 +1,580 @@
 export default {
-    languageName: "ไทย",
-    checkEverySecond: "ตรวจสอบทุก {0} วินาที",
-    retryCheckEverySecond: "ลองใหม่ทุก {0} วินาที",
-    retriesDescription: "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
-    ignoreTLSError: "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
-    upsideDownModeDescription: "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
-    maxRedirectDescription: "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั่งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
-    acceptedStatusCodesDescription: "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
-    passwordNotMatchMsg: "รหัสผ่านไม่ตรงกัน",
-    notificationDescription: "การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้",
-    keywordDescription: "ค้นหาคำสำคัญใน HTML หรือ JSON ของการตอบกลับ, คำสำคัญต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่",
-    pauseDashboardHome: "หยุดชั่วคราว",
-    deleteMonitorMsg: "คุณแน่ใจหรือไม่ที่จะลบมอนิเตอร์?",
-    deleteNotificationMsg: "คุณแน่ใจหรือไม่ที่จะลบการแจ้งเตือนสำหรับมอนิเตอร์ทั้งหมด?",
-    resolverserverDescription: "Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา",
-    rrtypeDescription: "เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์",
-    pauseMonitorMsg: "คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?",
-    enableDefaultNotificationDescription: "การแจ้งเตือนนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
-    clearEventsMsg: "คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?",
-    clearHeartbeatsMsg: "คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?",
-    confirmClearStatisticsMsg: "คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?",
-    importHandleDescription: "เลือก \"ข้ามรายการที่มีอยู่แล้ว\" ถ้าคุณต้องการข้ามทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน, \"เขียนทับ\" จะลบทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน",
-    confirmImportMsg: "คุณแน่ใจหรือไม่ที่จะนำเข้าข้อมูลสำรอง, กรุณาตรวจสอบว่าคุณเลือกข้อมูลที่ถูกต้อง",
-    twoFAVerifyLabel: "โปรดกรอกกุญแจ 2FA ของคุณเพื่อยืนยัน:",
-    tokenValidSettingsMsg: "กุญแจถูกต้อง, ตอนนี้คุณสามารถบันทึกการตั้งค่า 2FA ของคุณได้แล้ว",
-    confirmEnableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะเปิดใช้งาน 2FA?",
-    confirmDisableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะปิดใช้งาน 2FA?",
-    Settings: "การตั้งค่า",
-    Dashboard: "แผงควบคุม",
-    "New Update": "อัพเดทใหม่",
-    Language: "ภาษา",
-    Appearance: "รูปร่าง",
-    Theme: "หน้าตา",
-    General: "ทั่วไป",
-    "Primary Base URL": "URL หลัก",
-    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: "จำนวนครั้งที่จะลองใหม่",
-    "Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
-    Advanced: "ขั้นสูง",
-    "Upside Down Mode": "โหมดกลับด้าน",
-    "Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด",
-    "Accepted Status Codes": "รหัสสถานะที่ยอมรับ",
-    "Push URL": "URL เป้าหมาย",
-    needPushEvery: "คุณควรเรียก URL นี้ทุก {0} วินาที",
-    pushOptionalParams: "ตัวแปรเสริม: {0}",
-    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": "เปิดใช้งานการตรวจสอบสิทธิ์",
-    "disableauth.message1": "คุณต้องการที่จะ <strong>ปิดใช้งานระบบรับรองความถูกต้องใช่หรือไม่</strong>?",
-    "disableauth.message2": "ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่น ๆ",
-    "Please use this option carefully!": "โปรดใช้ความระมัดระวังในการเลือกใช้งานระบบนี้ !",
-    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": "ประเภท DNS Record",
-    "Last Result": "ผลล่าสุด",
-    "Create your admin account": "สร้างบัญชีผู้ดูแลระบบ",
-    "Repeat Password": "ยืนยันรหัสผ่าน",
-    "Import Backup": "นำเข้าข้อมูลสำรอง",
-    "Export Backup": "ส่งออกข้อมูลสำรอง",
-    Export: "ส่งออก",
-    Import: "นำเข้า",
-    respTime: "ระยะเวลาการตอบสนอง (ms)",
-    notAvailableShort: "ไม่สามารถใช้งานได้",
-    "Default enabled": "เปิดใช้งานโดยค่าเริ่มต้น",
-    "Apply on all existing monitors": "ใช้กับมอนิเตอร์ทั้งหมด",
-    Create: "สร้าง",
-    "Clear Data": "ล้างข้อมูล",
-    Events: "เหตุการณ์",
-    Heartbeats: "ประวัติการตรวจสอบ",
-    "Auto Get": "ดึงอัตโนมัติ",
-    backupDescription: "คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดได้ในไฟล์ JSON",
-    backupDescription2: "หมายเหตุ : ประวัติและข้อมูลกิจกรรมจะไม่ถูกสำรอง",
-    backupDescription3: "ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย",
-    alertNoFile: "กรุณาเลือกไฟล์ที่จะใช้งาน",
-    alertWrongFileType: "กรุณาเลือกไฟล์ที่เป็น JSON",
-    "Clear all statistics": "ล้างข้อมูลสถิติทั้งหมด",
-    "Skip existing": "ข้ามรายการที่มีอยู่แล้ว",
-    Overwrite: "เขียนทับ",
-    Options: "ตัวเลือก",
-    "Keep both": "เก็บทั้งสอง",
-    "Verify Token": "ยืนยันกุญแจ",
-    "Setup 2FA": "ติดตั้ง 2FA",
-    "Enable 2FA": "เปิดใช้งาน 2FA",
-    "Disable 2FA": "ปิดใช้งาน 2FA",
-    "2FA Settings": "ตั้งค่า 2FA",
-    "Two Factor Authentication": "การตรวจสอบสิทธิ์สองปัจจัย",
-    Active: "ใช้งาน",
-    Inactive: "ไม่ใช้งาน",
-    Token: "กุญแจ",
-    "Show URI": "แสดง URI",
-    Tags: "แท็ก",
-    "Add New below or Select...": "เพิ่มใหม่ด้านล่างหรือเลือก...",
-    "Tag with this name already exist.": "แท็กที่มีชื่อนี้มีอยู่แล้ว",
-    "Tag with this value already exist.": "แท็กที่มีข้อมูลนี้มีอยู่แล้ว",
-    color: "สี",
-    "value (optional)": "ข้อมูล (ไม่จำเป็น)",
-    Gray: "เทา",
-    Red: "แดง",
-    Orange: "ส้ม",
-    Green: "เขียว",
-    Blue: "น้ำเงิน",
-    Indigo: "ม่วง",
-    Purple: "ม่วง",
-    Pink: "ชมพู",
-    "Search...": "ค้นหา...",
-    "Avg. Ping": "ค่า Ping เฉลี่ย",
-    "Avg. Response": "ค่า Response เฉลี่ย",
-    "Entry Page": "หน้าต้อนรับ",
-    statusPageNothing: "ไม่มีอะไรตรงนี้ !, กรุณาเพิ่มกลุ่มหรือมอนิเตอร์",
-    "No Services": "ไม่มีบริการ",
-    "All Systems Operational": "บริการทั้งหมดทำงานได้ปกติ",
-    "Partially Degraded Service": "บริการมีปัญหาบางส่วน",
-    "Degraded Service": "บริการมีปัญหา",
-    "Add Group": "เพิ่มกลุ่ม",
-    "Add a monitor": "เพิ่มมอนิเตอร์",
-    "Edit Status Page": "แก้ไขหน้าสถานะ",
-    "Go to Dashboard": "ไปที่หน้าควบคุม",
-    "Status Page": "หน้าสถานะ",
-    "Status Pages": "หน้าสถานะ",
-    defaultNotificationName: "การแจ้งเตือน {notification} ของฉัน ({number})",
-    here: "ที่นี่",
-    Required: "ต้องการ",
-    telegram: "Telegram",
-    "Bot Token": "กุญแจของบอท",
-    wayToGetTelegramToken: "คุณสามารถรับกุญแจได้จาก {0}.",
-    "Chat ID": "ไอดีแชท",
-    supportTelegramChatID: "รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท",
-    wayToGetTelegramChatID: "คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :",
-    "YOUR BOT TOKEN HERE": "กุญแจของบอทของคุณที่นี่",
-    chatIDNotFound: "ไม่พบไอดีแชท, กรุณาส่งข้อความไปที่บอท",
-    webhook: "Webhook",
-    "Post URL": "URL โพสต์",
-    "Content Type": "ประเภทเนื้อหา",
-    webhookJsonDesc: "{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js",
-    webhookFormDataDesc: "{multipart} ดีสำหรับ PHP, JSON จะต้องถูกประมวลผลด้วย {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignore TLS Error",
-    "From Email": "From Email",
-    emailCustomSubject: "Custom Subject",
-    "To Email": "To Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "ชื่อบอท",
-    "Prefix Custom Message": "คำนำหน้าข้อความที่กำหนดเอง",
-    "Hello @everyone is...": "สวัสดี {'@'}everyone นี่...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}",
-    signal: "Signal",
-    Number: "หมายเลข",
-    Recipients: "ผู้รับ",
-    needSignalAPI: "คุณต้องมี Signal Client ที่มี Rest APIl",
-    wayToCheckSignalURL: "คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :",
-    signalImportant: "สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!",
-    gotify: "Gotify",
-    "Application Token": "กุญแจของแอพพลิเคชั่น",
-    "Server URL": "Server URL",
-    Priority: "ลำดับความสำคัญ",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "ชื่อห้อง",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}",
-    aboutChannelName: "ใส่ชื่อห้องบน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ",
-    aboutKumaURL: "ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github",
-    emojiCheatSheet: "ตาราง Emoji : {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "กุญแจผู้ใช้งาน",
-    Device: "อุปกรณ์",
-    "Message Title": "หัวข้อข้อความ",
-    "Notification Sound": "เสียงแจ้งเตือน",
-    "More info on:": "ข้อมูลเพิ่มเติม : {0}",
-    pushoverDesc1: "ลำดับความสำตคญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง",
-    pushoverDesc2: "ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่น ๆ สามารถกำหนดได้ที่ช่องอุปกรณ์",
-    "SMS Type": "ประเภท SMS",
-    octopushTypePremium: "พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)",
-    octopushTypeLowCost: "ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)",
-    checkPrice: "ตรวจสอบราคาของ {0} :",
-    apiCredentials: "ข้อมูลการตรวจสอบสิทธิ์ API",
-    octopushLegacyHint: "คุณใช้เวอร์ชันดั้งเดิมของ Octopush (2011 - 2020) หรือเวอร์ชันใหม่หรือไม่?",
-    "Check octopush prices": "ตรวจสอบราคาของ Octopush {0}",
-    octopushPhoneNumber: "หมายเลขโทรศัพท์ (รูปแบบสากล เช่น +33612345678) ",
-    octopushSMSSender: "ชื่อผู้ส่ง SMS : ความยาว 3 - 11 ตัวอักษร, ตัวเลข และช่องว่าง (a-zA-Z0-9 )",
-    "LunaSea Device ID": "ไอดีอุปกรณ์ LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "ตัวอย่าง : {0}",
-    "Read more:": "อ่านเพิ่มเติม : {0}",
-    "Status:": "สถานะ : {0}",
-    "Read more": "อ่านเพิ่มเติม",
-    appriseInstalled: "Apprise ถูกติดตั่งแล้ว",
-    appriseNotInstalled: "Apprise ยังไม่ถูกติดตั่ง {0}",
-    "Access Token": "กุญแจการเข้าถึง",
-    "Channel access token": "กุญแจการเข้าถึงของช่อง",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "การตั้งค่าพื้นฐาน",
-    "User ID": "ไอดีผู้ใช้",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "คุณสามารถระบุลิงก์ไปยังรูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
-    aboutMattermostChannelName: "คุณลบล้างช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับโปแลนด์",
-    promosmsTypeFlash: "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับโปแลนด์",
-    promosmsTypeFull: "SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน",
-    promosmsTypeSpeed: "SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)",
-    promosmsPhoneNumber: "หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)",
-    promosmsSMSSender: "ชื่อผู้ส่ง SMS : ชื่อที่ลงทะเบียนล่วงหน้าหรือหนึ่งในค่าเริ่มต้น: InfoSMS, ข้อมูล SMS, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)",
-    "Internal Room Id": "รหัสห้องภายใน",
-    matrixDesc1: "คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.",
-    matrixDesc2: "ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วมได้อย่างเต็มที่ ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}",
-    Method: "วิธี",
-    Body: "เนื้อหา",
-    Headers: "ส่วนหัว",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง :",
-    BodyInvalidFormat: "เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ",
-    "Monitor History": "ประวัติมอนิเตอร์",
-    clearDataOlderThan: "เก็บข้อมูลมอนิเตอร์ {0} วัน",
-    PasswordsDoNotMatch: "รหัสผ่านไม่ตรงกัน",
-    records: "บันทึก",
-    "One record": "หนึ่งบันทึก",
-    steamApiKeyDescription: "สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถรสมัครได้จากที่นี่ : ",
-    "Current User": "ผู้ใช้ปัจจุบัน",
-    topic: "หัวข้อ",
-    topicExplanation: "MQTT หัวข้อที่จะมอนิเตอร์",
-    successMessage: "ข้อความที่จะถือว่าประสบความสำเร็จ",
-    successMessageExplanation: "MQTT ข้อความที่จะถือว่าประสบความสำเร็จ",
-    recent: "ล่าสุด",
-    Done: "สำเร็จ",
-    Info: "ข้อมูล",
-    Security: "ความปลอดภัย",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "ย่อฐานข้อมูล",
-    "Pick a RR-Type...": "เลือกชนิด DNS Record",
-    "Pick Accepted Status Codes...": "เลือกสถานะที่ยอมรับ...",
-    Default: "ค่าเริ่มต้น",
-    "HTTP Options": "ตัวเลือก HTTP",
-    "Create Incident": "สร้างเหตุการณ์",
-    Title: "หัวข้อ",
-    Content: "เนื้อหา",
-    Style: "สไตล์",
-    info: "ข้อมูล",
-    warning: "แจ้งเตือน",
-    danger: "อันตราย",
-    primary: "หลัก",
-    light: "สว่าง",
-    dark: "มืด",
-    Post: "โพสต์",
-    "Please input title and content": "กรุณาใส่ชื่อและเนื้อหา",
-    Created: "สร้าง",
-    "Last Updated": "อัพเดทล่าสุด",
-    Unpin: "เลิกตรึง",
-    "Switch to Light Theme": "เปลี่ยนเป็นแบบสว่าง",
-    "Switch to Dark Theme": "เปลี่ยนเป็นแบบมืด",
-    "Show Tags": "แสดงแท็ก",
-    "Hide Tags": "ซ่อนแท็ก",
-    Description: "รายละเอียด",
-    "No monitors available.": "ไม่มีมอนิเตอร์ที่สามารถใช้งานได้",
-    "Add one": "เพิ่ม",
-    "No Monitors": "ไม่มีมอนิเตอร์",
-    "Untitled Group": "กลุ่มที่ไม่มีชื่อ",
-    Services: "บริการ",
-    Discard: "ทิ้ง",
-    Cancel: "ยกเลิก",
-    "Powered by": "ขับเคลื่อนโดย",
-    shrinkDatabaseDescription: "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจาก 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Password",
-    serwersmsPhoneNumber: "หมายเลขโทรศัพท์",
-    serwersmsSenderName: "ชื่อผู้ส่ง SMS (ลงทะเบียนผ่านหน้าควบคุม)",
-    stackfield: "Stackfield",
-    Customize: "ปรับแต่ง",
-    "Custom Footer": "ส่วนท้ายที่กำหนดเอง",
-    "Custom CSS": "CSS ที่กำหนดเอง",
-    smtpDkimSettings: "ตั้งค่า DKIM",
-    smtpDkimDesc: "โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน",
-    documentation: "เอกสาร",
-    smtpDkimDomain: "ชื่อโดเมน",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "อัลกอริทึมแฮช (ไม่บังคับ)",
-    smtpDkimheaderFieldNames: "คีย์ส่วนหัวเพื่อลงชื่อ (ไม่บังคับ)",
-    smtpDkimskipFields: "Header Keys ไม่ต้องเซ็น (ไม่บังคับ)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "กุญแจ API",
-    alertaAlertState: "แจ้งเตือนสถานะ",
-    alertaRecoverState: "กู้คืนสถานะ",
-    deleteStatusPageMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้",
-    Proxies: "พร็อกซี",
-    default: "ค่าเริ่มต้น",
-    enabled: "เปิดใช้งาน",
-    setAsDefault: "ตั่งเป็นค่าเริ่มต้น",
-    deleteProxyMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?",
-    proxyDescription: "พร็อกซีจะต้องตั้งค่าให้มอนิเตอร์เพื่อให้ใช้งานได้",
-    enableProxyDescription: "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้โดยสถานะการเปิดใช้งาน",
-    setAsDefaultProxyDescription: "พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
-    "Certificate Chain": "ห่วงโซ่ใบรับรอง",
-    Valid: "ถูกต้อง",
-    Invalid: "ไม่ถูกต้อง",
-    AccessKeyId: "กุญแจสิทธิ ID",
-    SecretAccessKey: "กุญแจสิทธิ Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "รหัสเทมเพลต",
-    SignName: "ป้ายชื่อ",
-    "Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
-    "Device Token": "Device Token",
-    Platform: "แพลตฟอร์ม",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "สูง",
-    Retry: "ลองใหม่",
-    Topic: "หัวข้อ",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "ติดตั้งพร็อกซี่",
-    "Proxy Protocol": "โปรโตคอลพร็อกซี่",
-    "Proxy Server": "พร็อกซีเซิร์ฟ",
-    "Proxy server has authentication": "พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์",
-    User: "ผู้ใช้",
-    Installed: "ติดตั้งแล้ว",
-    "Not installed": "ไม่ได้ติดตั้ง",
-    Running: "กำลังทำงาน",
-    "Not running": "ไม่ได้ทำงาน",
-    "Remove Token": "ลบกุญแจ",
-    Start: "เริ่ม",
-    Stop: "หยุด",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "เพิ่มหน้าสถานะใหม่",
-    Slug: "ชื่อ",
-    "Accept characters:": "ตัวอักษรที่ใช้งานได้ :",
-    startOrEndWithOnly: "เริ่มหรือจบด้วย {0} เท่านั้น",
-    "No consecutive dashes": "ไม่มีขีดกลางติดต่อกัน",
-    Next: "ต่อไป",
-    "The slug is already taken. Please choose another slug.": "ชื่อนี้ถูกใช้งานไปแล้ว กรุณาใช้ชื่ออื่น",
-    "No Proxy": "ไม่มีพร็อกซี่",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "หน้าสถานะใหม่",
-    "Page Not Found": "ไม่พบหน้านี้",
-    "Reverse Proxy": "พร็อกซีย้อนกลับ",
-    Backup: "สำรอง",
-    About: "เกี่ยวกับ",
-    wayToGetCloudflaredURL: "(ดาวโหลด cloudflared จาก {0})",
-    cloudflareWebsite: "เว็บไซต์ Cloudflare",
-    "Message:": "ข้อความ :",
-    "Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน",
-    "Other Software": "ซอฟต์แวร์อื่น ๆ ",
-    "For example: nginx, Apache and Traefik.": "เช่น: nginx, Apache และ Traefik",
-    "Please read": "กรุณาอ่าน",
-    "Subject:": "เรื่อง :",
-    "Valid To:": "ถูกต้องถึง :",
-    "Days Remaining:": "จำนวนวันที่เหลือ :",
-    "Issuer:": "ผู้ออก :",
-    "Fingerprint:": "ลายนิ้วมือ :",
-    "No status pages": "ไม่มีหน้าสถานะ",
-    "Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุโดเมน",
-    Proxy: "Proxy",
-    "Date Created": "วันที่สร้าง",
-    onebotHttpAddress: "ที่อยู่ HTTP OneBot ",
-    onebotMessageType: "ชนิดข้อความ OneBot",
-    onebotGroupMessage: "กลุ่ม",
-    onebotPrivateMessage: "ส่วนตัว",
-    onebotUserOrGroupId: "กลุ่ม / ไอดีผู้ใช้",
-    onebotSafetyTips: "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
-    "PushDeer Key": "กุญแจ PushDeer",
-    "Footer Text": "ข้อความส่วนท้าย",
-    "Show Powered By": "แสดงข้อความ \"ขับเคลื่อนโดย\"",
-    "Domain Names": "Domain Names",
-    signedInDisp: "เข้าใช้งานในฐานะ {0}",
-    signedInDispDisabled: "ปิดการตรวจสอบสิทธิ์",
-    "Certificate Expiry Notification": "แจ้งเตือนการรับรองหมดอายุ",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "หมายเลขผู้รับ",
-    "From Name/Number": "จาก ชื่อ / หมายเลข",
-    "Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" จากข้อมูลรับรอง HTTP API ในแผงควบคุม",
-    octopushLogin: "\"Login\" จากข้อมูลรับรอง HTTP API ในแผงควบคุม",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Device token",
-    "Show update if available": "แสดงการอัปเดตถ้ามี",
-    "Also check beta release": "ตรวจสอบรุ่นเบต้า",
-    "Using a Reverse Proxy?": "ใช้ Reverse Proxy?",
-    "Check how to config it for WebSocket": "ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "สาเหตุที่เป็นไปได้มากที่สุด :",
-    "The resource is no longer available.": "ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป",
-    "There might be a typing error in the address.": "อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่",
-    "What you can try:": "สิ่งที่คุณสามารถลอง :",
-    "Retype the address.": "พิมพ์ที่อยู่อีกครั้ง",
-    "Go back to the previous page.": "กลับไปที่หน้าก่อนหน้า",
-    "Coming Soon": "เร็ว ๆ นี้",
-    wayToGetClickSendSMSToken: "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
-    wayToGetLineNotifyToken: "คุณสามารถรับ access token ได้จาก {0}",
-};
+  languageName: 'ไทย',
+  checkEverySecond: 'ตรวจสอบทุก {0} วินาที',
+  retryCheckEverySecond: 'ลองใหม่ทุก {0} วินาที',
+  retriesDescription: 'จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน',
+  ignoreTLSError: 'ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS',
+  upsideDownModeDescription: 'กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้',
+  maxRedirectDescription: 'จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั่งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง',
+  acceptedStatusCodesDescription: 'เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ',
+  passwordNotMatchMsg: 'รหัสผ่านไม่ตรงกัน',
+  notificationDescription: 'การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้',
+  keywordDescription: 'ค้นหาคำสำคัญใน HTML หรือ JSON ของการตอบกลับ, คำสำคัญต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่',
+  pauseDashboardHome: 'หยุดชั่วคราว',
+  deleteMonitorMsg: 'คุณแน่ใจหรือไม่ที่จะลบมอนิเตอร์?',
+  deleteNotificationMsg: 'คุณแน่ใจหรือไม่ที่จะลบการแจ้งเตือนสำหรับมอนิเตอร์ทั้งหมด?',
+  resolverserverDescription: 'Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา',
+  rrtypeDescription: 'เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์',
+  pauseMonitorMsg: 'คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?',
+  enableDefaultNotificationDescription: 'การแจ้งเตือนนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้',
+  clearEventsMsg: 'คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?',
+  clearHeartbeatsMsg: 'คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?',
+  confirmClearStatisticsMsg: 'คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?',
+  importHandleDescription: 'เลือก "ข้ามรายการที่มีอยู่แล้ว" ถ้าคุณต้องการข้ามทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน, "เขียนทับ" จะลบทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน',
+  confirmImportMsg: 'คุณแน่ใจหรือไม่ที่จะนำเข้าข้อมูลสำรอง, กรุณาตรวจสอบว่าคุณเลือกข้อมูลที่ถูกต้อง',
+  twoFAVerifyLabel: 'โปรดกรอกกุญแจ 2FA ของคุณเพื่อยืนยัน:',
+  tokenValidSettingsMsg: 'กุญแจถูกต้อง, ตอนนี้คุณสามารถบันทึกการตั้งค่า 2FA ของคุณได้แล้ว',
+  confirmEnableTwoFAMsg: 'คุณแน่ใจหรือไม่ที่จะเปิดใช้งาน 2FA?',
+  confirmDisableTwoFAMsg: 'คุณแน่ใจหรือไม่ที่จะปิดใช้งาน 2FA?',
+  Settings: 'การตั้งค่า',
+  Dashboard: 'แผงควบคุม',
+  'New Update': 'อัพเดทใหม่',
+  Language: 'ภาษา',
+  Appearance: 'รูปร่าง',
+  Theme: 'หน้าตา',
+  General: 'ทั่วไป',
+  'Primary Base URL': 'URL หลัก',
+  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: 'จำนวนครั้งที่จะลองใหม่',
+  'Heartbeat Retry Interval': 'ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ',
+  Advanced: 'ขั้นสูง',
+  'Upside Down Mode': 'โหมดกลับด้าน',
+  'Max. Redirects': 'จำนวนการเปลี่ยนเส้นทางสูงสุด',
+  'Accepted Status Codes': 'รหัสสถานะที่ยอมรับ',
+  'Push URL': 'URL เป้าหมาย',
+  needPushEvery: 'คุณควรเรียก URL นี้ทุก {0} วินาที',
+  pushOptionalParams: 'ตัวแปรเสริม: {0}',
+  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': 'เปิดใช้งานการตรวจสอบสิทธิ์',
+  'disableauth.message1': 'คุณต้องการที่จะ <strong>ปิดใช้งานระบบรับรองความถูกต้องใช่หรือไม่</strong>?',
+  'disableauth.message2': 'ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่น ๆ',
+  'Please use this option carefully!': 'โปรดใช้ความระมัดระวังในการเลือกใช้งานระบบนี้ !',
+  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': 'ประเภท DNS Record',
+  'Last Result': 'ผลล่าสุด',
+  'Create your admin account': 'สร้างบัญชีผู้ดูแลระบบ',
+  'Repeat Password': 'ยืนยันรหัสผ่าน',
+  'Import Backup': 'นำเข้าข้อมูลสำรอง',
+  'Export Backup': 'ส่งออกข้อมูลสำรอง',
+  Export: 'ส่งออก',
+  Import: 'นำเข้า',
+  respTime: 'ระยะเวลาการตอบสนอง (ms)',
+  notAvailableShort: 'ไม่สามารถใช้งานได้',
+  'Default enabled': 'เปิดใช้งานโดยค่าเริ่มต้น',
+  'Apply on all existing monitors': 'ใช้กับมอนิเตอร์ทั้งหมด',
+  Create: 'สร้าง',
+  'Clear Data': 'ล้างข้อมูล',
+  Events: 'เหตุการณ์',
+  Heartbeats: 'ประวัติการตรวจสอบ',
+  'Auto Get': 'ดึงอัตโนมัติ',
+  backupDescription: 'คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดได้ในไฟล์ JSON',
+  backupDescription2: 'หมายเหตุ : ประวัติและข้อมูลกิจกรรมจะไม่ถูกสำรอง',
+  backupDescription3: 'ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย',
+  alertNoFile: 'กรุณาเลือกไฟล์ที่จะใช้งาน',
+  alertWrongFileType: 'กรุณาเลือกไฟล์ที่เป็น JSON',
+  'Clear all statistics': 'ล้างข้อมูลสถิติทั้งหมด',
+  'Skip existing': 'ข้ามรายการที่มีอยู่แล้ว',
+  Overwrite: 'เขียนทับ',
+  Options: 'ตัวเลือก',
+  'Keep both': 'เก็บทั้งสอง',
+  'Verify Token': 'ยืนยันกุญแจ',
+  'Setup 2FA': 'ติดตั้ง 2FA',
+  'Enable 2FA': 'เปิดใช้งาน 2FA',
+  'Disable 2FA': 'ปิดใช้งาน 2FA',
+  '2FA Settings': 'ตั้งค่า 2FA',
+  'Two Factor Authentication': 'การตรวจสอบสิทธิ์สองปัจจัย',
+  Active: 'ใช้งาน',
+  Inactive: 'ไม่ใช้งาน',
+  Token: 'กุญแจ',
+  'Show URI': 'แสดง URI',
+  Tags: 'แท็ก',
+  'Add New below or Select...': 'เพิ่มใหม่ด้านล่างหรือเลือก...',
+  'Tag with this name already exist.': 'แท็กที่มีชื่อนี้มีอยู่แล้ว',
+  'Tag with this value already exist.': 'แท็กที่มีข้อมูลนี้มีอยู่แล้ว',
+  color: 'สี',
+  'value (optional)': 'ข้อมูล (ไม่จำเป็น)',
+  Gray: 'เทา',
+  Red: 'แดง',
+  Orange: 'ส้ม',
+  Green: 'เขียว',
+  Blue: 'น้ำเงิน',
+  Indigo: 'ม่วง',
+  Purple: 'ม่วง',
+  Pink: 'ชมพู',
+  'Search...': 'ค้นหา...',
+  'Avg. Ping': 'ค่า Ping เฉลี่ย',
+  'Avg. Response': 'ค่า Response เฉลี่ย',
+  'Entry Page': 'หน้าต้อนรับ',
+  statusPageNothing: 'ไม่มีอะไรตรงนี้ !, กรุณาเพิ่มกลุ่มหรือมอนิเตอร์',
+  'No Services': 'ไม่มีบริการ',
+  'All Systems Operational': 'บริการทั้งหมดทำงานได้ปกติ',
+  'Partially Degraded Service': 'บริการมีปัญหาบางส่วน',
+  'Degraded Service': 'บริการมีปัญหา',
+  'Add Group': 'เพิ่มกลุ่ม',
+  'Add a monitor': 'เพิ่มมอนิเตอร์',
+  'Edit Status Page': 'แก้ไขหน้าสถานะ',
+  'Go to Dashboard': 'ไปที่หน้าควบคุม',
+  'Status Page': 'หน้าสถานะ',
+  'Status Pages': 'หน้าสถานะ',
+  defaultNotificationName: 'การแจ้งเตือน {notification} ของฉัน ({number})',
+  here: 'ที่นี่',
+  Required: 'ต้องการ',
+  telegram: 'Telegram',
+  'Bot Token': 'กุญแจของบอท',
+  wayToGetTelegramToken: 'คุณสามารถรับกุญแจได้จาก {0}.',
+  'Chat ID': 'ไอดีแชท',
+  supportTelegramChatID: 'รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท',
+  wayToGetTelegramChatID: 'คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :',
+  'YOUR BOT TOKEN HERE': 'กุญแจของบอทของคุณที่นี่',
+  chatIDNotFound: 'ไม่พบไอดีแชท, กรุณาส่งข้อความไปที่บอท',
+  webhook: 'Webhook',
+  'Post URL': 'URL โพสต์',
+  'Content Type': 'ประเภทเนื้อหา',
+  webhookJsonDesc: '{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js',
+  webhookFormDataDesc: '{multipart} ดีสำหรับ PHP, JSON จะต้องถูกประมวลผลด้วย {decodeFunction}',
+  smtp: 'Email (SMTP)',
+  secureOptionNone: 'None / STARTTLS (25, 587)',
+  secureOptionTLS: 'TLS (465)',
+  'Ignore TLS Error': 'เพิกเฉยข้อผิดพลาด TLS',
+  'From Email': 'จากอีเมล',
+  emailCustomSubject: 'หัวข้อที่กำหนดเอง',
+  'To Email': 'ถึงอีเมล',
+  smtpCC: 'CC',
+  smtpBCC: 'BCC',
+  discord: 'Discord',
+  'Discord Webhook URL': 'Discord Webhook URL',
+  wayToGetDiscordURL: 'คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook',
+  'Bot Display Name': 'ชื่อบอท',
+  'Prefix Custom Message': 'คำนำหน้าข้อความที่กำหนดเอง',
+  'Hello @everyone is...': "สวัสดี {'@'}everyone นี่...",
+  teams: 'Microsoft Teams',
+  'Webhook URL': 'Webhook URL',
+  wayToGetTeamsURL: 'คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}',
+  signal: 'Signal',
+  Number: 'หมายเลข',
+  Recipients: 'ผู้รับ',
+  needSignalAPI: 'คุณต้องมี Signal Client ที่มี Rest APIl',
+  wayToCheckSignalURL: 'คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :',
+  signalImportant: 'สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!',
+  gotify: 'Gotify',
+  'Application Token': 'กุญแจของแอพพลิเคชั่น',
+  'Server URL': 'Server URL',
+  Priority: 'ลำดับความสำคัญ',
+  slack: 'Slack',
+  'Icon Emoji': 'Icon Emoji',
+  'Channel Name': 'ชื่อห้อง',
+  'Uptime Kuma URL': 'Uptime Kuma URL',
+  aboutWebhooks: 'ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}',
+  aboutChannelName: 'ใส่ชื่อห้องบน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ',
+  aboutKumaURL: 'ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github',
+  emojiCheatSheet: 'ตาราง Emoji : {0}',
+  'rocket.chat': 'Rocket.Chat',
+  pushover: 'Pushover',
+  pushy: 'Pushy',
+  PushByTechulus: 'Push by Techulus',
+  octopush: 'Octopush',
+  promosms: 'PromoSMS',
+  clicksendsms: 'ClickSend SMS',
+  lunasea: 'LunaSea',
+  apprise: 'Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)',
+  GoogleChat: 'Google Chat (Google Workspace only)',
+  pushbullet: 'Pushbullet',
+  line: 'Line Messenger',
+  mattermost: 'Mattermost',
+  'User Key': 'กุญแจผู้ใช้งาน',
+  Device: 'อุปกรณ์',
+  'Message Title': 'หัวข้อข้อความ',
+  'Notification Sound': 'เสียงแจ้งเตือน',
+  'More info on:': 'ข้อมูลเพิ่มเติม : {0}',
+  pushoverDesc1: 'ลำดับความสำตคญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง',
+  pushoverDesc2: 'ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่น ๆ สามารถกำหนดได้ที่ช่องอุปกรณ์',
+  'SMS Type': 'ประเภท SMS',
+  octopushTypePremium: 'พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)',
+  octopushTypeLowCost: 'ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)',
+  checkPrice: 'ตรวจสอบราคาของ {0} :',
+  apiCredentials: 'ข้อมูลการตรวจสอบสิทธิ์ API',
+  octopushLegacyHint: 'คุณใช้เวอร์ชันดั้งเดิมของ Octopush (2011 - 2020) หรือเวอร์ชันใหม่หรือไม่?',
+  'Check octopush prices': 'ตรวจสอบราคาของ Octopush {0}',
+  octopushPhoneNumber: 'หมายเลขโทรศัพท์ (รูปแบบสากล เช่น +33612345678) ',
+  octopushSMSSender: 'ชื่อผู้ส่ง SMS : ความยาว 3 - 11 ตัวอักษร, ตัวเลข และช่องว่าง (a-zA-Z0-9 )',
+  'LunaSea Device ID': 'ไอดีอุปกรณ์ LunaSea',
+  'Apprise URL': 'Apprise URL',
+  'Example:': 'ตัวอย่าง : {0}',
+  'Read more:': 'อ่านเพิ่มเติม : {0}',
+  'Status:': 'สถานะ : {0}',
+  'Read more': 'อ่านเพิ่มเติม',
+  appriseInstalled: 'Apprise ถูกติดตั่งแล้ว',
+  appriseNotInstalled: 'Apprise ยังไม่ถูกติดตั่ง {0}',
+  'Access Token': 'กุญแจการเข้าถึง',
+  'Channel access token': 'กุญแจการเข้าถึงของช่อง',
+  'Line Developers Console': 'Line Developers Console',
+  lineDevConsoleTo: 'Line Developers Console - {0}',
+  'Basic Settings': 'การตั้งค่าพื้นฐาน',
+  'User ID': 'ไอดีผู้ใช้',
+  'Messaging API': 'Messaging API',
+  wayToGetLineChannelToken: 'ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น',
+  'Icon URL': 'Icon URL',
+  aboutIconURL: 'คุณสามารถระบุลิงก์ไปยังรูปภาพใน "URL ไอคอน" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji',
+  aboutMattermostChannelName: 'คุณลบล้างช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง "ชื่อช่อง" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ',
+  matrix: 'Matrix',
+  promosmsTypeEco: 'SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับโปแลนด์',
+  promosmsTypeFlash: 'SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับโปแลนด์',
+  promosmsTypeFull: 'SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน',
+  promosmsTypeSpeed: 'SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)',
+  promosmsPhoneNumber: 'หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)',
+  promosmsSMSSender: 'ชื่อผู้ส่ง SMS : ชื่อที่ลงทะเบียนล่วงหน้าหรือหนึ่งในค่าเริ่มต้น: InfoSMS, ข้อมูล SMS, MaxSMS, INFO, SMS',
+  'Feishu WebHookUrl': 'Feishu WebHookURL',
+  matrixHomeserverURL: 'URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)',
+  'Internal Room Id': 'รหัสห้องภายใน',
+  matrixDesc1: 'คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.',
+  matrixDesc2: 'ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วมได้อย่างเต็มที่ ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}',
+  Method: 'วิธี',
+  Body: 'เนื้อหา',
+  Headers: 'ส่วนหัว',
+  PushUrl: 'Push URL',
+  HeadersInvalidFormat: 'เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง :',
+  BodyInvalidFormat: 'เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ',
+  'Monitor History': 'ประวัติมอนิเตอร์',
+  clearDataOlderThan: 'เก็บข้อมูลมอนิเตอร์ {0} วัน',
+  PasswordsDoNotMatch: 'รหัสผ่านไม่ตรงกัน',
+  records: 'บันทึก',
+  'One record': 'หนึ่งบันทึก',
+  steamApiKeyDescription: 'สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถรสมัครได้จากที่นี่ : ',
+  'Current User': 'ผู้ใช้ปัจจุบัน',
+  topic: 'หัวข้อ',
+  topicExplanation: 'MQTT หัวข้อที่จะมอนิเตอร์',
+  successMessage: 'ข้อความที่จะถือว่าประสบความสำเร็จ',
+  successMessageExplanation: 'MQTT ข้อความที่จะถือว่าประสบความสำเร็จ',
+  recent: 'ล่าสุด',
+  Done: 'สำเร็จ',
+  Info: 'ข้อมูล',
+  Security: 'ความปลอดภัย',
+  'Steam API Key': 'Steam API Key',
+  'Shrink Database': 'ย่อฐานข้อมูล',
+  'Pick a RR-Type...': 'เลือกชนิด DNS Record',
+  'Pick Accepted Status Codes...': 'เลือกสถานะที่ยอมรับ...',
+  Default: 'ค่าเริ่มต้น',
+  'HTTP Options': 'ตัวเลือก HTTP',
+  'Create Incident': 'สร้างเหตุการณ์',
+  Title: 'หัวข้อ',
+  Content: 'เนื้อหา',
+  Style: 'สไตล์',
+  info: 'ข้อมูล',
+  warning: 'แจ้งเตือน',
+  danger: 'อันตราย',
+  primary: 'หลัก',
+  light: 'สว่าง',
+  dark: 'มืด',
+  Post: 'โพสต์',
+  'Please input title and content': 'กรุณาใส่ชื่อและเนื้อหา',
+  Created: 'สร้าง',
+  'Last Updated': 'อัพเดทล่าสุด',
+  Unpin: 'เลิกตรึง',
+  'Switch to Light Theme': 'เปลี่ยนเป็นแบบสว่าง',
+  'Switch to Dark Theme': 'เปลี่ยนเป็นแบบมืด',
+  'Show Tags': 'แสดงแท็ก',
+  'Hide Tags': 'ซ่อนแท็ก',
+  Description: 'รายละเอียด',
+  'No monitors available.': 'ไม่มีมอนิเตอร์ที่สามารถใช้งานได้',
+  'Add one': 'เพิ่ม',
+  'No Monitors': 'ไม่มีมอนิเตอร์',
+  'Untitled Group': 'กลุ่มที่ไม่มีชื่อ',
+  Services: 'บริการ',
+  Discard: 'ทิ้ง',
+  Cancel: 'ยกเลิก',
+  'Powered by': 'ขับเคลื่อนโดย',
+  shrinkDatabaseDescription: 'ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจาก 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้',
+  serwersms: 'SerwerSMS.pl',
+  serwersmsAPIUser: 'API Username (incl. webapi_ prefix)',
+  serwersmsAPIPassword: 'API Password',
+  serwersmsPhoneNumber: 'หมายเลขโทรศัพท์',
+  serwersmsSenderName: 'ชื่อผู้ส่ง SMS (ลงทะเบียนผ่านหน้าควบคุม)',
+  stackfield: 'Stackfield',
+  Customize: 'ปรับแต่ง',
+  'Custom Footer': 'ส่วนท้ายที่กำหนดเอง',
+  'Custom CSS': 'CSS ที่กำหนดเอง',
+  smtpDkimSettings: 'ตั้งค่า DKIM',
+  smtpDkimDesc: 'โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน',
+  documentation: 'เอกสาร',
+  smtpDkimDomain: 'ชื่อโดเมน',
+  smtpDkimKeySelector: 'Key Selector',
+  smtpDkimPrivateKey: 'Private Key',
+  smtpDkimHashAlgo: 'อัลกอริทึมแฮช (ไม่บังคับ)',
+  smtpDkimheaderFieldNames: 'คีย์ส่วนหัวเพื่อลงชื่อ (ไม่บังคับ)',
+  smtpDkimskipFields: 'Header Keys ไม่ต้องเซ็น (ไม่บังคับ)',
+  gorush: 'Gorush',
+  alerta: 'Alerta',
+  alertaApiEndpoint: 'API Endpoint',
+  alertaEnvironment: 'Environment',
+  alertaApiKey: 'กุญแจ API',
+  alertaAlertState: 'แจ้งเตือนสถานะ',
+  alertaRecoverState: 'กู้คืนสถานะ',
+  deleteStatusPageMsg: 'คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้',
+  Proxies: 'พร็อกซี',
+  default: 'ค่าเริ่มต้น',
+  enabled: 'เปิดใช้งาน',
+  setAsDefault: 'ตั่งเป็นค่าเริ่มต้น',
+  deleteProxyMsg: 'คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?',
+  proxyDescription: 'พร็อกซีจะต้องตั้งค่าให้มอนิเตอร์เพื่อให้ใช้งานได้',
+  enableProxyDescription: 'พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้โดยสถานะการเปิดใช้งาน',
+  setAsDefaultProxyDescription: 'พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้',
+  'Certificate Chain': 'ห่วงโซ่ใบรับรอง',
+  Valid: 'ถูกต้อง',
+  Invalid: 'ไม่ถูกต้อง',
+  AccessKeyId: 'กุญแจสิทธิ ID',
+  SecretAccessKey: 'กุญแจสิทธิ Secret',
+  PhoneNumbers: 'PhoneNumbers',
+  TemplateCode: 'รหัสเทมเพลต',
+  SignName: 'ป้ายชื่อ',
+  'Sms template must contain parameters: ': 'เทมเพลต SMS ต้องมีพารามิเตอร์ : ',
+  'Bark Endpoint': 'Bark Endpoint',
+  WebHookUrl: 'WebHookUrl',
+  SecretKey: 'SecretKey',
+  'For safety, must use secret key': 'เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง',
+  'Device Token': 'Device Token',
+  Platform: 'แพลตฟอร์ม',
+  iOS: 'iOS',
+  Android: 'Android',
+  Huawei: 'Huawei',
+  High: 'สูง',
+  Retry: 'ลองใหม่',
+  Topic: 'หัวข้อ',
+  'WeCom Bot Key': 'WeCom Bot Key',
+  'Setup Proxy': 'ติดตั้งพร็อกซี่',
+  'Proxy Protocol': 'โปรโตคอลพร็อกซี่',
+  'Proxy Server': 'พร็อกซีเซิร์ฟ',
+  'Proxy server has authentication': 'พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์',
+  User: 'ผู้ใช้',
+  Installed: 'ติดตั้งแล้ว',
+  'Not installed': 'ไม่ได้ติดตั้ง',
+  Running: 'กำลังทำงาน',
+  'Not running': 'ไม่ได้ทำงาน',
+  'Remove Token': 'ลบกุญแจ',
+  Start: 'เริ่ม',
+  Stop: 'หยุด',
+  'Uptime Kuma': 'Uptime Kuma',
+  'Add New Status Page': 'เพิ่มหน้าสถานะใหม่',
+  Slug: 'ชื่อ',
+  'Accept characters:': 'ตัวอักษรที่ใช้งานได้ :',
+  startOrEndWithOnly: 'เริ่มหรือจบด้วย {0} เท่านั้น',
+  'No consecutive dashes': 'ไม่มีขีดกลางติดต่อกัน',
+  Next: 'ต่อไป',
+  'The slug is already taken. Please choose another slug.': 'ชื่อนี้ถูกใช้งานไปแล้ว กรุณาใช้ชื่ออื่น',
+  'No Proxy': 'ไม่มีพร็อกซี่',
+  'HTTP Basic Auth': 'HTTP Basic Auth',
+  'New Status Page': 'หน้าสถานะใหม่',
+  'Page Not Found': 'ไม่พบหน้านี้',
+  'Reverse Proxy': 'พร็อกซีย้อนกลับ',
+  Backup: 'สำรอง',
+  About: 'เกี่ยวกับ',
+  wayToGetCloudflaredURL: '(ดาวโหลด cloudflared จาก {0})',
+  cloudflareWebsite: 'เว็บไซต์ Cloudflare',
+  'Message:': 'ข้อความ :',
+  "Don't know how to get the token? Please read the guide:": 'ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ',
+  'The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.': 'การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน',
+  'Other Software': 'ซอฟต์แวร์อื่น ๆ ',
+  'For example: nginx, Apache and Traefik.': 'เช่น: nginx, Apache และ Traefik',
+  'Please read': 'กรุณาอ่าน',
+  'Subject:': 'เรื่อง :',
+  'Valid To:': 'ถูกต้องถึง :',
+  'Days Remaining:': 'จำนวนวันที่เหลือ :',
+  'Issuer:': 'ผู้ออก :',
+  'Fingerprint:': 'ลายนิ้วมือ :',
+  'No status pages': 'ไม่มีหน้าสถานะ',
+  'Domain Name Expiry Notification': 'แจ้งเตือนการหมดอายุโดเมน',
+  Proxy: 'Proxy',
+  'Date Created': 'วันที่สร้าง',
+  onebotHttpAddress: 'ที่อยู่ HTTP OneBot ',
+  onebotMessageType: 'ชนิดข้อความ OneBot',
+  onebotGroupMessage: 'กลุ่ม',
+  onebotPrivateMessage: 'ส่วนตัว',
+  onebotUserOrGroupId: 'กลุ่ม / ไอดีผู้ใช้',
+  onebotSafetyTips: 'เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง',
+  'PushDeer Key': 'กุญแจ PushDeer',
+  'Footer Text': 'ข้อความส่วนท้าย',
+  'Show Powered By': 'แสดงข้อความ "ขับเคลื่อนโดย"',
+  'Domain Names': 'Domain Names',
+  signedInDisp: 'เข้าใช้งานในฐานะ {0}',
+  signedInDispDisabled: 'ปิดการตรวจสอบสิทธิ์',
+  'Certificate Expiry Notification': 'แจ้งเตือนการรับรองหมดอายุ',
+  'API Username': 'API Username',
+  'API Key': 'API Key',
+  'Recipient Number': 'หมายเลขผู้รับ',
+  'From Name/Number': 'จาก ชื่อ / หมายเลข',
+  'Leave blank to use a shared sender number.': 'ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน',
+  'Octopush API Version': 'Octopush API Version',
+  'Legacy Octopush-DM': 'Legacy Octopush-DM',
+  endpoint: 'endpoint',
+  octopushAPIKey: '"API key" จากข้อมูลรับรอง HTTP API ในแผงควบคุม',
+  octopushLogin: '"Login" จากข้อมูลรับรอง HTTP API ในแผงควบคุม',
+  promosmsLogin: 'API Login Name',
+  promosmsPassword: 'API Password',
+  'pushoversounds pushover': 'Pushover (default)',
+  'pushoversounds bike': 'Bike',
+  'pushoversounds bugle': 'Bugle',
+  'pushoversounds cashregister': 'Cash Register',
+  'pushoversounds classical': 'Classical',
+  'pushoversounds cosmic': 'Cosmic',
+  'pushoversounds falling': 'Falling',
+  'pushoversounds gamelan': 'Gamelan',
+  'pushoversounds incoming': 'Incoming',
+  'pushoversounds intermission': 'Intermission',
+  'pushoversounds magic': 'Magic',
+  'pushoversounds mechanical': 'Mechanical',
+  'pushoversounds pianobar': 'Piano Bar',
+  'pushoversounds siren': 'Siren',
+  'pushoversounds spacealarm': 'Space Alarm',
+  'pushoversounds tugboat': 'Tug Boat',
+  'pushoversounds alien': 'Alien Alarm (long)',
+  'pushoversounds climb': 'Climb (long)',
+  'pushoversounds persistent': 'Persistent (long)',
+  'pushoversounds echo': 'Pushover Echo (long)',
+  'pushoversounds updown': 'Up Down (long)',
+  'pushoversounds vibrate': 'Vibrate Only',
+  'pushoversounds none': 'None (silent)',
+  pushyAPIKey: 'Secret API Key',
+  pushyToken: 'Device token',
+  'Show update if available': 'แสดงการอัปเดตถ้ามี',
+  'Also check beta release': 'ตรวจสอบรุ่นเบต้า',
+  'Using a Reverse Proxy?': 'ใช้ Reverse Proxy?',
+  'Check how to config it for WebSocket': 'ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket',
+  'Steam Game Server': 'Steam Game Server',
+  'Most likely causes:': 'สาเหตุที่เป็นไปได้มากที่สุด :',
+  'The resource is no longer available.': 'ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป',
+  'There might be a typing error in the address.': 'อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่',
+  'What you can try:': 'สิ่งที่คุณสามารถลอง :',
+  'Retype the address.': 'พิมพ์ที่อยู่อีกครั้ง',
+  'Go back to the previous page.': 'กลับไปที่หน้าก่อนหน้า',
+  'Coming Soon': 'เร็ว ๆ นี้',
+  wayToGetClickSendSMSToken: 'คุณสามารถรับ API Username และ API Key ได้จาก {0}',
+  wayToGetLineNotifyToken: 'คุณสามารถรับ access token ได้จาก {0}',
+  resendEveryXTimes: 'ส่งซ้ำทุก {0} ครั้ง',
+  resendDisabled: 'การส่งซ้ำถูกปิดใช้งาน',
+  dnsPortDescription: 'พอร์ตของเซิร์ฟเวอร์ DNS, ค่าเริ่มต้นคือ 53, คุณสามารถเปลี่ยนพอร์ตตอนไหนก็ได้',
+  'Resend Notification if Down X times consequently': 'ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง',
+  error: 'เกิดข้อผิดพลาด',
+  critical: 'วิกฤต',
+  wayToGetPagerDutyKey: 'คุณสามารถรับได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา "Events API V2", สำหรับข้อมูลเพิ่มเติม {0}',
+  'Integration Key': 'Integration Key',
+  'Integration URL': 'Integration URL',
+  'Auto resolve or acknowledged': 'แก้ไขอัตโนมัติหรือยอมรับ',
+  'do nothing': 'ไม่ทำอะไร',
+  'auto acknowledged': 'ยอมรับอัตโนมัติ',
+  'auto resolve': 'แก้ไขอัตโนมัติ',
+  'Bark Group': 'กลุ่มที่จะประกาศ',
+  'Bark Sound': 'เสียงประกาศ',
+  Authentication: 'การตรวจสอบสิทธิ์',
+  'HTTP Headers': 'HTTP Headers',
+  'Trust Proxy': 'Trust Proxy',
+  HomeAssistant: 'Home Assistant',
+  RadiusSecret: 'Radius Secret',
+  RadiusSecretDescription: 'แบ่งปันข้อมูลลับระหว่างผู้ใช้งานและเซิร์ฟเวอร์',
+  RadiusCalledStationId: 'Called Station Id',
+  RadiusCalledStationIdDescription: 'Identifier of the called device',
+  RadiusCallingStationId: 'Calling Station Id',
+  RadiusCallingStationIdDescription: 'Identifier of the calling device',
+  'Connection String': 'Connection String',
+  Query: 'Query',
+  settingsCertificateExpiry: 'วันหมดอายุใบรับรอง TLS',
+  certificationExpiryDescription: 'การตรวจสอบ HTTPS แจ้งเตือนใบอนุญาติ TLS จะหมดอายุใน:',
+  'Setup Docker Host': 'Setup Docker Host',
+  'Connection Type': 'ประเภทการเชื่อมต่อ',
+  'Docker Daemon': 'Docker Daemon',
+  deleteDockerHostMsg: 'คุณแน่ใจหรือไม่ที่จะลบ Docker host นี้สำหรับการมอนิเตอร์ทั้งหมด?',
+  socket: 'Socket',
+  tcp: 'TCP / HTTP',
+  'Docker Container': 'Docker Container',
+  'Container Name / ID': 'Container Name / ID',
+  'Docker Host': 'Docker Host',
+  'Docker Hosts': 'Docker Hosts',
+  'ntfy Topic': 'ntfy Topic',
+  Domain: 'โดเมน',
+  Workstation: 'Workstation',
+  disableCloudflaredNoAuthMsg: 'คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน',
+  trustProxyDescription: "เชื่อ Header 'X-Forwarded-*' ถ้าคุณต้องการไอพีที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache, คุณควรเปิดใช้งาน",
+  Examples: 'ตัวอย่าง',
+  'Home Assistant URL': 'Home Assistant URL',
+  'Long-Lived Access Token': 'Access Token แบบมีอายุ',
+  'Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ': 'Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก "Create Token"',
+  'Notification Service': 'บริการแจ้งเตือน',
+  'default: notify all devices': 'ค่าเริ่มต้น: แจ้งเตือนทุกอุปกรณ์',
+  'A list of Notification Services can be found in Home Assistant under "Developer Tools > Services" search for "notification" to find your device/phone name.': 'รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู "Developer Tools > Services" ค้นหา "notification" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์',
+  'Automations can optionally be triggered in Home Assistant:': 'สามารถเลือกสั่งงานระบบอัตโนมัติได้ใน Home Assistant:',
+  'Trigger type:': 'ชนิดสิ่งกระตุ้น:',
+  'Event type:': 'ชนิดกิจกรรม:',
+  'Event data:': 'ข้อมูลกิจกรรม:',
+  'Then choose an action, for example switch the scene to where an RGB light is red.': 'จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง',
+  'Frontend Version': 'เวอร์ชั่น Frontend',
+  'Frontend Version do not match backend version!': 'เวอร์ชั่น Frontend ไม่ตรงกับ Backend !'
+}
\ No newline at end of file

From 31150642cd55cfcdc822ebd7aa9e4462ee2d5ba9 Mon Sep 17 00:00:00 2001
From: Yoswaris Lawpaiboon <22832362+kiznick@users.noreply.github.com>
Date: Fri, 26 Aug 2022 01:08:21 +0700
Subject: [PATCH 095/803] forgot to save lol

---
 package-lock.json      |    4 +-
 src/languages/th-TH.js | 1158 ++++++++++++++++++++--------------------
 2 files changed, 581 insertions(+), 581 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 0cf62fa7..d4b7f7f7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.17.1",
+    "version": "1.18.0-beta.0",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.17.1",
+            "version": "1.18.0-beta.0",
             "license": "MIT",
             "dependencies": {
                 "@louislam/sqlite3": "~15.0.6",
diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
index e1df4085..012693e4 100644
--- a/src/languages/th-TH.js
+++ b/src/languages/th-TH.js
@@ -1,580 +1,580 @@
 export default {
-  languageName: 'ไทย',
-  checkEverySecond: 'ตรวจสอบทุก {0} วินาที',
-  retryCheckEverySecond: 'ลองใหม่ทุก {0} วินาที',
-  retriesDescription: 'จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน',
-  ignoreTLSError: 'ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS',
-  upsideDownModeDescription: 'กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้',
-  maxRedirectDescription: 'จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั่งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง',
-  acceptedStatusCodesDescription: 'เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ',
-  passwordNotMatchMsg: 'รหัสผ่านไม่ตรงกัน',
-  notificationDescription: 'การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้',
-  keywordDescription: 'ค้นหาคำสำคัญใน HTML หรือ JSON ของการตอบกลับ, คำสำคัญต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่',
-  pauseDashboardHome: 'หยุดชั่วคราว',
-  deleteMonitorMsg: 'คุณแน่ใจหรือไม่ที่จะลบมอนิเตอร์?',
-  deleteNotificationMsg: 'คุณแน่ใจหรือไม่ที่จะลบการแจ้งเตือนสำหรับมอนิเตอร์ทั้งหมด?',
-  resolverserverDescription: 'Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา',
-  rrtypeDescription: 'เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์',
-  pauseMonitorMsg: 'คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?',
-  enableDefaultNotificationDescription: 'การแจ้งเตือนนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้',
-  clearEventsMsg: 'คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?',
-  clearHeartbeatsMsg: 'คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?',
-  confirmClearStatisticsMsg: 'คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?',
-  importHandleDescription: 'เลือก "ข้ามรายการที่มีอยู่แล้ว" ถ้าคุณต้องการข้ามทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน, "เขียนทับ" จะลบทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน',
-  confirmImportMsg: 'คุณแน่ใจหรือไม่ที่จะนำเข้าข้อมูลสำรอง, กรุณาตรวจสอบว่าคุณเลือกข้อมูลที่ถูกต้อง',
-  twoFAVerifyLabel: 'โปรดกรอกกุญแจ 2FA ของคุณเพื่อยืนยัน:',
-  tokenValidSettingsMsg: 'กุญแจถูกต้อง, ตอนนี้คุณสามารถบันทึกการตั้งค่า 2FA ของคุณได้แล้ว',
-  confirmEnableTwoFAMsg: 'คุณแน่ใจหรือไม่ที่จะเปิดใช้งาน 2FA?',
-  confirmDisableTwoFAMsg: 'คุณแน่ใจหรือไม่ที่จะปิดใช้งาน 2FA?',
-  Settings: 'การตั้งค่า',
-  Dashboard: 'แผงควบคุม',
-  'New Update': 'อัพเดทใหม่',
-  Language: 'ภาษา',
-  Appearance: 'รูปร่าง',
-  Theme: 'หน้าตา',
-  General: 'ทั่วไป',
-  'Primary Base URL': 'URL หลัก',
-  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: 'จำนวนครั้งที่จะลองใหม่',
-  'Heartbeat Retry Interval': 'ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ',
-  Advanced: 'ขั้นสูง',
-  'Upside Down Mode': 'โหมดกลับด้าน',
-  'Max. Redirects': 'จำนวนการเปลี่ยนเส้นทางสูงสุด',
-  'Accepted Status Codes': 'รหัสสถานะที่ยอมรับ',
-  'Push URL': 'URL เป้าหมาย',
-  needPushEvery: 'คุณควรเรียก URL นี้ทุก {0} วินาที',
-  pushOptionalParams: 'ตัวแปรเสริม: {0}',
-  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': 'เปิดใช้งานการตรวจสอบสิทธิ์',
-  'disableauth.message1': 'คุณต้องการที่จะ <strong>ปิดใช้งานระบบรับรองความถูกต้องใช่หรือไม่</strong>?',
-  'disableauth.message2': 'ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่น ๆ',
-  'Please use this option carefully!': 'โปรดใช้ความระมัดระวังในการเลือกใช้งานระบบนี้ !',
-  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': 'ประเภท DNS Record',
-  'Last Result': 'ผลล่าสุด',
-  'Create your admin account': 'สร้างบัญชีผู้ดูแลระบบ',
-  'Repeat Password': 'ยืนยันรหัสผ่าน',
-  'Import Backup': 'นำเข้าข้อมูลสำรอง',
-  'Export Backup': 'ส่งออกข้อมูลสำรอง',
-  Export: 'ส่งออก',
-  Import: 'นำเข้า',
-  respTime: 'ระยะเวลาการตอบสนอง (ms)',
-  notAvailableShort: 'ไม่สามารถใช้งานได้',
-  'Default enabled': 'เปิดใช้งานโดยค่าเริ่มต้น',
-  'Apply on all existing monitors': 'ใช้กับมอนิเตอร์ทั้งหมด',
-  Create: 'สร้าง',
-  'Clear Data': 'ล้างข้อมูล',
-  Events: 'เหตุการณ์',
-  Heartbeats: 'ประวัติการตรวจสอบ',
-  'Auto Get': 'ดึงอัตโนมัติ',
-  backupDescription: 'คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดได้ในไฟล์ JSON',
-  backupDescription2: 'หมายเหตุ : ประวัติและข้อมูลกิจกรรมจะไม่ถูกสำรอง',
-  backupDescription3: 'ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย',
-  alertNoFile: 'กรุณาเลือกไฟล์ที่จะใช้งาน',
-  alertWrongFileType: 'กรุณาเลือกไฟล์ที่เป็น JSON',
-  'Clear all statistics': 'ล้างข้อมูลสถิติทั้งหมด',
-  'Skip existing': 'ข้ามรายการที่มีอยู่แล้ว',
-  Overwrite: 'เขียนทับ',
-  Options: 'ตัวเลือก',
-  'Keep both': 'เก็บทั้งสอง',
-  'Verify Token': 'ยืนยันกุญแจ',
-  'Setup 2FA': 'ติดตั้ง 2FA',
-  'Enable 2FA': 'เปิดใช้งาน 2FA',
-  'Disable 2FA': 'ปิดใช้งาน 2FA',
-  '2FA Settings': 'ตั้งค่า 2FA',
-  'Two Factor Authentication': 'การตรวจสอบสิทธิ์สองปัจจัย',
-  Active: 'ใช้งาน',
-  Inactive: 'ไม่ใช้งาน',
-  Token: 'กุญแจ',
-  'Show URI': 'แสดง URI',
-  Tags: 'แท็ก',
-  'Add New below or Select...': 'เพิ่มใหม่ด้านล่างหรือเลือก...',
-  'Tag with this name already exist.': 'แท็กที่มีชื่อนี้มีอยู่แล้ว',
-  'Tag with this value already exist.': 'แท็กที่มีข้อมูลนี้มีอยู่แล้ว',
-  color: 'สี',
-  'value (optional)': 'ข้อมูล (ไม่จำเป็น)',
-  Gray: 'เทา',
-  Red: 'แดง',
-  Orange: 'ส้ม',
-  Green: 'เขียว',
-  Blue: 'น้ำเงิน',
-  Indigo: 'ม่วง',
-  Purple: 'ม่วง',
-  Pink: 'ชมพู',
-  'Search...': 'ค้นหา...',
-  'Avg. Ping': 'ค่า Ping เฉลี่ย',
-  'Avg. Response': 'ค่า Response เฉลี่ย',
-  'Entry Page': 'หน้าต้อนรับ',
-  statusPageNothing: 'ไม่มีอะไรตรงนี้ !, กรุณาเพิ่มกลุ่มหรือมอนิเตอร์',
-  'No Services': 'ไม่มีบริการ',
-  'All Systems Operational': 'บริการทั้งหมดทำงานได้ปกติ',
-  'Partially Degraded Service': 'บริการมีปัญหาบางส่วน',
-  'Degraded Service': 'บริการมีปัญหา',
-  'Add Group': 'เพิ่มกลุ่ม',
-  'Add a monitor': 'เพิ่มมอนิเตอร์',
-  'Edit Status Page': 'แก้ไขหน้าสถานะ',
-  'Go to Dashboard': 'ไปที่หน้าควบคุม',
-  'Status Page': 'หน้าสถานะ',
-  'Status Pages': 'หน้าสถานะ',
-  defaultNotificationName: 'การแจ้งเตือน {notification} ของฉัน ({number})',
-  here: 'ที่นี่',
-  Required: 'ต้องการ',
-  telegram: 'Telegram',
-  'Bot Token': 'กุญแจของบอท',
-  wayToGetTelegramToken: 'คุณสามารถรับกุญแจได้จาก {0}.',
-  'Chat ID': 'ไอดีแชท',
-  supportTelegramChatID: 'รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท',
-  wayToGetTelegramChatID: 'คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :',
-  'YOUR BOT TOKEN HERE': 'กุญแจของบอทของคุณที่นี่',
-  chatIDNotFound: 'ไม่พบไอดีแชท, กรุณาส่งข้อความไปที่บอท',
-  webhook: 'Webhook',
-  'Post URL': 'URL โพสต์',
-  'Content Type': 'ประเภทเนื้อหา',
-  webhookJsonDesc: '{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js',
-  webhookFormDataDesc: '{multipart} ดีสำหรับ PHP, JSON จะต้องถูกประมวลผลด้วย {decodeFunction}',
-  smtp: 'Email (SMTP)',
-  secureOptionNone: 'None / STARTTLS (25, 587)',
-  secureOptionTLS: 'TLS (465)',
-  'Ignore TLS Error': 'เพิกเฉยข้อผิดพลาด TLS',
-  'From Email': 'จากอีเมล',
-  emailCustomSubject: 'หัวข้อที่กำหนดเอง',
-  'To Email': 'ถึงอีเมล',
-  smtpCC: 'CC',
-  smtpBCC: 'BCC',
-  discord: 'Discord',
-  'Discord Webhook URL': 'Discord Webhook URL',
-  wayToGetDiscordURL: 'คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook',
-  'Bot Display Name': 'ชื่อบอท',
-  'Prefix Custom Message': 'คำนำหน้าข้อความที่กำหนดเอง',
-  'Hello @everyone is...': "สวัสดี {'@'}everyone นี่...",
-  teams: 'Microsoft Teams',
-  'Webhook URL': 'Webhook URL',
-  wayToGetTeamsURL: 'คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}',
-  signal: 'Signal',
-  Number: 'หมายเลข',
-  Recipients: 'ผู้รับ',
-  needSignalAPI: 'คุณต้องมี Signal Client ที่มี Rest APIl',
-  wayToCheckSignalURL: 'คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :',
-  signalImportant: 'สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!',
-  gotify: 'Gotify',
-  'Application Token': 'กุญแจของแอพพลิเคชั่น',
-  'Server URL': 'Server URL',
-  Priority: 'ลำดับความสำคัญ',
-  slack: 'Slack',
-  'Icon Emoji': 'Icon Emoji',
-  'Channel Name': 'ชื่อห้อง',
-  'Uptime Kuma URL': 'Uptime Kuma URL',
-  aboutWebhooks: 'ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}',
-  aboutChannelName: 'ใส่ชื่อห้องบน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ',
-  aboutKumaURL: 'ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github',
-  emojiCheatSheet: 'ตาราง Emoji : {0}',
-  'rocket.chat': 'Rocket.Chat',
-  pushover: 'Pushover',
-  pushy: 'Pushy',
-  PushByTechulus: 'Push by Techulus',
-  octopush: 'Octopush',
-  promosms: 'PromoSMS',
-  clicksendsms: 'ClickSend SMS',
-  lunasea: 'LunaSea',
-  apprise: 'Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)',
-  GoogleChat: 'Google Chat (Google Workspace only)',
-  pushbullet: 'Pushbullet',
-  line: 'Line Messenger',
-  mattermost: 'Mattermost',
-  'User Key': 'กุญแจผู้ใช้งาน',
-  Device: 'อุปกรณ์',
-  'Message Title': 'หัวข้อข้อความ',
-  'Notification Sound': 'เสียงแจ้งเตือน',
-  'More info on:': 'ข้อมูลเพิ่มเติม : {0}',
-  pushoverDesc1: 'ลำดับความสำตคญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง',
-  pushoverDesc2: 'ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่น ๆ สามารถกำหนดได้ที่ช่องอุปกรณ์',
-  'SMS Type': 'ประเภท SMS',
-  octopushTypePremium: 'พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)',
-  octopushTypeLowCost: 'ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)',
-  checkPrice: 'ตรวจสอบราคาของ {0} :',
-  apiCredentials: 'ข้อมูลการตรวจสอบสิทธิ์ API',
-  octopushLegacyHint: 'คุณใช้เวอร์ชันดั้งเดิมของ Octopush (2011 - 2020) หรือเวอร์ชันใหม่หรือไม่?',
-  'Check octopush prices': 'ตรวจสอบราคาของ Octopush {0}',
-  octopushPhoneNumber: 'หมายเลขโทรศัพท์ (รูปแบบสากล เช่น +33612345678) ',
-  octopushSMSSender: 'ชื่อผู้ส่ง SMS : ความยาว 3 - 11 ตัวอักษร, ตัวเลข และช่องว่าง (a-zA-Z0-9 )',
-  'LunaSea Device ID': 'ไอดีอุปกรณ์ LunaSea',
-  'Apprise URL': 'Apprise URL',
-  'Example:': 'ตัวอย่าง : {0}',
-  'Read more:': 'อ่านเพิ่มเติม : {0}',
-  'Status:': 'สถานะ : {0}',
-  'Read more': 'อ่านเพิ่มเติม',
-  appriseInstalled: 'Apprise ถูกติดตั่งแล้ว',
-  appriseNotInstalled: 'Apprise ยังไม่ถูกติดตั่ง {0}',
-  'Access Token': 'กุญแจการเข้าถึง',
-  'Channel access token': 'กุญแจการเข้าถึงของช่อง',
-  'Line Developers Console': 'Line Developers Console',
-  lineDevConsoleTo: 'Line Developers Console - {0}',
-  'Basic Settings': 'การตั้งค่าพื้นฐาน',
-  'User ID': 'ไอดีผู้ใช้',
-  'Messaging API': 'Messaging API',
-  wayToGetLineChannelToken: 'ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น',
-  'Icon URL': 'Icon URL',
-  aboutIconURL: 'คุณสามารถระบุลิงก์ไปยังรูปภาพใน "URL ไอคอน" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji',
-  aboutMattermostChannelName: 'คุณลบล้างช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง "ชื่อช่อง" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ',
-  matrix: 'Matrix',
-  promosmsTypeEco: 'SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับโปแลนด์',
-  promosmsTypeFlash: 'SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับโปแลนด์',
-  promosmsTypeFull: 'SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน',
-  promosmsTypeSpeed: 'SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)',
-  promosmsPhoneNumber: 'หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)',
-  promosmsSMSSender: 'ชื่อผู้ส่ง SMS : ชื่อที่ลงทะเบียนล่วงหน้าหรือหนึ่งในค่าเริ่มต้น: InfoSMS, ข้อมูล SMS, MaxSMS, INFO, SMS',
-  'Feishu WebHookUrl': 'Feishu WebHookURL',
-  matrixHomeserverURL: 'URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)',
-  'Internal Room Id': 'รหัสห้องภายใน',
-  matrixDesc1: 'คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.',
-  matrixDesc2: 'ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วมได้อย่างเต็มที่ ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}',
-  Method: 'วิธี',
-  Body: 'เนื้อหา',
-  Headers: 'ส่วนหัว',
-  PushUrl: 'Push URL',
-  HeadersInvalidFormat: 'เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง :',
-  BodyInvalidFormat: 'เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ',
-  'Monitor History': 'ประวัติมอนิเตอร์',
-  clearDataOlderThan: 'เก็บข้อมูลมอนิเตอร์ {0} วัน',
-  PasswordsDoNotMatch: 'รหัสผ่านไม่ตรงกัน',
-  records: 'บันทึก',
-  'One record': 'หนึ่งบันทึก',
-  steamApiKeyDescription: 'สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถรสมัครได้จากที่นี่ : ',
-  'Current User': 'ผู้ใช้ปัจจุบัน',
-  topic: 'หัวข้อ',
-  topicExplanation: 'MQTT หัวข้อที่จะมอนิเตอร์',
-  successMessage: 'ข้อความที่จะถือว่าประสบความสำเร็จ',
-  successMessageExplanation: 'MQTT ข้อความที่จะถือว่าประสบความสำเร็จ',
-  recent: 'ล่าสุด',
-  Done: 'สำเร็จ',
-  Info: 'ข้อมูล',
-  Security: 'ความปลอดภัย',
-  'Steam API Key': 'Steam API Key',
-  'Shrink Database': 'ย่อฐานข้อมูล',
-  'Pick a RR-Type...': 'เลือกชนิด DNS Record',
-  'Pick Accepted Status Codes...': 'เลือกสถานะที่ยอมรับ...',
-  Default: 'ค่าเริ่มต้น',
-  'HTTP Options': 'ตัวเลือก HTTP',
-  'Create Incident': 'สร้างเหตุการณ์',
-  Title: 'หัวข้อ',
-  Content: 'เนื้อหา',
-  Style: 'สไตล์',
-  info: 'ข้อมูล',
-  warning: 'แจ้งเตือน',
-  danger: 'อันตราย',
-  primary: 'หลัก',
-  light: 'สว่าง',
-  dark: 'มืด',
-  Post: 'โพสต์',
-  'Please input title and content': 'กรุณาใส่ชื่อและเนื้อหา',
-  Created: 'สร้าง',
-  'Last Updated': 'อัพเดทล่าสุด',
-  Unpin: 'เลิกตรึง',
-  'Switch to Light Theme': 'เปลี่ยนเป็นแบบสว่าง',
-  'Switch to Dark Theme': 'เปลี่ยนเป็นแบบมืด',
-  'Show Tags': 'แสดงแท็ก',
-  'Hide Tags': 'ซ่อนแท็ก',
-  Description: 'รายละเอียด',
-  'No monitors available.': 'ไม่มีมอนิเตอร์ที่สามารถใช้งานได้',
-  'Add one': 'เพิ่ม',
-  'No Monitors': 'ไม่มีมอนิเตอร์',
-  'Untitled Group': 'กลุ่มที่ไม่มีชื่อ',
-  Services: 'บริการ',
-  Discard: 'ทิ้ง',
-  Cancel: 'ยกเลิก',
-  'Powered by': 'ขับเคลื่อนโดย',
-  shrinkDatabaseDescription: 'ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจาก 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้',
-  serwersms: 'SerwerSMS.pl',
-  serwersmsAPIUser: 'API Username (incl. webapi_ prefix)',
-  serwersmsAPIPassword: 'API Password',
-  serwersmsPhoneNumber: 'หมายเลขโทรศัพท์',
-  serwersmsSenderName: 'ชื่อผู้ส่ง SMS (ลงทะเบียนผ่านหน้าควบคุม)',
-  stackfield: 'Stackfield',
-  Customize: 'ปรับแต่ง',
-  'Custom Footer': 'ส่วนท้ายที่กำหนดเอง',
-  'Custom CSS': 'CSS ที่กำหนดเอง',
-  smtpDkimSettings: 'ตั้งค่า DKIM',
-  smtpDkimDesc: 'โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน',
-  documentation: 'เอกสาร',
-  smtpDkimDomain: 'ชื่อโดเมน',
-  smtpDkimKeySelector: 'Key Selector',
-  smtpDkimPrivateKey: 'Private Key',
-  smtpDkimHashAlgo: 'อัลกอริทึมแฮช (ไม่บังคับ)',
-  smtpDkimheaderFieldNames: 'คีย์ส่วนหัวเพื่อลงชื่อ (ไม่บังคับ)',
-  smtpDkimskipFields: 'Header Keys ไม่ต้องเซ็น (ไม่บังคับ)',
-  gorush: 'Gorush',
-  alerta: 'Alerta',
-  alertaApiEndpoint: 'API Endpoint',
-  alertaEnvironment: 'Environment',
-  alertaApiKey: 'กุญแจ API',
-  alertaAlertState: 'แจ้งเตือนสถานะ',
-  alertaRecoverState: 'กู้คืนสถานะ',
-  deleteStatusPageMsg: 'คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้',
-  Proxies: 'พร็อกซี',
-  default: 'ค่าเริ่มต้น',
-  enabled: 'เปิดใช้งาน',
-  setAsDefault: 'ตั่งเป็นค่าเริ่มต้น',
-  deleteProxyMsg: 'คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?',
-  proxyDescription: 'พร็อกซีจะต้องตั้งค่าให้มอนิเตอร์เพื่อให้ใช้งานได้',
-  enableProxyDescription: 'พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้โดยสถานะการเปิดใช้งาน',
-  setAsDefaultProxyDescription: 'พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้',
-  'Certificate Chain': 'ห่วงโซ่ใบรับรอง',
-  Valid: 'ถูกต้อง',
-  Invalid: 'ไม่ถูกต้อง',
-  AccessKeyId: 'กุญแจสิทธิ ID',
-  SecretAccessKey: 'กุญแจสิทธิ Secret',
-  PhoneNumbers: 'PhoneNumbers',
-  TemplateCode: 'รหัสเทมเพลต',
-  SignName: 'ป้ายชื่อ',
-  'Sms template must contain parameters: ': 'เทมเพลต SMS ต้องมีพารามิเตอร์ : ',
-  'Bark Endpoint': 'Bark Endpoint',
-  WebHookUrl: 'WebHookUrl',
-  SecretKey: 'SecretKey',
-  'For safety, must use secret key': 'เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง',
-  'Device Token': 'Device Token',
-  Platform: 'แพลตฟอร์ม',
-  iOS: 'iOS',
-  Android: 'Android',
-  Huawei: 'Huawei',
-  High: 'สูง',
-  Retry: 'ลองใหม่',
-  Topic: 'หัวข้อ',
-  'WeCom Bot Key': 'WeCom Bot Key',
-  'Setup Proxy': 'ติดตั้งพร็อกซี่',
-  'Proxy Protocol': 'โปรโตคอลพร็อกซี่',
-  'Proxy Server': 'พร็อกซีเซิร์ฟ',
-  'Proxy server has authentication': 'พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์',
-  User: 'ผู้ใช้',
-  Installed: 'ติดตั้งแล้ว',
-  'Not installed': 'ไม่ได้ติดตั้ง',
-  Running: 'กำลังทำงาน',
-  'Not running': 'ไม่ได้ทำงาน',
-  'Remove Token': 'ลบกุญแจ',
-  Start: 'เริ่ม',
-  Stop: 'หยุด',
-  'Uptime Kuma': 'Uptime Kuma',
-  'Add New Status Page': 'เพิ่มหน้าสถานะใหม่',
-  Slug: 'ชื่อ',
-  'Accept characters:': 'ตัวอักษรที่ใช้งานได้ :',
-  startOrEndWithOnly: 'เริ่มหรือจบด้วย {0} เท่านั้น',
-  'No consecutive dashes': 'ไม่มีขีดกลางติดต่อกัน',
-  Next: 'ต่อไป',
-  'The slug is already taken. Please choose another slug.': 'ชื่อนี้ถูกใช้งานไปแล้ว กรุณาใช้ชื่ออื่น',
-  'No Proxy': 'ไม่มีพร็อกซี่',
-  'HTTP Basic Auth': 'HTTP Basic Auth',
-  'New Status Page': 'หน้าสถานะใหม่',
-  'Page Not Found': 'ไม่พบหน้านี้',
-  'Reverse Proxy': 'พร็อกซีย้อนกลับ',
-  Backup: 'สำรอง',
-  About: 'เกี่ยวกับ',
-  wayToGetCloudflaredURL: '(ดาวโหลด cloudflared จาก {0})',
-  cloudflareWebsite: 'เว็บไซต์ Cloudflare',
-  'Message:': 'ข้อความ :',
-  "Don't know how to get the token? Please read the guide:": 'ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ',
-  'The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.': 'การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน',
-  'Other Software': 'ซอฟต์แวร์อื่น ๆ ',
-  'For example: nginx, Apache and Traefik.': 'เช่น: nginx, Apache และ Traefik',
-  'Please read': 'กรุณาอ่าน',
-  'Subject:': 'เรื่อง :',
-  'Valid To:': 'ถูกต้องถึง :',
-  'Days Remaining:': 'จำนวนวันที่เหลือ :',
-  'Issuer:': 'ผู้ออก :',
-  'Fingerprint:': 'ลายนิ้วมือ :',
-  'No status pages': 'ไม่มีหน้าสถานะ',
-  'Domain Name Expiry Notification': 'แจ้งเตือนการหมดอายุโดเมน',
-  Proxy: 'Proxy',
-  'Date Created': 'วันที่สร้าง',
-  onebotHttpAddress: 'ที่อยู่ HTTP OneBot ',
-  onebotMessageType: 'ชนิดข้อความ OneBot',
-  onebotGroupMessage: 'กลุ่ม',
-  onebotPrivateMessage: 'ส่วนตัว',
-  onebotUserOrGroupId: 'กลุ่ม / ไอดีผู้ใช้',
-  onebotSafetyTips: 'เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง',
-  'PushDeer Key': 'กุญแจ PushDeer',
-  'Footer Text': 'ข้อความส่วนท้าย',
-  'Show Powered By': 'แสดงข้อความ "ขับเคลื่อนโดย"',
-  'Domain Names': 'Domain Names',
-  signedInDisp: 'เข้าใช้งานในฐานะ {0}',
-  signedInDispDisabled: 'ปิดการตรวจสอบสิทธิ์',
-  'Certificate Expiry Notification': 'แจ้งเตือนการรับรองหมดอายุ',
-  'API Username': 'API Username',
-  'API Key': 'API Key',
-  'Recipient Number': 'หมายเลขผู้รับ',
-  'From Name/Number': 'จาก ชื่อ / หมายเลข',
-  'Leave blank to use a shared sender number.': 'ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน',
-  'Octopush API Version': 'Octopush API Version',
-  'Legacy Octopush-DM': 'Legacy Octopush-DM',
-  endpoint: 'endpoint',
-  octopushAPIKey: '"API key" จากข้อมูลรับรอง HTTP API ในแผงควบคุม',
-  octopushLogin: '"Login" จากข้อมูลรับรอง HTTP API ในแผงควบคุม',
-  promosmsLogin: 'API Login Name',
-  promosmsPassword: 'API Password',
-  'pushoversounds pushover': 'Pushover (default)',
-  'pushoversounds bike': 'Bike',
-  'pushoversounds bugle': 'Bugle',
-  'pushoversounds cashregister': 'Cash Register',
-  'pushoversounds classical': 'Classical',
-  'pushoversounds cosmic': 'Cosmic',
-  'pushoversounds falling': 'Falling',
-  'pushoversounds gamelan': 'Gamelan',
-  'pushoversounds incoming': 'Incoming',
-  'pushoversounds intermission': 'Intermission',
-  'pushoversounds magic': 'Magic',
-  'pushoversounds mechanical': 'Mechanical',
-  'pushoversounds pianobar': 'Piano Bar',
-  'pushoversounds siren': 'Siren',
-  'pushoversounds spacealarm': 'Space Alarm',
-  'pushoversounds tugboat': 'Tug Boat',
-  'pushoversounds alien': 'Alien Alarm (long)',
-  'pushoversounds climb': 'Climb (long)',
-  'pushoversounds persistent': 'Persistent (long)',
-  'pushoversounds echo': 'Pushover Echo (long)',
-  'pushoversounds updown': 'Up Down (long)',
-  'pushoversounds vibrate': 'Vibrate Only',
-  'pushoversounds none': 'None (silent)',
-  pushyAPIKey: 'Secret API Key',
-  pushyToken: 'Device token',
-  'Show update if available': 'แสดงการอัปเดตถ้ามี',
-  'Also check beta release': 'ตรวจสอบรุ่นเบต้า',
-  'Using a Reverse Proxy?': 'ใช้ Reverse Proxy?',
-  'Check how to config it for WebSocket': 'ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket',
-  'Steam Game Server': 'Steam Game Server',
-  'Most likely causes:': 'สาเหตุที่เป็นไปได้มากที่สุด :',
-  'The resource is no longer available.': 'ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป',
-  'There might be a typing error in the address.': 'อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่',
-  'What you can try:': 'สิ่งที่คุณสามารถลอง :',
-  'Retype the address.': 'พิมพ์ที่อยู่อีกครั้ง',
-  'Go back to the previous page.': 'กลับไปที่หน้าก่อนหน้า',
-  'Coming Soon': 'เร็ว ๆ นี้',
-  wayToGetClickSendSMSToken: 'คุณสามารถรับ API Username และ API Key ได้จาก {0}',
-  wayToGetLineNotifyToken: 'คุณสามารถรับ access token ได้จาก {0}',
-  resendEveryXTimes: 'ส่งซ้ำทุก {0} ครั้ง',
-  resendDisabled: 'การส่งซ้ำถูกปิดใช้งาน',
-  dnsPortDescription: 'พอร์ตของเซิร์ฟเวอร์ DNS, ค่าเริ่มต้นคือ 53, คุณสามารถเปลี่ยนพอร์ตตอนไหนก็ได้',
-  'Resend Notification if Down X times consequently': 'ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง',
-  error: 'เกิดข้อผิดพลาด',
-  critical: 'วิกฤต',
-  wayToGetPagerDutyKey: 'คุณสามารถรับได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา "Events API V2", สำหรับข้อมูลเพิ่มเติม {0}',
-  'Integration Key': 'Integration Key',
-  'Integration URL': 'Integration URL',
-  'Auto resolve or acknowledged': 'แก้ไขอัตโนมัติหรือยอมรับ',
-  'do nothing': 'ไม่ทำอะไร',
-  'auto acknowledged': 'ยอมรับอัตโนมัติ',
-  'auto resolve': 'แก้ไขอัตโนมัติ',
-  'Bark Group': 'กลุ่มที่จะประกาศ',
-  'Bark Sound': 'เสียงประกาศ',
-  Authentication: 'การตรวจสอบสิทธิ์',
-  'HTTP Headers': 'HTTP Headers',
-  'Trust Proxy': 'Trust Proxy',
-  HomeAssistant: 'Home Assistant',
-  RadiusSecret: 'Radius Secret',
-  RadiusSecretDescription: 'แบ่งปันข้อมูลลับระหว่างผู้ใช้งานและเซิร์ฟเวอร์',
-  RadiusCalledStationId: 'Called Station Id',
-  RadiusCalledStationIdDescription: 'Identifier of the called device',
-  RadiusCallingStationId: 'Calling Station Id',
-  RadiusCallingStationIdDescription: 'Identifier of the calling device',
-  'Connection String': 'Connection String',
-  Query: 'Query',
-  settingsCertificateExpiry: 'วันหมดอายุใบรับรอง TLS',
-  certificationExpiryDescription: 'การตรวจสอบ HTTPS แจ้งเตือนใบอนุญาติ TLS จะหมดอายุใน:',
-  'Setup Docker Host': 'Setup Docker Host',
-  'Connection Type': 'ประเภทการเชื่อมต่อ',
-  'Docker Daemon': 'Docker Daemon',
-  deleteDockerHostMsg: 'คุณแน่ใจหรือไม่ที่จะลบ Docker host นี้สำหรับการมอนิเตอร์ทั้งหมด?',
-  socket: 'Socket',
-  tcp: 'TCP / HTTP',
-  'Docker Container': 'Docker Container',
-  'Container Name / ID': 'Container Name / ID',
-  'Docker Host': 'Docker Host',
-  'Docker Hosts': 'Docker Hosts',
-  'ntfy Topic': 'ntfy Topic',
-  Domain: 'โดเมน',
-  Workstation: 'Workstation',
-  disableCloudflaredNoAuthMsg: 'คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน',
-  trustProxyDescription: "เชื่อ Header 'X-Forwarded-*' ถ้าคุณต้องการไอพีที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache, คุณควรเปิดใช้งาน",
-  Examples: 'ตัวอย่าง',
-  'Home Assistant URL': 'Home Assistant URL',
-  'Long-Lived Access Token': 'Access Token แบบมีอายุ',
-  'Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ': 'Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก "Create Token"',
-  'Notification Service': 'บริการแจ้งเตือน',
-  'default: notify all devices': 'ค่าเริ่มต้น: แจ้งเตือนทุกอุปกรณ์',
-  'A list of Notification Services can be found in Home Assistant under "Developer Tools > Services" search for "notification" to find your device/phone name.': 'รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู "Developer Tools > Services" ค้นหา "notification" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์',
-  'Automations can optionally be triggered in Home Assistant:': 'สามารถเลือกสั่งงานระบบอัตโนมัติได้ใน Home Assistant:',
-  'Trigger type:': 'ชนิดสิ่งกระตุ้น:',
-  'Event type:': 'ชนิดกิจกรรม:',
-  'Event data:': 'ข้อมูลกิจกรรม:',
-  'Then choose an action, for example switch the scene to where an RGB light is red.': 'จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง',
-  'Frontend Version': 'เวอร์ชั่น Frontend',
-  'Frontend Version do not match backend version!': 'เวอร์ชั่น Frontend ไม่ตรงกับ Backend !'
-}
\ No newline at end of file
+    languageName: "ไทย",
+    checkEverySecond: "ตรวจสอบทุก {0} วินาที",
+    retryCheckEverySecond: "ลองใหม่ทุก {0} วินาที",
+    retriesDescription: "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
+    ignoreTLSError: "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
+    upsideDownModeDescription: "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
+    maxRedirectDescription: "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั่งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
+    acceptedStatusCodesDescription: "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
+    passwordNotMatchMsg: "รหัสผ่านไม่ตรงกัน",
+    notificationDescription: "การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้",
+    keywordDescription: "ค้นหาคำสำคัญใน HTML หรือ JSON ของการตอบกลับ, คำสำคัญต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่",
+    pauseDashboardHome: "หยุดชั่วคราว",
+    deleteMonitorMsg: "คุณแน่ใจหรือไม่ที่จะลบมอนิเตอร์?",
+    deleteNotificationMsg: "คุณแน่ใจหรือไม่ที่จะลบการแจ้งเตือนสำหรับมอนิเตอร์ทั้งหมด?",
+    resolverserverDescription: "Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา",
+    rrtypeDescription: "เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์",
+    pauseMonitorMsg: "คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?",
+    enableDefaultNotificationDescription: "การแจ้งเตือนนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
+    clearEventsMsg: "คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?",
+    clearHeartbeatsMsg: "คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?",
+    confirmClearStatisticsMsg: "คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?",
+    importHandleDescription: "เลือก \"ข้ามรายการที่มีอยู่แล้ว\" ถ้าคุณต้องการข้ามทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน, \"เขียนทับ\" จะลบทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน",
+    confirmImportMsg: "คุณแน่ใจหรือไม่ที่จะนำเข้าข้อมูลสำรอง, กรุณาตรวจสอบว่าคุณเลือกข้อมูลที่ถูกต้อง",
+    twoFAVerifyLabel: "โปรดกรอกกุญแจ 2FA ของคุณเพื่อยืนยัน:",
+    tokenValidSettingsMsg: "กุญแจถูกต้อง, ตอนนี้คุณสามารถบันทึกการตั้งค่า 2FA ของคุณได้แล้ว",
+    confirmEnableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะเปิดใช้งาน 2FA?",
+    confirmDisableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะปิดใช้งาน 2FA?",
+    Settings: "การตั้งค่า",
+    Dashboard: "แผงควบคุม",
+    "New Update": "อัพเดทใหม่",
+    Language: "ภาษา",
+    Appearance: "รูปร่าง",
+    Theme: "หน้าตา",
+    General: "ทั่วไป",
+    "Primary Base URL": "URL หลัก",
+    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: "จำนวนครั้งที่จะลองใหม่",
+    "Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
+    Advanced: "ขั้นสูง",
+    "Upside Down Mode": "โหมดกลับด้าน",
+    "Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด",
+    "Accepted Status Codes": "รหัสสถานะที่ยอมรับ",
+    "Push URL": "URL เป้าหมาย",
+    needPushEvery: "คุณควรเรียก URL นี้ทุก {0} วินาที",
+    pushOptionalParams: "ตัวแปรเสริม: {0}",
+    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": "เปิดใช้งานการตรวจสอบสิทธิ์",
+    "disableauth.message1": "คุณต้องการที่จะ <strong>ปิดใช้งานระบบรับรองความถูกต้องใช่หรือไม่</strong>?",
+    "disableauth.message2": "ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่น ๆ",
+    "Please use this option carefully!": "โปรดใช้ความระมัดระวังในการเลือกใช้งานระบบนี้ !",
+    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": "ประเภท DNS Record",
+    "Last Result": "ผลล่าสุด",
+    "Create your admin account": "สร้างบัญชีผู้ดูแลระบบ",
+    "Repeat Password": "ยืนยันรหัสผ่าน",
+    "Import Backup": "นำเข้าข้อมูลสำรอง",
+    "Export Backup": "ส่งออกข้อมูลสำรอง",
+    Export: "ส่งออก",
+    Import: "นำเข้า",
+    respTime: "ระยะเวลาการตอบสนอง (ms)",
+    notAvailableShort: "ไม่สามารถใช้งานได้",
+    "Default enabled": "เปิดใช้งานโดยค่าเริ่มต้น",
+    "Apply on all existing monitors": "ใช้กับมอนิเตอร์ทั้งหมด",
+    Create: "สร้าง",
+    "Clear Data": "ล้างข้อมูล",
+    Events: "เหตุการณ์",
+    Heartbeats: "ประวัติการตรวจสอบ",
+    "Auto Get": "ดึงอัตโนมัติ",
+    backupDescription: "คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดได้ในไฟล์ JSON",
+    backupDescription2: "หมายเหตุ : ประวัติและข้อมูลกิจกรรมจะไม่ถูกสำรอง",
+    backupDescription3: "ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย",
+    alertNoFile: "กรุณาเลือกไฟล์ที่จะใช้งาน",
+    alertWrongFileType: "กรุณาเลือกไฟล์ที่เป็น JSON",
+    "Clear all statistics": "ล้างข้อมูลสถิติทั้งหมด",
+    "Skip existing": "ข้ามรายการที่มีอยู่แล้ว",
+    Overwrite: "เขียนทับ",
+    Options: "ตัวเลือก",
+    "Keep both": "เก็บทั้งสอง",
+    "Verify Token": "ยืนยันกุญแจ",
+    "Setup 2FA": "ติดตั้ง 2FA",
+    "Enable 2FA": "เปิดใช้งาน 2FA",
+    "Disable 2FA": "ปิดใช้งาน 2FA",
+    "2FA Settings": "ตั้งค่า 2FA",
+    "Two Factor Authentication": "การตรวจสอบสิทธิ์สองปัจจัย",
+    Active: "ใช้งาน",
+    Inactive: "ไม่ใช้งาน",
+    Token: "กุญแจ",
+    "Show URI": "แสดง URI",
+    Tags: "แท็ก",
+    "Add New below or Select...": "เพิ่มใหม่ด้านล่างหรือเลือก...",
+    "Tag with this name already exist.": "แท็กที่มีชื่อนี้มีอยู่แล้ว",
+    "Tag with this value already exist.": "แท็กที่มีข้อมูลนี้มีอยู่แล้ว",
+    color: "สี",
+    "value (optional)": "ข้อมูล (ไม่จำเป็น)",
+    Gray: "เทา",
+    Red: "แดง",
+    Orange: "ส้ม",
+    Green: "เขียว",
+    Blue: "น้ำเงิน",
+    Indigo: "ม่วง",
+    Purple: "ม่วง",
+    Pink: "ชมพู",
+    "Search...": "ค้นหา...",
+    "Avg. Ping": "ค่า Ping เฉลี่ย",
+    "Avg. Response": "ค่า Response เฉลี่ย",
+    "Entry Page": "หน้าต้อนรับ",
+    statusPageNothing: "ไม่มีอะไรตรงนี้ !, กรุณาเพิ่มกลุ่มหรือมอนิเตอร์",
+    "No Services": "ไม่มีบริการ",
+    "All Systems Operational": "บริการทั้งหมดทำงานได้ปกติ",
+    "Partially Degraded Service": "บริการมีปัญหาบางส่วน",
+    "Degraded Service": "บริการมีปัญหา",
+    "Add Group": "เพิ่มกลุ่ม",
+    "Add a monitor": "เพิ่มมอนิเตอร์",
+    "Edit Status Page": "แก้ไขหน้าสถานะ",
+    "Go to Dashboard": "ไปที่หน้าควบคุม",
+    "Status Page": "หน้าสถานะ",
+    "Status Pages": "หน้าสถานะ",
+    defaultNotificationName: "การแจ้งเตือน {notification} ของฉัน ({number})",
+    here: "ที่นี่",
+    Required: "ต้องการ",
+    telegram: "Telegram",
+    "Bot Token": "กุญแจของบอท",
+    wayToGetTelegramToken: "คุณสามารถรับกุญแจได้จาก {0}.",
+    "Chat ID": "ไอดีแชท",
+    supportTelegramChatID: "รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท",
+    wayToGetTelegramChatID: "คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :",
+    "YOUR BOT TOKEN HERE": "กุญแจของบอทของคุณที่นี่",
+    chatIDNotFound: "ไม่พบไอดีแชท, กรุณาส่งข้อความไปที่บอท",
+    webhook: "Webhook",
+    "Post URL": "URL โพสต์",
+    "Content Type": "ประเภทเนื้อหา",
+    webhookJsonDesc: "{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js",
+    webhookFormDataDesc: "{multipart} ดีสำหรับ PHP, JSON จะต้องถูกประมวลผลด้วย {decodeFunction}",
+    smtp: "Email (SMTP)",
+    secureOptionNone: "None / STARTTLS (25, 587)",
+    secureOptionTLS: "TLS (465)",
+    "Ignore TLS Error": "เพิกเฉยข้อผิดพลาด TLS",
+    "From Email": "จากอีเมล",
+    emailCustomSubject: "หัวข้อที่กำหนดเอง",
+    "To Email": "ถึงอีเมล",
+    smtpCC: "CC",
+    smtpBCC: "BCC",
+    discord: "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    wayToGetDiscordURL: "คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "ชื่อบอท",
+    "Prefix Custom Message": "คำนำหน้าข้อความที่กำหนดเอง",
+    "Hello @everyone is...": "สวัสดี {'@'}everyone นี่...",
+    teams: "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    wayToGetTeamsURL: "คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}",
+    signal: "Signal",
+    Number: "หมายเลข",
+    Recipients: "ผู้รับ",
+    needSignalAPI: "คุณต้องมี Signal Client ที่มี Rest APIl",
+    wayToCheckSignalURL: "คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :",
+    signalImportant: "สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!",
+    gotify: "Gotify",
+    "Application Token": "กุญแจของแอพพลิเคชั่น",
+    "Server URL": "Server URL",
+    Priority: "ลำดับความสำคัญ",
+    slack: "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "ชื่อห้อง",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    aboutWebhooks: "ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}",
+    aboutChannelName: "ใส่ชื่อห้องบน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ",
+    aboutKumaURL: "ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github",
+    emojiCheatSheet: "ตาราง Emoji : {0}",
+    "rocket.chat": "Rocket.Chat",
+    pushover: "Pushover",
+    pushy: "Pushy",
+    PushByTechulus: "Push by Techulus",
+    octopush: "Octopush",
+    promosms: "PromoSMS",
+    clicksendsms: "ClickSend SMS",
+    lunasea: "LunaSea",
+    apprise: "Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)",
+    GoogleChat: "Google Chat (Google Workspace only)",
+    pushbullet: "Pushbullet",
+    line: "Line Messenger",
+    mattermost: "Mattermost",
+    "User Key": "กุญแจผู้ใช้งาน",
+    Device: "อุปกรณ์",
+    "Message Title": "หัวข้อข้อความ",
+    "Notification Sound": "เสียงแจ้งเตือน",
+    "More info on:": "ข้อมูลเพิ่มเติม : {0}",
+    pushoverDesc1: "ลำดับความสำตคญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง",
+    pushoverDesc2: "ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่น ๆ สามารถกำหนดได้ที่ช่องอุปกรณ์",
+    "SMS Type": "ประเภท SMS",
+    octopushTypePremium: "พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)",
+    octopushTypeLowCost: "ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)",
+    checkPrice: "ตรวจสอบราคาของ {0} :",
+    apiCredentials: "ข้อมูลการตรวจสอบสิทธิ์ API",
+    octopushLegacyHint: "คุณใช้เวอร์ชันดั้งเดิมของ Octopush (2011 - 2020) หรือเวอร์ชันใหม่หรือไม่?",
+    "Check octopush prices": "ตรวจสอบราคาของ Octopush {0}",
+    octopushPhoneNumber: "หมายเลขโทรศัพท์ (รูปแบบสากล เช่น +33612345678) ",
+    octopushSMSSender: "ชื่อผู้ส่ง SMS : ความยาว 3 - 11 ตัวอักษร, ตัวเลข และช่องว่าง (a-zA-Z0-9 )",
+    "LunaSea Device ID": "ไอดีอุปกรณ์ LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "ตัวอย่าง : {0}",
+    "Read more:": "อ่านเพิ่มเติม : {0}",
+    "Status:": "สถานะ : {0}",
+    "Read more": "อ่านเพิ่มเติม",
+    appriseInstalled: "Apprise ถูกติดตั่งแล้ว",
+    appriseNotInstalled: "Apprise ยังไม่ถูกติดตั่ง {0}",
+    "Access Token": "กุญแจการเข้าถึง",
+    "Channel access token": "กุญแจการเข้าถึงของช่อง",
+    "Line Developers Console": "Line Developers Console",
+    lineDevConsoleTo: "Line Developers Console - {0}",
+    "Basic Settings": "การตั้งค่าพื้นฐาน",
+    "User ID": "ไอดีผู้ใช้",
+    "Messaging API": "Messaging API",
+    wayToGetLineChannelToken: "ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น",
+    "Icon URL": "Icon URL",
+    aboutIconURL: "คุณสามารถระบุลิงก์ไปยังรูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
+    aboutMattermostChannelName: "คุณลบล้างช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
+    matrix: "Matrix",
+    promosmsTypeEco: "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับโปแลนด์",
+    promosmsTypeFlash: "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับโปแลนด์",
+    promosmsTypeFull: "SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน",
+    promosmsTypeSpeed: "SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)",
+    promosmsPhoneNumber: "หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)",
+    promosmsSMSSender: "ชื่อผู้ส่ง SMS : ชื่อที่ลงทะเบียนล่วงหน้าหรือหนึ่งในค่าเริ่มต้น: InfoSMS, ข้อมูล SMS, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    matrixHomeserverURL: "URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)",
+    "Internal Room Id": "รหัสห้องภายใน",
+    matrixDesc1: "คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.",
+    matrixDesc2: "ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วมได้อย่างเต็มที่ ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}",
+    Method: "วิธี",
+    Body: "เนื้อหา",
+    Headers: "ส่วนหัว",
+    PushUrl: "Push URL",
+    HeadersInvalidFormat: "เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง :",
+    BodyInvalidFormat: "เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ",
+    "Monitor History": "ประวัติมอนิเตอร์",
+    clearDataOlderThan: "เก็บข้อมูลมอนิเตอร์ {0} วัน",
+    PasswordsDoNotMatch: "รหัสผ่านไม่ตรงกัน",
+    records: "บันทึก",
+    "One record": "หนึ่งบันทึก",
+    steamApiKeyDescription: "สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถรสมัครได้จากที่นี่ : ",
+    "Current User": "ผู้ใช้ปัจจุบัน",
+    topic: "หัวข้อ",
+    topicExplanation: "MQTT หัวข้อที่จะมอนิเตอร์",
+    successMessage: "ข้อความที่จะถือว่าประสบความสำเร็จ",
+    successMessageExplanation: "MQTT ข้อความที่จะถือว่าประสบความสำเร็จ",
+    recent: "ล่าสุด",
+    Done: "สำเร็จ",
+    Info: "ข้อมูล",
+    Security: "ความปลอดภัย",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "ย่อฐานข้อมูล",
+    "Pick a RR-Type...": "เลือกชนิด DNS Record",
+    "Pick Accepted Status Codes...": "เลือกสถานะที่ยอมรับ...",
+    Default: "ค่าเริ่มต้น",
+    "HTTP Options": "ตัวเลือก HTTP",
+    "Create Incident": "สร้างเหตุการณ์",
+    Title: "หัวข้อ",
+    Content: "เนื้อหา",
+    Style: "สไตล์",
+    info: "ข้อมูล",
+    warning: "แจ้งเตือน",
+    danger: "อันตราย",
+    primary: "หลัก",
+    light: "สว่าง",
+    dark: "มืด",
+    Post: "โพสต์",
+    "Please input title and content": "กรุณาใส่ชื่อและเนื้อหา",
+    Created: "สร้าง",
+    "Last Updated": "อัพเดทล่าสุด",
+    Unpin: "เลิกตรึง",
+    "Switch to Light Theme": "เปลี่ยนเป็นแบบสว่าง",
+    "Switch to Dark Theme": "เปลี่ยนเป็นแบบมืด",
+    "Show Tags": "แสดงแท็ก",
+    "Hide Tags": "ซ่อนแท็ก",
+    Description: "รายละเอียด",
+    "No monitors available.": "ไม่มีมอนิเตอร์ที่สามารถใช้งานได้",
+    "Add one": "เพิ่ม",
+    "No Monitors": "ไม่มีมอนิเตอร์",
+    "Untitled Group": "กลุ่มที่ไม่มีชื่อ",
+    Services: "บริการ",
+    Discard: "ทิ้ง",
+    Cancel: "ยกเลิก",
+    "Powered by": "ขับเคลื่อนโดย",
+    shrinkDatabaseDescription: "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจาก 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
+    serwersms: "SerwerSMS.pl",
+    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
+    serwersmsAPIPassword: "API Password",
+    serwersmsPhoneNumber: "หมายเลขโทรศัพท์",
+    serwersmsSenderName: "ชื่อผู้ส่ง SMS (ลงทะเบียนผ่านหน้าควบคุม)",
+    stackfield: "Stackfield",
+    Customize: "ปรับแต่ง",
+    "Custom Footer": "ส่วนท้ายที่กำหนดเอง",
+    "Custom CSS": "CSS ที่กำหนดเอง",
+    smtpDkimSettings: "ตั้งค่า DKIM",
+    smtpDkimDesc: "โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน",
+    documentation: "เอกสาร",
+    smtpDkimDomain: "ชื่อโดเมน",
+    smtpDkimKeySelector: "Key Selector",
+    smtpDkimPrivateKey: "Private Key",
+    smtpDkimHashAlgo: "อัลกอริทึมแฮช (ไม่บังคับ)",
+    smtpDkimheaderFieldNames: "คีย์ส่วนหัวเพื่อลงชื่อ (ไม่บังคับ)",
+    smtpDkimskipFields: "Header Keys ไม่ต้องเซ็น (ไม่บังคับ)",
+    gorush: "Gorush",
+    alerta: "Alerta",
+    alertaApiEndpoint: "API Endpoint",
+    alertaEnvironment: "Environment",
+    alertaApiKey: "กุญแจ API",
+    alertaAlertState: "แจ้งเตือนสถานะ",
+    alertaRecoverState: "กู้คืนสถานะ",
+    deleteStatusPageMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้",
+    Proxies: "พร็อกซี",
+    default: "ค่าเริ่มต้น",
+    enabled: "เปิดใช้งาน",
+    setAsDefault: "ตั่งเป็นค่าเริ่มต้น",
+    deleteProxyMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?",
+    proxyDescription: "พร็อกซีจะต้องตั้งค่าให้มอนิเตอร์เพื่อให้ใช้งานได้",
+    enableProxyDescription: "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้โดยสถานะการเปิดใช้งาน",
+    setAsDefaultProxyDescription: "พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
+    "Certificate Chain": "ห่วงโซ่ใบรับรอง",
+    Valid: "ถูกต้อง",
+    Invalid: "ไม่ถูกต้อง",
+    AccessKeyId: "กุญแจสิทธิ ID",
+    SecretAccessKey: "กุญแจสิทธิ Secret",
+    PhoneNumbers: "PhoneNumbers",
+    TemplateCode: "รหัสเทมเพลต",
+    SignName: "ป้ายชื่อ",
+    "Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
+    "Bark Endpoint": "Bark Endpoint",
+    WebHookUrl: "WebHookUrl",
+    SecretKey: "SecretKey",
+    "For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
+    "Device Token": "Device Token",
+    Platform: "แพลตฟอร์ม",
+    iOS: "iOS",
+    Android: "Android",
+    Huawei: "Huawei",
+    High: "สูง",
+    Retry: "ลองใหม่",
+    Topic: "หัวข้อ",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "ติดตั้งพร็อกซี่",
+    "Proxy Protocol": "โปรโตคอลพร็อกซี่",
+    "Proxy Server": "พร็อกซีเซิร์ฟ",
+    "Proxy server has authentication": "พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์",
+    User: "ผู้ใช้",
+    Installed: "ติดตั้งแล้ว",
+    "Not installed": "ไม่ได้ติดตั้ง",
+    Running: "กำลังทำงาน",
+    "Not running": "ไม่ได้ทำงาน",
+    "Remove Token": "ลบกุญแจ",
+    Start: "เริ่ม",
+    Stop: "หยุด",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "เพิ่มหน้าสถานะใหม่",
+    Slug: "ชื่อ",
+    "Accept characters:": "ตัวอักษรที่ใช้งานได้ :",
+    startOrEndWithOnly: "เริ่มหรือจบด้วย {0} เท่านั้น",
+    "No consecutive dashes": "ไม่มีขีดกลางติดต่อกัน",
+    Next: "ต่อไป",
+    "The slug is already taken. Please choose another slug.": "ชื่อนี้ถูกใช้งานไปแล้ว กรุณาใช้ชื่ออื่น",
+    "No Proxy": "ไม่มีพร็อกซี่",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "หน้าสถานะใหม่",
+    "Page Not Found": "ไม่พบหน้านี้",
+    "Reverse Proxy": "พร็อกซีย้อนกลับ",
+    Backup: "สำรอง",
+    About: "เกี่ยวกับ",
+    wayToGetCloudflaredURL: "(ดาวโหลด cloudflared จาก {0})",
+    cloudflareWebsite: "เว็บไซต์ Cloudflare",
+    "Message:": "ข้อความ :",
+    "Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน",
+    "Other Software": "ซอฟต์แวร์อื่น ๆ ",
+    "For example: nginx, Apache and Traefik.": "เช่น: nginx, Apache และ Traefik",
+    "Please read": "กรุณาอ่าน",
+    "Subject:": "เรื่อง :",
+    "Valid To:": "ถูกต้องถึง :",
+    "Days Remaining:": "จำนวนวันที่เหลือ :",
+    "Issuer:": "ผู้ออก :",
+    "Fingerprint:": "ลายนิ้วมือ :",
+    "No status pages": "ไม่มีหน้าสถานะ",
+    "Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุโดเมน",
+    Proxy: "Proxy",
+    "Date Created": "วันที่สร้าง",
+    onebotHttpAddress: "ที่อยู่ HTTP OneBot ",
+    onebotMessageType: "ชนิดข้อความ OneBot",
+    onebotGroupMessage: "กลุ่ม",
+    onebotPrivateMessage: "ส่วนตัว",
+    onebotUserOrGroupId: "กลุ่ม / ไอดีผู้ใช้",
+    onebotSafetyTips: "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
+    "PushDeer Key": "กุญแจ PushDeer",
+    "Footer Text": "ข้อความส่วนท้าย",
+    "Show Powered By": "แสดงข้อความ \"ขับเคลื่อนโดย\"",
+    "Domain Names": "Domain Names",
+    signedInDisp: "เข้าใช้งานในฐานะ {0}",
+    signedInDispDisabled: "ปิดการตรวจสอบสิทธิ์",
+    "Certificate Expiry Notification": "แจ้งเตือนการรับรองหมดอายุ",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "หมายเลขผู้รับ",
+    "From Name/Number": "จาก ชื่อ / หมายเลข",
+    "Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "endpoint",
+    octopushAPIKey: "\"API key\" จากข้อมูลรับรอง HTTP API ในแผงควบคุม",
+    octopushLogin: "\"Login\" จากข้อมูลรับรอง HTTP API ในแผงควบคุม",
+    promosmsLogin: "API Login Name",
+    promosmsPassword: "API Password",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    pushyAPIKey: "Secret API Key",
+    pushyToken: "Device token",
+    "Show update if available": "แสดงการอัปเดตถ้ามี",
+    "Also check beta release": "ตรวจสอบรุ่นเบต้า",
+    "Using a Reverse Proxy?": "ใช้ Reverse Proxy?",
+    "Check how to config it for WebSocket": "ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "สาเหตุที่เป็นไปได้มากที่สุด :",
+    "The resource is no longer available.": "ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป",
+    "There might be a typing error in the address.": "อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่",
+    "What you can try:": "สิ่งที่คุณสามารถลอง :",
+    "Retype the address.": "พิมพ์ที่อยู่อีกครั้ง",
+    "Go back to the previous page.": "กลับไปที่หน้าก่อนหน้า",
+    "Coming Soon": "เร็ว ๆ นี้",
+    wayToGetClickSendSMSToken: "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
+    wayToGetLineNotifyToken: "คุณสามารถรับ access token ได้จาก {0}",
+    resendEveryXTimes: "ส่งซ้ำทุก {0} ครั้ง",
+    resendDisabled: "การส่งซ้ำถูกปิดใช้งาน",
+    dnsPortDescription: "พอร์ตของเซิร์ฟเวอร์ DNS, ค่าเริ่มต้นคือ 53, คุณสามารถเปลี่ยนพอร์ตตอนไหนก็ได้",
+    "Resend Notification if Down X times consequently": "ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง",
+    error: "เกิดข้อผิดพลาด",
+    critical: "วิกฤต",
+    wayToGetPagerDutyKey: "คุณสามารถรับได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา \"Events API V2\", สำหรับข้อมูลเพิ่มเติม {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "แก้ไขอัตโนมัติหรือยอมรับ",
+    "do nothing": "ไม่ทำอะไร",
+    "auto acknowledged": "ยอมรับอัตโนมัติ",
+    "auto resolve": "แก้ไขอัตโนมัติ",
+    "Bark Group": "กลุ่มที่จะประกาศ",
+    "Bark Sound": "เสียงประกาศ",
+    Authentication: "การตรวจสอบสิทธิ์",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Trust Proxy",
+    HomeAssistant: "Home Assistant",
+    RadiusSecret: "Radius Secret",
+    RadiusSecretDescription: "แบ่งปันข้อมูลลับระหว่างผู้ใช้งานและเซิร์ฟเวอร์",
+    RadiusCalledStationId: "Called Station Id",
+    RadiusCalledStationIdDescription: "Identifier of the called device",
+    RadiusCallingStationId: "Calling Station Id",
+    RadiusCallingStationIdDescription: "Identifier of the calling device",
+    "Connection String": "Connection String",
+    Query: "Query",
+    settingsCertificateExpiry: "วันหมดอายุใบรับรอง TLS",
+    certificationExpiryDescription: "การตรวจสอบ HTTPS แจ้งเตือนใบอนุญาติ TLS จะหมดอายุใน:",
+    "Setup Docker Host": "Setup Docker Host",
+    "Connection Type": "ประเภทการเชื่อมต่อ",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "คุณแน่ใจหรือไม่ที่จะลบ Docker host นี้สำหรับการมอนิเตอร์ทั้งหมด?",
+    socket: "Socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    Domain: "โดเมน",
+    Workstation: "Workstation",
+    disableCloudflaredNoAuthMsg: "คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน",
+    trustProxyDescription: "เชื่อ Header 'X-Forwarded-*' ถ้าคุณต้องการไอพีที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache, คุณควรเปิดใช้งาน",
+    Examples: "ตัวอย่าง",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Access Token แบบมีอายุ",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก \"Create Token\"",
+    "Notification Service": "บริการแจ้งเตือน",
+    "default: notify all devices": "ค่าเริ่มต้น: แจ้งเตือนทุกอุปกรณ์",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู \"Developer Tools > Services\" ค้นหา \"notification\" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์",
+    "Automations can optionally be triggered in Home Assistant:": "สามารถเลือกสั่งงานระบบอัตโนมัติได้ใน Home Assistant:",
+    "Trigger type:": "ชนิดสิ่งกระตุ้น:",
+    "Event type:": "ชนิดกิจกรรม:",
+    "Event data:": "ข้อมูลกิจกรรม:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง",
+    "Frontend Version": "เวอร์ชั่น Frontend",
+    "Frontend Version do not match backend version!": "เวอร์ชั่น Frontend ไม่ตรงกับ Backend !",
+};

From a8ea76e8a175e84fb36dfdff6e5ba1ec615dc4af Mon Sep 17 00:00:00 2001
From: Muhammed Hussein karimi <info@karimi.dev>
Date: Fri, 26 Aug 2022 17:05:32 +0430
Subject: [PATCH 096/803] Remove extra debug log

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 server/notification-providers/goalert.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/server/notification-providers/goalert.js b/server/notification-providers/goalert.js
index bcb1843c..c757e599 100644
--- a/server/notification-providers/goalert.js
+++ b/server/notification-providers/goalert.js
@@ -23,7 +23,6 @@ class GoAlert extends NotificationProvider {
                 headers: headers
             };
             let resp = await axios.post(`${notification.goAlertBaseURL}/api/v2/generic/incoming?token=${notification.goAlertToken}`, data, config);
-            console.log(resp);
             return okMsg;
 
         } catch (error) {

From 064fe50e3836ec90e68a2cd092f249ce97359f61 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein karimi <info@karimi.dev>
Date: Fri, 26 Aug 2022 17:06:13 +0430
Subject: [PATCH 097/803] Update src/components/notifications/index.js

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 src/components/notifications/index.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 2ea178a9..e5570c80 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -82,7 +82,7 @@ const NotificationFormList = {
     "telegram": Telegram,
     "webhook": Webhook,
     "WeCom": WeCom,
-    "GoAlert": GoAlert
+    "GoAlert": GoAlert,
 };
 
 export default NotificationFormList;

From b9b00050ddad46c8509110f2dfbaaf909e740ec5 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Sun, 28 Aug 2022 21:37:19 +0430
Subject: [PATCH 098/803] fix package lock version

---
 package-lock.json | 16504 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 16328 insertions(+), 176 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index bb9dac9f..6e0996c6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,8 +1,16289 @@
 {
     "name": "uptime-kuma",
     "version": "1.18.0-beta.0",
-    "lockfileVersion": 1,
+    "lockfileVersion": 2,
     "requires": true,
+    "packages": {
+        "": {
+            "name": "uptime-kuma",
+            "version": "1.18.0-beta.0",
+            "license": "MIT",
+            "dependencies": {
+                "@louislam/sqlite3": "~15.0.6",
+                "args-parser": "~1.3.0",
+                "axios": "~0.27.0",
+                "axios-ntlm": "^1.3.0",
+                "badge-maker": "^3.3.1",
+                "bcryptjs": "~2.4.3",
+                "bree": "~7.1.5",
+                "cacheable-lookup": "~6.0.4",
+                "chardet": "^1.3.0",
+                "check-password-strength": "^2.0.5",
+                "cheerio": "^1.0.0-rc.10",
+                "chroma-js": "^2.1.2",
+                "command-exists": "~1.2.9",
+                "compare-versions": "~3.6.0",
+                "compression": "^1.7.4",
+                "dayjs": "^1.11.0",
+                "express": "~4.17.3",
+                "express-basic-auth": "~1.2.1",
+                "express-static-gzip": "^2.1.7",
+                "form-data": "~4.0.0",
+                "http-graceful-shutdown": "~3.1.7",
+                "http-proxy-agent": "^5.0.0",
+                "https-proxy-agent": "^5.0.0",
+                "iconv-lite": "^0.6.3",
+                "jsonwebtoken": "~8.5.1",
+                "jwt-decode": "^3.1.2",
+                "limiter": "^2.1.0",
+                "mqtt": "^4.2.8",
+                "mssql": "^8.1.0",
+                "node-cloudflared-tunnel": "~1.0.9",
+                "node-radius-client": "^1.0.0",
+                "nodemailer": "~6.6.5",
+                "notp": "~2.0.3",
+                "password-hash": "~1.2.2",
+                "pg": "^8.7.3",
+                "pg-connection-string": "^2.5.0",
+                "prom-client": "~13.2.0",
+                "prometheus-api-metrics": "~3.2.1",
+                "redbean-node": "0.1.4",
+                "socket.io": "~4.4.1",
+                "socket.io-client": "~4.4.1",
+                "socks-proxy-agent": "6.1.1",
+                "tar": "^6.1.11",
+                "tcp-ping": "~0.1.1",
+                "thirty-two": "~1.0.2"
+            },
+            "devDependencies": {
+                "@actions/github": "~5.0.1",
+                "@babel/eslint-parser": "~7.17.0",
+                "@babel/preset-env": "^7.15.8",
+                "@fortawesome/fontawesome-svg-core": "~1.2.36",
+                "@fortawesome/free-regular-svg-icons": "~5.15.4",
+                "@fortawesome/free-solid-svg-icons": "~5.15.4",
+                "@fortawesome/vue-fontawesome": "~3.0.0-5",
+                "@popperjs/core": "~2.10.2",
+                "@types/bootstrap": "~5.1.9",
+                "@vitejs/plugin-legacy": "~1.8.2",
+                "@vitejs/plugin-vue": "~2.3.3",
+                "@vue/compiler-sfc": "~3.2.36",
+                "aedes": "^0.46.3",
+                "babel-plugin-rewire": "~1.2.0",
+                "bootstrap": "5.1.3",
+                "chart.js": "~3.6.2",
+                "chartjs-adapter-dayjs": "~1.0.0",
+                "concurrently": "^7.1.0",
+                "core-js": "~3.18.3",
+                "cross-env": "~7.0.3",
+                "dns2": "~2.0.1",
+                "eslint": "~8.14.0",
+                "eslint-plugin-vue": "~8.7.1",
+                "favico.js": "^0.3.10",
+                "jest": "~27.2.5",
+                "jest-puppeteer": "~6.0.3",
+                "postcss-html": "^1.3.1",
+                "postcss-rtlcss": "~3.4.1",
+                "postcss-scss": "~4.0.3",
+                "prismjs": "^1.27.0",
+                "puppeteer": "~13.1.3",
+                "qrcode": "~1.5.0",
+                "rollup-plugin-visualizer": "^5.6.0",
+                "sass": "~1.42.1",
+                "stylelint": "~14.7.1",
+                "stylelint-config-standard": "~25.0.0",
+                "timezones-list": "~3.0.1",
+                "typescript": "~4.4.4",
+                "v-pagination-3": "~0.1.7",
+                "vite": "~2.9.9",
+                "vite-plugin-compression": "^0.5.1",
+                "vue": "next",
+                "vue-chart-3": "3.0.9",
+                "vue-confirm-dialog": "~1.0.2",
+                "vue-contenteditable": "~3.0.4",
+                "vue-i18n": "~9.1.9",
+                "vue-image-crop-upload": "~3.0.3",
+                "vue-multiselect": "~3.0.0-alpha.2",
+                "vue-prism-editor": "^2.0.0-alpha.2",
+                "vue-qrcode": "~1.0.0",
+                "vue-router": "~4.0.14",
+                "vue-toastification": "~2.0.0-rc.5",
+                "vuedraggable": "~4.1.0",
+                "wait-on": "^6.0.1"
+            },
+            "engines": {
+                "node": "14.* || >=16.*"
+            }
+        },
+        "node_modules/@actions/github": {
+            "version": "5.0.3",
+            "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.3.tgz",
+            "integrity": "sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A==",
+            "dev": true,
+            "dependencies": {
+                "@actions/http-client": "^2.0.1",
+                "@octokit/core": "^3.6.0",
+                "@octokit/plugin-paginate-rest": "^2.17.0",
+                "@octokit/plugin-rest-endpoint-methods": "^5.13.0"
+            }
+        },
+        "node_modules/@actions/http-client": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
+            "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
+            "dev": true,
+            "dependencies": {
+                "tunnel": "^0.0.6"
+            }
+        },
+        "node_modules/@ampproject/remapping": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+            "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+            "dev": true,
+            "dependencies": {
+                "@jridgewell/gen-mapping": "^0.1.0",
+                "@jridgewell/trace-mapping": "^0.3.9"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+            "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+            "dev": true,
+            "dependencies": {
+                "@jridgewell/set-array": "^1.0.0",
+                "@jridgewell/sourcemap-codec": "^1.4.10"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@azure/abort-controller": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
+            "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==",
+            "dependencies": {
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-auth": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.3.2.tgz",
+            "integrity": "sha512-7CU6DmCHIZp5ZPiZ9r3J17lTKMmYsm/zGvNkjArQwPkrLlZ1TZ+EUYfGgh2X31OLMVAQCTJZW4cXHJi02EbJnA==",
+            "dependencies": {
+                "@azure/abort-controller": "^1.0.0",
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-client": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.0.tgz",
+            "integrity": "sha512-YhSf4cb61ApSjItscp9XoaLq8KRnacPDAhmjAZSMnn/gs6FhFbZNfOBOErG2dDj7JRknVtCmJ5mLmfR2sLa11A==",
+            "dependencies": {
+                "@azure/abort-controller": "^1.0.0",
+                "@azure/core-auth": "^1.3.0",
+                "@azure/core-rest-pipeline": "^1.5.0",
+                "@azure/core-tracing": "^1.0.0",
+                "@azure/core-util": "^1.0.0",
+                "@azure/logger": "^1.0.0",
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-client/node_modules/@azure/core-tracing": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
+            "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
+            "dependencies": {
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-http": {
+            "version": "2.2.5",
+            "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-2.2.5.tgz",
+            "integrity": "sha512-kctMqSQ6zfnlFpuYzfUKadeTyOQYbIQ+3Rj7dzVC3Dk1dOnHroTwR9hLYKX8/n85iJpkyaksaXpuh5L7GJRYuQ==",
+            "dependencies": {
+                "@azure/abort-controller": "^1.0.0",
+                "@azure/core-auth": "^1.3.0",
+                "@azure/core-tracing": "1.0.0-preview.13",
+                "@azure/logger": "^1.0.0",
+                "@types/node-fetch": "^2.5.0",
+                "@types/tunnel": "^0.0.3",
+                "form-data": "^4.0.0",
+                "node-fetch": "^2.6.7",
+                "process": "^0.11.10",
+                "tough-cookie": "^4.0.0",
+                "tslib": "^2.2.0",
+                "tunnel": "^0.0.6",
+                "uuid": "^8.3.0",
+                "xml2js": "^0.4.19"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-lro": {
+            "version": "2.2.4",
+            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.4.tgz",
+            "integrity": "sha512-e1I2v2CZM0mQo8+RSix0x091Av493e4bnT22ds2fcQGslTHzM2oTbswkB65nP4iEpCxBrFxOSDPKExmTmjCVtQ==",
+            "dependencies": {
+                "@azure/abort-controller": "^1.0.0",
+                "@azure/core-tracing": "1.0.0-preview.13",
+                "@azure/logger": "^1.0.0",
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-paging": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.3.0.tgz",
+            "integrity": "sha512-H6Tg9eBm0brHqLy0OSAGzxIh1t4UL8eZVrSUMJ60Ra9cwq2pOskFqVpz2pYoHDsBY1jZ4V/P8LRGb5D5pmC6rg==",
+            "dependencies": {
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-rest-pipeline": {
+            "version": "1.9.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.0.tgz",
+            "integrity": "sha512-uvM3mY+Vegk0F2r4Eh0yPdsXTUyafTQkeX0USnz1Eyangxm2Bib0w0wkJVZW8fpks7Lcv0ztIdCFTrN7H8uptg==",
+            "dependencies": {
+                "@azure/abort-controller": "^1.0.0",
+                "@azure/core-auth": "^1.3.0",
+                "@azure/core-tracing": "^1.0.1",
+                "@azure/core-util": "^1.0.0",
+                "@azure/logger": "^1.0.0",
+                "form-data": "^4.0.0",
+                "http-proxy-agent": "^4.0.1",
+                "https-proxy-agent": "^5.0.0",
+                "tslib": "^2.2.0",
+                "uuid": "^8.3.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
+            "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
+            "dependencies": {
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-rest-pipeline/node_modules/@tootallnate/once": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+            "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+            "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+            "dependencies": {
+                "@tootallnate/once": "1",
+                "agent-base": "6",
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/@azure/core-tracing": {
+            "version": "1.0.0-preview.13",
+            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
+            "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
+            "dependencies": {
+                "@opentelemetry/api": "^1.0.1",
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/core-util": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.0.0.tgz",
+            "integrity": "sha512-yWshY9cdPthlebnb3Zuz/j0Lv4kjU6u7PR5sW7A9FF7EX+0irMRJAtyTq5TPiDHJfjH8gTSlnIYFj9m7Ed76IQ==",
+            "dependencies": {
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/identity": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.0.5.tgz",
+            "integrity": "sha512-fSQTu9dS0P+lw1Gfct6t7TuRYybULL/E3wJjXLc1xr6RQXpmenJspi0lKzq3XFjLP5MzBlToKY3ZkYoAXPz1zA==",
+            "dependencies": {
+                "@azure/abort-controller": "^1.0.0",
+                "@azure/core-auth": "^1.3.0",
+                "@azure/core-client": "^1.4.0",
+                "@azure/core-rest-pipeline": "^1.1.0",
+                "@azure/core-tracing": "1.0.0-preview.13",
+                "@azure/core-util": "^1.0.0-beta.1",
+                "@azure/logger": "^1.0.0",
+                "@azure/msal-browser": "^2.16.0",
+                "@azure/msal-common": "^4.5.1",
+                "@azure/msal-node": "^1.3.0",
+                "events": "^3.0.0",
+                "jws": "^4.0.0",
+                "open": "^8.0.0",
+                "stoppable": "^1.1.0",
+                "tslib": "^2.2.0",
+                "uuid": "^8.3.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/identity/node_modules/jwa": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+            "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+            "dependencies": {
+                "buffer-equal-constant-time": "1.0.1",
+                "ecdsa-sig-formatter": "1.0.11",
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "node_modules/@azure/identity/node_modules/jws": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+            "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+            "dependencies": {
+                "jwa": "^2.0.0",
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "node_modules/@azure/keyvault-keys": {
+            "version": "4.4.0",
+            "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.4.0.tgz",
+            "integrity": "sha512-W9sPZebXYa3aar7BGIA+fAsq/sy1nf2TZAETbkv7DRawzVLrWv8QoVVceqNHjy3cigT4HNxXjaPYCI49ez5CUA==",
+            "dependencies": {
+                "@azure/abort-controller": "^1.0.0",
+                "@azure/core-http": "^2.0.0",
+                "@azure/core-lro": "^2.2.0",
+                "@azure/core-paging": "^1.1.1",
+                "@azure/core-tracing": "1.0.0-preview.13",
+                "@azure/logger": "^1.0.0",
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/logger": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.3.tgz",
+            "integrity": "sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==",
+            "dependencies": {
+                "tslib": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/@azure/msal-browser": {
+            "version": "2.26.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.26.0.tgz",
+            "integrity": "sha512-mSyZORSgeMEWz5Wo5alUqjxP/HKt/XcViZqc3dnKFM9347qYPIWsAlzHkEmmafNr1VGUo7MeqB0emZCOQrl04w==",
+            "dependencies": {
+                "@azure/msal-common": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz",
+            "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA==",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/@azure/msal-common": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.5.1.tgz",
+            "integrity": "sha512-/i5dXM+QAtO+6atYd5oHGBAx48EGSISkXNXViheliOQe+SIFMDo3gSq3lL54W0suOSAsVPws3XnTaIHlla0PIQ==",
+            "dependencies": {
+                "debug": "^4.1.1"
+            },
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/@azure/msal-node": {
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.10.0.tgz",
+            "integrity": "sha512-oSv9mg199FpRTe+fZ3o9NDYpKShOHqeceaNcCHJcKUaAaCojAbfbxD1Cvsti8BEsLKE6x0HcnjilnM1MKmZekA==",
+            "dependencies": {
+                "@azure/msal-common": "^7.0.0",
+                "jsonwebtoken": "^8.5.1",
+                "uuid": "^8.3.0"
+            },
+            "engines": {
+                "node": "10 || 12 || 14 || 16 || 18"
+            }
+        },
+        "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz",
+            "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA==",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/@babel/code-frame": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+            "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+            "dev": true,
+            "dependencies": {
+                "@babel/highlight": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/compat-data": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz",
+            "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/core": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz",
+            "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==",
+            "dev": true,
+            "dependencies": {
+                "@ampproject/remapping": "^2.1.0",
+                "@babel/code-frame": "^7.18.6",
+                "@babel/generator": "^7.18.6",
+                "@babel/helper-compilation-targets": "^7.18.6",
+                "@babel/helper-module-transforms": "^7.18.6",
+                "@babel/helpers": "^7.18.6",
+                "@babel/parser": "^7.18.6",
+                "@babel/template": "^7.18.6",
+                "@babel/traverse": "^7.18.6",
+                "@babel/types": "^7.18.6",
+                "convert-source-map": "^1.7.0",
+                "debug": "^4.1.0",
+                "gensync": "^1.0.0-beta.2",
+                "json5": "^2.2.1",
+                "semver": "^6.3.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/babel"
+            }
+        },
+        "node_modules/@babel/eslint-parser": {
+            "version": "7.17.0",
+            "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz",
+            "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==",
+            "dev": true,
+            "dependencies": {
+                "eslint-scope": "^5.1.1",
+                "eslint-visitor-keys": "^2.1.0",
+                "semver": "^6.3.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+            },
+            "peerDependencies": {
+                "@babel/core": ">=7.11.0",
+                "eslint": "^7.5.0 || ^8.0.0"
+            }
+        },
+        "node_modules/@babel/generator": {
+            "version": "7.18.7",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz",
+            "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.7",
+                "@jridgewell/gen-mapping": "^0.3.2",
+                "jsesc": "^2.5.1"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-annotate-as-pure": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
+            "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz",
+            "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-explode-assignable-expression": "^7.18.6",
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-compilation-targets": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz",
+            "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/compat-data": "^7.18.6",
+                "@babel/helper-validator-option": "^7.18.6",
+                "browserslist": "^4.20.2",
+                "semver": "^6.3.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/helper-create-class-features-plugin": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz",
+            "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.6",
+                "@babel/helper-function-name": "^7.18.6",
+                "@babel/helper-member-expression-to-functions": "^7.18.6",
+                "@babel/helper-optimise-call-expression": "^7.18.6",
+                "@babel/helper-replace-supers": "^7.18.6",
+                "@babel/helper-split-export-declaration": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/helper-create-regexp-features-plugin": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz",
+            "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.18.6",
+                "regexpu-core": "^5.1.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/helper-define-polyfill-provider": {
+            "version": "0.3.1",
+            "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
+            "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-compilation-targets": "^7.13.0",
+                "@babel/helper-module-imports": "^7.12.13",
+                "@babel/helper-plugin-utils": "^7.13.0",
+                "@babel/traverse": "^7.13.0",
+                "debug": "^4.1.1",
+                "lodash.debounce": "^4.0.8",
+                "resolve": "^1.14.2",
+                "semver": "^6.1.2"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.4.0-0"
+            }
+        },
+        "node_modules/@babel/helper-environment-visitor": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz",
+            "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-explode-assignable-expression": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz",
+            "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-function-name": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz",
+            "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/template": "^7.18.6",
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-hoist-variables": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+            "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-member-expression-to-functions": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz",
+            "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-module-imports": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+            "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-module-transforms": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz",
+            "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-environment-visitor": "^7.18.6",
+                "@babel/helper-module-imports": "^7.18.6",
+                "@babel/helper-simple-access": "^7.18.6",
+                "@babel/helper-split-export-declaration": "^7.18.6",
+                "@babel/helper-validator-identifier": "^7.18.6",
+                "@babel/template": "^7.18.6",
+                "@babel/traverse": "^7.18.6",
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-optimise-call-expression": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
+            "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-plugin-utils": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz",
+            "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-remap-async-to-generator": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz",
+            "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.6",
+                "@babel/helper-wrap-function": "^7.18.6",
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/helper-replace-supers": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz",
+            "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-environment-visitor": "^7.18.6",
+                "@babel/helper-member-expression-to-functions": "^7.18.6",
+                "@babel/helper-optimise-call-expression": "^7.18.6",
+                "@babel/traverse": "^7.18.6",
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-simple-access": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz",
+            "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz",
+            "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-split-export-declaration": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+            "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-validator-identifier": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
+            "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-validator-option": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+            "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-wrap-function": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz",
+            "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-function-name": "^7.18.6",
+                "@babel/template": "^7.18.6",
+                "@babel/traverse": "^7.18.6",
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helpers": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz",
+            "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/template": "^7.18.6",
+                "@babel/traverse": "^7.18.6",
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/highlight": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+            "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-validator-identifier": "^7.18.6",
+                "chalk": "^2.0.0",
+                "js-tokens": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/parser": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz",
+            "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==",
+            "dev": true,
+            "bin": {
+                "parser": "bin/babel-parser.js"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz",
+            "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz",
+            "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6",
+                "@babel/plugin-proposal-optional-chaining": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.13.0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-async-generator-functions": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz",
+            "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-environment-visitor": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-remap-async-to-generator": "^7.18.6",
+                "@babel/plugin-syntax-async-generators": "^7.8.4"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-class-properties": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+            "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-create-class-features-plugin": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-class-static-block": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz",
+            "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-create-class-features-plugin": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-class-static-block": "^7.14.5"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.12.0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-dynamic-import": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz",
+            "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-export-namespace-from": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz",
+            "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-json-strings": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz",
+            "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-json-strings": "^7.8.3"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz",
+            "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+            "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-numeric-separator": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+            "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-object-rest-spread": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz",
+            "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/compat-data": "^7.18.6",
+                "@babel/helper-compilation-targets": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+                "@babel/plugin-transform-parameters": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-optional-catch-binding": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz",
+            "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-optional-chaining": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz",
+            "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6",
+                "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-private-methods": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
+            "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-create-class-features-plugin": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-private-property-in-object": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz",
+            "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.18.6",
+                "@babel/helper-create-class-features-plugin": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz",
+            "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=4"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-async-generators": {
+            "version": "7.8.4",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+            "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.8.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-bigint": {
+            "version": "7.8.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+            "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.8.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-class-properties": {
+            "version": "7.12.13",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+            "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.12.13"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-class-static-block": {
+            "version": "7.14.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+            "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.14.5"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-dynamic-import": {
+            "version": "7.8.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+            "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.8.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-export-namespace-from": {
+            "version": "7.8.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+            "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.8.3"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-import-assertions": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz",
+            "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-import-meta": {
+            "version": "7.10.4",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+            "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.10.4"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-json-strings": {
+            "version": "7.8.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+            "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.8.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+            "version": "7.10.4",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+            "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.10.4"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+            "version": "7.8.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+            "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.8.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-numeric-separator": {
+            "version": "7.10.4",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+            "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.10.4"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-object-rest-spread": {
+            "version": "7.8.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+            "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.8.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+            "version": "7.8.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+            "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.8.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-optional-chaining": {
+            "version": "7.8.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+            "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.8.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-private-property-in-object": {
+            "version": "7.14.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+            "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.14.5"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-top-level-await": {
+            "version": "7.14.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+            "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.14.5"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-typescript": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz",
+            "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-arrow-functions": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz",
+            "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-async-to-generator": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
+            "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-module-imports": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-remap-async-to-generator": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-block-scoped-functions": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz",
+            "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-block-scoping": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz",
+            "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-classes": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz",
+            "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.6",
+                "@babel/helper-function-name": "^7.18.6",
+                "@babel/helper-optimise-call-expression": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-replace-supers": "^7.18.6",
+                "@babel/helper-split-export-declaration": "^7.18.6",
+                "globals": "^11.1.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-computed-properties": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz",
+            "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-destructuring": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz",
+            "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-dotall-regex": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz",
+            "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-duplicate-keys": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz",
+            "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-exponentiation-operator": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz",
+            "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-for-of": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz",
+            "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-function-name": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz",
+            "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-compilation-targets": "^7.18.6",
+                "@babel/helper-function-name": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-literals": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz",
+            "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-member-expression-literals": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz",
+            "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-modules-amd": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz",
+            "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-module-transforms": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "babel-plugin-dynamic-import-node": "^2.3.3"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-modules-commonjs": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz",
+            "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-module-transforms": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-simple-access": "^7.18.6",
+                "babel-plugin-dynamic-import-node": "^2.3.3"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-modules-systemjs": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz",
+            "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-hoist-variables": "^7.18.6",
+                "@babel/helper-module-transforms": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-validator-identifier": "^7.18.6",
+                "babel-plugin-dynamic-import-node": "^2.3.3"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-modules-umd": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz",
+            "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-module-transforms": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz",
+            "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-new-target": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz",
+            "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-object-super": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz",
+            "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-replace-supers": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-parameters": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz",
+            "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-property-literals": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz",
+            "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-regenerator": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz",
+            "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "regenerator-transform": "^0.15.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-reserved-words": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz",
+            "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-shorthand-properties": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz",
+            "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-spread": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz",
+            "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-sticky-regex": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz",
+            "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-template-literals": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz",
+            "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-typeof-symbol": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz",
+            "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-unicode-escapes": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz",
+            "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-unicode-regex": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz",
+            "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/preset-env": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz",
+            "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/compat-data": "^7.18.6",
+                "@babel/helper-compilation-targets": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-validator-option": "^7.18.6",
+                "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
+                "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6",
+                "@babel/plugin-proposal-async-generator-functions": "^7.18.6",
+                "@babel/plugin-proposal-class-properties": "^7.18.6",
+                "@babel/plugin-proposal-class-static-block": "^7.18.6",
+                "@babel/plugin-proposal-dynamic-import": "^7.18.6",
+                "@babel/plugin-proposal-export-namespace-from": "^7.18.6",
+                "@babel/plugin-proposal-json-strings": "^7.18.6",
+                "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6",
+                "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
+                "@babel/plugin-proposal-numeric-separator": "^7.18.6",
+                "@babel/plugin-proposal-object-rest-spread": "^7.18.6",
+                "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
+                "@babel/plugin-proposal-optional-chaining": "^7.18.6",
+                "@babel/plugin-proposal-private-methods": "^7.18.6",
+                "@babel/plugin-proposal-private-property-in-object": "^7.18.6",
+                "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
+                "@babel/plugin-syntax-async-generators": "^7.8.4",
+                "@babel/plugin-syntax-class-properties": "^7.12.13",
+                "@babel/plugin-syntax-class-static-block": "^7.14.5",
+                "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+                "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+                "@babel/plugin-syntax-import-assertions": "^7.18.6",
+                "@babel/plugin-syntax-json-strings": "^7.8.3",
+                "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+                "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+                "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+                "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+                "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+                "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+                "@babel/plugin-syntax-top-level-await": "^7.14.5",
+                "@babel/plugin-transform-arrow-functions": "^7.18.6",
+                "@babel/plugin-transform-async-to-generator": "^7.18.6",
+                "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
+                "@babel/plugin-transform-block-scoping": "^7.18.6",
+                "@babel/plugin-transform-classes": "^7.18.6",
+                "@babel/plugin-transform-computed-properties": "^7.18.6",
+                "@babel/plugin-transform-destructuring": "^7.18.6",
+                "@babel/plugin-transform-dotall-regex": "^7.18.6",
+                "@babel/plugin-transform-duplicate-keys": "^7.18.6",
+                "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
+                "@babel/plugin-transform-for-of": "^7.18.6",
+                "@babel/plugin-transform-function-name": "^7.18.6",
+                "@babel/plugin-transform-literals": "^7.18.6",
+                "@babel/plugin-transform-member-expression-literals": "^7.18.6",
+                "@babel/plugin-transform-modules-amd": "^7.18.6",
+                "@babel/plugin-transform-modules-commonjs": "^7.18.6",
+                "@babel/plugin-transform-modules-systemjs": "^7.18.6",
+                "@babel/plugin-transform-modules-umd": "^7.18.6",
+                "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6",
+                "@babel/plugin-transform-new-target": "^7.18.6",
+                "@babel/plugin-transform-object-super": "^7.18.6",
+                "@babel/plugin-transform-parameters": "^7.18.6",
+                "@babel/plugin-transform-property-literals": "^7.18.6",
+                "@babel/plugin-transform-regenerator": "^7.18.6",
+                "@babel/plugin-transform-reserved-words": "^7.18.6",
+                "@babel/plugin-transform-shorthand-properties": "^7.18.6",
+                "@babel/plugin-transform-spread": "^7.18.6",
+                "@babel/plugin-transform-sticky-regex": "^7.18.6",
+                "@babel/plugin-transform-template-literals": "^7.18.6",
+                "@babel/plugin-transform-typeof-symbol": "^7.18.6",
+                "@babel/plugin-transform-unicode-escapes": "^7.18.6",
+                "@babel/plugin-transform-unicode-regex": "^7.18.6",
+                "@babel/preset-modules": "^0.1.5",
+                "@babel/types": "^7.18.6",
+                "babel-plugin-polyfill-corejs2": "^0.3.1",
+                "babel-plugin-polyfill-corejs3": "^0.5.2",
+                "babel-plugin-polyfill-regenerator": "^0.3.1",
+                "core-js-compat": "^3.22.1",
+                "semver": "^6.3.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/preset-modules": {
+            "version": "0.1.5",
+            "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+            "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.0.0",
+                "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+                "@babel/plugin-transform-dotall-regex": "^7.4.4",
+                "@babel/types": "^7.4.4",
+                "esutils": "^2.0.2"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/runtime": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz",
+            "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==",
+            "dependencies": {
+                "regenerator-runtime": "^0.13.4"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/standalone": {
+            "version": "7.18.7",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.18.7.tgz",
+            "integrity": "sha512-AIOn3ON0KhYqAbvmkT11vi/YAlhrPn6RSPQb8Hl3PUZoE1yFwut5fQ9/oJ4Dvf2SGmO41pF7xmwP2W1RT0uJCA==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/template": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz",
+            "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/code-frame": "^7.18.6",
+                "@babel/parser": "^7.18.6",
+                "@babel/types": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/traverse": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz",
+            "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/code-frame": "^7.18.6",
+                "@babel/generator": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.6",
+                "@babel/helper-function-name": "^7.18.6",
+                "@babel/helper-hoist-variables": "^7.18.6",
+                "@babel/helper-split-export-declaration": "^7.18.6",
+                "@babel/parser": "^7.18.6",
+                "@babel/types": "^7.18.6",
+                "debug": "^4.1.0",
+                "globals": "^11.1.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/types": {
+            "version": "7.18.7",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz",
+            "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-validator-identifier": "^7.18.6",
+                "to-fast-properties": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@bcoe/v8-coverage": {
+            "version": "0.2.3",
+            "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+            "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+            "dev": true
+        },
+        "node_modules/@breejs/later": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.1.0.tgz",
+            "integrity": "sha512-QgGnZ9b7o4k0Ai1ZbTJWwZpZcFK9d+Gb+DyNt4UT9x6IEIs5HVu0iIlmgzGqN+t9MoJSpSPo9S/Mm51UtHr3JA==",
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@eslint/eslintrc": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+            "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+            "dev": true,
+            "dependencies": {
+                "ajv": "^6.12.4",
+                "debug": "^4.3.2",
+                "espree": "^9.3.2",
+                "globals": "^13.15.0",
+                "ignore": "^5.2.0",
+                "import-fresh": "^3.2.1",
+                "js-yaml": "^4.1.0",
+                "minimatch": "^3.1.2",
+                "strip-json-comments": "^3.1.1"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/@eslint/eslintrc/node_modules/globals": {
+            "version": "13.15.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
+            "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+            "dev": true,
+            "dependencies": {
+                "type-fest": "^0.20.2"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/@fortawesome/fontawesome-common-types": {
+            "version": "0.2.36",
+            "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz",
+            "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==",
+            "dev": true,
+            "hasInstallScript": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/@fortawesome/fontawesome-svg-core": {
+            "version": "1.2.36",
+            "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz",
+            "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==",
+            "dev": true,
+            "hasInstallScript": true,
+            "dependencies": {
+                "@fortawesome/fontawesome-common-types": "^0.2.36"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/@fortawesome/free-regular-svg-icons": {
+            "version": "5.15.4",
+            "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz",
+            "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==",
+            "dev": true,
+            "hasInstallScript": true,
+            "dependencies": {
+                "@fortawesome/fontawesome-common-types": "^0.2.36"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/@fortawesome/free-solid-svg-icons": {
+            "version": "5.15.4",
+            "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz",
+            "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==",
+            "dev": true,
+            "hasInstallScript": true,
+            "dependencies": {
+                "@fortawesome/fontawesome-common-types": "^0.2.36"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/@fortawesome/vue-fontawesome": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.1.tgz",
+            "integrity": "sha512-CdXZJoCS+aEPec26ZP7hWWU3SaJlQPZSCGdgpQ2qGl2HUmtUUNrI3zC4XWdn1JUmh3t5OuDeRG1qB4eGRNSD4A==",
+            "dev": true,
+            "peerDependencies": {
+                "@fortawesome/fontawesome-svg-core": "~1 || ~6",
+                "vue": ">= 3.0.0 < 4"
+            }
+        },
+        "node_modules/@hapi/hoek": {
+            "version": "9.3.0",
+            "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
+            "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
+            "dev": true
+        },
+        "node_modules/@hapi/topo": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+            "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+            "dev": true,
+            "dependencies": {
+                "@hapi/hoek": "^9.0.0"
+            }
+        },
+        "node_modules/@humanwhocodes/config-array": {
+            "version": "0.9.5",
+            "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+            "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+            "dev": true,
+            "dependencies": {
+                "@humanwhocodes/object-schema": "^1.2.1",
+                "debug": "^4.1.1",
+                "minimatch": "^3.0.4"
+            },
+            "engines": {
+                "node": ">=10.10.0"
+            }
+        },
+        "node_modules/@humanwhocodes/object-schema": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+            "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+            "dev": true
+        },
+        "node_modules/@intlify/core-base": {
+            "version": "9.1.10",
+            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.10.tgz",
+            "integrity": "sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==",
+            "dev": true,
+            "dependencies": {
+                "@intlify/devtools-if": "9.1.10",
+                "@intlify/message-compiler": "9.1.10",
+                "@intlify/message-resolver": "9.1.10",
+                "@intlify/runtime": "9.1.10",
+                "@intlify/shared": "9.1.10",
+                "@intlify/vue-devtools": "9.1.10"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/devtools-if": {
+            "version": "9.1.10",
+            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.10.tgz",
+            "integrity": "sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==",
+            "dev": true,
+            "dependencies": {
+                "@intlify/shared": "9.1.10"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/message-compiler": {
+            "version": "9.1.10",
+            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.10.tgz",
+            "integrity": "sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==",
+            "dev": true,
+            "dependencies": {
+                "@intlify/message-resolver": "9.1.10",
+                "@intlify/shared": "9.1.10",
+                "source-map": "0.6.1"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/message-resolver": {
+            "version": "9.1.10",
+            "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.10.tgz",
+            "integrity": "sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==",
+            "dev": true,
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/runtime": {
+            "version": "9.1.10",
+            "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.10.tgz",
+            "integrity": "sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==",
+            "dev": true,
+            "dependencies": {
+                "@intlify/message-compiler": "9.1.10",
+                "@intlify/message-resolver": "9.1.10",
+                "@intlify/shared": "9.1.10"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/shared": {
+            "version": "9.1.10",
+            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.10.tgz",
+            "integrity": "sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==",
+            "dev": true,
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/vue-devtools": {
+            "version": "9.1.10",
+            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.10.tgz",
+            "integrity": "sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==",
+            "dev": true,
+            "dependencies": {
+                "@intlify/message-resolver": "9.1.10",
+                "@intlify/runtime": "9.1.10",
+                "@intlify/shared": "9.1.10"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@istanbuljs/load-nyc-config": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+            "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+            "dev": true,
+            "dependencies": {
+                "camelcase": "^5.3.1",
+                "find-up": "^4.1.0",
+                "get-package-type": "^0.1.0",
+                "js-yaml": "^3.13.1",
+                "resolve-from": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+            "version": "1.0.10",
+            "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+            "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+            "dev": true,
+            "dependencies": {
+                "sprintf-js": "~1.0.2"
+            }
+        },
+        "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+            "version": "3.14.1",
+            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+            "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+            "dev": true,
+            "dependencies": {
+                "argparse": "^1.0.7",
+                "esprima": "^4.0.0"
+            },
+            "bin": {
+                "js-yaml": "bin/js-yaml.js"
+            }
+        },
+        "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+            "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+            "dev": true
+        },
+        "node_modules/@istanbuljs/schema": {
+            "version": "0.1.3",
+            "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+            "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/console": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
+            "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "chalk": "^4.0.0",
+                "jest-message-util": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "slash": "^3.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/@jest/console/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/@jest/console/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/@jest/console/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/@jest/console/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/@jest/console/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/console/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/core": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
+            "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+            "dev": true,
+            "dependencies": {
+                "@jest/console": "^27.5.1",
+                "@jest/reporters": "^27.5.1",
+                "@jest/test-result": "^27.5.1",
+                "@jest/transform": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "ansi-escapes": "^4.2.1",
+                "chalk": "^4.0.0",
+                "emittery": "^0.8.1",
+                "exit": "^0.1.2",
+                "graceful-fs": "^4.2.9",
+                "jest-changed-files": "^27.5.1",
+                "jest-config": "^27.5.1",
+                "jest-haste-map": "^27.5.1",
+                "jest-message-util": "^27.5.1",
+                "jest-regex-util": "^27.5.1",
+                "jest-resolve": "^27.5.1",
+                "jest-resolve-dependencies": "^27.5.1",
+                "jest-runner": "^27.5.1",
+                "jest-runtime": "^27.5.1",
+                "jest-snapshot": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "jest-validate": "^27.5.1",
+                "jest-watcher": "^27.5.1",
+                "micromatch": "^4.0.4",
+                "rimraf": "^3.0.0",
+                "slash": "^3.0.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            },
+            "peerDependencies": {
+                "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+            },
+            "peerDependenciesMeta": {
+                "node-notifier": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@jest/core/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/@jest/core/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/@jest/core/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/@jest/core/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/@jest/core/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/core/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/environment": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
+            "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+            "dev": true,
+            "dependencies": {
+                "@jest/fake-timers": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "jest-mock": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/@jest/fake-timers": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
+            "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "@sinonjs/fake-timers": "^8.0.1",
+                "@types/node": "*",
+                "jest-message-util": "^27.5.1",
+                "jest-mock": "^27.5.1",
+                "jest-util": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/@jest/globals": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
+            "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+            "dev": true,
+            "dependencies": {
+                "@jest/environment": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "expect": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/@jest/reporters": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
+            "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+            "dev": true,
+            "dependencies": {
+                "@bcoe/v8-coverage": "^0.2.3",
+                "@jest/console": "^27.5.1",
+                "@jest/test-result": "^27.5.1",
+                "@jest/transform": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "chalk": "^4.0.0",
+                "collect-v8-coverage": "^1.0.0",
+                "exit": "^0.1.2",
+                "glob": "^7.1.2",
+                "graceful-fs": "^4.2.9",
+                "istanbul-lib-coverage": "^3.0.0",
+                "istanbul-lib-instrument": "^5.1.0",
+                "istanbul-lib-report": "^3.0.0",
+                "istanbul-lib-source-maps": "^4.0.0",
+                "istanbul-reports": "^3.1.3",
+                "jest-haste-map": "^27.5.1",
+                "jest-resolve": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "jest-worker": "^27.5.1",
+                "slash": "^3.0.0",
+                "source-map": "^0.6.0",
+                "string-length": "^4.0.1",
+                "terminal-link": "^2.0.0",
+                "v8-to-istanbul": "^8.1.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            },
+            "peerDependencies": {
+                "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+            },
+            "peerDependenciesMeta": {
+                "node-notifier": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@jest/reporters/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/@jest/reporters/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/@jest/reporters/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/@jest/reporters/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/@jest/reporters/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/reporters/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/source-map": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
+            "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+            "dev": true,
+            "dependencies": {
+                "callsites": "^3.0.0",
+                "graceful-fs": "^4.2.9",
+                "source-map": "^0.6.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/@jest/test-result": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
+            "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+            "dev": true,
+            "dependencies": {
+                "@jest/console": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/istanbul-lib-coverage": "^2.0.0",
+                "collect-v8-coverage": "^1.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/@jest/test-sequencer": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
+            "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+            "dev": true,
+            "dependencies": {
+                "@jest/test-result": "^27.5.1",
+                "graceful-fs": "^4.2.9",
+                "jest-haste-map": "^27.5.1",
+                "jest-runtime": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/@jest/transform": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
+            "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/core": "^7.1.0",
+                "@jest/types": "^27.5.1",
+                "babel-plugin-istanbul": "^6.1.1",
+                "chalk": "^4.0.0",
+                "convert-source-map": "^1.4.0",
+                "fast-json-stable-stringify": "^2.0.0",
+                "graceful-fs": "^4.2.9",
+                "jest-haste-map": "^27.5.1",
+                "jest-regex-util": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "micromatch": "^4.0.4",
+                "pirates": "^4.0.4",
+                "slash": "^3.0.0",
+                "source-map": "^0.6.1",
+                "write-file-atomic": "^3.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/@jest/transform/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/@jest/transform/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/@jest/transform/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/@jest/transform/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/@jest/transform/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/transform/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/types": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+            "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+            "dev": true,
+            "dependencies": {
+                "@types/istanbul-lib-coverage": "^2.0.0",
+                "@types/istanbul-reports": "^3.0.0",
+                "@types/node": "*",
+                "@types/yargs": "^16.0.0",
+                "chalk": "^4.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/@jest/types/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/@jest/types/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/@jest/types/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/@jest/types/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/@jest/types/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jest/types/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/@jridgewell/gen-mapping": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+            "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+            "dev": true,
+            "dependencies": {
+                "@jridgewell/set-array": "^1.0.1",
+                "@jridgewell/sourcemap-codec": "^1.4.10",
+                "@jridgewell/trace-mapping": "^0.3.9"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@jridgewell/resolve-uri": {
+            "version": "3.0.8",
+            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
+            "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@jridgewell/set-array": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+            "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@jridgewell/sourcemap-codec": {
+            "version": "1.4.14",
+            "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+            "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+            "dev": true
+        },
+        "node_modules/@jridgewell/trace-mapping": {
+            "version": "0.3.14",
+            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
+            "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
+            "dev": true,
+            "dependencies": {
+                "@jridgewell/resolve-uri": "^3.0.3",
+                "@jridgewell/sourcemap-codec": "^1.4.10"
+            }
+        },
+        "node_modules/@js-joda/core": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.2.0.tgz",
+            "integrity": "sha512-0OriPYIaMLB3XiLQMe0BXKVIqeriTn3H7JMOzTsHEtt7Zqq+TetCu97KnAhU3ckiQZKBxfZshft+H1OC4D1lXw=="
+        },
+        "node_modules/@louislam/sqlite3": {
+            "version": "15.0.6",
+            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-15.0.6.tgz",
+            "integrity": "sha512-+HF/4OEy+yakYzJlSPJbLDtf499t0s0eaglXC9y3Oa9OBZ+dKAaTW5+Ft1RCvfUJLFw/oyYjHtMsg9V+7NT05g==",
+            "hasInstallScript": true,
+            "dependencies": {
+                "@mapbox/node-pre-gyp": "^1.0.0",
+                "node-addon-api": "^4.2.0",
+                "tar": "^6.1.11"
+            },
+            "optionalDependencies": {
+                "node-gyp": "^7.1.2"
+            },
+            "peerDependencies": {
+                "node-gyp": "7.x"
+            },
+            "peerDependenciesMeta": {
+                "node-gyp": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@mapbox/node-pre-gyp": {
+            "version": "1.0.9",
+            "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz",
+            "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==",
+            "dependencies": {
+                "detect-libc": "^2.0.0",
+                "https-proxy-agent": "^5.0.0",
+                "make-dir": "^3.1.0",
+                "node-fetch": "^2.6.7",
+                "nopt": "^5.0.0",
+                "npmlog": "^5.0.1",
+                "rimraf": "^3.0.2",
+                "semver": "^7.3.5",
+                "tar": "^6.1.11"
+            },
+            "bin": {
+                "node-pre-gyp": "bin/node-pre-gyp"
+            }
+        },
+        "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
+            "version": "7.3.7",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@nodelib/fs.scandir": {
+            "version": "2.1.5",
+            "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+            "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+            "dev": true,
+            "dependencies": {
+                "@nodelib/fs.stat": "2.0.5",
+                "run-parallel": "^1.1.9"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@nodelib/fs.stat": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+            "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@nodelib/fs.walk": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+            "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+            "dev": true,
+            "dependencies": {
+                "@nodelib/fs.scandir": "2.1.5",
+                "fastq": "^1.6.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@octokit/auth-token": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
+            "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
+            "dev": true,
+            "dependencies": {
+                "@octokit/types": "^6.0.3"
+            }
+        },
+        "node_modules/@octokit/core": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
+            "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
+            "dev": true,
+            "dependencies": {
+                "@octokit/auth-token": "^2.4.4",
+                "@octokit/graphql": "^4.5.8",
+                "@octokit/request": "^5.6.3",
+                "@octokit/request-error": "^2.0.5",
+                "@octokit/types": "^6.0.3",
+                "before-after-hook": "^2.2.0",
+                "universal-user-agent": "^6.0.0"
+            }
+        },
+        "node_modules/@octokit/endpoint": {
+            "version": "6.0.12",
+            "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
+            "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
+            "dev": true,
+            "dependencies": {
+                "@octokit/types": "^6.0.3",
+                "is-plain-object": "^5.0.0",
+                "universal-user-agent": "^6.0.0"
+            }
+        },
+        "node_modules/@octokit/graphql": {
+            "version": "4.8.0",
+            "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
+            "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
+            "dev": true,
+            "dependencies": {
+                "@octokit/request": "^5.6.0",
+                "@octokit/types": "^6.0.3",
+                "universal-user-agent": "^6.0.0"
+            }
+        },
+        "node_modules/@octokit/openapi-types": {
+            "version": "12.6.1",
+            "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.6.1.tgz",
+            "integrity": "sha512-zirGmxkSQuZIQYsOLtCxNoKi7ByKLwGhrGhHz6YUI7h/c8xOES9bEoHOeq4z81uNf2AGAqNfPW9i3GOrpgKoJQ==",
+            "dev": true
+        },
+        "node_modules/@octokit/plugin-paginate-rest": {
+            "version": "2.21.1",
+            "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.1.tgz",
+            "integrity": "sha512-NVNTK63yoTFp07GqISWK+uDfGH1CAPhQXS7LzsJBvaK5W+UlvG549pLZC55FK0FqANVl6q/9ra3SR5c97xF/sw==",
+            "dev": true,
+            "dependencies": {
+                "@octokit/types": "^6.38.2"
+            },
+            "peerDependencies": {
+                "@octokit/core": ">=2"
+            }
+        },
+        "node_modules/@octokit/plugin-rest-endpoint-methods": {
+            "version": "5.16.1",
+            "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.1.tgz",
+            "integrity": "sha512-RMHD3aJZvOpjR2fGzD2an6eU7LG8MsknhUHvP+wRUnKdbt7eDdhTMLQsZ4xsHZcLNsxPO/K4DDIZPhI2s571Ag==",
+            "dev": true,
+            "dependencies": {
+                "@octokit/types": "^6.38.2",
+                "deprecation": "^2.3.1"
+            },
+            "peerDependencies": {
+                "@octokit/core": ">=3"
+            }
+        },
+        "node_modules/@octokit/request": {
+            "version": "5.6.3",
+            "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
+            "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
+            "dev": true,
+            "dependencies": {
+                "@octokit/endpoint": "^6.0.1",
+                "@octokit/request-error": "^2.1.0",
+                "@octokit/types": "^6.16.1",
+                "is-plain-object": "^5.0.0",
+                "node-fetch": "^2.6.7",
+                "universal-user-agent": "^6.0.0"
+            }
+        },
+        "node_modules/@octokit/request-error": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
+            "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
+            "dev": true,
+            "dependencies": {
+                "@octokit/types": "^6.0.3",
+                "deprecation": "^2.0.0",
+                "once": "^1.4.0"
+            }
+        },
+        "node_modules/@octokit/types": {
+            "version": "6.38.2",
+            "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.38.2.tgz",
+            "integrity": "sha512-McFegRKQ1qaMSnDt8ScJzv26IFR1zhXveYaqx8wF7QEgiy4GHMrnX4xbP+Yl+kAr12DCplL3WJq4xkeD1VMfmw==",
+            "dev": true,
+            "dependencies": {
+                "@octokit/openapi-types": "^12.6.1"
+            }
+        },
+        "node_modules/@opentelemetry/api": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.1.0.tgz",
+            "integrity": "sha512-hf+3bwuBwtXsugA2ULBc95qxrOqP2pOekLz34BJhcAKawt94vfeNyUKpYc0lZQ/3sCP6LqRa7UAdHA7i5UODzQ==",
+            "engines": {
+                "node": ">=8.0.0"
+            }
+        },
+        "node_modules/@popperjs/core": {
+            "version": "2.10.2",
+            "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
+            "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==",
+            "dev": true,
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/popperjs"
+            }
+        },
+        "node_modules/@sideway/address": {
+            "version": "4.1.4",
+            "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
+            "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
+            "dev": true,
+            "dependencies": {
+                "@hapi/hoek": "^9.0.0"
+            }
+        },
+        "node_modules/@sideway/formula": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
+            "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
+            "dev": true
+        },
+        "node_modules/@sideway/pinpoint": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+            "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+            "dev": true
+        },
+        "node_modules/@sinonjs/commons": {
+            "version": "1.8.3",
+            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
+            "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
+            "dev": true,
+            "dependencies": {
+                "type-detect": "4.0.8"
+            }
+        },
+        "node_modules/@sinonjs/fake-timers": {
+            "version": "8.1.0",
+            "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+            "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+            "dev": true,
+            "dependencies": {
+                "@sinonjs/commons": "^1.7.0"
+            }
+        },
+        "node_modules/@socket.io/component-emitter": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz",
+            "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q=="
+        },
+        "node_modules/@tediousjs/connection-string": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.3.0.tgz",
+            "integrity": "sha512-d/keJiNKfpHo+GmSB8QcsAwBx8h+V1UbdozA5TD+eSLXprNY53JAYub47J9evsSKWDdNG5uVj0FiMozLKuzowQ=="
+        },
+        "node_modules/@tootallnate/once": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+            "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@types/accepts": {
+            "version": "1.3.5",
+            "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
+            "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/babel__core": {
+            "version": "7.1.19",
+            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
+            "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/parser": "^7.1.0",
+                "@babel/types": "^7.0.0",
+                "@types/babel__generator": "*",
+                "@types/babel__template": "*",
+                "@types/babel__traverse": "*"
+            }
+        },
+        "node_modules/@types/babel__generator": {
+            "version": "7.6.4",
+            "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
+            "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.0.0"
+            }
+        },
+        "node_modules/@types/babel__template": {
+            "version": "7.4.1",
+            "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
+            "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
+            "dev": true,
+            "dependencies": {
+                "@babel/parser": "^7.1.0",
+                "@babel/types": "^7.0.0"
+            }
+        },
+        "node_modules/@types/babel__traverse": {
+            "version": "7.17.1",
+            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz",
+            "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/types": "^7.3.0"
+            }
+        },
+        "node_modules/@types/body-parser": {
+            "version": "1.19.2",
+            "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
+            "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+            "dependencies": {
+                "@types/connect": "*",
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/bootstrap": {
+            "version": "5.1.12",
+            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.12.tgz",
+            "integrity": "sha512-pSS5BGEgepwzdbsBGswBWFmgrnYpp7c4UfuYe1FJWwkrcjm/JVwfG4gBkOYtd92Otd3RdJK0ByBWMkBROfLEPw==",
+            "dev": true,
+            "dependencies": {
+                "@popperjs/core": "^2.9.2"
+            }
+        },
+        "node_modules/@types/component-emitter": {
+            "version": "1.2.11",
+            "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
+            "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ=="
+        },
+        "node_modules/@types/connect": {
+            "version": "3.4.35",
+            "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+            "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/content-disposition": {
+            "version": "0.5.5",
+            "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz",
+            "integrity": "sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA=="
+        },
+        "node_modules/@types/cookie": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+            "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
+        },
+        "node_modules/@types/cookies": {
+            "version": "0.7.7",
+            "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz",
+            "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==",
+            "dependencies": {
+                "@types/connect": "*",
+                "@types/express": "*",
+                "@types/keygrip": "*",
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/cors": {
+            "version": "2.8.12",
+            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
+            "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
+        },
+        "node_modules/@types/es-aggregate-error": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.2.tgz",
+            "integrity": "sha512-erqUpFXksaeR2kejKnhnjZjbFxUpGZx4Z7ydNL9ie8tEhXPiZTsLeUDJ6aR1F8j5wWUAtOAQWUqkc7givBJbBA==",
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/express": {
+            "version": "4.17.13",
+            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
+            "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
+            "dependencies": {
+                "@types/body-parser": "*",
+                "@types/express-serve-static-core": "^4.17.18",
+                "@types/qs": "*",
+                "@types/serve-static": "*"
+            }
+        },
+        "node_modules/@types/express-serve-static-core": {
+            "version": "4.17.29",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz",
+            "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==",
+            "dependencies": {
+                "@types/node": "*",
+                "@types/qs": "*",
+                "@types/range-parser": "*"
+            }
+        },
+        "node_modules/@types/graceful-fs": {
+            "version": "4.1.5",
+            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
+            "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/http-assert": {
+            "version": "1.5.3",
+            "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
+            "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
+        },
+        "node_modules/@types/http-errors": {
+            "version": "1.8.2",
+            "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz",
+            "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w=="
+        },
+        "node_modules/@types/istanbul-lib-coverage": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+            "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
+            "dev": true
+        },
+        "node_modules/@types/istanbul-lib-report": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+            "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+            "dev": true,
+            "dependencies": {
+                "@types/istanbul-lib-coverage": "*"
+            }
+        },
+        "node_modules/@types/istanbul-reports": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+            "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+            "dev": true,
+            "dependencies": {
+                "@types/istanbul-lib-report": "*"
+            }
+        },
+        "node_modules/@types/keygrip": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
+            "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
+        },
+        "node_modules/@types/koa": {
+            "version": "2.13.4",
+            "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
+            "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
+            "dependencies": {
+                "@types/accepts": "*",
+                "@types/content-disposition": "*",
+                "@types/cookies": "*",
+                "@types/http-assert": "*",
+                "@types/http-errors": "*",
+                "@types/keygrip": "*",
+                "@types/koa-compose": "*",
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/koa-compose": {
+            "version": "3.2.5",
+            "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz",
+            "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==",
+            "dependencies": {
+                "@types/koa": "*"
+            }
+        },
+        "node_modules/@types/lodash": {
+            "version": "4.14.182",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
+            "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
+        },
+        "node_modules/@types/mime": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
+            "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
+        },
+        "node_modules/@types/minimist": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+            "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+            "dev": true
+        },
+        "node_modules/@types/node": {
+            "version": "18.0.1",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz",
+            "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg=="
+        },
+        "node_modules/@types/node-fetch": {
+            "version": "2.6.2",
+            "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
+            "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
+            "dependencies": {
+                "@types/node": "*",
+                "form-data": "^3.0.0"
+            }
+        },
+        "node_modules/@types/node-fetch/node_modules/form-data": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
+            "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.8",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/@types/normalize-package-data": {
+            "version": "2.4.1",
+            "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+            "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+            "dev": true
+        },
+        "node_modules/@types/parse-json": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+            "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+            "dev": true
+        },
+        "node_modules/@types/prettier": {
+            "version": "2.6.3",
+            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz",
+            "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==",
+            "dev": true
+        },
+        "node_modules/@types/qs": {
+            "version": "6.9.7",
+            "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+            "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
+        },
+        "node_modules/@types/range-parser": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+            "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
+        },
+        "node_modules/@types/serve-static": {
+            "version": "1.13.10",
+            "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
+            "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
+            "dependencies": {
+                "@types/mime": "^1",
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/stack-utils": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
+            "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
+            "dev": true
+        },
+        "node_modules/@types/tunnel": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz",
+            "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==",
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/yargs": {
+            "version": "16.0.4",
+            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
+            "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+            "dev": true,
+            "dependencies": {
+                "@types/yargs-parser": "*"
+            }
+        },
+        "node_modules/@types/yargs-parser": {
+            "version": "21.0.0",
+            "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+            "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
+            "dev": true
+        },
+        "node_modules/@types/yauzl": {
+            "version": "2.10.0",
+            "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+            "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@vitejs/plugin-legacy": {
+            "version": "1.8.2",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.8.2.tgz",
+            "integrity": "sha512-NCOKU+pU+cxLMR9P9RTolEuOK+h+zYBXlknj+zGcKSj/NXBZYgA1GAH1FnO4zijoWRiTaiOm2ha9LQrELE7XHg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/standalone": "^7.17.11",
+                "core-js": "^3.22.3",
+                "magic-string": "^0.26.1",
+                "regenerator-runtime": "^0.13.9",
+                "systemjs": "^6.12.1"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            },
+            "peerDependencies": {
+                "vite": "^2.8.0"
+            }
+        },
+        "node_modules/@vitejs/plugin-legacy/node_modules/core-js": {
+            "version": "3.23.3",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.3.tgz",
+            "integrity": "sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q==",
+            "dev": true,
+            "hasInstallScript": true,
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/core-js"
+            }
+        },
+        "node_modules/@vitejs/plugin-vue": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.3.tgz",
+            "integrity": "sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==",
+            "dev": true,
+            "engines": {
+                "node": ">=12.0.0"
+            },
+            "peerDependencies": {
+                "vite": "^2.5.10",
+                "vue": "^3.2.25"
+            }
+        },
+        "node_modules/@vue/compiler-core": {
+            "version": "3.2.37",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
+            "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/parser": "^7.16.4",
+                "@vue/shared": "3.2.37",
+                "estree-walker": "^2.0.2",
+                "source-map": "^0.6.1"
+            }
+        },
+        "node_modules/@vue/compiler-dom": {
+            "version": "3.2.37",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz",
+            "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==",
+            "dev": true,
+            "dependencies": {
+                "@vue/compiler-core": "3.2.37",
+                "@vue/shared": "3.2.37"
+            }
+        },
+        "node_modules/@vue/compiler-sfc": {
+            "version": "3.2.37",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz",
+            "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/parser": "^7.16.4",
+                "@vue/compiler-core": "3.2.37",
+                "@vue/compiler-dom": "3.2.37",
+                "@vue/compiler-ssr": "3.2.37",
+                "@vue/reactivity-transform": "3.2.37",
+                "@vue/shared": "3.2.37",
+                "estree-walker": "^2.0.2",
+                "magic-string": "^0.25.7",
+                "postcss": "^8.1.10",
+                "source-map": "^0.6.1"
+            }
+        },
+        "node_modules/@vue/compiler-sfc/node_modules/magic-string": {
+            "version": "0.25.9",
+            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+            "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+            "dev": true,
+            "dependencies": {
+                "sourcemap-codec": "^1.4.8"
+            }
+        },
+        "node_modules/@vue/compiler-ssr": {
+            "version": "3.2.37",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz",
+            "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==",
+            "dev": true,
+            "dependencies": {
+                "@vue/compiler-dom": "3.2.37",
+                "@vue/shared": "3.2.37"
+            }
+        },
+        "node_modules/@vue/devtools-api": {
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.0.tgz",
+            "integrity": "sha512-pF1G4wky+hkifDiZSWn8xfuLOJI1ZXtuambpBEYaf7Xaf6zC/pM29rvAGpd3qaGXnr4BAXU1Pxz/VfvBGwexGA==",
+            "dev": true
+        },
+        "node_modules/@vue/reactivity": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.36.tgz",
+            "integrity": "sha512-c2qvopo0crh9A4GXi2/2kfGYMxsJW4tVILrqRPydVGZHhq0fnzy6qmclWOhBFckEhmyxmpHpdJtIRYGeKcuhnA==",
+            "dev": true,
+            "dependencies": {
+                "@vue/shared": "3.2.36"
+            }
+        },
+        "node_modules/@vue/reactivity-transform": {
+            "version": "3.2.37",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz",
+            "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/parser": "^7.16.4",
+                "@vue/compiler-core": "3.2.37",
+                "@vue/shared": "3.2.37",
+                "estree-walker": "^2.0.2",
+                "magic-string": "^0.25.7"
+            }
+        },
+        "node_modules/@vue/reactivity-transform/node_modules/magic-string": {
+            "version": "0.25.9",
+            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+            "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+            "dev": true,
+            "dependencies": {
+                "sourcemap-codec": "^1.4.8"
+            }
+        },
+        "node_modules/@vue/reactivity/node_modules/@vue/shared": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
+            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
+            "dev": true
+        },
+        "node_modules/@vue/runtime-core": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.36.tgz",
+            "integrity": "sha512-PTWBD+Lub+1U3/KhbCExrfxyS14hstLX+cBboxVHaz+kXoiDLNDEYAovPtxeTutbqtClIXtft+wcGdC+FUQ9qQ==",
+            "dev": true,
+            "dependencies": {
+                "@vue/reactivity": "3.2.36",
+                "@vue/shared": "3.2.36"
+            }
+        },
+        "node_modules/@vue/runtime-core/node_modules/@vue/shared": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
+            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
+            "dev": true
+        },
+        "node_modules/@vue/runtime-dom": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.36.tgz",
+            "integrity": "sha512-gYPYblm7QXHVuBohqNRRT7Wez0f2Mx2D40rb4fleehrJU9CnkjG0phhcGEZFfGwCmHZRqBCRgbFWE98bPULqkg==",
+            "dev": true,
+            "dependencies": {
+                "@vue/runtime-core": "3.2.36",
+                "@vue/shared": "3.2.36",
+                "csstype": "^2.6.8"
+            }
+        },
+        "node_modules/@vue/runtime-dom/node_modules/@vue/shared": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
+            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
+            "dev": true
+        },
+        "node_modules/@vue/server-renderer": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.36.tgz",
+            "integrity": "sha512-uZE0+jfye6yYXWvAQYeHZv+f50sRryvy16uiqzk3jn8hEY8zTjI+rzlmZSGoE915k+W/Ol9XSw6vxOUD8dGkUg==",
+            "dev": true,
+            "dependencies": {
+                "@vue/compiler-ssr": "3.2.36",
+                "@vue/shared": "3.2.36"
+            },
+            "peerDependencies": {
+                "vue": "3.2.36"
+            }
+        },
+        "node_modules/@vue/server-renderer/node_modules/@vue/compiler-core": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.36.tgz",
+            "integrity": "sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/parser": "^7.16.4",
+                "@vue/shared": "3.2.36",
+                "estree-walker": "^2.0.2",
+                "source-map": "^0.6.1"
+            }
+        },
+        "node_modules/@vue/server-renderer/node_modules/@vue/compiler-dom": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.36.tgz",
+            "integrity": "sha512-tcOTAOiW4s24QLnq+ON6J+GRONXJ+A/mqKCORi0LSlIh8XQlNnlm24y8xIL8la+ZDgkdbjarQ9ZqYSvEja6gVA==",
+            "dev": true,
+            "dependencies": {
+                "@vue/compiler-core": "3.2.36",
+                "@vue/shared": "3.2.36"
+            }
+        },
+        "node_modules/@vue/server-renderer/node_modules/@vue/compiler-ssr": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.36.tgz",
+            "integrity": "sha512-+KugInUFRvOxEdLkZwE+W43BqHyhBh0jpYXhmqw1xGq2dmE6J9eZ8UUSOKNhdHtQ/iNLWWeK/wPZkVLUf3YGaw==",
+            "dev": true,
+            "dependencies": {
+                "@vue/compiler-dom": "3.2.36",
+                "@vue/shared": "3.2.36"
+            }
+        },
+        "node_modules/@vue/server-renderer/node_modules/@vue/shared": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
+            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
+            "dev": true
+        },
+        "node_modules/@vue/shared": {
+            "version": "3.2.37",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz",
+            "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==",
+            "dev": true
+        },
+        "node_modules/abab": {
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+            "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+            "dev": true
+        },
+        "node_modules/abbrev": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+            "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+        },
+        "node_modules/accepts": {
+            "version": "1.3.8",
+            "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+            "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+            "dependencies": {
+                "mime-types": "~2.1.34",
+                "negotiator": "0.6.3"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/acorn": {
+            "version": "8.7.1",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+            "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+            "dev": true,
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/acorn-globals": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+            "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+            "dev": true,
+            "dependencies": {
+                "acorn": "^7.1.1",
+                "acorn-walk": "^7.1.1"
+            }
+        },
+        "node_modules/acorn-globals/node_modules/acorn": {
+            "version": "7.4.1",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+            "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+            "dev": true,
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/acorn-jsx": {
+            "version": "5.3.2",
+            "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+            "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+            "dev": true,
+            "peerDependencies": {
+                "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+            }
+        },
+        "node_modules/acorn-walk": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+            "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/aedes": {
+            "version": "0.46.3",
+            "resolved": "https://registry.npmjs.org/aedes/-/aedes-0.46.3.tgz",
+            "integrity": "sha512-i3B+H74uNRhlqcs/JdrMp7e3daz4Cwls0x4yLcfjGXz2tIwnxhF6od4m86O6yyNdz/Gg3jfY3q0sc/Cz8qzg6g==",
+            "dev": true,
+            "dependencies": {
+                "aedes-packet": "^2.3.1",
+                "aedes-persistence": "^8.1.3",
+                "bulk-write-stream": "^2.0.1",
+                "end-of-stream": "^1.4.4",
+                "fastfall": "^1.5.1",
+                "fastparallel": "^2.4.1",
+                "fastseries": "^2.0.0",
+                "hyperid": "^3.0.0",
+                "mqemitter": "^4.5.0",
+                "mqtt-packet": "^7.1.2",
+                "readable-stream": "^3.6.0",
+                "retimer": "^3.0.0",
+                "reusify": "^1.0.4",
+                "uuid": "^8.3.2"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/aedes-packet": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/aedes-packet/-/aedes-packet-2.3.1.tgz",
+            "integrity": "sha512-LqBd57uc2rui2RbjycW17dylglejG26mM4ewVXGNDnVp/SUHFVEgm7d1HTmYrnSkSCNoHti042qgcTwv/F+BtQ==",
+            "dev": true,
+            "dependencies": {
+                "mqtt-packet": "^6.3.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/aedes-packet/node_modules/mqtt-packet": {
+            "version": "6.10.0",
+            "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz",
+            "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==",
+            "dev": true,
+            "dependencies": {
+                "bl": "^4.0.2",
+                "debug": "^4.1.1",
+                "process-nextick-args": "^2.0.1"
+            }
+        },
+        "node_modules/aedes-persistence": {
+            "version": "8.1.3",
+            "resolved": "https://registry.npmjs.org/aedes-persistence/-/aedes-persistence-8.1.3.tgz",
+            "integrity": "sha512-VMCjEV+2g1TNJb/IlDEUy6SP9crT+QUhe2xc6UjyqrFNBNgTvHmOefXY7FxWrwmR2QA02vwg3+5p/JXkyg/Dkw==",
+            "dev": true,
+            "dependencies": {
+                "aedes-packet": "^2.3.1",
+                "from2": "^2.3.0",
+                "qlobber": "^5.0.3"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/agent-base": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+            "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+            "dependencies": {
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6.0.0"
+            }
+        },
+        "node_modules/ajv": {
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+            "devOptional": true,
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "fast-json-stable-stringify": "^2.0.0",
+                "json-schema-traverse": "^0.4.1",
+                "uri-js": "^4.2.2"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/epoberezkin"
+            }
+        },
+        "node_modules/anafanafo": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-2.0.0.tgz",
+            "integrity": "sha512-Nlfq7NC4AOkTJerWRIZcOAiMNtIDVIGWGvQ98O7Jl6Kr2Dk0dX5u4MqN778kSRTy5KRqchpLdF2RtLFEz9FVkQ==",
+            "dependencies": {
+                "char-width-table-consumer": "^1.0.0"
+            }
+        },
+        "node_modules/ansi-escapes": {
+            "version": "4.3.2",
+            "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+            "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+            "dev": true,
+            "dependencies": {
+                "type-fest": "^0.21.3"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^1.9.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/anymatch": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+            "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+            "dev": true,
+            "dependencies": {
+                "normalize-path": "^3.0.0",
+                "picomatch": "^2.0.4"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/aproba": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+            "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
+        },
+        "node_modules/are-we-there-yet": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+            "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+            "dependencies": {
+                "delegates": "^1.0.0",
+                "readable-stream": "^3.6.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/argparse": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+            "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+            "dev": true
+        },
+        "node_modules/args-parser": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/args-parser/-/args-parser-1.3.0.tgz",
+            "integrity": "sha512-If3Zi4BSjlQIJ9fgAhSiKi0oJtgMzSqh0H4wvl7XSeO16FKx7QqaHld8lZeEajPX7y1C5qKKeNgyrfyvmjmjUQ=="
+        },
+        "node_modules/arr-union": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+            "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/array-flatten": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+            "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+        },
+        "node_modules/array-union": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+            "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/arrify": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+            "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/asn1": {
+            "version": "0.2.6",
+            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+            "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+            "optional": true,
+            "dependencies": {
+                "safer-buffer": "~2.1.0"
+            }
+        },
+        "node_modules/assert-plus": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+            "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/astral-regex": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+            "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/asynckit": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+            "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+        },
+        "node_modules/await-lock": {
+            "version": "2.2.2",
+            "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
+            "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw=="
+        },
+        "node_modules/aws-sign2": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+            "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+            "optional": true,
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/aws4": {
+            "version": "1.11.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+            "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+            "optional": true
+        },
+        "node_modules/axios": {
+            "version": "0.27.2",
+            "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+            "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+            "dependencies": {
+                "follow-redirects": "^1.14.9",
+                "form-data": "^4.0.0"
+            }
+        },
+        "node_modules/axios-ntlm": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.0.tgz",
+            "integrity": "sha512-NPNsIMO1SGX5scs3ZWJqsV7iRLvET+DlRl94aZ7Sx14zA8RTQh9EDxsJmxB9cKjardKfp2Vge444uYYLfvWC0Q==",
+            "dependencies": {
+                "axios": "^0.21.3",
+                "dev-null": "^0.1.1"
+            }
+        },
+        "node_modules/axios-ntlm/node_modules/axios": {
+            "version": "0.21.4",
+            "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+            "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+            "dependencies": {
+                "follow-redirects": "^1.14.0"
+            }
+        },
+        "node_modules/babel-jest": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
+            "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+            "dev": true,
+            "dependencies": {
+                "@jest/transform": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/babel__core": "^7.1.14",
+                "babel-plugin-istanbul": "^6.1.1",
+                "babel-preset-jest": "^27.5.1",
+                "chalk": "^4.0.0",
+                "graceful-fs": "^4.2.9",
+                "slash": "^3.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.8.0"
+            }
+        },
+        "node_modules/babel-jest/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/babel-jest/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/babel-jest/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/babel-jest/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/babel-jest/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/babel-jest/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/babel-plugin-add-module-exports": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz",
+            "integrity": "sha512-3AN/9V/rKuv90NG65m4tTHsI04XrCKsWbztIcW7a8H5iIN7WlvWucRtVV0V/rT4QvtA11n5Vmp20fLwfMWqp6g==",
+            "dev": true
+        },
+        "node_modules/babel-plugin-dynamic-import-node": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+            "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+            "dev": true,
+            "dependencies": {
+                "object.assign": "^4.1.0"
+            }
+        },
+        "node_modules/babel-plugin-istanbul": {
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+            "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.0.0",
+                "@istanbuljs/load-nyc-config": "^1.0.0",
+                "@istanbuljs/schema": "^0.1.2",
+                "istanbul-lib-instrument": "^5.0.4",
+                "test-exclude": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/babel-plugin-jest-hoist": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
+            "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/template": "^7.3.3",
+                "@babel/types": "^7.3.3",
+                "@types/babel__core": "^7.0.0",
+                "@types/babel__traverse": "^7.0.6"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/babel-plugin-polyfill-corejs2": {
+            "version": "0.3.1",
+            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
+            "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
+            "dev": true,
+            "dependencies": {
+                "@babel/compat-data": "^7.13.11",
+                "@babel/helper-define-polyfill-provider": "^0.3.1",
+                "semver": "^6.1.1"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/babel-plugin-polyfill-corejs3": {
+            "version": "0.5.2",
+            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
+            "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-define-polyfill-provider": "^0.3.1",
+                "core-js-compat": "^3.21.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/babel-plugin-polyfill-regenerator": {
+            "version": "0.3.1",
+            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
+            "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-define-polyfill-provider": "^0.3.1"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/babel-plugin-rewire": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/babel-plugin-rewire/-/babel-plugin-rewire-1.2.0.tgz",
+            "integrity": "sha512-JBZxczHw3tScS+djy6JPLMjblchGhLI89ep15H3SyjujIzlxo5nr6Yjo7AXotdeVczeBmWs0tF8PgJWDdgzAkQ==",
+            "dev": true
+        },
+        "node_modules/babel-preset-current-node-syntax": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+            "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/plugin-syntax-async-generators": "^7.8.4",
+                "@babel/plugin-syntax-bigint": "^7.8.3",
+                "@babel/plugin-syntax-class-properties": "^7.8.3",
+                "@babel/plugin-syntax-import-meta": "^7.8.3",
+                "@babel/plugin-syntax-json-strings": "^7.8.3",
+                "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+                "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+                "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+                "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+                "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+                "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+                "@babel/plugin-syntax-top-level-await": "^7.8.3"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/babel-preset-jest": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
+            "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+            "dev": true,
+            "dependencies": {
+                "babel-plugin-jest-hoist": "^27.5.1",
+                "babel-preset-current-node-syntax": "^1.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/babel-runtime": {
+            "version": "6.26.0",
+            "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+            "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+            "dev": true,
+            "dependencies": {
+                "core-js": "^2.4.0",
+                "regenerator-runtime": "^0.11.0"
+            }
+        },
+        "node_modules/babel-runtime/node_modules/core-js": {
+            "version": "2.6.12",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+            "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+            "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+            "dev": true,
+            "hasInstallScript": true
+        },
+        "node_modules/babel-runtime/node_modules/regenerator-runtime": {
+            "version": "0.11.1",
+            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+            "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+            "dev": true
+        },
+        "node_modules/backo2": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+            "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA=="
+        },
+        "node_modules/badge-maker": {
+            "version": "3.3.1",
+            "resolved": "https://registry.npmjs.org/badge-maker/-/badge-maker-3.3.1.tgz",
+            "integrity": "sha512-OO/PS7Zg2E6qaUWzHEHt21Q5VjcFBAJVA8ztgT/fIdSZFBUwoyeo0ZhA6V5tUM8Vcjq8DJl6jfGhpjESssyqMQ==",
+            "dependencies": {
+                "anafanafo": "2.0.0",
+                "css-color-converter": "^2.0.0"
+            },
+            "bin": {
+                "badge": "lib/badge-cli.js"
+            },
+            "engines": {
+                "node": ">= 10",
+                "npm": ">= 5"
+            }
+        },
+        "node_modules/balanced-match": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+        },
+        "node_modules/base64-js": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+            "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/base64id": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+            "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+            "engines": {
+                "node": "^4.5.0 || >= 5.9"
+            }
+        },
+        "node_modules/basic-auth": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+            "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
+            "dependencies": {
+                "safe-buffer": "5.1.2"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/bcrypt-pbkdf": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+            "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+            "optional": true,
+            "dependencies": {
+                "tweetnacl": "^0.14.3"
+            }
+        },
+        "node_modules/bcryptjs": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+            "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
+        },
+        "node_modules/before-after-hook": {
+            "version": "2.2.2",
+            "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
+            "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==",
+            "dev": true
+        },
+        "node_modules/binary-extensions": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/binary-search": {
+            "version": "1.3.6",
+            "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz",
+            "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA=="
+        },
+        "node_modules/bintrees": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz",
+            "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw=="
+        },
+        "node_modules/bl": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+            "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+            "dependencies": {
+                "buffer": "^5.5.0",
+                "inherits": "^2.0.4",
+                "readable-stream": "^3.4.0"
+            }
+        },
+        "node_modules/body-parser": {
+            "version": "1.19.2",
+            "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
+            "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
+            "dependencies": {
+                "bytes": "3.1.2",
+                "content-type": "~1.0.4",
+                "debug": "2.6.9",
+                "depd": "~1.1.2",
+                "http-errors": "1.8.1",
+                "iconv-lite": "0.4.24",
+                "on-finished": "~2.3.0",
+                "qs": "6.9.7",
+                "raw-body": "2.4.3",
+                "type-is": "~1.6.18"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/body-parser/node_modules/bytes": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+            "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/body-parser/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/body-parser/node_modules/iconv-lite": {
+            "version": "0.4.24",
+            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+            "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+            "dependencies": {
+                "safer-buffer": ">= 2.1.2 < 3"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/body-parser/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        },
+        "node_modules/boolbase": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+            "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+        },
+        "node_modules/boolean": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+            "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="
+        },
+        "node_modules/bootstrap": {
+            "version": "5.1.3",
+            "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
+            "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
+            "dev": true,
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/bootstrap"
+            },
+            "peerDependencies": {
+                "@popperjs/core": "^2.10.2"
+            }
+        },
+        "node_modules/brace-expansion": {
+            "version": "1.1.11",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+            "dependencies": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "node_modules/braces": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+            "dev": true,
+            "dependencies": {
+                "fill-range": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/bree": {
+            "version": "7.1.5",
+            "resolved": "https://registry.npmjs.org/bree/-/bree-7.1.5.tgz",
+            "integrity": "sha512-YAs4VQDjc6p3NhNNHBkS9NXK4wryeMq7Y/SCMcgFh0cSD4oXk7B9v53/cqzoejdelD30KEliumzrd4awka+YhQ==",
+            "dependencies": {
+                "@breejs/later": "^4.1.0",
+                "boolean": "^3.1.4",
+                "combine-errors": "^3.0.3",
+                "cron-validate": "^1.4.3",
+                "debug": "^4.3.3",
+                "human-interval": "^2.0.1",
+                "is-string-and-not-blank": "^0.0.2",
+                "is-valid-path": "^0.1.1",
+                "ms": "^2.1.3",
+                "p-wait-for": "3",
+                "safe-timers": "^1.1.0"
+            },
+            "engines": {
+                "node": ">= 12.11.0"
+            }
+        },
+        "node_modules/browser-process-hrtime": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+            "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+            "dev": true
+        },
+        "node_modules/browserslist": {
+            "version": "4.21.1",
+            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz",
+            "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/browserslist"
+                }
+            ],
+            "dependencies": {
+                "caniuse-lite": "^1.0.30001359",
+                "electron-to-chromium": "^1.4.172",
+                "node-releases": "^2.0.5",
+                "update-browserslist-db": "^1.0.4"
+            },
+            "bin": {
+                "browserslist": "cli.js"
+            },
+            "engines": {
+                "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+            }
+        },
+        "node_modules/bser": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+            "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+            "dev": true,
+            "dependencies": {
+                "node-int64": "^0.4.0"
+            }
+        },
+        "node_modules/buffer": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+            "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "dependencies": {
+                "base64-js": "^1.3.1",
+                "ieee754": "^1.1.13"
+            }
+        },
+        "node_modules/buffer-crc32": {
+            "version": "0.2.13",
+            "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+            "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+            "dev": true,
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/buffer-equal-constant-time": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+            "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+        },
+        "node_modules/buffer-from": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+            "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+        },
+        "node_modules/buffer-writer": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
+            "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/bulk-write-stream": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz",
+            "integrity": "sha512-XWOLjgHtpDasHfwM8oO4df1JoZwa7/OwTsXDzh4rUTo+9CowzeOFBZz43w+H14h1fyq+xl28tVIBrdjcjj4Gug==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "readable-stream": "^3.1.1"
+            }
+        },
+        "node_modules/bytes": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+            "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/cacheable-lookup": {
+            "version": "6.0.4",
+            "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz",
+            "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A==",
+            "engines": {
+                "node": ">=10.6.0"
+            }
+        },
+        "node_modules/call-bind": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+            "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+            "dependencies": {
+                "function-bind": "^1.1.1",
+                "get-intrinsic": "^1.0.2"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/callsites": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+            "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/camelcase": {
+            "version": "5.3.1",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/camelcase-keys": {
+            "version": "6.2.2",
+            "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+            "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+            "dev": true,
+            "dependencies": {
+                "camelcase": "^5.3.1",
+                "map-obj": "^4.0.0",
+                "quick-lru": "^4.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/caniuse-lite": {
+            "version": "1.0.30001362",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001362.tgz",
+            "integrity": "sha512-PFykHuC7BQTzCGQFaV6wD8IDRM3HpI83BXr99nNJhoOyDufgSuKlt0QVlWYt5ZJtEYFeuNVF5QY3kJcu8hVFjQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+                }
+            ]
+        },
+        "node_modules/caseless": {
+            "version": "0.12.0",
+            "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+            "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+            "optional": true
+        },
+        "node_modules/chalk": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^3.2.1",
+                "escape-string-regexp": "^1.0.5",
+                "supports-color": "^5.3.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/char-regex": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+            "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/char-width-table-consumer": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/char-width-table-consumer/-/char-width-table-consumer-1.0.0.tgz",
+            "integrity": "sha512-Fz4UD0LBpxPgL9i29CJ5O4KANwaMnX/OhhbxzvNa332h+9+nRKyeuLw4wA51lt/ex67+/AdsoBQJF3kgX2feYQ==",
+            "dependencies": {
+                "binary-search": "^1.3.5"
+            }
+        },
+        "node_modules/chardet": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.4.0.tgz",
+            "integrity": "sha512-NpwMDdSIprbYx1CLnfbxEIarI0Z+s9MssEgggMNheGM+WD68yOhV7IEA/3r6tr0yTRgQD0HuZJDw32s99i6L+A=="
+        },
+        "node_modules/chart.js": {
+            "version": "3.6.2",
+            "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.2.tgz",
+            "integrity": "sha512-Xz7f/fgtVltfQYWq0zL1Xbv7N2inpG+B54p3D5FSvpCdy3sM+oZhbqa42eNuYXltaVvajgX5UpKCU2GeeJIgxg==",
+            "dev": true
+        },
+        "node_modules/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==",
+            "dev": true,
+            "peerDependencies": {
+                "chart.js": ">= 2.8.0 < 3",
+                "dayjs": "^1.8.15"
+            }
+        },
+        "node_modules/check-password-strength": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/check-password-strength/-/check-password-strength-2.0.5.tgz",
+            "integrity": "sha512-b61T/+4OIGWSMRxJUsYOY44Cf9w7orIt2OQmF/WgH16qbJKIT1jG3XHx3jP+o090eH7rq13DRleKgXCiROBzMQ=="
+        },
+        "node_modules/cheerio": {
+            "version": "1.0.0-rc.12",
+            "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+            "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+            "dependencies": {
+                "cheerio-select": "^2.1.0",
+                "dom-serializer": "^2.0.0",
+                "domhandler": "^5.0.3",
+                "domutils": "^3.0.1",
+                "htmlparser2": "^8.0.1",
+                "parse5": "^7.0.0",
+                "parse5-htmlparser2-tree-adapter": "^7.0.0"
+            },
+            "engines": {
+                "node": ">= 6"
+            },
+            "funding": {
+                "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+            }
+        },
+        "node_modules/cheerio-select": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+            "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+            "dependencies": {
+                "boolbase": "^1.0.0",
+                "css-select": "^5.1.0",
+                "css-what": "^6.1.0",
+                "domelementtype": "^2.3.0",
+                "domhandler": "^5.0.3",
+                "domutils": "^3.0.1"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/fb55"
+            }
+        },
+        "node_modules/chokidar": {
+            "version": "3.5.3",
+            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+            "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://paulmillr.com/funding/"
+                }
+            ],
+            "dependencies": {
+                "anymatch": "~3.1.2",
+                "braces": "~3.0.2",
+                "glob-parent": "~5.1.2",
+                "is-binary-path": "~2.1.0",
+                "is-glob": "~4.0.1",
+                "normalize-path": "~3.0.0",
+                "readdirp": "~3.6.0"
+            },
+            "engines": {
+                "node": ">= 8.10.0"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.2"
+            }
+        },
+        "node_modules/chokidar/node_modules/glob-parent": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+            "dev": true,
+            "dependencies": {
+                "is-glob": "^4.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/chownr": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+            "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/chroma-js": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz",
+            "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
+        },
+        "node_modules/ci-info": {
+            "version": "3.3.2",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz",
+            "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==",
+            "dev": true
+        },
+        "node_modules/cjs-module-lexer": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
+            "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
+            "dev": true
+        },
+        "node_modules/cliui": {
+            "version": "7.0.4",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+            "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+            "dev": true,
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.0",
+                "wrap-ansi": "^7.0.0"
+            }
+        },
+        "node_modules/clone-deep": {
+            "version": "0.2.4",
+            "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
+            "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==",
+            "dev": true,
+            "dependencies": {
+                "for-own": "^0.1.3",
+                "is-plain-object": "^2.0.1",
+                "kind-of": "^3.0.2",
+                "lazy-cache": "^1.0.3",
+                "shallow-clone": "^0.1.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/clone-deep/node_modules/is-plain-object": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+            "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+            "dev": true,
+            "dependencies": {
+                "isobject": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/clone-regexp": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
+            "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==",
+            "dev": true,
+            "dependencies": {
+                "is-regexp": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/co": {
+            "version": "4.6.0",
+            "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+            "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+            "dev": true,
+            "engines": {
+                "iojs": ">= 1.0.0",
+                "node": ">= 0.12.0"
+            }
+        },
+        "node_modules/code-point-at": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+            "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/collect-v8-coverage": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+            "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+            "dev": true
+        },
+        "node_modules/color-convert": {
+            "version": "1.9.3",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "1.1.3"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+            "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+            "dev": true
+        },
+        "node_modules/color-support": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+            "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+            "bin": {
+                "color-support": "bin.js"
+            }
+        },
+        "node_modules/colord": {
+            "version": "2.9.2",
+            "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
+            "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==",
+            "dev": true
+        },
+        "node_modules/colorette": {
+            "version": "2.0.16",
+            "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
+            "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
+        },
+        "node_modules/combine-errors": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz",
+            "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==",
+            "dependencies": {
+                "custom-error-instance": "2.1.1",
+                "lodash.uniqby": "4.5.0"
+            }
+        },
+        "node_modules/combined-stream": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+            "dependencies": {
+                "delayed-stream": "~1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/command-exists": {
+            "version": "1.2.9",
+            "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
+            "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="
+        },
+        "node_modules/commander": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+            "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/commist": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz",
+            "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==",
+            "dependencies": {
+                "leven": "^2.1.0",
+                "minimist": "^1.1.0"
+            }
+        },
+        "node_modules/commist/node_modules/leven": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
+            "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/compare-versions": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
+            "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
+        },
+        "node_modules/component-emitter": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+            "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+        },
+        "node_modules/compressible": {
+            "version": "2.0.18",
+            "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+            "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+            "dependencies": {
+                "mime-db": ">= 1.43.0 < 2"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/compression": {
+            "version": "1.7.4",
+            "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+            "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+            "dependencies": {
+                "accepts": "~1.3.5",
+                "bytes": "3.0.0",
+                "compressible": "~2.0.16",
+                "debug": "2.6.9",
+                "on-headers": "~1.0.2",
+                "safe-buffer": "5.1.2",
+                "vary": "~1.1.2"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/compression/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/compression/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        },
+        "node_modules/concat-map": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+        },
+        "node_modules/concat-stream": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+            "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+            "engines": [
+                "node >= 6.0"
+            ],
+            "dependencies": {
+                "buffer-from": "^1.0.0",
+                "inherits": "^2.0.3",
+                "readable-stream": "^3.0.2",
+                "typedarray": "^0.0.6"
+            }
+        },
+        "node_modules/concurrently": {
+            "version": "7.2.2",
+            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.2.tgz",
+            "integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==",
+            "dev": true,
+            "dependencies": {
+                "chalk": "^4.1.0",
+                "date-fns": "^2.16.1",
+                "lodash": "^4.17.21",
+                "rxjs": "^7.0.0",
+                "shell-quote": "^1.7.3",
+                "spawn-command": "^0.0.2-1",
+                "supports-color": "^8.1.0",
+                "tree-kill": "^1.2.2",
+                "yargs": "^17.3.1"
+            },
+            "bin": {
+                "concurrently": "dist/bin/concurrently.js"
+            },
+            "engines": {
+                "node": "^12.20.0 || ^14.13.0 || >=16.0.0"
+            }
+        },
+        "node_modules/concurrently/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/concurrently/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/concurrently/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/concurrently/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/concurrently/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/concurrently/node_modules/supports-color": {
+            "version": "8.1.1",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+            "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/supports-color?sponsor=1"
+            }
+        },
+        "node_modules/console-control-strings": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+            "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
+        },
+        "node_modules/content-disposition": {
+            "version": "0.5.4",
+            "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+            "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+            "dependencies": {
+                "safe-buffer": "5.2.1"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/content-disposition/node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/content-type": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+            "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/convert-source-map": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+            "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+            "dev": true,
+            "dependencies": {
+                "safe-buffer": "~5.1.1"
+            }
+        },
+        "node_modules/cookie": {
+            "version": "0.4.2",
+            "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+            "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/cookie-signature": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+            "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+        },
+        "node_modules/core-js": {
+            "version": "3.18.3",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz",
+            "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==",
+            "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+            "dev": true,
+            "hasInstallScript": true,
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/core-js"
+            }
+        },
+        "node_modules/core-js-compat": {
+            "version": "3.23.3",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz",
+            "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==",
+            "dev": true,
+            "dependencies": {
+                "browserslist": "^4.21.0",
+                "semver": "7.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/core-js"
+            }
+        },
+        "node_modules/core-js-compat/node_modules/semver": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+            "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver.js"
+            }
+        },
+        "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+            "devOptional": true
+        },
+        "node_modules/cors": {
+            "version": "2.8.5",
+            "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+            "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+            "dependencies": {
+                "object-assign": "^4",
+                "vary": "^1"
+            },
+            "engines": {
+                "node": ">= 0.10"
+            }
+        },
+        "node_modules/cosmiconfig": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
+            "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+            "dev": true,
+            "dependencies": {
+                "@types/parse-json": "^4.0.0",
+                "import-fresh": "^3.2.1",
+                "parse-json": "^5.0.0",
+                "path-type": "^4.0.0",
+                "yaml": "^1.10.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/cron-validate": {
+            "version": "1.4.3",
+            "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.3.tgz",
+            "integrity": "sha512-N+qKw019oQBEPIP5Qwi8Z5XelQ00ThN6Maahwv+9UGu2u/b/MPb35zngMQI0T8pBoNiBrIXGlhvsmspNSYae/w==",
+            "dependencies": {
+                "yup": "0.32.9"
+            }
+        },
+        "node_modules/cross-env": {
+            "version": "7.0.3",
+            "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+            "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+            "dev": true,
+            "dependencies": {
+                "cross-spawn": "^7.0.1"
+            },
+            "bin": {
+                "cross-env": "src/bin/cross-env.js",
+                "cross-env-shell": "src/bin/cross-env-shell.js"
+            },
+            "engines": {
+                "node": ">=10.14",
+                "npm": ">=6",
+                "yarn": ">=1"
+            }
+        },
+        "node_modules/cross-spawn": {
+            "version": "7.0.3",
+            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+            "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+            "dev": true,
+            "dependencies": {
+                "path-key": "^3.1.0",
+                "shebang-command": "^2.0.0",
+                "which": "^2.0.1"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/css-color-converter": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/css-color-converter/-/css-color-converter-2.0.0.tgz",
+            "integrity": "sha512-oLIG2soZz3wcC3aAl/7Us5RS8Hvvc6I8G8LniF/qfMmrm7fIKQ8RIDDRZeKyGL2SrWfNqYspuLShbnjBMVWm8g==",
+            "dependencies": {
+                "color-convert": "^0.5.2",
+                "color-name": "^1.1.4",
+                "css-unit-converter": "^1.1.2"
+            }
+        },
+        "node_modules/css-color-converter/node_modules/color-convert": {
+            "version": "0.5.3",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz",
+            "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling=="
+        },
+        "node_modules/css-color-converter/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "node_modules/css-functions-list": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz",
+            "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==",
+            "dev": true,
+            "engines": {
+                "node": ">=12.22"
+            }
+        },
+        "node_modules/css-select": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+            "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+            "dependencies": {
+                "boolbase": "^1.0.0",
+                "css-what": "^6.1.0",
+                "domhandler": "^5.0.2",
+                "domutils": "^3.0.1",
+                "nth-check": "^2.0.1"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/fb55"
+            }
+        },
+        "node_modules/css-unit-converter": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
+            "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA=="
+        },
+        "node_modules/css-what": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+            "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+            "engines": {
+                "node": ">= 6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/fb55"
+            }
+        },
+        "node_modules/cssesc": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+            "dev": true,
+            "bin": {
+                "cssesc": "bin/cssesc"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/cssom": {
+            "version": "0.4.4",
+            "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+            "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+            "dev": true
+        },
+        "node_modules/cssstyle": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+            "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+            "dev": true,
+            "dependencies": {
+                "cssom": "~0.3.6"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cssstyle/node_modules/cssom": {
+            "version": "0.3.8",
+            "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+            "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+            "dev": true
+        },
+        "node_modules/csstype": {
+            "version": "2.6.20",
+            "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
+            "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
+            "dev": true
+        },
+        "node_modules/custom-error-instance": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz",
+            "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg=="
+        },
+        "node_modules/cwd": {
+            "version": "0.10.0",
+            "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz",
+            "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==",
+            "dev": true,
+            "dependencies": {
+                "find-pkg": "^0.1.2",
+                "fs-exists-sync": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/dashdash": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+            "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+            "optional": true,
+            "dependencies": {
+                "assert-plus": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/data-urls": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+            "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+            "dev": true,
+            "dependencies": {
+                "abab": "^2.0.3",
+                "whatwg-mimetype": "^2.3.0",
+                "whatwg-url": "^8.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/date-fns": {
+            "version": "2.28.0",
+            "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+            "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.11"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/date-fns"
+            }
+        },
+        "node_modules/dayjs": {
+            "version": "1.11.3",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz",
+            "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A=="
+        },
+        "node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/debug/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "node_modules/decamelize": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+            "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/decamelize-keys": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+            "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
+            "dev": true,
+            "dependencies": {
+                "decamelize": "^1.1.0",
+                "map-obj": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/decamelize-keys/node_modules/map-obj": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+            "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/decimal.js": {
+            "version": "10.3.1",
+            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
+            "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
+            "dev": true
+        },
+        "node_modules/dedent": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+            "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+            "dev": true
+        },
+        "node_modules/deep-is": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+            "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+            "dev": true
+        },
+        "node_modules/deepmerge": {
+            "version": "4.2.2",
+            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+            "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/define-lazy-prop": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+            "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/define-properties": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+            "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+            "dependencies": {
+                "has-property-descriptors": "^1.0.0",
+                "object-keys": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/delayed-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+            "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/delegates": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+            "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
+        },
+        "node_modules/depd": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+            "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/deprecation": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+            "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
+            "dev": true
+        },
+        "node_modules/destroy": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+            "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg=="
+        },
+        "node_modules/detect-libc": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
+            "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/detect-newline": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+            "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/dev-null": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz",
+            "integrity": "sha512-nMNZG0zfMgmdv8S5O0TM5cpwNbGKRGPCxVsr0SmA3NZZy9CYBbuNLL0PD3Acx9e5LIUgwONXtM9kM6RlawPxEQ=="
+        },
+        "node_modules/devtools-protocol": {
+            "version": "0.0.948846",
+            "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.948846.tgz",
+            "integrity": "sha512-5fGyt9xmMqUl2VI7+rnUkKCiAQIpLns8sfQtTENy5L70ktbNw0Z3TFJ1JoFNYdx/jffz4YXU45VF75wKZD7sZQ==",
+            "dev": true
+        },
+        "node_modules/diff-sequences": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+            "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+            "dev": true,
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/dijkstrajs": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
+            "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==",
+            "dev": true
+        },
+        "node_modules/dir-glob": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+            "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+            "dev": true,
+            "dependencies": {
+                "path-type": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/dns2": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/dns2/-/dns2-2.0.2.tgz",
+            "integrity": "sha512-XYBUv6/CyGAGkeyXOeHhjKscHm2b70oSl1as1C2qLVWvZKJLdzxv/LsyyEJeMdbkCS48OyajfBhP6NpO55gQww==",
+            "dev": true
+        },
+        "node_modules/doctrine": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+            "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+            "dev": true,
+            "dependencies": {
+                "esutils": "^2.0.2"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/dom-serializer": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+            "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+            "dependencies": {
+                "domelementtype": "^2.3.0",
+                "domhandler": "^5.0.2",
+                "entities": "^4.2.0"
+            },
+            "funding": {
+                "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+            }
+        },
+        "node_modules/domelementtype": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+            "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/fb55"
+                }
+            ]
+        },
+        "node_modules/domexception": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+            "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+            "dev": true,
+            "dependencies": {
+                "webidl-conversions": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/domexception/node_modules/webidl-conversions": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+            "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/domhandler": {
+            "version": "5.0.3",
+            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+            "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+            "dependencies": {
+                "domelementtype": "^2.3.0"
+            },
+            "engines": {
+                "node": ">= 4"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/domhandler?sponsor=1"
+            }
+        },
+        "node_modules/domutils": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
+            "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
+            "dependencies": {
+                "dom-serializer": "^2.0.0",
+                "domelementtype": "^2.3.0",
+                "domhandler": "^5.0.1"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/domutils?sponsor=1"
+            }
+        },
+        "node_modules/duplexify": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
+            "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+            "dependencies": {
+                "end-of-stream": "^1.4.1",
+                "inherits": "^2.0.3",
+                "readable-stream": "^3.1.1",
+                "stream-shift": "^1.0.0"
+            }
+        },
+        "node_modules/ecc-jsbn": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+            "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+            "optional": true,
+            "dependencies": {
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.1.0"
+            }
+        },
+        "node_modules/ecdsa-sig-formatter": {
+            "version": "1.0.11",
+            "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+            "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+            "dependencies": {
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "node_modules/ee-first": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+            "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+        },
+        "node_modules/electron-to-chromium": {
+            "version": "1.4.177",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.177.tgz",
+            "integrity": "sha512-FYPir3NSBEGexSZUEeht81oVhHfLFl6mhUKSkjHN/iB/TwEIt/WHQrqVGfTLN5gQxwJCQkIJBe05eOXjI7omgg==",
+            "dev": true
+        },
+        "node_modules/emittery": {
+            "version": "0.8.1",
+            "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
+            "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+            }
+        },
+        "node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "node_modules/encode-utf8": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
+            "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==",
+            "dev": true
+        },
+        "node_modules/encodeurl": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+            "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/end-of-stream": {
+            "version": "1.4.4",
+            "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+            "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+            "dependencies": {
+                "once": "^1.4.0"
+            }
+        },
+        "node_modules/engine.io": {
+            "version": "6.1.3",
+            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz",
+            "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==",
+            "dependencies": {
+                "@types/cookie": "^0.4.1",
+                "@types/cors": "^2.8.12",
+                "@types/node": ">=10.0.0",
+                "accepts": "~1.3.4",
+                "base64id": "2.0.0",
+                "cookie": "~0.4.1",
+                "cors": "~2.8.5",
+                "debug": "~4.3.1",
+                "engine.io-parser": "~5.0.3",
+                "ws": "~8.2.3"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/engine.io-client": {
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz",
+            "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==",
+            "dependencies": {
+                "@socket.io/component-emitter": "~3.0.0",
+                "debug": "~4.3.1",
+                "engine.io-parser": "~5.0.0",
+                "has-cors": "1.1.0",
+                "parseqs": "0.0.6",
+                "parseuri": "0.0.6",
+                "ws": "~8.2.3",
+                "xmlhttprequest-ssl": "~2.0.0",
+                "yeast": "0.1.2"
+            }
+        },
+        "node_modules/engine.io-client/node_modules/ws": {
+            "version": "8.2.3",
+            "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
+            "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependencies": {
+                "bufferutil": "^4.0.1",
+                "utf-8-validate": "^5.0.2"
+            },
+            "peerDependenciesMeta": {
+                "bufferutil": {
+                    "optional": true
+                },
+                "utf-8-validate": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/engine.io-parser": {
+            "version": "5.0.4",
+            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
+            "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/engine.io/node_modules/ws": {
+            "version": "8.2.3",
+            "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
+            "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependencies": {
+                "bufferutil": "^4.0.1",
+                "utf-8-validate": "^5.0.2"
+            },
+            "peerDependenciesMeta": {
+                "bufferutil": {
+                    "optional": true
+                },
+                "utf-8-validate": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/entities": {
+            "version": "4.3.1",
+            "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
+            "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
+            "engines": {
+                "node": ">=0.12"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/entities?sponsor=1"
+            }
+        },
+        "node_modules/env-paths": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+            "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+            "optional": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/error-ex": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+            "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+            "dev": true,
+            "dependencies": {
+                "is-arrayish": "^0.2.1"
+            }
+        },
+        "node_modules/es-abstract": {
+            "version": "1.20.1",
+            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz",
+            "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "es-to-primitive": "^1.2.1",
+                "function-bind": "^1.1.1",
+                "function.prototype.name": "^1.1.5",
+                "get-intrinsic": "^1.1.1",
+                "get-symbol-description": "^1.0.0",
+                "has": "^1.0.3",
+                "has-property-descriptors": "^1.0.0",
+                "has-symbols": "^1.0.3",
+                "internal-slot": "^1.0.3",
+                "is-callable": "^1.2.4",
+                "is-negative-zero": "^2.0.2",
+                "is-regex": "^1.1.4",
+                "is-shared-array-buffer": "^1.0.2",
+                "is-string": "^1.0.7",
+                "is-weakref": "^1.0.2",
+                "object-inspect": "^1.12.0",
+                "object-keys": "^1.1.1",
+                "object.assign": "^4.1.2",
+                "regexp.prototype.flags": "^1.4.3",
+                "string.prototype.trimend": "^1.0.5",
+                "string.prototype.trimstart": "^1.0.5",
+                "unbox-primitive": "^1.0.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/es-aggregate-error": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.8.tgz",
+            "integrity": "sha512-AKUb5MKLWMozPlFRHOKqWD7yta5uaEhH21qwtnf6FlKjNjTJOoqFi0/G14+FfSkIQhhu6X68Af4xgRC6y8qG4A==",
+            "dependencies": {
+                "define-properties": "^1.1.4",
+                "es-abstract": "^1.19.5",
+                "function-bind": "^1.1.1",
+                "functions-have-names": "^1.2.3",
+                "get-intrinsic": "^1.1.1",
+                "globalthis": "^1.0.2",
+                "has-property-descriptors": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/es-to-primitive": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+            "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+            "dependencies": {
+                "is-callable": "^1.1.4",
+                "is-date-object": "^1.0.1",
+                "is-symbol": "^1.0.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/esbuild": {
+            "version": "0.14.48",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz",
+            "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==",
+            "dev": true,
+            "hasInstallScript": true,
+            "bin": {
+                "esbuild": "bin/esbuild"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "optionalDependencies": {
+                "esbuild-android-64": "0.14.48",
+                "esbuild-android-arm64": "0.14.48",
+                "esbuild-darwin-64": "0.14.48",
+                "esbuild-darwin-arm64": "0.14.48",
+                "esbuild-freebsd-64": "0.14.48",
+                "esbuild-freebsd-arm64": "0.14.48",
+                "esbuild-linux-32": "0.14.48",
+                "esbuild-linux-64": "0.14.48",
+                "esbuild-linux-arm": "0.14.48",
+                "esbuild-linux-arm64": "0.14.48",
+                "esbuild-linux-mips64le": "0.14.48",
+                "esbuild-linux-ppc64le": "0.14.48",
+                "esbuild-linux-riscv64": "0.14.48",
+                "esbuild-linux-s390x": "0.14.48",
+                "esbuild-netbsd-64": "0.14.48",
+                "esbuild-openbsd-64": "0.14.48",
+                "esbuild-sunos-64": "0.14.48",
+                "esbuild-windows-32": "0.14.48",
+                "esbuild-windows-64": "0.14.48",
+                "esbuild-windows-arm64": "0.14.48"
+            }
+        },
+        "node_modules/esbuild-linux-64": {
+            "version": "0.14.48",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz",
+            "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/escalade": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/escape-html": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+            "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+        },
+        "node_modules/escape-string-regexp": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+            "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/escodegen": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+            "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+            "dev": true,
+            "dependencies": {
+                "esprima": "^4.0.1",
+                "estraverse": "^5.2.0",
+                "esutils": "^2.0.2",
+                "optionator": "^0.8.1"
+            },
+            "bin": {
+                "escodegen": "bin/escodegen.js",
+                "esgenerate": "bin/esgenerate.js"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "optionalDependencies": {
+                "source-map": "~0.6.1"
+            }
+        },
+        "node_modules/escodegen/node_modules/estraverse": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/escodegen/node_modules/levn": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+            "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+            "dev": true,
+            "dependencies": {
+                "prelude-ls": "~1.1.2",
+                "type-check": "~0.3.2"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/escodegen/node_modules/optionator": {
+            "version": "0.8.3",
+            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+            "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+            "dev": true,
+            "dependencies": {
+                "deep-is": "~0.1.3",
+                "fast-levenshtein": "~2.0.6",
+                "levn": "~0.3.0",
+                "prelude-ls": "~1.1.2",
+                "type-check": "~0.3.2",
+                "word-wrap": "~1.2.3"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/escodegen/node_modules/prelude-ls": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+            "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/escodegen/node_modules/type-check": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+            "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+            "dev": true,
+            "dependencies": {
+                "prelude-ls": "~1.1.2"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/eslint": {
+            "version": "8.14.0",
+            "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz",
+            "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==",
+            "dev": true,
+            "dependencies": {
+                "@eslint/eslintrc": "^1.2.2",
+                "@humanwhocodes/config-array": "^0.9.2",
+                "ajv": "^6.10.0",
+                "chalk": "^4.0.0",
+                "cross-spawn": "^7.0.2",
+                "debug": "^4.3.2",
+                "doctrine": "^3.0.0",
+                "escape-string-regexp": "^4.0.0",
+                "eslint-scope": "^7.1.1",
+                "eslint-utils": "^3.0.0",
+                "eslint-visitor-keys": "^3.3.0",
+                "espree": "^9.3.1",
+                "esquery": "^1.4.0",
+                "esutils": "^2.0.2",
+                "fast-deep-equal": "^3.1.3",
+                "file-entry-cache": "^6.0.1",
+                "functional-red-black-tree": "^1.0.1",
+                "glob-parent": "^6.0.1",
+                "globals": "^13.6.0",
+                "ignore": "^5.2.0",
+                "import-fresh": "^3.0.0",
+                "imurmurhash": "^0.1.4",
+                "is-glob": "^4.0.0",
+                "js-yaml": "^4.1.0",
+                "json-stable-stringify-without-jsonify": "^1.0.1",
+                "levn": "^0.4.1",
+                "lodash.merge": "^4.6.2",
+                "minimatch": "^3.0.4",
+                "natural-compare": "^1.4.0",
+                "optionator": "^0.9.1",
+                "regexpp": "^3.2.0",
+                "strip-ansi": "^6.0.1",
+                "strip-json-comments": "^3.1.0",
+                "text-table": "^0.2.0",
+                "v8-compile-cache": "^2.0.3"
+            },
+            "bin": {
+                "eslint": "bin/eslint.js"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/eslint-plugin-vue": {
+            "version": "8.7.1",
+            "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
+            "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+            "dev": true,
+            "dependencies": {
+                "eslint-utils": "^3.0.0",
+                "natural-compare": "^1.4.0",
+                "nth-check": "^2.0.1",
+                "postcss-selector-parser": "^6.0.9",
+                "semver": "^7.3.5",
+                "vue-eslint-parser": "^8.0.1"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "peerDependencies": {
+                "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+            }
+        },
+        "node_modules/eslint-plugin-vue/node_modules/semver": {
+            "version": "7.3.7",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/eslint-scope": {
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+            "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+            "dev": true,
+            "dependencies": {
+                "esrecurse": "^4.3.0",
+                "estraverse": "^4.1.1"
+            },
+            "engines": {
+                "node": ">=8.0.0"
+            }
+        },
+        "node_modules/eslint-utils": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+            "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+            "dev": true,
+            "dependencies": {
+                "eslint-visitor-keys": "^2.0.0"
+            },
+            "engines": {
+                "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/mysticatea"
+            },
+            "peerDependencies": {
+                "eslint": ">=5"
+            }
+        },
+        "node_modules/eslint-visitor-keys": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+            "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/eslint/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/eslint/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/eslint/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/eslint/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/eslint/node_modules/escape-string-regexp": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+            "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/eslint/node_modules/eslint-scope": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+            "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+            "dev": true,
+            "dependencies": {
+                "esrecurse": "^4.3.0",
+                "estraverse": "^5.2.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/eslint/node_modules/eslint-visitor-keys": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+            "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+            "dev": true,
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/eslint/node_modules/estraverse": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/eslint/node_modules/globals": {
+            "version": "13.15.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
+            "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+            "dev": true,
+            "dependencies": {
+                "type-fest": "^0.20.2"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/eslint/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/eslint/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/eslint/node_modules/type-fest": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/esm": {
+            "version": "3.2.25",
+            "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+            "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/espree": {
+            "version": "9.3.2",
+            "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
+            "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+            "dev": true,
+            "dependencies": {
+                "acorn": "^8.7.1",
+                "acorn-jsx": "^5.3.2",
+                "eslint-visitor-keys": "^3.3.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/espree/node_modules/eslint-visitor-keys": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+            "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+            "dev": true,
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/esprima": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+            "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+            "dev": true,
+            "bin": {
+                "esparse": "bin/esparse.js",
+                "esvalidate": "bin/esvalidate.js"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/esquery": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+            "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+            "dev": true,
+            "dependencies": {
+                "estraverse": "^5.1.0"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/esquery/node_modules/estraverse": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/esrecurse": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+            "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+            "dev": true,
+            "dependencies": {
+                "estraverse": "^5.2.0"
+            },
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/esrecurse/node_modules/estraverse": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/estraverse": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+            "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/estree-walker": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+            "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+            "dev": true
+        },
+        "node_modules/esutils": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/etag": {
+            "version": "1.8.1",
+            "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+            "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/events": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+            "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+            "engines": {
+                "node": ">=0.8.x"
+            }
+        },
+        "node_modules/execa": {
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+            "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+            "dev": true,
+            "dependencies": {
+                "cross-spawn": "^7.0.3",
+                "get-stream": "^6.0.0",
+                "human-signals": "^2.1.0",
+                "is-stream": "^2.0.0",
+                "merge-stream": "^2.0.0",
+                "npm-run-path": "^4.0.1",
+                "onetime": "^5.1.2",
+                "signal-exit": "^3.0.3",
+                "strip-final-newline": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/execa?sponsor=1"
+            }
+        },
+        "node_modules/execall": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz",
+            "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==",
+            "dev": true,
+            "dependencies": {
+                "clone-regexp": "^2.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/exit": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+            "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/expand-tilde": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+            "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==",
+            "dev": true,
+            "dependencies": {
+                "os-homedir": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/expect": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+            "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "jest-get-type": "^27.5.1",
+                "jest-matcher-utils": "^27.5.1",
+                "jest-message-util": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/expect-puppeteer": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-6.1.0.tgz",
+            "integrity": "sha512-5yk64xOe+yTRLeZTg1uuGYmUw5bMsI/YX7Q9tXsovYFBq8bvagJH4XMYLQ7/nU+1dJawLH0KJehuJULD33oU+w==",
+            "dev": true
+        },
+        "node_modules/express": {
+            "version": "4.17.3",
+            "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
+            "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
+            "dependencies": {
+                "accepts": "~1.3.8",
+                "array-flatten": "1.1.1",
+                "body-parser": "1.19.2",
+                "content-disposition": "0.5.4",
+                "content-type": "~1.0.4",
+                "cookie": "0.4.2",
+                "cookie-signature": "1.0.6",
+                "debug": "2.6.9",
+                "depd": "~1.1.2",
+                "encodeurl": "~1.0.2",
+                "escape-html": "~1.0.3",
+                "etag": "~1.8.1",
+                "finalhandler": "~1.1.2",
+                "fresh": "0.5.2",
+                "merge-descriptors": "1.0.1",
+                "methods": "~1.1.2",
+                "on-finished": "~2.3.0",
+                "parseurl": "~1.3.3",
+                "path-to-regexp": "0.1.7",
+                "proxy-addr": "~2.0.7",
+                "qs": "6.9.7",
+                "range-parser": "~1.2.1",
+                "safe-buffer": "5.2.1",
+                "send": "0.17.2",
+                "serve-static": "1.14.2",
+                "setprototypeof": "1.2.0",
+                "statuses": "~1.5.0",
+                "type-is": "~1.6.18",
+                "utils-merge": "1.0.1",
+                "vary": "~1.1.2"
+            },
+            "engines": {
+                "node": ">= 0.10.0"
+            }
+        },
+        "node_modules/express-basic-auth": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz",
+            "integrity": "sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==",
+            "dependencies": {
+                "basic-auth": "^2.0.1"
+            }
+        },
+        "node_modules/express-static-gzip": {
+            "version": "2.1.7",
+            "resolved": "https://registry.npmjs.org/express-static-gzip/-/express-static-gzip-2.1.7.tgz",
+            "integrity": "sha512-QOCZUC+lhPPCjIJKpQGu1Oa61Axg9Mq09Qvit8Of7kzpMuwDeMSqjjQteQS3OVw/GkENBoSBheuQDWPlngImvw==",
+            "dependencies": {
+                "serve-static": "^1.14.1"
+            }
+        },
+        "node_modules/express/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/express/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        },
+        "node_modules/express/node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/extend": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+            "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+            "optional": true
+        },
+        "node_modules/extract-zip": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+            "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+            "dev": true,
+            "dependencies": {
+                "debug": "^4.1.1",
+                "get-stream": "^5.1.0",
+                "yauzl": "^2.10.0"
+            },
+            "bin": {
+                "extract-zip": "cli.js"
+            },
+            "engines": {
+                "node": ">= 10.17.0"
+            },
+            "optionalDependencies": {
+                "@types/yauzl": "^2.9.1"
+            }
+        },
+        "node_modules/extract-zip/node_modules/get-stream": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+            "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+            "dev": true,
+            "dependencies": {
+                "pump": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/extsprintf": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+            "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+            "engines": [
+                "node >=0.6.0"
+            ],
+            "optional": true
+        },
+        "node_modules/fast-deep-equal": {
+            "version": "3.1.3",
+            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+            "devOptional": true
+        },
+        "node_modules/fast-glob": {
+            "version": "3.2.11",
+            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+            "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+            "dev": true,
+            "dependencies": {
+                "@nodelib/fs.stat": "^2.0.2",
+                "@nodelib/fs.walk": "^1.2.3",
+                "glob-parent": "^5.1.2",
+                "merge2": "^1.3.0",
+                "micromatch": "^4.0.4"
+            },
+            "engines": {
+                "node": ">=8.6.0"
+            }
+        },
+        "node_modules/fast-glob/node_modules/glob-parent": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+            "dev": true,
+            "dependencies": {
+                "is-glob": "^4.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/fast-json-stable-stringify": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+            "devOptional": true
+        },
+        "node_modules/fast-levenshtein": {
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+            "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+            "dev": true
+        },
+        "node_modules/fastest-levenshtein": {
+            "version": "1.0.12",
+            "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+            "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+            "dev": true
+        },
+        "node_modules/fastfall": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/fastfall/-/fastfall-1.5.1.tgz",
+            "integrity": "sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==",
+            "dev": true,
+            "dependencies": {
+                "reusify": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/fastparallel": {
+            "version": "2.4.1",
+            "resolved": "https://registry.npmjs.org/fastparallel/-/fastparallel-2.4.1.tgz",
+            "integrity": "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==",
+            "dev": true,
+            "dependencies": {
+                "reusify": "^1.0.4",
+                "xtend": "^4.0.2"
+            }
+        },
+        "node_modules/fastq": {
+            "version": "1.13.0",
+            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+            "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+            "dev": true,
+            "dependencies": {
+                "reusify": "^1.0.4"
+            }
+        },
+        "node_modules/fastseries": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/fastseries/-/fastseries-2.0.0.tgz",
+            "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==",
+            "dev": true
+        },
+        "node_modules/favico.js": {
+            "version": "0.3.10",
+            "resolved": "https://registry.npmjs.org/favico.js/-/favico.js-0.3.10.tgz",
+            "integrity": "sha512-S5KvqAOczRjlyjQPPZPSlUEybBkfBgKosY/pzTIxkvKgigB+DkITvIEI70dxQarbv4PZ+UD77QzquCAcU/6LHQ==",
+            "dev": true
+        },
+        "node_modules/fb-watchman": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
+            "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+            "dev": true,
+            "dependencies": {
+                "bser": "2.1.1"
+            }
+        },
+        "node_modules/fd-slicer": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+            "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+            "dev": true,
+            "dependencies": {
+                "pend": "~1.2.0"
+            }
+        },
+        "node_modules/file-entry-cache": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+            "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+            "dev": true,
+            "dependencies": {
+                "flat-cache": "^3.0.4"
+            },
+            "engines": {
+                "node": "^10.12.0 || >=12.0.0"
+            }
+        },
+        "node_modules/fill-range": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+            "dev": true,
+            "dependencies": {
+                "to-regex-range": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/finalhandler": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+            "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+            "dependencies": {
+                "debug": "2.6.9",
+                "encodeurl": "~1.0.2",
+                "escape-html": "~1.0.3",
+                "on-finished": "~2.3.0",
+                "parseurl": "~1.3.3",
+                "statuses": "~1.5.0",
+                "unpipe": "~1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/finalhandler/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/finalhandler/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        },
+        "node_modules/find-file-up": {
+            "version": "0.1.3",
+            "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz",
+            "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==",
+            "dev": true,
+            "dependencies": {
+                "fs-exists-sync": "^0.1.0",
+                "resolve-dir": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/find-pkg": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz",
+            "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==",
+            "dev": true,
+            "dependencies": {
+                "find-file-up": "^0.1.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/find-process": {
+            "version": "1.4.7",
+            "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz",
+            "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==",
+            "dev": true,
+            "dependencies": {
+                "chalk": "^4.0.0",
+                "commander": "^5.1.0",
+                "debug": "^4.1.1"
+            },
+            "bin": {
+                "find-process": "bin/find-process.js"
+            }
+        },
+        "node_modules/find-process/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/find-process/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/find-process/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/find-process/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/find-process/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/find-process/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/find-up": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+            "dev": true,
+            "dependencies": {
+                "locate-path": "^5.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/flat-cache": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+            "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+            "dev": true,
+            "dependencies": {
+                "flatted": "^3.1.0",
+                "rimraf": "^3.0.2"
+            },
+            "engines": {
+                "node": "^10.12.0 || >=12.0.0"
+            }
+        },
+        "node_modules/flatted": {
+            "version": "3.2.6",
+            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz",
+            "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
+            "dev": true
+        },
+        "node_modules/follow-redirects": {
+            "version": "1.15.1",
+            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
+            "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/RubenVerborgh"
+                }
+            ],
+            "engines": {
+                "node": ">=4.0"
+            },
+            "peerDependenciesMeta": {
+                "debug": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/for-in": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+            "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/for-own": {
+            "version": "0.1.5",
+            "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+            "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==",
+            "dev": true,
+            "dependencies": {
+                "for-in": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/forever-agent": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+            "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+            "optional": true,
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/form-data": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+            "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.8",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/forwarded": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+            "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/fresh": {
+            "version": "0.5.2",
+            "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+            "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/from2": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+            "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.1",
+                "readable-stream": "^2.0.0"
+            }
+        },
+        "node_modules/from2/node_modules/readable-stream": {
+            "version": "2.3.7",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+            "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+            "dev": true,
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+            }
+        },
+        "node_modules/from2/node_modules/string_decoder": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+            "dev": true,
+            "dependencies": {
+                "safe-buffer": "~5.1.0"
+            }
+        },
+        "node_modules/fs-constants": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+            "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+            "dev": true
+        },
+        "node_modules/fs-exists-sync": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+            "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/fs-extra": {
+            "version": "10.1.0",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+            "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+            "dev": true,
+            "dependencies": {
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/fs-extra/node_modules/universalify": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+            "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+            "dev": true,
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/fs-minipass": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+            "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/fs.realpath": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+            "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+        },
+        "node_modules/function-bind": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+        },
+        "node_modules/function.prototype.name": {
+            "version": "1.1.5",
+            "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+            "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "define-properties": "^1.1.3",
+                "es-abstract": "^1.19.0",
+                "functions-have-names": "^1.2.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/functional-red-black-tree": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+            "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+            "dev": true
+        },
+        "node_modules/functions-have-names": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+            "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/gauge": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+            "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+            "dependencies": {
+                "aproba": "^1.0.3 || ^2.0.0",
+                "color-support": "^1.1.2",
+                "console-control-strings": "^1.0.0",
+                "has-unicode": "^2.0.1",
+                "object-assign": "^4.1.1",
+                "signal-exit": "^3.0.0",
+                "string-width": "^4.2.3",
+                "strip-ansi": "^6.0.1",
+                "wide-align": "^1.1.2"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/gensync": {
+            "version": "1.0.0-beta.2",
+            "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+            "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/get-caller-file": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+            "dev": true,
+            "engines": {
+                "node": "6.* || 8.* || >= 10.*"
+            }
+        },
+        "node_modules/get-intrinsic": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
+            "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
+            "dependencies": {
+                "function-bind": "^1.1.1",
+                "has": "^1.0.3",
+                "has-symbols": "^1.0.3"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/get-package-type": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+            "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=8.0.0"
+            }
+        },
+        "node_modules/get-stdin": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+            "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/get-stream": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+            "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/get-symbol-description": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+            "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "get-intrinsic": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/getopts": {
+            "version": "2.2.5",
+            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
+            "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="
+        },
+        "node_modules/getpass": {
+            "version": "0.1.7",
+            "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+            "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+            "optional": true,
+            "dependencies": {
+                "assert-plus": "^1.0.0"
+            }
+        },
+        "node_modules/glob": {
+            "version": "7.2.3",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+            "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "dependencies": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.1.1",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+            },
+            "engines": {
+                "node": "*"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/glob-parent": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+            "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+            "dev": true,
+            "dependencies": {
+                "is-glob": "^4.0.3"
+            },
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/global-modules": {
+            "version": "0.2.3",
+            "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+            "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==",
+            "dev": true,
+            "dependencies": {
+                "global-prefix": "^0.1.4",
+                "is-windows": "^0.2.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/global-prefix": {
+            "version": "0.1.5",
+            "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+            "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==",
+            "dev": true,
+            "dependencies": {
+                "homedir-polyfill": "^1.0.0",
+                "ini": "^1.3.4",
+                "is-windows": "^0.2.0",
+                "which": "^1.2.12"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/global-prefix/node_modules/which": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+            "dev": true,
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "which": "bin/which"
+            }
+        },
+        "node_modules/globals": {
+            "version": "11.12.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+            "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/globalthis": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+            "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+            "dependencies": {
+                "define-properties": "^1.1.3"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/globby": {
+            "version": "11.1.0",
+            "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+            "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+            "dev": true,
+            "dependencies": {
+                "array-union": "^2.1.0",
+                "dir-glob": "^3.0.1",
+                "fast-glob": "^3.2.9",
+                "ignore": "^5.2.0",
+                "merge2": "^1.4.1",
+                "slash": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/globjoin": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+            "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
+            "dev": true
+        },
+        "node_modules/graceful-fs": {
+            "version": "4.2.10",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+            "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+            "devOptional": true
+        },
+        "node_modules/har-schema": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+            "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+            "optional": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/har-validator": {
+            "version": "5.1.5",
+            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+            "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+            "deprecated": "this library is no longer supported",
+            "optional": true,
+            "dependencies": {
+                "ajv": "^6.12.3",
+                "har-schema": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/hard-rejection": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+            "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/has": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+            "dependencies": {
+                "function-bind": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/has-bigints": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+            "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/has-cors": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+            "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA=="
+        },
+        "node_modules/has-flag": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+            "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/has-property-descriptors": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+            "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+            "dependencies": {
+                "get-intrinsic": "^1.1.1"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/has-symbols": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+            "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/has-tostringtag": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+            "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+            "dependencies": {
+                "has-symbols": "^1.0.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/has-unicode": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+            "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
+        },
+        "node_modules/help-me": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz",
+            "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==",
+            "dependencies": {
+                "glob": "^7.1.6",
+                "readable-stream": "^3.6.0"
+            }
+        },
+        "node_modules/hoek": {
+            "version": "6.1.3",
+            "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz",
+            "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==",
+            "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues."
+        },
+        "node_modules/homedir-polyfill": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+            "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+            "dev": true,
+            "dependencies": {
+                "parse-passwd": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/hosted-git-info": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+            "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/html-encoding-sniffer": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+            "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+            "dev": true,
+            "dependencies": {
+                "whatwg-encoding": "^1.0.5"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/html-escaper": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+            "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+            "dev": true
+        },
+        "node_modules/html-tags": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz",
+            "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/htmlparser2": {
+            "version": "8.0.1",
+            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
+            "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
+            "funding": [
+                "https://github.com/fb55/htmlparser2?sponsor=1",
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/fb55"
+                }
+            ],
+            "dependencies": {
+                "domelementtype": "^2.3.0",
+                "domhandler": "^5.0.2",
+                "domutils": "^3.0.1",
+                "entities": "^4.3.0"
+            }
+        },
+        "node_modules/http-errors": {
+            "version": "1.8.1",
+            "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+            "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+            "dependencies": {
+                "depd": "~1.1.2",
+                "inherits": "2.0.4",
+                "setprototypeof": "1.2.0",
+                "statuses": ">= 1.5.0 < 2",
+                "toidentifier": "1.0.1"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/http-graceful-shutdown": {
+            "version": "3.1.7",
+            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.7.tgz",
+            "integrity": "sha512-00tmCsvemcZLfhii3sB7sfoUjvTzhg/WdOzVI7WEt2Vai9h1ybzSoEhJeQIck8gCz8pt/4YMXWPjGZxe+KukTA==",
+            "dependencies": {
+                "debug": "^4.3.4"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/http-proxy-agent": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+            "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+            "dependencies": {
+                "@tootallnate/once": "2",
+                "agent-base": "6",
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/http-signature": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+            "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+            "optional": true,
+            "dependencies": {
+                "assert-plus": "^1.0.0",
+                "jsprim": "^1.2.2",
+                "sshpk": "^1.7.0"
+            },
+            "engines": {
+                "node": ">=0.8",
+                "npm": ">=1.3.7"
+            }
+        },
+        "node_modules/https-proxy-agent": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+            "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+            "dependencies": {
+                "agent-base": "6",
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/human-interval": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/human-interval/-/human-interval-2.0.1.tgz",
+            "integrity": "sha512-r4Aotzf+OtKIGQCB3odUowy4GfUDTy3aTWTfLd7ZF2gBCy3XW3v/dJLRefZnOFFnjqs5B1TypvS8WarpBkYUNQ==",
+            "dependencies": {
+                "numbered": "^1.1.0"
+            }
+        },
+        "node_modules/human-signals": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+            "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+            "dev": true,
+            "engines": {
+                "node": ">=10.17.0"
+            }
+        },
+        "node_modules/hyperid": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.0.1.tgz",
+            "integrity": "sha512-I+tl7TS5nsoVhkxqX1rS3Qmqlq44eoPUcgPthW8v3IW8CvWL7lwtd6HQbkDUMrBKJTG0vgEaRsjT35imW/D+9Q==",
+            "dev": true,
+            "dependencies": {
+                "uuid": "^8.3.2",
+                "uuid-parse": "^1.1.0"
+            }
+        },
+        "node_modules/iconv-lite": {
+            "version": "0.6.3",
+            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+            "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+            "dependencies": {
+                "safer-buffer": ">= 2.1.2 < 3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/ieee754": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+            "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/ignore": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+            "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4"
+            }
+        },
+        "node_modules/import-fresh": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+            "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+            "dev": true,
+            "dependencies": {
+                "parent-module": "^1.0.0",
+                "resolve-from": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/import-lazy": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+            "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/import-local": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+            "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+            "dev": true,
+            "dependencies": {
+                "pkg-dir": "^4.2.0",
+                "resolve-cwd": "^3.0.0"
+            },
+            "bin": {
+                "import-local-fixture": "fixtures/cli.js"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/imurmurhash": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+            "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.8.19"
+            }
+        },
+        "node_modules/indent-string": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+            "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/inflight": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+            "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+            "dependencies": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+            }
+        },
+        "node_modules/inherits": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+        },
+        "node_modules/ini": {
+            "version": "1.3.8",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+            "dev": true
+        },
+        "node_modules/internal-slot": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+            "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+            "dependencies": {
+                "get-intrinsic": "^1.1.0",
+                "has": "^1.0.3",
+                "side-channel": "^1.0.4"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/interpret": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+            "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+            "engines": {
+                "node": ">= 0.10"
+            }
+        },
+        "node_modules/ip": {
+            "version": "1.1.8",
+            "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
+            "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
+        },
+        "node_modules/ipaddr.js": {
+            "version": "1.9.1",
+            "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+            "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+            "engines": {
+                "node": ">= 0.10"
+            }
+        },
+        "node_modules/is-arrayish": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+            "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+            "dev": true
+        },
+        "node_modules/is-bigint": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+            "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+            "dependencies": {
+                "has-bigints": "^1.0.1"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-binary-path": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+            "dev": true,
+            "dependencies": {
+                "binary-extensions": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-boolean-object": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+            "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "has-tostringtag": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-buffer": {
+            "version": "1.1.6",
+            "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+            "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+            "dev": true
+        },
+        "node_modules/is-callable": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+            "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-core-module": {
+            "version": "2.9.0",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+            "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+            "dependencies": {
+                "has": "^1.0.3"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-date-object": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+            "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+            "dependencies": {
+                "has-tostringtag": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-docker": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+            "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+            "bin": {
+                "is-docker": "cli.js"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/is-extendable": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+            "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-extglob": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-fullwidth-code-point": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-generator-fn": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+            "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/is-glob": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+            "dev": true,
+            "dependencies": {
+                "is-extglob": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-invalid-path": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz",
+            "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==",
+            "dependencies": {
+                "is-glob": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-invalid-path/node_modules/is-extglob": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+            "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-invalid-path/node_modules/is-glob": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+            "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==",
+            "dependencies": {
+                "is-extglob": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-negative-zero": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+            "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-number": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.12.0"
+            }
+        },
+        "node_modules/is-number-object": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+            "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+            "dependencies": {
+                "has-tostringtag": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-plain-obj": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+            "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-plain-object": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+            "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-potential-custom-element-name": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+            "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+            "dev": true
+        },
+        "node_modules/is-regex": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+            "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "has-tostringtag": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-regexp": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
+            "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/is-shared-array-buffer": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+            "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+            "dependencies": {
+                "call-bind": "^1.0.2"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-stream": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+            "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/is-string": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+            "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+            "dependencies": {
+                "has-tostringtag": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-string-and-not-blank": {
+            "version": "0.0.2",
+            "resolved": "https://registry.npmjs.org/is-string-and-not-blank/-/is-string-and-not-blank-0.0.2.tgz",
+            "integrity": "sha512-FyPGAbNVyZpTeDCTXnzuwbu9/WpNXbCfbHXLpCRpN4GANhS00eEIP5Ef+k5HYSNIzIhdN9zRDoBj6unscECvtQ==",
+            "dependencies": {
+                "is-string-blank": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=6.4.0"
+            }
+        },
+        "node_modules/is-string-blank": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz",
+            "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw=="
+        },
+        "node_modules/is-symbol": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+            "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+            "dependencies": {
+                "has-symbols": "^1.0.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-typedarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+            "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+            "devOptional": true
+        },
+        "node_modules/is-valid-path": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz",
+            "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==",
+            "dependencies": {
+                "is-invalid-path": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-weakref": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+            "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+            "dependencies": {
+                "call-bind": "^1.0.2"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-windows": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+            "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-wsl": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+            "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+            "dependencies": {
+                "is-docker": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/isarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+            "devOptional": true
+        },
+        "node_modules/isemail": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz",
+            "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
+            "dependencies": {
+                "punycode": "2.x.x"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/isexe": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+            "devOptional": true
+        },
+        "node_modules/isobject": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+            "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/isstream": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+            "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+            "optional": true
+        },
+        "node_modules/istanbul-lib-coverage": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+            "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/istanbul-lib-instrument": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz",
+            "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==",
+            "dev": true,
+            "dependencies": {
+                "@babel/core": "^7.12.3",
+                "@babel/parser": "^7.14.7",
+                "@istanbuljs/schema": "^0.1.2",
+                "istanbul-lib-coverage": "^3.2.0",
+                "semver": "^6.3.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/istanbul-lib-report": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+            "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+            "dev": true,
+            "dependencies": {
+                "istanbul-lib-coverage": "^3.0.0",
+                "make-dir": "^3.0.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/istanbul-lib-report/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/istanbul-lib-report/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/istanbul-lib-source-maps": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+            "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+            "dev": true,
+            "dependencies": {
+                "debug": "^4.1.1",
+                "istanbul-lib-coverage": "^3.0.0",
+                "source-map": "^0.6.1"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/istanbul-reports": {
+            "version": "3.1.4",
+            "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz",
+            "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==",
+            "dev": true,
+            "dependencies": {
+                "html-escaper": "^2.0.0",
+                "istanbul-lib-report": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest": {
+            "version": "27.2.5",
+            "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.5.tgz",
+            "integrity": "sha512-vDMzXcpQN4Ycaqu+vO7LX8pZwNNoKMhc+gSp6q1D8S6ftRk8gNW8cni3YFxknP95jxzQo23Lul0BI2FrWgnwYQ==",
+            "dev": true,
+            "dependencies": {
+                "@jest/core": "^27.2.5",
+                "import-local": "^3.0.2",
+                "jest-cli": "^27.2.5"
+            },
+            "bin": {
+                "jest": "bin/jest.js"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            },
+            "peerDependencies": {
+                "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+            },
+            "peerDependenciesMeta": {
+                "node-notifier": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/jest-changed-files": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
+            "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "execa": "^5.0.0",
+                "throat": "^6.0.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-circus": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
+            "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+            "dev": true,
+            "dependencies": {
+                "@jest/environment": "^27.5.1",
+                "@jest/test-result": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "chalk": "^4.0.0",
+                "co": "^4.6.0",
+                "dedent": "^0.7.0",
+                "expect": "^27.5.1",
+                "is-generator-fn": "^2.0.0",
+                "jest-each": "^27.5.1",
+                "jest-matcher-utils": "^27.5.1",
+                "jest-message-util": "^27.5.1",
+                "jest-runtime": "^27.5.1",
+                "jest-snapshot": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "pretty-format": "^27.5.1",
+                "slash": "^3.0.0",
+                "stack-utils": "^2.0.3",
+                "throat": "^6.0.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-circus/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-circus/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-circus/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-circus/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-circus/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-circus/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-cli": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
+            "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+            "dev": true,
+            "dependencies": {
+                "@jest/core": "^27.5.1",
+                "@jest/test-result": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "chalk": "^4.0.0",
+                "exit": "^0.1.2",
+                "graceful-fs": "^4.2.9",
+                "import-local": "^3.0.2",
+                "jest-config": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "jest-validate": "^27.5.1",
+                "prompts": "^2.0.1",
+                "yargs": "^16.2.0"
+            },
+            "bin": {
+                "jest": "bin/jest.js"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            },
+            "peerDependencies": {
+                "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+            },
+            "peerDependenciesMeta": {
+                "node-notifier": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/jest-cli/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-cli/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-cli/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-cli/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-cli/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-cli/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-cli/node_modules/yargs": {
+            "version": "16.2.0",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+            "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+            "dev": true,
+            "dependencies": {
+                "cliui": "^7.0.2",
+                "escalade": "^3.1.1",
+                "get-caller-file": "^2.0.5",
+                "require-directory": "^2.1.1",
+                "string-width": "^4.2.0",
+                "y18n": "^5.0.5",
+                "yargs-parser": "^20.2.2"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/jest-config": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
+            "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/core": "^7.8.0",
+                "@jest/test-sequencer": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "babel-jest": "^27.5.1",
+                "chalk": "^4.0.0",
+                "ci-info": "^3.2.0",
+                "deepmerge": "^4.2.2",
+                "glob": "^7.1.1",
+                "graceful-fs": "^4.2.9",
+                "jest-circus": "^27.5.1",
+                "jest-environment-jsdom": "^27.5.1",
+                "jest-environment-node": "^27.5.1",
+                "jest-get-type": "^27.5.1",
+                "jest-jasmine2": "^27.5.1",
+                "jest-regex-util": "^27.5.1",
+                "jest-resolve": "^27.5.1",
+                "jest-runner": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "jest-validate": "^27.5.1",
+                "micromatch": "^4.0.4",
+                "parse-json": "^5.2.0",
+                "pretty-format": "^27.5.1",
+                "slash": "^3.0.0",
+                "strip-json-comments": "^3.1.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            },
+            "peerDependencies": {
+                "ts-node": ">=9.0.0"
+            },
+            "peerDependenciesMeta": {
+                "ts-node": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/jest-config/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-config/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-config/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-config/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-config/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-config/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-dev-server": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.0.3.tgz",
+            "integrity": "sha512-joKPQQWSaBMsNNdCWvwCQvhD6ox4IH+5H5pecbRRSxiRi2BfVCGGOWQ4/MGwV1NJ9z9XEq1qy5JLYTJlv9RVzA==",
+            "dev": true,
+            "dependencies": {
+                "chalk": "^4.1.2",
+                "cwd": "^0.10.0",
+                "find-process": "^1.4.7",
+                "prompts": "^2.4.2",
+                "spawnd": "^6.0.2",
+                "tree-kill": "^1.2.2",
+                "wait-on": "^6.0.0"
+            }
+        },
+        "node_modules/jest-dev-server/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-dev-server/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-dev-server/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-dev-server/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-dev-server/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-dev-server/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-diff": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+            "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+            "dev": true,
+            "dependencies": {
+                "chalk": "^4.0.0",
+                "diff-sequences": "^27.5.1",
+                "jest-get-type": "^27.5.1",
+                "pretty-format": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-diff/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-diff/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-diff/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-diff/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-diff/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-diff/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-docblock": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
+            "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+            "dev": true,
+            "dependencies": {
+                "detect-newline": "^3.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-each": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
+            "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "chalk": "^4.0.0",
+                "jest-get-type": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "pretty-format": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-each/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-each/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-each/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-each/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-each/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-each/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-environment-jsdom": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
+            "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+            "dev": true,
+            "dependencies": {
+                "@jest/environment": "^27.5.1",
+                "@jest/fake-timers": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "jest-mock": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "jsdom": "^16.6.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-environment-node": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
+            "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+            "dev": true,
+            "dependencies": {
+                "@jest/environment": "^27.5.1",
+                "@jest/fake-timers": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "jest-mock": "^27.5.1",
+                "jest-util": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-environment-puppeteer": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-6.0.3.tgz",
+            "integrity": "sha512-oZE/W8swhDSZpZ+Vm1C2JyoKECsvqcFOlaf3/+G0AtizZfGNkRILdi1U7k9MHLOqGEB5sfFWXG0vpJ8bTNP1dQ==",
+            "dev": true,
+            "dependencies": {
+                "chalk": "^4.1.2",
+                "cwd": "^0.10.0",
+                "jest-dev-server": "^6.0.3",
+                "jest-environment-node": "^27.4.4",
+                "merge-deep": "^3.0.3"
+            }
+        },
+        "node_modules/jest-environment-puppeteer/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-environment-puppeteer/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-environment-puppeteer/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-environment-puppeteer/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-environment-puppeteer/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-environment-puppeteer/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-get-type": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+            "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+            "dev": true,
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-haste-map": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
+            "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "@types/graceful-fs": "^4.1.2",
+                "@types/node": "*",
+                "anymatch": "^3.0.3",
+                "fb-watchman": "^2.0.0",
+                "graceful-fs": "^4.2.9",
+                "jest-regex-util": "^27.5.1",
+                "jest-serializer": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "jest-worker": "^27.5.1",
+                "micromatch": "^4.0.4",
+                "walker": "^1.0.7"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            },
+            "optionalDependencies": {
+                "fsevents": "^2.3.2"
+            }
+        },
+        "node_modules/jest-jasmine2": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
+            "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+            "dev": true,
+            "dependencies": {
+                "@jest/environment": "^27.5.1",
+                "@jest/source-map": "^27.5.1",
+                "@jest/test-result": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "chalk": "^4.0.0",
+                "co": "^4.6.0",
+                "expect": "^27.5.1",
+                "is-generator-fn": "^2.0.0",
+                "jest-each": "^27.5.1",
+                "jest-matcher-utils": "^27.5.1",
+                "jest-message-util": "^27.5.1",
+                "jest-runtime": "^27.5.1",
+                "jest-snapshot": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "pretty-format": "^27.5.1",
+                "throat": "^6.0.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-jasmine2/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-jasmine2/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-jasmine2/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-jasmine2/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-jasmine2/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-jasmine2/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-leak-detector": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
+            "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+            "dev": true,
+            "dependencies": {
+                "jest-get-type": "^27.5.1",
+                "pretty-format": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-matcher-utils": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+            "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+            "dev": true,
+            "dependencies": {
+                "chalk": "^4.0.0",
+                "jest-diff": "^27.5.1",
+                "jest-get-type": "^27.5.1",
+                "pretty-format": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-matcher-utils/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-matcher-utils/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-matcher-utils/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-matcher-utils/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-matcher-utils/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-message-util": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+            "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+            "dev": true,
+            "dependencies": {
+                "@babel/code-frame": "^7.12.13",
+                "@jest/types": "^27.5.1",
+                "@types/stack-utils": "^2.0.0",
+                "chalk": "^4.0.0",
+                "graceful-fs": "^4.2.9",
+                "micromatch": "^4.0.4",
+                "pretty-format": "^27.5.1",
+                "slash": "^3.0.0",
+                "stack-utils": "^2.0.3"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-message-util/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-message-util/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-message-util/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-message-util/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-message-util/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-message-util/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-mock": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+            "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "@types/node": "*"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-pnp-resolver": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
+            "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            },
+            "peerDependencies": {
+                "jest-resolve": "*"
+            },
+            "peerDependenciesMeta": {
+                "jest-resolve": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/jest-puppeteer": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-6.0.3.tgz",
+            "integrity": "sha512-6GRdbkWwNu8dfzo4icpwc50+K5ECYpWyD9sxpRa03PA8Hi3byl0dcAx+NjCivSezWjAl2Iwwhujqb+bczei0Bg==",
+            "dev": true,
+            "dependencies": {
+                "expect-puppeteer": "^6.0.2",
+                "jest-environment-puppeteer": "^6.0.3"
+            },
+            "peerDependencies": {
+                "puppeteer": ">= 1.5.0"
+            }
+        },
+        "node_modules/jest-regex-util": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+            "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+            "dev": true,
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-resolve": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
+            "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "chalk": "^4.0.0",
+                "graceful-fs": "^4.2.9",
+                "jest-haste-map": "^27.5.1",
+                "jest-pnp-resolver": "^1.2.2",
+                "jest-util": "^27.5.1",
+                "jest-validate": "^27.5.1",
+                "resolve": "^1.20.0",
+                "resolve.exports": "^1.1.0",
+                "slash": "^3.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-resolve-dependencies": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
+            "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "jest-regex-util": "^27.5.1",
+                "jest-snapshot": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-resolve/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-resolve/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-resolve/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-resolve/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-resolve/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-resolve/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-runner": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
+            "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+            "dev": true,
+            "dependencies": {
+                "@jest/console": "^27.5.1",
+                "@jest/environment": "^27.5.1",
+                "@jest/test-result": "^27.5.1",
+                "@jest/transform": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "chalk": "^4.0.0",
+                "emittery": "^0.8.1",
+                "graceful-fs": "^4.2.9",
+                "jest-docblock": "^27.5.1",
+                "jest-environment-jsdom": "^27.5.1",
+                "jest-environment-node": "^27.5.1",
+                "jest-haste-map": "^27.5.1",
+                "jest-leak-detector": "^27.5.1",
+                "jest-message-util": "^27.5.1",
+                "jest-resolve": "^27.5.1",
+                "jest-runtime": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "jest-worker": "^27.5.1",
+                "source-map-support": "^0.5.6",
+                "throat": "^6.0.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-runner/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-runner/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-runner/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-runner/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-runner/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-runner/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-runtime": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
+            "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+            "dev": true,
+            "dependencies": {
+                "@jest/environment": "^27.5.1",
+                "@jest/fake-timers": "^27.5.1",
+                "@jest/globals": "^27.5.1",
+                "@jest/source-map": "^27.5.1",
+                "@jest/test-result": "^27.5.1",
+                "@jest/transform": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "chalk": "^4.0.0",
+                "cjs-module-lexer": "^1.0.0",
+                "collect-v8-coverage": "^1.0.0",
+                "execa": "^5.0.0",
+                "glob": "^7.1.3",
+                "graceful-fs": "^4.2.9",
+                "jest-haste-map": "^27.5.1",
+                "jest-message-util": "^27.5.1",
+                "jest-mock": "^27.5.1",
+                "jest-regex-util": "^27.5.1",
+                "jest-resolve": "^27.5.1",
+                "jest-snapshot": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "slash": "^3.0.0",
+                "strip-bom": "^4.0.0"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-runtime/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-runtime/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-runtime/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-runtime/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-runtime/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-runtime/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-serializer": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
+            "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*",
+                "graceful-fs": "^4.2.9"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-snapshot": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
+            "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/core": "^7.7.2",
+                "@babel/generator": "^7.7.2",
+                "@babel/plugin-syntax-typescript": "^7.7.2",
+                "@babel/traverse": "^7.7.2",
+                "@babel/types": "^7.0.0",
+                "@jest/transform": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/babel__traverse": "^7.0.4",
+                "@types/prettier": "^2.1.5",
+                "babel-preset-current-node-syntax": "^1.0.0",
+                "chalk": "^4.0.0",
+                "expect": "^27.5.1",
+                "graceful-fs": "^4.2.9",
+                "jest-diff": "^27.5.1",
+                "jest-get-type": "^27.5.1",
+                "jest-haste-map": "^27.5.1",
+                "jest-matcher-utils": "^27.5.1",
+                "jest-message-util": "^27.5.1",
+                "jest-util": "^27.5.1",
+                "natural-compare": "^1.4.0",
+                "pretty-format": "^27.5.1",
+                "semver": "^7.3.2"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-snapshot/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-snapshot/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-snapshot/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-snapshot/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-snapshot/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-snapshot/node_modules/semver": {
+            "version": "7.3.7",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/jest-snapshot/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-util": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+            "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "chalk": "^4.0.0",
+                "ci-info": "^3.2.0",
+                "graceful-fs": "^4.2.9",
+                "picomatch": "^2.2.3"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-util/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-util/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-util/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-util/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-util/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-util/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-validate": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
+            "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+            "dev": true,
+            "dependencies": {
+                "@jest/types": "^27.5.1",
+                "camelcase": "^6.2.0",
+                "chalk": "^4.0.0",
+                "jest-get-type": "^27.5.1",
+                "leven": "^3.1.0",
+                "pretty-format": "^27.5.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-validate/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-validate/node_modules/camelcase": {
+            "version": "6.3.0",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+            "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/jest-validate/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-validate/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-validate/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-validate/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-validate/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-watcher": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
+            "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+            "dev": true,
+            "dependencies": {
+                "@jest/test-result": "^27.5.1",
+                "@jest/types": "^27.5.1",
+                "@types/node": "*",
+                "ansi-escapes": "^4.2.1",
+                "chalk": "^4.0.0",
+                "jest-util": "^27.5.1",
+                "string-length": "^4.0.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/jest-watcher/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/jest-watcher/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/jest-watcher/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/jest-watcher/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/jest-watcher/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-watcher/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-worker": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+            "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*",
+                "merge-stream": "^2.0.0",
+                "supports-color": "^8.0.0"
+            },
+            "engines": {
+                "node": ">= 10.13.0"
+            }
+        },
+        "node_modules/jest-worker/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/jest-worker/node_modules/supports-color": {
+            "version": "8.1.1",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+            "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/supports-color?sponsor=1"
+            }
+        },
+        "node_modules/joi": {
+            "version": "17.6.0",
+            "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz",
+            "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==",
+            "dev": true,
+            "dependencies": {
+                "@hapi/hoek": "^9.0.0",
+                "@hapi/topo": "^5.0.0",
+                "@sideway/address": "^4.1.3",
+                "@sideway/formula": "^3.0.0",
+                "@sideway/pinpoint": "^2.0.0"
+            }
+        },
+        "node_modules/js-sdsl": {
+            "version": "2.1.4",
+            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-2.1.4.tgz",
+            "integrity": "sha512-/Ew+CJWHNddr7sjwgxaVeIORIH4AMVC9dy0hPf540ZGMVgS9d3ajwuVdyhDt6/QUvT8ATjR3yuYBKsS79F+H4A=="
+        },
+        "node_modules/js-tokens": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+            "dev": true
+        },
+        "node_modules/js-yaml": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+            "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+            "dev": true,
+            "dependencies": {
+                "argparse": "^2.0.1"
+            },
+            "bin": {
+                "js-yaml": "bin/js-yaml.js"
+            }
+        },
+        "node_modules/jsbi": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz",
+            "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g=="
+        },
+        "node_modules/jsbn": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+            "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+            "optional": true
+        },
+        "node_modules/jsdom": {
+            "version": "16.7.0",
+            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
+            "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+            "dev": true,
+            "dependencies": {
+                "abab": "^2.0.5",
+                "acorn": "^8.2.4",
+                "acorn-globals": "^6.0.0",
+                "cssom": "^0.4.4",
+                "cssstyle": "^2.3.0",
+                "data-urls": "^2.0.0",
+                "decimal.js": "^10.2.1",
+                "domexception": "^2.0.1",
+                "escodegen": "^2.0.0",
+                "form-data": "^3.0.0",
+                "html-encoding-sniffer": "^2.0.1",
+                "http-proxy-agent": "^4.0.1",
+                "https-proxy-agent": "^5.0.0",
+                "is-potential-custom-element-name": "^1.0.1",
+                "nwsapi": "^2.2.0",
+                "parse5": "6.0.1",
+                "saxes": "^5.0.1",
+                "symbol-tree": "^3.2.4",
+                "tough-cookie": "^4.0.0",
+                "w3c-hr-time": "^1.0.2",
+                "w3c-xmlserializer": "^2.0.0",
+                "webidl-conversions": "^6.1.0",
+                "whatwg-encoding": "^1.0.5",
+                "whatwg-mimetype": "^2.3.0",
+                "whatwg-url": "^8.5.0",
+                "ws": "^7.4.6",
+                "xml-name-validator": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "peerDependencies": {
+                "canvas": "^2.5.0"
+            },
+            "peerDependenciesMeta": {
+                "canvas": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/jsdom/node_modules/@tootallnate/once": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+            "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+            "dev": true,
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/jsdom/node_modules/form-data": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
+            "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+            "dev": true,
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.8",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/jsdom/node_modules/http-proxy-agent": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+            "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+            "dev": true,
+            "dependencies": {
+                "@tootallnate/once": "1",
+                "agent-base": "6",
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/jsdom/node_modules/parse5": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+            "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+            "dev": true
+        },
+        "node_modules/jsesc": {
+            "version": "2.5.2",
+            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+            "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+            "dev": true,
+            "bin": {
+                "jsesc": "bin/jsesc"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/json-parse-even-better-errors": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+            "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+            "dev": true
+        },
+        "node_modules/json-schema": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+            "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+            "optional": true
+        },
+        "node_modules/json-schema-traverse": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+            "devOptional": true
+        },
+        "node_modules/json-stable-stringify-without-jsonify": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+            "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+            "dev": true
+        },
+        "node_modules/json-stringify-safe": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+            "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+            "optional": true
+        },
+        "node_modules/json5": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
+            "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+            "dev": true,
+            "bin": {
+                "json5": "lib/cli.js"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/jsonfile": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+            "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+            "dev": true,
+            "dependencies": {
+                "universalify": "^2.0.0"
+            },
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/jsonfile/node_modules/universalify": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+            "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+            "dev": true,
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/jsonwebtoken": {
+            "version": "8.5.1",
+            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+            "dependencies": {
+                "jws": "^3.2.2",
+                "lodash.includes": "^4.3.0",
+                "lodash.isboolean": "^3.0.3",
+                "lodash.isinteger": "^4.0.4",
+                "lodash.isnumber": "^3.0.3",
+                "lodash.isplainobject": "^4.0.6",
+                "lodash.isstring": "^4.0.1",
+                "lodash.once": "^4.0.0",
+                "ms": "^2.1.1",
+                "semver": "^5.6.0"
+            },
+            "engines": {
+                "node": ">=4",
+                "npm": ">=1.4.28"
+            }
+        },
+        "node_modules/jsonwebtoken/node_modules/semver": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/jsprim": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+            "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+            "optional": true,
+            "dependencies": {
+                "assert-plus": "1.0.0",
+                "extsprintf": "1.3.0",
+                "json-schema": "0.4.0",
+                "verror": "1.10.0"
+            },
+            "engines": {
+                "node": ">=0.6.0"
+            }
+        },
+        "node_modules/just-performance": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/just-performance/-/just-performance-4.3.0.tgz",
+            "integrity": "sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q=="
+        },
+        "node_modules/jwa": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+            "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+            "dependencies": {
+                "buffer-equal-constant-time": "1.0.1",
+                "ecdsa-sig-formatter": "1.0.11",
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "node_modules/jws": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+            "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+            "dependencies": {
+                "jwa": "^1.4.1",
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "node_modules/jwt-decode": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
+            "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
+        },
+        "node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/kleur": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+            "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/knex": {
+            "version": "0.95.15",
+            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.15.tgz",
+            "integrity": "sha512-Loq6WgHaWlmL2bfZGWPsy4l8xw4pOE+tmLGkPG0auBppxpI0UcK+GYCycJcqz9W54f2LiGewkCVLBm3Wq4ur/w==",
+            "dependencies": {
+                "colorette": "2.0.16",
+                "commander": "^7.1.0",
+                "debug": "4.3.2",
+                "escalade": "^3.1.1",
+                "esm": "^3.2.25",
+                "getopts": "2.2.5",
+                "interpret": "^2.2.0",
+                "lodash": "^4.17.21",
+                "pg-connection-string": "2.5.0",
+                "rechoir": "0.7.0",
+                "resolve-from": "^5.0.0",
+                "tarn": "^3.0.1",
+                "tildify": "2.0.0"
+            },
+            "bin": {
+                "knex": "bin/cli.js"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "peerDependenciesMeta": {
+                "mysql": {
+                    "optional": true
+                },
+                "mysql2": {
+                    "optional": true
+                },
+                "pg": {
+                    "optional": true
+                },
+                "pg-native": {
+                    "optional": true
+                },
+                "sqlite3": {
+                    "optional": true
+                },
+                "tedious": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/knex/node_modules/commander": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+            "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/knex/node_modules/debug": {
+            "version": "4.3.2",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+            "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/knex/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "node_modules/knex/node_modules/resolve-from": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/known-css-properties": {
+            "version": "0.24.0",
+            "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.24.0.tgz",
+            "integrity": "sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==",
+            "dev": true
+        },
+        "node_modules/lazy-cache": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+            "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/leven": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+            "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/levn": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+            "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+            "dev": true,
+            "dependencies": {
+                "prelude-ls": "^1.2.1",
+                "type-check": "~0.4.0"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/limiter": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/limiter/-/limiter-2.1.0.tgz",
+            "integrity": "sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw==",
+            "dependencies": {
+                "just-performance": "4.3.0"
+            }
+        },
+        "node_modules/lines-and-columns": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+            "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+            "dev": true
+        },
+        "node_modules/locate-path": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+            "dev": true,
+            "dependencies": {
+                "p-locate": "^4.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/lodash": {
+            "version": "4.17.21",
+            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+        },
+        "node_modules/lodash-es": {
+            "version": "4.17.21",
+            "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+            "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+        },
+        "node_modules/lodash._baseiteratee": {
+            "version": "4.7.0",
+            "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz",
+            "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==",
+            "dependencies": {
+                "lodash._stringtopath": "~4.8.0"
+            }
+        },
+        "node_modules/lodash._basetostring": {
+            "version": "4.12.0",
+            "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz",
+            "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw=="
+        },
+        "node_modules/lodash._baseuniq": {
+            "version": "4.6.0",
+            "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz",
+            "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==",
+            "dependencies": {
+                "lodash._createset": "~4.0.0",
+                "lodash._root": "~3.0.0"
+            }
+        },
+        "node_modules/lodash._createset": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz",
+            "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA=="
+        },
+        "node_modules/lodash._root": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+            "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ=="
+        },
+        "node_modules/lodash._stringtopath": {
+            "version": "4.8.0",
+            "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz",
+            "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==",
+            "dependencies": {
+                "lodash._basetostring": "~4.12.0"
+            }
+        },
+        "node_modules/lodash.debounce": {
+            "version": "4.0.8",
+            "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+            "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+            "dev": true
+        },
+        "node_modules/lodash.get": {
+            "version": "4.4.2",
+            "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+            "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
+        },
+        "node_modules/lodash.includes": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+            "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+        },
+        "node_modules/lodash.isboolean": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+            "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+        },
+        "node_modules/lodash.isinteger": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+            "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+        },
+        "node_modules/lodash.isnumber": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+            "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+        },
+        "node_modules/lodash.isplainobject": {
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+            "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+        },
+        "node_modules/lodash.isstring": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+            "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+        },
+        "node_modules/lodash.merge": {
+            "version": "4.6.2",
+            "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+            "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+            "dev": true
+        },
+        "node_modules/lodash.once": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+        },
+        "node_modules/lodash.truncate": {
+            "version": "4.4.2",
+            "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+            "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+            "dev": true
+        },
+        "node_modules/lodash.uniqby": {
+            "version": "4.5.0",
+            "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz",
+            "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==",
+            "dependencies": {
+                "lodash._baseiteratee": "~4.7.0",
+                "lodash._baseuniq": "~4.6.0"
+            }
+        },
+        "node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/magic-string": {
+            "version": "0.26.2",
+            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz",
+            "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==",
+            "dev": true,
+            "dependencies": {
+                "sourcemap-codec": "^1.4.8"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/make-dir": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+            "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+            "dependencies": {
+                "semver": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/makeerror": {
+            "version": "1.0.12",
+            "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+            "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+            "dev": true,
+            "dependencies": {
+                "tmpl": "1.0.5"
+            }
+        },
+        "node_modules/map-obj": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+            "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/mathml-tag-names": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+            "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+            "dev": true,
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/wooorm"
+            }
+        },
+        "node_modules/media-typer": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+            "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/meow": {
+            "version": "9.0.0",
+            "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+            "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+            "dev": true,
+            "dependencies": {
+                "@types/minimist": "^1.2.0",
+                "camelcase-keys": "^6.2.2",
+                "decamelize": "^1.2.0",
+                "decamelize-keys": "^1.1.0",
+                "hard-rejection": "^2.1.0",
+                "minimist-options": "4.1.0",
+                "normalize-package-data": "^3.0.0",
+                "read-pkg-up": "^7.0.1",
+                "redent": "^3.0.0",
+                "trim-newlines": "^3.0.0",
+                "type-fest": "^0.18.0",
+                "yargs-parser": "^20.2.3"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/meow/node_modules/type-fest": {
+            "version": "0.18.1",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+            "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/merge": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz",
+            "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
+            "dev": true
+        },
+        "node_modules/merge-deep": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
+            "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
+            "dev": true,
+            "dependencies": {
+                "arr-union": "^3.1.0",
+                "clone-deep": "^0.2.4",
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/merge-descriptors": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+            "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+        },
+        "node_modules/merge-stream": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+            "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+            "dev": true
+        },
+        "node_modules/merge2": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/methods": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+            "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/micromatch": {
+            "version": "4.0.5",
+            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+            "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+            "dev": true,
+            "dependencies": {
+                "braces": "^3.0.2",
+                "picomatch": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
+        "node_modules/mime": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+            "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+            "bin": {
+                "mime": "cli.js"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/mime-db": {
+            "version": "1.52.0",
+            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+            "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mime-types": {
+            "version": "2.1.35",
+            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+            "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+            "dependencies": {
+                "mime-db": "1.52.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mimic-fn": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+            "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/min-indent": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+            "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+            "dependencies": {
+                "brace-expansion": "^1.1.7"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/minimist": {
+            "version": "1.2.6",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+            "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+        },
+        "node_modules/minimist-options": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+            "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+            "dev": true,
+            "dependencies": {
+                "arrify": "^1.0.1",
+                "is-plain-obj": "^1.1.0",
+                "kind-of": "^6.0.3"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/minimist-options/node_modules/kind-of": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+            "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/minipass": {
+            "version": "3.3.4",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
+            "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minizlib": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+            "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+            "dependencies": {
+                "minipass": "^3.0.0",
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/mixin-object": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
+            "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==",
+            "dev": true,
+            "dependencies": {
+                "for-in": "^0.1.3",
+                "is-extendable": "^0.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/mixin-object/node_modules/for-in": {
+            "version": "0.1.8",
+            "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+            "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/mkdirp": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/mkdirp-classic": {
+            "version": "0.5.3",
+            "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+            "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+            "dev": true
+        },
+        "node_modules/mqemitter": {
+            "version": "4.5.0",
+            "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
+            "integrity": "sha512-Mp/zytFeIv6piJQkEKnncHcP4R/ErJc5C7dfonkhkNUT2LA/nTayrfNxbipp3M5iCJUTQSUtzfQAQA3XVcKz6w==",
+            "dev": true,
+            "dependencies": {
+                "fastparallel": "^2.3.0",
+                "qlobber": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/mqtt": {
+            "version": "4.3.7",
+            "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz",
+            "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==",
+            "dependencies": {
+                "commist": "^1.0.0",
+                "concat-stream": "^2.0.0",
+                "debug": "^4.1.1",
+                "duplexify": "^4.1.1",
+                "help-me": "^3.0.0",
+                "inherits": "^2.0.3",
+                "lru-cache": "^6.0.0",
+                "minimist": "^1.2.5",
+                "mqtt-packet": "^6.8.0",
+                "number-allocator": "^1.0.9",
+                "pump": "^3.0.0",
+                "readable-stream": "^3.6.0",
+                "reinterval": "^1.1.0",
+                "rfdc": "^1.3.0",
+                "split2": "^3.1.0",
+                "ws": "^7.5.5",
+                "xtend": "^4.0.2"
+            },
+            "bin": {
+                "mqtt": "bin/mqtt.js",
+                "mqtt_pub": "bin/pub.js",
+                "mqtt_sub": "bin/sub.js"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/mqtt-packet": {
+            "version": "7.1.2",
+            "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-7.1.2.tgz",
+            "integrity": "sha512-FFZbcZ2omsf4c5TxEQfcX9hI+JzDpDKPT46OmeIBpVA7+t32ey25UNqlqNXTmeZOr5BLsSIERpQQLsFWJS94SQ==",
+            "dev": true,
+            "dependencies": {
+                "bl": "^4.0.2",
+                "debug": "^4.1.1",
+                "process-nextick-args": "^2.0.1"
+            }
+        },
+        "node_modules/mqtt/node_modules/mqtt-packet": {
+            "version": "6.10.0",
+            "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz",
+            "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==",
+            "dependencies": {
+                "bl": "^4.0.2",
+                "debug": "^4.1.1",
+                "process-nextick-args": "^2.0.1"
+            }
+        },
+        "node_modules/ms": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+            "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+        },
+        "node_modules/mssql": {
+            "version": "8.1.2",
+            "resolved": "https://registry.npmjs.org/mssql/-/mssql-8.1.2.tgz",
+            "integrity": "sha512-xkTw3Sp1Jpq2f7CG3rFQn6YK4XZbnL8HfZhaB/KRC/hjDZlJB3pSWYN2Cp/WwxIeA1iUJkdFa6GTfdMY8+DAjg==",
+            "dependencies": {
+                "@tediousjs/connection-string": "^0.3.0",
+                "commander": "^9.1.0",
+                "debug": "^4.3.3",
+                "rfdc": "^1.3.0",
+                "tarn": "^3.0.2",
+                "tedious": "^14.0.0"
+            },
+            "bin": {
+                "mssql": "bin/mssql"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/mssql/node_modules/commander": {
+            "version": "9.3.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz",
+            "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==",
+            "engines": {
+                "node": "^12.20.0 || >=14"
+            }
+        },
+        "node_modules/nanoclone": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
+            "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA=="
+        },
+        "node_modules/nanoid": {
+            "version": "3.3.4",
+            "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+            "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+            "dev": true,
+            "bin": {
+                "nanoid": "bin/nanoid.cjs"
+            },
+            "engines": {
+                "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+            }
+        },
+        "node_modules/native-duplexpair": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz",
+            "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA=="
+        },
+        "node_modules/natural-compare": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+            "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+            "dev": true
+        },
+        "node_modules/negotiator": {
+            "version": "0.6.3",
+            "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+            "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/node-abort-controller": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz",
+            "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw=="
+        },
+        "node_modules/node-addon-api": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
+            "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="
+        },
+        "node_modules/node-cloudflared-tunnel": {
+            "version": "1.0.9",
+            "resolved": "https://registry.npmjs.org/node-cloudflared-tunnel/-/node-cloudflared-tunnel-1.0.9.tgz",
+            "integrity": "sha512-d0mhIM5P2ldE2yHChehC6EvnpFCkifWRzWrW81gVWdcCWqNcyISXuDdOYzRW5mwmjWuT6WNtLJoGQ84uqS4EmA==",
+            "dependencies": {
+                "command-exists": "^1.2.9"
+            }
+        },
+        "node_modules/node-fetch": {
+            "version": "2.6.7",
+            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+            "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+            "dependencies": {
+                "whatwg-url": "^5.0.0"
+            },
+            "engines": {
+                "node": "4.x || >=6.0.0"
+            },
+            "peerDependencies": {
+                "encoding": "^0.1.0"
+            },
+            "peerDependenciesMeta": {
+                "encoding": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/node-fetch/node_modules/tr46": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+            "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+        },
+        "node_modules/node-fetch/node_modules/webidl-conversions": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+            "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+        },
+        "node_modules/node-fetch/node_modules/whatwg-url": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+            "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+            "dependencies": {
+                "tr46": "~0.0.3",
+                "webidl-conversions": "^3.0.0"
+            }
+        },
+        "node_modules/node-gyp": {
+            "version": "7.1.2",
+            "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz",
+            "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==",
+            "optional": true,
+            "dependencies": {
+                "env-paths": "^2.2.0",
+                "glob": "^7.1.4",
+                "graceful-fs": "^4.2.3",
+                "nopt": "^5.0.0",
+                "npmlog": "^4.1.2",
+                "request": "^2.88.2",
+                "rimraf": "^3.0.2",
+                "semver": "^7.3.2",
+                "tar": "^6.0.2",
+                "which": "^2.0.2"
+            },
+            "bin": {
+                "node-gyp": "bin/node-gyp.js"
+            },
+            "engines": {
+                "node": ">= 10.12.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/ansi-regex": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+            "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/aproba": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+            "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+            "optional": true
+        },
+        "node_modules/node-gyp/node_modules/are-we-there-yet": {
+            "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==",
+            "optional": true,
+            "dependencies": {
+                "delegates": "^1.0.0",
+                "readable-stream": "^2.0.6"
+            }
+        },
+        "node_modules/node-gyp/node_modules/gauge": {
+            "version": "2.7.4",
+            "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+            "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
+            "optional": true,
+            "dependencies": {
+                "aproba": "^1.0.3",
+                "console-control-strings": "^1.0.0",
+                "has-unicode": "^2.0.0",
+                "object-assign": "^4.1.0",
+                "signal-exit": "^3.0.0",
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1",
+                "wide-align": "^1.1.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/is-fullwidth-code-point": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+            "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+            "optional": true,
+            "dependencies": {
+                "number-is-nan": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/npmlog": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+            "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+            "optional": true,
+            "dependencies": {
+                "are-we-there-yet": "~1.1.2",
+                "console-control-strings": "~1.1.0",
+                "gauge": "~2.7.3",
+                "set-blocking": "~2.0.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/readable-stream": {
+            "version": "2.3.7",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+            "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+            "optional": true,
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+            }
+        },
+        "node_modules/node-gyp/node_modules/semver": {
+            "version": "7.3.7",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+            "optional": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/node-gyp/node_modules/string_decoder": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+            "optional": true,
+            "dependencies": {
+                "safe-buffer": "~5.1.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/string-width": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+            "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+            "optional": true,
+            "dependencies": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/strip-ansi": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+            "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+            "optional": true,
+            "dependencies": {
+                "ansi-regex": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/node-int64": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+            "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+            "dev": true
+        },
+        "node_modules/node-radius-client": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/node-radius-client/-/node-radius-client-1.0.0.tgz",
+            "integrity": "sha512-FkR9cMV5hNoX+kKDUTzuagvEixlLiaEJQ1/ywOdhahsihKrGDhVZmnCvmrCStA589MT3yuC/J2eKc6z68IGdBw==",
+            "dependencies": {
+                "joi": "^14.3.1",
+                "node-radius-utils": "^1.2.0",
+                "radius": "^1.1.4"
+            }
+        },
+        "node_modules/node-radius-client/node_modules/joi": {
+            "version": "14.3.1",
+            "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
+            "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
+            "deprecated": "This module has moved and is now available at @hapi/joi. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
+            "dependencies": {
+                "hoek": "6.x.x",
+                "isemail": "3.x.x",
+                "topo": "3.x.x"
+            }
+        },
+        "node_modules/node-radius-utils": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/node-radius-utils/-/node-radius-utils-1.2.0.tgz",
+            "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
+        },
+        "node_modules/node-releases": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
+            "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
+            "dev": true
+        },
+        "node_modules/nodemailer": {
+            "version": "6.6.5",
+            "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.5.tgz",
+            "integrity": "sha512-C/v856DBijUzHcHIgGpQoTrfsH3suKIRAGliIzCstatM2cAa+MYX3LuyCrABiO/cdJTxgBBHXxV1ztiqUwst5A==",
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/nopt": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+            "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+            "dependencies": {
+                "abbrev": "1"
+            },
+            "bin": {
+                "nopt": "bin/nopt.js"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/normalize-package-data": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+            "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+            "dev": true,
+            "dependencies": {
+                "hosted-git-info": "^4.0.1",
+                "is-core-module": "^2.5.0",
+                "semver": "^7.3.4",
+                "validate-npm-package-license": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/normalize-package-data/node_modules/semver": {
+            "version": "7.3.7",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/normalize-path": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/normalize-selector": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
+            "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
+            "dev": true
+        },
+        "node_modules/notp": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz",
+            "integrity": "sha512-oBig/2uqkjQ5AkBuw4QJYwkEWa/q+zHxI5/I5z6IeP2NT0alpJFsP/trrfCC+9xOAgQSZXssNi962kp5KBmypQ==",
+            "engines": {
+                "node": "> v0.6.0"
+            }
+        },
+        "node_modules/npm-run-path": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+            "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+            "dev": true,
+            "dependencies": {
+                "path-key": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/npmlog": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+            "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+            "dependencies": {
+                "are-we-there-yet": "^2.0.0",
+                "console-control-strings": "^1.1.0",
+                "gauge": "^3.0.0",
+                "set-blocking": "^2.0.0"
+            }
+        },
+        "node_modules/nth-check": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+            "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+            "dependencies": {
+                "boolbase": "^1.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/nth-check?sponsor=1"
+            }
+        },
+        "node_modules/number-allocator": {
+            "version": "1.0.10",
+            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.10.tgz",
+            "integrity": "sha512-K4AvNGKo9lP6HqsZyfSr9KDaqnwFzW203inhQEOwFrmFaYevpdX4VNwdOLk197aHujzbT//z6pCBrCOUYSM5iw==",
+            "dependencies": {
+                "debug": "^4.3.1",
+                "js-sdsl": "^2.1.2"
+            }
+        },
+        "node_modules/number-is-nan": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+            "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/numbered": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/numbered/-/numbered-1.1.0.tgz",
+            "integrity": "sha512-pv/ue2Odr7IfYOO0byC1KgBI10wo5YDauLhxY6/saNzAdAs0r1SotGCPzzCLNPL0xtrAwWRialLu23AAu9xO1g=="
+        },
+        "node_modules/nwsapi": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz",
+            "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==",
+            "dev": true
+        },
+        "node_modules/oauth-sign": {
+            "version": "0.9.0",
+            "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+            "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+            "optional": true,
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/object-assign": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+            "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-inspect": {
+            "version": "1.12.2",
+            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+            "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/object-keys": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+            "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/object.assign": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+            "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+            "dependencies": {
+                "call-bind": "^1.0.0",
+                "define-properties": "^1.1.3",
+                "has-symbols": "^1.0.1",
+                "object-keys": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/on-finished": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+            "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+            "dependencies": {
+                "ee-first": "1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/on-headers": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+            "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+            "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+            "dependencies": {
+                "wrappy": "1"
+            }
+        },
+        "node_modules/onetime": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+            "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+            "dev": true,
+            "dependencies": {
+                "mimic-fn": "^2.1.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/open": {
+            "version": "8.4.0",
+            "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
+            "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+            "dependencies": {
+                "define-lazy-prop": "^2.0.0",
+                "is-docker": "^2.1.1",
+                "is-wsl": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/optionator": {
+            "version": "0.9.1",
+            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+            "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+            "dev": true,
+            "dependencies": {
+                "deep-is": "^0.1.3",
+                "fast-levenshtein": "^2.0.6",
+                "levn": "^0.4.1",
+                "prelude-ls": "^1.2.1",
+                "type-check": "^0.4.0",
+                "word-wrap": "^1.2.3"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/os-homedir": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+            "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/p-finally": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+            "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/p-limit": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+            "dev": true,
+            "dependencies": {
+                "p-try": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/p-locate": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+            "dev": true,
+            "dependencies": {
+                "p-limit": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/p-timeout": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
+            "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
+            "dependencies": {
+                "p-finally": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/p-try": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/p-wait-for": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-3.2.0.tgz",
+            "integrity": "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==",
+            "dependencies": {
+                "p-timeout": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/packet-reader": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
+            "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+        },
+        "node_modules/parent-module": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+            "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+            "dev": true,
+            "dependencies": {
+                "callsites": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/parse-json": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+            "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/code-frame": "^7.0.0",
+                "error-ex": "^1.3.1",
+                "json-parse-even-better-errors": "^2.3.0",
+                "lines-and-columns": "^1.1.6"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/parse-passwd": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+            "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/parse5": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz",
+            "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==",
+            "dependencies": {
+                "entities": "^4.3.0"
+            },
+            "funding": {
+                "url": "https://github.com/inikulin/parse5?sponsor=1"
+            }
+        },
+        "node_modules/parse5-htmlparser2-tree-adapter": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
+            "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
+            "dependencies": {
+                "domhandler": "^5.0.2",
+                "parse5": "^7.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/inikulin/parse5?sponsor=1"
+            }
+        },
+        "node_modules/parseqs": {
+            "version": "0.0.6",
+            "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
+            "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
+        },
+        "node_modules/parseuri": {
+            "version": "0.0.6",
+            "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
+            "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
+        },
+        "node_modules/parseurl": {
+            "version": "1.3.3",
+            "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+            "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/password-hash": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/password-hash/-/password-hash-1.2.2.tgz",
+            "integrity": "sha512-Dy/5+Srojwv+1XnMrK2bn7f2jN3k2p90DfBVA0Zd6PrjWF7lXHOTWgKT4uBp1gIsqV7/llYqm+hj+gwDBF/Fmg==",
+            "bin": {
+                "nodepw": "bin/nodepw"
+            },
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/path-exists": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-is-absolute": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+            "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/path-key": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+            "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-parse": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+        },
+        "node_modules/path-to-regexp": {
+            "version": "0.1.7",
+            "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+            "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+        },
+        "node_modules/path-type": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+            "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/pend": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+            "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+            "dev": true
+        },
+        "node_modules/performance-now": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+            "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+            "optional": true
+        },
+        "node_modules/pg": {
+            "version": "8.7.3",
+            "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
+            "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
+            "dependencies": {
+                "buffer-writer": "2.0.0",
+                "packet-reader": "1.0.0",
+                "pg-connection-string": "^2.5.0",
+                "pg-pool": "^3.5.1",
+                "pg-protocol": "^1.5.0",
+                "pg-types": "^2.1.0",
+                "pgpass": "1.x"
+            },
+            "engines": {
+                "node": ">= 8.0.0"
+            },
+            "peerDependencies": {
+                "pg-native": ">=2.0.0"
+            },
+            "peerDependenciesMeta": {
+                "pg-native": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/pg-connection-string": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
+            "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
+        },
+        "node_modules/pg-int8": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+            "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/pg-pool": {
+            "version": "3.5.1",
+            "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
+            "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
+            "peerDependencies": {
+                "pg": ">=8.0"
+            }
+        },
+        "node_modules/pg-protocol": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
+            "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+        },
+        "node_modules/pg-types": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+            "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+            "dependencies": {
+                "pg-int8": "1.0.1",
+                "postgres-array": "~2.0.0",
+                "postgres-bytea": "~1.0.0",
+                "postgres-date": "~1.0.4",
+                "postgres-interval": "^1.1.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/pgpass": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+            "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+            "dependencies": {
+                "split2": "^4.1.0"
+            }
+        },
+        "node_modules/pgpass/node_modules/split2": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
+            "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==",
+            "engines": {
+                "node": ">= 10.x"
+            }
+        },
+        "node_modules/picocolors": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+            "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+            "dev": true
+        },
+        "node_modules/picomatch": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/pirates": {
+            "version": "4.0.5",
+            "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+            "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+            "dev": true,
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/pkg-dir": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+            "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+            "dev": true,
+            "dependencies": {
+                "find-up": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/pkginfo": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
+            "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==",
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/pngjs": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+            "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+            "dev": true,
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/postcss": {
+            "version": "8.4.14",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+            "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/postcss"
+                }
+            ],
+            "dependencies": {
+                "nanoid": "^3.3.4",
+                "picocolors": "^1.0.0",
+                "source-map-js": "^1.0.2"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >=14"
+            }
+        },
+        "node_modules/postcss-html": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.4.1.tgz",
+            "integrity": "sha512-OKihuWxPuBQrQeLNsavP7ytJ9IYNj/ViAXB2v7Qjh56LnfESKrkahKA9si4VfPN8xtz6oqUE6KdL0bTPrHJr6g==",
+            "dev": true,
+            "dependencies": {
+                "htmlparser2": "^7.1.2",
+                "postcss": "^8.4.0",
+                "postcss-safe-parser": "^6.0.0"
+            },
+            "engines": {
+                "node": "^12 || >=14"
+            }
+        },
+        "node_modules/postcss-html/node_modules/dom-serializer": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+            "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+            "dev": true,
+            "dependencies": {
+                "domelementtype": "^2.0.1",
+                "domhandler": "^4.2.0",
+                "entities": "^2.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+            }
+        },
+        "node_modules/postcss-html/node_modules/dom-serializer/node_modules/entities": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+            "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+            "dev": true,
+            "funding": {
+                "url": "https://github.com/fb55/entities?sponsor=1"
+            }
+        },
+        "node_modules/postcss-html/node_modules/domhandler": {
+            "version": "4.3.1",
+            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+            "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+            "dev": true,
+            "dependencies": {
+                "domelementtype": "^2.2.0"
+            },
+            "engines": {
+                "node": ">= 4"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/domhandler?sponsor=1"
+            }
+        },
+        "node_modules/postcss-html/node_modules/domutils": {
+            "version": "2.8.0",
+            "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+            "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+            "dev": true,
+            "dependencies": {
+                "dom-serializer": "^1.0.1",
+                "domelementtype": "^2.2.0",
+                "domhandler": "^4.2.0"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/domutils?sponsor=1"
+            }
+        },
+        "node_modules/postcss-html/node_modules/entities": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+            "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.12"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/entities?sponsor=1"
+            }
+        },
+        "node_modules/postcss-html/node_modules/htmlparser2": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
+            "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
+            "dev": true,
+            "funding": [
+                "https://github.com/fb55/htmlparser2?sponsor=1",
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/fb55"
+                }
+            ],
+            "dependencies": {
+                "domelementtype": "^2.0.1",
+                "domhandler": "^4.2.2",
+                "domutils": "^2.8.0",
+                "entities": "^3.0.1"
+            }
+        },
+        "node_modules/postcss-media-query-parser": {
+            "version": "0.2.3",
+            "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+            "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+            "dev": true
+        },
+        "node_modules/postcss-resolve-nested-selector": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
+            "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
+            "dev": true
+        },
+        "node_modules/postcss-rtlcss": {
+            "version": "3.4.1",
+            "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.4.1.tgz",
+            "integrity": "sha512-4SOkC34IJ086dYjmqGCeIOqQe4JTDk+jwETvq1M/57+bQA6CXEWAjGtqifjcSH75nd0vfW7+hve0Ec4ZYHmMtA==",
+            "dev": true,
+            "dependencies": {
+                "rtlcss": "^3.3.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            },
+            "peerDependencies": {
+                "postcss": "^8.0.0"
+            }
+        },
+        "node_modules/postcss-safe-parser": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+            "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=12.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/postcss/"
+            },
+            "peerDependencies": {
+                "postcss": "^8.3.3"
+            }
+        },
+        "node_modules/postcss-scss": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.4.tgz",
+            "integrity": "sha512-aBBbVyzA8b3hUL0MGrpydxxXKXFZc5Eqva0Q3V9qsBOLEMsjb6w49WfpsoWzpEgcqJGW4t7Rio8WXVU9Gd8vWg==",
+            "dev": true,
+            "engines": {
+                "node": ">=12.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/postcss/"
+            },
+            "peerDependencies": {
+                "postcss": "^8.3.3"
+            }
+        },
+        "node_modules/postcss-selector-parser": {
+            "version": "6.0.10",
+            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+            "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+            "dev": true,
+            "dependencies": {
+                "cssesc": "^3.0.0",
+                "util-deprecate": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/postcss-value-parser": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+            "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+            "dev": true
+        },
+        "node_modules/postgres-array": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+            "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/postgres-bytea": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+            "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/postgres-date": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+            "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/postgres-interval": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+            "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+            "dependencies": {
+                "xtend": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/prelude-ls": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+            "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/pretty-format": {
+            "version": "27.5.1",
+            "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+            "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-regex": "^5.0.1",
+                "ansi-styles": "^5.0.0",
+                "react-is": "^17.0.1"
+            },
+            "engines": {
+                "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+            }
+        },
+        "node_modules/pretty-format/node_modules/ansi-styles": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+            "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/prismjs": {
+            "version": "1.28.0",
+            "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
+            "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/process": {
+            "version": "0.11.10",
+            "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+            "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+            "engines": {
+                "node": ">= 0.6.0"
+            }
+        },
+        "node_modules/process-nextick-args": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+            "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+        },
+        "node_modules/progress": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+            "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/prom-client": {
+            "version": "13.2.0",
+            "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-13.2.0.tgz",
+            "integrity": "sha512-wGr5mlNNdRNzEhRYXgboUU2LxHWIojxscJKmtG3R8f4/KiWqyYgXTLHs0+Ted7tG3zFT7pgHJbtomzZ1L0ARaQ==",
+            "dependencies": {
+                "tdigest": "^0.1.1"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/prometheus-api-metrics": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/prometheus-api-metrics/-/prometheus-api-metrics-3.2.2.tgz",
+            "integrity": "sha512-5hT17HAjflPkrHSYQ7lorsKygo0PhLau/FQ6SQhw0XWAm10GwKfLQmIVP6b3LJBnc4WNOf/QKHce2RfcZMLjJQ==",
+            "dependencies": {
+                "@types/express": "^4.17.13",
+                "@types/express-serve-static-core": "^4.17.28",
+                "@types/koa": "^2.13.4",
+                "debug": "^3.2.6",
+                "lodash.get": "^4.4.2",
+                "pkginfo": "^0.4.1"
+            },
+            "peerDependencies": {
+                "prom-client": ">=12 <15"
+            }
+        },
+        "node_modules/prometheus-api-metrics/node_modules/debug": {
+            "version": "3.2.7",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+            "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+            "dependencies": {
+                "ms": "^2.1.1"
+            }
+        },
+        "node_modules/prompts": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+            "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+            "dev": true,
+            "dependencies": {
+                "kleur": "^3.0.3",
+                "sisteransi": "^1.0.5"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/property-expr": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
+            "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
+        },
+        "node_modules/proxy-addr": {
+            "version": "2.0.7",
+            "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+            "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+            "dependencies": {
+                "forwarded": "0.2.0",
+                "ipaddr.js": "1.9.1"
+            },
+            "engines": {
+                "node": ">= 0.10"
+            }
+        },
+        "node_modules/proxy-from-env": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+            "dev": true
+        },
+        "node_modules/psl": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+        },
+        "node_modules/pump": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+            "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+            "dependencies": {
+                "end-of-stream": "^1.1.0",
+                "once": "^1.3.1"
+            }
+        },
+        "node_modules/punycode": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/puppeteer": {
+            "version": "13.1.3",
+            "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.1.3.tgz",
+            "integrity": "sha512-nqcJNThLUG0Dgo++2mMtGR2FCyg7olJJhj/rm0A65muyN3nrH6lGvnNRzEaNmSnHWvjaDIG9ox5kxQB+nXTg5A==",
+            "dev": true,
+            "hasInstallScript": true,
+            "dependencies": {
+                "debug": "4.3.2",
+                "devtools-protocol": "0.0.948846",
+                "extract-zip": "2.0.1",
+                "https-proxy-agent": "5.0.0",
+                "node-fetch": "2.6.7",
+                "pkg-dir": "4.2.0",
+                "progress": "2.0.3",
+                "proxy-from-env": "1.1.0",
+                "rimraf": "3.0.2",
+                "tar-fs": "2.1.1",
+                "unbzip2-stream": "1.4.3",
+                "ws": "8.2.3"
+            },
+            "engines": {
+                "node": ">=10.18.1"
+            }
+        },
+        "node_modules/puppeteer/node_modules/debug": {
+            "version": "4.3.2",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+            "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/puppeteer/node_modules/https-proxy-agent": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+            "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+            "dev": true,
+            "dependencies": {
+                "agent-base": "6",
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/puppeteer/node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
+        "node_modules/puppeteer/node_modules/ws": {
+            "version": "8.2.3",
+            "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
+            "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependencies": {
+                "bufferutil": "^4.0.1",
+                "utf-8-validate": "^5.0.2"
+            },
+            "peerDependenciesMeta": {
+                "bufferutil": {
+                    "optional": true
+                },
+                "utf-8-validate": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/qlobber": {
+            "version": "5.0.3",
+            "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
+            "integrity": "sha512-wW4GTZPePyh0RgOsM18oDyOUlXfurVRgoNyJfS+y7VWPyd0GYhQp5T2tycZFZjonH+hngxIfklGJhTP/ghidgQ==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/qrcode": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.0.tgz",
+            "integrity": "sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==",
+            "dev": true,
+            "dependencies": {
+                "dijkstrajs": "^1.0.1",
+                "encode-utf8": "^1.0.3",
+                "pngjs": "^5.0.0",
+                "yargs": "^15.3.1"
+            },
+            "bin": {
+                "qrcode": "bin/qrcode"
+            },
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/qrcode/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/qrcode/node_modules/cliui": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+            "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+            "dev": true,
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.0",
+                "wrap-ansi": "^6.2.0"
+            }
+        },
+        "node_modules/qrcode/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/qrcode/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/qrcode/node_modules/wrap-ansi": {
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+            "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/qrcode/node_modules/y18n": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+            "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+            "dev": true
+        },
+        "node_modules/qrcode/node_modules/yargs": {
+            "version": "15.4.1",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+            "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+            "dev": true,
+            "dependencies": {
+                "cliui": "^6.0.0",
+                "decamelize": "^1.2.0",
+                "find-up": "^4.1.0",
+                "get-caller-file": "^2.0.1",
+                "require-directory": "^2.1.1",
+                "require-main-filename": "^2.0.0",
+                "set-blocking": "^2.0.0",
+                "string-width": "^4.2.0",
+                "which-module": "^2.0.0",
+                "y18n": "^4.0.0",
+                "yargs-parser": "^18.1.2"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/qrcode/node_modules/yargs-parser": {
+            "version": "18.1.3",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+            "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+            "dev": true,
+            "dependencies": {
+                "camelcase": "^5.0.0",
+                "decamelize": "^1.2.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/qs": {
+            "version": "6.9.7",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
+            "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
+            "engines": {
+                "node": ">=0.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/queue-microtask": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/quick-lru": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+            "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/radius": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/radius/-/radius-1.1.4.tgz",
+            "integrity": "sha512-UWuzdF6xf3NpsXFZZmUEkxtEalDXj8hdmMXgbGzn7vOk6zXNsiIY2I6SJ1euHt7PTQuMoz2qDEJB+AfJDJgQYw==",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/range-parser": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+            "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/raw-body": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
+            "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
+            "dependencies": {
+                "bytes": "3.1.2",
+                "http-errors": "1.8.1",
+                "iconv-lite": "0.4.24",
+                "unpipe": "1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/raw-body/node_modules/bytes": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+            "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/raw-body/node_modules/iconv-lite": {
+            "version": "0.4.24",
+            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+            "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+            "dependencies": {
+                "safer-buffer": ">= 2.1.2 < 3"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/react-is": {
+            "version": "17.0.2",
+            "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+            "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+            "dev": true
+        },
+        "node_modules/read-pkg": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+            "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+            "dev": true,
+            "dependencies": {
+                "@types/normalize-package-data": "^2.4.0",
+                "normalize-package-data": "^2.5.0",
+                "parse-json": "^5.0.0",
+                "type-fest": "^0.6.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/read-pkg-up": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+            "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+            "dev": true,
+            "dependencies": {
+                "find-up": "^4.1.0",
+                "read-pkg": "^5.2.0",
+                "type-fest": "^0.8.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/type-fest": {
+            "version": "0.8.1",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+            "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/read-pkg/node_modules/hosted-git-info": {
+            "version": "2.8.9",
+            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+            "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+            "dev": true
+        },
+        "node_modules/read-pkg/node_modules/normalize-package-data": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+            "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+            "dev": true,
+            "dependencies": {
+                "hosted-git-info": "^2.1.4",
+                "resolve": "^1.10.0",
+                "semver": "2 || 3 || 4 || 5",
+                "validate-npm-package-license": "^3.0.1"
+            }
+        },
+        "node_modules/read-pkg/node_modules/semver": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/read-pkg/node_modules/type-fest": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+            "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/readable-stream": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+            "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/readdirp": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+            "dev": true,
+            "dependencies": {
+                "picomatch": "^2.2.1"
+            },
+            "engines": {
+                "node": ">=8.10.0"
+            }
+        },
+        "node_modules/rechoir": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
+            "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+            "dependencies": {
+                "resolve": "^1.9.0"
+            },
+            "engines": {
+                "node": ">= 0.10"
+            }
+        },
+        "node_modules/redbean-node": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.1.4.tgz",
+            "integrity": "sha512-c1U6wnTeWS0c44tn9hkJWzjGgckLNJ8sN1E2bxnnnQsULOfvEVFLf8dLMjqhyyMrZ1L1mp8UvV4OfhRtH/ZrgQ==",
+            "dependencies": {
+                "@types/node": "^14.18.12",
+                "await-lock": "^2.1.0",
+                "dayjs": "^1.11.0",
+                "glob": "^7.2.0",
+                "knex": "^0.95.15",
+                "lodash": "^4.17.21"
+            }
+        },
+        "node_modules/redbean-node/node_modules/@types/node": {
+            "version": "14.18.21",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz",
+            "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q=="
+        },
+        "node_modules/redent": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+            "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+            "dev": true,
+            "dependencies": {
+                "indent-string": "^4.0.0",
+                "strip-indent": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/regenerate": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+            "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+            "dev": true
+        },
+        "node_modules/regenerate-unicode-properties": {
+            "version": "10.0.1",
+            "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz",
+            "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==",
+            "dev": true,
+            "dependencies": {
+                "regenerate": "^1.4.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/regenerator-runtime": {
+            "version": "0.13.9",
+            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+            "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+        },
+        "node_modules/regenerator-transform": {
+            "version": "0.15.0",
+            "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
+            "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/runtime": "^7.8.4"
+            }
+        },
+        "node_modules/regexp.prototype.flags": {
+            "version": "1.4.3",
+            "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+            "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "define-properties": "^1.1.3",
+                "functions-have-names": "^1.2.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/regexpp": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+            "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/mysticatea"
+            }
+        },
+        "node_modules/regexpu-core": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz",
+            "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==",
+            "dev": true,
+            "dependencies": {
+                "regenerate": "^1.4.2",
+                "regenerate-unicode-properties": "^10.0.1",
+                "regjsgen": "^0.6.0",
+                "regjsparser": "^0.8.2",
+                "unicode-match-property-ecmascript": "^2.0.0",
+                "unicode-match-property-value-ecmascript": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/regjsgen": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz",
+            "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==",
+            "dev": true
+        },
+        "node_modules/regjsparser": {
+            "version": "0.8.4",
+            "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz",
+            "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==",
+            "dev": true,
+            "dependencies": {
+                "jsesc": "~0.5.0"
+            },
+            "bin": {
+                "regjsparser": "bin/parser"
+            }
+        },
+        "node_modules/regjsparser/node_modules/jsesc": {
+            "version": "0.5.0",
+            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+            "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+            "dev": true,
+            "bin": {
+                "jsesc": "bin/jsesc"
+            }
+        },
+        "node_modules/reinterval": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz",
+            "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ=="
+        },
+        "node_modules/request": {
+            "version": "2.88.2",
+            "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+            "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+            "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+            "optional": true,
+            "dependencies": {
+                "aws-sign2": "~0.7.0",
+                "aws4": "^1.8.0",
+                "caseless": "~0.12.0",
+                "combined-stream": "~1.0.6",
+                "extend": "~3.0.2",
+                "forever-agent": "~0.6.1",
+                "form-data": "~2.3.2",
+                "har-validator": "~5.1.3",
+                "http-signature": "~1.2.0",
+                "is-typedarray": "~1.0.0",
+                "isstream": "~0.1.2",
+                "json-stringify-safe": "~5.0.1",
+                "mime-types": "~2.1.19",
+                "oauth-sign": "~0.9.0",
+                "performance-now": "^2.1.0",
+                "qs": "~6.5.2",
+                "safe-buffer": "^5.1.2",
+                "tough-cookie": "~2.5.0",
+                "tunnel-agent": "^0.6.0",
+                "uuid": "^3.3.2"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/request/node_modules/form-data": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+            "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+            "optional": true,
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.6",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 0.12"
+            }
+        },
+        "node_modules/request/node_modules/qs": {
+            "version": "6.5.3",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+            "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
+        "node_modules/request/node_modules/tough-cookie": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+            "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+            "optional": true,
+            "dependencies": {
+                "psl": "^1.1.28",
+                "punycode": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/request/node_modules/uuid": {
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+            "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+            "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
+            "optional": true,
+            "bin": {
+                "uuid": "bin/uuid"
+            }
+        },
+        "node_modules/require-directory": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+            "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-from-string": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+            "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-main-filename": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+            "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+            "dev": true
+        },
+        "node_modules/resolve": {
+            "version": "1.22.1",
+            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+            "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+            "dependencies": {
+                "is-core-module": "^2.9.0",
+                "path-parse": "^1.0.7",
+                "supports-preserve-symlinks-flag": "^1.0.0"
+            },
+            "bin": {
+                "resolve": "bin/resolve"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/resolve-cwd": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+            "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+            "dev": true,
+            "dependencies": {
+                "resolve-from": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/resolve-cwd/node_modules/resolve-from": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/resolve-dir": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+            "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==",
+            "dev": true,
+            "dependencies": {
+                "expand-tilde": "^1.2.2",
+                "global-modules": "^0.2.3"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/resolve-from": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+            "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/resolve.exports": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
+            "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/retimer": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz",
+            "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==",
+            "dev": true
+        },
+        "node_modules/reusify": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+            "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+            "dev": true,
+            "engines": {
+                "iojs": ">=1.0.0",
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/rfdc": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+            "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
+        },
+        "node_modules/rimraf": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+            "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+            "dependencies": {
+                "glob": "^7.1.3"
+            },
+            "bin": {
+                "rimraf": "bin.js"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/rollup": {
+            "version": "2.75.7",
+            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz",
+            "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==",
+            "dev": true,
+            "bin": {
+                "rollup": "dist/bin/rollup"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.2"
+            }
+        },
+        "node_modules/rollup-plugin-visualizer": {
+            "version": "5.6.0",
+            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.6.0.tgz",
+            "integrity": "sha512-CKcc8GTUZjC+LsMytU8ocRr/cGZIfMR7+mdy4YnlyetlmIl/dM8BMnOEpD4JPIGt+ZVW7Db9ZtSsbgyeBH3uTA==",
+            "dev": true,
+            "dependencies": {
+                "nanoid": "^3.1.32",
+                "open": "^8.4.0",
+                "source-map": "^0.7.3",
+                "yargs": "^17.3.1"
+            },
+            "bin": {
+                "rollup-plugin-visualizer": "dist/bin/cli.js"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "peerDependencies": {
+                "rollup": "^2.0.0"
+            }
+        },
+        "node_modules/rollup-plugin-visualizer/node_modules/source-map": {
+            "version": "0.7.4",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+            "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/rtlcss": {
+            "version": "3.5.0",
+            "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz",
+            "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==",
+            "dev": true,
+            "dependencies": {
+                "find-up": "^5.0.0",
+                "picocolors": "^1.0.0",
+                "postcss": "^8.3.11",
+                "strip-json-comments": "^3.1.1"
+            },
+            "bin": {
+                "rtlcss": "bin/rtlcss.js"
+            }
+        },
+        "node_modules/rtlcss/node_modules/find-up": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+            "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+            "dev": true,
+            "dependencies": {
+                "locate-path": "^6.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/rtlcss/node_modules/locate-path": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+            "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+            "dev": true,
+            "dependencies": {
+                "p-locate": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/rtlcss/node_modules/p-limit": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+            "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+            "dev": true,
+            "dependencies": {
+                "yocto-queue": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/rtlcss/node_modules/p-locate": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+            "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+            "dev": true,
+            "dependencies": {
+                "p-limit": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/run-parallel": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+            "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "dependencies": {
+                "queue-microtask": "^1.2.2"
+            }
+        },
+        "node_modules/rxjs": {
+            "version": "7.5.5",
+            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
+            "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
+            "dev": true,
+            "dependencies": {
+                "tslib": "^2.1.0"
+            }
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+            "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "node_modules/safe-timers": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/safe-timers/-/safe-timers-1.1.0.tgz",
+            "integrity": "sha512-9aqY+v5eMvmRaluUEtdRThV1EjlSElzO7HuCj0sTW9xvp++8iJ9t/RWGNWV6/WHcUJLHpyT2SNf/apoKTU2EpA=="
+        },
+        "node_modules/safer-buffer": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+            "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+        },
+        "node_modules/sass": {
+            "version": "1.42.1",
+            "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz",
+            "integrity": "sha512-/zvGoN8B7dspKc5mC6HlaygyCBRvnyzzgD5khiaCfglWztY99cYoiTUksVx11NlnemrcfH5CEaCpsUKoW0cQqg==",
+            "dev": true,
+            "dependencies": {
+                "chokidar": ">=3.0.0 <4.0.0"
+            },
+            "bin": {
+                "sass": "sass.js"
+            },
+            "engines": {
+                "node": ">=8.9.0"
+            }
+        },
+        "node_modules/sax": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        },
+        "node_modules/saxes": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+            "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+            "dev": true,
+            "dependencies": {
+                "xmlchars": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/semver": {
+            "version": "6.3.0",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+            "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+            "bin": {
+                "semver": "bin/semver.js"
+            }
+        },
+        "node_modules/send": {
+            "version": "0.17.2",
+            "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
+            "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
+            "dependencies": {
+                "debug": "2.6.9",
+                "depd": "~1.1.2",
+                "destroy": "~1.0.4",
+                "encodeurl": "~1.0.2",
+                "escape-html": "~1.0.3",
+                "etag": "~1.8.1",
+                "fresh": "0.5.2",
+                "http-errors": "1.8.1",
+                "mime": "1.6.0",
+                "ms": "2.1.3",
+                "on-finished": "~2.3.0",
+                "range-parser": "~1.2.1",
+                "statuses": "~1.5.0"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/send/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/send/node_modules/debug/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        },
+        "node_modules/serve-static": {
+            "version": "1.14.2",
+            "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
+            "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
+            "dependencies": {
+                "encodeurl": "~1.0.2",
+                "escape-html": "~1.0.3",
+                "parseurl": "~1.3.3",
+                "send": "0.17.2"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/set-blocking": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+            "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+        },
+        "node_modules/setprototypeof": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+            "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+        },
+        "node_modules/shallow-clone": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
+            "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==",
+            "dev": true,
+            "dependencies": {
+                "is-extendable": "^0.1.1",
+                "kind-of": "^2.0.1",
+                "lazy-cache": "^0.2.3",
+                "mixin-object": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/shallow-clone/node_modules/kind-of": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
+            "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/shallow-clone/node_modules/lazy-cache": {
+            "version": "0.2.7",
+            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
+            "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/shebang-command": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+            "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+            "dev": true,
+            "dependencies": {
+                "shebang-regex": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/shebang-regex": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+            "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/shell-quote": {
+            "version": "1.7.3",
+            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
+            "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
+            "dev": true
+        },
+        "node_modules/side-channel": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+            "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+            "dependencies": {
+                "call-bind": "^1.0.0",
+                "get-intrinsic": "^1.0.2",
+                "object-inspect": "^1.9.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/signal-exit": {
+            "version": "3.0.7",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+            "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+        },
+        "node_modules/sisteransi": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+            "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+            "dev": true
+        },
+        "node_modules/slash": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+            "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/slice-ansi": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+            "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "astral-regex": "^2.0.0",
+                "is-fullwidth-code-point": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+            }
+        },
+        "node_modules/slice-ansi/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/slice-ansi/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/slice-ansi/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/smart-buffer": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+            "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+            "engines": {
+                "node": ">= 6.0.0",
+                "npm": ">= 3.0.0"
+            }
+        },
+        "node_modules/socket.io": {
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz",
+            "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==",
+            "dependencies": {
+                "accepts": "~1.3.4",
+                "base64id": "~2.0.0",
+                "debug": "~4.3.2",
+                "engine.io": "~6.1.0",
+                "socket.io-adapter": "~2.3.3",
+                "socket.io-parser": "~4.0.4"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/socket.io-adapter": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
+            "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ=="
+        },
+        "node_modules/socket.io-client": {
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz",
+            "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==",
+            "dependencies": {
+                "@socket.io/component-emitter": "~3.0.0",
+                "backo2": "~1.0.2",
+                "debug": "~4.3.2",
+                "engine.io-client": "~6.1.1",
+                "parseuri": "0.0.6",
+                "socket.io-parser": "~4.1.1"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/socket.io-client/node_modules/socket.io-parser": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz",
+            "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==",
+            "dependencies": {
+                "@socket.io/component-emitter": "~3.0.0",
+                "debug": "~4.3.1"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/socket.io-parser": {
+            "version": "4.0.5",
+            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz",
+            "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==",
+            "dependencies": {
+                "@types/component-emitter": "^1.2.10",
+                "component-emitter": "~1.3.0",
+                "debug": "~4.3.1"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/socks": {
+            "version": "2.6.2",
+            "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
+            "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
+            "dependencies": {
+                "ip": "^1.1.5",
+                "smart-buffer": "^4.2.0"
+            },
+            "engines": {
+                "node": ">= 10.13.0",
+                "npm": ">= 3.0.0"
+            }
+        },
+        "node_modules/socks-proxy-agent": {
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz",
+            "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==",
+            "dependencies": {
+                "agent-base": "^6.0.2",
+                "debug": "^4.3.1",
+                "socks": "^2.6.1"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/sortablejs": {
+            "version": "1.14.0",
+            "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz",
+            "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==",
+            "dev": true
+        },
+        "node_modules/source-map": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map-js": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+            "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map-support": {
+            "version": "0.5.21",
+            "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+            "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+            "dev": true,
+            "dependencies": {
+                "buffer-from": "^1.0.0",
+                "source-map": "^0.6.0"
+            }
+        },
+        "node_modules/sourcemap-codec": {
+            "version": "1.4.8",
+            "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+            "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+            "dev": true
+        },
+        "node_modules/spawn-command": {
+            "version": "0.0.2-1",
+            "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
+            "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==",
+            "dev": true
+        },
+        "node_modules/spawnd": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-6.0.2.tgz",
+            "integrity": "sha512-+YJtx0dvy2wt304MrHD//tASc84zinBUYU1jacPBzrjhZUd7RsDo25krxr4HUHAQzEQFuMAs4/p+yLYU5ciZ1w==",
+            "dev": true,
+            "dependencies": {
+                "exit": "^0.1.2",
+                "signal-exit": "^3.0.6",
+                "tree-kill": "^1.2.2"
+            }
+        },
+        "node_modules/spdx-correct": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+            "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+            "dev": true,
+            "dependencies": {
+                "spdx-expression-parse": "^3.0.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/spdx-exceptions": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+            "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+            "dev": true
+        },
+        "node_modules/spdx-expression-parse": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+            "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+            "dev": true,
+            "dependencies": {
+                "spdx-exceptions": "^2.1.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/spdx-license-ids": {
+            "version": "3.0.11",
+            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
+            "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
+            "dev": true
+        },
+        "node_modules/specificity": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
+            "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
+            "dev": true,
+            "bin": {
+                "specificity": "bin/specificity"
+            }
+        },
+        "node_modules/split2": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+            "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
+            "dependencies": {
+                "readable-stream": "^3.0.0"
+            }
+        },
+        "node_modules/sprintf-js": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+            "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
+        },
+        "node_modules/sshpk": {
+            "version": "1.17.0",
+            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+            "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+            "optional": true,
+            "dependencies": {
+                "asn1": "~0.2.3",
+                "assert-plus": "^1.0.0",
+                "bcrypt-pbkdf": "^1.0.0",
+                "dashdash": "^1.12.0",
+                "ecc-jsbn": "~0.1.1",
+                "getpass": "^0.1.1",
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.0.2",
+                "tweetnacl": "~0.14.0"
+            },
+            "bin": {
+                "sshpk-conv": "bin/sshpk-conv",
+                "sshpk-sign": "bin/sshpk-sign",
+                "sshpk-verify": "bin/sshpk-verify"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/stack-utils": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
+            "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
+            "dev": true,
+            "dependencies": {
+                "escape-string-regexp": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/stack-utils/node_modules/escape-string-regexp": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+            "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/statuses": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+            "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/stoppable": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
+            "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==",
+            "engines": {
+                "node": ">=4",
+                "npm": ">=6"
+            }
+        },
+        "node_modules/stream-shift": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+            "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
+        },
+        "node_modules/string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "dependencies": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
+        "node_modules/string_decoder/node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/string-length": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+            "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+            "dev": true,
+            "dependencies": {
+                "char-regex": "^1.0.2",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/string.prototype.trimend": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
+            "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "define-properties": "^1.1.4",
+                "es-abstract": "^1.19.5"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/string.prototype.trimstart": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
+            "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "define-properties": "^1.1.4",
+                "es-abstract": "^1.19.5"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-bom": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+            "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-final-newline": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+            "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/strip-indent": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+            "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+            "dev": true,
+            "dependencies": {
+                "min-indent": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-json-comments": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+            "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/style-search": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+            "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
+            "dev": true
+        },
+        "node_modules/stylelint": {
+            "version": "14.7.1",
+            "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.7.1.tgz",
+            "integrity": "sha512-rUOWm67hrzGXXyO/cInENEejF4urh1dLgOb9cr/3XLDb/t/A+rXQp3p6+no8o8QCKTgBUdhVUq/bXMgE988PJw==",
+            "dev": true,
+            "dependencies": {
+                "balanced-match": "^2.0.0",
+                "colord": "^2.9.2",
+                "cosmiconfig": "^7.0.1",
+                "css-functions-list": "^3.0.1",
+                "debug": "^4.3.4",
+                "execall": "^2.0.0",
+                "fast-glob": "^3.2.11",
+                "fastest-levenshtein": "^1.0.12",
+                "file-entry-cache": "^6.0.1",
+                "get-stdin": "^8.0.0",
+                "global-modules": "^2.0.0",
+                "globby": "^11.1.0",
+                "globjoin": "^0.1.4",
+                "html-tags": "^3.2.0",
+                "ignore": "^5.2.0",
+                "import-lazy": "^4.0.0",
+                "imurmurhash": "^0.1.4",
+                "is-plain-object": "^5.0.0",
+                "known-css-properties": "^0.24.0",
+                "mathml-tag-names": "^2.1.3",
+                "meow": "^9.0.0",
+                "micromatch": "^4.0.5",
+                "normalize-path": "^3.0.0",
+                "normalize-selector": "^0.2.0",
+                "picocolors": "^1.0.0",
+                "postcss": "^8.4.12",
+                "postcss-media-query-parser": "^0.2.3",
+                "postcss-resolve-nested-selector": "^0.1.1",
+                "postcss-safe-parser": "^6.0.0",
+                "postcss-selector-parser": "^6.0.10",
+                "postcss-value-parser": "^4.2.0",
+                "resolve-from": "^5.0.0",
+                "specificity": "^0.4.1",
+                "string-width": "^4.2.3",
+                "strip-ansi": "^6.0.1",
+                "style-search": "^0.1.0",
+                "supports-hyperlinks": "^2.2.0",
+                "svg-tags": "^1.0.0",
+                "table": "^6.8.0",
+                "v8-compile-cache": "^2.3.0",
+                "write-file-atomic": "^4.0.1"
+            },
+            "bin": {
+                "stylelint": "bin/stylelint.js"
+            },
+            "engines": {
+                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/stylelint"
+            }
+        },
+        "node_modules/stylelint-config-recommended": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz",
+            "integrity": "sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==",
+            "dev": true,
+            "peerDependencies": {
+                "stylelint": "^14.4.0"
+            }
+        },
+        "node_modules/stylelint-config-standard": {
+            "version": "25.0.0",
+            "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-25.0.0.tgz",
+            "integrity": "sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==",
+            "dev": true,
+            "dependencies": {
+                "stylelint-config-recommended": "^7.0.0"
+            },
+            "peerDependencies": {
+                "stylelint": "^14.4.0"
+            }
+        },
+        "node_modules/stylelint/node_modules/balanced-match": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+            "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+            "dev": true
+        },
+        "node_modules/stylelint/node_modules/global-modules": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+            "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+            "dev": true,
+            "dependencies": {
+                "global-prefix": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/stylelint/node_modules/global-prefix": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+            "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+            "dev": true,
+            "dependencies": {
+                "ini": "^1.3.5",
+                "kind-of": "^6.0.2",
+                "which": "^1.3.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/stylelint/node_modules/kind-of": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+            "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/stylelint/node_modules/resolve-from": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/stylelint/node_modules/which": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+            "dev": true,
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "which": "bin/which"
+            }
+        },
+        "node_modules/stylelint/node_modules/write-file-atomic": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz",
+            "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==",
+            "dev": true,
+            "dependencies": {
+                "imurmurhash": "^0.1.4",
+                "signal-exit": "^3.0.7"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16"
+            }
+        },
+        "node_modules/supports-color": {
+            "version": "5.5.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/supports-hyperlinks": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
+            "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0",
+                "supports-color": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/supports-hyperlinks/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/supports-hyperlinks/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/supports-preserve-symlinks-flag": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/svg-tags": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+            "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+            "dev": true
+        },
+        "node_modules/symbol-tree": {
+            "version": "3.2.4",
+            "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+            "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+            "dev": true
+        },
+        "node_modules/systemjs": {
+            "version": "6.12.1",
+            "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.12.1.tgz",
+            "integrity": "sha512-hqTN6kW+pN6/qro6G9OZ7ceDQOcYno020zBQKpZQLsJhYTDMCMNfXi/Y8duF5iW+4WWZr42ry0MMkcRGpbwG2A==",
+            "dev": true
+        },
+        "node_modules/table": {
+            "version": "6.8.0",
+            "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+            "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
+            "dev": true,
+            "dependencies": {
+                "ajv": "^8.0.1",
+                "lodash.truncate": "^4.4.2",
+                "slice-ansi": "^4.0.0",
+                "string-width": "^4.2.3",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/table/node_modules/ajv": {
+            "version": "8.11.0",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
+            "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
+            "dev": true,
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "json-schema-traverse": "^1.0.0",
+                "require-from-string": "^2.0.2",
+                "uri-js": "^4.2.2"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/epoberezkin"
+            }
+        },
+        "node_modules/table/node_modules/json-schema-traverse": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+            "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+            "dev": true
+        },
+        "node_modules/tar": {
+            "version": "6.1.11",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
+            "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
+            "dependencies": {
+                "chownr": "^2.0.0",
+                "fs-minipass": "^2.0.0",
+                "minipass": "^3.0.0",
+                "minizlib": "^2.1.1",
+                "mkdirp": "^1.0.3",
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/tar-fs": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+            "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+            "dev": true,
+            "dependencies": {
+                "chownr": "^1.1.1",
+                "mkdirp-classic": "^0.5.2",
+                "pump": "^3.0.0",
+                "tar-stream": "^2.1.4"
+            }
+        },
+        "node_modules/tar-fs/node_modules/chownr": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+            "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+            "dev": true
+        },
+        "node_modules/tar-stream": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+            "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+            "dev": true,
+            "dependencies": {
+                "bl": "^4.0.3",
+                "end-of-stream": "^1.4.1",
+                "fs-constants": "^1.0.0",
+                "inherits": "^2.0.3",
+                "readable-stream": "^3.1.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/tarn": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
+            "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==",
+            "engines": {
+                "node": ">=8.0.0"
+            }
+        },
+        "node_modules/tcp-ping": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/tcp-ping/-/tcp-ping-0.1.1.tgz",
+            "integrity": "sha512-7Ed10Ds0hYnF+O1lfiZ2iSZ1bCAj+96Madctebmq7Y1ALPWlBY4YI8C6pCL+UTlshFY5YogixKLpgDP/4BlHrw=="
+        },
+        "node_modules/tdigest": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz",
+            "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==",
+            "dependencies": {
+                "bintrees": "1.0.2"
+            }
+        },
+        "node_modules/tedious": {
+            "version": "14.6.1",
+            "resolved": "https://registry.npmjs.org/tedious/-/tedious-14.6.1.tgz",
+            "integrity": "sha512-45Xsvsjm6j41JVXXwKAseAGM/jD6ty8CcSdcxPT4B2dqZ00tIkYsGlI7n8DU8xDoatnvyT4BIYKZZCe3eE16PA==",
+            "dependencies": {
+                "@azure/identity": "^2.0.4",
+                "@azure/keyvault-keys": "^4.4.0",
+                "@js-joda/core": "^5.2.0",
+                "@types/es-aggregate-error": "^1.0.2",
+                "bl": "^5.0.0",
+                "es-aggregate-error": "^1.0.8",
+                "iconv-lite": "^0.6.3",
+                "jsbi": "^4.3.0",
+                "native-duplexpair": "^1.0.0",
+                "node-abort-controller": "^3.0.1",
+                "punycode": "^2.1.0",
+                "sprintf-js": "^1.1.2"
+            },
+            "engines": {
+                "node": ">=12.3.0"
+            }
+        },
+        "node_modules/tedious/node_modules/bl": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz",
+            "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==",
+            "dependencies": {
+                "buffer": "^6.0.3",
+                "inherits": "^2.0.4",
+                "readable-stream": "^3.4.0"
+            }
+        },
+        "node_modules/tedious/node_modules/buffer": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+            "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "dependencies": {
+                "base64-js": "^1.3.1",
+                "ieee754": "^1.2.1"
+            }
+        },
+        "node_modules/terminal-link": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+            "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-escapes": "^4.2.1",
+                "supports-hyperlinks": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/test-exclude": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+            "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+            "dev": true,
+            "dependencies": {
+                "@istanbuljs/schema": "^0.1.2",
+                "glob": "^7.1.4",
+                "minimatch": "^3.0.4"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/text-table": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+            "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+            "dev": true
+        },
+        "node_modules/thirty-two": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz",
+            "integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==",
+            "engines": {
+                "node": ">=0.2.6"
+            }
+        },
+        "node_modules/throat": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
+            "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
+            "dev": true
+        },
+        "node_modules/through": {
+            "version": "2.3.8",
+            "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+            "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+            "dev": true
+        },
+        "node_modules/tildify": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz",
+            "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/timezones-list": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/timezones-list/-/timezones-list-3.0.1.tgz",
+            "integrity": "sha512-yfOzyuVwzgD0LkldD3Epkr+JUdUIxEUL147Fa6ZgG/23KU28iOv3e3M7vQOCFMPyopAhDX7dqOLWttIP7tkTKg==",
+            "dev": true
+        },
+        "node_modules/tmpl": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+            "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+            "dev": true
+        },
+        "node_modules/to-fast-properties": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+            "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/to-regex-range": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+            "dev": true,
+            "dependencies": {
+                "is-number": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=8.0"
+            }
+        },
+        "node_modules/toidentifier": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+            "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
+        "node_modules/topo": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz",
+            "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
+            "deprecated": "This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
+            "dependencies": {
+                "hoek": "6.x.x"
+            }
+        },
+        "node_modules/toposort": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+            "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
+        },
+        "node_modules/tough-cookie": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
+            "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
+            "dependencies": {
+                "psl": "^1.1.33",
+                "punycode": "^2.1.1",
+                "universalify": "^0.1.2"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/tr46": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+            "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+            "dev": true,
+            "dependencies": {
+                "punycode": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/tree-kill": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+            "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+            "dev": true,
+            "bin": {
+                "tree-kill": "cli.js"
+            }
+        },
+        "node_modules/trim-newlines": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+            "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/tslib": {
+            "version": "2.4.0",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+            "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+        },
+        "node_modules/tunnel": {
+            "version": "0.0.6",
+            "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+            "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+            "engines": {
+                "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
+            }
+        },
+        "node_modules/tunnel-agent": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+            "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+            "optional": true,
+            "dependencies": {
+                "safe-buffer": "^5.0.1"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/tweetnacl": {
+            "version": "0.14.5",
+            "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+            "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+            "optional": true
+        },
+        "node_modules/type-check": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+            "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+            "dev": true,
+            "dependencies": {
+                "prelude-ls": "^1.2.1"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/type-detect": {
+            "version": "4.0.8",
+            "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+            "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/type-fest": {
+            "version": "0.21.3",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+            "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/type-is": {
+            "version": "1.6.18",
+            "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+            "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+            "dependencies": {
+                "media-typer": "0.3.0",
+                "mime-types": "~2.1.24"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/typedarray": {
+            "version": "0.0.6",
+            "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+            "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+        },
+        "node_modules/typedarray-to-buffer": {
+            "version": "3.1.5",
+            "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+            "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+            "dev": true,
+            "dependencies": {
+                "is-typedarray": "^1.0.0"
+            }
+        },
+        "node_modules/typescript": {
+            "version": "4.4.4",
+            "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
+            "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
+            "dev": true,
+            "bin": {
+                "tsc": "bin/tsc",
+                "tsserver": "bin/tsserver"
+            },
+            "engines": {
+                "node": ">=4.2.0"
+            }
+        },
+        "node_modules/unbox-primitive": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+            "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "has-bigints": "^1.0.2",
+                "has-symbols": "^1.0.3",
+                "which-boxed-primitive": "^1.0.2"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/unbzip2-stream": {
+            "version": "1.4.3",
+            "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+            "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+            "dev": true,
+            "dependencies": {
+                "buffer": "^5.2.1",
+                "through": "^2.3.8"
+            }
+        },
+        "node_modules/unicode-canonical-property-names-ecmascript": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+            "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/unicode-match-property-ecmascript": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+            "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+            "dev": true,
+            "dependencies": {
+                "unicode-canonical-property-names-ecmascript": "^2.0.0",
+                "unicode-property-aliases-ecmascript": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/unicode-match-property-value-ecmascript": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
+            "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/unicode-property-aliases-ecmascript": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
+            "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/universal-user-agent": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
+            "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==",
+            "dev": true
+        },
+        "node_modules/universalify": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+            "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
+        "node_modules/unpipe": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+            "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/update-browserslist-db": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz",
+            "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/browserslist"
+                }
+            ],
+            "dependencies": {
+                "escalade": "^3.1.1",
+                "picocolors": "^1.0.0"
+            },
+            "bin": {
+                "browserslist-lint": "cli.js"
+            },
+            "peerDependencies": {
+                "browserslist": ">= 4.21.0"
+            }
+        },
+        "node_modules/uri-js": {
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+            "devOptional": true,
+            "dependencies": {
+                "punycode": "^2.1.0"
+            }
+        },
+        "node_modules/util-deprecate": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+            "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+        },
+        "node_modules/utils-merge": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+            "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/uuid": {
+            "version": "8.3.2",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+            "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+            "bin": {
+                "uuid": "dist/bin/uuid"
+            }
+        },
+        "node_modules/uuid-parse": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz",
+            "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==",
+            "dev": true
+        },
+        "node_modules/v-pagination-3": {
+            "version": "0.1.7",
+            "resolved": "https://registry.npmjs.org/v-pagination-3/-/v-pagination-3-0.1.7.tgz",
+            "integrity": "sha512-b5H+SdL+yIhkqyWI+Uj5lGk1VK3Q/hjqN44okerMa9smtk55DJX3Jg+ecU/vJAFrEhNCqgNzLsJ8pLRcHrbjrg==",
+            "dev": true,
+            "dependencies": {
+                "babel-plugin-add-module-exports": "^0.2.1",
+                "merge": "^2.1.1",
+                "vue": ">=3.0.0"
+            }
+        },
+        "node_modules/v8-compile-cache": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+            "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+            "dev": true
+        },
+        "node_modules/v8-to-istanbul": {
+            "version": "8.1.1",
+            "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
+            "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+            "dev": true,
+            "dependencies": {
+                "@types/istanbul-lib-coverage": "^2.0.1",
+                "convert-source-map": "^1.6.0",
+                "source-map": "^0.7.3"
+            },
+            "engines": {
+                "node": ">=10.12.0"
+            }
+        },
+        "node_modules/v8-to-istanbul/node_modules/source-map": {
+            "version": "0.7.4",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+            "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/validate-npm-package-license": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+            "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+            "dev": true,
+            "dependencies": {
+                "spdx-correct": "^3.0.0",
+                "spdx-expression-parse": "^3.0.0"
+            }
+        },
+        "node_modules/vary": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+            "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/verror": {
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+            "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+            "engines": [
+                "node >=0.6.0"
+            ],
+            "optional": true,
+            "dependencies": {
+                "assert-plus": "^1.0.0",
+                "core-util-is": "1.0.2",
+                "extsprintf": "^1.2.0"
+            }
+        },
+        "node_modules/vite": {
+            "version": "2.9.13",
+            "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.13.tgz",
+            "integrity": "sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==",
+            "dev": true,
+            "dependencies": {
+                "esbuild": "^0.14.27",
+                "postcss": "^8.4.13",
+                "resolve": "^1.22.0",
+                "rollup": "^2.59.0"
+            },
+            "bin": {
+                "vite": "bin/vite.js"
+            },
+            "engines": {
+                "node": ">=12.2.0"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.2"
+            },
+            "peerDependencies": {
+                "less": "*",
+                "sass": "*",
+                "stylus": "*"
+            },
+            "peerDependenciesMeta": {
+                "less": {
+                    "optional": true
+                },
+                "sass": {
+                    "optional": true
+                },
+                "stylus": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/vite-plugin-compression": {
+            "version": "0.5.1",
+            "resolved": "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz",
+            "integrity": "sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==",
+            "dev": true,
+            "dependencies": {
+                "chalk": "^4.1.2",
+                "debug": "^4.3.3",
+                "fs-extra": "^10.0.0"
+            },
+            "peerDependencies": {
+                "vite": ">=2.0.0"
+            }
+        },
+        "node_modules/vite-plugin-compression/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/vite-plugin-compression/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/vite-plugin-compression/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/vite-plugin-compression/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/vite-plugin-compression/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/vite-plugin-compression/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/vue": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.36.tgz",
+            "integrity": "sha512-5yTXmrE6gW8IQgttzHW5bfBiFA6mx35ZXHjGLDmKYzW6MMmYvCwuKybANRepwkMYeXw2v1buGg3/lPICY5YlZw==",
+            "dev": true,
+            "dependencies": {
+                "@vue/compiler-dom": "3.2.36",
+                "@vue/compiler-sfc": "3.2.36",
+                "@vue/runtime-dom": "3.2.36",
+                "@vue/server-renderer": "3.2.36",
+                "@vue/shared": "3.2.36"
+            }
+        },
+        "node_modules/vue-chart-3": {
+            "version": "3.0.9",
+            "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-3.0.9.tgz",
+            "integrity": "sha512-RyVaOhSem0v4v645zAkdi1mgZjuD3KMQr11KrEZGFupoHzV2qn/sBpEDvplR9i57YnRxZ3KDnKqw/1rx2CkOZA==",
+            "dev": true,
+            "dependencies": {
+                "@vue/runtime-core": "latest",
+                "@vue/runtime-dom": "latest",
+                "csstype": "3.0.10",
+                "lodash": "latest",
+                "nanoid": "3.1.31"
+            },
+            "peerDependencies": {
+                "chart.js": "=> ^3.1.0",
+                "vue": ">= 3"
+            }
+        },
+        "node_modules/vue-chart-3/node_modules/@vue/reactivity": {
+            "version": "3.2.37",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz",
+            "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==",
+            "dev": true,
+            "dependencies": {
+                "@vue/shared": "3.2.37"
+            }
+        },
+        "node_modules/vue-chart-3/node_modules/@vue/runtime-core": {
+            "version": "3.2.37",
+            "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz",
+            "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==",
+            "dev": true,
+            "dependencies": {
+                "@vue/reactivity": "3.2.37",
+                "@vue/shared": "3.2.37"
+            }
+        },
+        "node_modules/vue-chart-3/node_modules/@vue/runtime-dom": {
+            "version": "3.2.37",
+            "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz",
+            "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==",
+            "dev": true,
+            "dependencies": {
+                "@vue/runtime-core": "3.2.37",
+                "@vue/shared": "3.2.37",
+                "csstype": "^2.6.8"
+            }
+        },
+        "node_modules/vue-chart-3/node_modules/@vue/runtime-dom/node_modules/csstype": {
+            "version": "2.6.20",
+            "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
+            "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
+            "dev": true
+        },
+        "node_modules/vue-chart-3/node_modules/csstype": {
+            "version": "3.0.10",
+            "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+            "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==",
+            "dev": true
+        },
+        "node_modules/vue-chart-3/node_modules/lodash": {
+            "version": "4.17.21",
+            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+            "dev": true
+        },
+        "node_modules/vue-chart-3/node_modules/nanoid": {
+            "version": "3.1.31",
+            "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz",
+            "integrity": "sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A==",
+            "dev": true,
+            "bin": {
+                "nanoid": "bin/nanoid.cjs"
+            },
+            "engines": {
+                "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+            }
+        },
+        "node_modules/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==",
+            "dev": true,
+            "peerDependencies": {
+                "vue": "^2.6.10"
+            }
+        },
+        "node_modules/vue-contenteditable": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/vue-contenteditable/-/vue-contenteditable-3.0.4.tgz",
+            "integrity": "sha512-CmtqT4zHQwLoJEyNVaXUjjUFPUVYlXXBHfSbRCHCUjODMqrn6L293LM1nc1ELx8epitZZvecTfIqOLlSzB3d+w==",
+            "dev": true,
+            "peerDependencies": {
+                "vue": "^3.0.0"
+            }
+        },
+        "node_modules/vue-demi": {
+            "version": "0.12.5",
+            "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.5.tgz",
+            "integrity": "sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==",
+            "dev": true,
+            "hasInstallScript": true,
+            "bin": {
+                "vue-demi-fix": "bin/vue-demi-fix.js",
+                "vue-demi-switch": "bin/vue-demi-switch.js"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/antfu"
+            },
+            "peerDependencies": {
+                "@vue/composition-api": "^1.0.0-rc.1",
+                "vue": "^3.0.0-0 || ^2.6.0"
+            },
+            "peerDependenciesMeta": {
+                "@vue/composition-api": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/vue-eslint-parser": {
+            "version": "8.3.0",
+            "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
+            "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+            "dev": true,
+            "dependencies": {
+                "debug": "^4.3.2",
+                "eslint-scope": "^7.0.0",
+                "eslint-visitor-keys": "^3.1.0",
+                "espree": "^9.0.0",
+                "esquery": "^1.4.0",
+                "lodash": "^4.17.21",
+                "semver": "^7.3.5"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/mysticatea"
+            },
+            "peerDependencies": {
+                "eslint": ">=6.0.0"
+            }
+        },
+        "node_modules/vue-eslint-parser/node_modules/eslint-scope": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+            "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+            "dev": true,
+            "dependencies": {
+                "esrecurse": "^4.3.0",
+                "estraverse": "^5.2.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+            "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+            "dev": true,
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/vue-eslint-parser/node_modules/estraverse": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/vue-eslint-parser/node_modules/semver": {
+            "version": "7.3.7",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/vue-i18n": {
+            "version": "9.1.10",
+            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.1.10.tgz",
+            "integrity": "sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==",
+            "dev": true,
+            "dependencies": {
+                "@intlify/core-base": "9.1.10",
+                "@intlify/shared": "9.1.10",
+                "@intlify/vue-devtools": "9.1.10",
+                "@vue/devtools-api": "^6.0.0-beta.7"
+            },
+            "engines": {
+                "node": ">= 10"
+            },
+            "peerDependencies": {
+                "vue": "^3.0.0"
+            }
+        },
+        "node_modules/vue-image-crop-upload": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/vue-image-crop-upload/-/vue-image-crop-upload-3.0.3.tgz",
+            "integrity": "sha512-VeBsU0oI1hXeCvdpnu19DM/r3KTlI8SUXTxsHsU4MhDXR0ahRziiL9tf4FbILGx+gRVNZhGbl32yuM6TiaGNhA==",
+            "dev": true,
+            "dependencies": {
+                "babel-runtime": "^6.11.6"
+            }
+        },
+        "node_modules/vue-multiselect": {
+            "version": "3.0.0-alpha.2",
+            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-alpha.2.tgz",
+            "integrity": "sha512-Xp9fGJECns45v+v8jXbCIsAkCybYkEg0lNwr7Z6HDUSMyx2TEIK2giipPE+qXiShEc1Ipn+ZtttH2iq9hwXP4Q==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4.0.0",
+                "npm": ">= 3.0.0"
+            }
+        },
+        "node_modules/vue-prism-editor": {
+            "version": "2.0.0-alpha.2",
+            "resolved": "https://registry.npmjs.org/vue-prism-editor/-/vue-prism-editor-2.0.0-alpha.2.tgz",
+            "integrity": "sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "peerDependencies": {
+                "vue": "^3.0.0"
+            }
+        },
+        "node_modules/vue-qrcode": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/vue-qrcode/-/vue-qrcode-1.0.1.tgz",
+            "integrity": "sha512-LHEsHA8mVR+mL8REKeLrvP0h0lelwzkJjFe3ToygKjQS9Mo85m9I7/axdCnRl9ZiZIFjTWkAW1dCK+f8rq0wIg==",
+            "dev": true,
+            "dependencies": {
+                "tslib": "^2.2.0",
+                "vue-demi": "^0.12.5"
+            },
+            "peerDependencies": {
+                "@vue/composition-api": "^1.0.0",
+                "qrcode": "^1.0.0",
+                "vue": "^2.0.0 || ^3.0.0"
+            },
+            "peerDependenciesMeta": {
+                "@vue/composition-api": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/vue-router": {
+            "version": "4.0.16",
+            "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.16.tgz",
+            "integrity": "sha512-JcO7cb8QJLBWE+DfxGUL3xUDOae/8nhM1KVdnudadTAORbuxIC/xAydC5Zr/VLHUDQi1ppuTF5/rjBGzgzrJNA==",
+            "dev": true,
+            "dependencies": {
+                "@vue/devtools-api": "^6.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/posva"
+            },
+            "peerDependencies": {
+                "vue": "^3.2.0"
+            }
+        },
+        "node_modules/vue-toastification": {
+            "version": "2.0.0-rc.5",
+            "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz",
+            "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==",
+            "dev": true,
+            "peerDependencies": {
+                "vue": "^3.0.2"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/compiler-core": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.36.tgz",
+            "integrity": "sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/parser": "^7.16.4",
+                "@vue/shared": "3.2.36",
+                "estree-walker": "^2.0.2",
+                "source-map": "^0.6.1"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/compiler-dom": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.36.tgz",
+            "integrity": "sha512-tcOTAOiW4s24QLnq+ON6J+GRONXJ+A/mqKCORi0LSlIh8XQlNnlm24y8xIL8la+ZDgkdbjarQ9ZqYSvEja6gVA==",
+            "dev": true,
+            "dependencies": {
+                "@vue/compiler-core": "3.2.36",
+                "@vue/shared": "3.2.36"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/compiler-sfc": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.36.tgz",
+            "integrity": "sha512-AvGb4bTj4W8uQ4BqaSxo7UwTEqX5utdRSMyHy58OragWlt8nEACQ9mIeQh3K4di4/SX+41+pJrLIY01lHAOFOA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/parser": "^7.16.4",
+                "@vue/compiler-core": "3.2.36",
+                "@vue/compiler-dom": "3.2.36",
+                "@vue/compiler-ssr": "3.2.36",
+                "@vue/reactivity-transform": "3.2.36",
+                "@vue/shared": "3.2.36",
+                "estree-walker": "^2.0.2",
+                "magic-string": "^0.25.7",
+                "postcss": "^8.1.10",
+                "source-map": "^0.6.1"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/compiler-ssr": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.36.tgz",
+            "integrity": "sha512-+KugInUFRvOxEdLkZwE+W43BqHyhBh0jpYXhmqw1xGq2dmE6J9eZ8UUSOKNhdHtQ/iNLWWeK/wPZkVLUf3YGaw==",
+            "dev": true,
+            "dependencies": {
+                "@vue/compiler-dom": "3.2.36",
+                "@vue/shared": "3.2.36"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/reactivity-transform": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.36.tgz",
+            "integrity": "sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==",
+            "dev": true,
+            "dependencies": {
+                "@babel/parser": "^7.16.4",
+                "@vue/compiler-core": "3.2.36",
+                "@vue/shared": "3.2.36",
+                "estree-walker": "^2.0.2",
+                "magic-string": "^0.25.7"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/shared": {
+            "version": "3.2.36",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz",
+            "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==",
+            "dev": true
+        },
+        "node_modules/vue/node_modules/magic-string": {
+            "version": "0.25.9",
+            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+            "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+            "dev": true,
+            "dependencies": {
+                "sourcemap-codec": "^1.4.8"
+            }
+        },
+        "node_modules/vuedraggable": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz",
+            "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
+            "dev": true,
+            "dependencies": {
+                "sortablejs": "1.14.0"
+            },
+            "peerDependencies": {
+                "vue": "^3.0.1"
+            }
+        },
+        "node_modules/w3c-hr-time": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+            "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+            "dev": true,
+            "dependencies": {
+                "browser-process-hrtime": "^1.0.0"
+            }
+        },
+        "node_modules/w3c-xmlserializer": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+            "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+            "dev": true,
+            "dependencies": {
+                "xml-name-validator": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/wait-on": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz",
+            "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==",
+            "dev": true,
+            "dependencies": {
+                "axios": "^0.25.0",
+                "joi": "^17.6.0",
+                "lodash": "^4.17.21",
+                "minimist": "^1.2.5",
+                "rxjs": "^7.5.4"
+            },
+            "bin": {
+                "wait-on": "bin/wait-on"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/wait-on/node_modules/axios": {
+            "version": "0.25.0",
+            "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz",
+            "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
+            "dev": true,
+            "dependencies": {
+                "follow-redirects": "^1.14.7"
+            }
+        },
+        "node_modules/walker": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+            "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+            "dev": true,
+            "dependencies": {
+                "makeerror": "1.0.12"
+            }
+        },
+        "node_modules/webidl-conversions": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+            "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+            "dev": true,
+            "engines": {
+                "node": ">=10.4"
+            }
+        },
+        "node_modules/whatwg-encoding": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+            "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+            "dev": true,
+            "dependencies": {
+                "iconv-lite": "0.4.24"
+            }
+        },
+        "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+            "version": "0.4.24",
+            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+            "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+            "dev": true,
+            "dependencies": {
+                "safer-buffer": ">= 2.1.2 < 3"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/whatwg-mimetype": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+            "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+            "dev": true
+        },
+        "node_modules/whatwg-url": {
+            "version": "8.7.0",
+            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+            "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+            "dev": true,
+            "dependencies": {
+                "lodash": "^4.7.0",
+                "tr46": "^2.1.0",
+                "webidl-conversions": "^6.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/which": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+            "devOptional": true,
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "node-which": "bin/node-which"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/which-boxed-primitive": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+            "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+            "dependencies": {
+                "is-bigint": "^1.0.1",
+                "is-boolean-object": "^1.1.0",
+                "is-number-object": "^1.0.4",
+                "is-string": "^1.0.5",
+                "is-symbol": "^1.0.3"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/which-module": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+            "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
+            "dev": true
+        },
+        "node_modules/wide-align": {
+            "version": "1.1.5",
+            "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+            "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+            "dependencies": {
+                "string-width": "^1.0.2 || 2 || 3 || 4"
+            }
+        },
+        "node_modules/word-wrap": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+            "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrap-ansi": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+            "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+        },
+        "node_modules/write-file-atomic": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+            "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+            "dev": true,
+            "dependencies": {
+                "imurmurhash": "^0.1.4",
+                "is-typedarray": "^1.0.0",
+                "signal-exit": "^3.0.2",
+                "typedarray-to-buffer": "^3.1.5"
+            }
+        },
+        "node_modules/ws": {
+            "version": "7.5.8",
+            "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz",
+            "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==",
+            "engines": {
+                "node": ">=8.3.0"
+            },
+            "peerDependencies": {
+                "bufferutil": "^4.0.1",
+                "utf-8-validate": "^5.0.2"
+            },
+            "peerDependenciesMeta": {
+                "bufferutil": {
+                    "optional": true
+                },
+                "utf-8-validate": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/xml-name-validator": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+            "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+            "dev": true
+        },
+        "node_modules/xml2js": {
+            "version": "0.4.23",
+            "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
+            "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+            "dependencies": {
+                "sax": ">=0.6.0",
+                "xmlbuilder": "~11.0.0"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/xmlbuilder": {
+            "version": "11.0.1",
+            "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+            "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/xmlchars": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+            "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+            "dev": true
+        },
+        "node_modules/xmlhttprequest-ssl": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
+            "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/xtend": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+            "engines": {
+                "node": ">=0.4"
+            }
+        },
+        "node_modules/y18n": {
+            "version": "5.0.8",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "node_modules/yaml": {
+            "version": "1.10.2",
+            "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+            "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/yargs": {
+            "version": "17.5.1",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
+            "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
+            "dev": true,
+            "dependencies": {
+                "cliui": "^7.0.2",
+                "escalade": "^3.1.1",
+                "get-caller-file": "^2.0.5",
+                "require-directory": "^2.1.1",
+                "string-width": "^4.2.3",
+                "y18n": "^5.0.5",
+                "yargs-parser": "^21.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/yargs-parser": {
+            "version": "20.2.9",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+            "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/yargs/node_modules/yargs-parser": {
+            "version": "21.0.1",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
+            "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==",
+            "dev": true,
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/yauzl": {
+            "version": "2.10.0",
+            "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+            "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+            "dev": true,
+            "dependencies": {
+                "buffer-crc32": "~0.2.3",
+                "fd-slicer": "~1.1.0"
+            }
+        },
+        "node_modules/yeast": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+            "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg=="
+        },
+        "node_modules/yocto-queue": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+            "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/yup": {
+            "version": "0.32.9",
+            "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz",
+            "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==",
+            "dependencies": {
+                "@babel/runtime": "^7.10.5",
+                "@types/lodash": "^4.14.165",
+                "lodash": "^4.17.20",
+                "lodash-es": "^4.17.15",
+                "nanoclone": "^0.2.1",
+                "property-expr": "^2.0.4",
+                "toposort": "^2.0.2"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        }
+    },
     "dependencies": {
         "@actions/github": {
             "version": "5.0.3",
@@ -3052,6 +19333,7 @@
             "version": "6.12.6",
             "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
             "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+            "devOptional": true,
             "requires": {
                 "fast-deep-equal": "^3.1.1",
                 "fast-json-stable-stringify": "^2.0.0",
@@ -4190,7 +20472,8 @@
         "core-util-is": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+            "devOptional": true
         },
         "cors": {
             "version": "2.8.5",
@@ -4808,55 +21091,6 @@
                 "esbuild-windows-arm64": "0.14.48"
             }
         },
-        "esbuild-android-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz",
-            "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-android-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz",
-            "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-darwin-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz",
-            "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-darwin-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz",
-            "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-freebsd-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz",
-            "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-freebsd-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz",
-            "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-linux-32": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz",
-            "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==",
-            "dev": true,
-            "optional": true
-        },
         "esbuild-linux-64": {
             "version": "0.14.48",
             "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz",
@@ -4864,90 +21098,6 @@
             "dev": true,
             "optional": true
         },
-        "esbuild-linux-arm": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz",
-            "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-linux-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz",
-            "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-linux-mips64le": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz",
-            "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-linux-ppc64le": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz",
-            "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-linux-riscv64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz",
-            "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-linux-s390x": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz",
-            "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-netbsd-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz",
-            "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-openbsd-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz",
-            "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-sunos-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz",
-            "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-windows-32": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz",
-            "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-windows-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz",
-            "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==",
-            "dev": true,
-            "optional": true
-        },
-        "esbuild-windows-arm64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz",
-            "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==",
-            "dev": true,
-            "optional": true
-        },
         "escalade": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -5473,7 +21623,8 @@
         "fast-deep-equal": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+            "devOptional": true
         },
         "fast-glob": {
             "version": "3.2.11",
@@ -5502,7 +21653,8 @@
         "fast-json-stable-stringify": {
             "version": "2.1.0",
             "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+            "devOptional": true
         },
         "fast-levenshtein": {
             "version": "2.0.6",
@@ -5854,13 +22006,6 @@
             "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
             "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
         },
-        "fsevents": {
-            "version": "2.3.2",
-            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-            "dev": true,
-            "optional": true
-        },
         "function-bind": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -6059,7 +22204,8 @@
         "graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-            "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
+            "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+            "devOptional": true
         },
         "har-schema": {
             "version": "2.0.0",
@@ -6590,7 +22736,8 @@
         "is-typedarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-            "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+            "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+            "devOptional": true
         },
         "is-valid-path": {
             "version": "0.1.1",
@@ -6625,7 +22772,8 @@
         "isarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+            "devOptional": true
         },
         "isemail": {
             "version": "3.2.0",
@@ -6638,7 +22786,8 @@
         "isexe": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+            "devOptional": true
         },
         "isobject": {
             "version": "3.0.1",
@@ -8267,7 +24416,8 @@
         "json-schema-traverse": {
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+            "devOptional": true
         },
         "json-stable-stringify-without-jsonify": {
             "version": "1.0.1",
@@ -9091,6 +25241,15 @@
                         "lru-cache": "^6.0.0"
                     }
                 },
+                "string_decoder": {
+                    "version": "1.1.1",
+                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+                    "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+                    "optional": true,
+                    "requires": {
+                        "safe-buffer": "~5.1.0"
+                    }
+                },
                 "string-width": {
                     "version": "1.0.2",
                     "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
@@ -9102,15 +25261,6 @@
                         "strip-ansi": "^3.0.0"
                     }
                 },
-                "string_decoder": {
-                    "version": "1.1.1",
-                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-                    "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-                    "optional": true,
-                    "requires": {
-                        "safe-buffer": "~5.1.0"
-                    }
-                },
                 "strip-ansi": {
                     "version": "3.0.1",
                     "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
@@ -11013,6 +27163,21 @@
             "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
             "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
         },
+        "string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "requires": {
+                "safe-buffer": "~5.2.0"
+            },
+            "dependencies": {
+                "safe-buffer": {
+                    "version": "5.2.1",
+                    "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+                    "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+                }
+            }
+        },
         "string-length": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@@ -11053,21 +27218,6 @@
                 "es-abstract": "^1.19.5"
             }
         },
-        "string_decoder": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-            "requires": {
-                "safe-buffer": "~5.2.0"
-            },
-            "dependencies": {
-                "safe-buffer": {
-                    "version": "5.2.1",
-                    "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-                    "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-                }
-            }
-        },
         "strip-ansi": {
             "version": "6.0.1",
             "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -11707,6 +27857,7 @@
             "version": "4.4.1",
             "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
             "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+            "devOptional": true,
             "requires": {
                 "punycode": "^2.1.0"
             }
@@ -11968,10 +28119,10 @@
             "integrity": "sha512-RyVaOhSem0v4v645zAkdi1mgZjuD3KMQr11KrEZGFupoHzV2qn/sBpEDvplR9i57YnRxZ3KDnKqw/1rx2CkOZA==",
             "dev": true,
             "requires": {
-                "@vue/runtime-core": "^3.2.37",
-                "@vue/runtime-dom": "^3.2.37",
+                "@vue/runtime-core": "latest",
+                "@vue/runtime-dom": "latest",
                 "csstype": "3.0.10",
-                "lodash": "^4.17.21",
+                "lodash": "latest",
                 "nanoid": "3.1.31"
             },
             "dependencies": {
@@ -12264,6 +28415,7 @@
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
             "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+            "devOptional": true,
             "requires": {
                 "isexe": "^2.0.0"
             }

From e0cdc3e7c57ffe43b649e825fce80e20bd8c598a Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 29 Aug 2022 22:06:47 +0800
Subject: [PATCH 099/803] Update dockerfile for pr-test

---
 docker/dockerfile | 30 ++++++++++++++++++++++++++++++
 package.json      |  1 +
 2 files changed, 31 insertions(+)

diff --git a/docker/dockerfile b/docker/dockerfile
index a9984351..117c0f12 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -24,6 +24,36 @@ CMD ["node", "server/server.js"]
 FROM release AS nightly
 RUN npm run mark-as-nightly
 
+# Build an image for testing pr
+FROM louislam/uptime-kuma:base-debian AS pr-test
+
+WORKDIR /app
+
+ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
+
+## Install GitHub CLI
+RUN apt update \
+    && apt --yes --no-install-recommends install curl \
+    && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
+    && chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
+    && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
+    && apt update \
+    && apt install gh -y
+
+## Empty the directory, because we have to clone the Git repo.
+RUN rm -rf ./* && chown node /app
+
+USER node
+
+RUN git clone https://github.com/louislam/uptime-kuma.git .
+RUN npm ci
+
+EXPOSE 3000 3001
+VOLUME ["/app/data"]
+HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
+ENTRYPOINT ["/usr/bin/dumb-init", "--", "extra/entrypoint.sh"]
+CMD ["npm", "run", "dev"]
+
 
 # Upload the artifact to Github
 FROM louislam/uptime-kuma:base-debian AS upload-artifact
diff --git a/package.json b/package.json
index 981ca191..df93281a 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
         "build-docker-nightly": "npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
         "build-docker-nightly-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push",
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
+        "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
         "setup": "git checkout 1.17.1 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",

From c2472bf75080024e8042567acbdc00d0941dc856 Mon Sep 17 00:00:00 2001
From: Filippo Romani <filipporomanionline@gmail.com>
Date: Tue, 30 Aug 2022 19:11:54 +0200
Subject: [PATCH 100/803] Italian language fixes

A few grammar fixes made from an italian.
Some phrases were not really correct.
---
 src/languages/it-IT.js | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js
index f5276183..cd065597 100644
--- a/src/languages/it-IT.js
+++ b/src/languages/it-IT.js
@@ -7,25 +7,25 @@ export default {
     upsideDownModeDescription: "Se il servizio risulta raggiungibile viene marcato come \"DOWN\".",
     maxRedirectDescription: "Numero massimo di redirezionamenti consentito. Per disabilitare, impostare \"0\".",
     acceptedStatusCodesDescription: "Elenco di codici di stato HTTP che sono considerati validi.",
-    passwordNotMatchMsg: "La password non coincide.",
+    passwordNotMatchMsg: "La password non corrisponde.",
     notificationDescription: "Assegnare la notifica a uno o più oggetti monitorati per metterla in funzione.",
     keywordDescription: "Cerca la parola chiave nella risposta in html o JSON e fai distinzione tra maiuscole e minuscole",
     pauseDashboardHome: "In Pausa",
-    deleteMonitorMsg: "Si è certi di voler eliminare questo oggetto monitorato?",
-    deleteNotificationMsg: "Si è certi di voler eliminare questa notifica per tutti gli oggetti monitorati?",
-    resolverserverDescription: "Cloudflare è il server predefinito, è possibile cambiare il server DNS.",
+    deleteMonitorMsg: "Sei sicuro di voler eliminare questo oggetto monitorato?",
+    deleteNotificationMsg: "Sei sicuro di voler eliminare questa notifica per tutti gli oggetti monitorati?",
+    resolverserverDescription: "Cloudflare è il server predefinito ma è possibile cambiare il server DNS.",
     rrtypeDescription: "Scegliere il tipo di RR che si vuole monitorare",
-    pauseMonitorMsg: "Si è certi di voler mettere in pausa?",
+    pauseMonitorMsg: "Sei sicuro di voler mettere in pausa?",
     enableDefaultNotificationDescription: "Per ogni nuovo monitor questa notifica sarà abilitata di default. È comunque possibile disabilitare la notifica singolarmente.",
-    clearEventsMsg: "Si è certi di voler eliminare tutti gli eventi per questo servizio?",
-    clearHeartbeatsMsg: "Si è certi di voler eliminare tutti gli intervalli di controllo per questo servizio?",
-    confirmClearStatisticsMsg: "Si è certi di voler eliminare TUTTE le statistiche?",
+    clearEventsMsg: "Sei sicuro di voler eliminare tutti gli eventi per questo servizio?",
+    clearHeartbeatsMsg: "Sei sicuro di voler eliminare tutti gli intervalli di controllo per questo servizio?",
+    confirmClearStatisticsMsg: "Sei sicuro di voler eliminare TUTTE le statistiche?",
     importHandleDescription: "Selezionare \"Ignora esistenti\" se si vuole ignorare l'importazione dei monitor o delle notifiche con lo stesso nome. \"Sovrascrivi\" rimpiazzerà tutti i monitor e le notifiche presenti con quelli nel backup.",
-    confirmImportMsg: "Si è certi di voler importare il backup? Essere certi di aver selezionato l'opzione corretta di importazione.",
+    confirmImportMsg: "Sei sicuro di voler importare il backup? Controlla di aver selezionato l'opzione corretta di importazione.",
     twoFAVerifyLabel: "Digita il token per verificare che l'autenticazione a due fattori funzioni correttamente:",
     tokenValidSettingsMsg: "Il token è valido! È ora possibile salvare le impostazioni.",
-    confirmEnableTwoFAMsg: "Si è certi di voler abilitare l'autenticazione a due fattori?",
-    confirmDisableTwoFAMsg: "Si è certi di voler disabilitare l'autenticazione a due fattori?",
+    confirmEnableTwoFAMsg: "Sei sicuro di voler abilitare l'autenticazione a due fattori?",
+    confirmDisableTwoFAMsg: "Sei sicuro di voler disabilitare l'autenticazione a due fattori?",
     Settings: "Impostazioni",
     Dashboard: "Dashboard",
     "New Update": "Nuovo aggiornamento disponibile!",

From b890812411a3bdb16e4eee329e08378602757db8 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Thu, 1 Sep 2022 16:36:24 +0430
Subject: [PATCH 101/803] use npm 7

---
 package-lock.json | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6e0996c6..27eb5492 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,7 +5,6 @@
     "requires": true,
     "packages": {
         "": {
-            "name": "uptime-kuma",
             "version": "1.18.0-beta.0",
             "license": "MIT",
             "dependencies": {
@@ -14307,11 +14306,6 @@
                 "safer-buffer": "^2.0.2",
                 "tweetnacl": "~0.14.0"
             },
-            "bin": {
-                "sshpk-conv": "bin/sshpk-conv",
-                "sshpk-sign": "bin/sshpk-sign",
-                "sshpk-verify": "bin/sshpk-verify"
-            },
             "engines": {
                 "node": ">=0.10.0"
             }

From 626accedeec1bc4e9cba841246ccf9afa16da678 Mon Sep 17 00:00:00 2001
From: Muhammed Hussein Karimi <info@karimi.dev>
Date: Thu, 1 Sep 2022 16:47:25 +0430
Subject: [PATCH 102/803] change node version

---
 package-lock.json | 3582 +++++++++++++++++++++++----------------------
 1 file changed, 1842 insertions(+), 1740 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 27eb5492..b4310950 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,6 +5,7 @@
     "requires": true,
     "packages": {
         "": {
+            "name": "uptime-kuma",
             "version": "1.18.0-beta.0",
             "license": "MIT",
             "dependencies": {
@@ -173,9 +174,9 @@
             }
         },
         "node_modules/@azure/core-auth": {
-            "version": "1.3.2",
-            "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.3.2.tgz",
-            "integrity": "sha512-7CU6DmCHIZp5ZPiZ9r3J17lTKMmYsm/zGvNkjArQwPkrLlZ1TZ+EUYfGgh2X31OLMVAQCTJZW4cXHJi02EbJnA==",
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz",
+            "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
                 "tslib": "^2.2.0"
@@ -185,13 +186,13 @@
             }
         },
         "node_modules/@azure/core-client": {
-            "version": "1.6.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.0.tgz",
-            "integrity": "sha512-YhSf4cb61ApSjItscp9XoaLq8KRnacPDAhmjAZSMnn/gs6FhFbZNfOBOErG2dDj7JRknVtCmJ5mLmfR2sLa11A==",
+            "version": "1.6.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.1.tgz",
+            "integrity": "sha512-mZ1MSKhZBYoV8GAWceA+PEJFWV2VpdNSpxxcj1wjIAOi00ykRuIQChT99xlQGZWLY3/NApWhSImlFwsmCEs4vA==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
-                "@azure/core-rest-pipeline": "^1.5.0",
+                "@azure/core-auth": "^1.4.0",
+                "@azure/core-rest-pipeline": "^1.9.1",
                 "@azure/core-tracing": "^1.0.0",
                 "@azure/core-util": "^1.0.0",
                 "@azure/logger": "^1.0.0",
@@ -201,48 +202,25 @@
                 "node": ">=12.0.0"
             }
         },
-        "node_modules/@azure/core-client/node_modules/@azure/core-tracing": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
-            "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
+        "node_modules/@azure/core-http-compat": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-1.3.0.tgz",
+            "integrity": "sha512-ZN9avruqbQ5TxopzG3ih3KRy52n8OAbitX3fnZT5go4hzu0J+KVPSzkL+Wt3hpJpdG8WIfg1sBD1tWkgUdEpBA==",
             "dependencies": {
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
-        "node_modules/@azure/core-http": {
-            "version": "2.2.5",
-            "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-2.2.5.tgz",
-            "integrity": "sha512-kctMqSQ6zfnlFpuYzfUKadeTyOQYbIQ+3Rj7dzVC3Dk1dOnHroTwR9hLYKX8/n85iJpkyaksaXpuh5L7GJRYuQ==",
-            "dependencies": {
-                "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
-                "@azure/core-tracing": "1.0.0-preview.13",
-                "@azure/logger": "^1.0.0",
-                "@types/node-fetch": "^2.5.0",
-                "@types/tunnel": "^0.0.3",
-                "form-data": "^4.0.0",
-                "node-fetch": "^2.6.7",
-                "process": "^0.11.10",
-                "tough-cookie": "^4.0.0",
-                "tslib": "^2.2.0",
-                "tunnel": "^0.0.6",
-                "uuid": "^8.3.0",
-                "xml2js": "^0.4.19"
+                "@azure/abort-controller": "^1.0.4",
+                "@azure/core-client": "^1.3.0",
+                "@azure/core-rest-pipeline": "^1.3.0"
             },
             "engines": {
                 "node": ">=12.0.0"
             }
         },
         "node_modules/@azure/core-lro": {
-            "version": "2.2.4",
-            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.4.tgz",
-            "integrity": "sha512-e1I2v2CZM0mQo8+RSix0x091Av493e4bnT22ds2fcQGslTHzM2oTbswkB65nP4iEpCxBrFxOSDPKExmTmjCVtQ==",
+            "version": "2.2.5",
+            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.5.tgz",
+            "integrity": "sha512-/7LKDHNd2Q6gGCrg7zV4va/N90w250pE4vaQUfFt+hTd/dyycgJWCqQ6EljQr8hrIFiH93C8Apk97tsnl7Czkg==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
-                "@azure/core-tracing": "1.0.0-preview.13",
                 "@azure/logger": "^1.0.0",
                 "tslib": "^2.2.0"
             },
@@ -262,17 +240,17 @@
             }
         },
         "node_modules/@azure/core-rest-pipeline": {
-            "version": "1.9.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.0.tgz",
-            "integrity": "sha512-uvM3mY+Vegk0F2r4Eh0yPdsXTUyafTQkeX0USnz1Eyangxm2Bib0w0wkJVZW8fpks7Lcv0ztIdCFTrN7H8uptg==",
+            "version": "1.9.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.1.tgz",
+            "integrity": "sha512-OVtt0LP0K5ktsKTmh6/695P0mPFmngjdCJPr4V0uvrkhHTkARSQ3VYRnxRc0LC9g3mHcH90C+8a6iF7ApMAZKg==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
+                "@azure/core-auth": "^1.4.0",
                 "@azure/core-tracing": "^1.0.1",
                 "@azure/core-util": "^1.0.0",
                 "@azure/logger": "^1.0.0",
                 "form-data": "^4.0.0",
-                "http-proxy-agent": "^4.0.1",
+                "http-proxy-agent": "^5.0.0",
                 "https-proxy-agent": "^5.0.0",
                 "tslib": "^2.2.0",
                 "uuid": "^8.3.0"
@@ -281,7 +259,7 @@
                 "node": ">=12.0.0"
             }
         },
-        "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": {
+        "node_modules/@azure/core-tracing": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
             "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
@@ -292,39 +270,6 @@
                 "node": ">=12.0.0"
             }
         },
-        "node_modules/@azure/core-rest-pipeline/node_modules/@tootallnate/once": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-            "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-            "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-            "dependencies": {
-                "@tootallnate/once": "1",
-                "agent-base": "6",
-                "debug": "4"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/@azure/core-tracing": {
-            "version": "1.0.0-preview.13",
-            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
-            "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
-            "dependencies": {
-                "@opentelemetry/api": "^1.0.1",
-                "tslib": "^2.2.0"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            }
-        },
         "node_modules/@azure/core-util": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.0.0.tgz",
@@ -337,20 +282,20 @@
             }
         },
         "node_modules/@azure/identity": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.0.5.tgz",
-            "integrity": "sha512-fSQTu9dS0P+lw1Gfct6t7TuRYybULL/E3wJjXLc1xr6RQXpmenJspi0lKzq3XFjLP5MzBlToKY3ZkYoAXPz1zA==",
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.1.0.tgz",
+            "integrity": "sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.3.0",
                 "@azure/core-client": "^1.4.0",
                 "@azure/core-rest-pipeline": "^1.1.0",
-                "@azure/core-tracing": "1.0.0-preview.13",
-                "@azure/core-util": "^1.0.0-beta.1",
+                "@azure/core-tracing": "^1.0.0",
+                "@azure/core-util": "^1.0.0",
                 "@azure/logger": "^1.0.0",
-                "@azure/msal-browser": "^2.16.0",
-                "@azure/msal-common": "^4.5.1",
-                "@azure/msal-node": "^1.3.0",
+                "@azure/msal-browser": "^2.26.0",
+                "@azure/msal-common": "^7.0.0",
+                "@azure/msal-node": "^1.10.0",
                 "events": "^3.0.0",
                 "jws": "^4.0.0",
                 "open": "^8.0.0",
@@ -382,15 +327,19 @@
             }
         },
         "node_modules/@azure/keyvault-keys": {
-            "version": "4.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.4.0.tgz",
-            "integrity": "sha512-W9sPZebXYa3aar7BGIA+fAsq/sy1nf2TZAETbkv7DRawzVLrWv8QoVVceqNHjy3cigT4HNxXjaPYCI49ez5CUA==",
+            "version": "4.5.0",
+            "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.5.0.tgz",
+            "integrity": "sha512-F+0qpUrIxp1/uuQ3sFsAf4rTXErFwmuVLoXlD2e3ebrONrmYjqszwmlN4tBqAag1W9wGuZTL0jE8X8b+LB83ow==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
-                "@azure/core-http": "^2.0.0",
+                "@azure/core-auth": "^1.3.0",
+                "@azure/core-client": "^1.5.0",
+                "@azure/core-http-compat": "^1.3.0",
                 "@azure/core-lro": "^2.2.0",
                 "@azure/core-paging": "^1.1.1",
-                "@azure/core-tracing": "1.0.0-preview.13",
+                "@azure/core-rest-pipeline": "^1.8.0",
+                "@azure/core-tracing": "^1.0.0",
+                "@azure/core-util": "^1.0.0",
                 "@azure/logger": "^1.0.0",
                 "tslib": "^2.2.0"
             },
@@ -410,41 +359,30 @@
             }
         },
         "node_modules/@azure/msal-browser": {
-            "version": "2.26.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.26.0.tgz",
-            "integrity": "sha512-mSyZORSgeMEWz5Wo5alUqjxP/HKt/XcViZqc3dnKFM9347qYPIWsAlzHkEmmafNr1VGUo7MeqB0emZCOQrl04w==",
+            "version": "2.28.1",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.28.1.tgz",
+            "integrity": "sha512-5uAfwpNGBSRzBGTSS+5l4Zw6msPV7bEmq99n0U3n/N++iTcha+nIp1QujxTPuOLHmTNCeySdMx9qzGqWuy22zQ==",
             "dependencies": {
-                "@azure/msal-common": "^7.0.0"
+                "@azure/msal-common": "^7.3.0"
             },
             "engines": {
                 "node": ">=0.8.0"
             }
         },
-        "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz",
-            "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA==",
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
         "node_modules/@azure/msal-common": {
-            "version": "4.5.1",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.5.1.tgz",
-            "integrity": "sha512-/i5dXM+QAtO+6atYd5oHGBAx48EGSISkXNXViheliOQe+SIFMDo3gSq3lL54W0suOSAsVPws3XnTaIHlla0PIQ==",
-            "dependencies": {
-                "debug": "^4.1.1"
-            },
+            "version": "7.3.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.3.0.tgz",
+            "integrity": "sha512-revxB3z+QLjwAtU1d04nC1voFr+i3LfqTpUfgrWZVqKh/sSgg0mZZUvw4vKVWB57qtL95sul06G+TfdFZny1Xw==",
             "engines": {
                 "node": ">=0.8.0"
             }
         },
         "node_modules/@azure/msal-node": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.10.0.tgz",
-            "integrity": "sha512-oSv9mg199FpRTe+fZ3o9NDYpKShOHqeceaNcCHJcKUaAaCojAbfbxD1Cvsti8BEsLKE6x0HcnjilnM1MKmZekA==",
+            "version": "1.12.1",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.12.1.tgz",
+            "integrity": "sha512-m909lX9C8Ty01DBxbjr4KfAKWibohgRvY7hrdDo13U1ztlH+0Nbt7cPF1vrWonW/CRT4H4xtUa4LCNmivghggw==",
             "dependencies": {
-                "@azure/msal-common": "^7.0.0",
+                "@azure/msal-common": "^7.3.0",
                 "jsonwebtoken": "^8.5.1",
                 "uuid": "^8.3.0"
             },
@@ -452,14 +390,6 @@
                 "node": "10 || 12 || 14 || 16 || 18"
             }
         },
-        "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
-            "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz",
-            "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA==",
-            "engines": {
-                "node": ">=0.8.0"
-            }
-        },
         "node_modules/@babel/code-frame": {
             "version": "7.18.6",
             "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -473,30 +403,30 @@
             }
         },
         "node_modules/@babel/compat-data": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz",
-            "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz",
+            "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/core": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz",
-            "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz",
+            "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==",
             "dev": true,
             "dependencies": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.18.6",
-                "@babel/helpers": "^7.18.6",
-                "@babel/parser": "^7.18.6",
-                "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6",
+                "@babel/generator": "^7.18.13",
+                "@babel/helper-compilation-targets": "^7.18.9",
+                "@babel/helper-module-transforms": "^7.18.9",
+                "@babel/helpers": "^7.18.9",
+                "@babel/parser": "^7.18.13",
+                "@babel/template": "^7.18.10",
+                "@babel/traverse": "^7.18.13",
+                "@babel/types": "^7.18.13",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -530,12 +460,12 @@
             }
         },
         "node_modules/@babel/generator": {
-            "version": "7.18.7",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz",
-            "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz",
+            "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.18.7",
+                "@babel/types": "^7.18.13",
                 "@jridgewell/gen-mapping": "^0.3.2",
                 "jsesc": "^2.5.1"
             },
@@ -556,25 +486,25 @@
             }
         },
         "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz",
-            "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz",
+            "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-explode-assignable-expression": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/types": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-compilation-targets": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz",
-            "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz",
+            "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.18.6",
+                "@babel/compat-data": "^7.18.8",
                 "@babel/helper-validator-option": "^7.18.6",
                 "browserslist": "^4.20.2",
                 "semver": "^6.3.0"
@@ -587,17 +517,17 @@
             }
         },
         "node_modules/@babel/helper-create-class-features-plugin": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz",
-            "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz",
+            "integrity": "sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/helper-member-expression-to-functions": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-function-name": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.18.9",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.18.6",
+                "@babel/helper-replace-supers": "^7.18.9",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             },
             "engines": {
@@ -624,15 +554,13 @@
             }
         },
         "node_modules/@babel/helper-define-polyfill-provider": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
-            "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz",
+            "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-compilation-targets": "^7.13.0",
-                "@babel/helper-module-imports": "^7.12.13",
-                "@babel/helper-plugin-utils": "^7.13.0",
-                "@babel/traverse": "^7.13.0",
+                "@babel/helper-compilation-targets": "^7.17.7",
+                "@babel/helper-plugin-utils": "^7.16.7",
                 "debug": "^4.1.1",
                 "lodash.debounce": "^4.0.8",
                 "resolve": "^1.14.2",
@@ -643,9 +571,9 @@
             }
         },
         "node_modules/@babel/helper-environment-visitor": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz",
-            "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+            "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
@@ -664,13 +592,13 @@
             }
         },
         "node_modules/@babel/helper-function-name": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz",
-            "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz",
+            "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==",
             "dev": true,
             "dependencies": {
                 "@babel/template": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/types": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -689,12 +617,12 @@
             }
         },
         "node_modules/@babel/helper-member-expression-to-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz",
-            "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
+            "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.18.6"
+                "@babel/types": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -713,19 +641,19 @@
             }
         },
         "node_modules/@babel/helper-module-transforms": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz",
-            "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz",
+            "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-environment-visitor": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-module-imports": "^7.18.6",
                 "@babel/helper-simple-access": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "@babel/helper-validator-identifier": "^7.18.6",
                 "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/traverse": "^7.18.9",
+                "@babel/types": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -744,24 +672,24 @@
             }
         },
         "node_modules/@babel/helper-plugin-utils": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz",
-            "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz",
+            "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-remap-async-to-generator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz",
-            "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
+            "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-wrap-function": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-wrap-function": "^7.18.9",
+                "@babel/types": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -771,16 +699,16 @@
             }
         },
         "node_modules/@babel/helper-replace-supers": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz",
-            "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz",
+            "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-member-expression-to-functions": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.18.9",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/traverse": "^7.18.9",
+                "@babel/types": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -799,12 +727,12 @@
             }
         },
         "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz",
-            "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz",
+            "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.18.6"
+                "@babel/types": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -822,6 +750,15 @@
                 "node": ">=6.9.0"
             }
         },
+        "node_modules/@babel/helper-string-parser": {
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz",
+            "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/@babel/helper-validator-identifier": {
             "version": "7.18.6",
             "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
@@ -841,29 +778,29 @@
             }
         },
         "node_modules/@babel/helper-wrap-function": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz",
-            "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==",
+            "version": "7.18.11",
+            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz",
+            "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/helper-function-name": "^7.18.9",
+                "@babel/template": "^7.18.10",
+                "@babel/traverse": "^7.18.11",
+                "@babel/types": "^7.18.10"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helpers": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz",
-            "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz",
+            "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==",
             "dev": true,
             "dependencies": {
                 "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/traverse": "^7.18.9",
+                "@babel/types": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -884,9 +821,9 @@
             }
         },
         "node_modules/@babel/parser": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz",
-            "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz",
+            "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==",
             "dev": true,
             "bin": {
                 "parser": "bin/babel-parser.js"
@@ -911,14 +848,14 @@
             }
         },
         "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz",
-            "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz",
+            "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
+                "@babel/plugin-proposal-optional-chaining": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -928,14 +865,14 @@
             }
         },
         "node_modules/@babel/plugin-proposal-async-generator-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz",
-            "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==",
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz",
+            "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-remap-async-to-generator": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-remap-async-to-generator": "^7.18.9",
                 "@babel/plugin-syntax-async-generators": "^7.8.4"
             },
             "engines": {
@@ -995,12 +932,12 @@
             }
         },
         "node_modules/@babel/plugin-proposal-export-namespace-from": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz",
-            "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz",
+            "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
             },
             "engines": {
@@ -1027,12 +964,12 @@
             }
         },
         "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz",
-            "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
+            "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
             },
             "engines": {
@@ -1075,16 +1012,16 @@
             }
         },
         "node_modules/@babel/plugin-proposal-object-rest-spread": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz",
-            "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz",
+            "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/compat-data": "^7.18.8",
+                "@babel/helper-compilation-targets": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.18.6"
+                "@babel/plugin-transform-parameters": "^7.18.8"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1110,13 +1047,13 @@
             }
         },
         "node_modules/@babel/plugin-proposal-optional-chaining": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz",
-            "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
+            "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
                 "@babel/plugin-syntax-optional-chaining": "^7.8.3"
             },
             "engines": {
@@ -1455,12 +1392,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-block-scoping": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz",
-            "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz",
+            "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1470,17 +1407,17 @@
             }
         },
         "node_modules/@babel/plugin-transform-classes": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz",
-            "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz",
+            "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-function-name": "^7.18.9",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-replace-supers": "^7.18.9",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "globals": "^11.1.0"
             },
@@ -1492,12 +1429,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-computed-properties": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz",
-            "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
+            "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1507,12 +1444,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-destructuring": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz",
-            "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz",
+            "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1538,12 +1475,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-duplicate-keys": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz",
-            "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz",
+            "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1569,9 +1506,9 @@
             }
         },
         "node_modules/@babel/plugin-transform-for-of": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz",
-            "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==",
+            "version": "7.18.8",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz",
+            "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-plugin-utils": "^7.18.6"
@@ -1584,14 +1521,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-function-name": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz",
-            "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz",
+            "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-compilation-targets": "^7.18.9",
+                "@babel/helper-function-name": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1601,12 +1538,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-literals": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz",
-            "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
+            "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1666,14 +1603,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-systemjs": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz",
-            "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz",
+            "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-hoist-variables": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-module-transforms": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/helper-validator-identifier": "^7.18.6",
                 "babel-plugin-dynamic-import-node": "^2.3.3"
             },
@@ -1748,9 +1685,9 @@
             }
         },
         "node_modules/@babel/plugin-transform-parameters": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz",
-            "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==",
+            "version": "7.18.8",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz",
+            "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-plugin-utils": "^7.18.6"
@@ -1824,13 +1761,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-spread": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz",
-            "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz",
+            "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1855,12 +1792,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-template-literals": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz",
-            "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
+            "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1870,12 +1807,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-typeof-symbol": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz",
-            "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
+            "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1885,12 +1822,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-unicode-escapes": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz",
-            "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==",
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz",
+            "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1916,29 +1853,29 @@
             }
         },
         "node_modules/@babel/preset-env": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz",
-            "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==",
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz",
+            "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/compat-data": "^7.18.8",
+                "@babel/helper-compilation-targets": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/helper-validator-option": "^7.18.6",
                 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
-                "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6",
-                "@babel/plugin-proposal-async-generator-functions": "^7.18.6",
+                "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
+                "@babel/plugin-proposal-async-generator-functions": "^7.18.10",
                 "@babel/plugin-proposal-class-properties": "^7.18.6",
                 "@babel/plugin-proposal-class-static-block": "^7.18.6",
                 "@babel/plugin-proposal-dynamic-import": "^7.18.6",
-                "@babel/plugin-proposal-export-namespace-from": "^7.18.6",
+                "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
                 "@babel/plugin-proposal-json-strings": "^7.18.6",
-                "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6",
+                "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
                 "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
                 "@babel/plugin-proposal-numeric-separator": "^7.18.6",
-                "@babel/plugin-proposal-object-rest-spread": "^7.18.6",
+                "@babel/plugin-proposal-object-rest-spread": "^7.18.9",
                 "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.6",
+                "@babel/plugin-proposal-optional-chaining": "^7.18.9",
                 "@babel/plugin-proposal-private-methods": "^7.18.6",
                 "@babel/plugin-proposal-private-property-in-object": "^7.18.6",
                 "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
@@ -1960,40 +1897,40 @@
                 "@babel/plugin-transform-arrow-functions": "^7.18.6",
                 "@babel/plugin-transform-async-to-generator": "^7.18.6",
                 "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
-                "@babel/plugin-transform-block-scoping": "^7.18.6",
-                "@babel/plugin-transform-classes": "^7.18.6",
-                "@babel/plugin-transform-computed-properties": "^7.18.6",
-                "@babel/plugin-transform-destructuring": "^7.18.6",
+                "@babel/plugin-transform-block-scoping": "^7.18.9",
+                "@babel/plugin-transform-classes": "^7.18.9",
+                "@babel/plugin-transform-computed-properties": "^7.18.9",
+                "@babel/plugin-transform-destructuring": "^7.18.9",
                 "@babel/plugin-transform-dotall-regex": "^7.18.6",
-                "@babel/plugin-transform-duplicate-keys": "^7.18.6",
+                "@babel/plugin-transform-duplicate-keys": "^7.18.9",
                 "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
-                "@babel/plugin-transform-for-of": "^7.18.6",
-                "@babel/plugin-transform-function-name": "^7.18.6",
-                "@babel/plugin-transform-literals": "^7.18.6",
+                "@babel/plugin-transform-for-of": "^7.18.8",
+                "@babel/plugin-transform-function-name": "^7.18.9",
+                "@babel/plugin-transform-literals": "^7.18.9",
                 "@babel/plugin-transform-member-expression-literals": "^7.18.6",
                 "@babel/plugin-transform-modules-amd": "^7.18.6",
                 "@babel/plugin-transform-modules-commonjs": "^7.18.6",
-                "@babel/plugin-transform-modules-systemjs": "^7.18.6",
+                "@babel/plugin-transform-modules-systemjs": "^7.18.9",
                 "@babel/plugin-transform-modules-umd": "^7.18.6",
                 "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6",
                 "@babel/plugin-transform-new-target": "^7.18.6",
                 "@babel/plugin-transform-object-super": "^7.18.6",
-                "@babel/plugin-transform-parameters": "^7.18.6",
+                "@babel/plugin-transform-parameters": "^7.18.8",
                 "@babel/plugin-transform-property-literals": "^7.18.6",
                 "@babel/plugin-transform-regenerator": "^7.18.6",
                 "@babel/plugin-transform-reserved-words": "^7.18.6",
                 "@babel/plugin-transform-shorthand-properties": "^7.18.6",
-                "@babel/plugin-transform-spread": "^7.18.6",
+                "@babel/plugin-transform-spread": "^7.18.9",
                 "@babel/plugin-transform-sticky-regex": "^7.18.6",
-                "@babel/plugin-transform-template-literals": "^7.18.6",
-                "@babel/plugin-transform-typeof-symbol": "^7.18.6",
-                "@babel/plugin-transform-unicode-escapes": "^7.18.6",
+                "@babel/plugin-transform-template-literals": "^7.18.9",
+                "@babel/plugin-transform-typeof-symbol": "^7.18.9",
+                "@babel/plugin-transform-unicode-escapes": "^7.18.10",
                 "@babel/plugin-transform-unicode-regex": "^7.18.6",
                 "@babel/preset-modules": "^0.1.5",
-                "@babel/types": "^7.18.6",
-                "babel-plugin-polyfill-corejs2": "^0.3.1",
-                "babel-plugin-polyfill-corejs3": "^0.5.2",
-                "babel-plugin-polyfill-regenerator": "^0.3.1",
+                "@babel/types": "^7.18.10",
+                "babel-plugin-polyfill-corejs2": "^0.3.2",
+                "babel-plugin-polyfill-corejs3": "^0.5.3",
+                "babel-plugin-polyfill-regenerator": "^0.4.0",
                 "core-js-compat": "^3.22.1",
                 "semver": "^6.3.0"
             },
@@ -2021,9 +1958,9 @@
             }
         },
         "node_modules/@babel/runtime": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz",
-            "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz",
+            "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==",
             "dependencies": {
                 "regenerator-runtime": "^0.13.4"
             },
@@ -2032,42 +1969,42 @@
             }
         },
         "node_modules/@babel/standalone": {
-            "version": "7.18.7",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.18.7.tgz",
-            "integrity": "sha512-AIOn3ON0KhYqAbvmkT11vi/YAlhrPn6RSPQb8Hl3PUZoE1yFwut5fQ9/oJ4Dvf2SGmO41pF7xmwP2W1RT0uJCA==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.18.13.tgz",
+            "integrity": "sha512-5hjvvFkaXyfQri+s4CAZtx6FTKclfTNd2QN2RwgzCVJhnYYgKh4YFBCnNJSxurzvpSKD2NmpCkoWAkMc+j9y+g==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/template": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz",
-            "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==",
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
+            "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/parser": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/parser": "^7.18.10",
+                "@babel/types": "^7.18.10"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/traverse": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz",
-            "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz",
+            "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
+                "@babel/generator": "^7.18.13",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-function-name": "^7.18.9",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.18.6",
-                "@babel/types": "^7.18.6",
+                "@babel/parser": "^7.18.13",
+                "@babel/types": "^7.18.13",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             },
@@ -2076,11 +2013,12 @@
             }
         },
         "node_modules/@babel/types": {
-            "version": "7.18.7",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz",
-            "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
+            "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
             "dev": true,
             "dependencies": {
+                "@babel/helper-string-parser": "^7.18.10",
                 "@babel/helper-validator-identifier": "^7.18.6",
                 "to-fast-properties": "^2.0.0"
             },
@@ -2102,15 +2040,31 @@
                 "node": ">= 10"
             }
         },
+        "node_modules/@esbuild/linux-loong64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
+            "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
+            "cpu": [
+                "loong64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/@eslint/eslintrc": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
-            "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz",
+            "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==",
             "dev": true,
             "dependencies": {
                 "ajv": "^6.12.4",
                 "debug": "^4.3.2",
-                "espree": "^9.3.2",
+                "espree": "^9.4.0",
                 "globals": "^13.15.0",
                 "ignore": "^5.2.0",
                 "import-fresh": "^3.2.1",
@@ -2120,12 +2074,15 @@
             },
             "engines": {
                 "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
             }
         },
         "node_modules/@eslint/eslintrc/node_modules/globals": {
-            "version": "13.15.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
-            "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+            "version": "13.17.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+            "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -2999,9 +2956,9 @@
             }
         },
         "node_modules/@jridgewell/resolve-uri": {
-            "version": "3.0.8",
-            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
-            "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+            "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
             "dev": true,
             "engines": {
                 "node": ">=6.0.0"
@@ -3023,9 +2980,9 @@
             "dev": true
         },
         "node_modules/@jridgewell/trace-mapping": {
-            "version": "0.3.14",
-            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
-            "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
+            "version": "0.3.15",
+            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
+            "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
             "dev": true,
             "dependencies": {
                 "@jridgewell/resolve-uri": "^3.0.3",
@@ -3033,9 +2990,9 @@
             }
         },
         "node_modules/@js-joda/core": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.2.0.tgz",
-            "integrity": "sha512-0OriPYIaMLB3XiLQMe0BXKVIqeriTn3H7JMOzTsHEtt7Zqq+TetCu97KnAhU3ckiQZKBxfZshft+H1OC4D1lXw=="
+            "version": "5.3.1",
+            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.3.1.tgz",
+            "integrity": "sha512-iHHyIRLEfXLqBN+BkyH8u8imMYr4ihRbFDEk8toqTwUECETVQFCTh2U59Sw2oMoRVaS3XRIb7pyCulltq2jFVA=="
         },
         "node_modules/@louislam/sqlite3": {
             "version": "15.0.6",
@@ -3174,30 +3131,30 @@
             }
         },
         "node_modules/@octokit/openapi-types": {
-            "version": "12.6.1",
-            "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.6.1.tgz",
-            "integrity": "sha512-zirGmxkSQuZIQYsOLtCxNoKi7ByKLwGhrGhHz6YUI7h/c8xOES9bEoHOeq4z81uNf2AGAqNfPW9i3GOrpgKoJQ==",
+            "version": "12.11.0",
+            "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+            "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==",
             "dev": true
         },
         "node_modules/@octokit/plugin-paginate-rest": {
-            "version": "2.21.1",
-            "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.1.tgz",
-            "integrity": "sha512-NVNTK63yoTFp07GqISWK+uDfGH1CAPhQXS7LzsJBvaK5W+UlvG549pLZC55FK0FqANVl6q/9ra3SR5c97xF/sw==",
+            "version": "2.21.3",
+            "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
+            "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
             "dev": true,
             "dependencies": {
-                "@octokit/types": "^6.38.2"
+                "@octokit/types": "^6.40.0"
             },
             "peerDependencies": {
                 "@octokit/core": ">=2"
             }
         },
         "node_modules/@octokit/plugin-rest-endpoint-methods": {
-            "version": "5.16.1",
-            "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.1.tgz",
-            "integrity": "sha512-RMHD3aJZvOpjR2fGzD2an6eU7LG8MsknhUHvP+wRUnKdbt7eDdhTMLQsZ4xsHZcLNsxPO/K4DDIZPhI2s571Ag==",
+            "version": "5.16.2",
+            "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
+            "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
             "dev": true,
             "dependencies": {
-                "@octokit/types": "^6.38.2",
+                "@octokit/types": "^6.39.0",
                 "deprecation": "^2.3.1"
             },
             "peerDependencies": {
@@ -3230,20 +3187,12 @@
             }
         },
         "node_modules/@octokit/types": {
-            "version": "6.38.2",
-            "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.38.2.tgz",
-            "integrity": "sha512-McFegRKQ1qaMSnDt8ScJzv26IFR1zhXveYaqx8wF7QEgiy4GHMrnX4xbP+Yl+kAr12DCplL3WJq4xkeD1VMfmw==",
+            "version": "6.41.0",
+            "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+            "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
             "dev": true,
             "dependencies": {
-                "@octokit/openapi-types": "^12.6.1"
-            }
-        },
-        "node_modules/@opentelemetry/api": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.1.0.tgz",
-            "integrity": "sha512-hf+3bwuBwtXsugA2ULBc95qxrOqP2pOekLz34BJhcAKawt94vfeNyUKpYc0lZQ/3sCP6LqRa7UAdHA7i5UODzQ==",
-            "engines": {
-                "node": ">=8.0.0"
+                "@octokit/openapi-types": "^12.11.0"
             }
         },
         "node_modules/@popperjs/core": {
@@ -3354,9 +3303,9 @@
             }
         },
         "node_modules/@types/babel__traverse": {
-            "version": "7.17.1",
-            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz",
-            "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==",
+            "version": "7.18.1",
+            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.1.tgz",
+            "integrity": "sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==",
             "dev": true,
             "dependencies": {
                 "@babel/types": "^7.3.0"
@@ -3372,9 +3321,9 @@
             }
         },
         "node_modules/@types/bootstrap": {
-            "version": "5.1.12",
-            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.12.tgz",
-            "integrity": "sha512-pSS5BGEgepwzdbsBGswBWFmgrnYpp7c4UfuYe1FJWwkrcjm/JVwfG4gBkOYtd92Otd3RdJK0ByBWMkBROfLEPw==",
+            "version": "5.1.13",
+            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.13.tgz",
+            "integrity": "sha512-1hIIOgfkMlyQCQz/3ae53xr6ZN2d6EDj/n3G+Sh/LBsBUVigyDmnCbLwsaXJJ1GBGlkjgfXVoyIvEPowQw25xQ==",
             "dev": true,
             "dependencies": {
                 "@popperjs/core": "^2.9.2"
@@ -3439,9 +3388,9 @@
             }
         },
         "node_modules/@types/express-serve-static-core": {
-            "version": "4.17.29",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz",
-            "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==",
+            "version": "4.17.30",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz",
+            "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==",
             "dependencies": {
                 "@types/node": "*",
                 "@types/qs": "*",
@@ -3497,9 +3446,9 @@
             "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
         },
         "node_modules/@types/koa": {
-            "version": "2.13.4",
-            "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
-            "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
+            "version": "2.13.5",
+            "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz",
+            "integrity": "sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==",
             "dependencies": {
                 "@types/accepts": "*",
                 "@types/content-disposition": "*",
@@ -3520,14 +3469,14 @@
             }
         },
         "node_modules/@types/lodash": {
-            "version": "4.14.182",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
-            "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
+            "version": "4.14.184",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz",
+            "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q=="
         },
         "node_modules/@types/mime": {
-            "version": "1.3.2",
-            "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
-            "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
+            "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
         },
         "node_modules/@types/minimist": {
             "version": "1.2.2",
@@ -3536,31 +3485,9 @@
             "dev": true
         },
         "node_modules/@types/node": {
-            "version": "18.0.1",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz",
-            "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg=="
-        },
-        "node_modules/@types/node-fetch": {
-            "version": "2.6.2",
-            "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
-            "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
-            "dependencies": {
-                "@types/node": "*",
-                "form-data": "^3.0.0"
-            }
-        },
-        "node_modules/@types/node-fetch/node_modules/form-data": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-            "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-            "dependencies": {
-                "asynckit": "^0.4.0",
-                "combined-stream": "^1.0.8",
-                "mime-types": "^2.1.12"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
+            "version": "18.7.14",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz",
+            "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA=="
         },
         "node_modules/@types/normalize-package-data": {
             "version": "2.4.1",
@@ -3575,9 +3502,9 @@
             "dev": true
         },
         "node_modules/@types/prettier": {
-            "version": "2.6.3",
-            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz",
-            "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==",
+            "version": "2.7.0",
+            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz",
+            "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==",
             "dev": true
         },
         "node_modules/@types/qs": {
@@ -3591,11 +3518,11 @@
             "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
         },
         "node_modules/@types/serve-static": {
-            "version": "1.13.10",
-            "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
-            "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz",
+            "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==",
             "dependencies": {
-                "@types/mime": "^1",
+                "@types/mime": "*",
                 "@types/node": "*"
             }
         },
@@ -3605,14 +3532,6 @@
             "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
             "dev": true
         },
-        "node_modules/@types/tunnel": {
-            "version": "0.0.3",
-            "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz",
-            "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==",
-            "dependencies": {
-                "@types/node": "*"
-            }
-        },
         "node_modules/@types/yargs": {
             "version": "16.0.4",
             "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
@@ -3658,9 +3577,9 @@
             }
         },
         "node_modules/@vitejs/plugin-legacy/node_modules/core-js": {
-            "version": "3.23.3",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.3.tgz",
-            "integrity": "sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q==",
+            "version": "3.25.0",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz",
+            "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==",
             "dev": true,
             "hasInstallScript": true,
             "funding": {
@@ -3669,9 +3588,9 @@
             }
         },
         "node_modules/@vitejs/plugin-vue": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.3.tgz",
-            "integrity": "sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==",
+            "version": "2.3.4",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz",
+            "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==",
             "dev": true,
             "engines": {
                 "node": ">=12.0.0"
@@ -3682,39 +3601,39 @@
             }
         },
         "node_modules/@vue/compiler-core": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
-            "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.38.tgz",
+            "integrity": "sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.37",
+                "@vue/shared": "3.2.38",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "node_modules/@vue/compiler-dom": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz",
-            "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.38.tgz",
+            "integrity": "sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==",
             "dev": true,
             "dependencies": {
-                "@vue/compiler-core": "3.2.37",
-                "@vue/shared": "3.2.37"
+                "@vue/compiler-core": "3.2.38",
+                "@vue/shared": "3.2.38"
             }
         },
         "node_modules/@vue/compiler-sfc": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz",
-            "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.38.tgz",
+            "integrity": "sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.37",
-                "@vue/compiler-dom": "3.2.37",
-                "@vue/compiler-ssr": "3.2.37",
-                "@vue/reactivity-transform": "3.2.37",
-                "@vue/shared": "3.2.37",
+                "@vue/compiler-core": "3.2.38",
+                "@vue/compiler-dom": "3.2.38",
+                "@vue/compiler-ssr": "3.2.38",
+                "@vue/reactivity-transform": "3.2.38",
+                "@vue/shared": "3.2.38",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7",
                 "postcss": "^8.1.10",
@@ -3731,19 +3650,19 @@
             }
         },
         "node_modules/@vue/compiler-ssr": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz",
-            "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.38.tgz",
+            "integrity": "sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==",
             "dev": true,
             "dependencies": {
-                "@vue/compiler-dom": "3.2.37",
-                "@vue/shared": "3.2.37"
+                "@vue/compiler-dom": "3.2.38",
+                "@vue/shared": "3.2.38"
             }
         },
         "node_modules/@vue/devtools-api": {
-            "version": "6.2.0",
-            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.0.tgz",
-            "integrity": "sha512-pF1G4wky+hkifDiZSWn8xfuLOJI1ZXtuambpBEYaf7Xaf6zC/pM29rvAGpd3qaGXnr4BAXU1Pxz/VfvBGwexGA==",
+            "version": "6.2.1",
+            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz",
+            "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==",
             "dev": true
         },
         "node_modules/@vue/reactivity": {
@@ -3756,14 +3675,14 @@
             }
         },
         "node_modules/@vue/reactivity-transform": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz",
-            "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.38.tgz",
+            "integrity": "sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.37",
-                "@vue/shared": "3.2.37",
+                "@vue/compiler-core": "3.2.38",
+                "@vue/shared": "3.2.38",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             }
@@ -3868,9 +3787,9 @@
             "dev": true
         },
         "node_modules/@vue/shared": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz",
-            "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz",
+            "integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==",
             "dev": true
         },
         "node_modules/abab": {
@@ -3897,9 +3816,9 @@
             }
         },
         "node_modules/acorn": {
-            "version": "8.7.1",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
-            "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+            "version": "8.8.0",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+            "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
             "dev": true,
             "bin": {
                 "acorn": "bin/acorn"
@@ -4370,13 +4289,13 @@
             }
         },
         "node_modules/babel-plugin-polyfill-corejs2": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
-            "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz",
+            "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.13.11",
-                "@babel/helper-define-polyfill-provider": "^0.3.1",
+                "@babel/compat-data": "^7.17.7",
+                "@babel/helper-define-polyfill-provider": "^0.3.2",
                 "semver": "^6.1.1"
             },
             "peerDependencies": {
@@ -4384,12 +4303,12 @@
             }
         },
         "node_modules/babel-plugin-polyfill-corejs3": {
-            "version": "0.5.2",
-            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
-            "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
+            "version": "0.5.3",
+            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz",
+            "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-define-polyfill-provider": "^0.3.1",
+                "@babel/helper-define-polyfill-provider": "^0.3.2",
                 "core-js-compat": "^3.21.0"
             },
             "peerDependencies": {
@@ -4397,12 +4316,12 @@
             }
         },
         "node_modules/babel-plugin-polyfill-regenerator": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
-            "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz",
+            "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-define-polyfill-provider": "^0.3.1"
+                "@babel/helper-define-polyfill-provider": "^0.3.2"
             },
             "peerDependencies": {
                 "@babel/core": "^7.0.0-0"
@@ -4714,9 +4633,9 @@
             "dev": true
         },
         "node_modules/browserslist": {
-            "version": "4.21.1",
-            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz",
-            "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==",
+            "version": "4.21.3",
+            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
+            "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
             "dev": true,
             "funding": [
                 {
@@ -4729,10 +4648,10 @@
                 }
             ],
             "dependencies": {
-                "caniuse-lite": "^1.0.30001359",
-                "electron-to-chromium": "^1.4.172",
-                "node-releases": "^2.0.5",
-                "update-browserslist-db": "^1.0.4"
+                "caniuse-lite": "^1.0.30001370",
+                "electron-to-chromium": "^1.4.202",
+                "node-releases": "^2.0.6",
+                "update-browserslist-db": "^1.0.5"
             },
             "bin": {
                 "browserslist": "cli.js"
@@ -4874,9 +4793,9 @@
             }
         },
         "node_modules/caniuse-lite": {
-            "version": "1.0.30001362",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001362.tgz",
-            "integrity": "sha512-PFykHuC7BQTzCGQFaV6wD8IDRM3HpI83BXr99nNJhoOyDufgSuKlt0QVlWYt5ZJtEYFeuNVF5QY3kJcu8hVFjQ==",
+            "version": "1.0.30001387",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001387.tgz",
+            "integrity": "sha512-fKDH0F1KOJvR+mWSOvhj8lVRr/Q/mc5u5nabU2vi1/sgvlSqEsE8dOq0Hy/BqVbDkCYQPRRHB1WRjW6PGB/7PA==",
             "dev": true,
             "funding": [
                 {
@@ -4948,9 +4867,9 @@
             }
         },
         "node_modules/check-password-strength": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/check-password-strength/-/check-password-strength-2.0.5.tgz",
-            "integrity": "sha512-b61T/+4OIGWSMRxJUsYOY44Cf9w7orIt2OQmF/WgH16qbJKIT1jG3XHx3jP+o090eH7rq13DRleKgXCiROBzMQ=="
+            "version": "2.0.7",
+            "resolved": "https://registry.npmjs.org/check-password-strength/-/check-password-strength-2.0.7.tgz",
+            "integrity": "sha512-VyklBkB6dOKnCIh63zdVr7QKVMN9/npwUqNAXxWrz8HabVZH/n/d+lyNm1O/vbXFJlT/Hytb5ouYKYGkoeZirQ=="
         },
         "node_modules/cheerio": {
             "version": "1.0.0-rc.12",
@@ -5152,9 +5071,9 @@
             }
         },
         "node_modules/colord": {
-            "version": "2.9.2",
-            "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
-            "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==",
+            "version": "2.9.3",
+            "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+            "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
             "dev": true
         },
         "node_modules/colorette": {
@@ -5284,9 +5203,9 @@
             }
         },
         "node_modules/concurrently": {
-            "version": "7.2.2",
-            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.2.tgz",
-            "integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==",
+            "version": "7.3.0",
+            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.3.0.tgz",
+            "integrity": "sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==",
             "dev": true,
             "dependencies": {
                 "chalk": "^4.1.0",
@@ -5469,12 +5388,12 @@
             }
         },
         "node_modules/core-js-compat": {
-            "version": "3.23.3",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz",
-            "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==",
+            "version": "3.25.0",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz",
+            "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==",
             "dev": true,
             "dependencies": {
-                "browserslist": "^4.21.0",
+                "browserslist": "^4.21.3",
                 "semver": "7.0.0"
             },
             "funding": {
@@ -5712,9 +5631,9 @@
             }
         },
         "node_modules/date-fns": {
-            "version": "2.28.0",
-            "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
-            "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
+            "version": "2.29.2",
+            "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.2.tgz",
+            "integrity": "sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==",
             "dev": true,
             "engines": {
                 "node": ">=0.11"
@@ -5725,9 +5644,9 @@
             }
         },
         "node_modules/dayjs": {
-            "version": "1.11.3",
-            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz",
-            "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A=="
+            "version": "1.11.5",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz",
+            "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA=="
         },
         "node_modules/debug": {
             "version": "4.3.4",
@@ -5782,9 +5701,9 @@
             }
         },
         "node_modules/decimal.js": {
-            "version": "10.3.1",
-            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
-            "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
+            "version": "10.4.0",
+            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz",
+            "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==",
             "dev": true
         },
         "node_modules/dedent": {
@@ -5919,9 +5838,9 @@
             }
         },
         "node_modules/dns2": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/dns2/-/dns2-2.0.2.tgz",
-            "integrity": "sha512-XYBUv6/CyGAGkeyXOeHhjKscHm2b70oSl1as1C2qLVWvZKJLdzxv/LsyyEJeMdbkCS48OyajfBhP6NpO55gQww==",
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/dns2/-/dns2-2.0.5.tgz",
+            "integrity": "sha512-dznYrQU+Txcz++klGLBY9YR3WLOGHTy2vAKAqF+yYw1KaKFm5f5Y4jbbFEvohJf8YtZ0J2SzZlZx2k6LV4zJqQ==",
             "dev": true
         },
         "node_modules/doctrine": {
@@ -6043,9 +5962,9 @@
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
         },
         "node_modules/electron-to-chromium": {
-            "version": "1.4.177",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.177.tgz",
-            "integrity": "sha512-FYPir3NSBEGexSZUEeht81oVhHfLFl6mhUKSkjHN/iB/TwEIt/WHQrqVGfTLN5gQxwJCQkIJBe05eOXjI7omgg==",
+            "version": "1.4.239",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.239.tgz",
+            "integrity": "sha512-XbhfzxPIFzMjJm17T7yUGZEyYh5XuUjrA/FQ7JUy2bEd4qQ7MvFTaKpZ6zXZog1cfVttESo2Lx0ctnf7eQOaAQ==",
             "dev": true
         },
         "node_modules/emittery": {
@@ -6172,9 +6091,9 @@
             }
         },
         "node_modules/entities": {
-            "version": "4.3.1",
-            "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
-            "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
+            "version": "4.4.0",
+            "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+            "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
             "engines": {
                 "node": ">=0.12"
             },
@@ -6273,9 +6192,9 @@
             }
         },
         "node_modules/esbuild": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz",
-            "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==",
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
+            "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
             "dev": true,
             "hasInstallScript": true,
             "bin": {
@@ -6285,32 +6204,145 @@
                 "node": ">=12"
             },
             "optionalDependencies": {
-                "esbuild-android-64": "0.14.48",
-                "esbuild-android-arm64": "0.14.48",
-                "esbuild-darwin-64": "0.14.48",
-                "esbuild-darwin-arm64": "0.14.48",
-                "esbuild-freebsd-64": "0.14.48",
-                "esbuild-freebsd-arm64": "0.14.48",
-                "esbuild-linux-32": "0.14.48",
-                "esbuild-linux-64": "0.14.48",
-                "esbuild-linux-arm": "0.14.48",
-                "esbuild-linux-arm64": "0.14.48",
-                "esbuild-linux-mips64le": "0.14.48",
-                "esbuild-linux-ppc64le": "0.14.48",
-                "esbuild-linux-riscv64": "0.14.48",
-                "esbuild-linux-s390x": "0.14.48",
-                "esbuild-netbsd-64": "0.14.48",
-                "esbuild-openbsd-64": "0.14.48",
-                "esbuild-sunos-64": "0.14.48",
-                "esbuild-windows-32": "0.14.48",
-                "esbuild-windows-64": "0.14.48",
-                "esbuild-windows-arm64": "0.14.48"
+                "@esbuild/linux-loong64": "0.14.54",
+                "esbuild-android-64": "0.14.54",
+                "esbuild-android-arm64": "0.14.54",
+                "esbuild-darwin-64": "0.14.54",
+                "esbuild-darwin-arm64": "0.14.54",
+                "esbuild-freebsd-64": "0.14.54",
+                "esbuild-freebsd-arm64": "0.14.54",
+                "esbuild-linux-32": "0.14.54",
+                "esbuild-linux-64": "0.14.54",
+                "esbuild-linux-arm": "0.14.54",
+                "esbuild-linux-arm64": "0.14.54",
+                "esbuild-linux-mips64le": "0.14.54",
+                "esbuild-linux-ppc64le": "0.14.54",
+                "esbuild-linux-riscv64": "0.14.54",
+                "esbuild-linux-s390x": "0.14.54",
+                "esbuild-netbsd-64": "0.14.54",
+                "esbuild-openbsd-64": "0.14.54",
+                "esbuild-sunos-64": "0.14.54",
+                "esbuild-windows-32": "0.14.54",
+                "esbuild-windows-64": "0.14.54",
+                "esbuild-windows-arm64": "0.14.54"
+            }
+        },
+        "node_modules/esbuild-android-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
+            "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-android-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
+            "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-darwin-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
+            "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-darwin-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
+            "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-freebsd-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
+            "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-freebsd-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
+            "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-32": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
+            "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
             }
         },
         "node_modules/esbuild-linux-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz",
-            "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==",
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
+            "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
             "cpu": [
                 "x64"
             ],
@@ -6323,6 +6355,198 @@
                 "node": ">=12"
             }
         },
+        "node_modules/esbuild-linux-arm": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
+            "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
+            "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-mips64le": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
+            "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
+            "cpu": [
+                "mips64el"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-ppc64le": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
+            "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
+            "cpu": [
+                "ppc64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-riscv64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
+            "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
+            "cpu": [
+                "riscv64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-s390x": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
+            "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
+            "cpu": [
+                "s390x"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-netbsd-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
+            "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "netbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-openbsd-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
+            "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "openbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-sunos-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
+            "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "sunos"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-windows-32": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
+            "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-windows-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
+            "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-windows-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
+            "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/escalade": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -6647,9 +6871,9 @@
             }
         },
         "node_modules/eslint/node_modules/globals": {
-            "version": "13.15.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
-            "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+            "version": "13.17.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+            "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -6703,17 +6927,20 @@
             }
         },
         "node_modules/espree": {
-            "version": "9.3.2",
-            "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
-            "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+            "version": "9.4.0",
+            "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
+            "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
             "dev": true,
             "dependencies": {
-                "acorn": "^8.7.1",
+                "acorn": "^8.8.0",
                 "acorn-jsx": "^5.3.2",
                 "eslint-visitor-keys": "^3.3.0"
             },
             "engines": {
                 "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
             }
         },
         "node_modules/espree/node_modules/eslint-visitor-keys": {
@@ -6892,9 +7119,9 @@
             }
         },
         "node_modules/expect-puppeteer": {
-            "version": "6.1.0",
-            "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-6.1.0.tgz",
-            "integrity": "sha512-5yk64xOe+yTRLeZTg1uuGYmUw5bMsI/YX7Q9tXsovYFBq8bvagJH4XMYLQ7/nU+1dJawLH0KJehuJULD33oU+w==",
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-6.1.1.tgz",
+            "integrity": "sha512-cnQF96qdoEcOD63j5NQMc0RtW9WRMW/WHKXEKsuDQ2tszhVH3qC7zkXXS4D0LTt9qCB3DEExioqylsQXvqPrUw==",
             "dev": true
         },
         "node_modules/express": {
@@ -7082,10 +7309,13 @@
             "dev": true
         },
         "node_modules/fastest-levenshtein": {
-            "version": "1.0.12",
-            "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
-            "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
-            "dev": true
+            "version": "1.0.16",
+            "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+            "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4.9.1"
+            }
         },
         "node_modules/fastfall": {
             "version": "1.5.1",
@@ -7338,9 +7568,9 @@
             }
         },
         "node_modules/flatted": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz",
-            "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
+            "version": "3.2.7",
+            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+            "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
             "dev": true
         },
         "node_modules/follow-redirects": {
@@ -7509,6 +7739,20 @@
             "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
             "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
         },
+        "node_modules/fsevents": {
+            "version": "2.3.2",
+            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+            "dev": true,
+            "hasInstallScript": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+            }
+        },
         "node_modules/function-bind": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -7992,9 +8236,9 @@
             }
         },
         "node_modules/http-graceful-shutdown": {
-            "version": "3.1.7",
-            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.7.tgz",
-            "integrity": "sha512-00tmCsvemcZLfhii3sB7sfoUjvTzhg/WdOzVI7WEt2Vai9h1ybzSoEhJeQIck8gCz8pt/4YMXWPjGZxe+KukTA==",
+            "version": "3.1.8",
+            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.8.tgz",
+            "integrity": "sha512-u1vwhYLrpT2I52poqm04KnKyvUfpRk93BIoWSizZkDJQ2oBAjsYFG8TPlsEkamTOkIVheIYuGeOL1OpzXYUxlA==",
             "dependencies": {
                 "debug": "^4.3.4"
             },
@@ -8212,9 +8456,9 @@
             }
         },
         "node_modules/ip": {
-            "version": "1.1.8",
-            "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
-            "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+            "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
         },
         "node_modules/ipaddr.js": {
             "version": "1.9.1",
@@ -8286,9 +8530,9 @@
             }
         },
         "node_modules/is-core-module": {
-            "version": "2.9.0",
-            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
-            "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+            "version": "2.10.0",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
+            "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
             "dependencies": {
                 "has": "^1.0.3"
             },
@@ -8711,9 +8955,9 @@
             }
         },
         "node_modules/istanbul-reports": {
-            "version": "3.1.4",
-            "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz",
-            "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==",
+            "version": "3.1.5",
+            "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+            "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
             "dev": true,
             "dependencies": {
                 "html-escaper": "^2.0.0",
@@ -9098,9 +9342,9 @@
             }
         },
         "node_modules/jest-dev-server": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.0.3.tgz",
-            "integrity": "sha512-joKPQQWSaBMsNNdCWvwCQvhD6ox4IH+5H5pecbRRSxiRi2BfVCGGOWQ4/MGwV1NJ9z9XEq1qy5JLYTJlv9RVzA==",
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.1.1.tgz",
+            "integrity": "sha512-z5LnaGDvlIkdMv/rppSO4+rq+GyQKf1xI9oiBxf9/2EBeN2hxRaWiMvaLNDnHPZj2PAhBXsycrKslDDoZO2Xtw==",
             "dev": true,
             "dependencies": {
                 "chalk": "^4.1.2",
@@ -9109,7 +9353,7 @@
                 "prompts": "^2.4.2",
                 "spawnd": "^6.0.2",
                 "tree-kill": "^1.2.2",
-                "wait-on": "^6.0.0"
+                "wait-on": "^6.0.1"
             }
         },
         "node_modules/jest-dev-server/node_modules/ansi-styles": {
@@ -9401,14 +9645,14 @@
             }
         },
         "node_modules/jest-environment-puppeteer": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-6.0.3.tgz",
-            "integrity": "sha512-oZE/W8swhDSZpZ+Vm1C2JyoKECsvqcFOlaf3/+G0AtizZfGNkRILdi1U7k9MHLOqGEB5sfFWXG0vpJ8bTNP1dQ==",
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-6.1.1.tgz",
+            "integrity": "sha512-Ces37g8Gdj7QaVxszeoXlvmsZxcEJN9EPUdJt8fGMLA+6ARVFKyVmFgP9xVeGyjTvzsXdtIiJdeOKMLMeD8r2A==",
             "dev": true,
             "dependencies": {
                 "chalk": "^4.1.2",
                 "cwd": "^0.10.0",
-                "jest-dev-server": "^6.0.3",
+                "jest-dev-server": "^6.1.1",
                 "jest-environment-node": "^27.4.4",
                 "merge-deep": "^3.0.3"
             }
@@ -10610,22 +10854,25 @@
             }
         },
         "node_modules/joi": {
-            "version": "17.6.0",
-            "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz",
-            "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==",
-            "dev": true,
+            "version": "14.3.1",
+            "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
+            "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
+            "deprecated": "This module has moved and is now available at @hapi/joi. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
             "dependencies": {
-                "@hapi/hoek": "^9.0.0",
-                "@hapi/topo": "^5.0.0",
-                "@sideway/address": "^4.1.3",
-                "@sideway/formula": "^3.0.0",
-                "@sideway/pinpoint": "^2.0.0"
+                "hoek": "6.x.x",
+                "isemail": "3.x.x",
+                "topo": "3.x.x"
             }
         },
+        "node_modules/js-md4": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz",
+            "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
+        },
         "node_modules/js-sdsl": {
-            "version": "2.1.4",
-            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-2.1.4.tgz",
-            "integrity": "sha512-/Ew+CJWHNddr7sjwgxaVeIORIH4AMVC9dy0hPf540ZGMVgS9d3ajwuVdyhDt6/QUvT8ATjR3yuYBKsS79F+H4A=="
+            "version": "4.1.3",
+            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.3.tgz",
+            "integrity": "sha512-p6umEbgMJq1OL+2z6eYFj8/yHlsx+0gX2nNoSqnu0V5KZaFGBaUfvktdbm5BGrlojadQ+Hjir0rdsaTmzoyd5Q=="
         },
         "node_modules/js-tokens": {
             "version": "4.0.0",
@@ -11189,9 +11436,9 @@
             }
         },
         "node_modules/magic-string": {
-            "version": "0.26.2",
-            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz",
-            "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==",
+            "version": "0.26.3",
+            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz",
+            "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
             "dev": true,
             "dependencies": {
                 "sourcemap-codec": "^1.4.8"
@@ -11573,9 +11820,9 @@
             "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
         },
         "node_modules/mssql": {
-            "version": "8.1.2",
-            "resolved": "https://registry.npmjs.org/mssql/-/mssql-8.1.2.tgz",
-            "integrity": "sha512-xkTw3Sp1Jpq2f7CG3rFQn6YK4XZbnL8HfZhaB/KRC/hjDZlJB3pSWYN2Cp/WwxIeA1iUJkdFa6GTfdMY8+DAjg==",
+            "version": "8.1.4",
+            "resolved": "https://registry.npmjs.org/mssql/-/mssql-8.1.4.tgz",
+            "integrity": "sha512-nqkYYehETWVvFLB9zAGJV2kegOsdtLjUnkHA52aFhlE0ZIoOXC3BL8pLERwFicFypM4i3DX1hYeuM726EEIxjQ==",
             "dependencies": {
                 "@tediousjs/connection-string": "^0.3.0",
                 "commander": "^9.1.0",
@@ -11592,9 +11839,9 @@
             }
         },
         "node_modules/mssql/node_modules/commander": {
-            "version": "9.3.0",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz",
-            "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==",
+            "version": "9.4.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
+            "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==",
             "engines": {
                 "node": "^12.20.0 || >=14"
             }
@@ -11861,26 +12108,15 @@
                 "radius": "^1.1.4"
             }
         },
-        "node_modules/node-radius-client/node_modules/joi": {
-            "version": "14.3.1",
-            "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
-            "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
-            "deprecated": "This module has moved and is now available at @hapi/joi. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
-            "dependencies": {
-                "hoek": "6.x.x",
-                "isemail": "3.x.x",
-                "topo": "3.x.x"
-            }
-        },
         "node_modules/node-radius-utils": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/node-radius-utils/-/node-radius-utils-1.2.0.tgz",
             "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
         },
         "node_modules/node-releases": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
-            "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+            "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
             "dev": true
         },
         "node_modules/nodemailer": {
@@ -11993,12 +12229,12 @@
             }
         },
         "node_modules/number-allocator": {
-            "version": "1.0.10",
-            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.10.tgz",
-            "integrity": "sha512-K4AvNGKo9lP6HqsZyfSr9KDaqnwFzW203inhQEOwFrmFaYevpdX4VNwdOLk197aHujzbT//z6pCBrCOUYSM5iw==",
+            "version": "1.0.11",
+            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.11.tgz",
+            "integrity": "sha512-ykOuVG+oGw67qwt0eW0sPaIR+ANtB58QCpVaaGLxt0QekRXDA5Q/eG7sJmFEZpIcSVdjdevmO72Z6mH258y7Hw==",
             "dependencies": {
                 "debug": "^4.3.1",
-                "js-sdsl": "^2.1.2"
+                "js-sdsl": "^4.1.3"
             }
         },
         "node_modules/number-is-nan": {
@@ -12055,13 +12291,13 @@
             }
         },
         "node_modules/object.assign": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-            "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+            "version": "4.1.4",
+            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+            "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
             "dependencies": {
-                "call-bind": "^1.0.0",
-                "define-properties": "^1.1.3",
-                "has-symbols": "^1.0.1",
+                "call-bind": "^1.0.2",
+                "define-properties": "^1.1.4",
+                "has-symbols": "^1.0.3",
                 "object-keys": "^1.1.1"
             },
             "engines": {
@@ -12378,14 +12614,14 @@
             "optional": true
         },
         "node_modules/pg": {
-            "version": "8.7.3",
-            "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
-            "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
+            "version": "8.8.0",
+            "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz",
+            "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==",
             "dependencies": {
                 "buffer-writer": "2.0.0",
                 "packet-reader": "1.0.0",
                 "pg-connection-string": "^2.5.0",
-                "pg-pool": "^3.5.1",
+                "pg-pool": "^3.5.2",
                 "pg-protocol": "^1.5.0",
                 "pg-types": "^2.1.0",
                 "pgpass": "1.x"
@@ -12394,7 +12630,7 @@
                 "node": ">= 8.0.0"
             },
             "peerDependencies": {
-                "pg-native": ">=2.0.0"
+                "pg-native": ">=3.0.1"
             },
             "peerDependenciesMeta": {
                 "pg-native": {
@@ -12416,9 +12652,9 @@
             }
         },
         "node_modules/pg-pool": {
-            "version": "3.5.1",
-            "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
-            "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
+            "version": "3.5.2",
+            "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz",
+            "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==",
             "peerDependencies": {
                 "pg": ">=8.0"
             }
@@ -12516,9 +12752,9 @@
             }
         },
         "node_modules/postcss": {
-            "version": "8.4.14",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
-            "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+            "version": "8.4.16",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
+            "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
             "dev": true,
             "funding": [
                 {
@@ -12540,12 +12776,13 @@
             }
         },
         "node_modules/postcss-html": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.4.1.tgz",
-            "integrity": "sha512-OKihuWxPuBQrQeLNsavP7ytJ9IYNj/ViAXB2v7Qjh56LnfESKrkahKA9si4VfPN8xtz6oqUE6KdL0bTPrHJr6g==",
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.5.0.tgz",
+            "integrity": "sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==",
             "dev": true,
             "dependencies": {
-                "htmlparser2": "^7.1.2",
+                "htmlparser2": "^8.0.0",
+                "js-tokens": "^8.0.0",
                 "postcss": "^8.4.0",
                 "postcss-safe-parser": "^6.0.0"
             },
@@ -12553,88 +12790,11 @@
                 "node": "^12 || >=14"
             }
         },
-        "node_modules/postcss-html/node_modules/dom-serializer": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
-            "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
-            "dev": true,
-            "dependencies": {
-                "domelementtype": "^2.0.1",
-                "domhandler": "^4.2.0",
-                "entities": "^2.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/dom-serializer/node_modules/entities": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-            "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-            "dev": true,
-            "funding": {
-                "url": "https://github.com/fb55/entities?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/domhandler": {
-            "version": "4.3.1",
-            "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
-            "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
-            "dev": true,
-            "dependencies": {
-                "domelementtype": "^2.2.0"
-            },
-            "engines": {
-                "node": ">= 4"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/domhandler?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/domutils": {
-            "version": "2.8.0",
-            "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
-            "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
-            "dev": true,
-            "dependencies": {
-                "dom-serializer": "^1.0.1",
-                "domelementtype": "^2.2.0",
-                "domhandler": "^4.2.0"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/domutils?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/entities": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
-            "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.12"
-            },
-            "funding": {
-                "url": "https://github.com/fb55/entities?sponsor=1"
-            }
-        },
-        "node_modules/postcss-html/node_modules/htmlparser2": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
-            "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
-            "dev": true,
-            "funding": [
-                "https://github.com/fb55/htmlparser2?sponsor=1",
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/fb55"
-                }
-            ],
-            "dependencies": {
-                "domelementtype": "^2.0.1",
-                "domhandler": "^4.2.2",
-                "domutils": "^2.8.0",
-                "entities": "^3.0.1"
-            }
+        "node_modules/postcss-html/node_modules/js-tokens": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.0.tgz",
+            "integrity": "sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==",
+            "dev": true
         },
         "node_modules/postcss-media-query-parser": {
             "version": "0.2.3",
@@ -12785,22 +12945,14 @@
             }
         },
         "node_modules/prismjs": {
-            "version": "1.28.0",
-            "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
-            "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==",
+            "version": "1.29.0",
+            "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+            "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
             "dev": true,
             "engines": {
                 "node": ">=6"
             }
         },
-        "node_modules/process": {
-            "version": "0.11.10",
-            "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-            "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
-            "engines": {
-                "node": ">= 0.6.0"
-            }
-        },
         "node_modules/process-nextick-args": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -12887,9 +13039,10 @@
             "dev": true
         },
         "node_modules/psl": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+            "version": "1.9.0",
+            "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+            "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+            "devOptional": true
         },
         "node_modules/pump": {
             "version": "3.0.0",
@@ -12999,9 +13152,9 @@
             }
         },
         "node_modules/qrcode": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.0.tgz",
-            "integrity": "sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==",
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz",
+            "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==",
             "dev": true,
             "dependencies": {
                 "dijkstrajs": "^1.0.1",
@@ -13126,6 +13279,12 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/querystringify": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+            "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+            "dev": true
+        },
         "node_modules/queue-microtask": {
             "version": "1.2.3",
             "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -13337,9 +13496,9 @@
             }
         },
         "node_modules/redbean-node/node_modules/@types/node": {
-            "version": "14.18.21",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz",
-            "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q=="
+            "version": "14.18.26",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.26.tgz",
+            "integrity": "sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA=="
         },
         "node_modules/redent": {
             "version": "3.0.0",
@@ -13565,6 +13724,12 @@
             "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
             "dev": true
         },
+        "node_modules/requires-port": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+            "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+            "dev": true
+        },
         "node_modules/resolve": {
             "version": "1.22.1",
             "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
@@ -13669,9 +13834,9 @@
             }
         },
         "node_modules/rollup": {
-            "version": "2.75.7",
-            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz",
-            "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==",
+            "version": "2.77.3",
+            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz",
+            "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
             "dev": true,
             "bin": {
                 "rollup": "dist/bin/rollup"
@@ -13684,21 +13849,21 @@
             }
         },
         "node_modules/rollup-plugin-visualizer": {
-            "version": "5.6.0",
-            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.6.0.tgz",
-            "integrity": "sha512-CKcc8GTUZjC+LsMytU8ocRr/cGZIfMR7+mdy4YnlyetlmIl/dM8BMnOEpD4JPIGt+ZVW7Db9ZtSsbgyeBH3uTA==",
+            "version": "5.8.0",
+            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.0.tgz",
+            "integrity": "sha512-pY6j/7qHz5I9rB7d/bQoA5gX+2FbV3MBG055wrsFxDn550bgl0FNViRj6wDHh85PMswv+JVdZjhnMBzz/hdAHA==",
             "dev": true,
             "dependencies": {
-                "nanoid": "^3.1.32",
+                "nanoid": "^3.3.4",
                 "open": "^8.4.0",
                 "source-map": "^0.7.3",
-                "yargs": "^17.3.1"
+                "yargs": "^17.5.1"
             },
             "bin": {
                 "rollup-plugin-visualizer": "dist/bin/cli.js"
             },
             "engines": {
-                "node": ">=12"
+                "node": ">=14"
             },
             "peerDependencies": {
                 "rollup": "^2.0.0"
@@ -13813,9 +13978,9 @@
             }
         },
         "node_modules/rxjs": {
-            "version": "7.5.5",
-            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
-            "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
+            "version": "7.5.6",
+            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz",
+            "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==",
             "dev": true,
             "dependencies": {
                 "tslib": "^2.1.0"
@@ -13851,11 +14016,6 @@
                 "node": ">=8.9.0"
             }
         },
-        "node_modules/sax": {
-            "version": "1.2.4",
-            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
-        },
         "node_modules/saxes": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
@@ -14154,11 +14314,11 @@
             }
         },
         "node_modules/socks": {
-            "version": "2.6.2",
-            "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
-            "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
+            "version": "2.7.0",
+            "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz",
+            "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==",
             "dependencies": {
-                "ip": "^1.1.5",
+                "ip": "^2.0.0",
                 "smart-buffer": "^4.2.0"
             },
             "engines": {
@@ -14263,9 +14423,9 @@
             }
         },
         "node_modules/spdx-license-ids": {
-            "version": "3.0.11",
-            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
-            "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
+            "version": "3.0.12",
+            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
+            "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
             "dev": true
         },
         "node_modules/specificity": {
@@ -14306,6 +14466,11 @@
                 "safer-buffer": "^2.0.2",
                 "tweetnacl": "~0.14.0"
             },
+            "bin": {
+                "sshpk-conv": "bin/sshpk-conv",
+                "sshpk-sign": "bin/sshpk-sign",
+                "sshpk-verify": "bin/sshpk-verify"
+            },
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -14634,16 +14799,16 @@
             }
         },
         "node_modules/stylelint/node_modules/write-file-atomic": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz",
-            "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==",
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+            "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
             "dev": true,
             "dependencies": {
                 "imurmurhash": "^0.1.4",
                 "signal-exit": "^3.0.7"
             },
             "engines": {
-                "node": "^12.13.0 || ^14.15.0 || >=16"
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
             }
         },
         "node_modules/supports-color": {
@@ -14716,9 +14881,9 @@
             "dev": true
         },
         "node_modules/systemjs": {
-            "version": "6.12.1",
-            "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.12.1.tgz",
-            "integrity": "sha512-hqTN6kW+pN6/qro6G9OZ7ceDQOcYno020zBQKpZQLsJhYTDMCMNfXi/Y8duF5iW+4WWZr42ry0MMkcRGpbwG2A==",
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.12.6.tgz",
+            "integrity": "sha512-SawLiWya8/uNR4p12OggSYZ35tP4U4QTpfV57DdZEOPr6+J6zlLSeeEpMmzYTEoBAsMhctdEE+SWJUDYX4EaKw==",
             "dev": true
         },
         "node_modules/table": {
@@ -14831,9 +14996,9 @@
             }
         },
         "node_modules/tedious": {
-            "version": "14.6.1",
-            "resolved": "https://registry.npmjs.org/tedious/-/tedious-14.6.1.tgz",
-            "integrity": "sha512-45Xsvsjm6j41JVXXwKAseAGM/jD6ty8CcSdcxPT4B2dqZ00tIkYsGlI7n8DU8xDoatnvyT4BIYKZZCe3eE16PA==",
+            "version": "14.7.0",
+            "resolved": "https://registry.npmjs.org/tedious/-/tedious-14.7.0.tgz",
+            "integrity": "sha512-d3qlmZcvZyt7akyPHiOdR+knfzObWZH3mW+gouQTSb7YTSwtpHuYHcvsQabfbY7oOvgbs51xRb7CwOahWK/t9w==",
             "dependencies": {
                 "@azure/identity": "^2.0.4",
                 "@azure/keyvault-keys": "^4.4.0",
@@ -14842,6 +15007,7 @@
                 "bl": "^5.0.0",
                 "es-aggregate-error": "^1.0.8",
                 "iconv-lite": "^0.6.3",
+                "js-md4": "^0.3.2",
                 "jsbi": "^4.3.0",
                 "native-duplexpair": "^1.0.0",
                 "node-abort-controller": "^3.0.1",
@@ -15005,13 +15171,15 @@
             "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
         },
         "node_modules/tough-cookie": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
-            "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
+            "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
+            "dev": true,
             "dependencies": {
                 "psl": "^1.1.33",
                 "punycode": "^2.1.1",
-                "universalify": "^0.1.2"
+                "universalify": "^0.2.0",
+                "url-parse": "^1.5.3"
             },
             "engines": {
                 "node": ">=6"
@@ -15056,6 +15224,7 @@
             "version": "0.0.6",
             "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
             "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+            "dev": true,
             "engines": {
                 "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
             }
@@ -15221,9 +15390,10 @@
             "dev": true
         },
         "node_modules/universalify": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-            "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+            "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+            "dev": true,
             "engines": {
                 "node": ">= 4.0.0"
             }
@@ -15237,9 +15407,9 @@
             }
         },
         "node_modules/update-browserslist-db": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz",
-            "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==",
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
+            "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
             "dev": true,
             "funding": [
                 {
@@ -15271,6 +15441,16 @@
                 "punycode": "^2.1.0"
             }
         },
+        "node_modules/url-parse": {
+            "version": "1.5.10",
+            "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+            "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+            "dev": true,
+            "dependencies": {
+                "querystringify": "^2.1.1",
+                "requires-port": "^1.0.0"
+            }
+        },
         "node_modules/util-deprecate": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -15371,15 +15551,15 @@
             }
         },
         "node_modules/vite": {
-            "version": "2.9.13",
-            "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.13.tgz",
-            "integrity": "sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==",
+            "version": "2.9.15",
+            "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz",
+            "integrity": "sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==",
             "dev": true,
             "dependencies": {
                 "esbuild": "^0.14.27",
                 "postcss": "^8.4.13",
                 "resolve": "^1.22.0",
-                "rollup": "^2.59.0"
+                "rollup": ">=2.59.0 <2.78.0"
             },
             "bin": {
                 "vite": "bin/vite.js"
@@ -15521,54 +15701,12 @@
                 "vue": ">= 3"
             }
         },
-        "node_modules/vue-chart-3/node_modules/@vue/reactivity": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz",
-            "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==",
-            "dev": true,
-            "dependencies": {
-                "@vue/shared": "3.2.37"
-            }
-        },
-        "node_modules/vue-chart-3/node_modules/@vue/runtime-core": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz",
-            "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==",
-            "dev": true,
-            "dependencies": {
-                "@vue/reactivity": "3.2.37",
-                "@vue/shared": "3.2.37"
-            }
-        },
-        "node_modules/vue-chart-3/node_modules/@vue/runtime-dom": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz",
-            "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==",
-            "dev": true,
-            "dependencies": {
-                "@vue/runtime-core": "3.2.37",
-                "@vue/shared": "3.2.37",
-                "csstype": "^2.6.8"
-            }
-        },
-        "node_modules/vue-chart-3/node_modules/@vue/runtime-dom/node_modules/csstype": {
-            "version": "2.6.20",
-            "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
-            "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
-            "dev": true
-        },
         "node_modules/vue-chart-3/node_modules/csstype": {
             "version": "3.0.10",
             "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
             "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==",
             "dev": true
         },
-        "node_modules/vue-chart-3/node_modules/lodash": {
-            "version": "4.17.21",
-            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-            "dev": true
-        },
         "node_modules/vue-chart-3/node_modules/nanoid": {
             "version": "3.1.31",
             "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz",
@@ -15927,6 +16065,19 @@
                 "follow-redirects": "^1.14.7"
             }
         },
+        "node_modules/wait-on/node_modules/joi": {
+            "version": "17.6.0",
+            "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz",
+            "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==",
+            "dev": true,
+            "dependencies": {
+                "@hapi/hoek": "^9.0.0",
+                "@hapi/topo": "^5.0.0",
+                "@sideway/address": "^4.1.3",
+                "@sideway/formula": "^3.0.0",
+                "@sideway/pinpoint": "^2.0.0"
+            }
+        },
         "node_modules/walker": {
             "version": "1.0.8",
             "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -16107,9 +16258,9 @@
             }
         },
         "node_modules/ws": {
-            "version": "7.5.8",
-            "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz",
-            "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==",
+            "version": "7.5.9",
+            "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+            "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
             "engines": {
                 "node": ">=8.3.0"
             },
@@ -16132,26 +16283,6 @@
             "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
             "dev": true
         },
-        "node_modules/xml2js": {
-            "version": "0.4.23",
-            "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
-            "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
-            "dependencies": {
-                "sax": ">=0.6.0",
-                "xmlbuilder": "~11.0.0"
-            },
-            "engines": {
-                "node": ">=4.0.0"
-            }
-        },
-        "node_modules/xmlbuilder": {
-            "version": "11.0.1",
-            "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-            "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
-            "engines": {
-                "node": ">=4.0"
-            }
-        },
         "node_modules/xmlchars": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -16225,9 +16356,9 @@
             }
         },
         "node_modules/yargs/node_modules/yargs-parser": {
-            "version": "21.0.1",
-            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
-            "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==",
+            "version": "21.1.1",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+            "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
             "dev": true,
             "engines": {
                 "node": ">=12"
@@ -16331,66 +16462,44 @@
             }
         },
         "@azure/core-auth": {
-            "version": "1.3.2",
-            "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.3.2.tgz",
-            "integrity": "sha512-7CU6DmCHIZp5ZPiZ9r3J17lTKMmYsm/zGvNkjArQwPkrLlZ1TZ+EUYfGgh2X31OLMVAQCTJZW4cXHJi02EbJnA==",
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz",
+            "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
                 "tslib": "^2.2.0"
             }
         },
         "@azure/core-client": {
-            "version": "1.6.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.0.tgz",
-            "integrity": "sha512-YhSf4cb61ApSjItscp9XoaLq8KRnacPDAhmjAZSMnn/gs6FhFbZNfOBOErG2dDj7JRknVtCmJ5mLmfR2sLa11A==",
+            "version": "1.6.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.1.tgz",
+            "integrity": "sha512-mZ1MSKhZBYoV8GAWceA+PEJFWV2VpdNSpxxcj1wjIAOi00ykRuIQChT99xlQGZWLY3/NApWhSImlFwsmCEs4vA==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
-                "@azure/core-rest-pipeline": "^1.5.0",
+                "@azure/core-auth": "^1.4.0",
+                "@azure/core-rest-pipeline": "^1.9.1",
                 "@azure/core-tracing": "^1.0.0",
                 "@azure/core-util": "^1.0.0",
                 "@azure/logger": "^1.0.0",
                 "tslib": "^2.2.0"
-            },
-            "dependencies": {
-                "@azure/core-tracing": {
-                    "version": "1.0.1",
-                    "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
-                    "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
-                    "requires": {
-                        "tslib": "^2.2.0"
-                    }
-                }
             }
         },
-        "@azure/core-http": {
-            "version": "2.2.5",
-            "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-2.2.5.tgz",
-            "integrity": "sha512-kctMqSQ6zfnlFpuYzfUKadeTyOQYbIQ+3Rj7dzVC3Dk1dOnHroTwR9hLYKX8/n85iJpkyaksaXpuh5L7GJRYuQ==",
+        "@azure/core-http-compat": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-1.3.0.tgz",
+            "integrity": "sha512-ZN9avruqbQ5TxopzG3ih3KRy52n8OAbitX3fnZT5go4hzu0J+KVPSzkL+Wt3hpJpdG8WIfg1sBD1tWkgUdEpBA==",
             "requires": {
-                "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
-                "@azure/core-tracing": "1.0.0-preview.13",
-                "@azure/logger": "^1.0.0",
-                "@types/node-fetch": "^2.5.0",
-                "@types/tunnel": "^0.0.3",
-                "form-data": "^4.0.0",
-                "node-fetch": "^2.6.7",
-                "process": "^0.11.10",
-                "tough-cookie": "^4.0.0",
-                "tslib": "^2.2.0",
-                "tunnel": "^0.0.6",
-                "uuid": "^8.3.0",
-                "xml2js": "^0.4.19"
+                "@azure/abort-controller": "^1.0.4",
+                "@azure/core-client": "^1.3.0",
+                "@azure/core-rest-pipeline": "^1.3.0"
             }
         },
         "@azure/core-lro": {
-            "version": "2.2.4",
-            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.4.tgz",
-            "integrity": "sha512-e1I2v2CZM0mQo8+RSix0x091Av493e4bnT22ds2fcQGslTHzM2oTbswkB65nP4iEpCxBrFxOSDPKExmTmjCVtQ==",
+            "version": "2.2.5",
+            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.5.tgz",
+            "integrity": "sha512-/7LKDHNd2Q6gGCrg7zV4va/N90w250pE4vaQUfFt+hTd/dyycgJWCqQ6EljQr8hrIFiH93C8Apk97tsnl7Czkg==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
-                "@azure/core-tracing": "1.0.0-preview.13",
                 "@azure/logger": "^1.0.0",
                 "tslib": "^2.2.0"
             }
@@ -16404,53 +16513,27 @@
             }
         },
         "@azure/core-rest-pipeline": {
-            "version": "1.9.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.0.tgz",
-            "integrity": "sha512-uvM3mY+Vegk0F2r4Eh0yPdsXTUyafTQkeX0USnz1Eyangxm2Bib0w0wkJVZW8fpks7Lcv0ztIdCFTrN7H8uptg==",
+            "version": "1.9.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.1.tgz",
+            "integrity": "sha512-OVtt0LP0K5ktsKTmh6/695P0mPFmngjdCJPr4V0uvrkhHTkARSQ3VYRnxRc0LC9g3mHcH90C+8a6iF7ApMAZKg==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
-                "@azure/core-auth": "^1.3.0",
+                "@azure/core-auth": "^1.4.0",
                 "@azure/core-tracing": "^1.0.1",
                 "@azure/core-util": "^1.0.0",
                 "@azure/logger": "^1.0.0",
                 "form-data": "^4.0.0",
-                "http-proxy-agent": "^4.0.1",
+                "http-proxy-agent": "^5.0.0",
                 "https-proxy-agent": "^5.0.0",
                 "tslib": "^2.2.0",
                 "uuid": "^8.3.0"
-            },
-            "dependencies": {
-                "@azure/core-tracing": {
-                    "version": "1.0.1",
-                    "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
-                    "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
-                    "requires": {
-                        "tslib": "^2.2.0"
-                    }
-                },
-                "@tootallnate/once": {
-                    "version": "1.1.2",
-                    "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-                    "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
-                },
-                "http-proxy-agent": {
-                    "version": "4.0.1",
-                    "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-                    "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-                    "requires": {
-                        "@tootallnate/once": "1",
-                        "agent-base": "6",
-                        "debug": "4"
-                    }
-                }
             }
         },
         "@azure/core-tracing": {
-            "version": "1.0.0-preview.13",
-            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
-            "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
+            "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
             "requires": {
-                "@opentelemetry/api": "^1.0.1",
                 "tslib": "^2.2.0"
             }
         },
@@ -16463,20 +16546,20 @@
             }
         },
         "@azure/identity": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.0.5.tgz",
-            "integrity": "sha512-fSQTu9dS0P+lw1Gfct6t7TuRYybULL/E3wJjXLc1xr6RQXpmenJspi0lKzq3XFjLP5MzBlToKY3ZkYoAXPz1zA==",
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-2.1.0.tgz",
+            "integrity": "sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.3.0",
                 "@azure/core-client": "^1.4.0",
                 "@azure/core-rest-pipeline": "^1.1.0",
-                "@azure/core-tracing": "1.0.0-preview.13",
-                "@azure/core-util": "^1.0.0-beta.1",
+                "@azure/core-tracing": "^1.0.0",
+                "@azure/core-util": "^1.0.0",
                 "@azure/logger": "^1.0.0",
-                "@azure/msal-browser": "^2.16.0",
-                "@azure/msal-common": "^4.5.1",
-                "@azure/msal-node": "^1.3.0",
+                "@azure/msal-browser": "^2.26.0",
+                "@azure/msal-common": "^7.0.0",
+                "@azure/msal-node": "^1.10.0",
                 "events": "^3.0.0",
                 "jws": "^4.0.0",
                 "open": "^8.0.0",
@@ -16507,15 +16590,19 @@
             }
         },
         "@azure/keyvault-keys": {
-            "version": "4.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.4.0.tgz",
-            "integrity": "sha512-W9sPZebXYa3aar7BGIA+fAsq/sy1nf2TZAETbkv7DRawzVLrWv8QoVVceqNHjy3cigT4HNxXjaPYCI49ez5CUA==",
+            "version": "4.5.0",
+            "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.5.0.tgz",
+            "integrity": "sha512-F+0qpUrIxp1/uuQ3sFsAf4rTXErFwmuVLoXlD2e3ebrONrmYjqszwmlN4tBqAag1W9wGuZTL0jE8X8b+LB83ow==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
-                "@azure/core-http": "^2.0.0",
+                "@azure/core-auth": "^1.3.0",
+                "@azure/core-client": "^1.5.0",
+                "@azure/core-http-compat": "^1.3.0",
                 "@azure/core-lro": "^2.2.0",
                 "@azure/core-paging": "^1.1.1",
-                "@azure/core-tracing": "1.0.0-preview.13",
+                "@azure/core-rest-pipeline": "^1.8.0",
+                "@azure/core-tracing": "^1.0.0",
+                "@azure/core-util": "^1.0.0",
                 "@azure/logger": "^1.0.0",
                 "tslib": "^2.2.0"
             }
@@ -16529,43 +16616,26 @@
             }
         },
         "@azure/msal-browser": {
-            "version": "2.26.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.26.0.tgz",
-            "integrity": "sha512-mSyZORSgeMEWz5Wo5alUqjxP/HKt/XcViZqc3dnKFM9347qYPIWsAlzHkEmmafNr1VGUo7MeqB0emZCOQrl04w==",
+            "version": "2.28.1",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.28.1.tgz",
+            "integrity": "sha512-5uAfwpNGBSRzBGTSS+5l4Zw6msPV7bEmq99n0U3n/N++iTcha+nIp1QujxTPuOLHmTNCeySdMx9qzGqWuy22zQ==",
             "requires": {
-                "@azure/msal-common": "^7.0.0"
-            },
-            "dependencies": {
-                "@azure/msal-common": {
-                    "version": "7.0.0",
-                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz",
-                    "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA=="
-                }
+                "@azure/msal-common": "^7.3.0"
             }
         },
         "@azure/msal-common": {
-            "version": "4.5.1",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.5.1.tgz",
-            "integrity": "sha512-/i5dXM+QAtO+6atYd5oHGBAx48EGSISkXNXViheliOQe+SIFMDo3gSq3lL54W0suOSAsVPws3XnTaIHlla0PIQ==",
-            "requires": {
-                "debug": "^4.1.1"
-            }
+            "version": "7.3.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.3.0.tgz",
+            "integrity": "sha512-revxB3z+QLjwAtU1d04nC1voFr+i3LfqTpUfgrWZVqKh/sSgg0mZZUvw4vKVWB57qtL95sul06G+TfdFZny1Xw=="
         },
         "@azure/msal-node": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.10.0.tgz",
-            "integrity": "sha512-oSv9mg199FpRTe+fZ3o9NDYpKShOHqeceaNcCHJcKUaAaCojAbfbxD1Cvsti8BEsLKE6x0HcnjilnM1MKmZekA==",
+            "version": "1.12.1",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.12.1.tgz",
+            "integrity": "sha512-m909lX9C8Ty01DBxbjr4KfAKWibohgRvY7hrdDo13U1ztlH+0Nbt7cPF1vrWonW/CRT4H4xtUa4LCNmivghggw==",
             "requires": {
-                "@azure/msal-common": "^7.0.0",
+                "@azure/msal-common": "^7.3.0",
                 "jsonwebtoken": "^8.5.1",
                 "uuid": "^8.3.0"
-            },
-            "dependencies": {
-                "@azure/msal-common": {
-                    "version": "7.0.0",
-                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz",
-                    "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA=="
-                }
             }
         },
         "@babel/code-frame": {
@@ -16578,27 +16648,27 @@
             }
         },
         "@babel/compat-data": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz",
-            "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz",
+            "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==",
             "dev": true
         },
         "@babel/core": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz",
-            "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz",
+            "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==",
             "dev": true,
             "requires": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.18.6",
-                "@babel/helpers": "^7.18.6",
-                "@babel/parser": "^7.18.6",
-                "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6",
+                "@babel/generator": "^7.18.13",
+                "@babel/helper-compilation-targets": "^7.18.9",
+                "@babel/helper-module-transforms": "^7.18.9",
+                "@babel/helpers": "^7.18.9",
+                "@babel/parser": "^7.18.13",
+                "@babel/template": "^7.18.10",
+                "@babel/traverse": "^7.18.13",
+                "@babel/types": "^7.18.13",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -16618,12 +16688,12 @@
             }
         },
         "@babel/generator": {
-            "version": "7.18.7",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz",
-            "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz",
+            "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.18.7",
+                "@babel/types": "^7.18.13",
                 "@jridgewell/gen-mapping": "^0.3.2",
                 "jsesc": "^2.5.1"
             }
@@ -16638,39 +16708,39 @@
             }
         },
         "@babel/helper-builder-binary-assignment-operator-visitor": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz",
-            "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz",
+            "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==",
             "dev": true,
             "requires": {
                 "@babel/helper-explode-assignable-expression": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/types": "^7.18.9"
             }
         },
         "@babel/helper-compilation-targets": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz",
-            "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz",
+            "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.18.6",
+                "@babel/compat-data": "^7.18.8",
                 "@babel/helper-validator-option": "^7.18.6",
                 "browserslist": "^4.20.2",
                 "semver": "^6.3.0"
             }
         },
         "@babel/helper-create-class-features-plugin": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz",
-            "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz",
+            "integrity": "sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/helper-member-expression-to-functions": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-function-name": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.18.9",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.18.6",
+                "@babel/helper-replace-supers": "^7.18.9",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             }
         },
@@ -16685,15 +16755,13 @@
             }
         },
         "@babel/helper-define-polyfill-provider": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
-            "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz",
+            "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==",
             "dev": true,
             "requires": {
-                "@babel/helper-compilation-targets": "^7.13.0",
-                "@babel/helper-module-imports": "^7.12.13",
-                "@babel/helper-plugin-utils": "^7.13.0",
-                "@babel/traverse": "^7.13.0",
+                "@babel/helper-compilation-targets": "^7.17.7",
+                "@babel/helper-plugin-utils": "^7.16.7",
                 "debug": "^4.1.1",
                 "lodash.debounce": "^4.0.8",
                 "resolve": "^1.14.2",
@@ -16701,9 +16769,9 @@
             }
         },
         "@babel/helper-environment-visitor": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz",
-            "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+            "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
             "dev": true
         },
         "@babel/helper-explode-assignable-expression": {
@@ -16716,13 +16784,13 @@
             }
         },
         "@babel/helper-function-name": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz",
-            "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz",
+            "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==",
             "dev": true,
             "requires": {
                 "@babel/template": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/types": "^7.18.9"
             }
         },
         "@babel/helper-hoist-variables": {
@@ -16735,12 +16803,12 @@
             }
         },
         "@babel/helper-member-expression-to-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz",
-            "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
+            "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.18.6"
+                "@babel/types": "^7.18.9"
             }
         },
         "@babel/helper-module-imports": {
@@ -16753,19 +16821,19 @@
             }
         },
         "@babel/helper-module-transforms": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz",
-            "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz",
+            "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==",
             "dev": true,
             "requires": {
-                "@babel/helper-environment-visitor": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-module-imports": "^7.18.6",
                 "@babel/helper-simple-access": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "@babel/helper-validator-identifier": "^7.18.6",
                 "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/traverse": "^7.18.9",
+                "@babel/types": "^7.18.9"
             }
         },
         "@babel/helper-optimise-call-expression": {
@@ -16778,34 +16846,34 @@
             }
         },
         "@babel/helper-plugin-utils": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz",
-            "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz",
+            "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==",
             "dev": true
         },
         "@babel/helper-remap-async-to-generator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz",
-            "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
+            "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-wrap-function": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-wrap-function": "^7.18.9",
+                "@babel/types": "^7.18.9"
             }
         },
         "@babel/helper-replace-supers": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz",
-            "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz",
+            "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-member-expression-to-functions": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.18.9",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/traverse": "^7.18.9",
+                "@babel/types": "^7.18.9"
             }
         },
         "@babel/helper-simple-access": {
@@ -16818,12 +16886,12 @@
             }
         },
         "@babel/helper-skip-transparent-expression-wrappers": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz",
-            "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz",
+            "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.18.6"
+                "@babel/types": "^7.18.9"
             }
         },
         "@babel/helper-split-export-declaration": {
@@ -16835,6 +16903,12 @@
                 "@babel/types": "^7.18.6"
             }
         },
+        "@babel/helper-string-parser": {
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz",
+            "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==",
+            "dev": true
+        },
         "@babel/helper-validator-identifier": {
             "version": "7.18.6",
             "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
@@ -16848,26 +16922,26 @@
             "dev": true
         },
         "@babel/helper-wrap-function": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz",
-            "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==",
+            "version": "7.18.11",
+            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz",
+            "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==",
             "dev": true,
             "requires": {
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/helper-function-name": "^7.18.9",
+                "@babel/template": "^7.18.10",
+                "@babel/traverse": "^7.18.11",
+                "@babel/types": "^7.18.10"
             }
         },
         "@babel/helpers": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz",
-            "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz",
+            "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==",
             "dev": true,
             "requires": {
                 "@babel/template": "^7.18.6",
-                "@babel/traverse": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/traverse": "^7.18.9",
+                "@babel/types": "^7.18.9"
             }
         },
         "@babel/highlight": {
@@ -16882,9 +16956,9 @@
             }
         },
         "@babel/parser": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz",
-            "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz",
+            "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==",
             "dev": true
         },
         "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
@@ -16897,25 +16971,25 @@
             }
         },
         "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz",
-            "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz",
+            "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
+                "@babel/plugin-proposal-optional-chaining": "^7.18.9"
             }
         },
         "@babel/plugin-proposal-async-generator-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz",
-            "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==",
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz",
+            "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==",
             "dev": true,
             "requires": {
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-remap-async-to-generator": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-remap-async-to-generator": "^7.18.9",
                 "@babel/plugin-syntax-async-generators": "^7.8.4"
             }
         },
@@ -16951,12 +17025,12 @@
             }
         },
         "@babel/plugin-proposal-export-namespace-from": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz",
-            "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz",
+            "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
             }
         },
@@ -16971,12 +17045,12 @@
             }
         },
         "@babel/plugin-proposal-logical-assignment-operators": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz",
-            "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
+            "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
             }
         },
@@ -17001,16 +17075,16 @@
             }
         },
         "@babel/plugin-proposal-object-rest-spread": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz",
-            "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz",
+            "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/compat-data": "^7.18.8",
+                "@babel/helper-compilation-targets": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.18.6"
+                "@babel/plugin-transform-parameters": "^7.18.8"
             }
         },
         "@babel/plugin-proposal-optional-catch-binding": {
@@ -17024,13 +17098,13 @@
             }
         },
         "@babel/plugin-proposal-optional-chaining": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz",
-            "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
+            "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
                 "@babel/plugin-syntax-optional-chaining": "^7.8.3"
             }
         },
@@ -17258,46 +17332,46 @@
             }
         },
         "@babel/plugin-transform-block-scoping": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz",
-            "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz",
+            "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             }
         },
         "@babel/plugin-transform-classes": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz",
-            "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz",
+            "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-function-name": "^7.18.9",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-replace-supers": "^7.18.9",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "globals": "^11.1.0"
             }
         },
         "@babel/plugin-transform-computed-properties": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz",
-            "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
+            "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             }
         },
         "@babel/plugin-transform-destructuring": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz",
-            "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz",
+            "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             }
         },
         "@babel/plugin-transform-dotall-regex": {
@@ -17311,12 +17385,12 @@
             }
         },
         "@babel/plugin-transform-duplicate-keys": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz",
-            "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz",
+            "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             }
         },
         "@babel/plugin-transform-exponentiation-operator": {
@@ -17330,32 +17404,32 @@
             }
         },
         "@babel/plugin-transform-for-of": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz",
-            "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==",
+            "version": "7.18.8",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz",
+            "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==",
             "dev": true,
             "requires": {
                 "@babel/helper-plugin-utils": "^7.18.6"
             }
         },
         "@babel/plugin-transform-function-name": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz",
-            "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz",
+            "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-compilation-targets": "^7.18.9",
+                "@babel/helper-function-name": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9"
             }
         },
         "@babel/plugin-transform-literals": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz",
-            "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
+            "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             }
         },
         "@babel/plugin-transform-member-expression-literals": {
@@ -17391,14 +17465,14 @@
             }
         },
         "@babel/plugin-transform-modules-systemjs": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz",
-            "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz",
+            "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==",
             "dev": true,
             "requires": {
                 "@babel/helper-hoist-variables": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-module-transforms": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/helper-validator-identifier": "^7.18.6",
                 "babel-plugin-dynamic-import-node": "^2.3.3"
             }
@@ -17443,9 +17517,9 @@
             }
         },
         "@babel/plugin-transform-parameters": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz",
-            "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==",
+            "version": "7.18.8",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz",
+            "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==",
             "dev": true,
             "requires": {
                 "@babel/helper-plugin-utils": "^7.18.6"
@@ -17489,13 +17563,13 @@
             }
         },
         "@babel/plugin-transform-spread": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz",
-            "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz",
+            "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
             }
         },
         "@babel/plugin-transform-sticky-regex": {
@@ -17508,30 +17582,30 @@
             }
         },
         "@babel/plugin-transform-template-literals": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz",
-            "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
+            "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             }
         },
         "@babel/plugin-transform-typeof-symbol": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz",
-            "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
+            "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             }
         },
         "@babel/plugin-transform-unicode-escapes": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz",
-            "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==",
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz",
+            "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.18.9"
             }
         },
         "@babel/plugin-transform-unicode-regex": {
@@ -17545,29 +17619,29 @@
             }
         },
         "@babel/preset-env": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz",
-            "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==",
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz",
+            "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/compat-data": "^7.18.8",
+                "@babel/helper-compilation-targets": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.18.9",
                 "@babel/helper-validator-option": "^7.18.6",
                 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
-                "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6",
-                "@babel/plugin-proposal-async-generator-functions": "^7.18.6",
+                "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
+                "@babel/plugin-proposal-async-generator-functions": "^7.18.10",
                 "@babel/plugin-proposal-class-properties": "^7.18.6",
                 "@babel/plugin-proposal-class-static-block": "^7.18.6",
                 "@babel/plugin-proposal-dynamic-import": "^7.18.6",
-                "@babel/plugin-proposal-export-namespace-from": "^7.18.6",
+                "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
                 "@babel/plugin-proposal-json-strings": "^7.18.6",
-                "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6",
+                "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
                 "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
                 "@babel/plugin-proposal-numeric-separator": "^7.18.6",
-                "@babel/plugin-proposal-object-rest-spread": "^7.18.6",
+                "@babel/plugin-proposal-object-rest-spread": "^7.18.9",
                 "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.6",
+                "@babel/plugin-proposal-optional-chaining": "^7.18.9",
                 "@babel/plugin-proposal-private-methods": "^7.18.6",
                 "@babel/plugin-proposal-private-property-in-object": "^7.18.6",
                 "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
@@ -17589,40 +17663,40 @@
                 "@babel/plugin-transform-arrow-functions": "^7.18.6",
                 "@babel/plugin-transform-async-to-generator": "^7.18.6",
                 "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
-                "@babel/plugin-transform-block-scoping": "^7.18.6",
-                "@babel/plugin-transform-classes": "^7.18.6",
-                "@babel/plugin-transform-computed-properties": "^7.18.6",
-                "@babel/plugin-transform-destructuring": "^7.18.6",
+                "@babel/plugin-transform-block-scoping": "^7.18.9",
+                "@babel/plugin-transform-classes": "^7.18.9",
+                "@babel/plugin-transform-computed-properties": "^7.18.9",
+                "@babel/plugin-transform-destructuring": "^7.18.9",
                 "@babel/plugin-transform-dotall-regex": "^7.18.6",
-                "@babel/plugin-transform-duplicate-keys": "^7.18.6",
+                "@babel/plugin-transform-duplicate-keys": "^7.18.9",
                 "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
-                "@babel/plugin-transform-for-of": "^7.18.6",
-                "@babel/plugin-transform-function-name": "^7.18.6",
-                "@babel/plugin-transform-literals": "^7.18.6",
+                "@babel/plugin-transform-for-of": "^7.18.8",
+                "@babel/plugin-transform-function-name": "^7.18.9",
+                "@babel/plugin-transform-literals": "^7.18.9",
                 "@babel/plugin-transform-member-expression-literals": "^7.18.6",
                 "@babel/plugin-transform-modules-amd": "^7.18.6",
                 "@babel/plugin-transform-modules-commonjs": "^7.18.6",
-                "@babel/plugin-transform-modules-systemjs": "^7.18.6",
+                "@babel/plugin-transform-modules-systemjs": "^7.18.9",
                 "@babel/plugin-transform-modules-umd": "^7.18.6",
                 "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6",
                 "@babel/plugin-transform-new-target": "^7.18.6",
                 "@babel/plugin-transform-object-super": "^7.18.6",
-                "@babel/plugin-transform-parameters": "^7.18.6",
+                "@babel/plugin-transform-parameters": "^7.18.8",
                 "@babel/plugin-transform-property-literals": "^7.18.6",
                 "@babel/plugin-transform-regenerator": "^7.18.6",
                 "@babel/plugin-transform-reserved-words": "^7.18.6",
                 "@babel/plugin-transform-shorthand-properties": "^7.18.6",
-                "@babel/plugin-transform-spread": "^7.18.6",
+                "@babel/plugin-transform-spread": "^7.18.9",
                 "@babel/plugin-transform-sticky-regex": "^7.18.6",
-                "@babel/plugin-transform-template-literals": "^7.18.6",
-                "@babel/plugin-transform-typeof-symbol": "^7.18.6",
-                "@babel/plugin-transform-unicode-escapes": "^7.18.6",
+                "@babel/plugin-transform-template-literals": "^7.18.9",
+                "@babel/plugin-transform-typeof-symbol": "^7.18.9",
+                "@babel/plugin-transform-unicode-escapes": "^7.18.10",
                 "@babel/plugin-transform-unicode-regex": "^7.18.6",
                 "@babel/preset-modules": "^0.1.5",
-                "@babel/types": "^7.18.6",
-                "babel-plugin-polyfill-corejs2": "^0.3.1",
-                "babel-plugin-polyfill-corejs3": "^0.5.2",
-                "babel-plugin-polyfill-regenerator": "^0.3.1",
+                "@babel/types": "^7.18.10",
+                "babel-plugin-polyfill-corejs2": "^0.3.2",
+                "babel-plugin-polyfill-corejs3": "^0.5.3",
+                "babel-plugin-polyfill-regenerator": "^0.4.0",
                 "core-js-compat": "^3.22.1",
                 "semver": "^6.3.0"
             }
@@ -17641,54 +17715,55 @@
             }
         },
         "@babel/runtime": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz",
-            "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==",
+            "version": "7.18.9",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz",
+            "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==",
             "requires": {
                 "regenerator-runtime": "^0.13.4"
             }
         },
         "@babel/standalone": {
-            "version": "7.18.7",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.18.7.tgz",
-            "integrity": "sha512-AIOn3ON0KhYqAbvmkT11vi/YAlhrPn6RSPQb8Hl3PUZoE1yFwut5fQ9/oJ4Dvf2SGmO41pF7xmwP2W1RT0uJCA==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.18.13.tgz",
+            "integrity": "sha512-5hjvvFkaXyfQri+s4CAZtx6FTKclfTNd2QN2RwgzCVJhnYYgKh4YFBCnNJSxurzvpSKD2NmpCkoWAkMc+j9y+g==",
             "dev": true
         },
         "@babel/template": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz",
-            "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==",
+            "version": "7.18.10",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
+            "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/parser": "^7.18.6",
-                "@babel/types": "^7.18.6"
+                "@babel/parser": "^7.18.10",
+                "@babel/types": "^7.18.10"
             }
         },
         "@babel/traverse": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz",
-            "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz",
+            "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.18.6",
-                "@babel/helper-environment-visitor": "^7.18.6",
-                "@babel/helper-function-name": "^7.18.6",
+                "@babel/generator": "^7.18.13",
+                "@babel/helper-environment-visitor": "^7.18.9",
+                "@babel/helper-function-name": "^7.18.9",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.18.6",
-                "@babel/types": "^7.18.6",
+                "@babel/parser": "^7.18.13",
+                "@babel/types": "^7.18.13",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             }
         },
         "@babel/types": {
-            "version": "7.18.7",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz",
-            "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==",
+            "version": "7.18.13",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
+            "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
             "dev": true,
             "requires": {
+                "@babel/helper-string-parser": "^7.18.10",
                 "@babel/helper-validator-identifier": "^7.18.6",
                 "to-fast-properties": "^2.0.0"
             }
@@ -17704,15 +17779,22 @@
             "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.1.0.tgz",
             "integrity": "sha512-QgGnZ9b7o4k0Ai1ZbTJWwZpZcFK9d+Gb+DyNt4UT9x6IEIs5HVu0iIlmgzGqN+t9MoJSpSPo9S/Mm51UtHr3JA=="
         },
+        "@esbuild/linux-loong64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
+            "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
+            "dev": true,
+            "optional": true
+        },
         "@eslint/eslintrc": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
-            "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz",
+            "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==",
             "dev": true,
             "requires": {
                 "ajv": "^6.12.4",
                 "debug": "^4.3.2",
-                "espree": "^9.3.2",
+                "espree": "^9.4.0",
                 "globals": "^13.15.0",
                 "ignore": "^5.2.0",
                 "import-fresh": "^3.2.1",
@@ -17722,9 +17804,9 @@
             },
             "dependencies": {
                 "globals": {
-                    "version": "13.15.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
-                    "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+                    "version": "13.17.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+                    "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -18387,9 +18469,9 @@
             }
         },
         "@jridgewell/resolve-uri": {
-            "version": "3.0.8",
-            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
-            "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+            "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
             "dev": true
         },
         "@jridgewell/set-array": {
@@ -18405,9 +18487,9 @@
             "dev": true
         },
         "@jridgewell/trace-mapping": {
-            "version": "0.3.14",
-            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
-            "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
+            "version": "0.3.15",
+            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
+            "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
             "dev": true,
             "requires": {
                 "@jridgewell/resolve-uri": "^3.0.3",
@@ -18415,9 +18497,9 @@
             }
         },
         "@js-joda/core": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.2.0.tgz",
-            "integrity": "sha512-0OriPYIaMLB3XiLQMe0BXKVIqeriTn3H7JMOzTsHEtt7Zqq+TetCu97KnAhU3ckiQZKBxfZshft+H1OC4D1lXw=="
+            "version": "5.3.1",
+            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.3.1.tgz",
+            "integrity": "sha512-iHHyIRLEfXLqBN+BkyH8u8imMYr4ihRbFDEk8toqTwUECETVQFCTh2U59Sw2oMoRVaS3XRIb7pyCulltq2jFVA=="
         },
         "@louislam/sqlite3": {
             "version": "15.0.6",
@@ -18529,27 +18611,27 @@
             }
         },
         "@octokit/openapi-types": {
-            "version": "12.6.1",
-            "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.6.1.tgz",
-            "integrity": "sha512-zirGmxkSQuZIQYsOLtCxNoKi7ByKLwGhrGhHz6YUI7h/c8xOES9bEoHOeq4z81uNf2AGAqNfPW9i3GOrpgKoJQ==",
+            "version": "12.11.0",
+            "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+            "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==",
             "dev": true
         },
         "@octokit/plugin-paginate-rest": {
-            "version": "2.21.1",
-            "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.1.tgz",
-            "integrity": "sha512-NVNTK63yoTFp07GqISWK+uDfGH1CAPhQXS7LzsJBvaK5W+UlvG549pLZC55FK0FqANVl6q/9ra3SR5c97xF/sw==",
+            "version": "2.21.3",
+            "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
+            "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
             "dev": true,
             "requires": {
-                "@octokit/types": "^6.38.2"
+                "@octokit/types": "^6.40.0"
             }
         },
         "@octokit/plugin-rest-endpoint-methods": {
-            "version": "5.16.1",
-            "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.1.tgz",
-            "integrity": "sha512-RMHD3aJZvOpjR2fGzD2an6eU7LG8MsknhUHvP+wRUnKdbt7eDdhTMLQsZ4xsHZcLNsxPO/K4DDIZPhI2s571Ag==",
+            "version": "5.16.2",
+            "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
+            "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
             "dev": true,
             "requires": {
-                "@octokit/types": "^6.38.2",
+                "@octokit/types": "^6.39.0",
                 "deprecation": "^2.3.1"
             }
         },
@@ -18579,19 +18661,14 @@
             }
         },
         "@octokit/types": {
-            "version": "6.38.2",
-            "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.38.2.tgz",
-            "integrity": "sha512-McFegRKQ1qaMSnDt8ScJzv26IFR1zhXveYaqx8wF7QEgiy4GHMrnX4xbP+Yl+kAr12DCplL3WJq4xkeD1VMfmw==",
+            "version": "6.41.0",
+            "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+            "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
             "dev": true,
             "requires": {
-                "@octokit/openapi-types": "^12.6.1"
+                "@octokit/openapi-types": "^12.11.0"
             }
         },
-        "@opentelemetry/api": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.1.0.tgz",
-            "integrity": "sha512-hf+3bwuBwtXsugA2ULBc95qxrOqP2pOekLz34BJhcAKawt94vfeNyUKpYc0lZQ/3sCP6LqRa7UAdHA7i5UODzQ=="
-        },
         "@popperjs/core": {
             "version": "2.10.2",
             "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz",
@@ -18693,9 +18770,9 @@
             }
         },
         "@types/babel__traverse": {
-            "version": "7.17.1",
-            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz",
-            "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==",
+            "version": "7.18.1",
+            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.1.tgz",
+            "integrity": "sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==",
             "dev": true,
             "requires": {
                 "@babel/types": "^7.3.0"
@@ -18711,9 +18788,9 @@
             }
         },
         "@types/bootstrap": {
-            "version": "5.1.12",
-            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.12.tgz",
-            "integrity": "sha512-pSS5BGEgepwzdbsBGswBWFmgrnYpp7c4UfuYe1FJWwkrcjm/JVwfG4gBkOYtd92Otd3RdJK0ByBWMkBROfLEPw==",
+            "version": "5.1.13",
+            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.13.tgz",
+            "integrity": "sha512-1hIIOgfkMlyQCQz/3ae53xr6ZN2d6EDj/n3G+Sh/LBsBUVigyDmnCbLwsaXJJ1GBGlkjgfXVoyIvEPowQw25xQ==",
             "dev": true,
             "requires": {
                 "@popperjs/core": "^2.9.2"
@@ -18778,9 +18855,9 @@
             }
         },
         "@types/express-serve-static-core": {
-            "version": "4.17.29",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz",
-            "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==",
+            "version": "4.17.30",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz",
+            "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==",
             "requires": {
                 "@types/node": "*",
                 "@types/qs": "*",
@@ -18836,9 +18913,9 @@
             "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
         },
         "@types/koa": {
-            "version": "2.13.4",
-            "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
-            "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
+            "version": "2.13.5",
+            "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz",
+            "integrity": "sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==",
             "requires": {
                 "@types/accepts": "*",
                 "@types/content-disposition": "*",
@@ -18859,14 +18936,14 @@
             }
         },
         "@types/lodash": {
-            "version": "4.14.182",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
-            "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
+            "version": "4.14.184",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz",
+            "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q=="
         },
         "@types/mime": {
-            "version": "1.3.2",
-            "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
-            "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
+            "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
         },
         "@types/minimist": {
             "version": "1.2.2",
@@ -18875,30 +18952,9 @@
             "dev": true
         },
         "@types/node": {
-            "version": "18.0.1",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz",
-            "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg=="
-        },
-        "@types/node-fetch": {
-            "version": "2.6.2",
-            "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
-            "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
-            "requires": {
-                "@types/node": "*",
-                "form-data": "^3.0.0"
-            },
-            "dependencies": {
-                "form-data": {
-                    "version": "3.0.1",
-                    "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-                    "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-                    "requires": {
-                        "asynckit": "^0.4.0",
-                        "combined-stream": "^1.0.8",
-                        "mime-types": "^2.1.12"
-                    }
-                }
-            }
+            "version": "18.7.14",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz",
+            "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA=="
         },
         "@types/normalize-package-data": {
             "version": "2.4.1",
@@ -18913,9 +18969,9 @@
             "dev": true
         },
         "@types/prettier": {
-            "version": "2.6.3",
-            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz",
-            "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==",
+            "version": "2.7.0",
+            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz",
+            "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==",
             "dev": true
         },
         "@types/qs": {
@@ -18929,11 +18985,11 @@
             "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
         },
         "@types/serve-static": {
-            "version": "1.13.10",
-            "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
-            "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz",
+            "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==",
             "requires": {
-                "@types/mime": "^1",
+                "@types/mime": "*",
                 "@types/node": "*"
             }
         },
@@ -18943,14 +18999,6 @@
             "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
             "dev": true
         },
-        "@types/tunnel": {
-            "version": "0.0.3",
-            "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz",
-            "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==",
-            "requires": {
-                "@types/node": "*"
-            }
-        },
         "@types/yargs": {
             "version": "16.0.4",
             "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
@@ -18990,53 +19038,53 @@
             },
             "dependencies": {
                 "core-js": {
-                    "version": "3.23.3",
-                    "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.3.tgz",
-                    "integrity": "sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q==",
+                    "version": "3.25.0",
+                    "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz",
+                    "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==",
                     "dev": true
                 }
             }
         },
         "@vitejs/plugin-vue": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.3.tgz",
-            "integrity": "sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==",
+            "version": "2.3.4",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz",
+            "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==",
             "dev": true
         },
         "@vue/compiler-core": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
-            "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.38.tgz",
+            "integrity": "sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.37",
+                "@vue/shared": "3.2.38",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "@vue/compiler-dom": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz",
-            "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.38.tgz",
+            "integrity": "sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==",
             "dev": true,
             "requires": {
-                "@vue/compiler-core": "3.2.37",
-                "@vue/shared": "3.2.37"
+                "@vue/compiler-core": "3.2.38",
+                "@vue/shared": "3.2.38"
             }
         },
         "@vue/compiler-sfc": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz",
-            "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.38.tgz",
+            "integrity": "sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.37",
-                "@vue/compiler-dom": "3.2.37",
-                "@vue/compiler-ssr": "3.2.37",
-                "@vue/reactivity-transform": "3.2.37",
-                "@vue/shared": "3.2.37",
+                "@vue/compiler-core": "3.2.38",
+                "@vue/compiler-dom": "3.2.38",
+                "@vue/compiler-ssr": "3.2.38",
+                "@vue/reactivity-transform": "3.2.38",
+                "@vue/shared": "3.2.38",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7",
                 "postcss": "^8.1.10",
@@ -19055,19 +19103,19 @@
             }
         },
         "@vue/compiler-ssr": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz",
-            "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.38.tgz",
+            "integrity": "sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==",
             "dev": true,
             "requires": {
-                "@vue/compiler-dom": "3.2.37",
-                "@vue/shared": "3.2.37"
+                "@vue/compiler-dom": "3.2.38",
+                "@vue/shared": "3.2.38"
             }
         },
         "@vue/devtools-api": {
-            "version": "6.2.0",
-            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.0.tgz",
-            "integrity": "sha512-pF1G4wky+hkifDiZSWn8xfuLOJI1ZXtuambpBEYaf7Xaf6zC/pM29rvAGpd3qaGXnr4BAXU1Pxz/VfvBGwexGA==",
+            "version": "6.2.1",
+            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz",
+            "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==",
             "dev": true
         },
         "@vue/reactivity": {
@@ -19088,14 +19136,14 @@
             }
         },
         "@vue/reactivity-transform": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz",
-            "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.38.tgz",
+            "integrity": "sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.37",
-                "@vue/shared": "3.2.37",
+                "@vue/compiler-core": "3.2.38",
+                "@vue/shared": "3.2.38",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             },
@@ -19199,9 +19247,9 @@
             }
         },
         "@vue/shared": {
-            "version": "3.2.37",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz",
-            "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==",
+            "version": "3.2.38",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz",
+            "integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==",
             "dev": true
         },
         "abab": {
@@ -19225,9 +19273,9 @@
             }
         },
         "acorn": {
-            "version": "8.7.1",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
-            "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+            "version": "8.8.0",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+            "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
             "dev": true
         },
         "acorn-globals": {
@@ -19603,33 +19651,33 @@
             }
         },
         "babel-plugin-polyfill-corejs2": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
-            "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz",
+            "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.13.11",
-                "@babel/helper-define-polyfill-provider": "^0.3.1",
+                "@babel/compat-data": "^7.17.7",
+                "@babel/helper-define-polyfill-provider": "^0.3.2",
                 "semver": "^6.1.1"
             }
         },
         "babel-plugin-polyfill-corejs3": {
-            "version": "0.5.2",
-            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
-            "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
+            "version": "0.5.3",
+            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz",
+            "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==",
             "dev": true,
             "requires": {
-                "@babel/helper-define-polyfill-provider": "^0.3.1",
+                "@babel/helper-define-polyfill-provider": "^0.3.2",
                 "core-js-compat": "^3.21.0"
             }
         },
         "babel-plugin-polyfill-regenerator": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
-            "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz",
+            "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==",
             "dev": true,
             "requires": {
-                "@babel/helper-define-polyfill-provider": "^0.3.1"
+                "@babel/helper-define-polyfill-provider": "^0.3.2"
             }
         },
         "babel-plugin-rewire": {
@@ -19879,15 +19927,15 @@
             "dev": true
         },
         "browserslist": {
-            "version": "4.21.1",
-            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz",
-            "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==",
+            "version": "4.21.3",
+            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
+            "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
             "dev": true,
             "requires": {
-                "caniuse-lite": "^1.0.30001359",
-                "electron-to-chromium": "^1.4.172",
-                "node-releases": "^2.0.5",
-                "update-browserslist-db": "^1.0.4"
+                "caniuse-lite": "^1.0.30001370",
+                "electron-to-chromium": "^1.4.202",
+                "node-releases": "^2.0.6",
+                "update-browserslist-db": "^1.0.5"
             }
         },
         "bser": {
@@ -19982,9 +20030,9 @@
             }
         },
         "caniuse-lite": {
-            "version": "1.0.30001362",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001362.tgz",
-            "integrity": "sha512-PFykHuC7BQTzCGQFaV6wD8IDRM3HpI83BXr99nNJhoOyDufgSuKlt0QVlWYt5ZJtEYFeuNVF5QY3kJcu8hVFjQ==",
+            "version": "1.0.30001387",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001387.tgz",
+            "integrity": "sha512-fKDH0F1KOJvR+mWSOvhj8lVRr/Q/mc5u5nabU2vi1/sgvlSqEsE8dOq0Hy/BqVbDkCYQPRRHB1WRjW6PGB/7PA==",
             "dev": true
         },
         "caseless": {
@@ -20036,9 +20084,9 @@
             "dev": true
         },
         "check-password-strength": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/check-password-strength/-/check-password-strength-2.0.5.tgz",
-            "integrity": "sha512-b61T/+4OIGWSMRxJUsYOY44Cf9w7orIt2OQmF/WgH16qbJKIT1jG3XHx3jP+o090eH7rq13DRleKgXCiROBzMQ=="
+            "version": "2.0.7",
+            "resolved": "https://registry.npmjs.org/check-password-strength/-/check-password-strength-2.0.7.tgz",
+            "integrity": "sha512-VyklBkB6dOKnCIh63zdVr7QKVMN9/npwUqNAXxWrz8HabVZH/n/d+lyNm1O/vbXFJlT/Hytb5ouYKYGkoeZirQ=="
         },
         "cheerio": {
             "version": "1.0.0-rc.12",
@@ -20199,9 +20247,9 @@
             "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
         },
         "colord": {
-            "version": "2.9.2",
-            "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
-            "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==",
+            "version": "2.9.3",
+            "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+            "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
             "dev": true
         },
         "colorette": {
@@ -20317,9 +20365,9 @@
             }
         },
         "concurrently": {
-            "version": "7.2.2",
-            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.2.tgz",
-            "integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==",
+            "version": "7.3.0",
+            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.3.0.tgz",
+            "integrity": "sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==",
             "dev": true,
             "requires": {
                 "chalk": "^4.1.0",
@@ -20446,12 +20494,12 @@
             "dev": true
         },
         "core-js-compat": {
-            "version": "3.23.3",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz",
-            "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==",
+            "version": "3.25.0",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz",
+            "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==",
             "dev": true,
             "requires": {
-                "browserslist": "^4.21.0",
+                "browserslist": "^4.21.3",
                 "semver": "7.0.0"
             },
             "dependencies": {
@@ -20640,15 +20688,15 @@
             }
         },
         "date-fns": {
-            "version": "2.28.0",
-            "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
-            "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
+            "version": "2.29.2",
+            "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.2.tgz",
+            "integrity": "sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==",
             "dev": true
         },
         "dayjs": {
-            "version": "1.11.3",
-            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.3.tgz",
-            "integrity": "sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A=="
+            "version": "1.11.5",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz",
+            "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA=="
         },
         "debug": {
             "version": "4.3.4",
@@ -20690,9 +20738,9 @@
             }
         },
         "decimal.js": {
-            "version": "10.3.1",
-            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
-            "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
+            "version": "10.4.0",
+            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz",
+            "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==",
             "dev": true
         },
         "dedent": {
@@ -20797,9 +20845,9 @@
             }
         },
         "dns2": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/dns2/-/dns2-2.0.2.tgz",
-            "integrity": "sha512-XYBUv6/CyGAGkeyXOeHhjKscHm2b70oSl1as1C2qLVWvZKJLdzxv/LsyyEJeMdbkCS48OyajfBhP6NpO55gQww==",
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/dns2/-/dns2-2.0.5.tgz",
+            "integrity": "sha512-dznYrQU+Txcz++klGLBY9YR3WLOGHTy2vAKAqF+yYw1KaKFm5f5Y4jbbFEvohJf8YtZ0J2SzZlZx2k6LV4zJqQ==",
             "dev": true
         },
         "doctrine": {
@@ -20896,9 +20944,9 @@
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
         },
         "electron-to-chromium": {
-            "version": "1.4.177",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.177.tgz",
-            "integrity": "sha512-FYPir3NSBEGexSZUEeht81oVhHfLFl6mhUKSkjHN/iB/TwEIt/WHQrqVGfTLN5gQxwJCQkIJBe05eOXjI7omgg==",
+            "version": "1.4.239",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.239.tgz",
+            "integrity": "sha512-XbhfzxPIFzMjJm17T7yUGZEyYh5XuUjrA/FQ7JUy2bEd4qQ7MvFTaKpZ6zXZog1cfVttESo2Lx0ctnf7eQOaAQ==",
             "dev": true
         },
         "emittery": {
@@ -20984,9 +21032,9 @@
             "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
         },
         "entities": {
-            "version": "4.3.1",
-            "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
-            "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg=="
+            "version": "4.4.0",
+            "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+            "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
         },
         "env-paths": {
             "version": "2.2.1",
@@ -21058,37 +21106,171 @@
             }
         },
         "esbuild": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz",
-            "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==",
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
+            "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
             "dev": true,
             "requires": {
-                "esbuild-android-64": "0.14.48",
-                "esbuild-android-arm64": "0.14.48",
-                "esbuild-darwin-64": "0.14.48",
-                "esbuild-darwin-arm64": "0.14.48",
-                "esbuild-freebsd-64": "0.14.48",
-                "esbuild-freebsd-arm64": "0.14.48",
-                "esbuild-linux-32": "0.14.48",
-                "esbuild-linux-64": "0.14.48",
-                "esbuild-linux-arm": "0.14.48",
-                "esbuild-linux-arm64": "0.14.48",
-                "esbuild-linux-mips64le": "0.14.48",
-                "esbuild-linux-ppc64le": "0.14.48",
-                "esbuild-linux-riscv64": "0.14.48",
-                "esbuild-linux-s390x": "0.14.48",
-                "esbuild-netbsd-64": "0.14.48",
-                "esbuild-openbsd-64": "0.14.48",
-                "esbuild-sunos-64": "0.14.48",
-                "esbuild-windows-32": "0.14.48",
-                "esbuild-windows-64": "0.14.48",
-                "esbuild-windows-arm64": "0.14.48"
+                "@esbuild/linux-loong64": "0.14.54",
+                "esbuild-android-64": "0.14.54",
+                "esbuild-android-arm64": "0.14.54",
+                "esbuild-darwin-64": "0.14.54",
+                "esbuild-darwin-arm64": "0.14.54",
+                "esbuild-freebsd-64": "0.14.54",
+                "esbuild-freebsd-arm64": "0.14.54",
+                "esbuild-linux-32": "0.14.54",
+                "esbuild-linux-64": "0.14.54",
+                "esbuild-linux-arm": "0.14.54",
+                "esbuild-linux-arm64": "0.14.54",
+                "esbuild-linux-mips64le": "0.14.54",
+                "esbuild-linux-ppc64le": "0.14.54",
+                "esbuild-linux-riscv64": "0.14.54",
+                "esbuild-linux-s390x": "0.14.54",
+                "esbuild-netbsd-64": "0.14.54",
+                "esbuild-openbsd-64": "0.14.54",
+                "esbuild-sunos-64": "0.14.54",
+                "esbuild-windows-32": "0.14.54",
+                "esbuild-windows-64": "0.14.54",
+                "esbuild-windows-arm64": "0.14.54"
             }
         },
+        "esbuild-android-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
+            "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-android-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
+            "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-darwin-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
+            "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-darwin-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
+            "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-freebsd-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
+            "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-freebsd-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
+            "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-linux-32": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
+            "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
+            "dev": true,
+            "optional": true
+        },
         "esbuild-linux-64": {
-            "version": "0.14.48",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz",
-            "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==",
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
+            "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-linux-arm": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
+            "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-linux-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
+            "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-linux-mips64le": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
+            "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-linux-ppc64le": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
+            "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-linux-riscv64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
+            "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-linux-s390x": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
+            "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-netbsd-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
+            "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-openbsd-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
+            "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-sunos-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
+            "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-windows-32": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
+            "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-windows-64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
+            "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
+            "dev": true,
+            "optional": true
+        },
+        "esbuild-windows-arm64": {
+            "version": "0.14.54",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
+            "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
             "dev": true,
             "optional": true
         },
@@ -21274,9 +21456,9 @@
                     "dev": true
                 },
                 "globals": {
-                    "version": "13.15.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
-                    "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+                    "version": "13.17.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+                    "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -21361,12 +21543,12 @@
             "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="
         },
         "espree": {
-            "version": "9.3.2",
-            "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
-            "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+            "version": "9.4.0",
+            "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
+            "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
             "dev": true,
             "requires": {
-                "acorn": "^8.7.1",
+                "acorn": "^8.8.0",
                 "acorn-jsx": "^5.3.2",
                 "eslint-visitor-keys": "^3.3.0"
             },
@@ -21501,9 +21683,9 @@
             }
         },
         "expect-puppeteer": {
-            "version": "6.1.0",
-            "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-6.1.0.tgz",
-            "integrity": "sha512-5yk64xOe+yTRLeZTg1uuGYmUw5bMsI/YX7Q9tXsovYFBq8bvagJH4XMYLQ7/nU+1dJawLH0KJehuJULD33oU+w==",
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-6.1.1.tgz",
+            "integrity": "sha512-cnQF96qdoEcOD63j5NQMc0RtW9WRMW/WHKXEKsuDQ2tszhVH3qC7zkXXS4D0LTt9qCB3DEExioqylsQXvqPrUw==",
             "dev": true
         },
         "express": {
@@ -21657,9 +21839,9 @@
             "dev": true
         },
         "fastest-levenshtein": {
-            "version": "1.0.12",
-            "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
-            "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+            "version": "1.0.16",
+            "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+            "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
             "dev": true
         },
         "fastfall": {
@@ -21869,9 +22051,9 @@
             }
         },
         "flatted": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz",
-            "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
+            "version": "3.2.7",
+            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+            "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
             "dev": true
         },
         "follow-redirects": {
@@ -22000,6 +22182,13 @@
             "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
             "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
         },
+        "fsevents": {
+            "version": "2.3.2",
+            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+            "dev": true,
+            "optional": true
+        },
         "function-bind": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -22350,9 +22539,9 @@
             }
         },
         "http-graceful-shutdown": {
-            "version": "3.1.7",
-            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.7.tgz",
-            "integrity": "sha512-00tmCsvemcZLfhii3sB7sfoUjvTzhg/WdOzVI7WEt2Vai9h1ybzSoEhJeQIck8gCz8pt/4YMXWPjGZxe+KukTA==",
+            "version": "3.1.8",
+            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.8.tgz",
+            "integrity": "sha512-u1vwhYLrpT2I52poqm04KnKyvUfpRk93BIoWSizZkDJQ2oBAjsYFG8TPlsEkamTOkIVheIYuGeOL1OpzXYUxlA==",
             "requires": {
                 "debug": "^4.3.4"
             }
@@ -22504,9 +22693,9 @@
             "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="
         },
         "ip": {
-            "version": "1.1.8",
-            "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
-            "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+            "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
         },
         "ipaddr.js": {
             "version": "1.9.1",
@@ -22557,9 +22746,9 @@
             "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
         },
         "is-core-module": {
-            "version": "2.9.0",
-            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
-            "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+            "version": "2.10.0",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
+            "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
             "requires": {
                 "has": "^1.0.3"
             }
@@ -22854,9 +23043,9 @@
             }
         },
         "istanbul-reports": {
-            "version": "3.1.4",
-            "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz",
-            "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==",
+            "version": "3.1.5",
+            "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+            "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
             "dev": true,
             "requires": {
                 "html-escaper": "^2.0.0",
@@ -23133,9 +23322,9 @@
             }
         },
         "jest-dev-server": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.0.3.tgz",
-            "integrity": "sha512-joKPQQWSaBMsNNdCWvwCQvhD6ox4IH+5H5pecbRRSxiRi2BfVCGGOWQ4/MGwV1NJ9z9XEq1qy5JLYTJlv9RVzA==",
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.1.1.tgz",
+            "integrity": "sha512-z5LnaGDvlIkdMv/rppSO4+rq+GyQKf1xI9oiBxf9/2EBeN2hxRaWiMvaLNDnHPZj2PAhBXsycrKslDDoZO2Xtw==",
             "dev": true,
             "requires": {
                 "chalk": "^4.1.2",
@@ -23144,7 +23333,7 @@
                 "prompts": "^2.4.2",
                 "spawnd": "^6.0.2",
                 "tree-kill": "^1.2.2",
-                "wait-on": "^6.0.0"
+                "wait-on": "^6.0.1"
             },
             "dependencies": {
                 "ansi-styles": {
@@ -23364,14 +23553,14 @@
             }
         },
         "jest-environment-puppeteer": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-6.0.3.tgz",
-            "integrity": "sha512-oZE/W8swhDSZpZ+Vm1C2JyoKECsvqcFOlaf3/+G0AtizZfGNkRILdi1U7k9MHLOqGEB5sfFWXG0vpJ8bTNP1dQ==",
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-6.1.1.tgz",
+            "integrity": "sha512-Ces37g8Gdj7QaVxszeoXlvmsZxcEJN9EPUdJt8fGMLA+6ARVFKyVmFgP9xVeGyjTvzsXdtIiJdeOKMLMeD8r2A==",
             "dev": true,
             "requires": {
                 "chalk": "^4.1.2",
                 "cwd": "^0.10.0",
-                "jest-dev-server": "^6.0.3",
+                "jest-dev-server": "^6.1.1",
                 "jest-environment-node": "^27.4.4",
                 "merge-deep": "^3.0.3"
             },
@@ -24275,22 +24464,24 @@
             }
         },
         "joi": {
-            "version": "17.6.0",
-            "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz",
-            "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==",
-            "dev": true,
+            "version": "14.3.1",
+            "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
+            "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
             "requires": {
-                "@hapi/hoek": "^9.0.0",
-                "@hapi/topo": "^5.0.0",
-                "@sideway/address": "^4.1.3",
-                "@sideway/formula": "^3.0.0",
-                "@sideway/pinpoint": "^2.0.0"
+                "hoek": "6.x.x",
+                "isemail": "3.x.x",
+                "topo": "3.x.x"
             }
         },
+        "js-md4": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz",
+            "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
+        },
         "js-sdsl": {
-            "version": "2.1.4",
-            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-2.1.4.tgz",
-            "integrity": "sha512-/Ew+CJWHNddr7sjwgxaVeIORIH4AMVC9dy0hPf540ZGMVgS9d3ajwuVdyhDt6/QUvT8ATjR3yuYBKsS79F+H4A=="
+            "version": "4.1.3",
+            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.3.tgz",
+            "integrity": "sha512-p6umEbgMJq1OL+2z6eYFj8/yHlsx+0gX2nNoSqnu0V5KZaFGBaUfvktdbm5BGrlojadQ+Hjir0rdsaTmzoyd5Q=="
         },
         "js-tokens": {
             "version": "4.0.0",
@@ -24751,9 +24942,9 @@
             }
         },
         "magic-string": {
-            "version": "0.26.2",
-            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz",
-            "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==",
+            "version": "0.26.3",
+            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz",
+            "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
             "dev": true,
             "requires": {
                 "sourcemap-codec": "^1.4.8"
@@ -25041,9 +25232,9 @@
             "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
         },
         "mssql": {
-            "version": "8.1.2",
-            "resolved": "https://registry.npmjs.org/mssql/-/mssql-8.1.2.tgz",
-            "integrity": "sha512-xkTw3Sp1Jpq2f7CG3rFQn6YK4XZbnL8HfZhaB/KRC/hjDZlJB3pSWYN2Cp/WwxIeA1iUJkdFa6GTfdMY8+DAjg==",
+            "version": "8.1.4",
+            "resolved": "https://registry.npmjs.org/mssql/-/mssql-8.1.4.tgz",
+            "integrity": "sha512-nqkYYehETWVvFLB9zAGJV2kegOsdtLjUnkHA52aFhlE0ZIoOXC3BL8pLERwFicFypM4i3DX1hYeuM726EEIxjQ==",
             "requires": {
                 "@tediousjs/connection-string": "^0.3.0",
                 "commander": "^9.1.0",
@@ -25054,9 +25245,9 @@
             },
             "dependencies": {
                 "commander": {
-                    "version": "9.3.0",
-                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz",
-                    "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw=="
+                    "version": "9.4.0",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
+                    "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw=="
                 }
             }
         },
@@ -25280,18 +25471,6 @@
                 "joi": "^14.3.1",
                 "node-radius-utils": "^1.2.0",
                 "radius": "^1.1.4"
-            },
-            "dependencies": {
-                "joi": {
-                    "version": "14.3.1",
-                    "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
-                    "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
-                    "requires": {
-                        "hoek": "6.x.x",
-                        "isemail": "3.x.x",
-                        "topo": "3.x.x"
-                    }
-                }
             }
         },
         "node-radius-utils": {
@@ -25300,9 +25479,9 @@
             "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
         },
         "node-releases": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
-            "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+            "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
             "dev": true
         },
         "nodemailer": {
@@ -25387,12 +25566,12 @@
             }
         },
         "number-allocator": {
-            "version": "1.0.10",
-            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.10.tgz",
-            "integrity": "sha512-K4AvNGKo9lP6HqsZyfSr9KDaqnwFzW203inhQEOwFrmFaYevpdX4VNwdOLk197aHujzbT//z6pCBrCOUYSM5iw==",
+            "version": "1.0.11",
+            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.11.tgz",
+            "integrity": "sha512-ykOuVG+oGw67qwt0eW0sPaIR+ANtB58QCpVaaGLxt0QekRXDA5Q/eG7sJmFEZpIcSVdjdevmO72Z6mH258y7Hw==",
             "requires": {
                 "debug": "^4.3.1",
-                "js-sdsl": "^2.1.2"
+                "js-sdsl": "^4.1.3"
             }
         },
         "number-is-nan": {
@@ -25434,13 +25613,13 @@
             "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
         },
         "object.assign": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-            "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+            "version": "4.1.4",
+            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+            "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
             "requires": {
-                "call-bind": "^1.0.0",
-                "define-properties": "^1.1.3",
-                "has-symbols": "^1.0.1",
+                "call-bind": "^1.0.2",
+                "define-properties": "^1.1.4",
+                "has-symbols": "^1.0.3",
                 "object-keys": "^1.1.1"
             }
         },
@@ -25664,14 +25843,14 @@
             "optional": true
         },
         "pg": {
-            "version": "8.7.3",
-            "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
-            "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
+            "version": "8.8.0",
+            "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz",
+            "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==",
             "requires": {
                 "buffer-writer": "2.0.0",
                 "packet-reader": "1.0.0",
                 "pg-connection-string": "^2.5.0",
-                "pg-pool": "^3.5.1",
+                "pg-pool": "^3.5.2",
                 "pg-protocol": "^1.5.0",
                 "pg-types": "^2.1.0",
                 "pgpass": "1.x"
@@ -25688,9 +25867,9 @@
             "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
         },
         "pg-pool": {
-            "version": "3.5.1",
-            "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
-            "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ=="
+            "version": "3.5.2",
+            "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz",
+            "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w=="
         },
         "pg-protocol": {
             "version": "1.5.0",
@@ -25763,9 +25942,9 @@
             "dev": true
         },
         "postcss": {
-            "version": "8.4.14",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
-            "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+            "version": "8.4.16",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
+            "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
             "dev": true,
             "requires": {
                 "nanoid": "^3.3.4",
@@ -25774,72 +25953,22 @@
             }
         },
         "postcss-html": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.4.1.tgz",
-            "integrity": "sha512-OKihuWxPuBQrQeLNsavP7ytJ9IYNj/ViAXB2v7Qjh56LnfESKrkahKA9si4VfPN8xtz6oqUE6KdL0bTPrHJr6g==",
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.5.0.tgz",
+            "integrity": "sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==",
             "dev": true,
             "requires": {
-                "htmlparser2": "^7.1.2",
+                "htmlparser2": "^8.0.0",
+                "js-tokens": "^8.0.0",
                 "postcss": "^8.4.0",
                 "postcss-safe-parser": "^6.0.0"
             },
             "dependencies": {
-                "dom-serializer": {
-                    "version": "1.4.1",
-                    "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
-                    "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
-                    "dev": true,
-                    "requires": {
-                        "domelementtype": "^2.0.1",
-                        "domhandler": "^4.2.0",
-                        "entities": "^2.0.0"
-                    },
-                    "dependencies": {
-                        "entities": {
-                            "version": "2.2.0",
-                            "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-                            "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-                            "dev": true
-                        }
-                    }
-                },
-                "domhandler": {
-                    "version": "4.3.1",
-                    "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
-                    "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
-                    "dev": true,
-                    "requires": {
-                        "domelementtype": "^2.2.0"
-                    }
-                },
-                "domutils": {
-                    "version": "2.8.0",
-                    "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
-                    "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
-                    "dev": true,
-                    "requires": {
-                        "dom-serializer": "^1.0.1",
-                        "domelementtype": "^2.2.0",
-                        "domhandler": "^4.2.0"
-                    }
-                },
-                "entities": {
-                    "version": "3.0.1",
-                    "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
-                    "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+                "js-tokens": {
+                    "version": "8.0.0",
+                    "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.0.tgz",
+                    "integrity": "sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==",
                     "dev": true
-                },
-                "htmlparser2": {
-                    "version": "7.2.0",
-                    "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
-                    "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
-                    "dev": true,
-                    "requires": {
-                        "domelementtype": "^2.0.1",
-                        "domhandler": "^4.2.2",
-                        "domutils": "^2.8.0",
-                        "entities": "^3.0.1"
-                    }
                 }
             }
         },
@@ -25941,16 +26070,11 @@
             }
         },
         "prismjs": {
-            "version": "1.28.0",
-            "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
-            "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==",
+            "version": "1.29.0",
+            "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+            "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
             "dev": true
         },
-        "process": {
-            "version": "0.11.10",
-            "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-            "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
-        },
         "process-nextick-args": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -26024,9 +26148,10 @@
             "dev": true
         },
         "psl": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-            "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+            "version": "1.9.0",
+            "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+            "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+            "devOptional": true
         },
         "pump": {
             "version": "3.0.0",
@@ -26102,9 +26227,9 @@
             "dev": true
         },
         "qrcode": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.0.tgz",
-            "integrity": "sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==",
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz",
+            "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==",
             "dev": true,
             "requires": {
                 "dijkstrajs": "^1.0.1",
@@ -26201,6 +26326,12 @@
             "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
             "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw=="
         },
+        "querystringify": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+            "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+            "dev": true
+        },
         "queue-microtask": {
             "version": "1.2.3",
             "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -26359,9 +26490,9 @@
             },
             "dependencies": {
                 "@types/node": {
-                    "version": "14.18.21",
-                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz",
-                    "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q=="
+                    "version": "14.18.26",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.26.tgz",
+                    "integrity": "sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA=="
                 }
             }
         },
@@ -26543,6 +26674,12 @@
             "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
             "dev": true
         },
+        "requires-port": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+            "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+            "dev": true
+        },
         "resolve": {
             "version": "1.22.1",
             "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
@@ -26618,24 +26755,24 @@
             }
         },
         "rollup": {
-            "version": "2.75.7",
-            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz",
-            "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==",
+            "version": "2.77.3",
+            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz",
+            "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
             "dev": true,
             "requires": {
                 "fsevents": "~2.3.2"
             }
         },
         "rollup-plugin-visualizer": {
-            "version": "5.6.0",
-            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.6.0.tgz",
-            "integrity": "sha512-CKcc8GTUZjC+LsMytU8ocRr/cGZIfMR7+mdy4YnlyetlmIl/dM8BMnOEpD4JPIGt+ZVW7Db9ZtSsbgyeBH3uTA==",
+            "version": "5.8.0",
+            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.0.tgz",
+            "integrity": "sha512-pY6j/7qHz5I9rB7d/bQoA5gX+2FbV3MBG055wrsFxDn550bgl0FNViRj6wDHh85PMswv+JVdZjhnMBzz/hdAHA==",
             "dev": true,
             "requires": {
-                "nanoid": "^3.1.32",
+                "nanoid": "^3.3.4",
                 "open": "^8.4.0",
                 "source-map": "^0.7.3",
-                "yargs": "^17.3.1"
+                "yargs": "^17.5.1"
             },
             "dependencies": {
                 "source-map": {
@@ -26707,9 +26844,9 @@
             }
         },
         "rxjs": {
-            "version": "7.5.5",
-            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
-            "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
+            "version": "7.5.6",
+            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz",
+            "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==",
             "dev": true,
             "requires": {
                 "tslib": "^2.1.0"
@@ -26739,11 +26876,6 @@
                 "chokidar": ">=3.0.0 <4.0.0"
             }
         },
-        "sax": {
-            "version": "1.2.4",
-            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
-        },
         "saxes": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
@@ -26988,11 +27120,11 @@
             }
         },
         "socks": {
-            "version": "2.6.2",
-            "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
-            "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
+            "version": "2.7.0",
+            "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz",
+            "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==",
             "requires": {
-                "ip": "^1.1.5",
+                "ip": "^2.0.0",
                 "smart-buffer": "^4.2.0"
             }
         },
@@ -27084,9 +27216,9 @@
             }
         },
         "spdx-license-ids": {
-            "version": "3.0.11",
-            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
-            "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
+            "version": "3.0.12",
+            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz",
+            "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
             "dev": true
         },
         "specificity": {
@@ -27350,9 +27482,9 @@
                     }
                 },
                 "write-file-atomic": {
-                    "version": "4.0.1",
-                    "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz",
-                    "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==",
+                    "version": "4.0.2",
+                    "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+                    "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
                     "dev": true,
                     "requires": {
                         "imurmurhash": "^0.1.4",
@@ -27430,9 +27562,9 @@
             "dev": true
         },
         "systemjs": {
-            "version": "6.12.1",
-            "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.12.1.tgz",
-            "integrity": "sha512-hqTN6kW+pN6/qro6G9OZ7ceDQOcYno020zBQKpZQLsJhYTDMCMNfXi/Y8duF5iW+4WWZr42ry0MMkcRGpbwG2A==",
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.12.6.tgz",
+            "integrity": "sha512-SawLiWya8/uNR4p12OggSYZ35tP4U4QTpfV57DdZEOPr6+J6zlLSeeEpMmzYTEoBAsMhctdEE+SWJUDYX4EaKw==",
             "dev": true
         },
         "table": {
@@ -27533,9 +27665,9 @@
             }
         },
         "tedious": {
-            "version": "14.6.1",
-            "resolved": "https://registry.npmjs.org/tedious/-/tedious-14.6.1.tgz",
-            "integrity": "sha512-45Xsvsjm6j41JVXXwKAseAGM/jD6ty8CcSdcxPT4B2dqZ00tIkYsGlI7n8DU8xDoatnvyT4BIYKZZCe3eE16PA==",
+            "version": "14.7.0",
+            "resolved": "https://registry.npmjs.org/tedious/-/tedious-14.7.0.tgz",
+            "integrity": "sha512-d3qlmZcvZyt7akyPHiOdR+knfzObWZH3mW+gouQTSb7YTSwtpHuYHcvsQabfbY7oOvgbs51xRb7CwOahWK/t9w==",
             "requires": {
                 "@azure/identity": "^2.0.4",
                 "@azure/keyvault-keys": "^4.4.0",
@@ -27544,6 +27676,7 @@
                 "bl": "^5.0.0",
                 "es-aggregate-error": "^1.0.8",
                 "iconv-lite": "^0.6.3",
+                "js-md4": "^0.3.2",
                 "jsbi": "^4.3.0",
                 "native-duplexpair": "^1.0.0",
                 "node-abort-controller": "^3.0.1",
@@ -27667,13 +27800,15 @@
             "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
         },
         "tough-cookie": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
-            "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
+            "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
+            "dev": true,
             "requires": {
                 "psl": "^1.1.33",
                 "punycode": "^2.1.1",
-                "universalify": "^0.1.2"
+                "universalify": "^0.2.0",
+                "url-parse": "^1.5.3"
             }
         },
         "tr46": {
@@ -27705,7 +27840,8 @@
         "tunnel": {
             "version": "0.0.6",
             "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
-            "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
+            "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+            "dev": true
         },
         "tunnel-agent": {
             "version": "0.6.0",
@@ -27828,9 +27964,10 @@
             "dev": true
         },
         "universalify": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-            "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+            "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+            "dev": true
         },
         "unpipe": {
             "version": "1.0.0",
@@ -27838,9 +27975,9 @@
             "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
         },
         "update-browserslist-db": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz",
-            "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==",
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
+            "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
             "dev": true,
             "requires": {
                 "escalade": "^3.1.1",
@@ -27856,6 +27993,16 @@
                 "punycode": "^2.1.0"
             }
         },
+        "url-parse": {
+            "version": "1.5.10",
+            "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+            "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+            "dev": true,
+            "requires": {
+                "querystringify": "^2.1.1",
+                "requires-port": "^1.0.0"
+            }
+        },
         "util-deprecate": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -27940,16 +28087,16 @@
             }
         },
         "vite": {
-            "version": "2.9.13",
-            "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.13.tgz",
-            "integrity": "sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==",
+            "version": "2.9.15",
+            "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz",
+            "integrity": "sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==",
             "dev": true,
             "requires": {
                 "esbuild": "^0.14.27",
                 "fsevents": "~2.3.2",
                 "postcss": "^8.4.13",
                 "resolve": "^1.22.0",
-                "rollup": "^2.59.0"
+                "rollup": ">=2.59.0 <2.78.0"
             }
         },
         "vite-plugin-compression": {
@@ -28120,56 +28267,12 @@
                 "nanoid": "3.1.31"
             },
             "dependencies": {
-                "@vue/reactivity": {
-                    "version": "3.2.37",
-                    "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz",
-                    "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==",
-                    "dev": true,
-                    "requires": {
-                        "@vue/shared": "3.2.37"
-                    }
-                },
-                "@vue/runtime-core": {
-                    "version": "3.2.37",
-                    "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz",
-                    "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==",
-                    "dev": true,
-                    "requires": {
-                        "@vue/reactivity": "3.2.37",
-                        "@vue/shared": "3.2.37"
-                    }
-                },
-                "@vue/runtime-dom": {
-                    "version": "3.2.37",
-                    "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz",
-                    "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==",
-                    "dev": true,
-                    "requires": {
-                        "@vue/runtime-core": "3.2.37",
-                        "@vue/shared": "3.2.37",
-                        "csstype": "^2.6.8"
-                    },
-                    "dependencies": {
-                        "csstype": {
-                            "version": "2.6.20",
-                            "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
-                            "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
-                            "dev": true
-                        }
-                    }
-                },
                 "csstype": {
                     "version": "3.0.10",
                     "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
                     "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==",
                     "dev": true
                 },
-                "lodash": {
-                    "version": "4.17.21",
-                    "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-                    "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-                    "dev": true
-                },
                 "nanoid": {
                     "version": "3.1.31",
                     "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz",
@@ -28350,6 +28453,19 @@
                     "requires": {
                         "follow-redirects": "^1.14.7"
                     }
+                },
+                "joi": {
+                    "version": "17.6.0",
+                    "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz",
+                    "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==",
+                    "dev": true,
+                    "requires": {
+                        "@hapi/hoek": "^9.0.0",
+                        "@hapi/topo": "^5.0.0",
+                        "@sideway/address": "^4.1.3",
+                        "@sideway/formula": "^3.0.0",
+                        "@sideway/pinpoint": "^2.0.0"
+                    }
                 }
             }
         },
@@ -28501,9 +28617,9 @@
             }
         },
         "ws": {
-            "version": "7.5.8",
-            "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz",
-            "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw=="
+            "version": "7.5.9",
+            "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+            "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="
         },
         "xml-name-validator": {
             "version": "3.0.0",
@@ -28511,20 +28627,6 @@
             "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
             "dev": true
         },
-        "xml2js": {
-            "version": "0.4.23",
-            "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
-            "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
-            "requires": {
-                "sax": ">=0.6.0",
-                "xmlbuilder": "~11.0.0"
-            }
-        },
-        "xmlbuilder": {
-            "version": "11.0.1",
-            "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-            "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
-        },
         "xmlchars": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -28574,9 +28676,9 @@
             },
             "dependencies": {
                 "yargs-parser": {
-                    "version": "21.0.1",
-                    "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
-                    "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==",
+                    "version": "21.1.1",
+                    "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+                    "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
                     "dev": true
                 }
             }

From 87e45b21fa883d9605abc2193f9803c9c1d688b0 Mon Sep 17 00:00:00 2001
From: max <max.09@outlook.com>
Date: Fri, 2 Sep 2022 10:45:59 +0200
Subject: [PATCH 103/803] [empty commit] pull request for French translation
 contribution

---
 src/languages/fr-FR.js | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 00abe8d3..b694b5bc 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -177,8 +177,16 @@ export default {
     "Add a monitor": "Ajouter une sonde",
     "Edit Status Page": "Modifier la page de statut",
     "Go to Dashboard": "Accéder au tableau de bord",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
+    "Status Page": "Page de statut",
+    "Status Pages": "Pages de statut",
+    "New Status Page": "Ajouter page de statut",
+    "Add New Status Page" : "Ajouter une page de statut",
+    "No status pages": "Aucune page de statut.",
+    "Accept characters:": "Caractères acceptés:",
+    startOrEndWithOnly: "Commence uniquement par {0}",
+    "No consecutive dashes": "Pas de double tirets",
+    "Next": "Continuer",
+    "Setup Proxy": "Configuer Proxy",
     defaultNotificationName: "Ma notification {notification} numéro ({number})",
     here: "ici",
     Required: "Requis",

From fd2df562b1786574676ca7438644416be7fe42e3 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 3 Sep 2022 18:37:31 +0800
Subject: [PATCH 104/803] Add checkout pr logic

---
 docker/dockerfile    |  6 +++---
 extra/checkout-pr.js | 11 +++++++++++
 package.json         |  3 ++-
 3 files changed, 16 insertions(+), 4 deletions(-)
 create mode 100644 extra/checkout-pr.js

diff --git a/docker/dockerfile b/docker/dockerfile
index 117c0f12..f23c630a 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -45,14 +45,14 @@ RUN rm -rf ./* && chown node /app
 
 USER node
 
-RUN git clone https://github.com/louislam/uptime-kuma.git .
+RUN git clone https://github.com/louislam/uptime-kuma.git \
+RUN gh pr checkout 2023
 RUN npm ci
 
 EXPOSE 3000 3001
 VOLUME ["/app/data"]
 HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
-ENTRYPOINT ["/usr/bin/dumb-init", "--", "extra/entrypoint.sh"]
-CMD ["npm", "run", "dev"]
+CMD ["npm", "run", "start-pr-test"]
 
 
 # Upload the artifact to Github
diff --git a/extra/checkout-pr.js b/extra/checkout-pr.js
new file mode 100644
index 00000000..64a9dbc1
--- /dev/null
+++ b/extra/checkout-pr.js
@@ -0,0 +1,11 @@
+const childProcess = require("child_process");
+
+if (!process.env.UPTIME_KUMA_PRUPTIME_KUMA_PR) {
+    console.error("Please set a pull request number to the environment variable 'UPTIME_KUMA_PRUPTIME_KUMA_PR'");
+    process.exit(1);
+}
+
+console.log("Checkout pr");
+
+// Checkout the pr
+childProcess.spawnSync("gh", [ "pr", "checkout", process.env.UPTIME_KUMA_PR ]);
diff --git a/package.json b/package.json
index df93281a..dbf036f1 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,8 @@
         "release-final": "node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js",
         "release-beta": "node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta .  --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts",
         "git-remove-tag": "git tag -d",
-        "build-dist-and-restart": "npm run build && npm run start-server-dev"
+        "build-dist-and-restart": "npm run build && npm run start-server-dev",
+        "start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev"
     },
     "dependencies": {
         "@louislam/sqlite3": "~15.0.6",

From ee14ab6751518b7fd82f361897b7efa8a4e77433 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Buchti=C4=8D?= <martin.buchta@gmail.com>
Date: Sun, 4 Sep 2022 09:43:07 +0200
Subject: [PATCH 105/803] Update cs-CZ.js

---
 src/languages/cs-CZ.js | 228 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 220 insertions(+), 8 deletions(-)

diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
index 1ad47fd3..b2b9331a 100644
--- a/src/languages/cs-CZ.js
+++ b/src/languages/cs-CZ.js
@@ -2,18 +2,21 @@ export default {
     languageName: "Czech",
     checkEverySecond: "Kontrolovat každých {0} sekund",
     retryCheckEverySecond: "Opakovat každých {0} sekund",
+    resendEveryXTimes: "Znovu zaslat {0}krát",
+    resendDisabled: "Opakované zasílání je vypnuté",
     retriesDescription: "Maximální počet pokusů před označením služby jako nedostupné a odesláním oznámení",
     ignoreTLSError: "Ignorovat TLS/SSL chyby na HTTPS stránkách",
     upsideDownModeDescription: "Pomocí této možnosti změníte způsob vyhodnocování stavu. Pokud je služba dosažitelná, je NEDOSTUPNÁ.",
     maxRedirectDescription: "Maximální počet přesměrování, která se mají následovat. Nastavením hodnoty 0 zakážete přesměrování.",
     acceptedStatusCodesDescription: "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
     passwordNotMatchMsg: "Hesla se neshodují",
-    notificationDescription: "Pro zajištění funkčnosti oznámení je nutné je přiřadit dohledu.",
+    notificationDescription: "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.",
     keywordDescription: "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
     pauseDashboardHome: "Pozastavit",
     deleteMonitorMsg: "Opravdu chcete odstranit tento dohled?",
     deleteNotificationMsg: "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
-    resolverserverDescription: "Cloudflare je výchozí server. Resolver server můžete kdykoli změnit.",
+    dnsPortDescription: "Port DNS serveru. Standardně běží na portu 53. V případě potřeby jej můžete kdykoli změnit.",
+    resolverserverDescription: "Cloudflare je výchozí server. V případě potřeby můžete Resolver server kdykoli změnit.",
     rrtypeDescription: "Vyberte typ záznamu o prostředku, který chcete monitorovat",
     pauseMonitorMsg: "Opravdu chcete dohled pozastavit?",
     enableDefaultNotificationDescription: "Toto oznámení bude standardně aktivní pro nové dohledy. V případě potřeby můžete oznámení stále zakázat na úrovni jednotlivých dohledů.",
@@ -70,7 +73,8 @@ export default {
     Port: "Port",
     "Heartbeat Interval": "Heartbeat interval",
     Retries: "Počet pokusů",
-    "Heartbeat Retry Interval": "Interval opakování prezenčního signálu",
+    "Heartbeat Retry Interval": "Interval opakování heartbeatu",
+    "Resend Notification if Down X times consequently": "Znovu zaslat oznámení, pokud je služba nedostupná Xkrát za sebou",
     Advanced: "Rozšířené",
     "Upside Down Mode": "Inverzní režim",
     "Max. Redirects": "Max. Přesměrování",
@@ -195,7 +199,7 @@ export default {
     "Chat ID": "ID chatu",
     supportTelegramChatID: "Podpora přímého chatu / skupiny / ID chatu kanálu",
     wayToGetTelegramChatID: "ID chatu můžete získat tak, že robotovi zašlete zprávu a přejdete na tuto adresu URL, kde zobrazíte chat_id:",
-    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+    "YOUR BOT TOKEN HERE": "SEM ZADEJTE TOKEN VAŠEHO CHATBOTA",
     chatIDNotFound: "ID chatu nebylo nalezeno; nejprve tomuto robotovi zašlete zprávu",
     webhook: "Webhook",
     "Post URL": "URL adresa příspěvku",
@@ -241,6 +245,7 @@ export default {
     "rocket.chat": "Rocket.Chat",
     pushover: "Pushover",
     pushy: "Pushy",
+    PushByTechulus: "Push by Techulus",
     octopush: "Octopush",
     promosms: "PromoSMS",
     clicksendsms: "ClickSend SMS",
@@ -301,15 +306,19 @@ export default {
     Body: "Tělo",
     Headers: "Hlavičky",
     PushUrl: "Push URL",
-    HeadersInvalidFormat: "The request headers are not valid JSON: ",
-    BodyInvalidFormat: "The request body is not valid JSON: ",
+    HeadersInvalidFormat: "Hlaviča žádosti není platný JSON: ",
+    BodyInvalidFormat: "Text žádosti není platný JSON: ",
     "Monitor History": "Historie dohledu",
     clearDataOlderThan: "Historie dohledu bude uchovávána po dobu {0} dní.",
     PasswordsDoNotMatch: "Hesla se neshodují.",
     records: "záznamů",
     "One record": "Jeden záznam",
-    steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
+    steamApiKeyDescription: "Pro monitorování Steam Game Servere je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
     "Current User": "Aktuálně přihlášený uživatel",
+    topic: "Topic",
+    topicExplanation: "MQTT topic, který chcete sledovat",
+    successMessage: "Zpráva o úspěchu",
+    successMessageExplanation: "MQTT zpráva považovaná za úspěšnou",
     recent: "Poslední",
     Done: "Hotovo",
     Info: "Informace",
@@ -327,6 +336,8 @@ export default {
     info: "informace",
     warning: "upozornění",
     danger: "riziko",
+    error: "chyba",
+    critical: "kritické",
     primary: "primární",
     light: "světlý",
     dark: "tmavý",
@@ -355,13 +366,214 @@ export default {
     serwersmsPhoneNumber: "Telefonní číslo",
     serwersmsSenderName: "Odesílatel SMS (registrováno prostřednictvím zákaznického portálu)",
     "stackfield": "Stackfield",
+    Customize: "Přizpůsobit",
+    "Custom Footer": "Vlastní patička",
+    "Custom CSS": "Vlastní CSS",
     smtpDkimSettings: "Nastavení DKIM",
     smtpDkimDesc: "Informace o použití naleznete v {0} Nodemailer DKIM.",
     documentation: "dokumentaci",
     smtpDkimDomain: "Název domény",
-    smtpDkimKeySelector: "Selector klíče",
+    smtpDkimKeySelector: "Selektor klíče",
     smtpDkimPrivateKey: "Privátní klíč",
     smtpDkimHashAlgo: "Hashovací algoritmus (volitelné)",
     smtpDkimheaderFieldNames: "Podepisovat tyto hlavičky (volitelné)",
     smtpDkimskipFields: "Nepodepisovat tyto hlavičky (volitelné)",
+    wayToGetPagerDutyKey: "Získat jej můžete v sekci Service -> Service Directory -> (vyberte službu) -> Integrations -> Add integration. Následně vyhledejte \"Events API V2\". Více informace naleznete na adrese {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
+    "do nothing": "do nothing",
+    "auto acknowledged": "auto acknowledged",
+    "auto resolve": "auto resolve",
+    gorush: "Gorush",
+    alerta: "Alerta",
+    alertaApiEndpoint: "API Endpoint",
+    alertaEnvironment: "Prostředí",
+    alertaApiKey: "API Key",
+    alertaAlertState: "Stav upozornění",
+    alertaRecoverState: "Stav obnovení",
+    deleteStatusPageMsg: "Opravdu chcete odstranit tuto stavovou stránku?",
+    Proxies: "Proxy",
+    default: "Výchozí",
+    enabled: "Zapnuto",
+    setAsDefault: "Nastavit jako výchozí",
+    deleteProxyMsg: "Opravdu chcete odstranit tuto proxy ze všech dohledů?",
+    proxyDescription: "Pro zajištění funkčnosti musí být proxy přiřazena dohledům.",
+    enableProxyDescription: "Tato proxy neovlivní žádosti dohledu do doby, než ji aktivujete. Změnou tohoto nastavení dočasně zakážete použití proxy ve všech dohledech.",
+    setAsDefaultProxyDescription: "Tato proxy se použije pro všechny nové dohledy. V případě potřeby můžete její využívání zakázat v konkrétním dohledu.",
+    "Certificate Chain": "Řetězec certifikátu",
+    Valid: "Platný",
+    Invalid: "Neplatný",
+    AccessKeyId: "AccessKey ID",
+    SecretAccessKey: "AccessKey Secret",
+    PhoneNumbers: "PhoneNumbers",
+    TemplateCode: "TemplateCode",
+    SignName: "SignName",
+    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    WebHookUrl: "WebHookUrl",
+    SecretKey: "SecretKey",
+    "For safety, must use secret key": "Z důvodu bezpečnosti použijte secret key",
+    "Device Token": "Token zařízení",
+    Platform: "Platforma",
+    iOS: "iOS",
+    Android: "Android",
+    Huawei: "Huawei",
+    High: "Vysoký",
+    Retry: "Opakovat",
+    Topic: "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Setup Proxy",
+    "Proxy Protocol": "Proxy Protocol",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server vyžaduje ověření",
+    User: "Uživatel",
+    Installed: "Nainstalováno",
+    "Not installed": "Nenainstalováno",
+    Running: "Běží",
+    "Not running": "Neběží",
+    "Remove Token": "Odstranit token",
+    Start: "Spustit",
+    Stop: "Zastavit",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Přidat novou stavovou stránku",
+    Slug: "Slug",
+    "Accept characters:": "Přípustné znaky:",
+    startOrEndWithOnly: "Počáteční a koncový znak může být pouze {0}",
+    "No consecutive dashes": "Nesmí se opakovat pomlčky",
+    Next: "Další",
+    "The slug is already taken. Please choose another slug.": "Slug s tímto názvem již existuje. Prosím, zadejte jiný název.",
+    "No Proxy": "Žádná proxy",
+    Authentication: "Ověření",
+    "HTTP Basic Auth": "HTTP Basic ověření",
+    "New Status Page": "Nová stavová stránka",
+    "Page Not Found": "Stránka nenalezena",
+    "Reverse Proxy": "Reverzní proxy",
+    Backup: "Záloha",
+    About: "O programu",
+    wayToGetCloudflaredURL: "(Stáhnout cloudflared z {0})",
+    cloudflareWebsite: "Webová stránka Cloudflare",
+    "Message:": "Zpráva:",
+    "Don't know how to get the token? Please read the guide:": "Nevíte jak získat? Prosím, přečtěte si tuto příručku:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Stávající připojení mohlo být ztraceno, pokud jste připojeni prostřednictvím Cloudflare tunelu. Opravdu jej chcete zastavit? Pro potvrzení zadejte své současné heslo.",
+    "HTTP Headers": "HTTP hlavičky",
+    "Trust Proxy": "Důvěryhodná proxy",
+    "Other Software": "Jiný software",
+    "For example: nginx, Apache and Traefik.": "Například nginx, Apache nebo Traefik.",
+    "Please read": "Prosím, přečtěte si informace na adrese",
+    "Subject:": "Předmět:",
+    "Valid To:": "Platnost do:",
+    "Days Remaining:": "Počet zbývajících dní:",
+    "Issuer:": "Vydavatel:",
+    "Fingerprint:": "Otisk:",
+    "No status pages": "Žádná stavová stránka",
+    "Domain Name Expiry Notification": "Oznámení na blížící se konec platnosti doménového jména",
+    Proxy: "Proxy",
+    "Date Created": "Datum vytvoření",
+    HomeAssistant: "Home Assistant",
+    onebotHttpAddress: "OneBot HTTP adresa",
+    onebotMessageType: "Typ OneBot zprávy",
+    onebotGroupMessage: "Skupinová",
+    onebotPrivateMessage: "Soukromá",
+    onebotUserOrGroupId: "ID skupiny/uživatele",
+    onebotSafetyTips: "Z důvodu bezpečnosti je nutné zadat přístupový token",
+    "PushDeer Key": "PushDeer klíč",
+    "Footer Text": "Text v patičce",
+    "Show Powered By": "Zobrazit \"Zajišťuje\"",
+    "Domain Names": "Názvy domén",
+    signedInDisp: "Přihlášen jako {0}",
+    signedInDispDisabled: "Ověření je vypnuté.",
+    RadiusSecret: "Radius Secret",
+    RadiusSecretDescription: "Sdílený tajný klíč mezi klientem a serverem",
+    RadiusCalledStationId: "ID volaného zařízení",
+    RadiusCalledStationIdDescription: "Identifikátor volaného zařízení",
+    RadiusCallingStationId: "ID volajícího zařízení",
+    RadiusCallingStationIdDescription: "Identifikátor volajícího zařízení",
+    "Certificate Expiry Notification": "Oznámení na blížící se konec platnosti certifikátu",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "Číslo příjemce",
+    "From Name/Number": "Jméno/číslo odesílatele",
+    "Leave blank to use a shared sender number.": "Ponechte prázdné, pokud chcete použít číslo sdíleného příjemce.",
+    "Octopush API Version": "Octopush API verze",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "endpoint",
+    octopushAPIKey: "\"API key\" ze sekce HTTP API credentials na nástěnce",
+    octopushLogin: "\"Login\" ze sekce HTTP API credentials na nástěnce",
+    promosmsLogin: "API Login Name",
+    promosmsPassword: "API Password",
+    "pushoversounds pushover": "Pushover (výchozí)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (dlouhý)",
+    "pushoversounds climb": "Climb (dlouhý)",
+    "pushoversounds persistent": "Persistent (dlouhý)",
+    "pushoversounds echo": "Pushover Echo (dlouhý)",
+    "pushoversounds updown": "Up Down (dlouhý)",
+    "pushoversounds vibrate": "Pouze vibrace",
+    "pushoversounds none": "Žádný (ticho)",
+    pushyAPIKey: "Secret API Key",
+    pushyToken: "Token zařízení",
+    "Show update if available": "Zobrazit aktualizace, pokud jsou k dispozici",
+    "Also check beta release": "Kontrolovat také dostupnost beta verzí",
+    "Using a Reverse Proxy?": "Používáte reverzní proxy??",
+    "Check how to config it for WebSocket": "Zjistěte, jak ji nakonfigurovat pro WebSockety",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Nejčastější důvody:",
+    "The resource is no longer available.": "Zdroj již není k dispozici.",
+    "There might be a typing error in the address.": "Při zadávání adresy jste udělali chybu.",
+    "What you can try:": "Co můžete vyzkoušet:",
+    "Retype the address.": "Znovu zadat adresu.",
+    "Go back to the previous page.": "Vrátit se na předchozí stránku.",
+    "Coming Soon": "Připravujeme",
+    wayToGetClickSendSMSToken: "API Username a API Key získáte na adrese {0} .",
+    "Connection String": "Connection String",
+    Query: "Dotaz",
+    settingsCertificateExpiry: "Platnost TLS certifikátu",
+    certificationExpiryDescription: "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TSL certifikátu vyprší za:",
+    "Setup Docker Host": "Nastavit Docker hostitele",
+    "Connection Type": "Typ připojení",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "Opravdu chcete odstranit tohoto docker hostitele ze všech dohledů?",
+    socket: "Socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker kontejner",
+    "Container Name / ID": "ID / název kontejneru",
+    "Docker Host": "Docker hostitel",
+    "Docker Hosts": "Docker hostitelé",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Doména",
+    "Workstation": "Pracovní stanice",
+    disableCloudflaredNoAuthMsg: "Používáte režim bez ověření, heslo není vyžadováno.",
+    trustProxyDescription: "Důvěřovat 'X-Forwarded-*' hlavičkám. Pokud chcete získat správnou IP adresu klientů a vaše instance Uptime Kuma je schována za Nginx nebo Apache, měli byste tuto možnost zapnout.",
+    wayToGetLineNotifyToken: "Přístupový token můžete získat na adrese {0}",
+    Examples: "Příklady",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Dlouhodobý přístupový token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Pro vytvoření dlouhodobého přístupový tokenu klikněte na název svého profilu (v levém dolním rohu) a následně v dolní části stránky klikněte na tlačítko Create Token. ",
+    "Notification Service": "Oznamovací služba",
+    "default: notify all devices": "výchozí: upozornit všechny zařízení",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Seznam dostupných oznamovacích služeb naleznete v Home Assistant v sekci \"Developer Tools > Services\", kde vyhledejte \"notification\" pro zjištění názvu zařízení.",
+    "Automations can optionally be triggered in Home Assistant:": "Automatizaci můžete volitelně aktivovat prostřednictvím Home Assistant:",
+    "Trigger type:": "Typ podmínky spuštění:",
+    "Event type:": "Typ události:",
+    "Event data:": "Data události:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Následně vyberte akci, například přepnutí scény z RGB světla na červenou.",
+    "Frontend Version": "Verze frontendu",
+    "Frontend Version do not match backend version!": "Verze frontendu neodpovídá verzi backendu!",
 };

From 53135641f3b5c9454194bea34425660bc8902e44 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 5 Sep 2022 17:42:23 +0800
Subject: [PATCH 106/803] Fix

---
 docker/dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docker/dockerfile b/docker/dockerfile
index f23c630a..2938a52f 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -45,7 +45,7 @@ RUN rm -rf ./* && chown node /app
 
 USER node
 
-RUN git clone https://github.com/louislam/uptime-kuma.git \
+RUN git clone https://github.com/louislam/uptime-kuma.git
 RUN gh pr checkout 2023
 RUN npm ci
 

From cf10e26affea94130750dbd21e524f6ac8192461 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 5 Sep 2022 17:43:42 +0800
Subject: [PATCH 107/803] Update to 1.18.0

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

diff --git a/package.json b/package.json
index 981ca191..696bac11 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.0-beta.0",
+    "version": "1.18.0",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -39,7 +39,7 @@
         "build-docker-nightly-alpine": "docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly-alpine --target nightly . --push",
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.17.1 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.18.0 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 7d12cd0d42abc651ad21644b1556edbd7be81052 Mon Sep 17 00:00:00 2001
From: cyril59310 <archas.cyril@hotmail.fr>
Date: Mon, 5 Sep 2022 20:21:46 +0200
Subject: [PATCH 108/803] Update Fr language

---
 src/languages/fr-FR.js | 821 +++++++++++++++++++++++++++--------------
 1 file changed, 540 insertions(+), 281 deletions(-)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index b694b5bc..f7c8dd07 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -1,320 +1,579 @@
 export default {
-    languageName: "Français",
-    checkEverySecond: "Vérifier toutes les {0} secondes",
-    retryCheckEverySecond: "Réessayer toutes les {0} secondes.",
+    languageName: 'Français',
+    checkEverySecond: 'Vérifier toutes les {0} secondes',
+    retryCheckEverySecond: 'Réessayer toutes les {0} secondes.',
     retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.",
-    ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS",
-    upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors-ligne et vice-versa.",
-    maxRedirectDescription: "Nombre maximal de redirections avant que le service soit noté hors-ligne.",
-    acceptedStatusCodesDescription: "Codes HTTP considérés comme en ligne",
-    passwordNotMatchMsg: "Les mots de passe ne correspondent pas",
+    ignoreTLSError: 'Ignorer les erreurs liées au certificat SSL/TLS',
+    upsideDownModeDescription: 'Si le service est en ligne, il sera alors noté hors-ligne et vice-versa.',
+    maxRedirectDescription: 'Nombre maximal de redirections avant que le service soit noté hors-ligne.',
+    acceptedStatusCodesDescription: 'Codes HTTP considérés comme en ligne',
+    passwordNotMatchMsg: 'Les mots de passe ne correspondent pas',
     notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
-    keywordDescription: "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
-    pauseDashboardHome: "En pause",
-    deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
+    keywordDescription: 'Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.',
+    pauseDashboardHome: 'En pause',
+    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.",
-    resolverserverDescription: "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
+    resolverserverDescription: 'Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.',
     rrtypeDescription: "Veuillez sélectionner un type d'enregistrement DNS",
-    pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
-    enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
-    clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
-    clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
-    confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
+    pauseMonitorMsg: 'Êtes-vous sûr de vouloir mettre en pause cette sonde ?',
+    enableDefaultNotificationDescription: 'Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.',
+    clearEventsMsg: 'Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?',
+    clearHeartbeatsMsg: 'Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?',
+    confirmClearStatisticsMsg: 'Êtes-vous sûr de vouloir supprimer toutes les statistiques ?',
     importHandleDescription: "Choisissez 'Ignorer l'existant' si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option 'Écraser' supprime toutes les sondes et notifications existantes.",
     confirmImportMsg: "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
-    twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
-    tokenValidSettingsMsg: "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres 2FA.",
-    confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer le 2FA ?",
-    confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?",
-    Settings: "Paramètres",
-    Dashboard: "Tableau de bord",
-    "New Update": "Mise à jour disponible",
-    Language: "Langue",
-    Appearance: "Apparence",
-    Theme: "Thème",
-    General: "Général",
-    Version: "Version",
-    "Check Update On GitHub": "Consulter les mises à jour sur Github",
-    List: "Lister",
-    Add: "Ajouter",
-    "Add New Monitor": "Ajouter une nouvelle sonde",
-    "Quick Stats": "Résumé",
-    Up: "En ligne",
-    Down: "Hors ligne",
-    Pending: "En attente",
-    Unknown: "Inconnu",
-    Pause: "En Pause",
-    Name: "Nom",
-    Status: "État",
-    DateTime: "Heure",
-    Message: "Messages",
-    "No important events": "Pas d'évènements important",
-    Resume: "Reprendre",
-    Edit: "Modifier",
-    Delete: "Supprimer",
-    Current: "Actuellement",
-    Uptime: "Uptime",
-    "Cert Exp.": "Expiration SSL",
-    day: "jour | jours",
-    "-day": "-jours",
-    hour: "-heure",
-    "-hour": "-heures",
-    Response: "Temps de réponse",
-    Ping: "Ping",
-    "Monitor Type": "Type de Sonde",
-    Keyword: "Mot-clé",
-    "Friendly Name": "Nom d'affichage",
-    URL: "URL",
+    twoFAVerifyLabel: 'Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.',
+    tokenValidSettingsMsg: 'Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres 2FA.',
+    confirmEnableTwoFAMsg: 'Êtes-vous sûr de vouloir activer le 2FA ?',
+    confirmDisableTwoFAMsg: 'Êtes-vous sûr de vouloir désactiver le 2FA ?',
+    Settings: 'Paramètres',
+    Dashboard: 'Tableau de bord',
+    'New Update': 'Mise à jour disponible',
+    Language: 'Langue',
+    Appearance: 'Apparence',
+    Theme: 'Thème',
+    General: 'Général',
+    Version: 'Version',
+    'Check Update On GitHub': 'Consulter les mises à jour sur Github',
+    List: 'Lister',
+    Add: 'Ajouter',
+    'Add New Monitor': 'Ajouter une nouvelle sonde',
+    'Quick Stats': 'Résumé',
+    Up: 'En ligne',
+    Down: 'Hors ligne',
+    Pending: 'En attente',
+    Unknown: 'Inconnu',
+    Pause: 'En Pause',
+    Name: 'Nom',
+    Status: 'État',
+    DateTime: 'Heure',
+    Message: 'Messages',
+    'No important events': "Pas d'évènements important",
+    Resume: 'Reprendre',
+    Edit: 'Modifier',
+    Delete: 'Supprimer',
+    Current: 'Actuellement',
+    Uptime: 'Uptime',
+    'Cert Exp.': 'Expiration SSL',
+    day: 'jour | jours',
+    '-day': '-jours',
+    hour: '-heure',
+    '-hour': '-heures',
+    Response: 'Temps de réponse',
+    Ping: 'Ping',
+    'Monitor Type': 'Type de Sonde',
+    Keyword: 'Mot-clé',
+    'Friendly Name': "Nom d'affichage",
+    URL: 'URL',
     Hostname: "Nom d'hôte / adresse IP",
-    Port: "Port",
-    "Heartbeat Interval": "Intervalle de vérification",
-    Retries: "Essais",
-    "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
-    Advanced: "Avancé",
-    "Upside Down Mode": "Mode inversé",
-    "Max. Redirects": "Nombre maximum de redirections",
-    "Accepted Status Codes": "Codes HTTP acceptés",
-    Save: "Sauvegarder",
-    Notifications: "Notifications",
-    "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 surveillés",
-    Normal: "Normal",
-    Bottom: "En dessous",
-    None: "Aucun",
-    Timezone: "Fuseau Horaire",
-    "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": "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",
-    "Update Password": "Mettre à jour le mot de passe",
-    "Disable Auth": "Désactiver l'authentification",
-    "Enable Auth": "Activer l'authentification",
-    Logout: "Se déconnecter",
-    Leave: "Quitter",
-    "I understand, please disable": "Je comprends, désactivez-le",
-    Confirm: "Confirmer",
-    Yes: "Oui",
-    No: "Non",
+    Port: 'Port',
+    'Heartbeat Interval': 'Intervalle de vérification',
+    Retries: 'Essais',
+    'Heartbeat Retry Interval': "Réessayer l'intervalle de vérification",
+    Advanced: 'Avancé',
+    'Upside Down Mode': 'Mode inversé',
+    'Max. Redirects': 'Nombre maximum de redirections',
+    'Accepted Status Codes': 'Codes HTTP acceptés',
+    Save: 'Sauvegarder',
+    Notifications: 'Notifications',
+    '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 surveillés',
+    Normal: 'Normal',
+    Bottom: 'En dessous',
+    None: 'Aucun',
+    Timezone: 'Fuseau Horaire',
+    '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': "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',
+    'Update Password': 'Mettre à jour le mot de passe',
+    'Disable Auth': "Désactiver l'authentification",
+    'Enable Auth': "Activer l'authentification",
+    Logout: 'Se déconnecter',
+    Leave: 'Quitter',
+    'I understand, please disable': 'Je comprends, désactivez-le',
+    Confirm: 'Confirmer',
+    Yes: 'Oui',
+    No: 'Non',
     Username: "Nom d'utilisateur",
-    Password: "Mot de passe",
-    "Remember me": "Se souvenir de moi",
-    Login: "Se connecter",
-    "No Monitors, please": "Pas de sondes, veuillez",
-    "add one": "en ajouter une",
-    "Notification Type": "Type de notification",
-    Email: "Email",
-    Test: "Tester",
-    "Certificate Info": "Informations sur le certificat SSL",
-    "Resolver Server": "Serveur DNS utilisé",
-    "Resource Record Type": "Type d'enregistrement DNS recherché",
-    "Last Result": "Dernier résultat",
-    "Create your admin account": "Créez votre compte administrateur",
-    "Repeat Password": "Répéter le mot de passe",
-    "Import Backup": "Importation de la sauvegarde",
-    "Export Backup": "Exportation de la sauvegarde",
-    Export: "Exporter",
-    Import: "Importer",
-    respTime: "Temps de réponse (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Activé par défaut",
-    "Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
-    Create: "Créer",
-    "Clear Data": "Effacer les données",
-    Events: "Evénements",
-    Heartbeats: "Vérifications",
-    "Auto Get": "Récuperer automatiquement",
-    backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
+    Password: 'Mot de passe',
+    'Remember me': 'Se souvenir de moi',
+    Login: 'Se connecter',
+    'No Monitors, please': 'Pas de sondes, veuillez',
+    'add one': 'en ajouter une',
+    'Notification Type': 'Type de notification',
+    Email: 'Email',
+    Test: 'Tester',
+    'Certificate Info': 'Informations sur le certificat SSL',
+    'Resolver Server': 'Serveur DNS utilisé',
+    'Resource Record Type': "Type d'enregistrement DNS recherché",
+    'Last Result': 'Dernier résultat',
+    'Create your admin account': 'Créez votre compte administrateur',
+    'Repeat Password': 'Répéter le mot de passe',
+    'Import Backup': 'Importation de la sauvegarde',
+    'Export Backup': 'Exportation de la sauvegarde',
+    Export: 'Exporter',
+    Import: 'Importer',
+    respTime: 'Temps de réponse (ms)',
+    notAvailableShort: 'N/A',
+    'Default enabled': 'Activé par défaut',
+    'Apply on all existing monitors': 'Appliquer sur toutes les sondes existantes',
+    Create: 'Créer',
+    'Clear Data': 'Effacer les données',
+    Events: 'Evénements',
+    Heartbeats: 'Vérifications',
+    'Auto Get': 'Récuperer automatiquement',
+    backupDescription: 'Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.',
     backupDescription2: "PS : Les données relatives à l'historique et aux événements ne sont pas incluses.",
     backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
-    alertNoFile: "Veuillez sélectionner un fichier à importer.",
-    alertWrongFileType: "Veuillez sélectionner un fichier JSON à importer.",
-    "Clear all statistics": "Effacer toutes les statistiques",
-    "Skip existing": "Sauter l'existant",
-    Overwrite: "Ecraser",
-    Options: "Options",
-    "Keep both": "Garder les deux",
-    "Verify Token": "Vérifier le jeton",
-    "Setup 2FA": "Configurer 2FA",
-    "Enable 2FA": "Activer 2FA",
-    "Disable 2FA": "Désactiver 2FA",
-    "2FA Settings": "Paramètres 2FA",
-    "Two Factor Authentication": "Authentification à deux facteurs",
-    Active: "Actif",
-    Inactive: "Inactif",
-    Token: "Jeton",
-    "Show URI": "Afficher l'URI",
-    Tags: "Étiquettes",
-    "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici...",
-    "Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
-    "Tag with this value already exist.": "Une étiquette avec cette valeur existe déjà.",
-    color: "Couleur",
-    "value (optional)": "Valeur (facultatif)",
-    Gray: "Gris",
-    Red: "Rouge",
-    Orange: "Orange",
-    Green: "Vert",
-    Blue: "Bleu",
-    Indigo: "Indigo",
-    Purple: "Violet",
-    Pink: "Rose",
-    "Search...": "Rechercher...",
-    "Avg. Ping": "Ping moyen",
-    "Avg. Response": "Réponse moyenne",
-    "Entry Page": "Page d'accueil",
-    statusPageNothing: "Rien ici, veuillez ajouter un groupe ou une sonde.",
-    "No Services": "Aucun service",
-    "All Systems Operational": "Tous les systèmes sont opérationnels",
-    "Partially Degraded Service": "Service partiellement dégradé",
-    "Degraded Service": "Service dégradé",
-    "Add Group": "Ajouter un groupe",
-    "Add a monitor": "Ajouter une sonde",
-    "Edit Status Page": "Modifier la page de statut",
-    "Go to Dashboard": "Accéder au tableau de bord",
-    "Status Page": "Page de statut",
-    "Status Pages": "Pages de statut",
-    "New Status Page": "Ajouter page de statut",
-    "Add New Status Page" : "Ajouter une page de statut",
-    "No status pages": "Aucune page de statut.",
-    "Accept characters:": "Caractères acceptés:",
-    startOrEndWithOnly: "Commence uniquement par {0}",
-    "No consecutive dashes": "Pas de double tirets",
-    "Next": "Continuer",
-    "Setup Proxy": "Configuer Proxy",
-    defaultNotificationName: "Ma notification {notification} numéro ({number})",
-    here: "ici",
-    Required: "Requis",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.",
-    "Chat ID": "Chat ID",
+    alertNoFile: 'Veuillez sélectionner un fichier à importer.',
+    alertWrongFileType: 'Veuillez sélectionner un fichier JSON à importer.',
+    'Clear all statistics': 'Effacer toutes les statistiques',
+    'Skip existing': "Sauter l'existant",
+    Overwrite: 'Ecraser',
+    Options: 'Options',
+    'Keep both': 'Garder les deux',
+    'Verify Token': 'Vérifier le jeton',
+    'Setup 2FA': 'Configurer 2FA',
+    'Enable 2FA': 'Activer 2FA',
+    'Disable 2FA': 'Désactiver 2FA',
+    '2FA Settings': 'Paramètres 2FA',
+    'Two Factor Authentication': 'Authentification à deux facteurs',
+    Active: 'Actif',
+    Inactive: 'Inactif',
+    Token: 'Jeton',
+    'Show URI': "Afficher l'URI",
+    Tags: 'Étiquettes',
+    'Add New below or Select...': 'Ajoutez-en un en dessous ou sélectionnez-le ici...',
+    'Tag with this name already exist.': 'Une étiquette portant ce nom existe déjà.',
+    'Tag with this value already exist.': 'Une étiquette avec cette valeur existe déjà.',
+    color: 'Couleur',
+    'value (optional)': 'Valeur (facultatif)',
+    Gray: 'Gris',
+    Red: 'Rouge',
+    Orange: 'Orange',
+    Green: 'Vert',
+    Blue: 'Bleu',
+    Indigo: 'Indigo',
+    Purple: 'Violet',
+    Pink: 'Rose',
+    'Search...': 'Rechercher...',
+    'Avg. Ping': 'Ping moyen',
+    'Avg. Response': 'Réponse moyenne',
+    'Entry Page': "Page d'accueil",
+    statusPageNothing: 'Rien ici, veuillez ajouter un groupe ou une sonde.',
+    'No Services': 'Aucun service',
+    'All Systems Operational': 'Tous les systèmes sont opérationnels',
+    'Partially Degraded Service': 'Service partiellement dégradé',
+    'Degraded Service': 'Service dégradé',
+    'Add Group': 'Ajouter un groupe',
+    'Add a monitor': 'Ajouter une sonde',
+    'Edit Status Page': 'Modifier la page de statut',
+    'Go to Dashboard': 'Accéder au tableau de bord',
+    'Status Page': 'Page de statut',
+    'Status Pages': 'Pages de statut',
+    'New Status Page': 'Ajouter page de statut',
+    'Add New Status Page': 'Ajouter une page de statut',
+    'No status pages': 'Aucune page de statut.',
+    'Accept characters:': 'Caractères acceptés:',
+    startOrEndWithOnly: 'Commence uniquement par {0}',
+    'No consecutive dashes': 'Pas de double tirets',
+    Next: 'Continuer',
+    'Setup Proxy': 'Configuer Proxy',
+    defaultNotificationName: 'Ma notification {notification} numéro ({number})',
+    here: 'ici',
+    Required: 'Requis',
+    telegram: 'Telegram',
+    'Bot Token': 'Bot Token',
+    wayToGetTelegramToken: 'Vous pouvez obtenir un token depuis {0}.',
+    'Chat ID': 'Chat ID',
     supportTelegramChatID: "Supporte les messages privés / en groupe / l'ID du salon",
     wayToGetTelegramChatID: "Vous pouvez obtenir l'ID du chat en envoyant un message avec le bot puis en récupérant l'URL pour voir l'ID du salon :",
-    "YOUR BOT TOKEN HERE": "VOTRE TOKEN BOT ICI",
-    chatIDNotFound: "ID du salon introuvable, envoyez un message via le bot avant",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} est bien/bon pour tous les serveurs HTTP modernes comme express.js",
-    webhookFormDataDesc: "{multipart} est bien/bon pour du PHP, vous avez juste besoin de mettre le json via/depuis {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "Aucun/STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignorer les erreurs TLS",
-    "From Email": "Depuis l'Email",
-    "To Email": "Vers l'Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
+    'YOUR BOT TOKEN HERE': 'VOTRE TOKEN BOT ICI',
+    chatIDNotFound: 'ID du salon introuvable, envoyez un message via le bot avant',
+    webhook: 'Webhook',
+    'Post URL': 'Post URL',
+    'Content Type': 'Content Type',
+    webhookJsonDesc: '{0} est bien/bon pour tous les serveurs HTTP modernes comme express.js',
+    webhookFormDataDesc: '{multipart} est bien/bon pour du PHP, vous avez juste besoin de mettre le json via/depuis {decodeFunction}',
+    smtp: 'Email (SMTP)',
+    secureOptionNone: 'Aucun/STARTTLS (25, 587)',
+    secureOptionTLS: 'TLS (465)',
+    'Ignore TLS Error': 'Ignorer les erreurs TLS',
+    'From Email': "Depuis l'Email",
+    'To Email': "Vers l'Email",
+    smtpCC: 'CC',
+    smtpBCC: 'BCC',
+    discord: 'Discord',
+    'Discord Webhook URL': 'Discord Webhook URL',
     wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans 'Paramètres du Serveur' -> 'Intégrations' -> 'Créer un Webhook'",
-    "Bot Display Name": "Nom du bot (affiché)",
-    "Prefix Custom Message": "Prefixe du message personnalisé",
-    "Hello @everyone is...": "Bonjour {'@'}everyone il...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Vous pouvez apprendre comment créer un Webhook {0}.",
-    signal: "Signal",
-    Number: "Numéro",
-    Recipients: "Destinataires",
+    'Bot Display Name': 'Nom du bot (affiché)',
+    'Prefix Custom Message': 'Prefixe du message personnalisé',
+    'Hello @everyone is...': "Bonjour {'@'}everyone il...",
+    teams: 'Microsoft Teams',
+    'Webhook URL': 'Webhook URL',
+    wayToGetTeamsURL: 'Vous pouvez apprendre comment créer un Webhook {0}.',
+    signal: 'Signal',
+    Number: 'Numéro',
+    Recipients: 'Destinataires',
     needSignalAPI: "Vous avez besoin d'un client Signal avec l'API REST.",
     wayToCheckSignalURL: "Vous pouvez regarder l'URL sur comment le mettre en place :",
-    signalImportant: "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
-    gotify: "Gotify",
-    "Application Token": "Application Token",
-    "Server URL": "Server URL",
-    Priority: "Priorité",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Nom du salon",
-    "Uptime Kuma URL": "Uptime Kuma URL",
+    signalImportant: 'IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !',
+    gotify: 'Gotify',
+    'Application Token': 'Application Token',
+    'Server URL': 'Server URL',
+    Priority: 'Priorité',
+    slack: 'Slack',
+    'Icon Emoji': 'Icon Emoji',
+    'Channel Name': 'Nom du salon',
+    'Uptime Kuma URL': 'Uptime Kuma URL',
     aboutWebhooks: "Plus d'informations sur les Webhooks ici : {0}",
     aboutChannelName: "Mettez le nom du salon dans {0} dans 'Channel Name' si vous voulez bypass le salon Webhook. Ex : #autre-salon",
     aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
-    emojiCheatSheet: "Aide emoji : {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Clé d'utilisateur",
-    Device: "Appareil",
-    "Message Title": "Titre du message",
-    "Notification Sound": "Son de notification",
-    "More info on:": "Plus d'informations sur : {0}",
+    emojiCheatSheet: 'Aide emoji : {0}',
+    'rocket.chat': 'Rocket.chat',
+    pushover: 'Pushover',
+    pushy: 'Pushy',
+    octopush: 'Octopush',
+    promosms: 'PromoSMS',
+    lunasea: 'LunaSea',
+    apprise: 'Apprise (Prend en charge plus de 50 services de notification)',
+    pushbullet: 'Pushbullet',
+    line: 'Line Messenger',
+    mattermost: 'Mattermost',
+    'User Key': "Clé d'utilisateur",
+    Device: 'Appareil',
+    'Message Title': 'Titre du message',
+    'Notification Sound': 'Son de notification',
+    'More info on:': "Plus d'informations sur : {0}",
     pushoverDesc1: "Priorité d'urgence (2) a par défaut 30 secondes de délai dépassé entre les tentatives et expierera après 1 heure.",
     pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ 'Device'.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Rapide - recommandé pour les alertes)",
+    'SMS Type': 'SMS Type',
+    octopushTypePremium: 'Premium (Rapide - recommandé pour les alertes)',
     octopushTypeLowCost: "À bas prix (Lent, bloqué de temps en temps par l'opérateur)",
-    "Check octopush prices": "Vérifier les prix d'octopush {0}.",
-    octopushPhoneNumber: "Numéro de téléphone (format int., ex : +33612345678) ",
+    'Check octopush prices': "Vérifier les prix d'octopush {0}.",
+    octopushPhoneNumber: 'Numéro de téléphone (format int., ex : +33612345678) ',
     octopushSMSSender: "Nom de l'envoyer : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Exemple : {0}",
-    "Read more:": "En savoir plus : {0}",
-    "Status:": "Status : {0}",
-    "Read more": "En savoir plus",
-    appriseInstalled: "Apprise est installé.",
+    'LunaSea Device ID': 'LunaSea Device ID',
+    'Apprise URL': 'Apprise URL',
+    'Example:': 'Exemple : {0}',
+    'Read more:': 'En savoir plus : {0}',
+    'Status:': 'Status : {0}',
+    'Read more': 'En savoir plus',
+    appriseInstalled: 'Apprise est installé.',
     appriseNotInstalled: "Apprise n'est pas installé. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Token d'accès au canal",
-    "Line Developers Console": "Ligne console de développeurs",
-    lineDevConsoleTo: "Ligne console de développeurs - {0}",
-    "Basic Settings": "Paramètres de base",
-    "User ID": "Identifiant utilisateur",
-    "Messaging API": "Messaging API",
+    'Access Token': "Token d'accès",
+    'Channel access token': "Token d'accès au canal",
+    'Line Developers Console': 'Ligne console de développeurs',
+    lineDevConsoleTo: 'Ligne console de développeurs - {0}',
+    'Basic Settings': 'Paramètres de base',
+    'User ID': 'Identifiant utilisateur',
+    'Messaging API': 'Messaging API',
     wayToGetLineChannelToken: "Premièrement accéder à {0}, créez un Provider et un Salon (Messaging API), puis vous pourrez avoir le Token d'accès du salon ainsi que l'Identifiant utilisateur depuis le même menu.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Vous pouvez mettre un lien vers l'image dans \"Icon URL\" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.",
-    aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ \"Channel Name\". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex : #autre-salon",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - Pas cher mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.",
+    'Icon URL': 'Icon URL',
+    aboutIconURL: `Vous pouvez mettre un lien vers l'image dans "Icon URL" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.`,
+    aboutMattermostChannelName: `Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ "Channel Name". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex : #autre-salon`,
+    matrix: 'Matrix',
+    promosmsTypeEco: 'SMS ECO - Pas cher mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.',
     promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux déstinataires Polonais.",
     promosmsTypeFull: "SMS FULL - Version Premium des SMS, Vous pouvez mettre le nom de l'expéditeur (Vous devez vous enregistrer avant). Fiable pour les alertes.",
     promosmsTypeSpeed: "SMS SPEED - La plus haute des priorités dans le système. Très rapide et fiable mais cher (environ le double du prix d'un SMS FULL).",
-    promosmsPhoneNumber: "Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)",
+    promosmsPhoneNumber: 'Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)',
     promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Primary Base URL": "Primary Base URL",
-    emailCustomSubject: "Sujet personalisé",
-    clicksendsms: "ClickSend SMS",
-    checkPrice: "Vérification {0} tarifs :",
+    'Primary Base URL': 'Primary Base URL',
+    emailCustomSubject: 'Sujet personalisé',
+    clicksendsms: 'ClickSend SMS',
+    checkPrice: 'Vérification {0} tarifs :',
     apiCredentials: "Crédentials de l'API",
     octopushLegacyHint: "Vous utilisez l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
+    'Feishu WebHookUrl': 'Feishu WebHookURL',
     matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultatif)",
-    "Internal Room Id": "ID de la salle interne",
+    'Internal Room Id': 'ID de la salle interne',
     matrixDesc1: "Vous pouvez trouver l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est censé ressembler à !QMdRCpUIfLwsfjxye6:home.server.",
     matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Au lieu de cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
-    Method: "Méthode",
-    Body: "Le corps",
-    Headers: "En-têtes",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Les en-têtes de la requête ne sont pas dans un format JSON valide: ",
+    Method: 'Méthode',
+    Body: 'Le corps',
+    Headers: 'En-têtes',
+    PushUrl: 'Push URL',
+    HeadersInvalidFormat: 'Les en-têtes de la requête ne sont pas dans un format JSON valide: ',
     BodyInvalidFormat: "Le corps de la requête n'est pas dans un format JSON valide: ",
-    "Monitor History": "Historique de la sonde",
+    'Monitor History': 'Historique de la sonde',
     clearDataOlderThan: "Garder l'historique des données de la sonde durant {0} jours.",
-    PasswordsDoNotMatch: "Les mots de passe ne correspondent pas.",
-    records: "Enregistrements",
-    "One record": "Un enregistrement",
+    PasswordsDoNotMatch: 'Les mots de passe ne correspondent pas.',
+    records: 'Enregistrements',
+    'One record': 'Un enregistrement',
     steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin  d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
-    "Current User": "Utilisateur actuel",
-    recent: "Récent",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environement",
+    'Current User': 'Utilisateur actuel',
+    recent: 'Récent',
+    alertaApiEndpoint: 'API Endpoint',
+    alertaEnvironment: 'Environement',
     alertaApiKey: "Clé de l'API",
     alertaAlertState: "État de l'Alerte",
-    alertaRecoverState: "État de récupération",
-};
+    alertaRecoverState: 'État de récupération',
+    resendEveryXTimes: 'Renvoyez toutes les {0} fois',
+    resendDisabled: 'Renvoi désactivé',
+    dnsPortDescription: 'Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.',
+    'Resend Notification if Down X times consequently': "Renvoyer la notification a partir d'un certain temps",
+    'Push URL': 'Push URL',
+    needPushEvery: 'Vous devez appeler cette URL toutes les {0} secondes.',
+    pushOptionalParams: 'parametres optionnels: {0}',
+    'disableauth.message1': "Voulez-vous vraiment <strong>désactiver l'authentification</strong>?",
+    'disableauth.message2': "Il est conçu pour les scénarios <strong>où vous avez l'intention d'implémenter une authentification tierce</strong> devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
+    'Please use this option carefully!': 'Veuillez utiliser cette option avec précaution !',
+    PushByTechulus: 'Pousser par Techulus',
+    GoogleChat: 'Google Chat (Google Workspace uniquement)',
+    topic: 'Topic',
+    topicExplanation: 'MQTT topic to monitor',
+    successMessage: 'Message de réussite',
+    successMessageExplanation: 'MQTT message qui sera considéré comme un succès',
+    Done: 'Fait',
+    Info: 'Info',
+    Security: 'Sécurité',
+    'Steam API Key': 'Clé API Steam',
+    'Shrink Database': 'Réduire la base de données',
+    'Pick a RR-Type...': 'Pick a RR-Type...',
+    'Pick Accepted Status Codes...': 'Pick Accepted Status Codes...',
+    Default: 'Défaut',
+    'HTTP Options': 'HTTP Options',
+    'Create Incident': 'Créer un incident',
+    Title: 'Titre',
+    Content: 'Contenu',
+    Style: 'Style',
+    info: 'info',
+    warning: 'Attention',
+    danger: 'danger',
+    error: 'Erreur',
+    critical: 'critique',
+    primary: 'primaire',
+    light: 'blanc',
+    dark: 'Noir',
+    Post: 'Post',
+    'Please input title and content': 'Veuillez entrer le titre et le contenu',
+    Created: 'Created',
+    'Last Updated': 'Dernière mise à jour',
+    Unpin: 'Détacher',
+    'Switch to Light Theme': 'Passer au thème clair',
+    'Switch to Dark Theme': 'Passer au thème sombre',
+    'Show Tags': 'Voir les étiquettes',
+    'Hide Tags': 'Masquer les étiquettes',
+    Description: 'Description',
+    'No monitors available.': 'Aucun moniteur disponible.',
+    'Add one': 'En rajouter un',
+    'No Monitors': 'Aucun moniteur',
+    'Untitled Group': 'Groupe sans titre',
+    Services: 'Services',
+    Discard: 'Annuler',
+    Cancel: 'Annuler',
+    'Powered by': 'Powered by',
+    shrinkDatabaseDescription: "Déclencher la base de données VACUUM pour SQLite. Si votre base de données est créée après 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
+    serwersms: 'SerwerSMS.pl',
+    serwersmsAPIUser: "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
+    serwersmsAPIPassword: 'Mot de passe API',
+    serwersmsPhoneNumber: 'Numéro de téléphone',
+    serwersmsSenderName: "Nom de l'expéditeur du SMS (enregistré via le portail client)",
+    stackfield: 'Stackfield',
+    Customize: 'Personnaliser',
+    'Custom Footer': 'Pied de page personnalisé',
+    'Custom CSS': 'CSS personnalisé',
+    smtpDkimSettings: 'Paramètres DKIM',
+    smtpDkimDesc: 'Please refer to the Nodemailer DKIM {0} for usage.',
+    documentation: 'documentation',
+    smtpDkimDomain: 'Nom de domaine',
+    smtpDkimKeySelector: 'Key Selector',
+    smtpDkimPrivateKey: 'Private Key',
+    smtpDkimHashAlgo: 'Hash Algorithm (Optional)',
+    smtpDkimheaderFieldNames: 'Header Keys to sign (Optional)',
+    smtpDkimskipFields: 'Header Keys not to sign (Optional)',
+    wayToGetPagerDutyKey: 'You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for "Events API V2". More info {0}',
+    'Integration Key': 'Integration Key',
+    'Integration URL': 'Integration URL',
+    'Auto resolve or acknowledged': 'Auto resolve or acknowledged',
+    'do nothing': 'do nothing',
+    'auto acknowledged': 'auto acknowledged',
+    'auto resolve': 'auto resolve',
+    gorush: 'Gorush',
+    alerta: 'Alerta',
+    deleteStatusPageMsg: "Voulez-vous vraiment supprimer cette page d'état ?",
+    Proxies: 'Proxies',
+    default: 'Défaut',
+    enabled: 'Activé',
+    setAsDefault: 'Définir par défaut',
+    deleteProxyMsg: 'Voulez-vous vraiment supprimer ce proxy pour tous les moniteurs ?',
+    proxyDescription: 'Les proxys doivent être affectés à un moniteur pour fonctionner.',
+    enableProxyDescription: "Ce proxy n'aura pas d'effet sur les demandes de moniteur tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de tous les moniteurs en fonction de l'état d'activation.",
+    setAsDefaultProxyDescription: 'Ce proxy sera activé par défaut pour les nouveaux moniteurs. Vous pouvez toujours désactiver le proxy séparément pour chaque moniteur.',
+    'Certificate Chain': 'Certificate Chain',
+    Valid: 'Valide',
+    Invalid: 'Non valide',
+    AccessKeyId: 'AccessKey ID',
+    SecretAccessKey: 'AccessKey Secret',
+    PhoneNumbers: 'PhoneNumbers',
+    TemplateCode: 'TemplateCode',
+    SignName: 'SignName',
+    'Sms template must contain parameters: ': 'Sms template must contain parameters: ',
+    'Bark Endpoint': 'Bark Endpoint',
+    'Bark Group': 'Bark Group',
+    'Bark Sound': 'Bark Sound',
+    WebHookUrl: 'WebHookUrl',
+    SecretKey: 'SecretKey',
+    'For safety, must use secret key': 'For safety, must use secret key',
+    'Device Token': 'Device Token',
+    Platform: 'Platform',
+    iOS: 'iOS',
+    Android: 'Android',
+    Huawei: 'Huawei',
+    High: 'High',
+    Retry: 'Retry',
+    Topic: 'Topic',
+    'WeCom Bot Key': 'WeCom Bot Key',
+    'Proxy Protocol': 'Proxy Protocol',
+    'Proxy Server': 'Proxy Server',
+    'Proxy server has authentication': 'Proxy server has authentication',
+    User: 'Utilisateur',
+    Installed: 'Installé',
+    'Not installed': 'Pas installé',
+    Running: 'Running',
+    'Not running': 'Not running',
+    'Remove Token': 'Supprimer le jeton',
+    Start: 'Start',
+    Stop: 'Stop',
+    'Uptime Kuma': 'Uptime Kuma',
+    Slug: 'chemin',
+    'The slug is already taken. Please choose another slug.': 'Le chemin est déjà pris. Veuillez choisir un autre chemin.',
+    'No Proxy': 'No Proxy',
+    Authentication: 'Authentication',
+    'HTTP Basic Auth': 'HTTP Basic Auth',
+    'Page Not Found': 'Page non trouvée',
+    'Reverse Proxy': 'Reverse Proxy',
+    Backup: 'Sauvegarde',
+    About: 'À propos de',
+    wayToGetCloudflaredURL: '(Download cloudflared from {0})',
+    cloudflareWebsite: 'Cloudflare Website',
+    'Message:': 'Message:',
+    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
+    'The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.': 'The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.',
+    'HTTP Headers': 'HTTP Headers',
+    'Trust Proxy': 'Trust Proxy',
+    'Other Software': 'Other Software',
+    'For example: nginx, Apache and Traefik.': 'For example: nginx, Apache and Traefik.',
+    'Please read': 'Please read',
+    'Subject:': 'Subject:',
+    'Valid To:': 'Valid To:',
+    'Days Remaining:': 'Days Remaining:',
+    'Issuer:': 'Issuer:',
+    'Fingerprint:': 'Fingerprint:',
+    'Domain Name Expiry Notification': 'Domain Name Expiry Notification',
+    Proxy: 'Proxy',
+    'Date Created': 'Date Created',
+    HomeAssistant: 'Home Assistant',
+    onebotHttpAddress: 'OneBot HTTP Address',
+    onebotMessageType: 'OneBot Message Type',
+    onebotGroupMessage: 'Group',
+    onebotPrivateMessage: 'Private',
+    onebotUserOrGroupId: 'Group/User ID',
+    onebotSafetyTips: 'For safety, must set access token',
+    'PushDeer Key': 'PushDeer Key',
+    'Footer Text': 'Texte de pied de page',
+    'Show Powered By': 'Show Powered By',
+    'Domain Names': 'Noms de domaine',
+    signedInDisp: 'Connecté en tant que {0}',
+    signedInDispDisabled: 'Authentification désactivée.',
+    RadiusSecret: 'Radius Secret',
+    RadiusSecretDescription: 'Shared Secret between client and server',
+    RadiusCalledStationId: 'Called Station Id',
+    RadiusCalledStationIdDescription: 'Identifier of the called device',
+    RadiusCallingStationId: 'Calling Station Id',
+    RadiusCallingStationIdDescription: 'Identifier of the calling device',
+    'Certificate Expiry Notification': 'Certificate Expiry Notification',
+    'API Username': 'API Username',
+    'API Key': 'API Key',
+    'Recipient Number': 'Recipient Number',
+    'From Name/Number': 'From Name/Number',
+    'Leave blank to use a shared sender number.': 'Leave blank to use a shared sender number.',
+    'Octopush API Version': 'Octopush API Version',
+    'Legacy Octopush-DM': 'Legacy Octopush-DM',
+    endpoint: 'endpoint',
+    octopushAPIKey: '"API key" from HTTP API credentials in control panel',
+    octopushLogin: '"Login" from HTTP API credentials in control panel',
+    promosmsLogin: 'API Login Name',
+    promosmsPassword: 'API Password',
+    'pushoversounds pushover': 'Pushover (default)',
+    'pushoversounds bike': 'Bike',
+    'pushoversounds bugle': 'Bugle',
+    'pushoversounds cashregister': 'Cash Register',
+    'pushoversounds classical': 'Classical',
+    'pushoversounds cosmic': 'Cosmic',
+    'pushoversounds falling': 'Falling',
+    'pushoversounds gamelan': 'Gamelan',
+    'pushoversounds incoming': 'Incoming',
+    'pushoversounds intermission': 'Intermission',
+    'pushoversounds magic': 'Magic',
+    'pushoversounds mechanical': 'Mechanical',
+    'pushoversounds pianobar': 'Piano Bar',
+    'pushoversounds siren': 'Siren',
+    'pushoversounds spacealarm': 'Space Alarm',
+    'pushoversounds tugboat': 'Tug Boat',
+    'pushoversounds alien': 'Alien Alarm (long)',
+    'pushoversounds climb': 'Climb (long)',
+    'pushoversounds persistent': 'Persistent (long)',
+    'pushoversounds echo': 'Pushover Echo (long)',
+    'pushoversounds updown': 'Up Down (long)',
+    'pushoversounds vibrate': 'Vibrate Only',
+    'pushoversounds none': 'None (silent)',
+    pushyAPIKey: 'Secret API Key',
+    pushyToken: 'Device token',
+    'Show update if available': 'Afficher la mise à jour si disponible',
+    'Also check beta release': 'Vérifiez également la version bêta',
+    'Using a Reverse Proxy?': 'Using a Reverse Proxy?',
+    'Check how to config it for WebSocket': 'Check how to config it for WebSocket',
+    'Steam Game Server': 'Serveur de jeu Steam',
+    'Most likely causes:': 'Causes les plus probables:',
+    'The resource is no longer available.': "La ressource n'est plus disponible.",
+    'There might be a typing error in the address.': "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
+    'What you can try:': 'Ce que vous pouvez essayer:',
+    'Retype the address.': "Retapez l'adresse.",
+    'Go back to the previous page.': 'Retournez à la page précédente.',
+    'Coming Soon': 'À venir',
+    wayToGetClickSendSMSToken: 'You can get API Username and API Key from {0} .',
+    'Connection String': 'Connection String',
+    Query: 'Query',
+    settingsCertificateExpiry: 'Expiration du certificat TLS',
+    certificationExpiryDescription: 'Les moniteurs HTTPS déclenchent une notification lorsque le certificat TLS expire dans:',
+    'Setup Docker Host': "Configurer l'hôte Docker",
+    'Connection Type': 'Type de connexion',
+    'Docker Daemon': 'Docker Daemon',
+    deleteDockerHostMsg: 'Voulez-vous vraiment supprimer cet hôte Docker pour tous les moniteurs ?',
+    socket: 'Socket',
+    tcp: 'TCP / HTTP',
+    'Docker Container': 'Docker Container',
+    'Container Name / ID': 'Nom / ID du conteneur',
+    'Docker Host': 'Hôte Docker',
+    'Docker Hosts': 'Hôtes Docker',
+    'ntfy Topic': 'ntfy Topic',
+    Domain: 'Domaine',
+    Workstation: 'Workstation',
+    disableCloudflaredNoAuthMsg: 'You are in No Auth mode, password is not require.',
+    trustProxyDescription: "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma est en retard, comme Nginx ou Apache, vous devez l'activer.",
+    wayToGetLineNotifyToken: "Vous pouvez obtenir un jeton d'accès auprès de {0}",
+    Examples: 'Exemples',
+    'Home Assistant URL': 'Home Assistant URL',
+    'Long-Lived Access Token': 'Long-Lived Access Token',
+    'Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ': "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
+    'Notification Service': 'Service de notifications',
+    'default: notify all devices': 'par défaut: notifier tous les appareils',
+    'A list of Notification Services can be found in Home Assistant under "Developer Tools > Services" search for "notification" to find your device/phone name.': 'Une liste des services de notification peut être trouvée dans Home Assistant sous "Outils de développement > Services" recherchez "notification" pour trouver le nom de votre appareil/téléphone.',
+    'Automations can optionally be triggered in Home Assistant:': 'Les automatisations peuvent éventuellement être déclenchées dans Home Assistant:',
+    'Trigger type:': 'Type de déclencheur:',
+    'Event type:': "Type d'événement:",
+    'Event data:': "Données d'événement:",
+    'Then choose an action, for example switch the scene to where an RGB light is red.': 'Then choose an action, for example switch the scene to where an RGB light is red.',
+    'Frontend Version': 'Frontend Version',
+    'Frontend Version do not match backend version!': 'Frontend Version do not match backend version!'
+  }
\ No newline at end of file

From 252d6ea9c9236a8c7539b489127dfba9b73933b2 Mon Sep 17 00:00:00 2001
From: cyril59310 <archas.cyril@hotmail.fr>
Date: Mon, 5 Sep 2022 20:58:00 +0200
Subject: [PATCH 109/803] Remove unused translations

---
 src/languages/fr-FR.js | 145 -----------------------------------------
 1 file changed, 145 deletions(-)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index f7c8dd07..3fe91089 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -329,10 +329,6 @@ export default {
     'Please use this option carefully!': 'Veuillez utiliser cette option avec précaution !',
     PushByTechulus: 'Pousser par Techulus',
     GoogleChat: 'Google Chat (Google Workspace uniquement)',
-    topic: 'Topic',
-    topicExplanation: 'MQTT topic to monitor',
-    successMessage: 'Message de réussite',
-    successMessageExplanation: 'MQTT message qui sera considéré comme un succès',
     Done: 'Fait',
     Info: 'Info',
     Security: 'Sécurité',
@@ -371,35 +367,14 @@ export default {
     Services: 'Services',
     Discard: 'Annuler',
     Cancel: 'Annuler',
-    'Powered by': 'Powered by',
     shrinkDatabaseDescription: "Déclencher la base de données VACUUM pour SQLite. Si votre base de données est créée après 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
-    serwersms: 'SerwerSMS.pl',
     serwersmsAPIUser: "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
     serwersmsAPIPassword: 'Mot de passe API',
     serwersmsPhoneNumber: 'Numéro de téléphone',
     serwersmsSenderName: "Nom de l'expéditeur du SMS (enregistré via le portail client)",
-    stackfield: 'Stackfield',
     Customize: 'Personnaliser',
     'Custom Footer': 'Pied de page personnalisé',
     'Custom CSS': 'CSS personnalisé',
-    smtpDkimSettings: 'Paramètres DKIM',
-    smtpDkimDesc: 'Please refer to the Nodemailer DKIM {0} for usage.',
-    documentation: 'documentation',
-    smtpDkimDomain: 'Nom de domaine',
-    smtpDkimKeySelector: 'Key Selector',
-    smtpDkimPrivateKey: 'Private Key',
-    smtpDkimHashAlgo: 'Hash Algorithm (Optional)',
-    smtpDkimheaderFieldNames: 'Header Keys to sign (Optional)',
-    smtpDkimskipFields: 'Header Keys not to sign (Optional)',
-    wayToGetPagerDutyKey: 'You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for "Events API V2". More info {0}',
-    'Integration Key': 'Integration Key',
-    'Integration URL': 'Integration URL',
-    'Auto resolve or acknowledged': 'Auto resolve or acknowledged',
-    'do nothing': 'do nothing',
-    'auto acknowledged': 'auto acknowledged',
-    'auto resolve': 'auto resolve',
-    gorush: 'Gorush',
-    alerta: 'Alerta',
     deleteStatusPageMsg: "Voulez-vous vraiment supprimer cette page d'état ?",
     Proxies: 'Proxies',
     default: 'Défaut',
@@ -409,130 +384,24 @@ export default {
     proxyDescription: 'Les proxys doivent être affectés à un moniteur pour fonctionner.',
     enableProxyDescription: "Ce proxy n'aura pas d'effet sur les demandes de moniteur tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de tous les moniteurs en fonction de l'état d'activation.",
     setAsDefaultProxyDescription: 'Ce proxy sera activé par défaut pour les nouveaux moniteurs. Vous pouvez toujours désactiver le proxy séparément pour chaque moniteur.',
-    'Certificate Chain': 'Certificate Chain',
     Valid: 'Valide',
     Invalid: 'Non valide',
-    AccessKeyId: 'AccessKey ID',
-    SecretAccessKey: 'AccessKey Secret',
-    PhoneNumbers: 'PhoneNumbers',
-    TemplateCode: 'TemplateCode',
-    SignName: 'SignName',
-    'Sms template must contain parameters: ': 'Sms template must contain parameters: ',
-    'Bark Endpoint': 'Bark Endpoint',
-    'Bark Group': 'Bark Group',
-    'Bark Sound': 'Bark Sound',
-    WebHookUrl: 'WebHookUrl',
-    SecretKey: 'SecretKey',
-    'For safety, must use secret key': 'For safety, must use secret key',
-    'Device Token': 'Device Token',
-    Platform: 'Platform',
-    iOS: 'iOS',
-    Android: 'Android',
-    Huawei: 'Huawei',
-    High: 'High',
-    Retry: 'Retry',
-    Topic: 'Topic',
-    'WeCom Bot Key': 'WeCom Bot Key',
-    'Proxy Protocol': 'Proxy Protocol',
-    'Proxy Server': 'Proxy Server',
-    'Proxy server has authentication': 'Proxy server has authentication',
     User: 'Utilisateur',
     Installed: 'Installé',
     'Not installed': 'Pas installé',
-    Running: 'Running',
-    'Not running': 'Not running',
     'Remove Token': 'Supprimer le jeton',
-    Start: 'Start',
-    Stop: 'Stop',
-    'Uptime Kuma': 'Uptime Kuma',
     Slug: 'chemin',
     'The slug is already taken. Please choose another slug.': 'Le chemin est déjà pris. Veuillez choisir un autre chemin.',
-    'No Proxy': 'No Proxy',
     Authentication: 'Authentication',
-    'HTTP Basic Auth': 'HTTP Basic Auth',
     'Page Not Found': 'Page non trouvée',
-    'Reverse Proxy': 'Reverse Proxy',
     Backup: 'Sauvegarde',
     About: 'À propos de',
-    wayToGetCloudflaredURL: '(Download cloudflared from {0})',
-    cloudflareWebsite: 'Cloudflare Website',
-    'Message:': 'Message:',
-    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
-    'The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.': 'The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.',
-    'HTTP Headers': 'HTTP Headers',
-    'Trust Proxy': 'Trust Proxy',
-    'Other Software': 'Other Software',
-    'For example: nginx, Apache and Traefik.': 'For example: nginx, Apache and Traefik.',
-    'Please read': 'Please read',
-    'Subject:': 'Subject:',
-    'Valid To:': 'Valid To:',
-    'Days Remaining:': 'Days Remaining:',
-    'Issuer:': 'Issuer:',
-    'Fingerprint:': 'Fingerprint:',
-    'Domain Name Expiry Notification': 'Domain Name Expiry Notification',
-    Proxy: 'Proxy',
-    'Date Created': 'Date Created',
-    HomeAssistant: 'Home Assistant',
-    onebotHttpAddress: 'OneBot HTTP Address',
-    onebotMessageType: 'OneBot Message Type',
-    onebotGroupMessage: 'Group',
-    onebotPrivateMessage: 'Private',
-    onebotUserOrGroupId: 'Group/User ID',
-    onebotSafetyTips: 'For safety, must set access token',
-    'PushDeer Key': 'PushDeer Key',
     'Footer Text': 'Texte de pied de page',
-    'Show Powered By': 'Show Powered By',
     'Domain Names': 'Noms de domaine',
     signedInDisp: 'Connecté en tant que {0}',
     signedInDispDisabled: 'Authentification désactivée.',
-    RadiusSecret: 'Radius Secret',
-    RadiusSecretDescription: 'Shared Secret between client and server',
-    RadiusCalledStationId: 'Called Station Id',
-    RadiusCalledStationIdDescription: 'Identifier of the called device',
-    RadiusCallingStationId: 'Calling Station Id',
-    RadiusCallingStationIdDescription: 'Identifier of the calling device',
-    'Certificate Expiry Notification': 'Certificate Expiry Notification',
-    'API Username': 'API Username',
-    'API Key': 'API Key',
-    'Recipient Number': 'Recipient Number',
-    'From Name/Number': 'From Name/Number',
-    'Leave blank to use a shared sender number.': 'Leave blank to use a shared sender number.',
-    'Octopush API Version': 'Octopush API Version',
-    'Legacy Octopush-DM': 'Legacy Octopush-DM',
-    endpoint: 'endpoint',
-    octopushAPIKey: '"API key" from HTTP API credentials in control panel',
-    octopushLogin: '"Login" from HTTP API credentials in control panel',
-    promosmsLogin: 'API Login Name',
-    promosmsPassword: 'API Password',
-    'pushoversounds pushover': 'Pushover (default)',
-    'pushoversounds bike': 'Bike',
-    'pushoversounds bugle': 'Bugle',
-    'pushoversounds cashregister': 'Cash Register',
-    'pushoversounds classical': 'Classical',
-    'pushoversounds cosmic': 'Cosmic',
-    'pushoversounds falling': 'Falling',
-    'pushoversounds gamelan': 'Gamelan',
-    'pushoversounds incoming': 'Incoming',
-    'pushoversounds intermission': 'Intermission',
-    'pushoversounds magic': 'Magic',
-    'pushoversounds mechanical': 'Mechanical',
-    'pushoversounds pianobar': 'Piano Bar',
-    'pushoversounds siren': 'Siren',
-    'pushoversounds spacealarm': 'Space Alarm',
-    'pushoversounds tugboat': 'Tug Boat',
-    'pushoversounds alien': 'Alien Alarm (long)',
-    'pushoversounds climb': 'Climb (long)',
-    'pushoversounds persistent': 'Persistent (long)',
-    'pushoversounds echo': 'Pushover Echo (long)',
-    'pushoversounds updown': 'Up Down (long)',
-    'pushoversounds vibrate': 'Vibrate Only',
-    'pushoversounds none': 'None (silent)',
-    pushyAPIKey: 'Secret API Key',
-    pushyToken: 'Device token',
     'Show update if available': 'Afficher la mise à jour si disponible',
     'Also check beta release': 'Vérifiez également la version bêta',
-    'Using a Reverse Proxy?': 'Using a Reverse Proxy?',
-    'Check how to config it for WebSocket': 'Check how to config it for WebSocket',
     'Steam Game Server': 'Serveur de jeu Steam',
     'Most likely causes:': 'Causes les plus probables:',
     'The resource is no longer available.': "La ressource n'est plus disponible.",
@@ -541,30 +410,19 @@ export default {
     'Retype the address.': "Retapez l'adresse.",
     'Go back to the previous page.': 'Retournez à la page précédente.',
     'Coming Soon': 'À venir',
-    wayToGetClickSendSMSToken: 'You can get API Username and API Key from {0} .',
-    'Connection String': 'Connection String',
-    Query: 'Query',
     settingsCertificateExpiry: 'Expiration du certificat TLS',
     certificationExpiryDescription: 'Les moniteurs HTTPS déclenchent une notification lorsque le certificat TLS expire dans:',
     'Setup Docker Host': "Configurer l'hôte Docker",
     'Connection Type': 'Type de connexion',
-    'Docker Daemon': 'Docker Daemon',
     deleteDockerHostMsg: 'Voulez-vous vraiment supprimer cet hôte Docker pour tous les moniteurs ?',
-    socket: 'Socket',
-    tcp: 'TCP / HTTP',
-    'Docker Container': 'Docker Container',
     'Container Name / ID': 'Nom / ID du conteneur',
     'Docker Host': 'Hôte Docker',
     'Docker Hosts': 'Hôtes Docker',
-    'ntfy Topic': 'ntfy Topic',
     Domain: 'Domaine',
-    Workstation: 'Workstation',
-    disableCloudflaredNoAuthMsg: 'You are in No Auth mode, password is not require.',
     trustProxyDescription: "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma est en retard, comme Nginx ou Apache, vous devez l'activer.",
     wayToGetLineNotifyToken: "Vous pouvez obtenir un jeton d'accès auprès de {0}",
     Examples: 'Exemples',
     'Home Assistant URL': 'Home Assistant URL',
-    'Long-Lived Access Token': 'Long-Lived Access Token',
     'Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ': "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
     'Notification Service': 'Service de notifications',
     'default: notify all devices': 'par défaut: notifier tous les appareils',
@@ -573,7 +431,4 @@ export default {
     'Trigger type:': 'Type de déclencheur:',
     'Event type:': "Type d'événement:",
     'Event data:': "Données d'événement:",
-    'Then choose an action, for example switch the scene to where an RGB light is red.': 'Then choose an action, for example switch the scene to where an RGB light is red.',
-    'Frontend Version': 'Frontend Version',
-    'Frontend Version do not match backend version!': 'Frontend Version do not match backend version!'
   }
\ No newline at end of file

From 808efb267f6b791e8b935c9773f2bde40f80df6c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20Bratovi=C4=87?= <ivanbratovic4@gmail.com>
Date: Tue, 6 Sep 2022 11:32:58 +0200
Subject: [PATCH 110/803] Update Croatian (hr-HR) translation file

---
 src/languages/hr-HR.js | 205 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 204 insertions(+), 1 deletion(-)

diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js
index bebd2c56..fbb6c582 100644
--- a/src/languages/hr-HR.js
+++ b/src/languages/hr-HR.js
@@ -80,7 +80,7 @@ export default {
     pushOptionalParams: "Neobavezni parametri: {0}",
     Save: "Spremi",
     Notifications: "Obavijesti",
-    "Not available, please setup.": "Obavijesti nisu dostupne, potrebno dodati novu obavijest.",
+    "Not available, please setup.": "Nije dostupno, potrebno je dodati novu stavku.",
     "Setup Notification": "Dodaj obavijest",
     Light: "Svijetli način",
     Dark: "Tamni način",
@@ -375,4 +375,207 @@ export default {
     alertaAlertState: "Stanje upozorenja",
     alertaRecoverState: "Stanje oporavka",
     deleteStatusPageMsg: "Sigurno želite obrisati ovu statusnu stranicu?",
+    resendEveryXTimes: "Ponovno pošalji svakih {0} puta",
+    resendDisabled: "Ponovno slanje je onemogućeno",
+    dnsPortDescription: "Port DNS poslužitelja. Zadana vrijednost je 53. Moguće je promijeniti ga u svakom trenutku.",
+    "Resend Notification if Down X times consequently": "Ponovno pošalji obavijest ako je usluga nedostupna više puta zaredom",
+    topic: "Tema",
+    topicExplanation: "MQTT tema koja će se monitorirati",
+    successMessage: "Poruka o uspjehu",
+    successMessageExplanation: "MQTT poruka koja se smatra uspješnom",
+    error: "greška",
+    critical: "kritično",
+    Customize: "Customize",
+    "Custom Footer": "Prilagođeno podnožje",
+    "Custom CSS": "Prilagođeni CSS",
+    wayToGetPagerDutyKey: "Ključ možete dobiti odlaskom na \"Service -> Service Directory -> (Odabrani servis) -> Integrations -> Add integration\". Ovdje pretražite za \"Events API V2\". Više informacija {0}",
+    "Integration Key": "Ključ integracije",
+    "Integration URL": "URL integracije",
+    "Auto resolve or acknowledged": "Automatsko razrješavanje i priznavanje",
+    "do nothing": "Ne radi ništa",
+    "auto acknowledged": "Automatsko priznavanje",
+    "auto resolve": "Automatsko razrješavanje",
+    Proxies: "Proxy poslužitelji",
+    default: "Zadano",
+    enabled: "Omogućeno",
+    setAsDefault: "Postavi kao zadano",
+    deleteProxyMsg: "Sigurno želite obrisati ovaj proxy za sve monitore?",
+    proxyDescription: "Proxy poslužitelji moraju biti dodijeljni monitoru kako bi funkcionirali.",
+    enableProxyDescription: "Onemogućeni proxy poslužitelj neće imati učinak na zahtjeve monitora. Možete privremeno onemogućiti proxy poslužitelja za sve monitore.",
+    setAsDefaultProxyDescription: "Ovaj proxy poslužitelj bit će odmah omogućen za nove monitore. I dalje ga možete onemogućiti za svaki monitor zasebno.",
+    "Certificate Chain": "Lanac certifikata",
+    Valid: "Važeći",
+    Invalid: "Nevažeći",
+    AccessKeyId: "AccessKey ID",
+    SecretAccessKey: "AccessKey tajni ključ",
+    PhoneNumbers: "Telefonski brojevi",
+    TemplateCode: "Predložak koda",
+    SignName: "Potpis",
+    "Sms template must contain parameters: ": "SMS predložak mora sadržavati parametre: ",
+    "Bark Endpoint": "Bark krajnja točka (endpoint)",
+    "Bark Group": "Bark grupa",
+    "Bark Sound": "Bark zvuk",
+    WebHookUrl: "WebHookUrl",
+    SecretKey: "Tajni ključ",
+    "For safety, must use secret key": "Korištenje tajnog ključa je obavezno",
+    "Device Token": "Token uređaja",
+    Platform: "Platforma",
+    iOS: "iOS",
+    Android: "Android",
+    Huawei: "Huawei",
+    High: "Visoko",
+    Retry: "Ponovnih pokušaja",
+    Topic: "Tema",
+    "WeCom Bot Key": "WeCom ključ Bota",
+    "Setup Proxy": "Dodaj proxy poslužitelj",
+    "Proxy Protocol": "Protokol",
+    "Proxy Server": "Proxy poslužitelj",
+    "Proxy server has authentication": "Proxy poslužitelj ima autentikaciju",
+    User: "Korisnik",
+    Installed: "Instalirano",
+    "Not installed": "Nije instalirano",
+    Running: "Pokrenuto",
+    "Not running": "Nije pokrenuto",
+    "Remove Token": "Ukloni Token",
+    Start: "Pokreni",
+    Stop: "Zaustavi",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Dodaj novu statusnu stranicu",
+    Slug: "Slug",
+    "Accept characters:": "Dozvoljeni znakovi:",
+    startOrEndWithOnly: "Započinje ili završava znakovima {0}",
+    "No consecutive dashes": "Bez uzastopnih povlaka",
+    Next: "Sljedeće",
+    "The slug is already taken. Please choose another slug.": "Slug je zauzet. Odaberite novi slug.",
+    "No Proxy": "Bez proxy poslužitelja",
+    Authentication: "Autentikacija",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Dodaj statusnu stranicu",
+    "Page Not Found": "Stranica nije pronađena",
+    "Reverse Proxy": "Reverzni proxy",
+    Backup: "Sigurnosno kopiranje",
+    About: "O Uptime Kumi",
+    wayToGetCloudflaredURL: "(Preuzmite cloudflared s {0})",
+    cloudflareWebsite: "Cloudflare web stranice",
+    "Message:": "Poruka:",
+    "Don't know how to get the token? Please read the guide:": "Ne znate kako doći do tokena? Pročitajte vodič:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Trenutna veza možda bude prekinuta jer se koristi Cloudflare tuneliranje. Sigurno želite zaustaviti? Unesite lozinku za potvrdu.",
+    "HTTP Headers": "HTTP zaglavlja",
+    "Trust Proxy": "Vjeruj proxy poslužitelju",
+    "Other Software": "Ostali programi",
+    "For example: nginx, Apache and Traefik.": "Primjerice: nginx, Apache ili Traefik.",
+    "Please read": "Molimo pročitajte",
+    "Subject:": "Predmet:",
+    "Valid To:": "Valjano do:",
+    "Days Remaining:": "Preostalo dana:",
+    "Issuer:": "Izdavatelj:",
+    "Fingerprint:": "Fingerprint:",
+    "No status pages": "Nema statusnih stranica",
+    "Domain Name Expiry Notification": "Obavijest za istek domena",
+    Proxy: "Proxy",
+    "Date Created": "Datum stvaranja",
+    HomeAssistant: "Home Assistant",
+    onebotHttpAddress: "OneBot HTTP adresa",
+    onebotMessageType: "OneBot tip poruke",
+    onebotGroupMessage: "Grupna",
+    onebotPrivateMessage: "Privatna",
+    onebotUserOrGroupId: "ID korisnika/grupe",
+    onebotSafetyTips: "Pristupni token mora biti postavljen",
+    "PushDeer Key": "PushDeer ključ",
+    "Footer Text": "Tekst podnožja",
+    "Show Powered By": "Pokaži 'Pokreće...'",
+    "Domain Names": "Domene",
+    signedInDisp: "Prijavljeni ste kao {0}",
+    signedInDispDisabled: "Autentikacija onemogućena.",
+    RadiusSecret: "Radius Tajna",
+    RadiusSecretDescription: "Dijeljena Tajna između klijenta i poslužitelja",
+    RadiusCalledStationId: "Called Station ID",
+    RadiusCalledStationIdDescription: "Identifikator pozivne stanice",
+    RadiusCallingStationId: "Calling Station ID",
+    RadiusCallingStationIdDescription: "Identifikator pozivajuće stanice",
+    "Certificate Expiry Notification": "Obavijest za istek certifikata",
+    "API Username": "API korisničko ime",
+    "API Key": "API ključ",
+    "Recipient Number": "Broj primatelja",
+    "From Name/Number": "Naziv/broj pošiljatelja",
+    "Leave blank to use a shared sender number.": "Ostaviti prazno za korištenje dijeljenog broja pošiljatelja.",
+    "Octopush API Version": "Octopush verzija API-ja",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "krajnja točka (endpoint)",
+    octopushAPIKey: "\"API ključ\" iz HTTP API postavki",
+    octopushLogin: "\"Korisničko ime\" iz HTTP API postavki",
+    promosmsLogin: "API korisničko ime",
+    promosmsPassword: "API lozinka",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    pushyAPIKey: "Tajni API ključ",
+    pushyToken: "Token uređaja",
+    "Show update if available": "Pokaži moguću nadogradnju",
+    "Also check beta release": "Provjeravaj i za beta izdanja",
+    "Using a Reverse Proxy?": "Koristi li se reverzni proxy?",
+    "Check how to config it for WebSocket": "Provjerite kako se konfigurira za WebSocket protokol",
+    "Steam Game Server": "Steam poslužitelj igre",
+    "Most likely causes:": "Najvjerojatniji uzroci:",
+    "The resource is no longer available.": "Resurs više nije dostupan.",
+    "There might be a typing error in the address.": "Možda je nastala greška pri upisu adrese.",
+    "What you can try:": "Što možete pokušati:",
+    "Retype the address.": "Ponovno napišite adresu.",
+    "Go back to the previous page.": "Vratite se na prethodnu stranicu.",
+    "Coming Soon": "Dolazi uskoro",
+    wayToGetClickSendSMSToken: "Možete dobiti API korisničko ime i API ključ sa {0}.",
+    "Connection String": "Tekst veze",
+    Query: "Upit",
+    settingsCertificateExpiry: "TLS istek certifikata",
+    certificationExpiryDescription: "HTTPS monitori će obavijesiti kada je istek TLS certifikata za:",
+    "Setup Docker Host": "Dodaj Docker domaćina",
+    "Connection Type": "Tip veze",
+    "Docker Daemon": "Docker daemon",
+    deleteDockerHostMsg: "Sigurno želite izbrisati ovog Docker domaćina za sve monitore?",
+    socket: "Docker socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker kontejner",
+    "Container Name / ID": "Naziv / ID kontejnera",
+    "Docker Host": "Docker domaćin",
+    "Docker Hosts": "Docker domaćini",
+    "ntfy Topic": "ntfy tema",
+    Domain: "Domena",
+    Workstation: "Radna stanica",
+    disableCloudflaredNoAuthMsg: "Lozinka nije nužna dok je isključena autentikacija.",
+    trustProxyDescription: "Vjeruj 'X-Forwarded-*' zaglavljima. Ako želite dobiti ispravnu IP adresu klijenta i Uptime Kuma je iza reverznog proxy poslužitelja, trebate omogućiti ovo.",
+    wayToGetLineNotifyToken: "Možete dobiti pristupni token sa {0}",
+    Examples: "Primjeri",
+    "Home Assistant URL": "URL Home Assistanta",
+    "Long-Lived Access Token": "Dugotrajni pristupni token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Dugotrajni pristupni token može se kreirati klikom na korisničko ime (dolje lijevo) u Home Assistantu, pomicanjem do dna, te klikom na 'Create Token'. ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "zadano ponašanje: obavijesti sve uređaje",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Popis servisa za obavijesti u Home Assistantu nalaze se pod \"Developer Tools > Services\" te pretražiti \"notification\".",
+    "Automations can optionally be triggered in Home Assistant:": "Automacije se mogu okinuti u Home Assistantu:",
+    "Trigger type:": "Tip triggera:",
+    "Event type:": "Tip eventa:",
+    "Event data:": "Podaci eventa:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Potrebno je i odabrati akciju za izvođenje na Home Assistantu.",
+    "Frontend Version": "Inačica sučelja",
+    "Frontend Version do not match backend version!": "Inačica sučelja ne odgovara poslužitelju!",
 };

From d1aa9cfbcc3a95f124008655900def16c31b604b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ivan=20Bratovi=C4=87?= <ivanbratovic4@gmail.com>
Date: Tue, 6 Sep 2022 14:51:27 +0200
Subject: [PATCH 111/803] Change small details in hr-HR translation

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

diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js
index fbb6c582..0c73e1d9 100644
--- a/src/languages/hr-HR.js
+++ b/src/languages/hr-HR.js
@@ -129,7 +129,7 @@ export default {
     Export: "Izvoz",
     Import: "Uvoz",
     respTime: "Vrijeme odgovora (ms)",
-    notAvailableShort: "N/A",
+    notAvailableShort: "ne postoji",
     "Default enabled": "Omogući za nove monitore",
     "Apply on all existing monitors": "Primijeni na postojeće monitore",
     Create: "Kreiraj",
@@ -483,7 +483,7 @@ export default {
     onebotSafetyTips: "Pristupni token mora biti postavljen",
     "PushDeer Key": "PushDeer ključ",
     "Footer Text": "Tekst podnožja",
-    "Show Powered By": "Pokaži 'Pokreće...'",
+    "Show Powered By": "Pokaži natpis 'Pokreće...'",
     "Domain Names": "Domene",
     signedInDisp: "Prijavljeni ste kao {0}",
     signedInDispDisabled: "Autentikacija onemogućena.",

From 6a802bf68c486c2ee44942e9511d3af0d650df96 Mon Sep 17 00:00:00 2001
From: cyril59310 <archas.cyril@hotmail.fr>
Date: Tue, 6 Sep 2022 18:38:55 +0200
Subject: [PATCH 112/803] fix by eslint

---
 src/languages/fr-FR.js | 776 ++++++++++++++++++++---------------------
 1 file changed, 388 insertions(+), 388 deletions(-)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 3fe91089..10b8c1ba 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -1,434 +1,434 @@
 export default {
-    languageName: 'Français',
-    checkEverySecond: 'Vérifier toutes les {0} secondes',
-    retryCheckEverySecond: 'Réessayer toutes les {0} secondes.',
+    languageName: "Français",
+    checkEverySecond: "Vérifier toutes les {0} secondes",
+    retryCheckEverySecond: "Réessayer toutes les {0} secondes.",
     retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.",
-    ignoreTLSError: 'Ignorer les erreurs liées au certificat SSL/TLS',
-    upsideDownModeDescription: 'Si le service est en ligne, il sera alors noté hors-ligne et vice-versa.',
-    maxRedirectDescription: 'Nombre maximal de redirections avant que le service soit noté hors-ligne.',
-    acceptedStatusCodesDescription: 'Codes HTTP considérés comme en ligne',
-    passwordNotMatchMsg: 'Les mots de passe ne correspondent pas',
+    ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS",
+    upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors-ligne et vice-versa.",
+    maxRedirectDescription: "Nombre maximal de redirections avant que le service soit noté hors-ligne.",
+    acceptedStatusCodesDescription: "Codes HTTP considérés comme en ligne",
+    passwordNotMatchMsg: "Les mots de passe ne correspondent pas",
     notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
-    keywordDescription: 'Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.',
-    pauseDashboardHome: 'En pause',
-    deleteMonitorMsg: 'Êtes-vous sûr de vouloir supprimer cette sonde ?',
+    keywordDescription: "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
+    pauseDashboardHome: "En pause",
+    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.",
-    resolverserverDescription: 'Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.',
+    resolverserverDescription: "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
     rrtypeDescription: "Veuillez sélectionner un type d'enregistrement DNS",
-    pauseMonitorMsg: 'Êtes-vous sûr de vouloir mettre en pause cette sonde ?',
-    enableDefaultNotificationDescription: 'Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.',
-    clearEventsMsg: 'Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?',
-    clearHeartbeatsMsg: 'Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?',
-    confirmClearStatisticsMsg: 'Êtes-vous sûr de vouloir supprimer toutes les statistiques ?',
+    pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
+    enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
+    clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
+    clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
+    confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
     importHandleDescription: "Choisissez 'Ignorer l'existant' si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option 'Écraser' supprime toutes les sondes et notifications existantes.",
     confirmImportMsg: "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
-    twoFAVerifyLabel: 'Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.',
-    tokenValidSettingsMsg: 'Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres 2FA.',
-    confirmEnableTwoFAMsg: 'Êtes-vous sûr de vouloir activer le 2FA ?',
-    confirmDisableTwoFAMsg: 'Êtes-vous sûr de vouloir désactiver le 2FA ?',
-    Settings: 'Paramètres',
-    Dashboard: 'Tableau de bord',
-    'New Update': 'Mise à jour disponible',
-    Language: 'Langue',
-    Appearance: 'Apparence',
-    Theme: 'Thème',
-    General: 'Général',
-    Version: 'Version',
-    'Check Update On GitHub': 'Consulter les mises à jour sur Github',
-    List: 'Lister',
-    Add: 'Ajouter',
-    'Add New Monitor': 'Ajouter une nouvelle sonde',
-    'Quick Stats': 'Résumé',
-    Up: 'En ligne',
-    Down: 'Hors ligne',
-    Pending: 'En attente',
-    Unknown: 'Inconnu',
-    Pause: 'En Pause',
-    Name: 'Nom',
-    Status: 'État',
-    DateTime: 'Heure',
-    Message: 'Messages',
-    'No important events': "Pas d'évènements important",
-    Resume: 'Reprendre',
-    Edit: 'Modifier',
-    Delete: 'Supprimer',
-    Current: 'Actuellement',
-    Uptime: 'Uptime',
-    'Cert Exp.': 'Expiration SSL',
-    day: 'jour | jours',
-    '-day': '-jours',
-    hour: '-heure',
-    '-hour': '-heures',
-    Response: 'Temps de réponse',
-    Ping: 'Ping',
-    'Monitor Type': 'Type de Sonde',
-    Keyword: 'Mot-clé',
-    'Friendly Name': "Nom d'affichage",
-    URL: 'URL',
+    twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
+    tokenValidSettingsMsg: "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres 2FA.",
+    confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer le 2FA ?",
+    confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?",
+    Settings: "Paramètres",
+    Dashboard: "Tableau de bord",
+    "New Update": "Mise à jour disponible",
+    Language: "Langue",
+    Appearance: "Apparence",
+    Theme: "Thème",
+    General: "Général",
+    Version: "Version",
+    "Check Update On GitHub": "Consulter les mises à jour sur Github",
+    List: "Lister",
+    Add: "Ajouter",
+    "Add New Monitor": "Ajouter une nouvelle sonde",
+    "Quick Stats": "Résumé",
+    Up: "En ligne",
+    Down: "Hors ligne",
+    Pending: "En attente",
+    Unknown: "Inconnu",
+    Pause: "En Pause",
+    Name: "Nom",
+    Status: "État",
+    DateTime: "Heure",
+    Message: "Messages",
+    "No important events": "Pas d'évènements important",
+    Resume: "Reprendre",
+    Edit: "Modifier",
+    Delete: "Supprimer",
+    Current: "Actuellement",
+    Uptime: "Uptime",
+    "Cert Exp.": "Expiration SSL",
+    day: "jour | jours",
+    "-day": "-jours",
+    hour: "-heure",
+    "-hour": "-heures",
+    Response: "Temps de réponse",
+    Ping: "Ping",
+    "Monitor Type": "Type de Sonde",
+    Keyword: "Mot-clé",
+    "Friendly Name": "Nom d'affichage",
+    URL: "URL",
     Hostname: "Nom d'hôte / adresse IP",
-    Port: 'Port',
-    'Heartbeat Interval': 'Intervalle de vérification',
-    Retries: 'Essais',
-    'Heartbeat Retry Interval': "Réessayer l'intervalle de vérification",
-    Advanced: 'Avancé',
-    'Upside Down Mode': 'Mode inversé',
-    'Max. Redirects': 'Nombre maximum de redirections',
-    'Accepted Status Codes': 'Codes HTTP acceptés',
-    Save: 'Sauvegarder',
-    Notifications: 'Notifications',
-    '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 surveillés',
-    Normal: 'Normal',
-    Bottom: 'En dessous',
-    None: 'Aucun',
-    Timezone: 'Fuseau Horaire',
-    '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': "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',
-    'Update Password': 'Mettre à jour le mot de passe',
-    'Disable Auth': "Désactiver l'authentification",
-    'Enable Auth': "Activer l'authentification",
-    Logout: 'Se déconnecter',
-    Leave: 'Quitter',
-    'I understand, please disable': 'Je comprends, désactivez-le',
-    Confirm: 'Confirmer',
-    Yes: 'Oui',
-    No: 'Non',
+    Port: "Port",
+    "Heartbeat Interval": "Intervalle de vérification",
+    Retries: "Essais",
+    "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
+    Advanced: "Avancé",
+    "Upside Down Mode": "Mode inversé",
+    "Max. Redirects": "Nombre maximum de redirections",
+    "Accepted Status Codes": "Codes HTTP acceptés",
+    Save: "Sauvegarder",
+    Notifications: "Notifications",
+    "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 surveillés",
+    Normal: "Normal",
+    Bottom: "En dessous",
+    None: "Aucun",
+    Timezone: "Fuseau Horaire",
+    "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": "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",
+    "Update Password": "Mettre à jour le mot de passe",
+    "Disable Auth": "Désactiver l'authentification",
+    "Enable Auth": "Activer l'authentification",
+    Logout: "Se déconnecter",
+    Leave: "Quitter",
+    "I understand, please disable": "Je comprends, désactivez-le",
+    Confirm: "Confirmer",
+    Yes: "Oui",
+    No: "Non",
     Username: "Nom d'utilisateur",
-    Password: 'Mot de passe',
-    'Remember me': 'Se souvenir de moi',
-    Login: 'Se connecter',
-    'No Monitors, please': 'Pas de sondes, veuillez',
-    'add one': 'en ajouter une',
-    'Notification Type': 'Type de notification',
-    Email: 'Email',
-    Test: 'Tester',
-    'Certificate Info': 'Informations sur le certificat SSL',
-    'Resolver Server': 'Serveur DNS utilisé',
-    'Resource Record Type': "Type d'enregistrement DNS recherché",
-    'Last Result': 'Dernier résultat',
-    'Create your admin account': 'Créez votre compte administrateur',
-    'Repeat Password': 'Répéter le mot de passe',
-    'Import Backup': 'Importation de la sauvegarde',
-    'Export Backup': 'Exportation de la sauvegarde',
-    Export: 'Exporter',
-    Import: 'Importer',
-    respTime: 'Temps de réponse (ms)',
-    notAvailableShort: 'N/A',
-    'Default enabled': 'Activé par défaut',
-    'Apply on all existing monitors': 'Appliquer sur toutes les sondes existantes',
-    Create: 'Créer',
-    'Clear Data': 'Effacer les données',
-    Events: 'Evénements',
-    Heartbeats: 'Vérifications',
-    'Auto Get': 'Récuperer automatiquement',
-    backupDescription: 'Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.',
+    Password: "Mot de passe",
+    "Remember me": "Se souvenir de moi",
+    Login: "Se connecter",
+    "No Monitors, please": "Pas de sondes, veuillez",
+    "add one": "en ajouter une",
+    "Notification Type": "Type de notification",
+    Email: "Email",
+    Test: "Tester",
+    "Certificate Info": "Informations sur le certificat SSL",
+    "Resolver Server": "Serveur DNS utilisé",
+    "Resource Record Type": "Type d'enregistrement DNS recherché",
+    "Last Result": "Dernier résultat",
+    "Create your admin account": "Créez votre compte administrateur",
+    "Repeat Password": "Répéter le mot de passe",
+    "Import Backup": "Importation de la sauvegarde",
+    "Export Backup": "Exportation de la sauvegarde",
+    Export: "Exporter",
+    Import: "Importer",
+    respTime: "Temps de réponse (ms)",
+    notAvailableShort: "N/A",
+    "Default enabled": "Activé par défaut",
+    "Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
+    Create: "Créer",
+    "Clear Data": "Effacer les données",
+    Events: "Evénements",
+    Heartbeats: "Vérifications",
+    "Auto Get": "Récuperer automatiquement",
+    backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
     backupDescription2: "PS : Les données relatives à l'historique et aux événements ne sont pas incluses.",
     backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
-    alertNoFile: 'Veuillez sélectionner un fichier à importer.',
-    alertWrongFileType: 'Veuillez sélectionner un fichier JSON à importer.',
-    'Clear all statistics': 'Effacer toutes les statistiques',
-    'Skip existing': "Sauter l'existant",
-    Overwrite: 'Ecraser',
-    Options: 'Options',
-    'Keep both': 'Garder les deux',
-    'Verify Token': 'Vérifier le jeton',
-    'Setup 2FA': 'Configurer 2FA',
-    'Enable 2FA': 'Activer 2FA',
-    'Disable 2FA': 'Désactiver 2FA',
-    '2FA Settings': 'Paramètres 2FA',
-    'Two Factor Authentication': 'Authentification à deux facteurs',
-    Active: 'Actif',
-    Inactive: 'Inactif',
-    Token: 'Jeton',
-    'Show URI': "Afficher l'URI",
-    Tags: 'Étiquettes',
-    'Add New below or Select...': 'Ajoutez-en un en dessous ou sélectionnez-le ici...',
-    'Tag with this name already exist.': 'Une étiquette portant ce nom existe déjà.',
-    'Tag with this value already exist.': 'Une étiquette avec cette valeur existe déjà.',
-    color: 'Couleur',
-    'value (optional)': 'Valeur (facultatif)',
-    Gray: 'Gris',
-    Red: 'Rouge',
-    Orange: 'Orange',
-    Green: 'Vert',
-    Blue: 'Bleu',
-    Indigo: 'Indigo',
-    Purple: 'Violet',
-    Pink: 'Rose',
-    'Search...': 'Rechercher...',
-    'Avg. Ping': 'Ping moyen',
-    'Avg. Response': 'Réponse moyenne',
-    'Entry Page': "Page d'accueil",
-    statusPageNothing: 'Rien ici, veuillez ajouter un groupe ou une sonde.',
-    'No Services': 'Aucun service',
-    'All Systems Operational': 'Tous les systèmes sont opérationnels',
-    'Partially Degraded Service': 'Service partiellement dégradé',
-    'Degraded Service': 'Service dégradé',
-    'Add Group': 'Ajouter un groupe',
-    'Add a monitor': 'Ajouter une sonde',
-    'Edit Status Page': 'Modifier la page de statut',
-    'Go to Dashboard': 'Accéder au tableau de bord',
-    'Status Page': 'Page de statut',
-    'Status Pages': 'Pages de statut',
-    'New Status Page': 'Ajouter page de statut',
-    'Add New Status Page': 'Ajouter une page de statut',
-    'No status pages': 'Aucune page de statut.',
-    'Accept characters:': 'Caractères acceptés:',
-    startOrEndWithOnly: 'Commence uniquement par {0}',
-    'No consecutive dashes': 'Pas de double tirets',
-    Next: 'Continuer',
-    'Setup Proxy': 'Configuer Proxy',
-    defaultNotificationName: 'Ma notification {notification} numéro ({number})',
-    here: 'ici',
-    Required: 'Requis',
-    telegram: 'Telegram',
-    'Bot Token': 'Bot Token',
-    wayToGetTelegramToken: 'Vous pouvez obtenir un token depuis {0}.',
-    'Chat ID': 'Chat ID',
+    alertNoFile: "Veuillez sélectionner un fichier à importer.",
+    alertWrongFileType: "Veuillez sélectionner un fichier JSON à importer.",
+    "Clear all statistics": "Effacer toutes les statistiques",
+    "Skip existing": "Sauter l'existant",
+    Overwrite: "Ecraser",
+    Options: "Options",
+    "Keep both": "Garder les deux",
+    "Verify Token": "Vérifier le jeton",
+    "Setup 2FA": "Configurer 2FA",
+    "Enable 2FA": "Activer 2FA",
+    "Disable 2FA": "Désactiver 2FA",
+    "2FA Settings": "Paramètres 2FA",
+    "Two Factor Authentication": "Authentification à deux facteurs",
+    Active: "Actif",
+    Inactive: "Inactif",
+    Token: "Jeton",
+    "Show URI": "Afficher l'URI",
+    Tags: "Étiquettes",
+    "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici...",
+    "Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
+    "Tag with this value already exist.": "Une étiquette avec cette valeur existe déjà.",
+    color: "Couleur",
+    "value (optional)": "Valeur (facultatif)",
+    Gray: "Gris",
+    Red: "Rouge",
+    Orange: "Orange",
+    Green: "Vert",
+    Blue: "Bleu",
+    Indigo: "Indigo",
+    Purple: "Violet",
+    Pink: "Rose",
+    "Search...": "Rechercher...",
+    "Avg. Ping": "Ping moyen",
+    "Avg. Response": "Réponse moyenne",
+    "Entry Page": "Page d'accueil",
+    statusPageNothing: "Rien ici, veuillez ajouter un groupe ou une sonde.",
+    "No Services": "Aucun service",
+    "All Systems Operational": "Tous les systèmes sont opérationnels",
+    "Partially Degraded Service": "Service partiellement dégradé",
+    "Degraded Service": "Service dégradé",
+    "Add Group": "Ajouter un groupe",
+    "Add a monitor": "Ajouter une sonde",
+    "Edit Status Page": "Modifier la page de statut",
+    "Go to Dashboard": "Accéder au tableau de bord",
+    "Status Page": "Page de statut",
+    "Status Pages": "Pages de statut",
+    "New Status Page": "Ajouter page de statut",
+    "Add New Status Page": "Ajouter une page de statut",
+    "No status pages": "Aucune page de statut.",
+    "Accept characters:": "Caractères acceptés:",
+    startOrEndWithOnly: "Commence uniquement par {0}",
+    "No consecutive dashes": "Pas de double tirets",
+    Next: "Continuer",
+    "Setup Proxy": "Configuer Proxy",
+    defaultNotificationName: "Ma notification {notification} numéro ({number})",
+    here: "ici",
+    Required: "Requis",
+    telegram: "Telegram",
+    "Bot Token": "Bot Token",
+    wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.",
+    "Chat ID": "Chat ID",
     supportTelegramChatID: "Supporte les messages privés / en groupe / l'ID du salon",
     wayToGetTelegramChatID: "Vous pouvez obtenir l'ID du chat en envoyant un message avec le bot puis en récupérant l'URL pour voir l'ID du salon :",
-    'YOUR BOT TOKEN HERE': 'VOTRE TOKEN BOT ICI',
-    chatIDNotFound: 'ID du salon introuvable, envoyez un message via le bot avant',
-    webhook: 'Webhook',
-    'Post URL': 'Post URL',
-    'Content Type': 'Content Type',
-    webhookJsonDesc: '{0} est bien/bon pour tous les serveurs HTTP modernes comme express.js',
-    webhookFormDataDesc: '{multipart} est bien/bon pour du PHP, vous avez juste besoin de mettre le json via/depuis {decodeFunction}',
-    smtp: 'Email (SMTP)',
-    secureOptionNone: 'Aucun/STARTTLS (25, 587)',
-    secureOptionTLS: 'TLS (465)',
-    'Ignore TLS Error': 'Ignorer les erreurs TLS',
-    'From Email': "Depuis l'Email",
-    'To Email': "Vers l'Email",
-    smtpCC: 'CC',
-    smtpBCC: 'BCC',
-    discord: 'Discord',
-    'Discord Webhook URL': 'Discord Webhook URL',
+    "YOUR BOT TOKEN HERE": "VOTRE TOKEN BOT ICI",
+    chatIDNotFound: "ID du salon introuvable, envoyez un message via le bot avant",
+    webhook: "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    webhookJsonDesc: "{0} est bien/bon pour tous les serveurs HTTP modernes comme express.js",
+    webhookFormDataDesc: "{multipart} est bien/bon pour du PHP, vous avez juste besoin de mettre le json via/depuis {decodeFunction}",
+    smtp: "Email (SMTP)",
+    secureOptionNone: "Aucun/STARTTLS (25, 587)",
+    secureOptionTLS: "TLS (465)",
+    "Ignore TLS Error": "Ignorer les erreurs TLS",
+    "From Email": "Depuis l'Email",
+    "To Email": "Vers l'Email",
+    smtpCC: "CC",
+    smtpBCC: "BCC",
+    discord: "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
     wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans 'Paramètres du Serveur' -> 'Intégrations' -> 'Créer un Webhook'",
-    'Bot Display Name': 'Nom du bot (affiché)',
-    'Prefix Custom Message': 'Prefixe du message personnalisé',
-    'Hello @everyone is...': "Bonjour {'@'}everyone il...",
-    teams: 'Microsoft Teams',
-    'Webhook URL': 'Webhook URL',
-    wayToGetTeamsURL: 'Vous pouvez apprendre comment créer un Webhook {0}.',
-    signal: 'Signal',
-    Number: 'Numéro',
-    Recipients: 'Destinataires',
+    "Bot Display Name": "Nom du bot (affiché)",
+    "Prefix Custom Message": "Prefixe du message personnalisé",
+    "Hello @everyone is...": "Bonjour {'@'}everyone il...",
+    teams: "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    wayToGetTeamsURL: "Vous pouvez apprendre comment créer un Webhook {0}.",
+    signal: "Signal",
+    Number: "Numéro",
+    Recipients: "Destinataires",
     needSignalAPI: "Vous avez besoin d'un client Signal avec l'API REST.",
     wayToCheckSignalURL: "Vous pouvez regarder l'URL sur comment le mettre en place :",
-    signalImportant: 'IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !',
-    gotify: 'Gotify',
-    'Application Token': 'Application Token',
-    'Server URL': 'Server URL',
-    Priority: 'Priorité',
-    slack: 'Slack',
-    'Icon Emoji': 'Icon Emoji',
-    'Channel Name': 'Nom du salon',
-    'Uptime Kuma URL': 'Uptime Kuma URL',
+    signalImportant: "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
+    gotify: "Gotify",
+    "Application Token": "Application Token",
+    "Server URL": "Server URL",
+    Priority: "Priorité",
+    slack: "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Nom du salon",
+    "Uptime Kuma URL": "Uptime Kuma URL",
     aboutWebhooks: "Plus d'informations sur les Webhooks ici : {0}",
     aboutChannelName: "Mettez le nom du salon dans {0} dans 'Channel Name' si vous voulez bypass le salon Webhook. Ex : #autre-salon",
     aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
-    emojiCheatSheet: 'Aide emoji : {0}',
-    'rocket.chat': 'Rocket.chat',
-    pushover: 'Pushover',
-    pushy: 'Pushy',
-    octopush: 'Octopush',
-    promosms: 'PromoSMS',
-    lunasea: 'LunaSea',
-    apprise: 'Apprise (Prend en charge plus de 50 services de notification)',
-    pushbullet: 'Pushbullet',
-    line: 'Line Messenger',
-    mattermost: 'Mattermost',
-    'User Key': "Clé d'utilisateur",
-    Device: 'Appareil',
-    'Message Title': 'Titre du message',
-    'Notification Sound': 'Son de notification',
-    'More info on:': "Plus d'informations sur : {0}",
+    emojiCheatSheet: "Aide emoji : {0}",
+    "rocket.chat": "Rocket.chat",
+    pushover: "Pushover",
+    pushy: "Pushy",
+    octopush: "Octopush",
+    promosms: "PromoSMS",
+    lunasea: "LunaSea",
+    apprise: "Apprise (Prend en charge plus de 50 services de notification)",
+    pushbullet: "Pushbullet",
+    line: "Line Messenger",
+    mattermost: "Mattermost",
+    "User Key": "Clé d'utilisateur",
+    Device: "Appareil",
+    "Message Title": "Titre du message",
+    "Notification Sound": "Son de notification",
+    "More info on:": "Plus d'informations sur : {0}",
     pushoverDesc1: "Priorité d'urgence (2) a par défaut 30 secondes de délai dépassé entre les tentatives et expierera après 1 heure.",
     pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ 'Device'.",
-    'SMS Type': 'SMS Type',
-    octopushTypePremium: 'Premium (Rapide - recommandé pour les alertes)',
+    "SMS Type": "SMS Type",
+    octopushTypePremium: "Premium (Rapide - recommandé pour les alertes)",
     octopushTypeLowCost: "À bas prix (Lent, bloqué de temps en temps par l'opérateur)",
-    'Check octopush prices': "Vérifier les prix d'octopush {0}.",
-    octopushPhoneNumber: 'Numéro de téléphone (format int., ex : +33612345678) ',
+    "Check octopush prices": "Vérifier les prix d'octopush {0}.",
+    octopushPhoneNumber: "Numéro de téléphone (format int., ex : +33612345678) ",
     octopushSMSSender: "Nom de l'envoyer : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
-    'LunaSea Device ID': 'LunaSea Device ID',
-    'Apprise URL': 'Apprise URL',
-    'Example:': 'Exemple : {0}',
-    'Read more:': 'En savoir plus : {0}',
-    'Status:': 'Status : {0}',
-    'Read more': 'En savoir plus',
-    appriseInstalled: 'Apprise est installé.',
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Exemple : {0}",
+    "Read more:": "En savoir plus : {0}",
+    "Status:": "Status : {0}",
+    "Read more": "En savoir plus",
+    appriseInstalled: "Apprise est installé.",
     appriseNotInstalled: "Apprise n'est pas installé. {0}",
-    'Access Token': "Token d'accès",
-    'Channel access token': "Token d'accès au canal",
-    'Line Developers Console': 'Ligne console de développeurs',
-    lineDevConsoleTo: 'Ligne console de développeurs - {0}',
-    'Basic Settings': 'Paramètres de base',
-    'User ID': 'Identifiant utilisateur',
-    'Messaging API': 'Messaging API',
+    "Access Token": "Token d'accès",
+    "Channel access token": "Token d'accès au canal",
+    "Line Developers Console": "Ligne console de développeurs",
+    lineDevConsoleTo: "Ligne console de développeurs - {0}",
+    "Basic Settings": "Paramètres de base",
+    "User ID": "Identifiant utilisateur",
+    "Messaging API": "Messaging API",
     wayToGetLineChannelToken: "Premièrement accéder à {0}, créez un Provider et un Salon (Messaging API), puis vous pourrez avoir le Token d'accès du salon ainsi que l'Identifiant utilisateur depuis le même menu.",
-    'Icon URL': 'Icon URL',
-    aboutIconURL: `Vous pouvez mettre un lien vers l'image dans "Icon URL" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.`,
-    aboutMattermostChannelName: `Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ "Channel Name". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex : #autre-salon`,
-    matrix: 'Matrix',
-    promosmsTypeEco: 'SMS ECO - Pas cher mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.',
+    "Icon URL": "Icon URL",
+    aboutIconURL: "Vous pouvez mettre un lien vers l'image dans \"Icon URL\" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.",
+    aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ \"Channel Name\". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex : #autre-salon",
+    matrix: "Matrix",
+    promosmsTypeEco: "SMS ECO - Pas cher mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.",
     promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux déstinataires Polonais.",
     promosmsTypeFull: "SMS FULL - Version Premium des SMS, Vous pouvez mettre le nom de l'expéditeur (Vous devez vous enregistrer avant). Fiable pour les alertes.",
     promosmsTypeSpeed: "SMS SPEED - La plus haute des priorités dans le système. Très rapide et fiable mais cher (environ le double du prix d'un SMS FULL).",
-    promosmsPhoneNumber: 'Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)',
+    promosmsPhoneNumber: "Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)",
     promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    'Primary Base URL': 'Primary Base URL',
-    emailCustomSubject: 'Sujet personalisé',
-    clicksendsms: 'ClickSend SMS',
-    checkPrice: 'Vérification {0} tarifs :',
+    "Primary Base URL": "Primary Base URL",
+    emailCustomSubject: "Sujet personalisé",
+    clicksendsms: "ClickSend SMS",
+    checkPrice: "Vérification {0} tarifs :",
     apiCredentials: "Crédentials de l'API",
     octopushLegacyHint: "Vous utilisez l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
-    'Feishu WebHookUrl': 'Feishu WebHookURL',
+    "Feishu WebHookUrl": "Feishu WebHookURL",
     matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultatif)",
-    'Internal Room Id': 'ID de la salle interne',
+    "Internal Room Id": "ID de la salle interne",
     matrixDesc1: "Vous pouvez trouver l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est censé ressembler à !QMdRCpUIfLwsfjxye6:home.server.",
     matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Au lieu de cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
-    Method: 'Méthode',
-    Body: 'Le corps',
-    Headers: 'En-têtes',
-    PushUrl: 'Push URL',
-    HeadersInvalidFormat: 'Les en-têtes de la requête ne sont pas dans un format JSON valide: ',
+    Method: "Méthode",
+    Body: "Le corps",
+    Headers: "En-têtes",
+    PushUrl: "Push URL",
+    HeadersInvalidFormat: "Les en-têtes de la requête ne sont pas dans un format JSON valide: ",
     BodyInvalidFormat: "Le corps de la requête n'est pas dans un format JSON valide: ",
-    'Monitor History': 'Historique de la sonde',
+    "Monitor History": "Historique de la sonde",
     clearDataOlderThan: "Garder l'historique des données de la sonde durant {0} jours.",
-    PasswordsDoNotMatch: 'Les mots de passe ne correspondent pas.',
-    records: 'Enregistrements',
-    'One record': 'Un enregistrement',
+    PasswordsDoNotMatch: "Les mots de passe ne correspondent pas.",
+    records: "Enregistrements",
+    "One record": "Un enregistrement",
     steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin  d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
-    'Current User': 'Utilisateur actuel',
-    recent: 'Récent',
-    alertaApiEndpoint: 'API Endpoint',
-    alertaEnvironment: 'Environement',
+    "Current User": "Utilisateur actuel",
+    recent: "Récent",
+    alertaApiEndpoint: "API Endpoint",
+    alertaEnvironment: "Environement",
     alertaApiKey: "Clé de l'API",
     alertaAlertState: "État de l'Alerte",
-    alertaRecoverState: 'État de récupération',
-    resendEveryXTimes: 'Renvoyez toutes les {0} fois',
-    resendDisabled: 'Renvoi désactivé',
-    dnsPortDescription: 'Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.',
-    'Resend Notification if Down X times consequently': "Renvoyer la notification a partir d'un certain temps",
-    'Push URL': 'Push URL',
-    needPushEvery: 'Vous devez appeler cette URL toutes les {0} secondes.',
-    pushOptionalParams: 'parametres optionnels: {0}',
-    'disableauth.message1': "Voulez-vous vraiment <strong>désactiver l'authentification</strong>?",
-    'disableauth.message2': "Il est conçu pour les scénarios <strong>où vous avez l'intention d'implémenter une authentification tierce</strong> devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
-    'Please use this option carefully!': 'Veuillez utiliser cette option avec précaution !',
-    PushByTechulus: 'Pousser par Techulus',
-    GoogleChat: 'Google Chat (Google Workspace uniquement)',
-    Done: 'Fait',
-    Info: 'Info',
-    Security: 'Sécurité',
-    'Steam API Key': 'Clé API Steam',
-    'Shrink Database': 'Réduire la base de données',
-    'Pick a RR-Type...': 'Pick a RR-Type...',
-    'Pick Accepted Status Codes...': 'Pick Accepted Status Codes...',
-    Default: 'Défaut',
-    'HTTP Options': 'HTTP Options',
-    'Create Incident': 'Créer un incident',
-    Title: 'Titre',
-    Content: 'Contenu',
-    Style: 'Style',
-    info: 'info',
-    warning: 'Attention',
-    danger: 'danger',
-    error: 'Erreur',
-    critical: 'critique',
-    primary: 'primaire',
-    light: 'blanc',
-    dark: 'Noir',
-    Post: 'Post',
-    'Please input title and content': 'Veuillez entrer le titre et le contenu',
-    Created: 'Created',
-    'Last Updated': 'Dernière mise à jour',
-    Unpin: 'Détacher',
-    'Switch to Light Theme': 'Passer au thème clair',
-    'Switch to Dark Theme': 'Passer au thème sombre',
-    'Show Tags': 'Voir les étiquettes',
-    'Hide Tags': 'Masquer les étiquettes',
-    Description: 'Description',
-    'No monitors available.': 'Aucun moniteur disponible.',
-    'Add one': 'En rajouter un',
-    'No Monitors': 'Aucun moniteur',
-    'Untitled Group': 'Groupe sans titre',
-    Services: 'Services',
-    Discard: 'Annuler',
-    Cancel: 'Annuler',
+    alertaRecoverState: "État de récupération",
+    resendEveryXTimes: "Renvoyez toutes les {0} fois",
+    resendDisabled: "Renvoi désactivé",
+    dnsPortDescription: "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
+    "Resend Notification if Down X times consequently": "Renvoyer la notification a partir d'un certain temps",
+    "Push URL": "Push URL",
+    needPushEvery: "Vous devez appeler cette URL toutes les {0} secondes.",
+    pushOptionalParams: "parametres optionnels: {0}",
+    "disableauth.message1": "Voulez-vous vraiment <strong>désactiver l'authentification</strong>?",
+    "disableauth.message2": "Il est conçu pour les scénarios <strong>où vous avez l'intention d'implémenter une authentification tierce</strong> devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
+    "Please use this option carefully!": "Veuillez utiliser cette option avec précaution !",
+    PushByTechulus: "Pousser par Techulus",
+    GoogleChat: "Google Chat (Google Workspace uniquement)",
+    Done: "Fait",
+    Info: "Info",
+    Security: "Sécurité",
+    "Steam API Key": "Clé API Steam",
+    "Shrink Database": "Réduire la base de données",
+    "Pick a RR-Type...": "Pick a RR-Type...",
+    "Pick Accepted Status Codes...": "Pick Accepted Status Codes...",
+    Default: "Défaut",
+    "HTTP Options": "HTTP Options",
+    "Create Incident": "Créer un incident",
+    Title: "Titre",
+    Content: "Contenu",
+    Style: "Style",
+    info: "info",
+    warning: "Attention",
+    danger: "danger",
+    error: "Erreur",
+    critical: "critique",
+    primary: "primaire",
+    light: "blanc",
+    dark: "Noir",
+    Post: "Post",
+    "Please input title and content": "Veuillez entrer le titre et le contenu",
+    Created: "Created",
+    "Last Updated": "Dernière mise à jour",
+    Unpin: "Détacher",
+    "Switch to Light Theme": "Passer au thème clair",
+    "Switch to Dark Theme": "Passer au thème sombre",
+    "Show Tags": "Voir les étiquettes",
+    "Hide Tags": "Masquer les étiquettes",
+    Description: "Description",
+    "No monitors available.": "Aucun moniteur disponible.",
+    "Add one": "En rajouter un",
+    "No Monitors": "Aucun moniteur",
+    "Untitled Group": "Groupe sans titre",
+    Services: "Services",
+    Discard: "Annuler",
+    Cancel: "Annuler",
     shrinkDatabaseDescription: "Déclencher la base de données VACUUM pour SQLite. Si votre base de données est créée après 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
     serwersmsAPIUser: "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
-    serwersmsAPIPassword: 'Mot de passe API',
-    serwersmsPhoneNumber: 'Numéro de téléphone',
+    serwersmsAPIPassword: "Mot de passe API",
+    serwersmsPhoneNumber: "Numéro de téléphone",
     serwersmsSenderName: "Nom de l'expéditeur du SMS (enregistré via le portail client)",
-    Customize: 'Personnaliser',
-    'Custom Footer': 'Pied de page personnalisé',
-    'Custom CSS': 'CSS personnalisé',
+    Customize: "Personnaliser",
+    "Custom Footer": "Pied de page personnalisé",
+    "Custom CSS": "CSS personnalisé",
     deleteStatusPageMsg: "Voulez-vous vraiment supprimer cette page d'état ?",
-    Proxies: 'Proxies',
-    default: 'Défaut',
-    enabled: 'Activé',
-    setAsDefault: 'Définir par défaut',
-    deleteProxyMsg: 'Voulez-vous vraiment supprimer ce proxy pour tous les moniteurs ?',
-    proxyDescription: 'Les proxys doivent être affectés à un moniteur pour fonctionner.',
+    Proxies: "Proxies",
+    default: "Défaut",
+    enabled: "Activé",
+    setAsDefault: "Définir par défaut",
+    deleteProxyMsg: "Voulez-vous vraiment supprimer ce proxy pour tous les moniteurs ?",
+    proxyDescription: "Les proxys doivent être affectés à un moniteur pour fonctionner.",
     enableProxyDescription: "Ce proxy n'aura pas d'effet sur les demandes de moniteur tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de tous les moniteurs en fonction de l'état d'activation.",
-    setAsDefaultProxyDescription: 'Ce proxy sera activé par défaut pour les nouveaux moniteurs. Vous pouvez toujours désactiver le proxy séparément pour chaque moniteur.',
-    Valid: 'Valide',
-    Invalid: 'Non valide',
-    User: 'Utilisateur',
-    Installed: 'Installé',
-    'Not installed': 'Pas installé',
-    'Remove Token': 'Supprimer le jeton',
-    Slug: 'chemin',
-    'The slug is already taken. Please choose another slug.': 'Le chemin est déjà pris. Veuillez choisir un autre chemin.',
-    Authentication: 'Authentication',
-    'Page Not Found': 'Page non trouvée',
-    Backup: 'Sauvegarde',
-    About: 'À propos de',
-    'Footer Text': 'Texte de pied de page',
-    'Domain Names': 'Noms de domaine',
-    signedInDisp: 'Connecté en tant que {0}',
-    signedInDispDisabled: 'Authentification désactivée.',
-    'Show update if available': 'Afficher la mise à jour si disponible',
-    'Also check beta release': 'Vérifiez également la version bêta',
-    'Steam Game Server': 'Serveur de jeu Steam',
-    'Most likely causes:': 'Causes les plus probables:',
-    'The resource is no longer available.': "La ressource n'est plus disponible.",
-    'There might be a typing error in the address.': "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
-    'What you can try:': 'Ce que vous pouvez essayer:',
-    'Retype the address.': "Retapez l'adresse.",
-    'Go back to the previous page.': 'Retournez à la page précédente.',
-    'Coming Soon': 'À venir',
-    settingsCertificateExpiry: 'Expiration du certificat TLS',
-    certificationExpiryDescription: 'Les moniteurs HTTPS déclenchent une notification lorsque le certificat TLS expire dans:',
-    'Setup Docker Host': "Configurer l'hôte Docker",
-    'Connection Type': 'Type de connexion',
-    deleteDockerHostMsg: 'Voulez-vous vraiment supprimer cet hôte Docker pour tous les moniteurs ?',
-    'Container Name / ID': 'Nom / ID du conteneur',
-    'Docker Host': 'Hôte Docker',
-    'Docker Hosts': 'Hôtes Docker',
-    Domain: 'Domaine',
+    setAsDefaultProxyDescription: "Ce proxy sera activé par défaut pour les nouveaux moniteurs. Vous pouvez toujours désactiver le proxy séparément pour chaque moniteur.",
+    Valid: "Valide",
+    Invalid: "Non valide",
+    User: "Utilisateur",
+    Installed: "Installé",
+    "Not installed": "Pas installé",
+    "Remove Token": "Supprimer le jeton",
+    Slug: "chemin",
+    "The slug is already taken. Please choose another slug.": "Le chemin est déjà pris. Veuillez choisir un autre chemin.",
+    Authentication: "Authentication",
+    "Page Not Found": "Page non trouvée",
+    Backup: "Sauvegarde",
+    About: "À propos de",
+    "Footer Text": "Texte de pied de page",
+    "Domain Names": "Noms de domaine",
+    signedInDisp: "Connecté en tant que {0}",
+    signedInDispDisabled: "Authentification désactivée.",
+    "Show update if available": "Afficher la mise à jour si disponible",
+    "Also check beta release": "Vérifiez également la version bêta",
+    "Steam Game Server": "Serveur de jeu Steam",
+    "Most likely causes:": "Causes les plus probables:",
+    "The resource is no longer available.": "La ressource n'est plus disponible.",
+    "There might be a typing error in the address.": "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
+    "What you can try:": "Ce que vous pouvez essayer:",
+    "Retype the address.": "Retapez l'adresse.",
+    "Go back to the previous page.": "Retournez à la page précédente.",
+    "Coming Soon": "À venir",
+    settingsCertificateExpiry: "Expiration du certificat TLS",
+    certificationExpiryDescription: "Les moniteurs HTTPS déclenchent une notification lorsque le certificat TLS expire dans:",
+    "Setup Docker Host": "Configurer l'hôte Docker",
+    "Connection Type": "Type de connexion",
+    deleteDockerHostMsg: "Voulez-vous vraiment supprimer cet hôte Docker pour tous les moniteurs ?",
+    "Container Name / ID": "Nom / ID du conteneur",
+    "Docker Host": "Hôte Docker",
+    "Docker Hosts": "Hôtes Docker",
+    Domain: "Domaine",
     trustProxyDescription: "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma est en retard, comme Nginx ou Apache, vous devez l'activer.",
     wayToGetLineNotifyToken: "Vous pouvez obtenir un jeton d'accès auprès de {0}",
-    Examples: 'Exemples',
-    'Home Assistant URL': 'Home Assistant URL',
-    'Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ': "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
-    'Notification Service': 'Service de notifications',
-    'default: notify all devices': 'par défaut: notifier tous les appareils',
-    'A list of Notification Services can be found in Home Assistant under "Developer Tools > Services" search for "notification" to find your device/phone name.': 'Une liste des services de notification peut être trouvée dans Home Assistant sous "Outils de développement > Services" recherchez "notification" pour trouver le nom de votre appareil/téléphone.',
-    'Automations can optionally be triggered in Home Assistant:': 'Les automatisations peuvent éventuellement être déclenchées dans Home Assistant:',
-    'Trigger type:': 'Type de déclencheur:',
-    'Event type:': "Type d'événement:",
-    'Event data:': "Données d'événement:",
-  }
\ No newline at end of file
+    Examples: "Exemples",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
+    "Notification Service": "Service de notifications",
+    "default: notify all devices": "par défaut: notifier tous les appareils",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
+    "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant:",
+    "Trigger type:": "Type de déclencheur:",
+    "Event type:": "Type d'événement:",
+    "Event data:": "Données d'événement:",
+};

From 75deab2cc576bf18a07732faf38a95eac9189b7c Mon Sep 17 00:00:00 2001
From: burakurer <58211081+burakurer@users.noreply.github.com>
Date: Tue, 6 Sep 2022 23:04:24 +0300
Subject: [PATCH 113/803] Update tr-TR.js

---
 src/languages/tr-TR.js | 69 ++++++++++++++++++++++++++++++++++++------
 1 file changed, 59 insertions(+), 10 deletions(-)

diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index 215b5381..606fa7e1 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -2,6 +2,8 @@ export default {
     languageName: "Türkçe",
     checkEverySecond: "{0} Saniyede bir kontrol et.",
     retryCheckEverySecond: "{0} Saniyede bir dene.",
+    resendEveryXTimes: "Her {0} bir yeniden gönder",
+    resendDisabled: "Yeniden gönderme devre dışı",
     retriesDescription: "Servisin kapalı olarak işaretlenmeden ve bir bildirim gönderilmeden önce maksimum yeniden deneme sayısı",
     ignoreTLSError: "HTTPS web siteleri için TLS/SSL hatasını yoksay",
     upsideDownModeDescription: "Servisin durumunu tersine çevirir. Servis çalışıyorsa kapalı olarak işaretler.",
@@ -72,6 +74,7 @@ export default {
     "Heartbeat Interval": "Servis Test Aralığı",
     Retries: "Yeniden deneme",
     "Heartbeat Retry Interval": "Sağlık Durumları Tekrar Deneme Sıklığı",
+    "Resend Notification if Down X times consequently": "Sonuç olarak X kez düşerse bildirimi yeniden gönder",
     Advanced: "Gelişmiş",
     "Upside Down Mode": "Ters/Düz Modu",
     "Max. Redirects": "Maksimum Yönlendirme",
@@ -333,6 +336,8 @@ export default {
     info: "info",
     warning: "warning",
     danger: "danger",
+    error: "hata",
+    critical: "kritik",
     primary: "primary",
     light: "light",
     dark: "dark",
@@ -373,6 +378,13 @@ export default {
     smtpDkimHashAlgo: "Hash Algoritması (Opsiyonel)",
     smtpDkimheaderFieldNames: "İmzalanacak Başlık Anahtarları (Opsiyonel)",
     smtpDkimskipFields: "İmzalamayacak Başlık Anahtarları (Opsiyonel)",
+    wayToGetPagerDutyKey: "Bunu Hizmet -> Hizmet Dizini -> (Bir hizmet seçin) -> Entegrasyonlar -> Entegrasyon ekle'ye giderek alabilirsiniz. Burada \"Events API V2\" için arama yapabilirsiniz. Daha fazla bilgi {0}",
+    "Integration Key": "Entegrasyon Anahtarı",
+    "Integration URL": "Entegrasyon URL'si",
+    "Auto resolve or acknowledged": "Otomatik çözümleme veya onaylandı",
+    "do nothing": "hiçbir şey yapma",
+    "auto acknowledged": "otomatik onaylandı",
+    "auto resolve": "otomatik çözümleme",
     gorush: "Gorush",
     alerta: "Alerta",
     alertaApiEndpoint: "API Endpoint",
@@ -399,6 +411,8 @@ export default {
     SignName: "SignName",
     "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir:",
     "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
     WebHookUrl: "WebHookUrl",
     SecretKey: "SecretKey",
     "For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
@@ -432,6 +446,7 @@ export default {
     Next: "Sonraki",
     "The slug is already taken. Please choose another slug.": "Slug zaten alındı. Lütfen başka bir slug seçin.",
     "No Proxy": "Proxy Yok",
+    Authentication: "Kimlik doğrulama",
     "HTTP Basic Auth": "HTTP Temel Yetkilendirme",
     "New Status Page": "Yeni Durum Sayfası",
     "Page Not Found": "Sayfa bulunamadı",
@@ -443,6 +458,8 @@ export default {
     "Message:": "Mesaj:",
     "Don't know how to get the token? Please read the guide:": "Tokeni nasıl alacağınızı bilmiyor musunuz? Lütfen kılavuzu okuyun:",
     "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Halihazırda Cloudflare Tüneli üzerinden bağlanıyorsanız mevcut bağlantı kesilebilir. Durdurmak istediğinden emin misin? Onaylamak için mevcut şifrenizi yazın.",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Trust Proxy",
     "Other Software": "Diğer Yazılımlar",
     "For example: nginx, Apache and Traefik.": "Örneğin: nginx, Apache ve Traefik.",
     "Please read": "Lütfen oku",
@@ -455,6 +472,7 @@ export default {
     "Domain Name Expiry Notification": "Alan Adı Sona Erme Bildirimi",
     Proxy: "Proxy",
     "Date Created": "Tarih Oluşturuldu",
+    HomeAssistant: "Home Assistant",
     onebotHttpAddress: "OneBot HTTP Adresi",
     onebotMessageType: "OneBot Mesaj Türü",
     onebotGroupMessage: "Grup",
@@ -467,6 +485,12 @@ export default {
     "Domain Names": "Alan isimleri",
     signedInDisp: "{0} olarak oturum açıldı",
     signedInDispDisabled: "Yetkilendirme Devre Dışı.",
+    RadiusSecret: "Radius Secret",
+    RadiusSecretDescription: "İstemci ve sunucu arasında paylaşılan gizli anahtar",
+    RadiusCalledStationId: "Aranan İstasyon Kimliği",
+    RadiusCalledStationIdDescription: "Aranan cihazın tanımlayıcısı",
+    RadiusCallingStationId: "Arayan İstasyon Kimliği",
+    RadiusCallingStationIdDescription: "Arayan cihazın tanımlayıcısı",
     "Certificate Expiry Notification": "Sertifika Sona Erme Bildirimi",
     "API Username": "API Kullanıc Adı",
     "API Key": "API Anahtarı",
@@ -475,7 +499,7 @@ export default {
     "Leave blank to use a shared sender number.": "Paylaşılan bir gönderen numarası kullanmak için boş bırakın.",
     "Octopush API Version": "Octopush API Sürümü",
     "Legacy Octopush-DM": "Eski Octopush-DM",
-    "endpoint": "endpoint",
+    endpoint: "uç nokta",
     octopushAPIKey: "Kontrol panelindeki HTTP API kimlik bilgilerinden \"API Key\"",
     octopushLogin: "Kontrol panelindeki HTTP API kimlik bilgilerinden \"Login\"",
     promosmsLogin: "API Oturum Açma Adı",
@@ -518,13 +542,38 @@ export default {
     "Go back to the previous page.": "Bir önceki sayfaya geri git.",
     "Coming Soon": "Yakında gelecek",
     wayToGetClickSendSMSToken: "API Kullanıcı Adı ve API Anahtarını {0} adresinden alabilirsiniz.",
-    error: "hata",
-    critical: "kritik",
-    wayToGetPagerDutyKey: "Bunu şuraya giderek alabilirsiniz: Servis -> Servis Dizini -> (Bir servis seçin) -> Entegrasyonlar -> Entegrasyon ekle. Burada \"Events API V2\" için arama yapabilirsiniz. Daha fazla bilgi {0}",
-    "Integration Key": "Entegrasyon Anahtarı",
-    "Integration URL": "Entegrasyon URL",
-    "Auto resolve or acknowledged": "Otomatik çözümleme veya onaylama",
-    "do nothing": "hiçbir şey yapma",
-    "auto acknowledged": "otomatik onaylama",
-    "auto resolve": "otomatik çözümleme",
+    "Connection String": "Bağlantı dizisi",
+    Query: "Sorgu",
+    settingsCertificateExpiry: "TLS Sertifikasının Geçerlilik Süresi",
+    certificationExpiryDescription: "HTTPS Monitörleri, TLS sertifikasının süresi dolduğunda bildirimi tetikler:",
+    "Setup Docker Host": "Docker Ana Bilgisayarını Kur",
+    "Connection Type": "Bağlantı türü",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "Bu docker ana bilgisayarını tüm monitörler için silmek istediğinizden emin misiniz?",
+    socket: "Soket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker Konteyneri",
+    "Container Name / ID": "Konteyner Adı / Kimliği",
+    "Docker Host": "Docker Ana Bilgisayarı",
+    "Docker Hosts": "Docker Ana Bilgisayarları",
+    "ntfy Topic": "ntfy Konu",
+    "Domain": "Domain",
+    "Workstation": "İş İstasyonu",
+    disableCloudflaredNoAuthMsg: "Yetki Yok modundasınız, şifre gerekli değil.",
+    trustProxyDescription: "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.",
+    wayToGetLineNotifyToken: "{0} adresinden bir erişim jetonu alabilirsiniz.",
+    Examples: "Örnekler",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Long-Lived Erişim Anahtarı",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Erişim Anahtarı, profil adınıza (sol altta) tıklayarak ve aşağıya kaydırarak ve ardından Anahtar Oluştur'a tıklayarak oluşturulabilir. ",
+    "Notification Service": "Bildirim Hizmeti",
+    "default: notify all devices": "varsayılan: tüm cihazları bilgilendir",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Cihazınızın/telefonunuzun adını bulmak için Home Assistant'ta \"Geliştirici Araçları > Hizmetler\" \"bildirim\" araması altında bir Bildirim Hizmetleri listesi bulunabilir.",
+    "Automations can optionally be triggered in Home Assistant:": "Otomasyonlar isteğe bağlı olarak Home Assistant'ta tetiklenebilir:",
+    "Trigger type:": "Trigger tipi:",
+    "Event type:": "Etkinlik tipi:",
+    "Event data:": "Etkinlik verileri:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ardından bir eylem seçin, örneğin RGB ışığının kırmızı olduğu sahneyi değiştirin.",
+    "Frontend Version": "Frontend Sürümü",
+    "Frontend Version do not match backend version!": "Frontend Sürümü, backend sürümüyle eşleşmiyor!",
 };

From 9e62a6ec7d0c0f25bda3998606442e4954fec83e Mon Sep 17 00:00:00 2001
From: Michael Telgkamp <michael.telgkamp@mindscreen.de>
Date: Thu, 8 Sep 2022 14:29:45 +0200
Subject: [PATCH 114/803] add some new translated strings

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

diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index ef47909c..bd5bf87d 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -458,4 +458,122 @@ export default {
     "Domain Names": "Domainnamen",
     signedInDisp: "Angemeldet als {0}",
     signedInDispDisabled: "Authentifizierung deaktiviert.",
+    dnsPortDescription: "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
+    topic: "Thema",
+    topicExplanation: "MQTT Thema für den monitor",
+    successMessage: "Erfolgsnachricht",
+    successMessageExplanation: "MQTT Nachricht, die als Erfolg angesehen wird",
+    error: "Fehler",
+    critical: "kritisch",
+    wayToGetPagerDutyKey: "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
+    "Integration Key": "Schlüssel der Integration",
+    "Integration URL": "URL der Integration",
+    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
+    "do nothing": "nichts tun",
+    "auto acknowledged": "automatisch bestätigen",
+    "auto resolve": "automatisch lösen",
+    "Bark Group": "Bark Gruppe",
+    "Bark Sound": "Bark Klang",
+    "HTTP Headers": "HTTP Kopfzeilen",
+    "Trust Proxy": "Vertrauenswürdiger Proxy",
+    Proxy: "Proxy",
+    HomeAssistant: "Home Assistant",
+    onebotHttpAddress: "OneBot HTTP Adresse",
+    onebotMessageType: "OneBot Nachrichtentyp",
+    onebotGroupMessage: "Gruppe",
+    onebotPrivateMessage: "Privat",
+    onebotUserOrGroupId: "Gruppe/Nutzer ID",
+    onebotSafetyTips: "Zur Sicherheit ein access token setzen",
+    "PushDeer Key": "PushDeer Schlüssel",
+    RadiusSecret: "Radius Geheimnis",
+    RadiusSecretDescription: "Geteiltes Geheimnis zwischen Client und Server",
+    RadiusCalledStationId: "ID der angesprochenen Station",
+    RadiusCalledStationIdDescription: "Identifikation des angesprochenen Geräts",
+    RadiusCallingStationId: "ID der ansprechenden Station",
+    RadiusCallingStationIdDescription: "Identifikation des ansprechenden Geräts",
+    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
+    "API Username": "API Nutzername",
+    "API Key": "API Schlüssel",
+    "Recipient Number": "Empfängernummer",
+    "From Name/Number": "Von Name/Nummer",
+    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Sendernummer zu nutzen.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "Endpunkt",
+    octopushAPIKey: "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
+    octopushLogin: "\"Login\" der HTTP API Zugangsdaten im control panel",
+    promosmsLogin: "API Login Name",
+    promosmsPassword: "API Password",
+    "pushoversounds pushover": "Pushover (Standard)",
+    "pushoversounds bike": "Fahrrad",
+    "pushoversounds bugle": "Signalhorn",
+    "pushoversounds cashregister": "Kasse",
+    "pushoversounds classical": "Klassisch",
+    "pushoversounds cosmic": "Kosmisch",
+    "pushoversounds falling": "Abfallend",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Eingang",
+    "pushoversounds intermission": "Pause",
+    "pushoversounds magic": "Magisch",
+    "pushoversounds mechanical": "Mechanisch",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Sirene",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Schlepper Horn",
+    "pushoversounds alien": "Außerirdisch (lang)",
+    "pushoversounds climb": "Ansteigende (lang)",
+    "pushoversounds persistent": "Hartnäckig (lang)",
+    "pushoversounds echo": "Pushover Echo (lang)",
+    "pushoversounds updown": "Auf und Ab (lang)",
+    "pushoversounds vibrate": "Nur vibrieren",
+    "pushoversounds none": "Nichts (Stille)",
+    pushyAPIKey: "Geheimer API Schlüssel",
+    pushyToken: "Gerätetoken",
+    "Show update if available": "Verfügbare Updates anzeigen",
+    "Also check beta release": "Auch nach beta Versionen schauen",
+    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
+    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Wahrscheinliche Ursachen:",
+    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
+    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
+    "What you can try:": "Was du versuchen kannst:",
+    "Retype the address.": "Schreibe die Adresse erneut.",
+    "Go back to the previous page.": "Gehe zur vorigen Seite.",
+    "Coming Soon": "Kommt bald",
+    wayToGetClickSendSMSToken: "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
+    "Connection String": "Verbindungstext",
+    Query: "Abfrage",
+    settingsCertificateExpiry: "TLS Zertifikatsablauf",
+    certificationExpiryDescription: "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
+    "Setup Docker Host": "Docker Host einrichten",
+    "Connection Type": "Verbindungstyp",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "Bist du sicher diesen docker host für alle Monitore zu löschen?",
+    socket: "Socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Thema",
+    Domain: "Domain",
+    Workstation: "Workstation",
+    disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren modus, ein Passwort wird nicht benötigt.",
+    trustProxyDescription: "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
+    wayToGetLineNotifyToken: "Du kannst hier ein Token erhalten: {0}",
+    Examples: "Beispiele",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Lange gültiges Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
+    "Notification Service": "Benachrichtigungsdienst",
+    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdiesnte kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
+    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
+    "Trigger type:": "Auslösertyp:",
+    "Event type:": "Ereignistyp:",
+    "Event data:": "Ereignis daten:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
+    "Frontend Version": "Frontend Version",
+    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
 };

From 995276badc43ca766fb2e2e0fa6fc1d4ec28226f Mon Sep 17 00:00:00 2001
From: Michael Telgkamp <michael.telgkamp@mindscreen.de>
Date: Thu, 8 Sep 2022 14:30:41 +0200
Subject: [PATCH 115/803] fix typo and formatting in en language string

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

diff --git a/src/languages/en.js b/src/languages/en.js
index f281cade..812d29fa 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -557,9 +557,9 @@ export default {
     "Docker Host": "Docker Host",
     "Docker Hosts": "Docker Hosts",
     "ntfy Topic": "ntfy Topic",
-    "Domain": "Domain",
-    "Workstation": "Workstation",
-    disableCloudflaredNoAuthMsg: "You are in No Auth mode, password is not require.",
+    Domain: "Domain",
+    Workstation: "Workstation",
+    disableCloudflaredNoAuthMsg: "You are in No Auth mode, a password is not required.",
     trustProxyDescription: "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
     wayToGetLineNotifyToken: "You can get an access token from {0}",
     Examples: "Examples",

From 9589fcfdefefacb921cb396656f2b0285952c423 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 8 Sep 2022 22:12:27 +0800
Subject: [PATCH 116/803] Checkout pr without GitHub Cli

---
 docker/dockerfile    |  7 +++----
 extra/checkout-pr.js | 16 +++++++++++++---
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/docker/dockerfile b/docker/dockerfile
index 2938a52f..fd947391 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -31,22 +31,21 @@ WORKDIR /app
 
 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
 
-## Install GitHub CLI
+## Install Git
 RUN apt update \
     && apt --yes --no-install-recommends install curl \
     && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
     && chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
     && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
     && apt update \
-    && apt install gh -y
+    && apt --yes --no-install-recommends  install git
 
 ## Empty the directory, because we have to clone the Git repo.
 RUN rm -rf ./* && chown node /app
 
 USER node
 
-RUN git clone https://github.com/louislam/uptime-kuma.git
-RUN gh pr checkout 2023
+RUN git clone --branch pr-test https://github.com/louislam/uptime-kuma.git .
 RUN npm ci
 
 EXPOSE 3000 3001
diff --git a/extra/checkout-pr.js b/extra/checkout-pr.js
index 64a9dbc1..3528e7d0 100644
--- a/extra/checkout-pr.js
+++ b/extra/checkout-pr.js
@@ -1,11 +1,21 @@
 const childProcess = require("child_process");
 
-if (!process.env.UPTIME_KUMA_PRUPTIME_KUMA_PR) {
-    console.error("Please set a pull request number to the environment variable 'UPTIME_KUMA_PRUPTIME_KUMA_PR'");
+if (!process.env.UPTIME_KUMA_GH_REPO) {
+    console.error("Please set a repo to the environment variable 'UPTIME_KUMA_GH_REPO' (e.g. mhkarimi1383:goalert-notification)");
     process.exit(1);
 }
 
+let inputArray = process.env.UPTIME_KUMA_GH_REPO.split(":");
+
+if (inputArray.length !== 2) {
+    console.error("Invalid format. Please set a repo to the environment variable 'UPTIME_KUMA_GH_REPO' (e.g. mhkarimi1383:goalert-notification)");
+}
+
+let name = inputArray[0];
+let branch = inputArray[1];
+
 console.log("Checkout pr");
 
 // Checkout the pr
-childProcess.spawnSync("gh", [ "pr", "checkout", process.env.UPTIME_KUMA_PR ]);
+childProcess.spawnSync("git", [ "remote", "add", name, `https://github.com/${name}/uptime-kuma` ]);
+childProcess.spawnSync("git", [ "checkout", `name/${branch}`, "--force" ]);

From 6601e9bbbad0e141bf0071b22e185abaf1a971f7 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 8 Sep 2022 22:36:34 +0800
Subject: [PATCH 117/803] Output

---
 extra/checkout-pr.js | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/extra/checkout-pr.js b/extra/checkout-pr.js
index 3528e7d0..4b093334 100644
--- a/extra/checkout-pr.js
+++ b/extra/checkout-pr.js
@@ -17,5 +17,12 @@ let branch = inputArray[1];
 console.log("Checkout pr");
 
 // Checkout the pr
-childProcess.spawnSync("git", [ "remote", "add", name, `https://github.com/${name}/uptime-kuma` ]);
-childProcess.spawnSync("git", [ "checkout", `name/${branch}`, "--force" ]);
+let result = childProcess.spawnSync("git", [ "remote", "add", name, `https://github.com/${name}/uptime-kuma` ]);
+
+console.log(result.stdout);
+console.error(result.stderr);
+
+result = childProcess.spawnSync("git", [ "checkout", `name/${branch}`, "--force" ]);
+
+console.log(result.stdout);
+console.error(result.stderr);

From 0244507a070df62fde6075f4216b15a2a8508215 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 8 Sep 2022 22:40:45 +0800
Subject: [PATCH 118/803] Output

---
 extra/checkout-pr.js | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/extra/checkout-pr.js b/extra/checkout-pr.js
index 4b093334..b7d643c5 100644
--- a/extra/checkout-pr.js
+++ b/extra/checkout-pr.js
@@ -19,10 +19,10 @@ console.log("Checkout pr");
 // Checkout the pr
 let result = childProcess.spawnSync("git", [ "remote", "add", name, `https://github.com/${name}/uptime-kuma` ]);
 
-console.log(result.stdout);
-console.error(result.stderr);
+console.log(result.stdout.toString());
+console.error(result.stderr.toString());
 
-result = childProcess.spawnSync("git", [ "checkout", `name/${branch}`, "--force" ]);
+result = childProcess.spawnSync("git", [ "checkout", `${name}/${branch}`, "--force" ]);
 
-console.log(result.stdout);
-console.error(result.stderr);
+console.log(result.stdout.toString());
+console.error(result.stderr.toString());

From dad2ec116450c3168e6cbebd04e5db31e45e776a Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 9 Sep 2022 01:57:42 +0800
Subject: [PATCH 119/803] Use pull

---
 extra/checkout-pr.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/extra/checkout-pr.js b/extra/checkout-pr.js
index b7d643c5..a68f0577 100644
--- a/extra/checkout-pr.js
+++ b/extra/checkout-pr.js
@@ -22,7 +22,7 @@ let result = childProcess.spawnSync("git", [ "remote", "add", name, `https://git
 console.log(result.stdout.toString());
 console.error(result.stderr.toString());
 
-result = childProcess.spawnSync("git", [ "checkout", `${name}/${branch}`, "--force" ]);
+result = childProcess.spawnSync("git", [ "pull", name, branch ]);
 
 console.log(result.stdout.toString());
 console.error(result.stderr.toString());

From 7b8f9c765570a2c7ed5590fc3e0a381d9d7ee87c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 9 Sep 2022 15:49:39 +0800
Subject: [PATCH 120/803] Fix checkout-pr by using fetch & checkout instead of
 pull

---
 docker/dockerfile    | 5 +++--
 extra/checkout-pr.js | 7 ++++++-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/docker/dockerfile b/docker/dockerfile
index fd947391..eea6ba33 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -44,8 +44,9 @@ RUN apt update \
 RUN rm -rf ./* && chown node /app
 
 USER node
-
-RUN git clone --branch pr-test https://github.com/louislam/uptime-kuma.git .
+RUN git config --global user.email "no-reply@no-reply.com"
+RUN git config --global user.name "PR Tester"
+RUN git clone https://github.com/louislam/uptime-kuma.git .
 RUN npm ci
 
 EXPOSE 3000 3001
diff --git a/extra/checkout-pr.js b/extra/checkout-pr.js
index a68f0577..d327e203 100644
--- a/extra/checkout-pr.js
+++ b/extra/checkout-pr.js
@@ -22,7 +22,12 @@ let result = childProcess.spawnSync("git", [ "remote", "add", name, `https://git
 console.log(result.stdout.toString());
 console.error(result.stderr.toString());
 
-result = childProcess.spawnSync("git", [ "pull", name, branch ]);
+result = childProcess.spawnSync("git", [ "fetch", name, branch ]);
+
+console.log(result.stdout.toString());
+console.error(result.stderr.toString());
+
+result = childProcess.spawnSync("git", [ "checkout", branch, "--force" ]);
 
 console.log(result.stdout.toString());
 console.error(result.stderr.toString());

From 87b72191e5a1ee14333c7da73be31652a4c8750d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 9 Sep 2022 16:23:15 +0800
Subject: [PATCH 121/803] Update README.md

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

diff --git a/README.md b/README.md
index 026f3b4d..1b7e9270 100644
--- a/README.md
+++ b/README.md
@@ -157,7 +157,14 @@ You can mention me if you ask a question on Reddit.
 
 ## Contribute
 
-### Beta Version
+### Test Pull Requests
+
+There are a lot of pull requests right now, but I need have a lot of time to test them.
+
+If you want to help, you can check this:
+https://github.com/louislam/uptime-kuma/wiki/Test-Pull-Requests
+
+### Test Beta Version
 
 Check out the latest beta release here: https://github.com/louislam/uptime-kuma/releases
 
@@ -169,5 +176,5 @@ If you want to translate Uptime Kuma into your language, please read: https://gi
 
 Feel free to correct my grammar in this README, source code, or wiki, as my mother language is not English and my grammar is not that great.
 
-### Pull Requests
+### Create Pull Requests
 If you want to modify Uptime Kuma, this guideline may be useful for you: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md

From 97e9bc7705c0fa3d81da4e4f688cf70b375a7452 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 9 Sep 2022 16:24:08 +0800
Subject: [PATCH 122/803] Update README.md

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

diff --git a/README.md b/README.md
index 1b7e9270..b104b2c1 100644
--- a/README.md
+++ b/README.md
@@ -159,7 +159,7 @@ You can mention me if you ask a question on Reddit.
 
 ### Test Pull Requests
 
-There are a lot of pull requests right now, but I need have a lot of time to test them.
+There are a lot of pull requests right now, but I don't have time to test them all.
 
 If you want to help, you can check this:
 https://github.com/louislam/uptime-kuma/wiki/Test-Pull-Requests

From 7f9e29120675dcbaf068d7ee3a834039cd3071b8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 9 Sep 2022 16:36:32 +0800
Subject: [PATCH 123/803] Ignore /cypress in .dockerignore

---
 .dockerignore | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.dockerignore b/.dockerignore
index 4ce0e13a..babc429a 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,6 +1,7 @@
 /.idea
 /node_modules
 /data
+/cypress
 /out
 /test
 /kubernetes

From 3ea57600ba1b80aefb9b05594d38f5cbf22eaa58 Mon Sep 17 00:00:00 2001
From: Mambo <kdevkr@gmail.com>
Date: Sat, 10 Sep 2022 23:16:05 +0900
Subject: [PATCH 124/803] chore: fix typo

Modifying Korean Spelling
---
 src/languages/ko-KR.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index f181389b..f614f518 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -69,7 +69,7 @@ export default {
     Port: "포트",
     "Heartbeat Interval": "하트비트 주기",
     Retries: "재시도",
-    "Heartbeat Retry Interval": "하트비드 재시도 주기",
+    "Heartbeat Retry Interval": "하트비트 재시도 주기",
     Advanced: "고급",
     "Upside Down Mode": "상태 반전 모드",
     "Max. Redirects": "최대 리다이렉트",
@@ -110,7 +110,7 @@ export default {
     "Remember me": "비밀번호 기억하기",
     Login: "로그인",
     "No Monitors, please": "모니터링이 현재 없어요,",
-    "add one": "한번 추가해보실레요?",
+    "add one": "한번 추가해보실래요?",
     "Notification Type": "알림 종류",
     Email: "이메일",
     Test: "테스트",

From 7577477ae815df0cb928d739481db32c495ead26 Mon Sep 17 00:00:00 2001
From: d3vyce <nicolas.sudres@hotmail.fr>
Date: Sat, 10 Sep 2022 21:35:22 +0200
Subject: [PATCH 125/803] Add rel="noopener noreferrer" to html link

---
 src/components/PublicGroupList.vue | 1 +
 src/pages/Details.vue              | 2 +-
 src/pages/StatusPage.vue           | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/components/PublicGroupList.vue b/src/components/PublicGroupList.vue
index e8ed57d8..1eb433ee 100644
--- a/src/components/PublicGroupList.vue
+++ b/src/components/PublicGroupList.vue
@@ -44,6 +44,7 @@
                                                 :href="monitor.element.url"
                                                 class="item-name"
                                                 target="_blank"
+                                                rel="noopener noreferrer"
                                             >
                                                 {{ monitor.element.name }}
                                             </a>
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 0ff0fe77..7cf25892 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -6,7 +6,7 @@
                 <Tag v-for="tag in monitor.tags" :key="tag.id" :item="tag" :size="'sm'" />
             </div>
             <p class="url">
-                <a v-if="monitor.type === 'http' || monitor.type === 'keyword' " :href="monitor.url" target="_blank">{{ monitor.url }}</a>
+                <a v-if="monitor.type === 'http' || monitor.type === 'keyword' " :href="monitor.url" target="_blank" rel="noopener noreferrer">{{ monitor.url }}</a>
                 <span v-if="monitor.type === 'port'">TCP Ping {{ monitor.hostname }}:{{ monitor.port }}</span>
                 <span v-if="monitor.type === 'ping'">Ping: {{ monitor.hostname }}</span>
                 <span v-if="monitor.type === 'keyword'">
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 485b0942..45d5e0c2 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -265,7 +265,7 @@
                 <Editable v-model="config.footerText" tag="div" :contenteditable="enableEditMode" :noNL="false" class="alert-heading p-2" />
 
                 <p v-if="config.showPoweredBy">
-                    {{ $t("Powered by") }} <a target="_blank" href="https://github.com/louislam/uptime-kuma">{{ $t("Uptime Kuma" ) }}</a>
+                    {{ $t("Powered by") }} <a target="_blank" rel="noopener noreferrer" href="https://github.com/louislam/uptime-kuma">{{ $t("Uptime Kuma" ) }}</a>
                 </p>
             </footer>
         </div>

From f503488618a47d8179da144534cc65241569776f Mon Sep 17 00:00:00 2001
From: rezzorix <72935517+rezzorix@users.noreply.github.com>
Date: Sun, 11 Sep 2022 14:54:33 +0800
Subject: [PATCH 126/803] Create stale-bot.yml

---
 .github/workflows/stale-bot.yml | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)
 create mode 100644 .github/workflows/stale-bot.yml

diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml
new file mode 100644
index 00000000..34a42d60
--- /dev/null
+++ b/.github/workflows/stale-bot.yml
@@ -0,0 +1,22 @@
+name: 'Automatically close stale issues and PRs'
+on:
+  schedule:
+    - cron: '0 0 * * *'
+#Run once a day at midnight 
+
+jobs:
+  stale:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/stale@v5
+        with:
+          stale-issue-message: 'We are clearing up our old issues and your ticket has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 7 days.'
+          stale-pr-message: 'We are clearing up our old Pull Requests and yours has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 7 days.'
+          close-issue-message: 'This issue was closed because it has been stalled for 7 days with no activity.'
+          close-pr-message: 'This PR was closed because it has been stalled for 7 days with no activity.'
+          days-before-stale: 90
+          days-before-close: 7
+          exempt-issue-labels: 'News,Medium,High,discussion,bug,doc,feature-request'
+          exempt-pr-labels: 'awaiting-approval,work-in-progress,enhancement,feature-request'
+          exempt-issue-assignees: 'louislam'
+          exempt-pr-assignees: 'louislam'

From 104d5216330749c8a9ea892309423f1930a61331 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 12 Sep 2022 18:33:46 +0800
Subject: [PATCH 127/803] Update vite from 2.9.9 to 3.1.0

---
 config/vite.config.js |    3 +
 package-lock.json     | 2262 ++++++++++++++++++++++++++++++++++++-----
 package.json          |    6 +-
 3 files changed, 2000 insertions(+), 271 deletions(-)

diff --git a/config/vite.config.js b/config/vite.config.js
index 84de961d..6e9ebbde 100644
--- a/config/vite.config.js
+++ b/config/vite.config.js
@@ -11,6 +11,9 @@ const viteCompressionFilter = /\.(js|mjs|json|css|html|svg)$/i;
 
 // https://vitejs.dev/config/
 export default defineConfig({
+    server: {
+        port: 3000,
+    },
     define: {
         "FRONTEND_VERSION": JSON.stringify(process.env.npm_package_version),
     },
diff --git a/package-lock.json b/package-lock.json
index b4310950..7c32fd43 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.0-beta.0",
+    "version": "1.18.0",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.18.0-beta.0",
+            "version": "1.18.0",
             "license": "MIT",
             "dependencies": {
                 "@louislam/sqlite3": "~15.0.6",
@@ -65,8 +65,8 @@
                 "@fortawesome/vue-fontawesome": "~3.0.0-5",
                 "@popperjs/core": "~2.10.2",
                 "@types/bootstrap": "~5.1.9",
-                "@vitejs/plugin-legacy": "~1.8.2",
-                "@vitejs/plugin-vue": "~2.3.3",
+                "@vitejs/plugin-legacy": "~2.1.0",
+                "@vitejs/plugin-vue": "~3.1.0",
                 "@vue/compiler-sfc": "~3.2.36",
                 "aedes": "^0.46.3",
                 "babel-plugin-rewire": "~1.2.0",
@@ -76,6 +76,8 @@
                 "concurrently": "^7.1.0",
                 "core-js": "~3.18.3",
                 "cross-env": "~7.0.3",
+                "cypress": "^10.1.0",
+                "delay": "^5.0.0",
                 "dns2": "~2.0.1",
                 "eslint": "~8.14.0",
                 "eslint-plugin-vue": "~8.7.1",
@@ -95,7 +97,7 @@
                 "timezones-list": "~3.0.1",
                 "typescript": "~4.4.4",
                 "v-pagination-3": "~0.1.7",
-                "vite": "~2.9.9",
+                "vite": "~3.1.0",
                 "vite-plugin-compression": "^0.5.1",
                 "vue": "next",
                 "vue-chart-3": "3.0.9",
@@ -2040,10 +2042,133 @@
                 "node": ">= 10"
             }
         },
+        "node_modules/@colors/colors": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+            "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+            "dev": true,
+            "optional": true,
+            "engines": {
+                "node": ">=0.1.90"
+            }
+        },
+        "node_modules/@cypress/request": {
+            "version": "2.88.10",
+            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
+            "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
+            "dev": true,
+            "dependencies": {
+                "aws-sign2": "~0.7.0",
+                "aws4": "^1.8.0",
+                "caseless": "~0.12.0",
+                "combined-stream": "~1.0.6",
+                "extend": "~3.0.2",
+                "forever-agent": "~0.6.1",
+                "form-data": "~2.3.2",
+                "http-signature": "~1.3.6",
+                "is-typedarray": "~1.0.0",
+                "isstream": "~0.1.2",
+                "json-stringify-safe": "~5.0.1",
+                "mime-types": "~2.1.19",
+                "performance-now": "^2.1.0",
+                "qs": "~6.5.2",
+                "safe-buffer": "^5.1.2",
+                "tough-cookie": "~2.5.0",
+                "tunnel-agent": "^0.6.0",
+                "uuid": "^8.3.2"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/@cypress/request/node_modules/form-data": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+            "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+            "dev": true,
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.6",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 0.12"
+            }
+        },
+        "node_modules/@cypress/request/node_modules/http-signature": {
+            "version": "1.3.6",
+            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
+            "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
+            "dev": true,
+            "dependencies": {
+                "assert-plus": "^1.0.0",
+                "jsprim": "^2.0.2",
+                "sshpk": "^1.14.1"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/@cypress/request/node_modules/jsprim": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
+            "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+            "dev": true,
+            "engines": [
+                "node >=0.6.0"
+            ],
+            "dependencies": {
+                "assert-plus": "1.0.0",
+                "extsprintf": "1.3.0",
+                "json-schema": "0.4.0",
+                "verror": "1.10.0"
+            }
+        },
+        "node_modules/@cypress/request/node_modules/qs": {
+            "version": "6.5.3",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+            "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
+        "node_modules/@cypress/request/node_modules/tough-cookie": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+            "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+            "dev": true,
+            "dependencies": {
+                "psl": "^1.1.28",
+                "punycode": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/@cypress/xvfb": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
+            "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
+            "dev": true,
+            "dependencies": {
+                "debug": "^3.1.0",
+                "lodash.once": "^4.1.1"
+            }
+        },
+        "node_modules/@cypress/xvfb/node_modules/debug": {
+            "version": "3.2.7",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+            "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "^2.1.1"
+            }
+        },
         "node_modules/@esbuild/linux-loong64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
-            "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.7.tgz",
+            "integrity": "sha512-IKznSJOsVUuyt7cDzzSZyqBEcZe+7WlBqTVXiF1OXP/4Nm387ToaXZ0fyLwI1iBlI/bzpxVq411QE2/Bt2XWWw==",
             "cpu": [
                 "loong64"
             ],
@@ -3526,6 +3651,18 @@
                 "@types/node": "*"
             }
         },
+        "node_modules/@types/sinonjs__fake-timers": {
+            "version": "8.1.1",
+            "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
+            "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
+            "dev": true
+        },
+        "node_modules/@types/sizzle": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
+            "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
+            "dev": true
+        },
         "node_modules/@types/stack-utils": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
@@ -3558,22 +3695,23 @@
             }
         },
         "node_modules/@vitejs/plugin-legacy": {
-            "version": "1.8.2",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.8.2.tgz",
-            "integrity": "sha512-NCOKU+pU+cxLMR9P9RTolEuOK+h+zYBXlknj+zGcKSj/NXBZYgA1GAH1FnO4zijoWRiTaiOm2ha9LQrELE7XHg==",
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-2.1.0.tgz",
+            "integrity": "sha512-en3h0L7okBonSYKJx81bU8AVFPjSCiUSz8xUDAW8J0CxskfxSt/VJKbZO6G9yCVgZLywGoO8PNAfOQWVLUWZ2A==",
             "dev": true,
             "dependencies": {
-                "@babel/standalone": "^7.17.11",
-                "core-js": "^3.22.3",
-                "magic-string": "^0.26.1",
+                "@babel/standalone": "^7.18.13",
+                "core-js": "^3.25.0",
+                "magic-string": "^0.26.2",
                 "regenerator-runtime": "^0.13.9",
-                "systemjs": "^6.12.1"
+                "systemjs": "^6.12.4"
             },
             "engines": {
-                "node": ">=12.0.0"
+                "node": "^14.18.0 || >=16.0.0"
             },
             "peerDependencies": {
-                "vite": "^2.8.0"
+                "terser": "^5.4.0",
+                "vite": "^3.0.0"
             }
         },
         "node_modules/@vitejs/plugin-legacy/node_modules/core-js": {
@@ -3588,15 +3726,15 @@
             }
         },
         "node_modules/@vitejs/plugin-vue": {
-            "version": "2.3.4",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz",
-            "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==",
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.1.0.tgz",
+            "integrity": "sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==",
             "dev": true,
             "engines": {
-                "node": ">=12.0.0"
+                "node": "^14.18.0 || >=16.0.0"
             },
             "peerDependencies": {
-                "vite": "^2.5.10",
+                "vite": "^3.0.0",
                 "vue": "^3.2.25"
             }
         },
@@ -3940,6 +4078,19 @@
                 "node": ">= 6.0.0"
             }
         },
+        "node_modules/aggregate-error": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+            "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+            "dev": true,
+            "dependencies": {
+                "clean-stack": "^2.0.0",
+                "indent-string": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/ajv": {
             "version": "6.12.6",
             "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -3964,6 +4115,15 @@
                 "char-width-table-consumer": "^1.0.0"
             }
         },
+        "node_modules/ansi-colors": {
+            "version": "4.1.3",
+            "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+            "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/ansi-escapes": {
             "version": "4.3.2",
             "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -4017,6 +4177,26 @@
             "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
             "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
         },
+        "node_modules/arch": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+            "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
         "node_modules/are-we-there-yet": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
@@ -4076,7 +4256,7 @@
             "version": "0.2.6",
             "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
             "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
-            "optional": true,
+            "devOptional": true,
             "dependencies": {
                 "safer-buffer": "~2.1.0"
             }
@@ -4085,7 +4265,7 @@
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
             "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
-            "optional": true,
+            "devOptional": true,
             "engines": {
                 "node": ">=0.8"
             }
@@ -4099,11 +4279,26 @@
                 "node": ">=8"
             }
         },
+        "node_modules/async": {
+            "version": "3.2.4",
+            "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+            "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
+            "dev": true
+        },
         "node_modules/asynckit": {
             "version": "0.4.0",
             "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
             "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
         },
+        "node_modules/at-least-node": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+            "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4.0.0"
+            }
+        },
         "node_modules/await-lock": {
             "version": "2.2.2",
             "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
@@ -4113,7 +4308,7 @@
             "version": "0.7.0",
             "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
             "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
-            "optional": true,
+            "devOptional": true,
             "engines": {
                 "node": "*"
             }
@@ -4122,7 +4317,7 @@
             "version": "1.11.0",
             "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
             "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
-            "optional": true
+            "devOptional": true
         },
         "node_modules/axios": {
             "version": "0.27.2",
@@ -4464,7 +4659,7 @@
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
             "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
-            "optional": true,
+            "devOptional": true,
             "dependencies": {
                 "tweetnacl": "^0.14.3"
             }
@@ -4509,6 +4704,18 @@
                 "readable-stream": "^3.4.0"
             }
         },
+        "node_modules/blob-util": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
+            "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+            "dev": true
+        },
+        "node_modules/bluebird": {
+            "version": "3.7.2",
+            "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+            "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+            "dev": true
+        },
         "node_modules/body-parser": {
             "version": "1.19.2",
             "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
@@ -4745,6 +4952,15 @@
                 "node": ">=10.6.0"
             }
         },
+        "node_modules/cachedir": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
+            "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/call-bind": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -4812,7 +5028,7 @@
             "version": "0.12.0",
             "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
             "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
-            "optional": true
+            "devOptional": true
         },
         "node_modules/chalk": {
             "version": "2.4.2",
@@ -4866,6 +5082,15 @@
                 "dayjs": "^1.8.15"
             }
         },
+        "node_modules/check-more-types": {
+            "version": "2.24.0",
+            "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
+            "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
         "node_modules/check-password-strength": {
             "version": "2.0.7",
             "resolved": "https://registry.npmjs.org/check-password-strength/-/check-password-strength-2.0.7.tgz",
@@ -4971,6 +5196,105 @@
             "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
             "dev": true
         },
+        "node_modules/clean-stack": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+            "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/cli-cursor": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+            "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+            "dev": true,
+            "dependencies": {
+                "restore-cursor": "^3.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cli-table3": {
+            "version": "0.6.2",
+            "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz",
+            "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==",
+            "dev": true,
+            "dependencies": {
+                "string-width": "^4.2.0"
+            },
+            "engines": {
+                "node": "10.* || >= 12.*"
+            },
+            "optionalDependencies": {
+                "@colors/colors": "1.5.0"
+            }
+        },
+        "node_modules/cli-truncate": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+            "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+            "dev": true,
+            "dependencies": {
+                "slice-ansi": "^3.0.0",
+                "string-width": "^4.2.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/cli-truncate/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/cli-truncate/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/cli-truncate/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/cli-truncate/node_modules/slice-ansi": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+            "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "astral-regex": "^2.0.0",
+                "is-fullwidth-code-point": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/cliui": {
             "version": "7.0.4",
             "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@@ -5132,6 +5456,15 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/common-tags": {
+            "version": "1.8.2",
+            "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+            "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
         "node_modules/compare-versions": {
             "version": "3.6.0",
             "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
@@ -5604,11 +5937,251 @@
                 "node": ">=0.8"
             }
         },
+        "node_modules/cypress": {
+            "version": "10.7.0",
+            "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.7.0.tgz",
+            "integrity": "sha512-gTFvjrUoBnqPPOu9Vl5SBHuFlzx/Wxg/ZXIz2H4lzoOLFelKeF7mbwYUOzgzgF0oieU2WhJAestQdkgwJMMTvQ==",
+            "dev": true,
+            "hasInstallScript": true,
+            "dependencies": {
+                "@cypress/request": "^2.88.10",
+                "@cypress/xvfb": "^1.2.4",
+                "@types/node": "^14.14.31",
+                "@types/sinonjs__fake-timers": "8.1.1",
+                "@types/sizzle": "^2.3.2",
+                "arch": "^2.2.0",
+                "blob-util": "^2.0.2",
+                "bluebird": "^3.7.2",
+                "buffer": "^5.6.0",
+                "cachedir": "^2.3.0",
+                "chalk": "^4.1.0",
+                "check-more-types": "^2.24.0",
+                "cli-cursor": "^3.1.0",
+                "cli-table3": "~0.6.1",
+                "commander": "^5.1.0",
+                "common-tags": "^1.8.0",
+                "dayjs": "^1.10.4",
+                "debug": "^4.3.2",
+                "enquirer": "^2.3.6",
+                "eventemitter2": "^6.4.3",
+                "execa": "4.1.0",
+                "executable": "^4.1.1",
+                "extract-zip": "2.0.1",
+                "figures": "^3.2.0",
+                "fs-extra": "^9.1.0",
+                "getos": "^3.2.1",
+                "is-ci": "^3.0.0",
+                "is-installed-globally": "~0.4.0",
+                "lazy-ass": "^1.6.0",
+                "listr2": "^3.8.3",
+                "lodash": "^4.17.21",
+                "log-symbols": "^4.0.0",
+                "minimist": "^1.2.6",
+                "ospath": "^1.2.2",
+                "pretty-bytes": "^5.6.0",
+                "proxy-from-env": "1.0.0",
+                "request-progress": "^3.0.0",
+                "semver": "^7.3.2",
+                "supports-color": "^8.1.1",
+                "tmp": "~0.2.1",
+                "untildify": "^4.0.0",
+                "yauzl": "^2.10.0"
+            },
+            "bin": {
+                "cypress": "bin/cypress"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/cypress/node_modules/@types/node": {
+            "version": "14.18.28",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.28.tgz",
+            "integrity": "sha512-CK2fnrQlIgKlCV3N2kM+Gznb5USlwA1KFX3rJVHmgVk6NJxFPuQ86pAcvKnu37IA4BGlSRz7sEE1lHL1aLZ/eQ==",
+            "dev": true
+        },
+        "node_modules/cypress/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/cypress/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/cypress/node_modules/chalk/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cypress/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/cypress/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/cypress/node_modules/execa": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+            "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+            "dev": true,
+            "dependencies": {
+                "cross-spawn": "^7.0.0",
+                "get-stream": "^5.0.0",
+                "human-signals": "^1.1.1",
+                "is-stream": "^2.0.0",
+                "merge-stream": "^2.0.0",
+                "npm-run-path": "^4.0.0",
+                "onetime": "^5.1.0",
+                "signal-exit": "^3.0.2",
+                "strip-final-newline": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/execa?sponsor=1"
+            }
+        },
+        "node_modules/cypress/node_modules/fs-extra": {
+            "version": "9.1.0",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+            "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+            "dev": true,
+            "dependencies": {
+                "at-least-node": "^1.0.0",
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/cypress/node_modules/get-stream": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+            "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+            "dev": true,
+            "dependencies": {
+                "pump": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/cypress/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cypress/node_modules/human-signals": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+            "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8.12.0"
+            }
+        },
+        "node_modules/cypress/node_modules/proxy-from-env": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+            "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
+            "dev": true
+        },
+        "node_modules/cypress/node_modules/semver": {
+            "version": "7.3.7",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/cypress/node_modules/supports-color": {
+            "version": "8.1.1",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+            "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/supports-color?sponsor=1"
+            }
+        },
+        "node_modules/cypress/node_modules/universalify": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+            "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+            "dev": true,
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
         "node_modules/dashdash": {
             "version": "1.14.1",
             "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
             "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
-            "optional": true,
+            "devOptional": true,
             "dependencies": {
                 "assert-plus": "^1.0.0"
             },
@@ -5750,6 +6323,18 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/delay": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz",
+            "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/delayed-stream": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -5942,7 +6527,7 @@
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
             "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
-            "optional": true,
+            "devOptional": true,
             "dependencies": {
                 "jsbn": "~0.1.0",
                 "safer-buffer": "^2.1.0"
@@ -6090,6 +6675,18 @@
                 }
             }
         },
+        "node_modules/enquirer": {
+            "version": "2.3.6",
+            "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+            "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+            "dev": true,
+            "dependencies": {
+                "ansi-colors": "^4.1.1"
+            },
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
         "node_modules/entities": {
             "version": "4.4.0",
             "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
@@ -6192,9 +6789,9 @@
             }
         },
         "node_modules/esbuild": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
-            "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.7.tgz",
+            "integrity": "sha512-7V8tzllIbAQV1M4QoE52ImKu8hT/NLGlGXkiDsbEU5PS6K8Mn09ZnYoS+dcmHxOS9CRsV4IRAMdT3I67IyUNXw==",
             "dev": true,
             "hasInstallScript": true,
             "bin": {
@@ -6204,33 +6801,33 @@
                 "node": ">=12"
             },
             "optionalDependencies": {
-                "@esbuild/linux-loong64": "0.14.54",
-                "esbuild-android-64": "0.14.54",
-                "esbuild-android-arm64": "0.14.54",
-                "esbuild-darwin-64": "0.14.54",
-                "esbuild-darwin-arm64": "0.14.54",
-                "esbuild-freebsd-64": "0.14.54",
-                "esbuild-freebsd-arm64": "0.14.54",
-                "esbuild-linux-32": "0.14.54",
-                "esbuild-linux-64": "0.14.54",
-                "esbuild-linux-arm": "0.14.54",
-                "esbuild-linux-arm64": "0.14.54",
-                "esbuild-linux-mips64le": "0.14.54",
-                "esbuild-linux-ppc64le": "0.14.54",
-                "esbuild-linux-riscv64": "0.14.54",
-                "esbuild-linux-s390x": "0.14.54",
-                "esbuild-netbsd-64": "0.14.54",
-                "esbuild-openbsd-64": "0.14.54",
-                "esbuild-sunos-64": "0.14.54",
-                "esbuild-windows-32": "0.14.54",
-                "esbuild-windows-64": "0.14.54",
-                "esbuild-windows-arm64": "0.14.54"
+                "@esbuild/linux-loong64": "0.15.7",
+                "esbuild-android-64": "0.15.7",
+                "esbuild-android-arm64": "0.15.7",
+                "esbuild-darwin-64": "0.15.7",
+                "esbuild-darwin-arm64": "0.15.7",
+                "esbuild-freebsd-64": "0.15.7",
+                "esbuild-freebsd-arm64": "0.15.7",
+                "esbuild-linux-32": "0.15.7",
+                "esbuild-linux-64": "0.15.7",
+                "esbuild-linux-arm": "0.15.7",
+                "esbuild-linux-arm64": "0.15.7",
+                "esbuild-linux-mips64le": "0.15.7",
+                "esbuild-linux-ppc64le": "0.15.7",
+                "esbuild-linux-riscv64": "0.15.7",
+                "esbuild-linux-s390x": "0.15.7",
+                "esbuild-netbsd-64": "0.15.7",
+                "esbuild-openbsd-64": "0.15.7",
+                "esbuild-sunos-64": "0.15.7",
+                "esbuild-windows-32": "0.15.7",
+                "esbuild-windows-64": "0.15.7",
+                "esbuild-windows-arm64": "0.15.7"
             }
         },
         "node_modules/esbuild-android-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
-            "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.7.tgz",
+            "integrity": "sha512-p7rCvdsldhxQr3YHxptf1Jcd86dlhvc3EQmQJaZzzuAxefO9PvcI0GLOa5nCWem1AJ8iMRu9w0r5TG8pHmbi9w==",
             "cpu": [
                 "x64"
             ],
@@ -6244,9 +6841,9 @@
             }
         },
         "node_modules/esbuild-android-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
-            "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.7.tgz",
+            "integrity": "sha512-L775l9ynJT7rVqRM5vo+9w5g2ysbOCfsdLV4CWanTZ1k/9Jb3IYlQ06VCI1edhcosTYJRECQFJa3eAvkx72eyQ==",
             "cpu": [
                 "arm64"
             ],
@@ -6260,9 +6857,9 @@
             }
         },
         "node_modules/esbuild-darwin-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
-            "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.7.tgz",
+            "integrity": "sha512-KGPt3r1c9ww009t2xLB6Vk0YyNOXh7hbjZ3EecHoVDxgtbUlYstMPDaReimKe6eOEfyY4hBEEeTvKwPsiH5WZg==",
             "cpu": [
                 "x64"
             ],
@@ -6276,9 +6873,9 @@
             }
         },
         "node_modules/esbuild-darwin-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
-            "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.7.tgz",
+            "integrity": "sha512-kBIHvtVqbSGajN88lYMnR3aIleH3ABZLLFLxwL2stiuIGAjGlQW741NxVTpUHQXUmPzxi6POqc9npkXa8AcSZQ==",
             "cpu": [
                 "arm64"
             ],
@@ -6292,9 +6889,9 @@
             }
         },
         "node_modules/esbuild-freebsd-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
-            "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.7.tgz",
+            "integrity": "sha512-hESZB91qDLV5MEwNxzMxPfbjAhOmtfsr9Wnuci7pY6TtEh4UDuevmGmkUIjX/b+e/k4tcNBMf7SRQ2mdNuK/HQ==",
             "cpu": [
                 "x64"
             ],
@@ -6308,9 +6905,9 @@
             }
         },
         "node_modules/esbuild-freebsd-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
-            "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.7.tgz",
+            "integrity": "sha512-dLFR0ChH5t+b3J8w0fVKGvtwSLWCv7GYT2Y2jFGulF1L5HftQLzVGN+6pi1SivuiVSmTh28FwUhi9PwQicXI6Q==",
             "cpu": [
                 "arm64"
             ],
@@ -6324,9 +6921,9 @@
             }
         },
         "node_modules/esbuild-linux-32": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
-            "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.7.tgz",
+            "integrity": "sha512-v3gT/LsONGUZcjbt2swrMjwxo32NJzk+7sAgtxhGx1+ZmOFaTRXBAi1PPfgpeo/J//Un2jIKm/I+qqeo4caJvg==",
             "cpu": [
                 "ia32"
             ],
@@ -6340,9 +6937,9 @@
             }
         },
         "node_modules/esbuild-linux-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
-            "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.7.tgz",
+            "integrity": "sha512-LxXEfLAKwOVmm1yecpMmWERBshl+Kv5YJ/1KnyAr6HRHFW8cxOEsEfisD3sVl/RvHyW//lhYUVSuy9jGEfIRAQ==",
             "cpu": [
                 "x64"
             ],
@@ -6356,9 +6953,9 @@
             }
         },
         "node_modules/esbuild-linux-arm": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
-            "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.7.tgz",
+            "integrity": "sha512-JKgAHtMR5f75wJTeuNQbyznZZa+pjiUHV7sRZp42UNdyXC6TiUYMW/8z8yIBAr2Fpad8hM1royZKQisqPABPvQ==",
             "cpu": [
                 "arm"
             ],
@@ -6372,9 +6969,9 @@
             }
         },
         "node_modules/esbuild-linux-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
-            "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.7.tgz",
+            "integrity": "sha512-P3cfhudpzWDkglutWgXcT2S7Ft7o2e3YDMrP1n0z2dlbUZghUkKCyaWw0zhp4KxEEzt/E7lmrtRu/pGWnwb9vw==",
             "cpu": [
                 "arm64"
             ],
@@ -6388,9 +6985,9 @@
             }
         },
         "node_modules/esbuild-linux-mips64le": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
-            "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.7.tgz",
+            "integrity": "sha512-T7XKuxl0VpeFLCJXub6U+iybiqh0kM/bWOTb4qcPyDDwNVhLUiPcGdG2/0S7F93czUZOKP57YiLV8YQewgLHKw==",
             "cpu": [
                 "mips64el"
             ],
@@ -6404,9 +7001,9 @@
             }
         },
         "node_modules/esbuild-linux-ppc64le": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
-            "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.7.tgz",
+            "integrity": "sha512-6mGuC19WpFN7NYbecMIJjeQgvDb5aMuvyk0PDYBJrqAEMkTwg3Z98kEKuCm6THHRnrgsdr7bp4SruSAxEM4eJw==",
             "cpu": [
                 "ppc64"
             ],
@@ -6420,9 +7017,9 @@
             }
         },
         "node_modules/esbuild-linux-riscv64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
-            "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.7.tgz",
+            "integrity": "sha512-uUJsezbswAYo/X7OU/P+PuL/EI9WzxsEQXDekfwpQ23uGiooxqoLFAPmXPcRAt941vjlY9jtITEEikWMBr+F/g==",
             "cpu": [
                 "riscv64"
             ],
@@ -6436,9 +7033,9 @@
             }
         },
         "node_modules/esbuild-linux-s390x": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
-            "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.7.tgz",
+            "integrity": "sha512-+tO+xOyTNMc34rXlSxK7aCwJgvQyffqEM5MMdNDEeMU3ss0S6wKvbBOQfgd5jRPblfwJ6b+bKiz0g5nABpY0QQ==",
             "cpu": [
                 "s390x"
             ],
@@ -6452,9 +7049,9 @@
             }
         },
         "node_modules/esbuild-netbsd-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
-            "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.7.tgz",
+            "integrity": "sha512-yVc4Wz+Pu3cP5hzm5kIygNPrjar/v5WCSoRmIjCPWfBVJkZNb5brEGKUlf+0Y759D48BCWa0WHrWXaNy0DULTQ==",
             "cpu": [
                 "x64"
             ],
@@ -6468,9 +7065,9 @@
             }
         },
         "node_modules/esbuild-openbsd-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
-            "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.7.tgz",
+            "integrity": "sha512-GsimbwC4FSR4lN3wf8XmTQ+r8/0YSQo21rWDL0XFFhLHKlzEA4SsT1Tl8bPYu00IU6UWSJ+b3fG/8SB69rcuEQ==",
             "cpu": [
                 "x64"
             ],
@@ -6484,9 +7081,9 @@
             }
         },
         "node_modules/esbuild-sunos-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
-            "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.7.tgz",
+            "integrity": "sha512-8CDI1aL/ts0mDGbWzjEOGKXnU7p3rDzggHSBtVryQzkSOsjCHRVe0iFYUuhczlxU1R3LN/E7HgUO4NXzGGP/Ag==",
             "cpu": [
                 "x64"
             ],
@@ -6500,9 +7097,9 @@
             }
         },
         "node_modules/esbuild-windows-32": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
-            "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.7.tgz",
+            "integrity": "sha512-cOnKXUEPS8EGCzRSFa1x6NQjGhGsFlVgjhqGEbLTPsA7x4RRYiy2RKoArNUU4iR2vHmzqS5Gr84MEumO/wxYKA==",
             "cpu": [
                 "ia32"
             ],
@@ -6516,9 +7113,9 @@
             }
         },
         "node_modules/esbuild-windows-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
-            "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.7.tgz",
+            "integrity": "sha512-7MI08Ec2sTIDv+zH6StNBKO+2hGUYIT42GmFyW6MBBWWtJhTcQLinKS6ldIN1d52MXIbiJ6nXyCJ+LpL4jBm3Q==",
             "cpu": [
                 "x64"
             ],
@@ -6532,9 +7129,9 @@
             }
         },
         "node_modules/esbuild-windows-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
-            "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.7.tgz",
+            "integrity": "sha512-R06nmqBlWjKHddhRJYlqDd3Fabx9LFdKcjoOy08YLimwmsswlFBJV4rXzZCxz/b7ZJXvrZgj8DDv1ewE9+StMw==",
             "cpu": [
                 "arm64"
             ],
@@ -7039,6 +7636,12 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/eventemitter2": {
+            "version": "6.4.8",
+            "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.8.tgz",
+            "integrity": "sha512-pAJurPyD+Nj/pfz8m0usKF1RW0E9gfY4Dfdem2l6jZbqcZlK8SP93qUMCv9V9FgOn+GSZEW6qeaglpf/vQ9D5A==",
+            "dev": true
+        },
         "node_modules/events": {
             "version": "3.3.0",
             "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
@@ -7082,6 +7685,18 @@
                 "node": ">=8"
             }
         },
+        "node_modules/executable": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
+            "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+            "dev": true,
+            "dependencies": {
+                "pify": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
         "node_modules/exit": {
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -7216,7 +7831,7 @@
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
             "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-            "optional": true
+            "devOptional": true
         },
         "node_modules/extract-zip": {
             "version": "2.0.1",
@@ -7257,10 +7872,10 @@
             "version": "1.3.0",
             "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
             "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+            "devOptional": true,
             "engines": [
                 "node >=0.6.0"
-            ],
-            "optional": true
+            ]
         },
         "node_modules/fast-deep-equal": {
             "version": "3.1.3",
@@ -7378,6 +7993,21 @@
                 "pend": "~1.2.0"
             }
         },
+        "node_modules/figures": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+            "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+            "dev": true,
+            "dependencies": {
+                "escape-string-regexp": "^1.0.5"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/file-entry-cache": {
             "version": "6.0.1",
             "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -7617,7 +8247,7 @@
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
             "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
-            "optional": true,
+            "devOptional": true,
             "engines": {
                 "node": "*"
             }
@@ -7892,11 +8522,20 @@
             "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
             "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="
         },
+        "node_modules/getos": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
+            "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+            "dev": true,
+            "dependencies": {
+                "async": "^3.2.0"
+            }
+        },
         "node_modules/getpass": {
             "version": "0.1.7",
             "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
             "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
-            "optional": true,
+            "devOptional": true,
             "dependencies": {
                 "assert-plus": "^1.0.0"
             }
@@ -7932,6 +8571,30 @@
                 "node": ">=10.13.0"
             }
         },
+        "node_modules/global-dirs": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
+            "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+            "dev": true,
+            "dependencies": {
+                "ini": "2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/global-dirs/node_modules/ini": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+            "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/global-modules": {
             "version": "0.2.3",
             "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
@@ -8529,6 +9192,18 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/is-ci": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+            "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+            "dev": true,
+            "dependencies": {
+                "ci-info": "^3.2.0"
+            },
+            "bin": {
+                "is-ci": "bin.js"
+            }
+        },
         "node_modules/is-core-module": {
             "version": "2.10.0",
             "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
@@ -8615,6 +9290,22 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/is-installed-globally": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+            "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+            "dev": true,
+            "dependencies": {
+                "global-dirs": "^3.0.0",
+                "is-path-inside": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/is-invalid-path": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz",
@@ -8679,6 +9370,15 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/is-path-inside": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+            "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/is-plain-obj": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
@@ -8800,6 +9500,18 @@
             "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
             "devOptional": true
         },
+        "node_modules/is-unicode-supported": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+            "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/is-valid-path": {
             "version": "0.1.1",
             "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz",
@@ -8878,7 +9590,7 @@
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
             "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
-            "optional": true
+            "devOptional": true
         },
         "node_modules/istanbul-lib-coverage": {
             "version": "3.2.0",
@@ -10901,7 +11613,7 @@
             "version": "0.1.1",
             "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
             "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
-            "optional": true
+            "devOptional": true
         },
         "node_modules/jsdom": {
             "version": "16.7.0",
@@ -11014,7 +11726,7 @@
             "version": "0.4.0",
             "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
             "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
-            "optional": true
+            "devOptional": true
         },
         "node_modules/json-schema-traverse": {
             "version": "0.4.1",
@@ -11032,7 +11744,7 @@
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
             "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
-            "optional": true
+            "devOptional": true
         },
         "node_modules/json5": {
             "version": "2.2.1",
@@ -11250,6 +11962,15 @@
             "integrity": "sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==",
             "dev": true
         },
+        "node_modules/lazy-ass": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+            "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+            "dev": true,
+            "engines": {
+                "node": "> 0.8"
+            }
+        },
         "node_modules/lazy-cache": {
             "version": "1.0.4",
             "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
@@ -11295,6 +12016,33 @@
             "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
             "dev": true
         },
+        "node_modules/listr2": {
+            "version": "3.14.0",
+            "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+            "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+            "dev": true,
+            "dependencies": {
+                "cli-truncate": "^2.1.0",
+                "colorette": "^2.0.16",
+                "log-update": "^4.0.0",
+                "p-map": "^4.0.0",
+                "rfdc": "^1.3.0",
+                "rxjs": "^7.5.1",
+                "through": "^2.3.8",
+                "wrap-ansi": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependencies": {
+                "enquirer": ">= 2.3.0 < 3"
+            },
+            "peerDependenciesMeta": {
+                "enquirer": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/locate-path": {
             "version": "5.0.0",
             "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -11424,6 +12172,157 @@
                 "lodash._baseuniq": "~4.6.0"
             }
         },
+        "node_modules/log-symbols": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+            "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+            "dev": true,
+            "dependencies": {
+                "chalk": "^4.1.0",
+                "is-unicode-supported": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/log-symbols/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/log-symbols/node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/log-symbols/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/log-symbols/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/log-symbols/node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/log-symbols/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/log-update": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+            "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+            "dev": true,
+            "dependencies": {
+                "ansi-escapes": "^4.3.0",
+                "cli-cursor": "^3.1.0",
+                "slice-ansi": "^4.0.0",
+                "wrap-ansi": "^6.2.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/log-update/node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/log-update/node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/log-update/node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/log-update/node_modules/wrap-ansi": {
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+            "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/lru-cache": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -12391,6 +13290,12 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/ospath": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
+            "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+            "dev": true
+        },
         "node_modules/p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -12426,6 +13331,21 @@
                 "node": ">=8"
             }
         },
+        "node_modules/p-map": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+            "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+            "dev": true,
+            "dependencies": {
+                "aggregate-error": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/p-timeout": {
             "version": "3.2.0",
             "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
@@ -12611,7 +13531,7 @@
             "version": "2.1.0",
             "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
             "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
-            "optional": true
+            "devOptional": true
         },
         "node_modules/pg": {
             "version": "8.8.0",
@@ -12713,6 +13633,15 @@
                 "url": "https://github.com/sponsors/jonschlinkert"
             }
         },
+        "node_modules/pify": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+            "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
         "node_modules/pirates": {
             "version": "4.0.5",
             "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
@@ -12918,6 +13847,18 @@
                 "node": ">= 0.8.0"
             }
         },
+        "node_modules/pretty-bytes": {
+            "version": "5.6.0",
+            "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+            "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/pretty-format": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
@@ -13654,6 +14595,15 @@
                 "node": ">= 6"
             }
         },
+        "node_modules/request-progress": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
+            "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+            "dev": true,
+            "dependencies": {
+                "throttleit": "^1.0.0"
+            }
+        },
         "node_modules/request/node_modules/form-data": {
             "version": "2.3.3",
             "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
@@ -13798,6 +14748,19 @@
                 "node": ">=10"
             }
         },
+        "node_modules/restore-cursor": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+            "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+            "dev": true,
+            "dependencies": {
+                "onetime": "^5.1.0",
+                "signal-exit": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/retimer": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz",
@@ -13834,9 +14797,9 @@
             }
         },
         "node_modules/rollup": {
-            "version": "2.77.3",
-            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz",
-            "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
+            "version": "2.78.1",
+            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz",
+            "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==",
             "dev": true,
             "bin": {
                 "rollup": "dist/bin/rollup"
@@ -14454,7 +15417,7 @@
             "version": "1.17.0",
             "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
             "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
-            "optional": true,
+            "devOptional": true,
             "dependencies": {
                 "asn1": "~0.2.3",
                 "assert-plus": "^1.0.0",
@@ -15101,6 +16064,12 @@
             "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
             "dev": true
         },
+        "node_modules/throttleit": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
+            "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
+            "dev": true
+        },
         "node_modules/through": {
             "version": "2.3.8",
             "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -15121,6 +16090,18 @@
             "integrity": "sha512-yfOzyuVwzgD0LkldD3Epkr+JUdUIxEUL147Fa6ZgG/23KU28iOv3e3M7vQOCFMPyopAhDX7dqOLWttIP7tkTKg==",
             "dev": true
         },
+        "node_modules/tmp": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+            "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+            "dev": true,
+            "dependencies": {
+                "rimraf": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8.17.0"
+            }
+        },
         "node_modules/tmpl": {
             "version": "1.0.5",
             "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -15233,7 +16214,7 @@
             "version": "0.6.0",
             "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
             "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
-            "optional": true,
+            "devOptional": true,
             "dependencies": {
                 "safe-buffer": "^5.0.1"
             },
@@ -15245,7 +16226,7 @@
             "version": "0.14.5",
             "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
             "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
-            "optional": true
+            "devOptional": true
         },
         "node_modules/type-check": {
             "version": "0.4.0",
@@ -15406,6 +16387,15 @@
                 "node": ">= 0.8"
             }
         },
+        "node_modules/untildify": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+            "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/update-browserslist-db": {
             "version": "1.0.5",
             "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
@@ -15540,10 +16530,10 @@
             "version": "1.10.0",
             "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
             "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+            "devOptional": true,
             "engines": [
                 "node >=0.6.0"
             ],
-            "optional": true,
             "dependencies": {
                 "assert-plus": "^1.0.0",
                 "core-util-is": "1.0.2",
@@ -15551,21 +16541,21 @@
             }
         },
         "node_modules/vite": {
-            "version": "2.9.15",
-            "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz",
-            "integrity": "sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==",
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.0.tgz",
+            "integrity": "sha512-YBg3dUicDpDWFCGttmvMbVyS9ydjntwEjwXRj2KBFwSB8SxmGcudo1yb8FW5+M/G86aS8x828ujnzUVdsLjs9g==",
             "dev": true,
             "dependencies": {
-                "esbuild": "^0.14.27",
-                "postcss": "^8.4.13",
-                "resolve": "^1.22.0",
-                "rollup": ">=2.59.0 <2.78.0"
+                "esbuild": "^0.15.6",
+                "postcss": "^8.4.16",
+                "resolve": "^1.22.1",
+                "rollup": "~2.78.0"
             },
             "bin": {
                 "vite": "bin/vite.js"
             },
             "engines": {
-                "node": ">=12.2.0"
+                "node": "^14.18.0 || >=16.0.0"
             },
             "optionalDependencies": {
                 "fsevents": "~2.3.2"
@@ -15573,7 +16563,8 @@
             "peerDependencies": {
                 "less": "*",
                 "sass": "*",
-                "stylus": "*"
+                "stylus": "*",
+                "terser": "^5.4.0"
             },
             "peerDependenciesMeta": {
                 "less": {
@@ -15584,6 +16575,9 @@
                 },
                 "stylus": {
                     "optional": true
+                },
+                "terser": {
+                    "optional": true
                 }
             }
         },
@@ -17779,10 +18773,116 @@
             "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.1.0.tgz",
             "integrity": "sha512-QgGnZ9b7o4k0Ai1ZbTJWwZpZcFK9d+Gb+DyNt4UT9x6IEIs5HVu0iIlmgzGqN+t9MoJSpSPo9S/Mm51UtHr3JA=="
         },
+        "@colors/colors": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+            "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+            "dev": true,
+            "optional": true
+        },
+        "@cypress/request": {
+            "version": "2.88.10",
+            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
+            "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
+            "dev": true,
+            "requires": {
+                "aws-sign2": "~0.7.0",
+                "aws4": "^1.8.0",
+                "caseless": "~0.12.0",
+                "combined-stream": "~1.0.6",
+                "extend": "~3.0.2",
+                "forever-agent": "~0.6.1",
+                "form-data": "~2.3.2",
+                "http-signature": "~1.3.6",
+                "is-typedarray": "~1.0.0",
+                "isstream": "~0.1.2",
+                "json-stringify-safe": "~5.0.1",
+                "mime-types": "~2.1.19",
+                "performance-now": "^2.1.0",
+                "qs": "~6.5.2",
+                "safe-buffer": "^5.1.2",
+                "tough-cookie": "~2.5.0",
+                "tunnel-agent": "^0.6.0",
+                "uuid": "^8.3.2"
+            },
+            "dependencies": {
+                "form-data": {
+                    "version": "2.3.3",
+                    "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+                    "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+                    "dev": true,
+                    "requires": {
+                        "asynckit": "^0.4.0",
+                        "combined-stream": "^1.0.6",
+                        "mime-types": "^2.1.12"
+                    }
+                },
+                "http-signature": {
+                    "version": "1.3.6",
+                    "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
+                    "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
+                    "dev": true,
+                    "requires": {
+                        "assert-plus": "^1.0.0",
+                        "jsprim": "^2.0.2",
+                        "sshpk": "^1.14.1"
+                    }
+                },
+                "jsprim": {
+                    "version": "2.0.2",
+                    "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
+                    "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+                    "dev": true,
+                    "requires": {
+                        "assert-plus": "1.0.0",
+                        "extsprintf": "1.3.0",
+                        "json-schema": "0.4.0",
+                        "verror": "1.10.0"
+                    }
+                },
+                "qs": {
+                    "version": "6.5.3",
+                    "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+                    "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+                    "dev": true
+                },
+                "tough-cookie": {
+                    "version": "2.5.0",
+                    "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+                    "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+                    "dev": true,
+                    "requires": {
+                        "psl": "^1.1.28",
+                        "punycode": "^2.1.1"
+                    }
+                }
+            }
+        },
+        "@cypress/xvfb": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
+            "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
+            "dev": true,
+            "requires": {
+                "debug": "^3.1.0",
+                "lodash.once": "^4.1.1"
+            },
+            "dependencies": {
+                "debug": {
+                    "version": "3.2.7",
+                    "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+                    "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+                    "dev": true,
+                    "requires": {
+                        "ms": "^2.1.1"
+                    }
+                }
+            }
+        },
         "@esbuild/linux-loong64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
-            "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.7.tgz",
+            "integrity": "sha512-IKznSJOsVUuyt7cDzzSZyqBEcZe+7WlBqTVXiF1OXP/4Nm387ToaXZ0fyLwI1iBlI/bzpxVq411QE2/Bt2XWWw==",
             "dev": true,
             "optional": true
         },
@@ -18993,6 +20093,18 @@
                 "@types/node": "*"
             }
         },
+        "@types/sinonjs__fake-timers": {
+            "version": "8.1.1",
+            "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
+            "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
+            "dev": true
+        },
+        "@types/sizzle": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
+            "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
+            "dev": true
+        },
         "@types/stack-utils": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
@@ -19025,16 +20137,16 @@
             }
         },
         "@vitejs/plugin-legacy": {
-            "version": "1.8.2",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.8.2.tgz",
-            "integrity": "sha512-NCOKU+pU+cxLMR9P9RTolEuOK+h+zYBXlknj+zGcKSj/NXBZYgA1GAH1FnO4zijoWRiTaiOm2ha9LQrELE7XHg==",
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-2.1.0.tgz",
+            "integrity": "sha512-en3h0L7okBonSYKJx81bU8AVFPjSCiUSz8xUDAW8J0CxskfxSt/VJKbZO6G9yCVgZLywGoO8PNAfOQWVLUWZ2A==",
             "dev": true,
             "requires": {
-                "@babel/standalone": "^7.17.11",
-                "core-js": "^3.22.3",
-                "magic-string": "^0.26.1",
+                "@babel/standalone": "^7.18.13",
+                "core-js": "^3.25.0",
+                "magic-string": "^0.26.2",
                 "regenerator-runtime": "^0.13.9",
-                "systemjs": "^6.12.1"
+                "systemjs": "^6.12.4"
             },
             "dependencies": {
                 "core-js": {
@@ -19046,9 +20158,9 @@
             }
         },
         "@vitejs/plugin-vue": {
-            "version": "2.3.4",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz",
-            "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==",
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.1.0.tgz",
+            "integrity": "sha512-fmxtHPjSOEIRg6vHYDaem+97iwCUg/uSIaTzp98lhELt2ISOQuDo2hbkBdXod0g15IhfPMQmAxh4heUks2zvDA==",
             "dev": true
         },
         "@vue/compiler-core": {
@@ -19371,6 +20483,16 @@
                 "debug": "4"
             }
         },
+        "aggregate-error": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+            "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+            "dev": true,
+            "requires": {
+                "clean-stack": "^2.0.0",
+                "indent-string": "^4.0.0"
+            }
+        },
         "ajv": {
             "version": "6.12.6",
             "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -19391,6 +20513,12 @@
                 "char-width-table-consumer": "^1.0.0"
             }
         },
+        "ansi-colors": {
+            "version": "4.1.3",
+            "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+            "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+            "dev": true
+        },
         "ansi-escapes": {
             "version": "4.3.2",
             "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -19429,6 +20557,12 @@
             "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
             "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
         },
+        "arch": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+            "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+            "dev": true
+        },
         "are-we-there-yet": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
@@ -19476,7 +20610,7 @@
             "version": "0.2.6",
             "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
             "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
-            "optional": true,
+            "devOptional": true,
             "requires": {
                 "safer-buffer": "~2.1.0"
             }
@@ -19485,7 +20619,7 @@
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
             "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
-            "optional": true
+            "devOptional": true
         },
         "astral-regex": {
             "version": "2.0.0",
@@ -19493,11 +20627,23 @@
             "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
             "dev": true
         },
+        "async": {
+            "version": "3.2.4",
+            "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+            "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
+            "dev": true
+        },
         "asynckit": {
             "version": "0.4.0",
             "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
             "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
         },
+        "at-least-node": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+            "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+            "dev": true
+        },
         "await-lock": {
             "version": "2.2.2",
             "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
@@ -19507,13 +20653,13 @@
             "version": "0.7.0",
             "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
             "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
-            "optional": true
+            "devOptional": true
         },
         "aws4": {
             "version": "1.11.0",
             "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
             "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
-            "optional": true
+            "devOptional": true
         },
         "axios": {
             "version": "0.27.2",
@@ -19781,7 +20927,7 @@
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
             "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
-            "optional": true,
+            "devOptional": true,
             "requires": {
                 "tweetnacl": "^0.14.3"
             }
@@ -19823,6 +20969,18 @@
                 "readable-stream": "^3.4.0"
             }
         },
+        "blob-util": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
+            "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+            "dev": true
+        },
+        "bluebird": {
+            "version": "3.7.2",
+            "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+            "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+            "dev": true
+        },
         "body-parser": {
             "version": "1.19.2",
             "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
@@ -19997,6 +21155,12 @@
             "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz",
             "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A=="
         },
+        "cachedir": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
+            "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
+            "dev": true
+        },
         "call-bind": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -20039,7 +21203,7 @@
             "version": "0.12.0",
             "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
             "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
-            "optional": true
+            "devOptional": true
         },
         "chalk": {
             "version": "2.4.2",
@@ -20083,6 +21247,12 @@
             "integrity": "sha512-EnbVqTJGFKLpg1TROLdCEufrzbmIa2oeLGx8O2Wdjw2EoMudoOo9+YFu+6CM0Z0hQ/v3yq/e/Y6efQMu22n8Jg==",
             "dev": true
         },
+        "check-more-types": {
+            "version": "2.24.0",
+            "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
+            "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
+            "dev": true
+        },
         "check-password-strength": {
             "version": "2.0.7",
             "resolved": "https://registry.npmjs.org/check-password-strength/-/check-password-strength-2.0.7.tgz",
@@ -20164,6 +21334,78 @@
             "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
             "dev": true
         },
+        "clean-stack": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+            "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+            "dev": true
+        },
+        "cli-cursor": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+            "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+            "dev": true,
+            "requires": {
+                "restore-cursor": "^3.1.0"
+            }
+        },
+        "cli-table3": {
+            "version": "0.6.2",
+            "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz",
+            "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==",
+            "dev": true,
+            "requires": {
+                "@colors/colors": "1.5.0",
+                "string-width": "^4.2.0"
+            }
+        },
+        "cli-truncate": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+            "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+            "dev": true,
+            "requires": {
+                "slice-ansi": "^3.0.0",
+                "string-width": "^4.2.0"
+            },
+            "dependencies": {
+                "ansi-styles": {
+                    "version": "4.3.0",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+                    "dev": true,
+                    "requires": {
+                        "color-convert": "^2.0.1"
+                    }
+                },
+                "color-convert": {
+                    "version": "2.0.1",
+                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+                    "dev": true,
+                    "requires": {
+                        "color-name": "~1.1.4"
+                    }
+                },
+                "color-name": {
+                    "version": "1.1.4",
+                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+                    "dev": true
+                },
+                "slice-ansi": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+                    "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+                    "dev": true,
+                    "requires": {
+                        "ansi-styles": "^4.0.0",
+                        "astral-regex": "^2.0.0",
+                        "is-fullwidth-code-point": "^3.0.0"
+                    }
+                }
+            }
+        },
         "cliui": {
             "version": "7.0.4",
             "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@@ -20301,6 +21543,12 @@
                 }
             }
         },
+        "common-tags": {
+            "version": "1.8.2",
+            "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+            "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+            "dev": true
+        },
         "compare-versions": {
             "version": "3.6.0",
             "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
@@ -20667,11 +21915,194 @@
                 "fs-exists-sync": "^0.1.0"
             }
         },
+        "cypress": {
+            "version": "10.7.0",
+            "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.7.0.tgz",
+            "integrity": "sha512-gTFvjrUoBnqPPOu9Vl5SBHuFlzx/Wxg/ZXIz2H4lzoOLFelKeF7mbwYUOzgzgF0oieU2WhJAestQdkgwJMMTvQ==",
+            "dev": true,
+            "requires": {
+                "@cypress/request": "^2.88.10",
+                "@cypress/xvfb": "^1.2.4",
+                "@types/node": "^14.14.31",
+                "@types/sinonjs__fake-timers": "8.1.1",
+                "@types/sizzle": "^2.3.2",
+                "arch": "^2.2.0",
+                "blob-util": "^2.0.2",
+                "bluebird": "^3.7.2",
+                "buffer": "^5.6.0",
+                "cachedir": "^2.3.0",
+                "chalk": "^4.1.0",
+                "check-more-types": "^2.24.0",
+                "cli-cursor": "^3.1.0",
+                "cli-table3": "~0.6.1",
+                "commander": "^5.1.0",
+                "common-tags": "^1.8.0",
+                "dayjs": "^1.10.4",
+                "debug": "^4.3.2",
+                "enquirer": "^2.3.6",
+                "eventemitter2": "^6.4.3",
+                "execa": "4.1.0",
+                "executable": "^4.1.1",
+                "extract-zip": "2.0.1",
+                "figures": "^3.2.0",
+                "fs-extra": "^9.1.0",
+                "getos": "^3.2.1",
+                "is-ci": "^3.0.0",
+                "is-installed-globally": "~0.4.0",
+                "lazy-ass": "^1.6.0",
+                "listr2": "^3.8.3",
+                "lodash": "^4.17.21",
+                "log-symbols": "^4.0.0",
+                "minimist": "^1.2.6",
+                "ospath": "^1.2.2",
+                "pretty-bytes": "^5.6.0",
+                "proxy-from-env": "1.0.0",
+                "request-progress": "^3.0.0",
+                "semver": "^7.3.2",
+                "supports-color": "^8.1.1",
+                "tmp": "~0.2.1",
+                "untildify": "^4.0.0",
+                "yauzl": "^2.10.0"
+            },
+            "dependencies": {
+                "@types/node": {
+                    "version": "14.18.28",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.28.tgz",
+                    "integrity": "sha512-CK2fnrQlIgKlCV3N2kM+Gznb5USlwA1KFX3rJVHmgVk6NJxFPuQ86pAcvKnu37IA4BGlSRz7sEE1lHL1aLZ/eQ==",
+                    "dev": true
+                },
+                "ansi-styles": {
+                    "version": "4.3.0",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+                    "dev": true,
+                    "requires": {
+                        "color-convert": "^2.0.1"
+                    }
+                },
+                "chalk": {
+                    "version": "4.1.2",
+                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+                    "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+                    "dev": true,
+                    "requires": {
+                        "ansi-styles": "^4.1.0",
+                        "supports-color": "^7.1.0"
+                    },
+                    "dependencies": {
+                        "supports-color": {
+                            "version": "7.2.0",
+                            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+                            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+                            "dev": true,
+                            "requires": {
+                                "has-flag": "^4.0.0"
+                            }
+                        }
+                    }
+                },
+                "color-convert": {
+                    "version": "2.0.1",
+                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+                    "dev": true,
+                    "requires": {
+                        "color-name": "~1.1.4"
+                    }
+                },
+                "color-name": {
+                    "version": "1.1.4",
+                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+                    "dev": true
+                },
+                "execa": {
+                    "version": "4.1.0",
+                    "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+                    "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+                    "dev": true,
+                    "requires": {
+                        "cross-spawn": "^7.0.0",
+                        "get-stream": "^5.0.0",
+                        "human-signals": "^1.1.1",
+                        "is-stream": "^2.0.0",
+                        "merge-stream": "^2.0.0",
+                        "npm-run-path": "^4.0.0",
+                        "onetime": "^5.1.0",
+                        "signal-exit": "^3.0.2",
+                        "strip-final-newline": "^2.0.0"
+                    }
+                },
+                "fs-extra": {
+                    "version": "9.1.0",
+                    "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+                    "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+                    "dev": true,
+                    "requires": {
+                        "at-least-node": "^1.0.0",
+                        "graceful-fs": "^4.2.0",
+                        "jsonfile": "^6.0.1",
+                        "universalify": "^2.0.0"
+                    }
+                },
+                "get-stream": {
+                    "version": "5.2.0",
+                    "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+                    "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+                    "dev": true,
+                    "requires": {
+                        "pump": "^3.0.0"
+                    }
+                },
+                "has-flag": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+                    "dev": true
+                },
+                "human-signals": {
+                    "version": "1.1.1",
+                    "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+                    "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+                    "dev": true
+                },
+                "proxy-from-env": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+                    "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
+                    "dev": true
+                },
+                "semver": {
+                    "version": "7.3.7",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+                    "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+                    "dev": true,
+                    "requires": {
+                        "lru-cache": "^6.0.0"
+                    }
+                },
+                "supports-color": {
+                    "version": "8.1.1",
+                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+                    "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+                    "dev": true,
+                    "requires": {
+                        "has-flag": "^4.0.0"
+                    }
+                },
+                "universalify": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+                    "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+                    "dev": true
+                }
+            }
+        },
         "dashdash": {
             "version": "1.14.1",
             "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
             "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
-            "optional": true,
+            "devOptional": true,
             "requires": {
                 "assert-plus": "^1.0.0"
             }
@@ -20775,6 +22206,12 @@
                 "object-keys": "^1.1.1"
             }
         },
+        "delay": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz",
+            "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==",
+            "dev": true
+        },
         "delayed-stream": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -20924,7 +22361,7 @@
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
             "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
-            "optional": true,
+            "devOptional": true,
             "requires": {
                 "jsbn": "~0.1.0",
                 "safer-buffer": "^2.1.0"
@@ -21031,6 +22468,15 @@
             "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
             "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
         },
+        "enquirer": {
+            "version": "2.3.6",
+            "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+            "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+            "dev": true,
+            "requires": {
+                "ansi-colors": "^4.1.1"
+            }
+        },
         "entities": {
             "version": "4.4.0",
             "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
@@ -21106,171 +22552,171 @@
             }
         },
         "esbuild": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
-            "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.7.tgz",
+            "integrity": "sha512-7V8tzllIbAQV1M4QoE52ImKu8hT/NLGlGXkiDsbEU5PS6K8Mn09ZnYoS+dcmHxOS9CRsV4IRAMdT3I67IyUNXw==",
             "dev": true,
             "requires": {
-                "@esbuild/linux-loong64": "0.14.54",
-                "esbuild-android-64": "0.14.54",
-                "esbuild-android-arm64": "0.14.54",
-                "esbuild-darwin-64": "0.14.54",
-                "esbuild-darwin-arm64": "0.14.54",
-                "esbuild-freebsd-64": "0.14.54",
-                "esbuild-freebsd-arm64": "0.14.54",
-                "esbuild-linux-32": "0.14.54",
-                "esbuild-linux-64": "0.14.54",
-                "esbuild-linux-arm": "0.14.54",
-                "esbuild-linux-arm64": "0.14.54",
-                "esbuild-linux-mips64le": "0.14.54",
-                "esbuild-linux-ppc64le": "0.14.54",
-                "esbuild-linux-riscv64": "0.14.54",
-                "esbuild-linux-s390x": "0.14.54",
-                "esbuild-netbsd-64": "0.14.54",
-                "esbuild-openbsd-64": "0.14.54",
-                "esbuild-sunos-64": "0.14.54",
-                "esbuild-windows-32": "0.14.54",
-                "esbuild-windows-64": "0.14.54",
-                "esbuild-windows-arm64": "0.14.54"
+                "@esbuild/linux-loong64": "0.15.7",
+                "esbuild-android-64": "0.15.7",
+                "esbuild-android-arm64": "0.15.7",
+                "esbuild-darwin-64": "0.15.7",
+                "esbuild-darwin-arm64": "0.15.7",
+                "esbuild-freebsd-64": "0.15.7",
+                "esbuild-freebsd-arm64": "0.15.7",
+                "esbuild-linux-32": "0.15.7",
+                "esbuild-linux-64": "0.15.7",
+                "esbuild-linux-arm": "0.15.7",
+                "esbuild-linux-arm64": "0.15.7",
+                "esbuild-linux-mips64le": "0.15.7",
+                "esbuild-linux-ppc64le": "0.15.7",
+                "esbuild-linux-riscv64": "0.15.7",
+                "esbuild-linux-s390x": "0.15.7",
+                "esbuild-netbsd-64": "0.15.7",
+                "esbuild-openbsd-64": "0.15.7",
+                "esbuild-sunos-64": "0.15.7",
+                "esbuild-windows-32": "0.15.7",
+                "esbuild-windows-64": "0.15.7",
+                "esbuild-windows-arm64": "0.15.7"
             }
         },
         "esbuild-android-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
-            "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.7.tgz",
+            "integrity": "sha512-p7rCvdsldhxQr3YHxptf1Jcd86dlhvc3EQmQJaZzzuAxefO9PvcI0GLOa5nCWem1AJ8iMRu9w0r5TG8pHmbi9w==",
             "dev": true,
             "optional": true
         },
         "esbuild-android-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
-            "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.7.tgz",
+            "integrity": "sha512-L775l9ynJT7rVqRM5vo+9w5g2ysbOCfsdLV4CWanTZ1k/9Jb3IYlQ06VCI1edhcosTYJRECQFJa3eAvkx72eyQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-darwin-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
-            "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.7.tgz",
+            "integrity": "sha512-KGPt3r1c9ww009t2xLB6Vk0YyNOXh7hbjZ3EecHoVDxgtbUlYstMPDaReimKe6eOEfyY4hBEEeTvKwPsiH5WZg==",
             "dev": true,
             "optional": true
         },
         "esbuild-darwin-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
-            "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.7.tgz",
+            "integrity": "sha512-kBIHvtVqbSGajN88lYMnR3aIleH3ABZLLFLxwL2stiuIGAjGlQW741NxVTpUHQXUmPzxi6POqc9npkXa8AcSZQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-freebsd-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
-            "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.7.tgz",
+            "integrity": "sha512-hESZB91qDLV5MEwNxzMxPfbjAhOmtfsr9Wnuci7pY6TtEh4UDuevmGmkUIjX/b+e/k4tcNBMf7SRQ2mdNuK/HQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-freebsd-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
-            "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.7.tgz",
+            "integrity": "sha512-dLFR0ChH5t+b3J8w0fVKGvtwSLWCv7GYT2Y2jFGulF1L5HftQLzVGN+6pi1SivuiVSmTh28FwUhi9PwQicXI6Q==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-32": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
-            "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.7.tgz",
+            "integrity": "sha512-v3gT/LsONGUZcjbt2swrMjwxo32NJzk+7sAgtxhGx1+ZmOFaTRXBAi1PPfgpeo/J//Un2jIKm/I+qqeo4caJvg==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
-            "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.7.tgz",
+            "integrity": "sha512-LxXEfLAKwOVmm1yecpMmWERBshl+Kv5YJ/1KnyAr6HRHFW8cxOEsEfisD3sVl/RvHyW//lhYUVSuy9jGEfIRAQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-arm": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
-            "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.7.tgz",
+            "integrity": "sha512-JKgAHtMR5f75wJTeuNQbyznZZa+pjiUHV7sRZp42UNdyXC6TiUYMW/8z8yIBAr2Fpad8hM1royZKQisqPABPvQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
-            "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.7.tgz",
+            "integrity": "sha512-P3cfhudpzWDkglutWgXcT2S7Ft7o2e3YDMrP1n0z2dlbUZghUkKCyaWw0zhp4KxEEzt/E7lmrtRu/pGWnwb9vw==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-mips64le": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
-            "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.7.tgz",
+            "integrity": "sha512-T7XKuxl0VpeFLCJXub6U+iybiqh0kM/bWOTb4qcPyDDwNVhLUiPcGdG2/0S7F93czUZOKP57YiLV8YQewgLHKw==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-ppc64le": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
-            "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.7.tgz",
+            "integrity": "sha512-6mGuC19WpFN7NYbecMIJjeQgvDb5aMuvyk0PDYBJrqAEMkTwg3Z98kEKuCm6THHRnrgsdr7bp4SruSAxEM4eJw==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-riscv64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
-            "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.7.tgz",
+            "integrity": "sha512-uUJsezbswAYo/X7OU/P+PuL/EI9WzxsEQXDekfwpQ23uGiooxqoLFAPmXPcRAt941vjlY9jtITEEikWMBr+F/g==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-s390x": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
-            "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.7.tgz",
+            "integrity": "sha512-+tO+xOyTNMc34rXlSxK7aCwJgvQyffqEM5MMdNDEeMU3ss0S6wKvbBOQfgd5jRPblfwJ6b+bKiz0g5nABpY0QQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-netbsd-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
-            "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.7.tgz",
+            "integrity": "sha512-yVc4Wz+Pu3cP5hzm5kIygNPrjar/v5WCSoRmIjCPWfBVJkZNb5brEGKUlf+0Y759D48BCWa0WHrWXaNy0DULTQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-openbsd-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
-            "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.7.tgz",
+            "integrity": "sha512-GsimbwC4FSR4lN3wf8XmTQ+r8/0YSQo21rWDL0XFFhLHKlzEA4SsT1Tl8bPYu00IU6UWSJ+b3fG/8SB69rcuEQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-sunos-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
-            "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.7.tgz",
+            "integrity": "sha512-8CDI1aL/ts0mDGbWzjEOGKXnU7p3rDzggHSBtVryQzkSOsjCHRVe0iFYUuhczlxU1R3LN/E7HgUO4NXzGGP/Ag==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-32": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
-            "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.7.tgz",
+            "integrity": "sha512-cOnKXUEPS8EGCzRSFa1x6NQjGhGsFlVgjhqGEbLTPsA7x4RRYiy2RKoArNUU4iR2vHmzqS5Gr84MEumO/wxYKA==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
-            "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.7.tgz",
+            "integrity": "sha512-7MI08Ec2sTIDv+zH6StNBKO+2hGUYIT42GmFyW6MBBWWtJhTcQLinKS6ldIN1d52MXIbiJ6nXyCJ+LpL4jBm3Q==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-arm64": {
-            "version": "0.14.54",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
-            "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
+            "version": "0.15.7",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.7.tgz",
+            "integrity": "sha512-R06nmqBlWjKHddhRJYlqDd3Fabx9LFdKcjoOy08YLimwmsswlFBJV4rXzZCxz/b7ZJXvrZgj8DDv1ewE9+StMw==",
             "dev": true,
             "optional": true
         },
@@ -21624,6 +23070,12 @@
             "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
             "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
         },
+        "eventemitter2": {
+            "version": "6.4.8",
+            "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.8.tgz",
+            "integrity": "sha512-pAJurPyD+Nj/pfz8m0usKF1RW0E9gfY4Dfdem2l6jZbqcZlK8SP93qUMCv9V9FgOn+GSZEW6qeaglpf/vQ9D5A==",
+            "dev": true
+        },
         "events": {
             "version": "3.3.0",
             "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
@@ -21655,6 +23107,15 @@
                 "clone-regexp": "^2.1.0"
             }
         },
+        "executable": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
+            "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+            "dev": true,
+            "requires": {
+                "pify": "^2.2.0"
+            }
+        },
         "exit": {
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -21765,7 +23226,7 @@
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
             "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-            "optional": true
+            "devOptional": true
         },
         "extract-zip": {
             "version": "2.0.1",
@@ -21794,7 +23255,7 @@
             "version": "1.3.0",
             "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
             "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
-            "optional": true
+            "devOptional": true
         },
         "fast-deep-equal": {
             "version": "3.1.3",
@@ -21902,6 +23363,15 @@
                 "pend": "~1.2.0"
             }
         },
+        "figures": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+            "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+            "dev": true,
+            "requires": {
+                "escape-string-regexp": "^1.0.5"
+            }
+        },
         "file-entry-cache": {
             "version": "6.0.1",
             "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -22080,7 +23550,7 @@
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
             "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
-            "optional": true
+            "devOptional": true
         },
         "form-data": {
             "version": "4.0.0",
@@ -22286,11 +23756,20 @@
             "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
             "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="
         },
+        "getos": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
+            "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+            "dev": true,
+            "requires": {
+                "async": "^3.2.0"
+            }
+        },
         "getpass": {
             "version": "0.1.7",
             "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
             "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
-            "optional": true,
+            "devOptional": true,
             "requires": {
                 "assert-plus": "^1.0.0"
             }
@@ -22317,6 +23796,23 @@
                 "is-glob": "^4.0.3"
             }
         },
+        "global-dirs": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
+            "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+            "dev": true,
+            "requires": {
+                "ini": "2.0.0"
+            },
+            "dependencies": {
+                "ini": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+                    "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+                    "dev": true
+                }
+            }
+        },
         "global-modules": {
             "version": "0.2.3",
             "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
@@ -22745,6 +24241,15 @@
             "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
             "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
         },
+        "is-ci": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+            "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+            "dev": true,
+            "requires": {
+                "ci-info": "^3.2.0"
+            }
+        },
         "is-core-module": {
             "version": "2.10.0",
             "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
@@ -22798,6 +24303,16 @@
                 "is-extglob": "^2.1.1"
             }
         },
+        "is-installed-globally": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+            "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+            "dev": true,
+            "requires": {
+                "global-dirs": "^3.0.0",
+                "is-path-inside": "^3.0.2"
+            }
+        },
         "is-invalid-path": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz",
@@ -22840,6 +24355,12 @@
                 "has-tostringtag": "^1.0.0"
             }
         },
+        "is-path-inside": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+            "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+            "dev": true
+        },
         "is-plain-obj": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
@@ -22922,6 +24443,12 @@
             "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
             "devOptional": true
         },
+        "is-unicode-supported": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+            "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+            "dev": true
+        },
         "is-valid-path": {
             "version": "0.1.1",
             "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz",
@@ -22982,7 +24509,7 @@
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
             "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
-            "optional": true
+            "devOptional": true
         },
         "istanbul-lib-coverage": {
             "version": "3.2.0",
@@ -24507,7 +26034,7 @@
             "version": "0.1.1",
             "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
             "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
-            "optional": true
+            "devOptional": true
         },
         "jsdom": {
             "version": "16.7.0",
@@ -24596,7 +26123,7 @@
             "version": "0.4.0",
             "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
             "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
-            "optional": true
+            "devOptional": true
         },
         "json-schema-traverse": {
             "version": "0.4.1",
@@ -24614,7 +26141,7 @@
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
             "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
-            "optional": true
+            "devOptional": true
         },
         "json5": {
             "version": "2.2.1",
@@ -24771,6 +26298,12 @@
             "integrity": "sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==",
             "dev": true
         },
+        "lazy-ass": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+            "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+            "dev": true
+        },
         "lazy-cache": {
             "version": "1.0.4",
             "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
@@ -24807,6 +26340,22 @@
             "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
             "dev": true
         },
+        "listr2": {
+            "version": "3.14.0",
+            "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+            "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+            "dev": true,
+            "requires": {
+                "cli-truncate": "^2.1.0",
+                "colorette": "^2.0.16",
+                "log-update": "^4.0.0",
+                "p-map": "^4.0.0",
+                "rfdc": "^1.3.0",
+                "rxjs": "^7.5.1",
+                "through": "^2.3.8",
+                "wrap-ansi": "^7.0.0"
+            }
+        },
         "locate-path": {
             "version": "5.0.0",
             "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -24933,6 +26482,116 @@
                 "lodash._baseuniq": "~4.6.0"
             }
         },
+        "log-symbols": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+            "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+            "dev": true,
+            "requires": {
+                "chalk": "^4.1.0",
+                "is-unicode-supported": "^0.1.0"
+            },
+            "dependencies": {
+                "ansi-styles": {
+                    "version": "4.3.0",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+                    "dev": true,
+                    "requires": {
+                        "color-convert": "^2.0.1"
+                    }
+                },
+                "chalk": {
+                    "version": "4.1.2",
+                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+                    "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+                    "dev": true,
+                    "requires": {
+                        "ansi-styles": "^4.1.0",
+                        "supports-color": "^7.1.0"
+                    }
+                },
+                "color-convert": {
+                    "version": "2.0.1",
+                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+                    "dev": true,
+                    "requires": {
+                        "color-name": "~1.1.4"
+                    }
+                },
+                "color-name": {
+                    "version": "1.1.4",
+                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+                    "dev": true
+                },
+                "has-flag": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+                    "dev": true
+                },
+                "supports-color": {
+                    "version": "7.2.0",
+                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+                    "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+                    "dev": true,
+                    "requires": {
+                        "has-flag": "^4.0.0"
+                    }
+                }
+            }
+        },
+        "log-update": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+            "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+            "dev": true,
+            "requires": {
+                "ansi-escapes": "^4.3.0",
+                "cli-cursor": "^3.1.0",
+                "slice-ansi": "^4.0.0",
+                "wrap-ansi": "^6.2.0"
+            },
+            "dependencies": {
+                "ansi-styles": {
+                    "version": "4.3.0",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+                    "dev": true,
+                    "requires": {
+                        "color-convert": "^2.0.1"
+                    }
+                },
+                "color-convert": {
+                    "version": "2.0.1",
+                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+                    "dev": true,
+                    "requires": {
+                        "color-name": "~1.1.4"
+                    }
+                },
+                "color-name": {
+                    "version": "1.1.4",
+                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+                    "dev": true
+                },
+                "wrap-ansi": {
+                    "version": "6.2.0",
+                    "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+                    "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+                    "dev": true,
+                    "requires": {
+                        "ansi-styles": "^4.0.0",
+                        "string-width": "^4.1.0",
+                        "strip-ansi": "^6.0.0"
+                    }
+                }
+            }
+        },
         "lru-cache": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -25683,6 +27342,12 @@
             "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
             "dev": true
         },
+        "ospath": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
+            "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+            "dev": true
+        },
         "p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -25706,6 +27371,15 @@
                 "p-limit": "^2.2.0"
             }
         },
+        "p-map": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+            "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+            "dev": true,
+            "requires": {
+                "aggregate-error": "^3.0.0"
+            }
+        },
         "p-timeout": {
             "version": "3.2.0",
             "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
@@ -25840,7 +27514,7 @@
             "version": "2.1.0",
             "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
             "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
-            "optional": true
+            "devOptional": true
         },
         "pg": {
             "version": "8.8.0",
@@ -25915,6 +27589,12 @@
             "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
             "dev": true
         },
+        "pify": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+            "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+            "dev": true
+        },
         "pirates": {
             "version": "4.0.5",
             "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
@@ -26050,6 +27730,12 @@
             "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
             "dev": true
         },
+        "pretty-bytes": {
+            "version": "5.6.0",
+            "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+            "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+            "dev": true
+        },
         "pretty-format": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
@@ -26656,6 +28342,15 @@
                 }
             }
         },
+        "request-progress": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
+            "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+            "dev": true,
+            "requires": {
+                "throttleit": "^1.0.0"
+            }
+        },
         "require-directory": {
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -26729,6 +28424,16 @@
             "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
             "dev": true
         },
+        "restore-cursor": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+            "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+            "dev": true,
+            "requires": {
+                "onetime": "^5.1.0",
+                "signal-exit": "^3.0.2"
+            }
+        },
         "retimer": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz",
@@ -26755,9 +28460,9 @@
             }
         },
         "rollup": {
-            "version": "2.77.3",
-            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz",
-            "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
+            "version": "2.78.1",
+            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz",
+            "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==",
             "dev": true,
             "requires": {
                 "fsevents": "~2.3.2"
@@ -27244,7 +28949,7 @@
             "version": "1.17.0",
             "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
             "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
-            "optional": true,
+            "devOptional": true,
             "requires": {
                 "asn1": "~0.2.3",
                 "assert-plus": "^1.0.0",
@@ -27743,6 +29448,12 @@
             "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
             "dev": true
         },
+        "throttleit": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
+            "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
+            "dev": true
+        },
         "through": {
             "version": "2.3.8",
             "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -27760,6 +29471,15 @@
             "integrity": "sha512-yfOzyuVwzgD0LkldD3Epkr+JUdUIxEUL147Fa6ZgG/23KU28iOv3e3M7vQOCFMPyopAhDX7dqOLWttIP7tkTKg==",
             "dev": true
         },
+        "tmp": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+            "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+            "dev": true,
+            "requires": {
+                "rimraf": "^3.0.0"
+            }
+        },
         "tmpl": {
             "version": "1.0.5",
             "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -27847,7 +29567,7 @@
             "version": "0.6.0",
             "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
             "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
-            "optional": true,
+            "devOptional": true,
             "requires": {
                 "safe-buffer": "^5.0.1"
             }
@@ -27856,7 +29576,7 @@
             "version": "0.14.5",
             "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
             "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
-            "optional": true
+            "devOptional": true
         },
         "type-check": {
             "version": "0.4.0",
@@ -27974,6 +29694,12 @@
             "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
             "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
         },
+        "untildify": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+            "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+            "dev": true
+        },
         "update-browserslist-db": {
             "version": "1.0.5",
             "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
@@ -28079,7 +29805,7 @@
             "version": "1.10.0",
             "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
             "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
-            "optional": true,
+            "devOptional": true,
             "requires": {
                 "assert-plus": "^1.0.0",
                 "core-util-is": "1.0.2",
@@ -28087,16 +29813,16 @@
             }
         },
         "vite": {
-            "version": "2.9.15",
-            "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz",
-            "integrity": "sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==",
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.0.tgz",
+            "integrity": "sha512-YBg3dUicDpDWFCGttmvMbVyS9ydjntwEjwXRj2KBFwSB8SxmGcudo1yb8FW5+M/G86aS8x828ujnzUVdsLjs9g==",
             "dev": true,
             "requires": {
-                "esbuild": "^0.14.27",
+                "esbuild": "^0.15.6",
                 "fsevents": "~2.3.2",
-                "postcss": "^8.4.13",
-                "resolve": "^1.22.0",
-                "rollup": ">=2.59.0 <2.78.0"
+                "postcss": "^8.4.16",
+                "resolve": "^1.22.1",
+                "rollup": "~2.78.0"
             }
         },
         "vite-plugin-compression": {
diff --git a/package.json b/package.json
index be335ae0..34936fdf 100644
--- a/package.json
+++ b/package.json
@@ -121,8 +121,8 @@
         "@fortawesome/vue-fontawesome": "~3.0.0-5",
         "@popperjs/core": "~2.10.2",
         "@types/bootstrap": "~5.1.9",
-        "@vitejs/plugin-legacy": "~1.8.2",
-        "@vitejs/plugin-vue": "~2.3.3",
+        "@vitejs/plugin-legacy": "~2.1.0",
+        "@vitejs/plugin-vue": "~3.1.0",
         "@vue/compiler-sfc": "~3.2.36",
         "aedes": "^0.46.3",
         "babel-plugin-rewire": "~1.2.0",
@@ -153,7 +153,7 @@
         "timezones-list": "~3.0.1",
         "typescript": "~4.4.4",
         "v-pagination-3": "~0.1.7",
-        "vite": "~2.9.9",
+        "vite": "~3.1.0",
         "vite-plugin-compression": "^0.5.1",
         "vue": "next",
         "vue-chart-3": "3.0.9",

From 0dd858d5169c3b30ce492ea55d79dae6545413e4 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 12 Sep 2022 18:45:18 +0800
Subject: [PATCH 128/803] Warn about the backup feature

---
 src/components/settings/Backup.vue | 6 ++++++
 src/languages/en.js                | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/src/components/settings/Backup.vue b/src/components/settings/Backup.vue
index 685a4c6b..4d6756c7 100644
--- a/src/components/settings/Backup.vue
+++ b/src/components/settings/Backup.vue
@@ -1,6 +1,12 @@
 <template>
     <div>
         <div class="my-4">
+            <div class="alert alert-warning" role="alert" style="border-radius: 15px;">
+                {{ $t("backupOutdatedWarning") }}<br />
+                <br />
+                {{ $t("backupRecommend") }}
+            </div>
+
             <h4 class="mt-4 mb-2">{{ $t("Export Backup") }}</h4>
 
             <p>
diff --git a/src/languages/en.js b/src/languages/en.js
index 67fb4bea..7d980f63 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -580,4 +580,6 @@ export default {
     goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
     goAlertIntegrationKeyInfo: "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
     goAlert: "GoAlert",
+    backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
+    backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
 };

From d63022676a68b59f13382bc7bd9a6330eaaacc3d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 13 Sep 2022 15:17:39 +0800
Subject: [PATCH 129/803] Fix build issue after updated vite

---
 package-lock.json | 87 +++++++++++++++++++++++++++++++++++++++++------
 package.json      |  7 ++--
 2 files changed, 80 insertions(+), 14 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 7c32fd43..65e380d1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -84,9 +84,9 @@
                 "favico.js": "^0.3.10",
                 "jest": "~27.2.5",
                 "jest-puppeteer": "~6.0.3",
-                "postcss-html": "^1.3.1",
-                "postcss-rtlcss": "~3.4.1",
-                "postcss-scss": "~4.0.3",
+                "postcss-html": "~1.5.0",
+                "postcss-rtlcss": "~3.7.2",
+                "postcss-scss": "~4.0.4",
                 "prismjs": "^1.27.0",
                 "puppeteer": "~13.1.3",
                 "qrcode": "~1.5.0",
@@ -94,6 +94,7 @@
                 "sass": "~1.42.1",
                 "stylelint": "~14.7.1",
                 "stylelint-config-standard": "~25.0.0",
+                "terser": "^5.15.0",
                 "timezones-list": "~3.0.1",
                 "typescript": "~4.4.4",
                 "v-pagination-3": "~0.1.7",
@@ -3098,6 +3099,16 @@
                 "node": ">=6.0.0"
             }
         },
+        "node_modules/@jridgewell/source-map": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+            "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+            "dev": true,
+            "dependencies": {
+                "@jridgewell/gen-mapping": "^0.3.0",
+                "@jridgewell/trace-mapping": "^0.3.9"
+            }
+        },
         "node_modules/@jridgewell/sourcemap-codec": {
             "version": "1.4.14",
             "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
@@ -13738,12 +13749,12 @@
             "dev": true
         },
         "node_modules/postcss-rtlcss": {
-            "version": "3.4.1",
-            "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.4.1.tgz",
-            "integrity": "sha512-4SOkC34IJ086dYjmqGCeIOqQe4JTDk+jwETvq1M/57+bQA6CXEWAjGtqifjcSH75nd0vfW7+hve0Ec4ZYHmMtA==",
+            "version": "3.7.2",
+            "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.7.2.tgz",
+            "integrity": "sha512-GurrGedCKvOTe1QrifI+XpDKXA3bJky1v8KiOa/TYYHs1bfJOxI53GIRvVSqLJLly7e1WcNMz8KMESTN01vbZQ==",
             "dev": true,
             "dependencies": {
-                "rtlcss": "^3.3.0"
+                "rtlcss": "^3.5.0"
             },
             "engines": {
                 "node": ">=12.0.0"
@@ -16030,6 +16041,30 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/terser": {
+            "version": "5.15.0",
+            "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz",
+            "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==",
+            "dev": true,
+            "dependencies": {
+                "@jridgewell/source-map": "^0.3.2",
+                "acorn": "^8.5.0",
+                "commander": "^2.20.0",
+                "source-map-support": "~0.5.20"
+            },
+            "bin": {
+                "terser": "bin/terser"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/terser/node_modules/commander": {
+            "version": "2.20.3",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+            "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+            "dev": true
+        },
         "node_modules/test-exclude": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@@ -19580,6 +19615,16 @@
             "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
             "dev": true
         },
+        "@jridgewell/source-map": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
+            "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
+            "dev": true,
+            "requires": {
+                "@jridgewell/gen-mapping": "^0.3.0",
+                "@jridgewell/trace-mapping": "^0.3.9"
+            }
+        },
         "@jridgewell/sourcemap-codec": {
             "version": "1.4.14",
             "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
@@ -27665,12 +27710,12 @@
             "dev": true
         },
         "postcss-rtlcss": {
-            "version": "3.4.1",
-            "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.4.1.tgz",
-            "integrity": "sha512-4SOkC34IJ086dYjmqGCeIOqQe4JTDk+jwETvq1M/57+bQA6CXEWAjGtqifjcSH75nd0vfW7+hve0Ec4ZYHmMtA==",
+            "version": "3.7.2",
+            "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-3.7.2.tgz",
+            "integrity": "sha512-GurrGedCKvOTe1QrifI+XpDKXA3bJky1v8KiOa/TYYHs1bfJOxI53GIRvVSqLJLly7e1WcNMz8KMESTN01vbZQ==",
             "dev": true,
             "requires": {
-                "rtlcss": "^3.3.0"
+                "rtlcss": "^3.5.0"
             }
         },
         "postcss-safe-parser": {
@@ -29420,6 +29465,26 @@
                 "supports-hyperlinks": "^2.0.0"
             }
         },
+        "terser": {
+            "version": "5.15.0",
+            "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz",
+            "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==",
+            "dev": true,
+            "requires": {
+                "@jridgewell/source-map": "^0.3.2",
+                "acorn": "^8.5.0",
+                "commander": "^2.20.0",
+                "source-map-support": "~0.5.20"
+            },
+            "dependencies": {
+                "commander": {
+                    "version": "2.20.3",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+                    "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+                    "dev": true
+                }
+            }
+        },
         "test-exclude": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
diff --git a/package.json b/package.json
index 34936fdf..219042aa 100644
--- a/package.json
+++ b/package.json
@@ -140,9 +140,9 @@
         "favico.js": "^0.3.10",
         "jest": "~27.2.5",
         "jest-puppeteer": "~6.0.3",
-        "postcss-html": "^1.3.1",
-        "postcss-rtlcss": "~3.4.1",
-        "postcss-scss": "~4.0.3",
+        "postcss-html": "~1.5.0",
+        "postcss-rtlcss": "~3.7.2",
+        "postcss-scss": "~4.0.4",
         "prismjs": "^1.27.0",
         "puppeteer": "~13.1.3",
         "qrcode": "~1.5.0",
@@ -150,6 +150,7 @@
         "sass": "~1.42.1",
         "stylelint": "~14.7.1",
         "stylelint-config-standard": "~25.0.0",
+        "terser": "^5.15.0",
         "timezones-list": "~3.0.1",
         "typescript": "~4.4.4",
         "v-pagination-3": "~0.1.7",

From 68875c3091aa2c32953365a2b4bcb4b0a157be89 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 13 Sep 2022 22:22:01 +0800
Subject: [PATCH 130/803] Fix merging issue

---
 package-lock.json | 308 ++++++++++++++++++++++++++++++++++++++++++----
 package.json      |   9 +-
 2 files changed, 286 insertions(+), 31 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 65e380d1..9f849c99 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,6 +9,7 @@
             "version": "1.18.0",
             "license": "MIT",
             "dependencies": {
+                "@grpc/grpc-js": "~1.7.0",
                 "@louislam/sqlite3": "~15.0.6",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
@@ -47,6 +48,7 @@
                 "pg-connection-string": "^2.5.0",
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
+                "protobufjs": "~7.1.1",
                 "redbean-node": "0.1.4",
                 "socket.io": "~4.4.1",
                 "socket.io-client": "~4.4.1",
@@ -2291,6 +2293,53 @@
                 "vue": ">= 3.0.0 < 4"
             }
         },
+        "node_modules/@grpc/grpc-js": {
+            "version": "1.7.0",
+            "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.0.tgz",
+            "integrity": "sha512-wvKxal+40Xx11DXO2q5PfY3UiE25iwTb8SOz6A9IJII/V7d19x2ex0he+GJfVW0JZCaBjCPSjUB0yU9Ecm4WCw==",
+            "dependencies": {
+                "@grpc/proto-loader": "^0.7.0",
+                "@types/node": ">=12.12.47"
+            },
+            "engines": {
+                "node": "^8.13.0 || >=10.10.0"
+            }
+        },
+        "node_modules/@grpc/proto-loader": {
+            "version": "0.7.2",
+            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.2.tgz",
+            "integrity": "sha512-jCdyLIT/tdQ1zhrbTQnJNK5nbDf0GoBpy5jVNywBzzMDF+Vs6uEaHnfz46dMtDxkvwrF2hzk5Z67goliceH0sA==",
+            "dependencies": {
+                "@types/long": "^4.0.1",
+                "lodash.camelcase": "^4.3.0",
+                "long": "^4.0.0",
+                "protobufjs": "^7.0.0",
+                "yargs": "^16.2.0"
+            },
+            "bin": {
+                "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/@grpc/proto-loader/node_modules/yargs": {
+            "version": "16.2.0",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+            "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+            "dependencies": {
+                "cliui": "^7.0.2",
+                "escalade": "^3.1.1",
+                "get-caller-file": "^2.0.5",
+                "require-directory": "^2.1.1",
+                "string-width": "^4.2.0",
+                "y18n": "^5.0.5",
+                "yargs-parser": "^20.2.2"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/@hapi/hoek": {
             "version": "9.3.0",
             "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -3341,6 +3390,60 @@
                 "url": "https://opencollective.com/popperjs"
             }
         },
+        "node_modules/@protobufjs/aspromise": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+            "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+        },
+        "node_modules/@protobufjs/base64": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+            "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+        },
+        "node_modules/@protobufjs/codegen": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+            "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+        },
+        "node_modules/@protobufjs/eventemitter": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+            "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+        },
+        "node_modules/@protobufjs/fetch": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+            "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+            "dependencies": {
+                "@protobufjs/aspromise": "^1.1.1",
+                "@protobufjs/inquire": "^1.1.0"
+            }
+        },
+        "node_modules/@protobufjs/float": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+            "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+        },
+        "node_modules/@protobufjs/inquire": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+            "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+        },
+        "node_modules/@protobufjs/path": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+            "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+        },
+        "node_modules/@protobufjs/pool": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+            "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+        },
+        "node_modules/@protobufjs/utf8": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+            "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+        },
         "node_modules/@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -3609,6 +3712,11 @@
             "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz",
             "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q=="
         },
+        "node_modules/@types/long": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+            "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
+        },
         "node_modules/@types/mime": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
@@ -5310,7 +5418,6 @@
             "version": "7.0.4",
             "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
             "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-            "dev": true,
             "dependencies": {
                 "string-width": "^4.2.0",
                 "strip-ansi": "^6.0.0",
@@ -8462,7 +8569,6 @@
             "version": "2.0.5",
             "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
             "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-            "dev": true,
             "engines": {
                 "node": "6.* || 8.* || >= 10.*"
             }
@@ -12116,6 +12222,11 @@
                 "lodash._basetostring": "~4.12.0"
             }
         },
+        "node_modules/lodash.camelcase": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+            "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+        },
         "node_modules/lodash.debounce": {
             "version": "4.0.8",
             "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -12334,6 +12445,11 @@
                 "node": ">=8"
             }
         },
+        "node_modules/long": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+            "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+        },
         "node_modules/lru-cache": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -13972,6 +14088,34 @@
             "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
             "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
         },
+        "node_modules/protobufjs": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.1.tgz",
+            "integrity": "sha512-d0nMQqS/aT3lfV8bKi9Gbg73vPd2LcDdTDOu6RE/M+h9DY8g1EmDzk3ADPccthEWfTBjkR2oxNdx9Gs8YubT+g==",
+            "hasInstallScript": true,
+            "dependencies": {
+                "@protobufjs/aspromise": "^1.1.2",
+                "@protobufjs/base64": "^1.1.2",
+                "@protobufjs/codegen": "^2.0.4",
+                "@protobufjs/eventemitter": "^1.1.0",
+                "@protobufjs/fetch": "^1.1.0",
+                "@protobufjs/float": "^1.0.2",
+                "@protobufjs/inquire": "^1.1.0",
+                "@protobufjs/path": "^1.1.2",
+                "@protobufjs/pool": "^1.1.0",
+                "@protobufjs/utf8": "^1.1.0",
+                "@types/node": ">=13.7.0",
+                "long": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            }
+        },
+        "node_modules/protobufjs/node_modules/long": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz",
+            "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w=="
+        },
         "node_modules/proxy-addr": {
             "version": "2.0.7",
             "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -14665,7 +14809,6 @@
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
             "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-            "dev": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -17223,7 +17366,6 @@
             "version": "7.0.0",
             "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
             "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-            "dev": true,
             "dependencies": {
                 "ansi-styles": "^4.0.0",
                 "string-width": "^4.1.0",
@@ -17240,7 +17382,6 @@
             "version": "4.3.0",
             "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
             "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
             "dependencies": {
                 "color-convert": "^2.0.1"
             },
@@ -17255,7 +17396,6 @@
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
             "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
             "dependencies": {
                 "color-name": "~1.1.4"
             },
@@ -17266,8 +17406,7 @@
         "node_modules/wrap-ansi/node_modules/color-name": {
             "version": "1.1.4",
             "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "node_modules/wrappy": {
             "version": "1.0.2",
@@ -17338,7 +17477,6 @@
             "version": "5.0.8",
             "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
             "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-            "dev": true,
             "engines": {
                 "node": ">=10"
             }
@@ -17379,7 +17517,6 @@
             "version": "20.2.9",
             "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
             "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-            "dev": true,
             "engines": {
                 "node": ">=10"
             }
@@ -18994,6 +19131,43 @@
             "integrity": "sha512-CdXZJoCS+aEPec26ZP7hWWU3SaJlQPZSCGdgpQ2qGl2HUmtUUNrI3zC4XWdn1JUmh3t5OuDeRG1qB4eGRNSD4A==",
             "dev": true
         },
+        "@grpc/grpc-js": {
+            "version": "1.7.0",
+            "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.0.tgz",
+            "integrity": "sha512-wvKxal+40Xx11DXO2q5PfY3UiE25iwTb8SOz6A9IJII/V7d19x2ex0he+GJfVW0JZCaBjCPSjUB0yU9Ecm4WCw==",
+            "requires": {
+                "@grpc/proto-loader": "^0.7.0",
+                "@types/node": ">=12.12.47"
+            }
+        },
+        "@grpc/proto-loader": {
+            "version": "0.7.2",
+            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.2.tgz",
+            "integrity": "sha512-jCdyLIT/tdQ1zhrbTQnJNK5nbDf0GoBpy5jVNywBzzMDF+Vs6uEaHnfz46dMtDxkvwrF2hzk5Z67goliceH0sA==",
+            "requires": {
+                "@types/long": "^4.0.1",
+                "lodash.camelcase": "^4.3.0",
+                "long": "^4.0.0",
+                "protobufjs": "^7.0.0",
+                "yargs": "^16.2.0"
+            },
+            "dependencies": {
+                "yargs": {
+                    "version": "16.2.0",
+                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+                    "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+                    "requires": {
+                        "cliui": "^7.0.2",
+                        "escalade": "^3.1.1",
+                        "get-caller-file": "^2.0.5",
+                        "require-directory": "^2.1.1",
+                        "string-width": "^4.2.0",
+                        "y18n": "^5.0.5",
+                        "yargs-parser": "^20.2.2"
+                    }
+                }
+            }
+        },
         "@hapi/hoek": {
             "version": "9.3.0",
             "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -19820,6 +19994,60 @@
             "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==",
             "dev": true
         },
+        "@protobufjs/aspromise": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+            "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+        },
+        "@protobufjs/base64": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+            "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+        },
+        "@protobufjs/codegen": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+            "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+        },
+        "@protobufjs/eventemitter": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+            "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+        },
+        "@protobufjs/fetch": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+            "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+            "requires": {
+                "@protobufjs/aspromise": "^1.1.1",
+                "@protobufjs/inquire": "^1.1.0"
+            }
+        },
+        "@protobufjs/float": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+            "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+        },
+        "@protobufjs/inquire": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+            "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+        },
+        "@protobufjs/path": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+            "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+        },
+        "@protobufjs/pool": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+            "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+        },
+        "@protobufjs/utf8": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+            "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+        },
         "@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -20085,6 +20313,11 @@
             "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz",
             "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q=="
         },
+        "@types/long": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+            "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
+        },
         "@types/mime": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
@@ -21455,7 +21688,6 @@
             "version": "7.0.4",
             "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
             "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-            "dev": true,
             "requires": {
                 "string-width": "^4.2.0",
                 "strip-ansi": "^6.0.0",
@@ -23756,8 +23988,7 @@
         "get-caller-file": {
             "version": "2.0.5",
             "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-            "dev": true
+            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
         },
         "get-intrinsic": {
             "version": "1.1.2",
@@ -26460,6 +26691,11 @@
                 "lodash._basetostring": "~4.12.0"
             }
         },
+        "lodash.camelcase": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+            "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+        },
         "lodash.debounce": {
             "version": "4.0.8",
             "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -26637,6 +26873,11 @@
                 }
             }
         },
+        "long": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+            "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+        },
         "lru-cache": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -27863,6 +28104,32 @@
             "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
             "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
         },
+        "protobufjs": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.1.tgz",
+            "integrity": "sha512-d0nMQqS/aT3lfV8bKi9Gbg73vPd2LcDdTDOu6RE/M+h9DY8g1EmDzk3ADPccthEWfTBjkR2oxNdx9Gs8YubT+g==",
+            "requires": {
+                "@protobufjs/aspromise": "^1.1.2",
+                "@protobufjs/base64": "^1.1.2",
+                "@protobufjs/codegen": "^2.0.4",
+                "@protobufjs/eventemitter": "^1.1.0",
+                "@protobufjs/fetch": "^1.1.0",
+                "@protobufjs/float": "^1.0.2",
+                "@protobufjs/inquire": "^1.1.0",
+                "@protobufjs/path": "^1.1.2",
+                "@protobufjs/pool": "^1.1.0",
+                "@protobufjs/utf8": "^1.1.0",
+                "@types/node": ">=13.7.0",
+                "long": "^5.0.0"
+            },
+            "dependencies": {
+                "long": {
+                    "version": "5.2.0",
+                    "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz",
+                    "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w=="
+                }
+            }
+        },
         "proxy-addr": {
             "version": "2.0.7",
             "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -28399,8 +28666,7 @@
         "require-directory": {
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-            "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-            "dev": true
+            "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
         },
         "require-from-string": {
             "version": "2.0.2",
@@ -30357,7 +30623,6 @@
             "version": "7.0.0",
             "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
             "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-            "dev": true,
             "requires": {
                 "ansi-styles": "^4.0.0",
                 "string-width": "^4.1.0",
@@ -30368,7 +30633,6 @@
                     "version": "4.3.0",
                     "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
                     "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
                     "requires": {
                         "color-convert": "^2.0.1"
                     }
@@ -30377,7 +30641,6 @@
                     "version": "2.0.1",
                     "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
                     "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
                     "requires": {
                         "color-name": "~1.1.4"
                     }
@@ -30385,8 +30648,7 @@
                 "color-name": {
                     "version": "1.1.4",
                     "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
+                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
                 }
             }
         },
@@ -30437,8 +30699,7 @@
         "y18n": {
             "version": "5.0.8",
             "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-            "dev": true
+            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
         },
         "yallist": {
             "version": "4.0.0",
@@ -30477,8 +30738,7 @@
         "yargs-parser": {
             "version": "20.2.9",
             "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-            "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-            "dev": true
+            "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
         },
         "yauzl": {
             "version": "2.10.0",
diff --git a/package.json b/package.json
index 759ff10b..49cfc56e 100644
--- a/package.json
+++ b/package.json
@@ -65,11 +65,7 @@
         "cy:run": "npx cypress run --browser chrome --headless"
     },
     "dependencies": {
-        "@fortawesome/fontawesome-svg-core": "~1.2.36",
-        "@fortawesome/free-regular-svg-icons": "~5.15.4",
-        "@fortawesome/free-solid-svg-icons": "~5.15.4",
-        "@fortawesome/vue-fontawesome": "~3.0.0-5",
-        "@grpc/grpc-js": "^1.6.8",
+        "@grpc/grpc-js": "~1.7.0",
         "@louislam/sqlite3": "~15.0.6",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",
@@ -108,8 +104,7 @@
         "pg-connection-string": "^2.5.0",
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
-        "protobufjs": "^7.0.0",
-        "qrcode": "~1.5.0",
+        "protobufjs": "~7.1.1",
         "redbean-node": "0.1.4",
         "socket.io": "~4.4.1",
         "socket.io-client": "~4.4.1",

From 527e479f2d0a5e9b7dff6b9027bba71f5950cfcd Mon Sep 17 00:00:00 2001
From: Gilas Amalanda <chunkz.ring@gmail.com>
Date: Tue, 13 Sep 2022 21:30:15 +0700
Subject: [PATCH 131/803] chore: update existing and add new text for language
 id-ID

---
 src/languages/id-ID.js | 309 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 304 insertions(+), 5 deletions(-)

diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index 0a065308..6f069f65 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -2,6 +2,8 @@ export default {
     languageName: "Bahasa Indonesia (Indonesian)",
     checkEverySecond: "Cek Setiap {0} detik.",
     retryCheckEverySecond: "Coba lagi setiap {0} detik.",
+    resendEveryXTimes: "Kirim ulang setiap {0} kali",
+    resendDisabled: "Kirim ulang dinonaktifkan",
     retriesDescription: "Percobaan ulang maksimum sebelum layanan dinyatakan tidak aktif dan notifikasi dikirim",
     ignoreTLSError: "Abaikan kesalahan TLS/SSL untuk situs web HTTPS",
     upsideDownModeDescription: "Balikkan statusnya. Jika layanan dapat dijangkau, TIDAK AKTIF.",
@@ -13,6 +15,7 @@ export default {
     pauseDashboardHome: "Jeda",
     deleteMonitorMsg: "Apakah Anda mau menghapus monitor ini?",
     deleteNotificationMsg: "Apakah Anda mau menghapus notifikasi untuk semua monitor?",
+    dnsPortDescription: "Port server DNS. Bawaan menggunakan 53. Anda dapat mengubah port kapan saja.",
     resolverserverDescription: "Cloudflare adalah server bawaan, Anda dapat mengubah server resolver kapan saja.",
     rrtypeDescription: "Pilih RR-Type yang mau Anda monitor",
     pauseMonitorMsg: "Apakah Anda yakin mau menjeda?",
@@ -33,6 +36,7 @@ export default {
     Appearance: "Tampilan",
     Theme: "Tema",
     General: "Umum",
+    "Primary Base URL": "URL Dasar Utama",
     Version: "Versi",
     "Check Update On GitHub": "Cek Pembaruan di GitHub",
     List: "Daftar",
@@ -54,7 +58,7 @@ export default {
     Delete: "Hapus",
     Current: "Saat ini",
     Uptime: "Waktu aktif",
-    "Cert Exp.": "Cert Exp.",
+    "Cert Exp.": "Batas kedaluwarsa SSL",
     day: "hari | hari-hari",
     "-day": "-hari",
     hour: "Jam",
@@ -62,7 +66,7 @@ export default {
     Response: "Tanggapan",
     Ping: "Ping",
     "Monitor Type": "Tipe Monitor",
-    Keyword: "Keyword",
+    Keyword: "Kata Kunci",
     "Friendly Name": "Nama yang Ramah",
     URL: "URL",
     Hostname: "Hostname",
@@ -70,10 +74,14 @@ export default {
     "Heartbeat Interval": "Jarak Waktu Heartbeat ",
     Retries: "Coba lagi",
     "Heartbeat Retry Interval": "Jarak Waktu Heartbeat Mencoba kembali ",
+    "Resend Notification if Down X times consequently": "Kirim Ulang Notifikasi jika Tidak Aktif X kali",
     Advanced: "Tingkat Lanjut",
     "Upside Down Mode": "Mode Terbalik",
     "Max. Redirects": "Maksimal Pengalihan",
     "Accepted Status Codes": "Kode Status yang Diterima",
+    "Push URL": "Push URL",
+    needPushEvery: "Anda harus memanggil URL berikut setiap {0} detik..",
+    pushOptionalParams: "Parameter tambahan: {0}",
     Save: "Simpan",
     Notifications: "Notifikasi",
     "Not available, please setup.": "Tidak tersedia, silakan atur.",
@@ -155,7 +163,7 @@ export default {
     "Show URI": "Lihat URI",
     Tags: "Tanda",
     "Add New below or Select...": "Tambahkan Baru di bawah atau Pilih...",
-    "Tag with this name already exist.": "Tanda dengan nama ini sudah ada.",
+    "Tag with this name already exist.": "Tandadengan nama ini sudah ada.",
     "Tag with this value already exist.": "Tanda dengan nilai ini sudah ada.",
     color: "warna",
     "value (optional)": "nilai (harus diisi)",
@@ -187,7 +195,7 @@ export default {
     Required: "Dibutuhkan",
     telegram: "Telegram",
     "Bot Token": "Bot Token",
-    "You can get a token from": "Anda bisa mendapatkan token dari",
+    wayToGetTelegramToken: "Anda dapat mendapatkan token dari {0}.",
     "Chat ID": "Chat ID",
     supportTelegramChatID: "Mendukung Obrolan Langsung / Grup / Channel Chat ID",
     wayToGetTelegramChatID: "Anda bisa mendapatkan chat id Anda dengan mengirim pesan ke bot dan pergi ke url ini untuk melihat chat_id:",
@@ -203,6 +211,7 @@ export default {
     secureOptionTLS: "TLS (465)",
     "Ignore TLS Error": "Abaikan Kesalahan TLS",
     "From Email": "Dari Surel",
+    emailCustomSubject: "Subjek",
     "To Email": "Ke Surel",
     smtpCC: "CC",
     smtpBCC: "BCC",
@@ -236,10 +245,13 @@ export default {
     "rocket.chat": "Rocket.chat",
     pushover: "Pushover",
     pushy: "Pushy",
+    PushByTechulus: "Push by Techulus",
     octopush: "Octopush",
     promosms: "PromoSMS",
+    clicksendsms: "ClickSend SMS",
     lunasea: "LunaSea",
     apprise: "Apprise (Mendukung 50+ layanan notifikasi)",
+    GoogleChat: "Google Chat (hanya Google Workspace)",
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
@@ -253,6 +265,9 @@ export default {
     "SMS Type": "Tipe SMS",
     octopushTypePremium: "Premium (Cepat - direkomendasikan untuk mengingatkan)",
     octopushTypeLowCost: "Low Cost (Lambat, terkadang diblokir oleh operator)",
+    checkPrice: "Check {0} prices:",
+    apiCredentials: "Kredensial API",
+    octopushLegacyHint: "Apakah Anda menggunakan Octopush versi lama (2011-2020) atau versi baru?",
     "Check octopush prices": "Cek harga octopush {0}.",
     octopushPhoneNumber: "Nomer Telpon/HP (format internasional, contoh : +33612345678) ",
     octopushSMSSender: "Nama Pengirim SMS : 3-11 karakter alfanumerik dan spasi (a-zA-Z0-9)",
@@ -278,9 +293,293 @@ export default {
     matrix: "Matrix",
     promosmsTypeEco: "SMS ECO - murah tapi lambat dan sering kelebihan beban. Terbatas hanya untuk penerima Polandia.",
     promosmsTypeFlash: "SMS FLASH - Pesan akan otomatis muncul di perangkat penerima. Terbatas hanya untuk penerima Polandia.",
-    promosmsTypeFull: "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). Dapat diAndalkan untuk peringatan.",
+    promosmsTypeFull: "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). DapatdiAndalkan untuk peringatan.",
     promosmsTypeSpeed: "SMS SPEED - Prioritas tertinggi dalam sistem. Sangat cepat dan dapat diandalkan tetapi mahal (sekitar dua kali lipat dari harga SMS FULL).",
     promosmsPhoneNumber: "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
     promosmsSMSSender: "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
     "Feishu WebHookUrl": "Feishu WebHookUrl",
+    matrixHomeserverURL: "Homeserver URL (dengan http(s):// dan port tambahan)",
+    "Internal Room Id": "Internal Room ID",
+    matrixDesc1: "Kamu dapat menemukan Internal Room ID dengan melihat di bagian konfigurasi ruang di Matrix. Seharusnya berbentuk seperti !QMdRCpUIfLwsfjxye6:home.server.",
+    matrixDesc2: "Sangat direkomendasikan kepada Anda untuk membuat akun baru dan jangan menggunakan token atas akun terkini yang memiliki token akses secara penuh terhadap akun dan seluruh ruang yang terdaftar. Alih - alih, buat akun baru dan undang akun tsb ke ruang tempat anda ingin menerima notifikasi. Untuk mendapatkan token akses anda dapat menjalankan {0}",
+    Method: "Method",
+    Body: "Body",
+    Headers: "Headers",
+    PushUrl: "Push URL",
+    HeadersInvalidFormat: "Request Headers memiliki format JSON yang tidak sesuai: ",
+    BodyInvalidFormat: "Request Body memiliki format JSON yang tidak sesuai: ",
+    "Monitor History": "Riyawat Monitor",
+    clearDataOlderThan: "Simpan data riwayat monitoring selama {0} hari.",
+    PasswordsDoNotMatch: "Passwords tidak sama.",
+    records: "catatan",
+    "One record": "Satu catatan",
+    steamApiKeyDescription: "Untuk monitoring Steam Game Server Anda membutuhkan kunci Steam Web-API. Anda dapat mendaftarkan Kunci API Anda melalui: ",
+    "Current User": "Pengguna Saat Ini",
+    topic: "Topic",
+    topicExplanation: "MQTT topic untuk dimonitor",
+    successMessage: "Pesan Berhasil",
+    successMessageExplanation: "Pesan MQTT yang akan dianggap berhasil",
+    recent: "Baru saja",
+    Done: "Selesai",
+    Info: "Info",
+    Security: "Keamaan",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Shrink Database",
+    "Pick a RR-Type...": "Pilih RR-Type...",
+    "Pick Accepted Status Codes...": "Pilih Kode Status yang Diterima...",
+    Default: "Default",
+    "HTTP Options": "HTTP Options",
+    "Create Incident": "Buat Incident",
+    Title: "Judul",
+    Content: "Konten",
+    Style: "Gaya",
+    info: "info",
+    warning: "peringatan",
+    danger: "bahaya",
+    error: "kesalahan",
+    critical: "kritis",
+    primary: "utama",
+    light: "terang",
+    dark: "gelap",
+    Post: "Post",
+    "Please input title and content": "Masukkan judul dan konten",
+    Created: "Dibuat",
+    "Last Updated": "Terakhir Diperbarui",
+    Unpin: "Lepaskan Semat",
+    "Switch to Light Theme": "Ubah ke Tema Terang",
+    "Switch to Dark Theme": "Ubah ke Tema Gelap",
+    "Show Tags": "Tampilkan Tags",
+    "Hide Tags": "Sembunyikan Tags",
+    Description: "Deskripsi",
+    "No monitors available.": "Tidak ada monitor yang tersedia.",
+    "Add one": "Tambahkan",
+    "No Monitors": "Tidak ada monitor",
+    "Untitled Group": "Group Tanpa Judul",
+    Services: "Layanan",
+    Discard: "Buang",
+    Cancel: "Batal",
+    "Powered by": "Dipersembahkan oleh",
+    shrinkDatabaseDescription: "Trigger database VACUUM untuk SQLite. Jika database Anda dibuat setelah 1.10.0, AUTO_VACUUM sudah otomatis diaktifkan dan aksi berikut tidak dibutuhkan.",
+    serwersms: "SerwerSMS.pl",
+    serwersmsAPIUser: "Nama Pengguna API ( termamsuk awalan webapi_ )",
+    serwersmsAPIPassword: "Kata Sandi API",
+    serwersmsPhoneNumber: "Nomor Telepon",
+    serwersmsSenderName: "Nama Pengirim SMS (didaftarkan melalui portal pelanggan)",
+    stackfield: "Stackfield",
+    Customize: "Kustomisasi",
+    "Custom Footer": "Tambahan Footer",
+    "Custom CSS": "Tambahan CSS",
+    smtpDkimSettings: "Pengaturan DKIM",
+    smtpDkimDesc: "Silakan merujuk ke Nodemailer DKIM {0} untuk penggunaan.",
+    documentation: "dokumentasi",
+    smtpDkimDomain: "Nama Domain",
+    smtpDkimKeySelector: "Key Selector",
+    smtpDkimPrivateKey: "Private Key",
+    smtpDkimHashAlgo: "Algoritma Hash (Opsional)",
+    smtpDkimheaderFieldNames: "Header Keys untuk ditambahkan (Optional)",
+    smtpDkimskipFields: "Header Keys not untuk ditambahkan (Optional)",
+    wayToGetPagerDutyKey: "Anda dapat menambahkan melalui Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Lalu Anda dapat menjadi dengan kata kunci \"Events API V2\". Informasi tambahan {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Penyelesaian otomatis atau diakui",
+    "do nothing": "tidak melakukan apapun",
+    "auto acknowledged": "otomatis diakui",
+    "auto resolve": "otomatis terselesaikan",
+    gorush: "Gorush",
+    alerta: "Alerta",
+    alertaApiEndpoint: "API Endpoint",
+    alertaEnvironment: "Lingkungan",
+    alertaApiKey: "Kunci API",
+    alertaAlertState: "Status Siaga",
+    alertaRecoverState: "Status Pemulihan",
+    deleteStatusPageMsg: "Apakah Anda yakin untuk menghapus halaman status berikut?",
+    Proxies: "Proxies",
+    default: "Bawaan",
+    enabled: "Diaktifkan",
+    setAsDefault: "Tetapkan sebagai bawaan",
+    deleteProxyMsg: "Apakah Anda yakin ingin menghapus proxy berikut untuk seluruh monitor?",
+    proxyDescription: "Proxy harus ditambahkan ke monitor agar berfungsi.",
+    enableProxyDescription: "Proxy berikut tidak akan berdampak ke monitor hingga diaktifkan. Anda dapat mengontrol menonaktifkan sementara proxy dari semua monitor dengan status aktivasi.",
+    setAsDefaultProxyDescription: "Proxy berikut akan diaktifkan sebagai bawaan untuk monitor baru. Anda masih dapat menonaktifkan proxy secara terpisah untuk setiap monitor.",
+    "Certificate Chain": "Certificate Chain",
+    Valid: "Sahih",
+    Invalid: "Tidak Sahih",
+    AccessKeyId: "AccessKey ID",
+    SecretAccessKey: "AccessKey Secret",
+    PhoneNumbers: "Nomor Telepon",
+    TemplateCode: "Kode Template",
+    SignName: "Nama Tanda",
+    "Sms template must contain parameters: ": "Template SMS harus memuat parameter: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    WebHookUrl: "WebHookUrl",
+    SecretKey: "SecretKey",
+    "For safety, must use secret key": "Untuk keamaan Anda harus menggunakan kunci rahasia",
+    "Device Token": "Token Perangkat",
+    Platform: "Platform",
+    iOS: "iOS",
+    Android: "Android",
+    Huawei: "Huawei",
+    High: "Tinggi",
+    Retry: "Ulang",
+    Topic: "Topik",
+    "WeCom Bot Key": "Kunci WeCom Bot",
+    "Setup Proxy": "Siapkan Proxy",
+    "Proxy Protocol": "Protokol Proxy",
+    "Proxy Server": "Server Proxy",
+    "Proxy server has authentication": "Server Proxy memiliki autentikasi",
+    User: "Pengguna",
+    Installed: "Terpasang",
+    "Not installed": "Tidak terpasang",
+    Running: "Berlari",
+    "Not running": "Tidak berlari",
+    "Remove Token": "Hapus Token",
+    Start: "Mulai",
+    Stop: "Berhenti",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Tambahkan Halaman Status Baru",
+    Slug: "Slug",
+    "Accept characters:": "Terima karakter:",
+    startOrEndWithOnly: "Mulai atau akhiri hanya dengan {0}",
+    "No consecutive dashes": "Tanda hubung tidak berurutan",
+    Next: "Selanjutnya",
+    "The slug is already taken. Please choose another slug.": "Slug is telah digunakan. Silakan pilih slug lain.",
+    "No Proxy": "TIdak ada Proxy",
+    Authentication: "Autentikasi",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Halaman Status Baru",
+    "Page Not Found": "Halaman Tidak Ditemukan",
+    "Reverse Proxy": "Proxy Terbalik",
+    Backup: "Cadangan",
+    About: "Tentang",
+    wayToGetCloudflaredURL: "(Unduh cloudflared dari {0})",
+    cloudflareWebsite: "Situs Cloudflare",
+    "Message:": "Pesan:",
+    "Don't know how to get the token? Please read the guide:": "Tidak tahu cara mendapatkan token? Silakan baca panduannya:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Koneksi saat ini mungkin hilang jika Anda saat ini terhubung melalui CloudflareTunnel. Apakah Anda yakin ingin menghentikannya? Ketik kata sandi Anda saat ini untuk mengonfirmasinya.",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Proxy Terpercaya",
+    "Other Software": "Perangkat Lunak lainnya",
+    "For example: nginx, Apache and Traefik.": "Sebagai contoh: nginx, Apache and Traefik.",
+    "Please read": "Harap dibaca",
+    "Subject:": "Subjek:",
+    "Valid To:": "Berlaku Untuk:",
+    "Days Remaining:": "Hari Tersisa:",
+    "Issuer:": "Penerbit:",
+    "Fingerprint:": "Sidik jari:",
+    "No status pages": "Tidak ada halaman status",
+    "Domain Name Expiry Notification": "Pemberitahuan Kedaluwarsa Nama Domain",
+    Proxy: "Proxy",
+    "Date Created": "Tanggal Dibuat",
+    HomeAssistant: "Home Assistant",
+    onebotHttpAddress: "Alamat HTTP OneBot",
+    onebotMessageType: "Jenis Pesan OneBot",
+    onebotGroupMessage: "Grup",
+    onebotPrivateMessage: "Pribadi",
+    onebotUserOrGroupId: "Grup/Pengguna ID",
+    onebotSafetyTips: "Untuk keamanan, harus mengatur token akses",
+    "PushDeer Key": "Kunci PushDeer",
+    "Footer Text": "Tulisan Footer",
+    "Show Powered By": "Tampilkan Dipersembahkan oleh",
+    "Domain Names": "Nama Domain",
+    signedInDisp: "Masuk sebagai {0}",
+    signedInDispDisabled: "Autentikasi dinonaktifkan.",
+    RadiusSecret: "Radius Secret",
+    RadiusSecretDescription: "Shared Secret antara klien dan server",
+    RadiusCalledStationId: "Called Station Id",
+    RadiusCalledStationIdDescription: "Pengenal perangkat yang dipanggil",
+    RadiusCallingStationId: "Calling Station Id",
+    RadiusCallingStationIdDescription: "Pengenal perangkat panggilan",
+    "Certificate Expiry Notification": "Pemberitahuan Kedaluwarsa Sertifikat",
+    "API Username": "Nama Pengguna API",
+    "API Key": "Kunci API",
+    "Recipient Number": "Nomor Penerima Recipient Number",
+    "From Name/Number": "Dari Nama/Nomor",
+    "Leave blank to use a shared sender number.": "Biarkan kosong untuk menggunakan nomor pengirim bersama.",
+    "Octopush API Version": "Versi API Octopush",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "endpoint",
+    octopushAPIKey: "\"API key\" dari kredensial HTTP API di panel kontrol",
+    octopushLogin: "\"Login\" dari kredensial HTTP API di panel kontrol",
+    promosmsLogin: "Nama Masuk API",
+    promosmsPassword: "Kata Sandi API",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    pushyAPIKey: "Secret API Key",
+    pushyToken: "Device token",
+    "Show update if available": "Tampilkan pembaruan jika tersedia",
+    "Also check beta release": "Periksa juga rilis beta",
+    "Using a Reverse Proxy?": "Menggunakan Proxy Terbalik?",
+    "Check how to config it for WebSocket": "Periksa cara mengonfigurasinya untuk A WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Kemungkinan besar penyebabnya:",
+    "The resource is no longer available.": "Sumber daya tidak lagi tersedia.",
+    "There might be a typing error in the address.": "Mungkin ada kesalahan pengetikan di alamat.",
+    "What you can try:": "Apa yang dapat kamu coba:",
+    "Retype the address.": "Ketik ulang alamat.",
+    "Go back to the previous page.": "Kembali ke halaman sebelumnya.",
+    "Coming Soon": "Segera",
+    wayToGetClickSendSMSToken: "Anda bisa mendapatkan Nama Pengguna API dan Kunci API dari {0} .",
+    "Connection String": "Connection String",
+    Query: "Query",
+    settingsCertificateExpiry: "Kedaluwarsa Sertifikat TLS",
+    certificationExpiryDescription: "Monitor HTTPS memicu pemberitahuan saat sertifikat TLS kedaluwarsa dalam:",
+    "Setup Docker Host": "Siapkan Host Docker",
+    "Connection Type": "Jenis Koneksi",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "Apakah Anda yakin ingin menghapus host docker berikut untuk semua monitor?",
+    socket: "Socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    Domain: "Domain",
+    Workstation: "Workstation",
+    disableCloudflaredNoAuthMsg: "Anda berada dalam mode Tanpa Otentikasi, kata sandi tidak diperlukan.",
+    trustProxyDescription: "Trust 'X-Forwarded-*' headers. Jika Anda ingin mendapatkan IP klien yang benar dan Uptime Kuma Anda dibalik layanan seperti Nginxor Apache, Anda harus mengaktifkan ini.",
+    wayToGetLineNotifyToken: "Anda bisa mendapatkan token akses dari {0}",
+    Examples: "Contoh",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Token Akses Berumur Panjang",
+    "Long-Lived Access Token canbe created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token Akses Berumur Panjang dapat dibuat dengan mengklik nama profil Anda (kiri bawah) dan menggulir ke bawah lalu klik Buat Token. ",
+    "Notification Service": "Layanan Pemberitahuan",
+    "default: notify all devices": "bawaan: notifikasi seluruh perangkat",
+    "A listof Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Daftar Layanan Pemberitahuan dapat ditemukan di Home Assistant pada \"Developer Tools > Services\" cari \"notification\" lalu cari nama perangkat Anda.",
+    "Automations can optionally be triggered in Home Assistant:": "Otomatisasi dapat dipicu secara opsional di Home Assistant:",
+    "Trigger type:": "Trigger type:",
+    "Event type:": "Event type:",
+    "Event data:": "Event data:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Kemudian pilih tindakan, misalnya alihkan ke tempat dimana lampu RGB berwarna merah.",
+    "Frontend Version": "Versi Frontend",
+    "Frontend Version do not match backend version!": "Versi Frontend tidak sama dengan versi backend!",
+    "Base URL": "URL Dasar",
+    goAlertInfo: "GoAlert adalah aplikasi open source untuk penjadwalan panggilan, eskalasi otomatis dan pemberitahuan (seperti SMS atau panggilan suara). Secara otomatis melibatkan orang yang tepat, dengan cara yang benar, dan pada waktu yang tepat! {0}",
+    goAlertIntegrationKeyInfo: "Dapatkan kunci integrasi API generik untuk layanan dalam format ini \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biasanya nilai parameter token dari URL yang disalin.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Usang: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
+    backupRecommend: "Harap cadangkan volume atau folder data (./data/) secara langsung.",
 };

From 0ae801015696ac19b3c8c9c5cb7b0a12dcae754d Mon Sep 17 00:00:00 2001
From: Gilas Amalanda <chunkz.ring@gmail.com>
Date: Tue, 13 Sep 2022 21:37:58 +0700
Subject: [PATCH 132/803] chore: update typo for promosmsTypeFull at language
 id-ID

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

diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index 6f069f65..d05d59f5 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -293,7 +293,7 @@ export default {
     matrix: "Matrix",
     promosmsTypeEco: "SMS ECO - murah tapi lambat dan sering kelebihan beban. Terbatas hanya untuk penerima Polandia.",
     promosmsTypeFlash: "SMS FLASH - Pesan akan otomatis muncul di perangkat penerima. Terbatas hanya untuk penerima Polandia.",
-    promosmsTypeFull: "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). DapatdiAndalkan untuk peringatan.",
+    promosmsTypeFull: "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). Dapat diandalkan untuk peringatan.",
     promosmsTypeSpeed: "SMS SPEED - Prioritas tertinggi dalam sistem. Sangat cepat dan dapat diandalkan tetapi mahal (sekitar dua kali lipat dari harga SMS FULL).",
     promosmsPhoneNumber: "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
     promosmsSMSSender: "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",

From b673cfbe9436ef379f6d9bc5479828ccb78a8d21 Mon Sep 17 00:00:00 2001
From: Gilas Amalanda <chunkz.ring@gmail.com>
Date: Tue, 13 Sep 2022 21:38:58 +0700
Subject: [PATCH 133/803] chore: update typo for Tag with this name already
 exist at language id-ID

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

diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index d05d59f5..36ee0341 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -163,7 +163,7 @@ export default {
     "Show URI": "Lihat URI",
     Tags: "Tanda",
     "Add New below or Select...": "Tambahkan Baru di bawah atau Pilih...",
-    "Tag with this name already exist.": "Tandadengan nama ini sudah ada.",
+    "Tag with this name already exist.": "Tanda dengan nama ini sudah ada.",
     "Tag with this value already exist.": "Tanda dengan nilai ini sudah ada.",
     color: "warna",
     "value (optional)": "nilai (harus diisi)",

From db6fdf5e267138f5718cb28ec0606c7472e569be Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 14 Sep 2022 02:36:18 +0800
Subject: [PATCH 134/803] Update Project Plan URL

Migrated to the new GitHub Project
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index b104b2c1..496aed04 100644
--- a/README.md
+++ b/README.md
@@ -106,7 +106,7 @@ https://github.com/louislam/uptime-kuma/milestones
 
 Project Plan:
 
-https://github.com/louislam/uptime-kuma/projects/1
+https://github.com/users/louislam/projects/4/views/1
 
 ## ❤️ Sponsors
 

From b38206438489c6fa3d8d6a382e8326aba39fad29 Mon Sep 17 00:00:00 2001
From: Kyle <3204236+DevKyleS@users.noreply.github.com>
Date: Tue, 13 Sep 2022 21:52:32 -0600
Subject: [PATCH 135/803] Replace port env var in healthcheck.js

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

diff --git a/extra/healthcheck.js b/extra/healthcheck.js
index 7c3a7eb4..3a766108 100644
--- a/extra/healthcheck.js
+++ b/extra/healthcheck.js
@@ -25,7 +25,7 @@ if (!hostname && !FBSD) {
     hostname = process.env.HOST;
 }
 
-const port = parseInt(process.env.UPTIME_KUMA_PORT || process.env.PORT || 3001);
+const port = parseInt(process.env.UPTIME_KUMA_SERVICE_PORT || process.env.PORT || 3001);
 
 let options = {
     host: hostname || "127.0.0.1",

From b4f0f8bca5b62a9fe12d913504b842c3da81cf73 Mon Sep 17 00:00:00 2001
From: Kyle <3204236+DevKyleS@users.noreply.github.com>
Date: Tue, 13 Sep 2022 22:18:00 -0600
Subject: [PATCH 136/803] Replace healthcheck hostname env variable name

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

diff --git a/extra/healthcheck.js b/extra/healthcheck.js
index 3a766108..9e5e4e3d 100644
--- a/extra/healthcheck.js
+++ b/extra/healthcheck.js
@@ -18,7 +18,7 @@ if (sslKey && sslCert) {
 
 // If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise.
 // Dual-stack support for (::)
-let hostname = process.env.UPTIME_KUMA_HOST;
+let hostname = process.env.UPTIME_KUMA_SERVICE_HOST;
 
 // Also read HOST if not *BSD, as HOST is a system environment variable in FreeBSD
 if (!hostname && !FBSD) {

From db4b2cd984e9b7dd82e0af5995e7235eb2f67517 Mon Sep 17 00:00:00 2001
From: Kyle <3204236+DevKyleS@users.noreply.github.com>
Date: Wed, 14 Sep 2022 14:25:56 -0600
Subject: [PATCH 137/803] Re-add support for UPTIME_KUMA_HOST and _PORT in
 healthcheck.js

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

diff --git a/extra/healthcheck.js b/extra/healthcheck.js
index 9e5e4e3d..0c35fe2f 100644
--- a/extra/healthcheck.js
+++ b/extra/healthcheck.js
@@ -18,17 +18,17 @@ if (sslKey && sslCert) {
 
 // If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise.
 // Dual-stack support for (::)
-let hostname = process.env.UPTIME_KUMA_SERVICE_HOST;
+let hostname = process.env.UPTIME_KUMA_SERVICE_HOST || process.env.UPTIME_KUMA_HOST || "127.0.0.1";
 
 // Also read HOST if not *BSD, as HOST is a system environment variable in FreeBSD
 if (!hostname && !FBSD) {
     hostname = process.env.HOST;
 }
 
-const port = parseInt(process.env.UPTIME_KUMA_SERVICE_PORT || process.env.PORT || 3001);
+const port = parseInt(process.env.UPTIME_KUMA_SERVICE_PORT || process.env.UPTIME_KUMA_PORT || process.env.PORT || 3001);
 
 let options = {
-    host: hostname || "127.0.0.1",
+    host: hostname,
     port: port,
     timeout: 28 * 1000,
 };

From 7aa3f6c559f1624442e0f0239eca5c31bdf61ab0 Mon Sep 17 00:00:00 2001
From: Kyle <3204236+DevKyleS@users.noreply.github.com>
Date: Wed, 14 Sep 2022 15:04:21 -0600
Subject: [PATCH 138/803] Corrected default hostname port for healthcheck

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

diff --git a/extra/healthcheck.js b/extra/healthcheck.js
index 0c35fe2f..a169f1f4 100644
--- a/extra/healthcheck.js
+++ b/extra/healthcheck.js
@@ -18,7 +18,7 @@ if (sslKey && sslCert) {
 
 // If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise.
 // Dual-stack support for (::)
-let hostname = process.env.UPTIME_KUMA_SERVICE_HOST || process.env.UPTIME_KUMA_HOST || "127.0.0.1";
+let hostname = process.env.UPTIME_KUMA_SERVICE_HOST || process.env.UPTIME_KUMA_HOST || "::";
 
 // Also read HOST if not *BSD, as HOST is a system environment variable in FreeBSD
 if (!hostname && !FBSD) {

From 1c3da995e31038d48bc3d9a18b201be9b62457fa Mon Sep 17 00:00:00 2001
From: jakubenglicky <jakubenglicky@gmail.com>
Date: Thu, 15 Sep 2022 09:11:05 +0200
Subject: [PATCH 139/803] Add support notification via SMSManager

---
 server/notification-providers/smsmanager.js | 25 +++++++++++++++++
 server/notification.js                      |  2 ++
 src/components/notifications/SMSManager.vue | 31 +++++++++++++++++++++
 src/components/notifications/index.js       |  2 ++
 src/languages/cs-CZ.js                      |  3 ++
 5 files changed, 63 insertions(+)
 create mode 100644 server/notification-providers/smsmanager.js
 create mode 100644 src/components/notifications/SMSManager.vue

diff --git a/server/notification-providers/smsmanager.js b/server/notification-providers/smsmanager.js
new file mode 100644
index 00000000..833bff60
--- /dev/null
+++ b/server/notification-providers/smsmanager.js
@@ -0,0 +1,25 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+
+class SMSManager extends NotificationProvider {
+
+    name = "SMSManager";
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        try {
+            let data = {
+                apikey: notification.smsmanagerApiKey,
+                endpoint: "https://http-api.smsmanager.cz/Send",
+                message: msg.replace(/[^\x00-\x7F]/g, ""),
+                to: notification.numbers,
+                messageType: notification.messageType,
+            };
+            await axios.get(`${data.endpoint}?apikey=${data.apikey}&message=${data.message}&number=${data.to}&gateway=${data.messageType}`);
+            return "SMS sent sucessfully.";
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+}
+
+module.exports = SMSManager;
diff --git a/server/notification.js b/server/notification.js
index 3306a53a..6f71783b 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -39,6 +39,7 @@ const Telegram = require("./notification-providers/telegram");
 const Webhook = require("./notification-providers/webhook");
 const WeCom = require("./notification-providers/wecom");
 const GoAlert = require("./notification-providers/goalert");
+const SMSManager = require("./notification-providers/smsmanager");
 
 class Notification {
 
@@ -81,6 +82,7 @@ class Notification {
             new RocketChat(),
             new SerwerSMS(),
             new Signal(),
+            new SMSManager(),
             new Slack(),
             new SMTP(),
             new Stackfield(),
diff --git a/src/components/notifications/SMSManager.vue b/src/components/notifications/SMSManager.vue
new file mode 100644
index 00000000..25db624f
--- /dev/null
+++ b/src/components/notifications/SMSManager.vue
@@ -0,0 +1,31 @@
+<template>
+    <div class="mb-3">
+        <label for="smsmanager-key" class="form-label">API Key</label>
+        <div class="form-text">
+            {{ $t("SMSManager API Docs ") }}
+            <a href="https://smsmanager.cz/api/http#send" target="_blank">{{ $t("here") }}</a>
+        </div>
+        <input id="smsmanager-key" v-model="$parent.notification.smsmanagerApiKey" type="text" class="form-control">
+    </div>
+    <div class="mb-3">
+        <label for="smsmanager-numbers" class="form-label"> {{ $t("Recipients") }}</label>
+        <div class="form-text">
+            {{ $t("You can divide numbers with") }} <b>,</b> {{ $t("or") }} <b>;</b>
+        </div>
+        <input id="smsmanager-numbers" v-model="$parent.notification.numbers" type="text" class="form-control">
+    </div>
+    <div class="mb-3">
+        <label for="smsmanager-messageType" class="form-label">{{ $t("Gateway Type") }}</label>
+        <select id="smsmanager-messageType" v-model="$parent.notification.messageType" class="form-select">
+            <option value="economy">Economy</option>
+            <option value="lowcost">Lowcost</option>
+            <option value="high" selected>High</option>
+        </select>
+    </div>
+    <div class="mb-3">
+        <div class="form-text">
+            {{ $t("checkPrice", [$t("SMSManager")]) }}
+            <a href="https://smsmanager.cz/rozesilani-sms/ceny/ceska-republika/" target="_blank">{{ $t("here") }}</a>
+        </div>
+    </div>
+</template>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index e5570c80..07ed2cd1 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -28,6 +28,7 @@ import Pushy from "./Pushy.vue";
 import RocketChat from "./RocketChat.vue";
 import SerwerSMS from "./SerwerSMS.vue";
 import Signal from "./Signal.vue";
+import SMSManager from "./SMSManager.vue";
 import Slack from "./Slack.vue";
 import Stackfield from "./Stackfield.vue";
 import STMP from "./SMTP.vue";
@@ -75,6 +76,7 @@ const NotificationFormList = {
     "rocket.chat": RocketChat,
     "serwersms": SerwerSMS,
     "signal": Signal,
+    "SMSManager": SMSManager,
     "slack": Slack,
     "smtp": STMP,
     "stackfield": Stackfield,
diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
index b2b9331a..c71075be 100644
--- a/src/languages/cs-CZ.js
+++ b/src/languages/cs-CZ.js
@@ -576,4 +576,7 @@ export default {
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Následně vyberte akci, například přepnutí scény z RGB světla na červenou.",
     "Frontend Version": "Verze frontendu",
     "Frontend Version do not match backend version!": "Verze frontendu neodpovídá verzi backendu!",
+    "You can divide numbers with": "Čísla můžete rozdělit pomocí ",
+    "or": "nebo",
+    "Gateway Type": "Typ brány",
 };

From 2d5096317fa3a90cfcb6618b6cc19bf305188d41 Mon Sep 17 00:00:00 2001
From: jakubenglicky <jakubenglicky@gmail.com>
Date: Thu, 15 Sep 2022 09:11:27 +0200
Subject: [PATCH 140/803] Fix warning at goalert.js

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

diff --git a/server/notification-providers/goalert.js b/server/notification-providers/goalert.js
index c757e599..73e0375a 100644
--- a/server/notification-providers/goalert.js
+++ b/server/notification-providers/goalert.js
@@ -22,7 +22,7 @@ class GoAlert extends NotificationProvider {
             let config = {
                 headers: headers
             };
-            let resp = await axios.post(`${notification.goAlertBaseURL}/api/v2/generic/incoming?token=${notification.goAlertToken}`, data, config);
+            await axios.post(`${notification.goAlertBaseURL}/api/v2/generic/incoming?token=${notification.goAlertToken}`, data, config);
             return okMsg;
 
         } catch (error) {

From bec3b0d2dcdc410be32b3ce8c2fb1636aebf12a3 Mon Sep 17 00:00:00 2001
From: burakurer <58211081+burakurer@users.noreply.github.com>
Date: Fri, 16 Sep 2022 00:16:08 +0300
Subject: [PATCH 141/803] Update tr-TR.js

---
 src/languages/tr-TR.js | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index 606fa7e1..75bc103c 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -557,8 +557,8 @@ export default {
     "Docker Host": "Docker Ana Bilgisayarı",
     "Docker Hosts": "Docker Ana Bilgisayarları",
     "ntfy Topic": "ntfy Konu",
-    "Domain": "Domain",
-    "Workstation": "İş İstasyonu",
+    Domain: "Domain",
+    Workstation: "İş İstasyonu",
     disableCloudflaredNoAuthMsg: "Yetki Yok modundasınız, şifre gerekli değil.",
     trustProxyDescription: "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.",
     wayToGetLineNotifyToken: "{0} adresinden bir erişim jetonu alabilirsiniz.",
@@ -576,4 +576,10 @@ export default {
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Ardından bir eylem seçin, örneğin RGB ışığının kırmızı olduğu sahneyi değiştirin.",
     "Frontend Version": "Frontend Sürümü",
     "Frontend Version do not match backend version!": "Frontend Sürümü, backend sürümüyle eşleşmiyor!",
+    "Base URL": "Temel URL",
+    goAlertInfo: "GoAlert, çağrı üzerine zamanlama, otomatik eskalasyonlar ve bildirimler (SMS veya sesli çağrılar gibi) için açık kaynaklı bir uygulamadır. Doğru kişiyi, doğru şekilde ve doğru zamanda otomatik olarak devreye sokun! {0}",
+    goAlertIntegrationKeyInfo: "Servis için genel API entegrasyon anahtarını, genellikle kopyalanan URL'nin belirteç parametresinin değeri olan \"aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biçiminde alın.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Kullanımdan Kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan, tam bir yedekleme oluşturamaz veya geri yükleyemez.",
+    backupRecommend: "Lütfen bunun yerine birimi veya veri klasörünü (./data/) doğrudan yedekleyin.",
 };

From 38c45a3fe3fe35557f8046d268426686595032af Mon Sep 17 00:00:00 2001
From: Super Manito <68613938+SuperManito@users.noreply.github.com>
Date: Fri, 16 Sep 2022 14:21:22 +0800
Subject: [PATCH 142/803] Fix previously PR bug about Bark Notification (#2084)

Co-authored-by: zuosc <zorro.zsc@hotmail.com>
---
 server/notification-providers/bark.js | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/server/notification-providers/bark.js b/server/notification-providers/bark.js
index 3258e7c5..bcd3c682 100644
--- a/server/notification-providers/bark.js
+++ b/server/notification-providers/bark.js
@@ -28,17 +28,17 @@ class Bark extends NotificationProvider {
 
         if (msg != null && heartbeatJSON != null && heartbeatJSON["status"] === UP) {
             let title = "UptimeKuma Monitor Up";
-            return await this.postNotification(title, msg, barkEndpoint);
+            return await this.postNotification(notification, title, msg, barkEndpoint);
         }
 
         if (msg != null && heartbeatJSON != null && heartbeatJSON["status"] === DOWN) {
             let title = "UptimeKuma Monitor Down";
-            return await this.postNotification(title, msg, barkEndpoint);
+            return await this.postNotification(notification, title, msg, barkEndpoint);
         }
 
         if (msg != null) {
             let title = "UptimeKuma Message";
-            return await this.postNotification(title, msg, barkEndpoint);
+            return await this.postNotification(notification, title, msg, barkEndpoint);
         }
     }
 
@@ -50,7 +50,7 @@ class Bark extends NotificationProvider {
      */
     appendAdditionalParameters(notification, postUrl) {
         // set icon to uptime kuma icon, 11kb should be fine
-        postUrl += "&icon=" + barkNotificationAvatar;
+        postUrl += "?icon=" + barkNotificationAvatar;
         // grouping all our notifications
         if (notification.barkGroup != null) {
             postUrl += "&group=" + notification.barkGroup;
@@ -89,12 +89,12 @@ class Bark extends NotificationProvider {
      * @param {string} endpoint Endpoint to send request to
      * @returns {string}
      */
-    async postNotification(title, subtitle, endpoint) {
+    async postNotification(notification, title, subtitle, endpoint) {
         // url encode title and subtitle
         title = encodeURIComponent(title);
         subtitle = encodeURIComponent(subtitle);
         let postUrl = endpoint + "/" + title + "/" + subtitle;
-        postUrl = this.appendAdditionalParameters(postUrl);
+        postUrl = this.appendAdditionalParameters(notification, postUrl);
         let result = await axios.get(postUrl);
         this.checkResult(result);
         if (result.statusText != null) {

From d23085cddce1c404c3f4c80c5bf0b5c61b0227b8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 17 Sep 2022 01:18:31 +0800
Subject: [PATCH 143/803] Fix #2100, the monitor name cannot display if too
 long

---
 src/assets/app.scss | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/assets/app.scss b/src/assets/app.scss
index f5e07887..bf8e7004 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -382,7 +382,7 @@ optgroup {
         overflow-y: auto;
         height: calc(100% - 65px);
     }
-    
+
     @media (max-width: 770px) {
         &.scrollbar {
             height: calc(100% - 40px);
@@ -403,7 +403,6 @@ optgroup {
         .info {
             white-space: nowrap;
             overflow: hidden;
-            text-overflow: ellipsis;
         }
 
         &:hover {

From 1c4e97439ce74efb92f9dfbc097c8b8511ea403f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 17 Sep 2022 01:59:25 +0800
Subject: [PATCH 144/803] Fix pr-test

---
 extra/checkout-pr.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/extra/checkout-pr.js b/extra/checkout-pr.js
index d327e203..0328770b 100644
--- a/extra/checkout-pr.js
+++ b/extra/checkout-pr.js
@@ -27,7 +27,7 @@ result = childProcess.spawnSync("git", [ "fetch", name, branch ]);
 console.log(result.stdout.toString());
 console.error(result.stderr.toString());
 
-result = childProcess.spawnSync("git", [ "checkout", branch, "--force" ]);
+result = childProcess.spawnSync("git", [ "checkout", `${name}/${branch}`, "--force" ]);
 
 console.log(result.stdout.toString());
 console.error(result.stderr.toString());

From 2f67d267025ad6cb583291d394fe5190b5596313 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 17 Sep 2022 16:20:10 +0800
Subject: [PATCH 145/803] Merge manually, as this part had been moved

---
 server/model/status_page.js | 35 ++++++++++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/server/model/status_page.js b/server/model/status_page.js
index 82d184bf..d296470d 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -83,6 +83,8 @@ class StatusPage extends BeanModel {
             incident = incident.toPublicJSON();
         }
 
+        let maintenance = await StatusPage.getMaintenanceList(statusPage.id);
+
         // Public Group List
         const publicGroupList = [];
         const showTags = !!statusPage.show_tags;
@@ -100,7 +102,8 @@ class StatusPage extends BeanModel {
         return {
             config: await statusPage.toPublicJSON(),
             incident,
-            publicGroupList
+            publicGroupList,
+            maintenance,
         };
     }
 
@@ -259,6 +262,36 @@ class StatusPage extends BeanModel {
         }
     }
 
+    /**
+     * Get list of maintenances
+     * @param {number} statusPageId ID of status page to get maintenance for
+     * @returns {Object} Object representing maintenances sanitized for public
+     */
+    static async getMaintenanceList(statusPageId) {
+        try {
+            const publicMaintenanceList = [];
+
+            let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
+            SELECT m.*
+            FROM maintenance m
+            JOIN maintenance_status_page msp
+            ON msp.maintenance_id = m.id
+            WHERE datetime(m.start_date) <= datetime('now')
+              AND datetime(m.end_date) >= datetime('now')
+              AND msp.status_page_id = ?
+            ORDER BY m.end_date
+        `, [ statusPageId ]));
+
+            for (const bean of maintenanceBeanList) {
+                publicMaintenanceList.push(await bean.toPublicJSON());
+            }
+
+            return publicMaintenanceList;
+
+        } catch (error) {
+            return [];
+        }
+    }
 }
 
 module.exports = StatusPage;

From 7017c2e62502c6272c080a5f477f153cc8d65297 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 17 Sep 2022 16:54:21 +0800
Subject: [PATCH 146/803] Move maintenance code to
 `maintenance-socket-handler.js`

---
 server/server.js                              | 264 +-----------------
 .../maintenance-socket-handler.js             | 235 ++++++++++++++++
 server/uptime-kuma-server.js                  |  37 +++
 3 files changed, 275 insertions(+), 261 deletions(-)
 create mode 100644 server/socket-handlers/maintenance-socket-handler.js

diff --git a/server/server.js b/server/server.js
index b9363109..8d375b62 100644
--- a/server/server.js
+++ b/server/server.js
@@ -127,7 +127,7 @@ const StatusPage = require("./model/status_page");
 const { cloudflaredSocketHandler, autoStart: cloudflaredAutoStart, stop: cloudflaredStop } = require("./socket-handlers/cloudflared-socket-handler");
 const { proxySocketHandler } = require("./socket-handlers/proxy-socket-handler");
 const { dockerSocketHandler } = require("./socket-handlers/docker-socket-handler");
-const apicache = require("./modules/apicache");
+const { maintenanceSocketHandler } = require("./socket-handlers/maintenance-socket-handler");
 
 app.use(express.json());
 
@@ -146,12 +146,6 @@ app.use(function (req, res, next) {
  */
 let jwtSecret = null;
 
-/**
-* Main maintenance list
-* @type {{}}
-*/
-let maintenanceList = {};
-
 /**
  * Show Setup Page
  * @type {boolean}
@@ -733,135 +727,6 @@ let needSetup = false;
             }
         });
 
-        // Add a new maintenance
-        socket.on("addMaintenance", async (maintenance, callback) => {
-            try {
-                checkLogin(socket);
-                let bean = R.dispense("maintenance");
-
-                bean.import(maintenance);
-                bean.user_id = socket.userID;
-                let maintenanceID = await R.store(bean);
-
-                await sendMaintenanceList(socket);
-
-                callback({
-                    ok: true,
-                    msg: "Added Successfully.",
-                    maintenanceID,
-                });
-
-            } catch (e) {
-                callback({
-                    ok: false,
-                    msg: e.message,
-                });
-            }
-        });
-
-        // Edit a maintenance
-        socket.on("editMaintenance", async (maintenance, callback) => {
-            try {
-                checkLogin(socket);
-
-                let bean = await R.findOne("maintenance", " id = ? ", [ maintenance.id ]);
-
-                if (bean.user_id !== socket.userID) {
-                    throw new Error("Permission denied.");
-                }
-
-                bean.title = maintenance.title;
-                bean.description = maintenance.description;
-                bean.start_date = maintenance.start_date;
-                bean.end_date = maintenance.end_date;
-
-                await R.store(bean);
-
-                await sendMaintenanceList(socket);
-
-                callback({
-                    ok: true,
-                    msg: "Saved.",
-                    maintenanceID: bean.id,
-                });
-
-            } catch (e) {
-                console.error(e);
-                callback({
-                    ok: false,
-                    msg: e.message,
-                });
-            }
-        });
-
-        // Add a new monitor_maintenance
-        socket.on("addMonitorMaintenance", async (maintenanceID, monitors, callback) => {
-            try {
-                checkLogin(socket);
-
-                await R.exec("DELETE FROM monitor_maintenance WHERE maintenance_id = ?", [
-                    maintenanceID
-                ]);
-
-                for await (const monitor of monitors) {
-                    let bean = R.dispense("monitor_maintenance");
-
-                    bean.import({
-                        monitor_id: monitor.id,
-                        maintenance_id: maintenanceID
-                    });
-                    await R.store(bean);
-                }
-
-                apicache.clear();
-
-                callback({
-                    ok: true,
-                    msg: "Added Successfully.",
-                });
-
-            } catch (e) {
-                callback({
-                    ok: false,
-                    msg: e.message,
-                });
-            }
-        });
-
-        // Add a new monitor_maintenance
-        socket.on("addMaintenanceStatusPage", async (maintenanceID, statusPages, callback) => {
-            try {
-                checkLogin(socket);
-
-                await R.exec("DELETE FROM maintenance_status_page WHERE maintenance_id = ?", [
-                    maintenanceID
-                ]);
-
-                for await (const statusPage of statusPages) {
-                    let bean = R.dispense("maintenance_status_page");
-
-                    bean.import({
-                        status_page_id: statusPage.id,
-                        maintenance_id: maintenanceID
-                    });
-                    await R.store(bean);
-                }
-
-                apicache.clear();
-
-                callback({
-                    ok: true,
-                    msg: "Added Successfully.",
-                });
-
-            } catch (e) {
-                callback({
-                    ok: false,
-                    msg: e.message,
-                });
-            }
-        });
-
         socket.on("getMonitorList", async (callback) => {
             try {
                 checkLogin(socket);
@@ -878,22 +743,6 @@ let needSetup = false;
             }
         });
 
-        socket.on("getMaintenanceList", async (callback) => {
-            try {
-                checkLogin(socket);
-                await sendMaintenanceList(socket);
-                callback({
-                    ok: true,
-                });
-            } catch (e) {
-                console.error(e);
-                callback({
-                    ok: false,
-                    msg: e.message,
-                });
-            }
-        });
-
         socket.on("getMonitor", async (monitorID, callback) => {
             try {
                 checkLogin(socket);
@@ -942,54 +791,6 @@ let needSetup = false;
             }
         });
 
-        socket.on("getMonitorMaintenance", async (maintenanceID, callback) => {
-            try {
-                checkLogin(socket);
-
-                console.log(`Get Monitors for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
-
-                let monitors = await R.getAll("SELECT monitor.id, monitor.name FROM monitor_maintenance mm JOIN monitor ON mm.monitor_id = monitor.id WHERE mm.maintenance_id = ? ", [
-                    maintenanceID,
-                ]);
-
-                callback({
-                    ok: true,
-                    monitors,
-                });
-
-            } catch (e) {
-                console.error(e);
-                callback({
-                    ok: false,
-                    msg: e.message,
-                });
-            }
-        });
-
-        socket.on("getMaintenanceStatusPage", async (maintenanceID, callback) => {
-            try {
-                checkLogin(socket);
-
-                console.log(`Get Status Pages for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
-
-                let statusPages = await R.getAll("SELECT status_page.id, status_page.title FROM maintenance_status_page msp JOIN status_page ON msp.status_page_id = status_page.id WHERE msp.maintenance_id = ? ", [
-                    maintenanceID,
-                ]);
-
-                callback({
-                    ok: true,
-                    statusPages,
-                });
-
-            } catch (e) {
-                console.error(e);
-                callback({
-                    ok: false,
-                    msg: e.message,
-                });
-            }
-        });
-
         socket.on("getMonitorBeats", async (monitorID, period, callback) => {
             try {
                 checkLogin(socket);
@@ -1094,36 +895,6 @@ let needSetup = false;
             }
         });
 
-        socket.on("deleteMaintenance", async (maintenanceID, callback) => {
-            try {
-                checkLogin(socket);
-
-                console.log(`Delete Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
-
-                if (maintenanceID in maintenanceList) {
-                    delete maintenanceList[maintenanceID];
-                }
-
-                await R.exec("DELETE FROM maintenance WHERE id = ? AND user_id = ? ", [
-                    maintenanceID,
-                    socket.userID,
-                ]);
-
-                callback({
-                    ok: true,
-                    msg: "Deleted Successfully.",
-                });
-
-                await sendMaintenanceList(socket);
-
-            } catch (e) {
-                callback({
-                    ok: false,
-                    msg: e.message,
-                });
-            }
-        });
-
         socket.on("getTags", async (callback) => {
             try {
                 checkLogin(socket);
@@ -1704,6 +1475,7 @@ let needSetup = false;
         databaseSocketHandler(socket);
         proxySocketHandler(socket);
         dockerSocketHandler(socket);
+        maintenanceSocketHandler(socket);
 
         log.debug("server", "added all socket handlers");
 
@@ -1794,17 +1566,6 @@ async function checkOwner(userID, monitorID) {
     }
 }
 
-/**
- * Send maintenance list to client
- * @param {Socket} socket Socket.io instance to send to
- * @returns {Object}
- */
-async function sendMaintenanceList(socket) {
-    let list = await getMaintenanceJSONList(socket.userID);
-    io.to(socket.userID).emit("maintenanceList", list);
-    return list;
-}
-
 /**
  * Function called after user login
  * This function is used to send the heartbeat list of a monitor.
@@ -1817,7 +1578,7 @@ async function afterLogin(socket, user) {
     socket.join(user.id);
 
     let monitorList = await server.sendMonitorList(socket);
-    sendMaintenanceList(socket);
+    server.sendMaintenanceList(socket);
     sendNotificationList(socket);
     sendProxyList(socket);
     sendDockerHostList(socket);
@@ -1839,25 +1600,6 @@ async function afterLogin(socket, user) {
     }
 }
 
-/**
- * Get a list of maintenances for the given user.
- * @param {string} userID - The ID of the user to get maintenances for.
- * @returns {Promise<Object>} A promise that resolves to an object with maintenance IDs as keys and maintenances objects as values.
- */
-async function getMaintenanceJSONList(userID) {
-    let result = {};
-
-    let maintenanceList = await R.find("maintenance", " user_id = ? ORDER BY end_date DESC, title", [
-        userID,
-    ]);
-
-    for (let maintenance of maintenanceList) {
-        result[maintenance.id] = await maintenance.toJSON();
-    }
-
-    return result;
-}
-
 /**
  * Initialize the database
  * @param {boolean} [testMode=false] Should the connection be
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
new file mode 100644
index 00000000..e93d8d60
--- /dev/null
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -0,0 +1,235 @@
+const { checkLogin } = require("../util-server");
+const { log } = require("../../src/util");
+const { R } = require("redbean-node");
+const apicache = require("../modules/apicache");
+const { UptimeKumaServer } = require("../uptime-kuma-server");
+const server = UptimeKumaServer.getInstance();
+
+/**
+ * Handlers for Maintenance
+ * @param {Socket} socket Socket.io instance
+ */
+module.exports.maintenanceSocketHandler = (socket) => {
+    // Add a new maintenance
+    socket.on("addMaintenance", async (maintenance, callback) => {
+        try {
+            checkLogin(socket);
+            let bean = R.dispense("maintenance");
+
+            bean.import(maintenance);
+            bean.user_id = socket.userID;
+            let maintenanceID = await R.store(bean);
+
+            await server.sendMaintenanceList(socket);
+
+            callback({
+                ok: true,
+                msg: "Added Successfully.",
+                maintenanceID,
+            });
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    // Edit a maintenance
+    socket.on("editMaintenance", async (maintenance, callback) => {
+        try {
+            checkLogin(socket);
+
+            let bean = await R.findOne("maintenance", " id = ? ", [ maintenance.id ]);
+
+            if (bean.user_id !== socket.userID) {
+                throw new Error("Permission denied.");
+            }
+
+            bean.title = maintenance.title;
+            bean.description = maintenance.description;
+            bean.start_date = maintenance.start_date;
+            bean.end_date = maintenance.end_date;
+
+            await R.store(bean);
+
+            await server.sendMaintenanceList(socket);
+
+            callback({
+                ok: true,
+                msg: "Saved.",
+                maintenanceID: bean.id,
+            });
+
+        } catch (e) {
+            console.error(e);
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    // Add a new monitor_maintenance
+    socket.on("addMonitorMaintenance", async (maintenanceID, monitors, callback) => {
+        try {
+            checkLogin(socket);
+
+            await R.exec("DELETE FROM monitor_maintenance WHERE maintenance_id = ?", [
+                maintenanceID
+            ]);
+
+            for await (const monitor of monitors) {
+                let bean = R.dispense("monitor_maintenance");
+
+                bean.import({
+                    monitor_id: monitor.id,
+                    maintenance_id: maintenanceID
+                });
+                await R.store(bean);
+            }
+
+            apicache.clear();
+
+            callback({
+                ok: true,
+                msg: "Added Successfully.",
+            });
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    // Add a new monitor_maintenance
+    socket.on("addMaintenanceStatusPage", async (maintenanceID, statusPages, callback) => {
+        try {
+            checkLogin(socket);
+
+            await R.exec("DELETE FROM maintenance_status_page WHERE maintenance_id = ?", [
+                maintenanceID
+            ]);
+
+            for await (const statusPage of statusPages) {
+                let bean = R.dispense("maintenance_status_page");
+
+                bean.import({
+                    status_page_id: statusPage.id,
+                    maintenance_id: maintenanceID
+                });
+                await R.store(bean);
+            }
+
+            apicache.clear();
+
+            callback({
+                ok: true,
+                msg: "Added Successfully.",
+            });
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    socket.on("getMaintenanceList", async (callback) => {
+        try {
+            checkLogin(socket);
+            await server.sendMaintenanceList(socket);
+            callback({
+                ok: true,
+            });
+        } catch (e) {
+            console.error(e);
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    socket.on("getMonitorMaintenance", async (maintenanceID, callback) => {
+        try {
+            checkLogin(socket);
+
+            console.log(`Get Monitors for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+            let monitors = await R.getAll("SELECT monitor.id, monitor.name FROM monitor_maintenance mm JOIN monitor ON mm.monitor_id = monitor.id WHERE mm.maintenance_id = ? ", [
+                maintenanceID,
+            ]);
+
+            callback({
+                ok: true,
+                monitors,
+            });
+
+        } catch (e) {
+            console.error(e);
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    socket.on("getMaintenanceStatusPage", async (maintenanceID, callback) => {
+        try {
+            checkLogin(socket);
+
+            console.log(`Get Status Pages for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+            let statusPages = await R.getAll("SELECT status_page.id, status_page.title FROM maintenance_status_page msp JOIN status_page ON msp.status_page_id = status_page.id WHERE msp.maintenance_id = ? ", [
+                maintenanceID,
+            ]);
+
+            callback({
+                ok: true,
+                statusPages,
+            });
+
+        } catch (e) {
+            console.error(e);
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    socket.on("deleteMaintenance", async (maintenanceID, callback) => {
+        try {
+            checkLogin(socket);
+
+            console.log(`Delete Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+            if (maintenanceID in server.maintenanceList) {
+                delete server.maintenanceList[maintenanceID];
+            }
+
+            await R.exec("DELETE FROM maintenance WHERE id = ? AND user_id = ? ", [
+                maintenanceID,
+                socket.userID,
+            ]);
+
+            callback({
+                ok: true,
+                msg: "Deleted Successfully.",
+            });
+
+            await server.sendMaintenanceList(socket);
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+};
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 98de65a4..a8a36593 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -26,6 +26,13 @@ class UptimeKumaServer {
      * @type {{}}
      */
     monitorList = {};
+
+    /**
+     * Main maintenance list
+     * @type {{}}
+     */
+    maintenanceList = {};
+
     entryPage = "dashboard";
     app = undefined;
     httpServer = undefined;
@@ -104,6 +111,36 @@ class UptimeKumaServer {
         return result;
     }
 
+    /**
+     * Send maintenance list to client
+     * @param {Socket} socket Socket.io instance to send to
+     * @returns {Object}
+     */
+    async sendMaintenanceList(socket) {
+        let list = await this.getMaintenanceJSONList(socket.userID);
+        this.io.to(socket.userID).emit("maintenanceList", list);
+        return list;
+    }
+
+    /**
+     * Get a list of maintenances for the given user.
+     * @param {string} userID - The ID of the user to get maintenances for.
+     * @returns {Promise<Object>} A promise that resolves to an object with maintenance IDs as keys and maintenances objects as values.
+     */
+    async getMaintenanceJSONList(userID) {
+        let result = {};
+
+        let maintenanceList = await R.find("maintenance", " user_id = ? ORDER BY end_date DESC, title", [
+            userID,
+        ]);
+
+        for (let maintenance of maintenanceList) {
+            result[maintenance.id] = await maintenance.toJSON();
+        }
+
+        return result;
+    }
+
     /**
      * Write error to log file
      * @param {any} error The error to write

From 120e5783989923810bd9f6d92f24aa500783419e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 17 Sep 2022 16:58:08 +0800
Subject: [PATCH 147/803] Move maintenance code to
 `maintenance-socket-handler.js`

---
 server/server.js                              | 24 ---------------
 .../maintenance-socket-handler.js             | 30 +++++++++++++++++--
 2 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/server/server.js b/server/server.js
index 8d375b62..4aec2b27 100644
--- a/server/server.js
+++ b/server/server.js
@@ -767,30 +767,6 @@ let needSetup = false;
             }
         });
 
-        socket.on("getMaintenance", async (maintenanceID, callback) => {
-            try {
-                checkLogin(socket);
-
-                console.log(`Get Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
-
-                let bean = await R.findOne("maintenance", " id = ? AND user_id = ? ", [
-                    maintenanceID,
-                    socket.userID,
-                ]);
-
-                callback({
-                    ok: true,
-                    maintenance: await bean.toJSON(),
-                });
-
-            } catch (e) {
-                callback({
-                    ok: false,
-                    msg: e.message,
-                });
-            }
-        });
-
         socket.on("getMonitorBeats", async (monitorID, period, callback) => {
             try {
                 checkLogin(socket);
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index e93d8d60..113c336a 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -139,6 +139,30 @@ module.exports.maintenanceSocketHandler = (socket) => {
         }
     });
 
+    socket.on("getMaintenance", async (maintenanceID, callback) => {
+        try {
+            checkLogin(socket);
+
+            log.debug("maintenance", `Get Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+            let bean = await R.findOne("maintenance", " id = ? AND user_id = ? ", [
+                maintenanceID,
+                socket.userID,
+            ]);
+
+            callback({
+                ok: true,
+                maintenance: await bean.toJSON(),
+            });
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
     socket.on("getMaintenanceList", async (callback) => {
         try {
             checkLogin(socket);
@@ -159,7 +183,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
         try {
             checkLogin(socket);
 
-            console.log(`Get Monitors for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+            log.debug("maintenance", `Get Monitors for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
 
             let monitors = await R.getAll("SELECT monitor.id, monitor.name FROM monitor_maintenance mm JOIN monitor ON mm.monitor_id = monitor.id WHERE mm.maintenance_id = ? ", [
                 maintenanceID,
@@ -183,7 +207,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
         try {
             checkLogin(socket);
 
-            console.log(`Get Status Pages for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+            log.debug("maintenance", `Get Status Pages for Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
 
             let statusPages = await R.getAll("SELECT status_page.id, status_page.title FROM maintenance_status_page msp JOIN status_page ON msp.status_page_id = status_page.id WHERE msp.maintenance_id = ? ", [
                 maintenanceID,
@@ -207,7 +231,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
         try {
             checkLogin(socket);
 
-            console.log(`Delete Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+            log.debug("maintenance", `Delete Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
 
             if (maintenanceID in server.maintenanceList) {
                 delete server.maintenanceList[maintenanceID];

From bb883e6fa0d63d8fcd7345439a5c65880c3ea8b1 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 17 Sep 2022 22:00:11 +0800
Subject: [PATCH 148/803] Move maintenance under `/maintenance`

---
 src/components/MonitorList.vue   | 137 ++++---------------------
 src/layouts/Layout.vue           |  20 ++--
 src/pages/Dashboard.vue          |  38 +------
 src/pages/EditMaintenance.vue    |  31 ++----
 src/pages/MaintenanceDetails.vue |   4 +-
 src/pages/ManageMaintenance.vue  | 168 +++++++++++++++++++++++++++++++
 src/router.js                    |  41 ++++----
 src/util.js                      |   8 +-
 src/util.ts                      |   2 +-
 9 files changed, 240 insertions(+), 209 deletions(-)
 create mode 100644 src/pages/ManageMaintenance.vue

diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index 8e1b678b..1c0e3b35 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -1,13 +1,7 @@
 <template>
     <div class="shadow-box mb-3" :style="boxStyle">
         <div class="list-header">
-            <div class="search-wrapper float-start" style="margin-left: 5px;">
-                <font-awesome-icon icon="filter" />
-                <select v-model="selectedList" class="form-control" style="margin-left: 5px;">
-                    <option value="monitor" selected>{{ $t('Monitors') }}</option>
-                    <option value="maintenance">{{ $t('Maintenance') }}</option>
-                </select>
-            </div>
+            <div class="placeholder"></div>
             <div class="search-wrapper">
                 <a v-if="searchText == ''" class="search-icon">
                     <font-awesome-icon icon="search" />
@@ -21,62 +15,32 @@
             </div>
         </div>
         <div class="monitor-list" :class="{ scrollbar: scrollbar }">
-            <div v-if="Object.keys($root.monitorList).length === 0 && selectedList === 'monitor'" class="text-center mt-3">
+            <div v-if="Object.keys($root.monitorList).length === 0" class="text-center mt-3">
                 {{ $t("No Monitors, please") }} <router-link to="/add">{{ $t("add one") }}</router-link>
             </div>
-            <div v-if="Object.keys($root.maintenanceList).length === 0 && selectedList === 'maintenance'" class="text-center mt-3">
-                {{ $t("No Maintenance, please") }} <router-link to="/addMaintenance">{{ $t("add one") }}</router-link>
-            </div>
 
-            <template v-if="selectedList === 'maintenance'">
-                <router-link
-                    v-for="(item, index) in sortedMaintenanceList" :key="index" :to="maintenanceURL(item.id)"
-                    class="item" :class="{ 'disabled': !$root.isActiveMaintenance(item.end_date) }"
-                >
-                    <div class="row">
-                        <div class="col-9 col-md-8 small-padding">
-                            <div class="info">
-                                <Uptime :monitor="null" type="maintenance" :pill="true" />
-                                {{ item.title }}
-                            </div>
+            <router-link v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)" class="item" :class="{ 'disabled': ! item.active }">
+                <div class="row">
+                    <div class="col-9 col-md-8 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
+                        <div class="info">
+                            <Uptime :monitor="item" type="24" :pill="true" />
+                            {{ item.name }}
+                        </div>
+                        <div class="tags">
+                            <Tag v-for="tag in item.tags" :key="tag" :item="tag" :size="'sm'" />
                         </div>
                     </div>
-                </router-link>
-            </template>
-
-            <template v-if="selectedList === 'monitor'">
-                <router-link
-                    v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)"
-                    class="item" :class="{ 'disabled': ! item.active }"
-                >
-                    <div class="row">
-                        <div
-                            class="col-9 col-md-8 small-padding"
-                            :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }"
-                        >
-                            <div class="info">
-                                <Uptime :monitor="item" type="24" :pill="true" />
-                                {{ item.name }}
-                            </div>
-                            <div class="tags">
-                                <Tag v-for="tag in item.tags" :key="tag" :item="tag" :size="'sm'" />
-                            </div>
-                        </div>
-                        <div
-                            v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar"
-                            class="col-3 col-md-4"
-                        >
-                            <HeartbeatBar size="small" :monitor-id="item.id" />
-                        </div>
+                    <div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-3 col-md-4">
+                        <HeartbeatBar size="small" :monitor-id="item.id" />
                     </div>
+                </div>
 
-                    <div v-if="$root.userHeartbeatBar == 'bottom'" class="row">
-                        <div class="col-12 bottom-style">
-                            <HeartbeatBar size="small" :monitor-id="item.id" />
-                        </div>
+                <div v-if="$root.userHeartbeatBar == 'bottom'" class="row">
+                    <div class="col-12 bottom-style">
+                        <HeartbeatBar size="small" :monitor-id="item.id" />
                     </div>
-                </router-link>
-            </template>
+                </div>
+            </router-link>
         </div>
     </div>
 </template>
@@ -85,7 +49,7 @@
 import HeartbeatBar from "../components/HeartbeatBar.vue";
 import Tag from "../components/Tag.vue";
 import Uptime from "../components/Uptime.vue";
-import { getMaintenanceRelativeURL, getMonitorRelativeURL } from "../util.ts";
+import { getMonitorRelativeURL } from "../util.ts";
 
 export default {
     components: {
@@ -102,7 +66,6 @@ export default {
     data() {
         return {
             searchText: "",
-            selectedList: "monitor",
             windowTop: 0,
         };
     },
@@ -125,56 +88,6 @@ export default {
 
         },
 
-        sortedMaintenanceList() {
-            let result = Object.values(this.$root.maintenanceList);
-
-            result.sort((m1, m2) => {
-
-                if (this.$root.isActiveMaintenance(m1.end_date) !== this.$root.isActiveMaintenance(m2.end_date)) {
-                    if (!this.$root.isActiveMaintenance(m2.end_date)) {
-                        return -1;
-                    }
-                    if (!this.$root.isActiveMaintenance(m1.end_date)) {
-                        return 1;
-                    }
-                }
-
-                if (this.$root.isActiveMaintenance(m1.end_date) && this.$root.isActiveMaintenance(m2.end_date)) {
-                    if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
-                        return -1;
-                    }
-
-                    if (Date.parse(m2.end_date) < Date.parse(m1.end_date)) {
-                        return 1;
-                    }
-                }
-
-                if (!this.$root.isActiveMaintenance(m1.end_date) && !this.$root.isActiveMaintenance(m2.end_date)) {
-                    if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
-                        return 1;
-                    }
-
-                    if (Date.parse(m2.end_date) < Date.parse(m1.end_date)) {
-                        return -1;
-                    }
-                }
-
-                return m1.title.localeCompare(m2.title);
-            });
-
-            // Simple filter by search text
-            // finds maintenance name
-            if (this.searchText !== "") {
-                const loweredSearchText = this.searchText.toLowerCase();
-                result = result.filter(maintenance => {
-                    return maintenance.title.toLowerCase().includes(loweredSearchText)
-                        || maintenance.description.toLowerCase().includes(loweredSearchText);
-                });
-            }
-
-            return result;
-        },
-
         sortedMonitorList() {
             let result = Object.values(this.$root.monitorList);
 
@@ -240,9 +153,6 @@ export default {
         monitorURL(id) {
             return getMonitorRelativeURL(id);
         },
-        maintenanceURL(id) {
-            return getMaintenanceRelativeURL(id);
-        },
         /** Clear the search bar */
         clearSearchText() {
             this.searchText = "";
@@ -319,11 +229,4 @@ export default {
     margin-top: 5px;
 }
 
-.bg-maintenance {
-    background-color: $maintenance;
-}
-
-select {
-    text-align: center;
-}
 </style>
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index 56e1813d..7ece4982 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -37,19 +37,32 @@
                             <div class="profile-pic">{{ $root.usernameFirstChar }}</div>
                             <font-awesome-icon icon="angle-down" />
                         </div>
+
+                        <!-- Header's Dropdown Menu -->
                         <ul class="dropdown-menu">
+                            <!-- Username -->
                             <li>
                                 <i18n-t v-if="$root.username != null" tag="span" keypath="signedInDisp" class="dropdown-item-text">
                                     <strong>{{ $root.username }}</strong>
                                 </i18n-t>
                                 <span v-if="$root.username == null" class="dropdown-item-text">{{ $t("signedInDispDisabled") }}</span>
                             </li>
+
                             <li><hr class="dropdown-divider"></li>
+
+                            <!-- Functions -->
+                            <li>
+                                <router-link to="/maintenance" class="dropdown-item" :class="{ active: $route.path.includes('manage-maintenance') }">
+                                    <font-awesome-icon icon="wrench" /> {{ $t("Maintenance") }}
+                                </router-link>
+                            </li>
+
                             <li>
                                 <router-link to="/settings" class="dropdown-item" :class="{ active: $route.path.includes('settings') }">
                                     <font-awesome-icon icon="cog" /> {{ $t("Settings") }}
                                 </router-link>
                             </li>
+
                             <li v-if="$root.loggedIn && $root.socket.token !== 'autoLogin'">
                                 <button class="dropdown-item" @click="$root.logout">
                                     <font-awesome-icon icon="sign-out-alt" />
@@ -77,7 +90,7 @@
 
         <!-- Mobile Only -->
         <div v-if="$root.isMobile" style="width: 100%; height: 60px;" />
-        <nav v-if="$root.isMobile && $root.loggedIn" class="bottom-nav scroll">
+        <nav v-if="$root.isMobile && $root.loggedIn" class="bottom-nav">
             <router-link to="/dashboard" class="nav-link">
                 <div><font-awesome-icon icon="tachometer-alt" /></div>
                 {{ $t("Dashboard") }}
@@ -93,11 +106,6 @@
                 {{ $t("Add Monitor") }}
             </router-link>
 
-            <router-link to="/addMaintenance" class="nav-link">
-                <div><font-awesome-icon icon="wrench" /></div>
-                {{ $t("Add Maintenance") }}
-            </router-link>
-
             <router-link to="/settings" class="nav-link">
                 <div><font-awesome-icon icon="cog" /></div>
                 {{ $t("Settings") }}
diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue
index e2a5275f..20425c61 100644
--- a/src/pages/Dashboard.vue
+++ b/src/pages/Dashboard.vue
@@ -2,23 +2,7 @@
     <div class="container-fluid">
         <div class="row">
             <div v-if="!$root.isMobile" class="col-12 col-md-5 col-xl-4">
-                <div class="dropdown dropdown-create">
-                    <button class="btn btn-primary mb-3 dropdown-toggle" type="button" data-bs-toggle="dropdown">
-                        <font-awesome-icon icon="plus" /> {{ $t("Create") }}
-                    </button>
-                    <ul class="dropdown-menu dropdown-menu-end">
-                        <li>
-                            <button type="button" class="dropdown-item" @click="$router.push('/add')">
-                                <font-awesome-icon icon="heartbeat" /> {{ $t("Monitor") }}
-                            </button>
-                        </li>
-                        <li>
-                            <button type="button" class="dropdown-item" @click="$router.push('/addMaintenance')">
-                                <font-awesome-icon icon="wrench" /> {{ $t("Maintenance") }}
-                            </button>
-                        </li>
-                    </ul>
-                </div>
+                <router-link to="/add" class="btn btn-primary mb-3"><font-awesome-icon icon="plus" /> {{ $t("Add New Monitor") }}</router-link>
                 <MonitorList :scrollbar="true" />
             </div>
 
@@ -45,8 +29,6 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-@import "../assets/vars.scss";
-
 .container-fluid {
     width: 98%;
 }
@@ -55,22 +37,4 @@ export default {
     display: flex;
     justify-content: end;
 }
-
-.dark {
-    .dropdown-create {
-        ul {
-            background-color: $dark-bg;
-            border-color: $dark-bg2;
-            border-width: 2px;
-
-            li button {
-                color: $dark-font-color;
-            }
-
-            li button:hover {
-                background-color: $dark-bg2;
-            }
-        }
-    }
-}
 </style>
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 281f1241..604bf89b 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -6,14 +6,12 @@
                 <div class="shadow-box">
                     <div class="row">
                         <div class="col-md-6">
-                            <h2 class="mb-2">{{ $t("General") }}</h2>
-
                             <!-- Title -->
                             <div class="my-3">
                                 <label for="name" class="form-label">{{ $t("Title") }}</label>
                                 <input
                                     id="name" v-model="maintenance.title" type="text" class="form-control"
-                                    :placeholder="titlePlaceholder" required
+                                    required
                                 >
                             </div>
 
@@ -22,7 +20,6 @@
                                 <label for="description" class="form-label">{{ $t("Description") }}</label>
                                 <textarea
                                     id="description" v-model="maintenance.description" class="form-control"
-                                    :placeholder="descriptionPlaceholder"
                                 ></textarea>
                             </div>
 
@@ -54,8 +51,7 @@
 
                             <!-- Start Date Time -->
                             <div class="my-3">
-                                <label for="start_date" class="form-label">{{ $t("Start of maintenance") }}
-                                    ({{ $root.timezone }})</label>
+                                <label for="start_date" class="form-label">{{ $t("Start Date") }}</label>
                                 <input
                                     id="start_date" v-model="maintenance.start_date" :type="'datetime-local'"
                                     class="form-control" :class="{'dark-calendar': dark }" required
@@ -64,8 +60,7 @@
 
                             <!-- End Date Time -->
                             <div class="my-3">
-                                <label for="end_date" class="form-label">{{ $t("Expected end of maintenance") }}
-                                    ({{ $root.timezone }})</label>
+                                <label for="end_date" class="form-label">{{ $t("End Date") }}</label>
                                 <input
                                     id="end_date" v-model="maintenance.end_date" :type="'datetime-local'"
                                     class="form-control" :class="{'dark-calendar': dark }" required
@@ -79,14 +74,14 @@
                                     type="checkbox"
                                 >
                                 <label class="form-check-label" for="show-powered-by">{{
-                                    $t("Show on all pages")
+                                    $t("Show this Maintenance Message on ALL Status Pages")
                                 }}</label>
                             </div>
 
                             <!-- Status pages to display maintenance info on -->
                             <div v-if="!showOnAllPages" class="my-3">
                                 <label for="selected_status_pages" class="form-label">{{
-                                    $t("Selected status pages")
+                                    $t("Show this Maintenance Message on which Status Pages")
                                 }}</label>
 
                                 <VueMultiselect
@@ -155,25 +150,17 @@ export default {
     computed: {
 
         pageName() {
-            return this.$t((this.isAdd) ? "Schedule maintenance" : "Edit");
+            return this.$t((this.isAdd) ? "Schedule Maintenance" : "Edit Maintenance");
         },
 
         isAdd() {
-            return this.$route.path === "/addMaintenance";
+            return this.$route.path === "/add-maintenance";
         },
 
         isEdit() {
-            return this.$route.path.startsWith("/editMaintenance");
+            return this.$route.path.startsWith("/maintenance/edit");
         },
 
-        titlePlaceholder() {
-            return this.$t("maintenanceTitleExample");
-        },
-
-        descriptionPlaceholder() {
-            return this.$t("maintenanceDescriptionExample");
-        }
-
     },
     watch: {
         "$route.fullPath"() {
@@ -281,7 +268,7 @@ export default {
                                 toast.success(res.msg);
                                 this.processing = false;
                                 this.$root.getMaintenanceList();
-                                this.$router.push("/dashboard/maintenance/" + res.maintenanceID);
+                                this.$router.push("/maintenance/" + res.maintenanceID);
                             });
                         });
                     } else {
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
index 432e7c3f..947a89b9 100644
--- a/src/pages/MaintenanceDetails.vue
+++ b/src/pages/MaintenanceDetails.vue
@@ -9,7 +9,7 @@
             </p>
 
             <div class="functions" style="margin-top: 10px;">
-                <router-link :to=" '/editMaintenance/' + maintenance.id " class="btn btn-secondary">
+                <router-link :to=" '/maintenance/edit/' + maintenance.id " class="btn btn-secondary">
                     <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
                 </router-link>
                 <button class="btn btn-danger" @click="deleteDialog">
@@ -27,7 +27,7 @@
             </button>
             <br />
 
-            <label for="selected_status_pages" class="form-label" style="margin-top: 20px;">{{ $t("Selected status pages") }}</label>
+            <label for="selected_status_pages" class="form-label" style="margin-top: 20px;">{{ $t("Show this Maintenance Message on which Status Pages") }}</label>
             <br>
             <button v-for="statusPage in selectedStatusPages" :key="statusPage.id" class="btn btn-monitor" style="margin: 5px; cursor: auto; color: white; font-weight: 500;">
                 {{ statusPage }}
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
new file mode 100644
index 00000000..0041f3d2
--- /dev/null
+++ b/src/pages/ManageMaintenance.vue
@@ -0,0 +1,168 @@
+<template>
+    <transition name="slide-fade" appear>
+        <div>
+            <h1 class="mb-3">
+                {{ $t("Maintenance") }}
+            </h1>
+
+            <div>
+                <router-link to="/add-maintenance" class="btn btn-primary mb-3">
+                    <font-awesome-icon icon="plus" /> {{ $t("Schedule Maintenance") }}
+                </router-link>
+            </div>
+
+            <div class="shadow-box">
+                <span v-if="Object.keys(sortedMaintenanceList).length === 0" class="d-flex align-items-center justify-content-center my-3">
+                    {{ $t("No maintenance") }}
+                </span>
+
+                <router-link
+                    v-for="(item, index) in sortedMaintenanceList"
+                    :key="index"
+                    :to="maintenanceURL(item.id)"
+                    class="item"
+                    :class="{ 'disabled': !$root.isActiveMaintenance(item.end_date) }"
+                >
+                    <div>
+                    </div>
+                    <div class="info">
+                        <div class="title">{{ item.title }}</div>
+                        <div>{{ item.description }}</div>
+                    </div>
+                </router-link>
+            </div>
+        </div>
+    </transition>
+</template>
+
+<script>
+import { getResBaseURL } from "../util-frontend";
+import { getMaintenanceRelativeURL } from "../util.ts";
+
+export default {
+    components: {
+    },
+    data() {
+        return {
+        };
+    },
+    computed: {
+        sortedMaintenanceList() {
+            let result = Object.values(this.$root.maintenanceList);
+
+            result.sort((m1, m2) => {
+
+                if (this.$root.isActiveMaintenance(m1.end_date) !== this.$root.isActiveMaintenance(m2.end_date)) {
+                    if (!this.$root.isActiveMaintenance(m2.end_date)) {
+                        return -1;
+                    }
+                    if (!this.$root.isActiveMaintenance(m1.end_date)) {
+                        return 1;
+                    }
+                }
+
+                if (this.$root.isActiveMaintenance(m1.end_date) && this.$root.isActiveMaintenance(m2.end_date)) {
+                    if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
+                        return -1;
+                    }
+
+                    if (Date.parse(m2.end_date) < Date.parse(m1.end_date)) {
+                        return 1;
+                    }
+                }
+
+                if (!this.$root.isActiveMaintenance(m1.end_date) && !this.$root.isActiveMaintenance(m2.end_date)) {
+                    if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
+                        return 1;
+                    }
+
+                    if (Date.parse(m2.end_date) < Date.parse(m1.end_date)) {
+                        return -1;
+                    }
+                }
+
+                return m1.title.localeCompare(m2.title);
+            });
+
+            return result;
+        },
+    },
+    mounted() {
+
+    },
+    methods: {
+        /**
+         * Get the correct URL for the icon
+         * @param {string} icon Path for icon
+         * @returns {string} Correctly formatted path including port numbers
+         */
+        icon(icon) {
+            if (icon === "/icon.svg") {
+                return icon;
+            } else {
+                return getResBaseURL() + icon;
+            }
+        },
+
+        maintenanceURL(id) {
+            return getMaintenanceRelativeURL(id);
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+    @import "../assets/vars.scss";
+
+    .item {
+        display: flex;
+        align-items: center;
+        gap: 10px;
+        text-decoration: none;
+        border-radius: 10px;
+        transition: all ease-in-out 0.15s;
+        padding: 10px;
+        min-height: 90px;
+
+        &:hover {
+            background-color: $highlight-white;
+        }
+
+        &.active {
+            background-color: #cdf8f4;
+        }
+
+        $logo-width: 70px;
+
+        .logo {
+            width: $logo-width;
+            height: $logo-width;
+
+            // Better when the image is loading
+            min-height: 1px;
+        }
+
+        .info {
+            .title {
+                font-weight: bold;
+                font-size: 20px;
+            }
+
+            .slug {
+                font-size: 14px;
+            }
+        }
+    }
+
+    .dark {
+        .item {
+            &:hover {
+                background-color: $dark-bg2;
+            }
+
+            &.active {
+                background-color: $dark-bg2;
+            }
+        }
+    }
+</style>
diff --git a/src/router.js b/src/router.js
index f58e7ba7..a3414774 100644
--- a/src/router.js
+++ b/src/router.js
@@ -15,6 +15,9 @@ import Entry from "./pages/Entry.vue";
 import ManageStatusPage from "./pages/ManageStatusPage.vue";
 import AddStatusPage from "./pages/AddStatusPage.vue";
 import NotFound from "./pages/NotFound.vue";
+import DockerHosts from "./components/settings/Docker.vue";
+import MaintenanceDetails from "./pages/MaintenanceDetails.vue";
+import ManageMaintenance from "./pages/ManageMaintenance.vue";
 
 // Settings - Sub Pages
 import Appearance from "./components/settings/Appearance.vue";
@@ -26,8 +29,6 @@ const Security = () => import("./components/settings/Security.vue");
 import Proxies from "./components/settings/Proxies.vue";
 import Backup from "./components/settings/Backup.vue";
 import About from "./components/settings/About.vue";
-import DockerHosts from "./components/settings/Docker.vue";
-import MaintenanceDetails from "./pages/MaintenanceDetails.vue";
 
 const routes = [
     {
@@ -64,28 +65,12 @@ const routes = [
                                     },
                                 ],
                             },
-                            {
-                                path: "/dashboard/maintenance/:id",
-                                component: EmptyLayout,
-                                children: [
-                                    {
-                                        path: "",
-                                        component: MaintenanceDetails,
-                                    },
-                                    {
-                                        path: "/editMaintenance/:id",
-                                        component: EditMaintenance,
-                                    },
-                                ],
-                            },
+
                             {
                                 path: "/add",
                                 component: EditMonitor,
                             },
-                            {
-                                path: "/addMaintenance",
-                                component: EditMaintenance,
-                            },
+
                         ],
                     },
                     {
@@ -146,6 +131,22 @@ const routes = [
                         path: "/add-status-page",
                         component: AddStatusPage,
                     },
+                    {
+                        path: "/maintenance",
+                        component: ManageMaintenance,
+                    },
+                    {
+                        path: "/maintenance/:id",
+                        component: MaintenanceDetails,
+                    },
+                    {
+                        path: "/add-maintenance",
+                        component: EditMaintenance,
+                    },
+                    {
+                        path: "/maintenance/edit/:id",
+                        component: EditMaintenance,
+                    },
                 ],
             },
         ],
diff --git a/src/util.js b/src/util.js
index ca21e0cb..c5fca856 100644
--- a/src/util.js
+++ b/src/util.js
@@ -282,9 +282,9 @@ function getCryptoRandomInt(min, max) {
 }
 exports.getCryptoRandomInt = getCryptoRandomInt;
 /**
- * Generate a secret
- * @param length Lenght of secret to generate
- * @returns
+ * Generate a random alphanumeric string of fixed length
+ * @param length Length of string to generate
+ * @returns string
  */
 function genSecret(length = 64) {
     let secret = "";
@@ -306,6 +306,6 @@ function getMonitorRelativeURL(id) {
 }
 exports.getMonitorRelativeURL = getMonitorRelativeURL;
 function getMaintenanceRelativeURL(id) {
-    return "/dashboard/maintenance/" + id;
+    return "/maintenance/" + id;
 }
 exports.getMaintenanceRelativeURL = getMaintenanceRelativeURL;
diff --git a/src/util.ts b/src/util.ts
index 3704999c..0dd8a62a 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -340,5 +340,5 @@ export function getMonitorRelativeURL(id: string) {
 }
 
 export function getMaintenanceRelativeURL(id: string) {
-    return "/dashboard/maintenance/" + id;
+    return "/maintenance/" + id;
 }

From 80698a58b83830ad81a56e1861f3e4f120b0cb24 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 17 Sep 2022 22:09:09 +0800
Subject: [PATCH 149/803] Tidy up

---
 src/pages/Dashboard.vue     | 9 +++------
 src/pages/DashboardHome.vue | 8 --------
 src/pages/Details.vue       | 4 ----
 src/router.js               | 2 --
 4 files changed, 3 insertions(+), 20 deletions(-)

diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue
index 20425c61..c49f5f3a 100644
--- a/src/pages/Dashboard.vue
+++ b/src/pages/Dashboard.vue
@@ -2,7 +2,9 @@
     <div class="container-fluid">
         <div class="row">
             <div v-if="!$root.isMobile" class="col-12 col-md-5 col-xl-4">
-                <router-link to="/add" class="btn btn-primary mb-3"><font-awesome-icon icon="plus" /> {{ $t("Add New Monitor") }}</router-link>
+                <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" />
             </div>
 
@@ -32,9 +34,4 @@ export default {
 .container-fluid {
     width: 98%;
 }
-
-.dropdown-create {
-    display: flex;
-    justify-content: end;
-}
 </style>
diff --git a/src/pages/DashboardHome.vue b/src/pages/DashboardHome.vue
index 0f706912..2745d91b 100644
--- a/src/pages/DashboardHome.vue
+++ b/src/pages/DashboardHome.vue
@@ -147,14 +147,6 @@ export default {
     display: block;
 }
 
-.text-maintenance {
-    color: $maintenance;
-}
-
-.bg-maintenance {
-    background-color: $maintenance;
-}
-
 .shadow-box {
     padding: 20px;
 }
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 5583eeff..7cf25892 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -514,8 +514,4 @@ table {
     margin-left: 0 !important;
 }
 
-.bg-maintenance {
-    background-color: $maintenance;
-}
-
 </style>
diff --git a/src/router.js b/src/router.js
index a3414774..38048826 100644
--- a/src/router.js
+++ b/src/router.js
@@ -65,12 +65,10 @@ const routes = [
                                     },
                                 ],
                             },
-
                             {
                                 path: "/add",
                                 component: EditMonitor,
                             },
-
                         ],
                     },
                     {

From a29eae3213a5cf97a75005e8ad148bed4524445c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 18 Sep 2022 02:02:18 +0800
Subject: [PATCH 150/803] Update Maintenance UI

---
 src/pages/EditMaintenance.vue    |   3 +-
 src/pages/MaintenanceDetails.vue |   2 +-
 src/pages/ManageMaintenance.vue  | 106 ++++++++++++++++++++++---------
 3 files changed, 80 insertions(+), 31 deletions(-)

diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 604bf89b..97c4ec2a 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -268,7 +268,7 @@ export default {
                                 toast.success(res.msg);
                                 this.processing = false;
                                 this.$root.getMaintenanceList();
-                                this.$router.push("/maintenance/" + res.maintenanceID);
+                                this.$router.push("/maintenance");
                             });
                         });
                     } else {
@@ -285,6 +285,7 @@ export default {
                                 this.processing = false;
                                 this.$root.toastRes(res);
                                 this.init();
+                                this.$router.push("/maintenance");
                             });
                         });
                     } else {
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
index 947a89b9..04c21691 100644
--- a/src/pages/MaintenanceDetails.vue
+++ b/src/pages/MaintenanceDetails.vue
@@ -91,7 +91,7 @@ export default {
             this.$root.deleteMaintenance(this.maintenance.id, (res) => {
                 if (res.ok) {
                     toast.success(res.msg);
-                    this.$router.push("/dashboard");
+                    this.$router.push("/maintenance");
                 } else {
                     toast.error(res.msg);
                 }
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index 0041f3d2..3d5f0784 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -16,21 +16,37 @@
                     {{ $t("No maintenance") }}
                 </span>
 
-                <router-link
+                <div
                     v-for="(item, index) in sortedMaintenanceList"
                     :key="index"
-                    :to="maintenanceURL(item.id)"
                     class="item"
-                    :class="{ 'disabled': !$root.isActiveMaintenance(item.end_date) }"
+                    :class="{ 'ended': !$root.isActiveMaintenance(item.end_date) }"
                 >
-                    <div>
+                    <div class="left-part">
+                        <div
+                            class="circle"
+                        ></div>
+                        <div class="info">
+                            <div class="title">{{ item.title }}</div>
+                            <div>{{ item.description }}</div>
+                        </div>
                     </div>
-                    <div class="info">
-                        <div class="title">{{ item.title }}</div>
-                        <div>{{ item.description }}</div>
+
+                    <div class="buttons">
+                        <router-link :to="maintenanceURL(item.id)" class="btn btn-light">{{ $t("Details") }}</router-link>
+                        <router-link :to="'/maintenance/edit/' + item.id" class="btn btn-secondary">
+                            <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
+                        </router-link>
+                        <button class="btn btn-danger" @click="deleteDialog(item.id)">
+                            <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
+                        </button>
                     </div>
-                </router-link>
+                </div>
             </div>
+
+            <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteMaintenance">
+                {{ $t("deleteMaintenanceMsg") }}
+            </Confirm>
         </div>
     </transition>
 </template>
@@ -38,12 +54,17 @@
 <script>
 import { getResBaseURL } from "../util-frontend";
 import { getMaintenanceRelativeURL } from "../util.ts";
+import Confirm from "../components/Confirm.vue";
+import { useToast } from "vue-toastification";
+const toast = useToast();
 
 export default {
     components: {
+        Confirm,
     },
     data() {
         return {
+            selectedMaintenanceID: undefined,
         };
     },
     computed: {
@@ -107,6 +128,22 @@ export default {
         maintenanceURL(id) {
             return getMaintenanceRelativeURL(id);
         },
+
+        deleteDialog(maintenanceID) {
+            this.selectedMaintenanceID = maintenanceID;
+            this.$refs.confirmDelete.show();
+        },
+
+        deleteMaintenance() {
+            this.$root.deleteMaintenance(this.selectedMaintenanceID, (res) => {
+                if (res.ok) {
+                    toast.success(res.msg);
+                    this.$router.push("/maintenance");
+                } else {
+                    toast.error(res.msg);
+                }
+            });
+        },
     },
 };
 </script>
@@ -121,6 +158,7 @@ export default {
         text-decoration: none;
         border-radius: 10px;
         transition: all ease-in-out 0.15s;
+        justify-content: space-between;
         padding: 10px;
         min-height: 90px;
 
@@ -128,29 +166,43 @@ export default {
             background-color: $highlight-white;
         }
 
-        &.active {
-            background-color: #cdf8f4;
+        &.ended {
+            .left-part {
+                opacity: 0.5;
+                .circle {
+                    background-color: $dark-font-color;
+                }
+            }
         }
 
-        $logo-width: 70px;
+        .left-part {
+            display: flex;
+            gap: 12px;
+            align-items: center;
 
-        .logo {
-            width: $logo-width;
-            height: $logo-width;
+            .circle {
+                width: 25px;
+                height: 25px;
+                border-radius: 50rem;
+                background-color: $maintenance;
 
-            // Better when the image is loading
-            min-height: 1px;
+            }
+
+            .info {
+                .title {
+                    font-weight: bold;
+                    font-size: 20px;
+                }
+
+                .slug {
+                    font-size: 14px;
+                }
+            }
         }
 
-        .info {
-            .title {
-                font-weight: bold;
-                font-size: 20px;
-            }
-
-            .slug {
-                font-size: 14px;
-            }
+        .buttons {
+            display: flex;
+            gap: 8px;
         }
     }
 
@@ -159,10 +211,6 @@ export default {
             &:hover {
                 background-color: $dark-bg2;
             }
-
-            &.active {
-                background-color: $dark-bg2;
-            }
         }
     }
 </style>

From 9fe07742ea8f2dd7b0a380333f6077092b5f0ef3 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 18 Sep 2022 02:07:32 +0800
Subject: [PATCH 151/803] Linting

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

diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index 3d5f0784..2165d7a5 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -169,6 +169,7 @@ export default {
         &.ended {
             .left-part {
                 opacity: 0.5;
+
                 .circle {
                     background-color: $dark-font-color;
                 }
@@ -185,7 +186,6 @@ export default {
                 height: 25px;
                 border-radius: 50rem;
                 background-color: $maintenance;
-
             }
 
             .info {

From f61c1c47aa19113f03b22573552d14e5adc446c0 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 18 Sep 2022 02:13:29 +0800
Subject: [PATCH 152/803] Update Maintenance UI

---
 src/assets/app.scss           | 4 ++++
 src/pages/EditMaintenance.vue | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/assets/app.scss b/src/assets/app.scss
index 207c0f3a..691adb68 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -252,6 +252,10 @@ optgroup {
         color: $dark-font-color2;
     }
 
+    .bg-maintenance {
+        background-color: $maintenance;
+    }
+
     .btn-secondary {
         color: white;
     }
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 97c4ec2a..3e650faa 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -140,7 +140,7 @@ export default {
             maintenance: {},
             affectedMonitors: [],
             affectedMonitorsOptions: [],
-            showOnAllPages: true,
+            showOnAllPages: false,
             selectedStatusPages: [],
             selectedStatusPagesOptions: [],
             dark: (this.$root.theme === "dark"),

From 7853c2cc380b95d24324832ba998d4858b19cf73 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 18 Sep 2022 22:34:05 +0800
Subject: [PATCH 153/803] Update Maintenance UI

---
 src/assets/app.scss             | 17 +++++--
 src/languages/en.js             |  4 +-
 src/pages/EditMaintenance.vue   | 88 ++++++++++++++++-----------------
 src/pages/ManageMaintenance.vue |  2 +-
 src/pages/StatusPage.vue        |  7 ++-
 5 files changed, 61 insertions(+), 57 deletions(-)

diff --git a/src/assets/app.scss b/src/assets/app.scss
index 691adb68..81cf7724 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -22,6 +22,19 @@ textarea.form-control {
     width: 10px;
 }
 
+.bg-maintenance {
+    color: white !important;
+    background-color: $maintenance !important;
+}
+
+.bg-dark {
+    color: white;
+}
+
+.text-maintenance {
+    color: $maintenance !important;
+}
+
 .list-group {
     border-radius: 0.75rem;
 
@@ -252,10 +265,6 @@ optgroup {
         color: $dark-font-color2;
     }
 
-    .bg-maintenance {
-        background-color: $maintenance;
-    }
-
     .btn-secondary {
         color: white;
     }
diff --git a/src/languages/en.js b/src/languages/en.js
index 59c0ea14..1a5956f7 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -10,17 +10,17 @@ export default {
     maxRedirectDescription: "Maximum number of redirects to follow. Set to 0 to disable redirects.",
     acceptedStatusCodesDescription: "Select status codes which are considered as a successful response.",
     Maintenance: "Maintenance",
-    "Monitors": "Monitors",
     "Schedule maintenance": "Schedule maintenance",
     "Affected Monitors": "Affected Monitors",
     "Pick Affected Monitors...": "Pick Affected Monitors...",
     "Start of maintenance": "Start of maintenance",
     "Expected end of maintenance": "Expected end of maintenance",
-    "Show on all pages": "Show on all status pages",
+    "All Status Pages": "All Status Pages",
     "Selected status pages": "Selected status pages",
     "Select status pages...": "Select status pages...",
     End: "End",
     affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
+    affectedStatusPages: "Show this maintenance message on selected status pages",
     atLeastOneMonitor: "Select at least one affected monitor",
     maintenanceInvalidDate: "Invalid maintenance end date entered",
     selectedStatusPagesDescription: "Select status pages to display maintenance info on",
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 3e650faa..65f2d724 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -5,7 +5,7 @@
             <form @submit.prevent="submit">
                 <div class="shadow-box">
                     <div class="row">
-                        <div class="col-md-6">
+                        <div class="col-xl-7">
                             <!-- Title -->
                             <div class="my-3">
                                 <label for="name" class="form-label">{{ $t("Title") }}</label>
@@ -24,9 +24,10 @@
                             </div>
 
                             <!-- Affected Monitors -->
-                            <div class="my-3">
-                                <label for="affected_monitors" class="form-label">{{ $t("Affected Monitors") }}</label>
+                            <h2 class="mt-5">{{ $t("Affected Monitors") }}</h2>
+                            {{ $t("affectedMonitorsDescription") }}
 
+                            <div class="my-3">
                                 <VueMultiselect
                                     id="affected_monitors"
                                     v-model="affectedMonitors"
@@ -43,12 +44,46 @@
                                     :max-height="600"
                                     :taggable="false"
                                 ></VueMultiselect>
+                            </div>
 
-                                <div class="form-text">
-                                    {{ $t("affectedMonitorsDescription") }}
+                            <!-- Status pages to display maintenance info on -->
+                            <h2 class="mt-5">{{ $t("Status Pages") }}</h2>
+                            {{ $t("affectedStatusPages") }}
+
+                            <div class="my-3">
+                                <!-- Show on all pages -->
+                                <div class="form-check mb-2">
+                                    <input
+                                        id="show-on-all-pages" v-model="showOnAllPages" class="form-check-input"
+                                        type="checkbox"
+                                    >
+                                    <label class="form-check-label" for="show-powered-by">{{
+                                        $t("All Status Pages")
+                                    }}</label>
+                                </div>
+
+                                <div v-if="!showOnAllPages">
+                                    <VueMultiselect
+                                        id="selected_status_pages"
+                                        v-model="selectedStatusPages"
+                                        :options="selectedStatusPagesOptions"
+                                        track-by="id"
+                                        label="name"
+                                        :multiple="true"
+                                        :allow-empty="true"
+                                        :close-on-select="false"
+                                        :clear-on-select="false"
+                                        :preserve-search="true"
+                                        :placeholder="$t('Select status pages...')"
+                                        :preselect-first="false"
+                                        :max-height="600"
+                                        :taggable="false"
+                                    ></VueMultiselect>
                                 </div>
                             </div>
 
+                            <h2 class="mt-5">{{ $t("Effective Date Range") }}</h2>
+
                             <!-- Start Date Time -->
                             <div class="my-3">
                                 <label for="start_date" class="form-label">{{ $t("Start Date") }}</label>
@@ -67,46 +102,7 @@
                                 >
                             </div>
 
-                            <!-- Show on all pages -->
-                            <div class="my-3 form-check">
-                                <input
-                                    id="show-on-all-pages" v-model="showOnAllPages" class="form-check-input"
-                                    type="checkbox"
-                                >
-                                <label class="form-check-label" for="show-powered-by">{{
-                                    $t("Show this Maintenance Message on ALL Status Pages")
-                                }}</label>
-                            </div>
-
-                            <!-- Status pages to display maintenance info on -->
-                            <div v-if="!showOnAllPages" class="my-3">
-                                <label for="selected_status_pages" class="form-label">{{
-                                    $t("Show this Maintenance Message on which Status Pages")
-                                }}</label>
-
-                                <VueMultiselect
-                                    id="selected_status_pages"
-                                    v-model="selectedStatusPages"
-                                    :options="selectedStatusPagesOptions"
-                                    track-by="id"
-                                    label="name"
-                                    :multiple="true"
-                                    :allow-empty="false"
-                                    :close-on-select="false"
-                                    :clear-on-select="false"
-                                    :preserve-search="true"
-                                    :placeholder="$t('Select status pages...')"
-                                    :preselect-first="false"
-                                    :max-height="600"
-                                    :taggable="false"
-                                ></VueMultiselect>
-
-                                <div class="form-text">
-                                    {{ $t("selectedStatusPagesDescription") }}
-                                </div>
-                            </div>
-
-                            <div class="mt-5 mb-1">
+                            <div class="mt-4 mb-1">
                                 <button
                                     id="monitor-submit-btn" class="btn btn-primary" type="submit"
                                     :disabled="processing"
@@ -329,7 +325,7 @@ export default {
 }
 
 textarea {
-    min-height: 200px;
+    min-height: 150px;
 }
 
 .dark-calendar::-webkit-calendar-picker-indicator {
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index 2165d7a5..bcd47acf 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -33,7 +33,7 @@
                     </div>
 
                     <div class="buttons">
-                        <router-link :to="maintenanceURL(item.id)" class="btn btn-light">{{ $t("Details") }}</router-link>
+                        <router-link v-if="false" :to="maintenanceURL(item.id)" class="btn btn-light">{{ $t("Details") }}</router-link>
                         <router-link :to="'/maintenance/edit/' + item.id" class="btn btn-secondary">
                             <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
                         </router-link>
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 96ff6085..699c236d 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -199,14 +199,14 @@
             <template v-if="maintenance.length">
                 <div
                     v-for="maintenanceItem in maintenance" :key="maintenanceItem.id"
-                    class="shadow-box alert mb-4 p-4 maintenance mt-4 position-relative" role="alert"
+                    class="shadow-box alert mb-4 p-3 bg-maintenance mt-4 position-relative" role="alert"
                 >
                     <div class="item">
                         <div class="row">
                             <div class="col-1 col-md-1 d-flex justify-content-center align-items-center">
                                 <font-awesome-icon
                                     icon="wrench"
-                                    class="maintenance-icon maintenance-bg-info"
+                                    class="maintenance-icon"
                                 />
                             </div>
                             <div class="col-11 col-md-11">
@@ -215,7 +215,6 @@
 
                                 <div class="date mt-3">
                                     {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }}
-                                    ({{ dateFromNow(maintenanceItem.start_date) }})<br />
                                 </div>
                             </div>
                         </div>
@@ -996,7 +995,7 @@ footer {
 }
 
 .maintenance-icon {
-    font-size: 30px;
+    font-size: 35px;
     vertical-align: middle;
 }
 

From 617ba49e6c270d3892a12e3aec2d02739a6134ca Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 18 Sep 2022 22:40:53 +0800
Subject: [PATCH 154/803] Fix race condition of `selectedStatusPagesOptions`

---
 src/pages/EditMaintenance.vue | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 65f2d724..f010ca8e 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -138,13 +138,21 @@ export default {
             affectedMonitorsOptions: [],
             showOnAllPages: false,
             selectedStatusPages: [],
-            selectedStatusPagesOptions: [],
             dark: (this.$root.theme === "dark"),
         };
     },
 
     computed: {
 
+        selectedStatusPagesOptions() {
+            return Object.values(this.$root.statusPageList).map(statusPage => {
+                return {
+                    id: statusPage.id,
+                    name: statusPage.title
+                };
+            });
+        },
+
         pageName() {
             return this.$t((this.isAdd) ? "Schedule Maintenance" : "Edit Maintenance");
         },
@@ -177,13 +185,6 @@ export default {
                 });
             }
         });
-
-        Object.values(this.$root.statusPageList).map(statusPage => {
-            this.selectedStatusPagesOptions.push({
-                id: statusPage.id,
-                name: statusPage.title
-            });
-        });
     },
     methods: {
         init() {

From e4e47c39765c5f5e4e35bda0332e5055208faa87 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 18 Sep 2022 23:07:17 +0800
Subject: [PATCH 155/803] Update README.md

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

diff --git a/README.md b/README.md
index 496aed04..b81c0be2 100644
--- a/README.md
+++ b/README.md
@@ -177,4 +177,4 @@ If you want to translate Uptime Kuma into your language, please read: https://gi
 Feel free to correct my grammar in this README, source code, or wiki, as my mother language is not English and my grammar is not that great.
 
 ### Create Pull Requests
-If you want to modify Uptime Kuma, this guideline may be useful for you: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md
+If you want to modify Uptime Kuma, please read this guide and follow the rules here: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md

From 1f1825dbff2a066f76ece00150350e811d942c50 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 19 Sep 2022 19:39:30 +0800
Subject: [PATCH 156/803] Update CONTRIBUTING.md

---
 CONTRIBUTING.md | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c6bfb073..e0bc7cd2 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -177,7 +177,18 @@ npm test
 
 By default, the Chromium window will be shown up during the test. Specifying `HEADLESS_TEST=1` for terminal environments.
 
-## Update Dependencies
+## Dependencies
+
+Both frontend and backend share the same package.json. However, the frontend dependencies are eventually not be used in production environment, because it is usually also baked into dist files. So:
+
+- Frontend dependencies = "devDependencies"
+  - Examples: vue, chart.js
+- Backend dependencies = "dependencies"
+  - Examples: socket.io, sqlite3
+- Development dependencies = "devDependencies"
+  - Examples: eslint, sass
+
+### Update Dependencies
 
 Install `ncu`
 https://github.com/raineorshine/npm-check-updates

From 3193533a607247175b54e3fea59854c1c6624103 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 19 Sep 2022 19:56:30 +0800
Subject: [PATCH 157/803] Update CONTRIBUTING.md

---
 CONTRIBUTING.md | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e0bc7cd2..e9829c96 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -27,13 +27,11 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
 
 ## Can I create a pull request for Uptime Kuma?
 
-Yes, you can. However, since I don't want to waste your time, be sure to **create empty draft pull request, so we can discuss first** if it is a large pull request or you don't know it will be merged or not.
+Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create empty draft pull request or open an issue, so we can discuss first**. Especially for a large pull request or you don't know it will be merged or not.
 
-Also, please don't rush or ask for ETA, because I have to understand the pull request, make sure it is no breaking changes and stick to my vision of this project, especially for large pull requests.
+Here are some references:
 
-I will mark your pull request in the [milestones](https://github.com/louislam/uptime-kuma/milestones), if I am plan to review and merge it.
-
-✅ Accept:
+✅ Usually Accept:
 - Bug/Security fix
 - Translations
 - Adding notification providers
@@ -47,8 +45,14 @@ I will mark your pull request in the [milestones](https://github.com/louislam/up
 - Any breaking changes
 - Duplicated pull request
 - Buggy
+- UI/UX is not close to Uptime Kuma 
 - Existing logic is completely modified or deleted for no reason
 - A function that is completely out of scope
+- Unnesscary large code changes (Hard to review, casuse code conflicts to other pull requests)
+
+I will mark your pull request in the [milestones](https://github.com/louislam/uptime-kuma/milestones), if I am plan to review and merge it.
+
+Also, please don't rush or ask for ETA, because I have to understand the pull request, make sure it is no breaking changes and stick to my vision of this project, especially for large pull requests.
 
 
 ### Recommended Pull Request Guideline

From c4cb825fef0652ff7fd555ea2399aae70e154101 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 19 Sep 2022 23:14:25 +0800
Subject: [PATCH 158/803] Update PULL_REQUEST_TEMPLATE.md

---
 .github/PULL_REQUEST_TEMPLATE.md | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 7b870297..1595750b 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,4 +1,10 @@
-👉 Delete this line if you have read and agree our pull request rules and guidelines: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md#can-i-create-a-pull-request-for-uptime-kuma
+# 
+
+⚠️⚠️⚠️ Since we do not accept all types of pull requests and do not want waste your time. Please be sure that you have read pull request rules:
+https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md#can-i-create-a-pull-request-for-uptime-kuma
+
+Tick the checkbox if you understand [x]: 
+- [ ] I have read and understand the pull request rules.
 
 # Description
 

From 9a7c2d562ab6baeea96ded002ac5b8664bfb193c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 19 Sep 2022 23:15:19 +0800
Subject: [PATCH 159/803] Update PULL_REQUEST_TEMPLATE.md

---
 .github/PULL_REQUEST_TEMPLATE.md | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 1595750b..4d2105d4 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,6 +1,4 @@
-# 
-
-⚠️⚠️⚠️ Since we do not accept all types of pull requests and do not want waste your time. Please be sure that you have read pull request rules:
+⚠️⚠️⚠️ Since we do not accept all types of pull requests and do not want to waste your time. Please be sure that you have read pull request rules:
 https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md#can-i-create-a-pull-request-for-uptime-kuma
 
 Tick the checkbox if you understand [x]: 

From 565e9233fe13855d2e642892639bc6dbf3f23d4e Mon Sep 17 00:00:00 2001
From: rezzorix <72935517+rezzorix@users.noreply.github.com>
Date: Wed, 21 Sep 2022 18:27:18 +0800
Subject: [PATCH 160/803] Update stale-bot.yml

Adding "operations-per-run: 90" to ensure the action catches all 600+ items that need to be processed etc.

If not defined, the default is 30 which captures only about 200 items a run which is not enough.
---
 .github/workflows/stale-bot.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml
index 34a42d60..3f13b115 100644
--- a/.github/workflows/stale-bot.yml
+++ b/.github/workflows/stale-bot.yml
@@ -20,3 +20,4 @@ jobs:
           exempt-pr-labels: 'awaiting-approval,work-in-progress,enhancement,feature-request'
           exempt-issue-assignees: 'louislam'
           exempt-pr-assignees: 'louislam'
+          operations-per-run: 90

From c6cf600722a5167cb148d9ce898652dc87bbf1cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Buchti=C4=8D?= <martin.buchta@gmail.com>
Date: Thu, 22 Sep 2022 19:30:43 +0200
Subject: [PATCH 161/803] Update cs-CZ.js

localization improvements
---
 src/languages/cs-CZ.js | 37 ++++++++++++++++++++-----------------
 1 file changed, 20 insertions(+), 17 deletions(-)

diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
index c71075be..e9cdb992 100644
--- a/src/languages/cs-CZ.js
+++ b/src/languages/cs-CZ.js
@@ -47,10 +47,10 @@ export default {
     Down: "Nedostupný",
     Pending: "Čekám",
     Unknown: "Neznámý",
-    Pause: "Pozastavit",
+    Pause: "Pozastaveno",
     Name: "Název",
     Status: "Stav",
-    DateTime: "DateTime",
+    DateTime: "Časové razítko",
     Message: "Zpráva",
     "No important events": "Žádné důležité události",
     Resume: "Pokračovat",
@@ -77,7 +77,7 @@ export default {
     "Resend Notification if Down X times consequently": "Znovu zaslat oznámení, pokud je služba nedostupná Xkrát za sebou",
     Advanced: "Rozšířené",
     "Upside Down Mode": "Inverzní režim",
-    "Max. Redirects": "Max. Přesměrování",
+    "Max. Redirects": "Max. přesměrování",
     "Accepted Status Codes": "Akceptované stavové kódy",
     "Push URL": "Push URL",
     needPushEvery: "Tuto URL adresu byste měli volat každých {0} sekund.",
@@ -107,7 +107,7 @@ export default {
     "disableauth.message1": "Opravdu chcete <strong>deaktivovat autentifikaci</strong>?",
     "disableauth.message2": "Tato možnost je určena pro případy, kdy <strong>máte autentifikaci zajištěnou třetí stranou</strong> ještě před přístupem do Uptime Kuma, například prostřednictvím Cloudflare Access.",
     "Please use this option carefully!": "Používejte ji prosím s rozmyslem.",
-    Logout: "Odhlášení",
+    Logout: "Odhlásit",
     Leave: "Odejít",
     "I understand, please disable": "Rozumím, chci ji deaktivovat",
     Confirm: "Potvrzení",
@@ -132,7 +132,7 @@ export default {
     "Export Backup": "Exportovat zálohu",
     Export: "Exportovat",
     Import: "Importovat",
-    respTime: "Odezva Čas (ms)",
+    respTime: "Doba odezvy (ms)",
     notAvailableShort: "N/A",
     "Default enabled": "Standardně povoleno",
     "Apply on all existing monitors": "Použít pro všechny existující dohledy",
@@ -313,7 +313,7 @@ export default {
     PasswordsDoNotMatch: "Hesla se neshodují.",
     records: "záznamů",
     "One record": "Jeden záznam",
-    steamApiKeyDescription: "Pro monitorování Steam Game Servere je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
+    steamApiKeyDescription: "Pro monitorování Steam Game Serveru je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
     "Current User": "Aktuálně přihlášený uživatel",
     topic: "Topic",
     topicExplanation: "MQTT topic, který chcete sledovat",
@@ -327,7 +327,7 @@ export default {
     "Shrink Database": "Zmenšit databázi",
     "Pick a RR-Type...": "Vyberte typ záznamu o prostředku…",
     "Pick Accepted Status Codes...": "Vyberte stavové kódy, které chcete akceptovat…",
-    Default: "Standardní",
+    Default: "Výchozí",
     "HTTP Options": "Možnosti protokolu HTTP",
     "Create Incident": "Vytvořit incident",
     Title: "Předmět",
@@ -347,7 +347,7 @@ export default {
     "Last Updated": "Poslední aktualizace",
     Unpin: "Odepnout",
     "Switch to Light Theme": "Přepnout na světlý motiv",
-    "Switch to Dark Theme": "Přepnutí na tmavý motiv",
+    "Switch to Dark Theme": "Přepnout na tmavý motiv",
     "Show Tags": "Zobrazit štítky",
     "Hide Tags": "Skrýt štítky",
     Description: "Popis",
@@ -425,8 +425,8 @@ export default {
     Retry: "Opakovat",
     Topic: "Topic",
     "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Setup Proxy",
-    "Proxy Protocol": "Proxy Protocol",
+    "Setup Proxy": "Nastavit proxy",
+    "Proxy Protocol": "Protokol proxy",
     "Proxy Server": "Proxy Server",
     "Proxy server has authentication": "Proxy server vyžaduje ověření",
     User: "Uživatel",
@@ -481,7 +481,7 @@ export default {
     onebotSafetyTips: "Z důvodu bezpečnosti je nutné zadat přístupový token",
     "PushDeer Key": "PushDeer klíč",
     "Footer Text": "Text v patičce",
-    "Show Powered By": "Zobrazit \"Zajišťuje\"",
+    "Show Powered By": "Zobrazit \"Poskytuje\"",
     "Domain Names": "Názvy domén",
     signedInDisp: "Přihlášen jako {0}",
     signedInDispDisabled: "Ověření je vypnuté.",
@@ -529,9 +529,9 @@ export default {
     "pushoversounds none": "Žádný (ticho)",
     pushyAPIKey: "Secret API Key",
     pushyToken: "Token zařízení",
-    "Show update if available": "Zobrazit aktualizace, pokud jsou k dispozici",
+    "Show update if available": "Upozornit na aktualizace, pokud jsou k dispozici",
     "Also check beta release": "Kontrolovat také dostupnost beta verzí",
-    "Using a Reverse Proxy?": "Používáte reverzní proxy??",
+    "Using a Reverse Proxy?": "Používáte reverzní proxy?",
     "Check how to config it for WebSocket": "Zjistěte, jak ji nakonfigurovat pro WebSockety",
     "Steam Game Server": "Steam Game Server",
     "Most likely causes:": "Nejčastější důvody:",
@@ -545,7 +545,7 @@ export default {
     "Connection String": "Connection String",
     Query: "Dotaz",
     settingsCertificateExpiry: "Platnost TLS certifikátu",
-    certificationExpiryDescription: "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TSL certifikátu vyprší za:",
+    certificationExpiryDescription: "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:",
     "Setup Docker Host": "Nastavit Docker hostitele",
     "Connection Type": "Typ připojení",
     "Docker Daemon": "Docker Daemon",
@@ -576,7 +576,10 @@ export default {
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Následně vyberte akci, například přepnutí scény z RGB světla na červenou.",
     "Frontend Version": "Verze frontendu",
     "Frontend Version do not match backend version!": "Verze frontendu neodpovídá verzi backendu!",
-    "You can divide numbers with": "Čísla můžete rozdělit pomocí ",
-    "or": "nebo",
-    "Gateway Type": "Typ brány",
+    "Base URL": "Primární URL adresa",
+    goAlertInfo: "GoAlert je aplikace s otevřeným zdrojovým kódem pro plánování hovorů, automatické eskalace a upozornění (jako jsou SMS nebo hlasové hovory). Automaticky zapojte správnou osobu, správným způsobem a ve správný čas! {0}",
+    goAlertIntegrationKeyInfo: "Obecný API integrační klíč pro danou službu ve formátu \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" se obvykle nachází ve zkopírované URL jako hodnota parametru token.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Zastaralé: V poslední době byla funkčnost aplikace značně rozšířena, nicméně součást pro zálohování nepokrývá všechny možnosti. Z tohoto důvodu není možné vygenerovat úplnou zálohu a zajistit obnovení všech dat.",
+    backupRecommend: "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
 };

From dcbd9c12cf4ae5266595efd1e91e67771bb46ac9 Mon Sep 17 00:00:00 2001
From: rezzorix <72935517+rezzorix@users.noreply.github.com>
Date: Fri, 23 Sep 2022 21:59:38 +0800
Subject: [PATCH 162/803] Update stale-bot.yml

1. cron every 6 hours (from 24hrs)
2. close after 2 days scale (from 7)
3. operations per run 200 (from 90)
---
 .github/workflows/stale-bot.yml | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml
index 3f13b115..02ec9714 100644
--- a/.github/workflows/stale-bot.yml
+++ b/.github/workflows/stale-bot.yml
@@ -1,8 +1,8 @@
 name: 'Automatically close stale issues and PRs'
 on:
   schedule:
-    - cron: '0 0 * * *'
-#Run once a day at midnight 
+    - cron: '0 */6 * * *'
+#Run every 6 hours 
 
 jobs:
   stale:
@@ -10,14 +10,14 @@ jobs:
     steps:
       - uses: actions/stale@v5
         with:
-          stale-issue-message: 'We are clearing up our old issues and your ticket has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 7 days.'
-          stale-pr-message: 'We are clearing up our old Pull Requests and yours has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 7 days.'
-          close-issue-message: 'This issue was closed because it has been stalled for 7 days with no activity.'
-          close-pr-message: 'This PR was closed because it has been stalled for 7 days with no activity.'
+          stale-issue-message: 'We are clearing up our old issues and your ticket has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 2 days.'
+          stale-pr-message: 'We are clearing up our old Pull Requests and yours has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 2 days.'
+          close-issue-message: 'This issue was closed because it has been stalled for 2 days with no activity.'
+          close-pr-message: 'This PR was closed because it has been stalled for 2 days with no activity.'
           days-before-stale: 90
-          days-before-close: 7
+          days-before-close: 2
           exempt-issue-labels: 'News,Medium,High,discussion,bug,doc,feature-request'
           exempt-pr-labels: 'awaiting-approval,work-in-progress,enhancement,feature-request'
           exempt-issue-assignees: 'louislam'
           exempt-pr-assignees: 'louislam'
-          operations-per-run: 90
+          operations-per-run: 200

From b03624b7e33fc1d9eed953645a2142ed0f3a1088 Mon Sep 17 00:00:00 2001
From: MA Junyi <mjysci@live.com>
Date: Fri, 23 Sep 2022 23:27:22 +0800
Subject: [PATCH 163/803] feat: Add ServerChan Notification support

---
 server/notification-providers/serverchan.js | 36 +++++++++++++++++++++
 server/notification.js                      |  2 ++
 src/components/notifications/ServerChan.vue | 16 +++++++++
 src/components/notifications/index.js       |  2 ++
 4 files changed, 56 insertions(+)
 create mode 100644 server/notification-providers/serverchan.js
 create mode 100644 src/components/notifications/ServerChan.vue

diff --git a/server/notification-providers/serverchan.js b/server/notification-providers/serverchan.js
new file mode 100644
index 00000000..fbf99f80
--- /dev/null
+++ b/server/notification-providers/serverchan.js
@@ -0,0 +1,36 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const { DOWN, UP } = require("../../src/util");
+
+class ServerChan extends NotificationProvider {
+
+    name = "ServerChan";
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+        try {
+            await axios.post(`https://sctapi.ftqq.com/${notification.serverChanSendKey}.send`, {
+                "title": this.checkStatus(heartbeatJSON, monitorJSON),
+                "desp": msg,
+            });
+
+            return okMsg;
+
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+
+    checkStatus(heartbeatJSON, monitorJSON) {
+        let title = "UptimeKuma Message";
+        if (heartbeatJSON != null && heartbeatJSON["status"] === UP) {
+            title = "UptimeKuma Monitor Up " + monitorJSON["name"];
+        }
+        if (heartbeatJSON != null && heartbeatJSON["status"] === DOWN) {
+            title = "UptimeKuma Monitor Down " + monitorJSON["name"];
+        }
+        return title;
+    }
+}
+
+module.exports = ServerChan;
diff --git a/server/notification.js b/server/notification.js
index 6f71783b..3bf51243 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -40,6 +40,7 @@ const Webhook = require("./notification-providers/webhook");
 const WeCom = require("./notification-providers/wecom");
 const GoAlert = require("./notification-providers/goalert");
 const SMSManager = require("./notification-providers/smsmanager");
+const ServerChan = require("./notification-providers/serverchan");
 
 class Notification {
 
@@ -80,6 +81,7 @@ class Notification {
             new Pushover(),
             new Pushy(),
             new RocketChat(),
+            new ServerChan(),
             new SerwerSMS(),
             new Signal(),
             new SMSManager(),
diff --git a/src/components/notifications/ServerChan.vue b/src/components/notifications/ServerChan.vue
new file mode 100644
index 00000000..cec75675
--- /dev/null
+++ b/src/components/notifications/ServerChan.vue
@@ -0,0 +1,16 @@
+<template>
+    <div class="mb-3">
+        <label for="serverchan-sendkey" class="form-label">{{ $t("SendKey") }}</label>
+        <HiddenInput id="serverchan-sendkey" v-model="$parent.notification.serverChanSendKey" :required="true" autocomplete="one-time-code"></HiddenInput>
+    </div>
+</template>
+
+<script>
+import HiddenInput from "../HiddenInput.vue";
+
+export default {
+    components: {
+        HiddenInput,
+    },
+};
+</script>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 07ed2cd1..6add06ea 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -26,6 +26,7 @@ import PushDeer from "./PushDeer.vue";
 import Pushover from "./Pushover.vue";
 import Pushy from "./Pushy.vue";
 import RocketChat from "./RocketChat.vue";
+import ServerChan from "./ServerChan.vue";
 import SerwerSMS from "./SerwerSMS.vue";
 import Signal from "./Signal.vue";
 import SMSManager from "./SMSManager.vue";
@@ -85,6 +86,7 @@ const NotificationFormList = {
     "webhook": Webhook,
     "WeCom": WeCom,
     "GoAlert": GoAlert,
+    "ServerChan": ServerChan,
 };
 
 export default NotificationFormList;

From 443235b20b9db8fab84f2bf580bf50fbaa3a53c6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 24 Sep 2022 00:11:22 +0800
Subject: [PATCH 164/803] Update stale-bot.yml

---
 .github/workflows/stale-bot.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml
index 02ec9714..ae9177af 100644
--- a/.github/workflows/stale-bot.yml
+++ b/.github/workflows/stale-bot.yml
@@ -1,5 +1,6 @@
 name: 'Automatically close stale issues and PRs'
 on:
+  workflow_dispatch:
   schedule:
     - cron: '0 */6 * * *'
 #Run every 6 hours 

From 9d99c39f30dc9c2d5b9aeb0128385fc972e4a03e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 24 Sep 2022 02:33:29 +0800
Subject: [PATCH 165/803] Update Maintenance UI for recurring

---
 package-lock.json               |  25 ++++
 package.json                    |   1 +
 server/model/maintenance.js     |  10 +-
 src/assets/vue-datepicker.scss  |  39 +++++
 src/languages/en.js             |  22 ++-
 src/main.js                     |   1 +
 src/mixins/datetime.js          |   9 ++
 src/mixins/theme.js             |   4 +
 src/pages/EditMaintenance.vue   | 258 +++++++++++++++++++++++++++++---
 src/pages/ManageMaintenance.vue |   4 +
 10 files changed, 342 insertions(+), 31 deletions(-)
 create mode 100644 src/assets/vue-datepicker.scss

diff --git a/package-lock.json b/package-lock.json
index 65e380d1..82f290b4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -68,6 +68,7 @@
                 "@vitejs/plugin-legacy": "~2.1.0",
                 "@vitejs/plugin-vue": "~3.1.0",
                 "@vue/compiler-sfc": "~3.2.36",
+                "@vuepic/vue-datepicker": "^3.4.8",
                 "aedes": "^0.46.3",
                 "babel-plugin-rewire": "~1.2.0",
                 "bootstrap": "5.1.3",
@@ -3941,6 +3942,21 @@
             "integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==",
             "dev": true
         },
+        "node_modules/@vuepic/vue-datepicker": {
+            "version": "3.4.8",
+            "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-3.4.8.tgz",
+            "integrity": "sha512-nbuMA7IgjtT99LqcjSTSUcl7omTZSB+7vYSWQ9gQm31Frm/1wn54fT1Q0HaRD9nHXX982AACbqeND4K80SKONw==",
+            "dev": true,
+            "dependencies": {
+                "date-fns": "^2.29.2"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "peerDependencies": {
+                "vue": ">=3.2.0"
+            }
+        },
         "node_modules/abab": {
             "version": "2.0.6",
             "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
@@ -20409,6 +20425,15 @@
             "integrity": "sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==",
             "dev": true
         },
+        "@vuepic/vue-datepicker": {
+            "version": "3.4.8",
+            "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-3.4.8.tgz",
+            "integrity": "sha512-nbuMA7IgjtT99LqcjSTSUcl7omTZSB+7vYSWQ9gQm31Frm/1wn54fT1Q0HaRD9nHXX982AACbqeND4K80SKONw==",
+            "dev": true,
+            "requires": {
+                "date-fns": "^2.29.2"
+            }
+        },
         "abab": {
             "version": "2.0.6",
             "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
diff --git a/package.json b/package.json
index 219042aa..01bf7da0 100644
--- a/package.json
+++ b/package.json
@@ -124,6 +124,7 @@
         "@vitejs/plugin-legacy": "~2.1.0",
         "@vitejs/plugin-vue": "~3.1.0",
         "@vue/compiler-sfc": "~3.2.36",
+        "@vuepic/vue-datepicker": "^3.4.8",
         "aedes": "^0.46.3",
         "babel-plugin-rewire": "~1.2.0",
         "bootstrap": "5.1.3",
diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 1b0b9ee0..2f3e2000 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -19,6 +19,8 @@ class Maintenance extends BeanModel {
             description: this.description,
             start_date: this.start_date,
             end_date: this.end_date,
+            strategy: this.strategy,
+            active: !!this.active,
         };
     }
 
@@ -27,13 +29,7 @@ class Maintenance extends BeanModel {
      * @returns {Object}
      */
     async toJSON() {
-        return {
-            id: this.id,
-            title: this.title,
-            description: this.description,
-            start_date: this.start_date,
-            end_date: this.end_date,
-        };
+        return this.toPublicJSON();
     }
 }
 
diff --git a/src/assets/vue-datepicker.scss b/src/assets/vue-datepicker.scss
new file mode 100644
index 00000000..dedbc080
--- /dev/null
+++ b/src/assets/vue-datepicker.scss
@@ -0,0 +1,39 @@
+@import "@vuepic/vue-datepicker/dist/main.css";
+@import "vars.scss";
+
+// Must use #{ }
+// Remark: https://stackoverflow.com/questions/50202991/unable-to-set-scss-variable-to-css-variable
+.dp__theme_dark {
+    --dp-background-color: #{$dark-bg2};
+    --dp-text-color: #{$dark-font-color};
+    --dp-hover-color: #484848;
+    --dp-hover-text-color: #ffffff;
+    --dp-hover-icon-color: #959595;
+    --dp-primary-color: #{#5cdd8b};
+    --dp-primary-text-color: #ffffff;
+    --dp-secondary-color: #494949;
+    --dp-border-color: #{$dark-border-color};
+    --dp-menu-border-color: #2d2d2d;
+    --dp-border-color-hover: #{$dark-border-color};
+    --dp-disabled-color: #212121;
+    --dp-scroll-bar-background: #212121;
+    --dp-scroll-bar-color: #484848;
+    --dp-success-color: #{$primary};
+    --dp-success-color-disabled: #428f59;
+    --dp-icon-color: #959595;
+    --dp-danger-color: #e53935;
+    --dp-highlight-color: rgba(0, 92, 178, 0.2);
+}
+
+.dp__input {
+    border-radius: $border-radius;
+}
+
+// Fix: Full width of text input when using "inline textInput inlineWithInput" mode
+.dp__main > div[aria-label="Datepicker input"] {
+    width: 100%;
+}
+
+.dp__main > div[aria-label="Datepicker menu"]:nth-child(2) {
+    margin-top: 20px;
+}
diff --git a/src/languages/en.js b/src/languages/en.js
index 1a5956f7..d729d3a5 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -18,7 +18,8 @@ export default {
     "All Status Pages": "All Status Pages",
     "Selected status pages": "Selected status pages",
     "Select status pages...": "Select status pages...",
-    End: "End",
+    recurringIntervalMessage: "Run once every day | Run once every {0} days",
+    "End": "End",
     affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
     affectedStatusPages: "Show this maintenance message on selected status pages",
     atLeastOneMonitor: "Select at least one affected monitor",
@@ -61,9 +62,7 @@ export default {
     List: "List",
     Add: "Add",
     "Add Monitor": "Add Monitor",
-    "Add Maintenance": "Add Maintenance",
     "Add New Monitor": "Add New Monitor",
-    "Add New Maintenance": "Add New Maintenance",
     "Quick Stats": "Quick Stats",
     Up: "Up",
     Down: "Down",
@@ -605,4 +604,21 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
     backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
+    recurringInterval: "Interval",
+    "Recurring": "Recurring",
+    strategyManual: "Active/Inactive Manually",
+    warningTimezone: "It is NOT your current browser's timezone. It is your server's timezone.",
+    weekdayShortMon: "Mon",
+    weekdayShortTue: "Tue",
+    weekdayShortWed: "Wed",
+    weekdayShortThu: "Thu",
+    weekdayShortFri: "Fri",
+    weekdayShortSat: "Sat",
+    weekdayShortSun: "Sun",
+    dayOfMonth: "Day of Month",
+    lastDay: "Last Day",
+    lastDay1: "Last Day of Month",
+    lastDay2: "2nd Last Day of Month",
+    lastDay3: "3rd Last Day of Month",
+    lastDay4: "4th Last Day of Month",
 };
diff --git a/src/main.js b/src/main.js
index 18490908..7783882b 100644
--- a/src/main.js
+++ b/src/main.js
@@ -5,6 +5,7 @@ import Toast from "vue-toastification";
 import "vue-toastification/dist/index.css";
 import App from "./App.vue";
 import "./assets/app.scss";
+import "./assets/vue-datepicker.scss";
 import { i18n } from "./i18n";
 import { FontAwesomeIcon } from "./icon.js";
 import datetime from "./mixins/datetime";
diff --git a/src/mixins/datetime.js b/src/mixins/datetime.js
index b8e4db45..0e5317c6 100644
--- a/src/mixins/datetime.js
+++ b/src/mixins/datetime.js
@@ -26,6 +26,15 @@ export default {
             return dayjs.tz(value, this.timezone).utc().format();
         },
 
+        /**
+         * Used for <input type="datetime" />
+         * @param value
+         * @returns {string}
+         */
+        toDateTimeInputFormat(value) {
+            return this.datetimeFormat(value, "YYYY-MM-DDTHH:mm");
+        },
+
         /**
          * Return a given value in the format YYYY-MM-DD HH:mm:ss
          * @param {any} value Value to format as date time
diff --git a/src/mixins/theme.js b/src/mixins/theme.js
index 58f4d91b..8d225267 100644
--- a/src/mixins/theme.js
+++ b/src/mixins/theme.js
@@ -46,6 +46,10 @@ export default {
                 }
                 return this.userTheme;
             }
+        },
+
+        isDark() {
+            return this.theme === "dark";
         }
     },
 
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index f010ca8e..98d5c2b2 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -7,7 +7,7 @@
                     <div class="row">
                         <div class="col-xl-7">
                             <!-- Title -->
-                            <div class="my-3">
+                            <div class="mb-3">
                                 <label for="name" class="form-label">{{ $t("Title") }}</label>
                                 <input
                                     id="name" v-model="maintenance.title" type="text" class="form-control"
@@ -35,7 +35,6 @@
                                     track-by="id"
                                     label="name"
                                     :multiple="true"
-                                    :allow-empty="false"
                                     :close-on-select="false"
                                     :clear-on-select="false"
                                     :preserve-search="true"
@@ -70,7 +69,6 @@
                                         track-by="id"
                                         label="name"
                                         :multiple="true"
-                                        :allow-empty="true"
                                         :close-on-select="false"
                                         :clear-on-select="false"
                                         :preserve-search="true"
@@ -82,25 +80,131 @@
                                 </div>
                             </div>
 
-                            <h2 class="mt-5">{{ $t("Effective Date Range") }}</h2>
+                            <h2 class="mt-5">{{ $t("Date and Time") }}</h2>
 
-                            <!-- Start Date Time -->
+                            <div>⚠️ {{ $t("warningTimezone") }}</div>
+
+                            <!-- Strategy -->
                             <div class="my-3">
-                                <label for="start_date" class="form-label">{{ $t("Start Date") }}</label>
-                                <input
-                                    id="start_date" v-model="maintenance.start_date" :type="'datetime-local'"
-                                    class="form-control" :class="{'dark-calendar': dark }" required
-                                >
+                                <label for="strategy" class="form-label">{{ $t("Strategy") }}</label>
+                                <select id="strategy" v-model="maintenance.strategy" class="form-select">
+                                    <option value="manual">{{ $t("strategyManual") }}</option>
+                                    <option value="single">Single Maintenance Window</option>
+                                    <option value="recurring-interval">{{ $t("Recurring") }} - {{ $t("recurringInterval") }}</option>
+                                    <option value="recurring-weekday">{{ $t("Recurring") }} - Weekday</option>
+                                    <option value="recurring-day-of-month">{{ $t("Recurring") }} - Day of Month</option>
+                                    <option v-if="false" value="recurring-day-of-year">{{ $t("Recurring") }} - Day of Year</option>
+                                </select>
                             </div>
 
-                            <!-- End Date Time -->
-                            <div class="my-3">
-                                <label for="end_date" class="form-label">{{ $t("End Date") }}</label>
-                                <input
-                                    id="end_date" v-model="maintenance.end_date" :type="'datetime-local'"
-                                    class="form-control" :class="{'dark-calendar': dark }" required
-                                >
-                            </div>
+                            <!-- Single Maintenance Window -->
+                            <template v-if="maintenance.strategy === 'single'">
+                                <!-- DateTime Range -->
+                                <div class="my-3">
+                                    <label class="form-label">{{ $t("DateTime Range") }}</label>
+                                    <Datepicker
+                                        v-model="maintenance.dateTimeRange"
+                                        :dark="$root.isDark"
+                                        range textInput
+                                        :monthChangeOnScroll="false"
+                                        :minDate="minDate"
+                                        format="yyyy-MM-dd HH:mm"
+                                        utc="preserve"
+                                    />
+                                </div>
+                            </template>
+
+                            <!-- Recurring - Interval -->
+                            <template v-if="maintenance.strategy === 'recurring-interval'">
+                                <div class="my-3">
+                                    <label for="interval-day" class="form-label">
+                                        {{ $t("recurringInterval") }}
+
+                                        <template v-if="maintenance.intervalDay >= 1">
+                                            ({{
+                                                $tc("recurringIntervalMessage", maintenance.intervalDay, [
+                                                    maintenance.intervalDay
+                                                ])
+                                            }})
+                                        </template>
+                                    </label>
+                                    <input id="interval-day" v-model="maintenance.intervalDay" type="number" class="form-control" required min="1" max="3650" step="1">
+                                </div>
+                            </template>
+
+                            <!-- Recurring - Weekday -->
+                            <template v-if="maintenance.strategy === 'recurring-weekday'">
+                                <div class="my-3">
+                                    <label for="interval-day" class="form-label">
+                                        {{ $t("Weekday") }}
+                                    </label>
+
+                                    <!-- Weekday Picker -->
+                                    <div class="weekday-picker">
+                                        <div v-for="(weekday, index) in weekdays" :key="index">
+                                            <label class="form-check-label" :for="weekday.id">{{ $t(weekday.langKey) }}</label>
+                                            <div class="form-check-inline"><input :id="weekday.id" v-model="maintenance.weekdays" type="checkbox" :value="weekday.value" class="form-check-input"></div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </template>
+
+                            <!-- Recurring - Day of month -->
+                            <template v-if="maintenance.strategy === 'recurring-day-of-month'">
+                                <div class="my-3">
+                                    <label for="interval-day" class="form-label">
+                                        {{ $t("dayOfMonth") }}
+                                    </label>
+
+                                    <!-- Day Picker -->
+                                    <div class="day-picker">
+                                        <div v-for="index in 31" :key="index">
+                                            <label class="form-check-label" :for="'day' + index">{{ index }}</label>
+                                            <div class="form-check-inline">
+                                                <input :id="'day' + index" v-model="maintenance.daysOfMonth" type="checkbox" :value="index" class="form-check-input">
+                                            </div>
+                                        </div>
+                                    </div>
+
+                                    <div class="mt-3 mb-2">{{ $t("lastDay") }}</div>
+
+                                    <div v-for="(lastDay, index) in lastDays" :key="index" class="form-check">
+                                        <input :id="lastDay.langKey" v-model="maintenance.daysOfMonth" type="checkbox" :value="lastDay.value" class="form-check-input">
+                                        <label class="form-check-label" :for="lastDay.langKey">
+                                            {{ $t(lastDay.langKey) }}
+                                        </label>
+                                    </div>
+                                </div>
+                            </template>
+
+                            <!-- For any recurring types -->
+                            <template v-if="maintenance.strategy === 'recurring-interval' || maintenance.strategy === 'recurring-weekday' || maintenance.strategy === 'recurring-day-of-month'">
+                                <!-- Maintenance Time Window of a Day -->
+                                <div class="my-3">
+                                    <label class="form-label">{{ $t("Maintenance Time Window of a Day") }}</label>
+                                    <Datepicker
+                                        v-model="maintenance.timeRange"
+                                        :dark="$root.isDark"
+                                        timePicker disableTimeRangeValidation range
+                                        placeholder="Select Time"
+                                        textInput
+                                    />
+                                </div>
+
+                                <!-- Date Range -->
+                                <div class="my-3">
+                                    <label class="form-label">{{ $t("Effective Date Range") }}</label>
+                                    <Datepicker
+                                        v-model="maintenance.dateRange"
+                                        :dark="$root.isDark"
+                                        range textInput datePicker
+                                        :monthChangeOnScroll="false"
+                                        :minDate="minDate"
+                                        :enableTimePicker="false"
+                                        utc="preserve"
+                                    />
+                                </div>
+                            </template>
 
                             <div class="mt-4 mb-1">
                                 <button
@@ -122,12 +226,15 @@
 
 import { useToast } from "vue-toastification";
 import VueMultiselect from "vue-multiselect";
+import dayjs from "dayjs";
+import Datepicker from "@vuepic/vue-datepicker";
 
 const toast = useToast();
 
 export default {
     components: {
         VueMultiselect,
+        Datepicker
     },
 
     data() {
@@ -139,6 +246,63 @@ export default {
             showOnAllPages: false,
             selectedStatusPages: [],
             dark: (this.$root.theme === "dark"),
+            neverEnd: false,
+            minDate: this.$root.date(dayjs()) + " 00:00",
+            lastDays: [
+                {
+                    langKey: "lastDay1",
+                    value: "lastDay1",
+                },
+                {
+                    langKey: "lastDay2",
+                    value: "lastDay2",
+                },
+                {
+                    langKey: "lastDay3",
+                    value: "lastDay3",
+                },
+                {
+                    langKey: "lastDay4",
+                    value: "lastDay4",
+                }
+            ],
+            weekdays: [
+                {
+                    id: "weekday1",
+                    langKey: "weekdayShortMon",
+                    value: 1,
+                },
+                {
+                    id: "weekday2",
+                    langKey: "weekdayShortTue",
+                    value: 2,
+                },
+                {
+                    id: "weekday3",
+                    langKey: "weekdayShortWed",
+                    value: 3,
+                },
+                {
+                    id: "weekday4",
+                    langKey: "weekdayShortTue",
+                    value: 4,
+                },
+                {
+                    id: "weekday5",
+                    langKey: "weekdayShortFri",
+                    value: 5,
+                },
+                {
+                    id: "weekday6",
+                    langKey: "weekdayShortSat",
+                    value: 6,
+                },
+                {
+                    id: "weekday7",
+                    langKey: "weekdayShortSun",
+                    value: 7,
+                },
+            ],
         };
     },
 
@@ -169,8 +333,13 @@ export default {
     watch: {
         "$route.fullPath"() {
             this.init();
-        }
+        },
 
+        neverEnd(value) {
+            if (value) {
+                this.maintenance.recurringEndDate = "";
+            }
+        },
     },
     mounted() {
         this.init();
@@ -195,8 +364,21 @@ export default {
                 this.maintenance = {
                     title: "",
                     description: "",
-                    start_date: "",
-                    end_date: "",
+                    strategy: "single",
+                    active: 1,
+                    recurringStartDate: this.$root.date(dayjs()),
+                    recurringEndDate: "",
+                    intervalDay: 1,
+                    dateTimeRange: [ this.minDate ],
+                    timeRange: [{
+                        hours: 2,
+                        minutes: 0,
+                    }, {
+                        hours: 3,
+                        minutes: 0,
+                    }],
+                    weekdays: [],
+                    daysOfMonth: [],
                 };
             } else if (this.isEdit) {
                 this.$root.getSocket().emit("getMaintenance", this.$route.params.id, (res) => {
@@ -332,4 +514,38 @@ textarea {
 .dark-calendar::-webkit-calendar-picker-indicator {
     filter: invert(1);
 }
+
+.weekday-picker {
+    display: flex;
+    gap: 10px;
+
+    & > div {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        width: 40px;
+
+        .form-check-inline {
+            margin-right: 0;
+        }
+    }
+}
+
+.day-picker {
+    display: flex;
+    gap: 10px;
+    flex-wrap: wrap;
+
+    & > div {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        width: 40px;
+
+        .form-check-inline {
+            margin-right: 0;
+        }
+    }
+}
+
 </style>
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index bcd47acf..4bfa9059 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -44,6 +44,10 @@
                 </div>
             </div>
 
+            <div class="text-center mt-3" style="font-size: 13px;">
+                <a href="https://github.com/louislam/uptime-kuma/wiki/Maintenance" target="_blank">Learn More</a>
+            </div>
+
             <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteMaintenance">
                 {{ $t("deleteMaintenanceMsg") }}
             </Confirm>

From f11dfc8f437cb8e2ee9c77c9450bffc4d5e121af Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 24 Sep 2022 19:18:24 +0800
Subject: [PATCH 166/803] [WIP] Add/Edit Maintenance with new UI and recurring

---
 server/model/maintenance.js                   | 81 ++++++++++++++++++-
 .../maintenance-socket-handler.js             | 11 ++-
 src/pages/EditMaintenance.vue                 |  6 +-
 src/util.js                                   | 44 +++++++++-
 src/util.ts                                   | 49 +++++++++++
 5 files changed, 179 insertions(+), 12 deletions(-)

diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 2f3e2000..a27a358b 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -4,6 +4,8 @@ let timezone = require("dayjs/plugin/timezone");
 dayjs.extend(utc);
 dayjs.extend(timezone);
 const { BeanModel } = require("redbean-node/dist/bean-model");
+const { parseVueDatePickerTimeFormat, parseTimeFormatFromVueDatePicker } = require("../../src/util");
+const { isArray } = require("chart.js/helpers");
 
 class Maintenance extends BeanModel {
 
@@ -13,15 +15,52 @@ class Maintenance extends BeanModel {
      * @returns {Object}
      */
     async toPublicJSON() {
-        return {
+
+        let dateTimeRange = [];
+        if (this.start_datetime) {
+            dateTimeRange.push( this.start_datetime);
+            if (this.end_datetime) {
+                dateTimeRange.push( this.end_datetime);
+            }
+        }
+
+        let dateRange = [];
+        if (this.start_date) {
+            dateRange.push( this.start_date);
+            if (this.end_date) {
+                dateRange.push( this.end_date);
+            }
+        }
+
+        let timeRange = [];
+        let startTime = parseVueDatePickerTimeFormat(this.start_time);
+        timeRange.push(startTime);
+        let endTime = parseVueDatePickerTimeFormat(this.end_time);
+        timeRange.push(endTime);
+
+        let obj = {
             id: this.id,
             title: this.title,
             description: this.description,
-            start_date: this.start_date,
-            end_date: this.end_date,
             strategy: this.strategy,
+            intervalDay: this.interval_day,
             active: !!this.active,
+            dateTimeRange: dateTimeRange,
+            dateRange: dateRange,
+            timeRange: timeRange,
+            weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [],
+            daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [],
         };
+
+        if (!isArray(obj.weekdays)) {
+            obj.weekdays = [];
+        }
+
+        if (!isArray(obj.daysOfMonth)) {
+            obj.daysOfMonth = [];
+        }
+
+        return obj;
     }
 
     /**
@@ -31,6 +70,42 @@ class Maintenance extends BeanModel {
     async toJSON() {
         return this.toPublicJSON();
     }
+
+    static jsonToBean(bean, obj) {
+        if (obj.id) {
+            bean.id = obj.id;
+        }
+
+        bean.title = obj.title;
+        bean.description = obj.description;
+        bean.strategy = obj.strategy;
+        bean.interval_day = obj.intervalDay;
+        bean.active = obj.active;
+
+        if (obj.dateRange[0]) {
+            bean.start_date = obj.dateRange[0];
+
+            if (obj.dateRange[1]) {
+                bean.end_date = obj.dateRange[1];
+            }
+        }
+
+        if (obj.dateTimeRange[0]) {
+            bean.start_datetime = obj.dateTimeRange[0];
+
+            if (obj.dateTimeRange[1]) {
+                bean.end_datetime = obj.dateTimeRange[1];
+            }
+        }
+
+        bean.start_time = parseTimeFormatFromVueDatePicker(obj.timeRange[0]);
+        bean.end_time = parseTimeFormatFromVueDatePicker(obj.timeRange[1]);
+
+        bean.weekdays = JSON.stringify(obj.weekdays);
+        bean.days_of_month = JSON.stringify(obj.daysOfMonth);
+
+        return bean;
+    }
 }
 
 module.exports = Maintenance;
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index 113c336a..df4a9a35 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -3,6 +3,7 @@ const { log } = require("../../src/util");
 const { R } = require("redbean-node");
 const apicache = require("../modules/apicache");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
+const Maintenance = require("../model/maintenance");
 const server = UptimeKumaServer.getInstance();
 
 /**
@@ -14,9 +15,10 @@ module.exports.maintenanceSocketHandler = (socket) => {
     socket.on("addMaintenance", async (maintenance, callback) => {
         try {
             checkLogin(socket);
-            let bean = R.dispense("maintenance");
 
-            bean.import(maintenance);
+            log.debug("maintenance", maintenance);
+
+            let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance);
             bean.user_id = socket.userID;
             let maintenanceID = await R.store(bean);
 
@@ -47,10 +49,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
                 throw new Error("Permission denied.");
             }
 
-            bean.title = maintenance.title;
-            bean.description = maintenance.description;
-            bean.start_date = maintenance.start_date;
-            bean.end_date = maintenance.end_date;
+            Maintenance.jsonToBean(bean, maintenance);
 
             await R.store(bean);
 
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 98d5c2b2..3d8ab838 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -366,10 +366,9 @@ export default {
                     description: "",
                     strategy: "single",
                     active: 1,
-                    recurringStartDate: this.$root.date(dayjs()),
-                    recurringEndDate: "",
                     intervalDay: 1,
                     dateTimeRange: [ this.minDate ],
+                    dateRange: [],
                     timeRange: [{
                         hours: 2,
                         minutes: 0,
@@ -426,6 +425,8 @@ export default {
                 return this.processing = false;
             }
 
+            /*
+            TODO: Temporary disable
             if (this.maintenance.start_date >= this.maintenance.end_date) {
                 toast.error(this.$t("maintenanceInvalidDate"));
                 return this.processing = false;
@@ -438,6 +439,7 @@ export default {
 
             this.maintenance.start_date = this.$root.toUTC(this.maintenance.start_date);
             this.maintenance.end_date = this.$root.toUTC(this.maintenance.end_date);
+            */
 
             if (this.isAdd) {
                 this.$root.addMaintenance(this.maintenance, async (res) => {
diff --git a/src/util.js b/src/util.js
index c5fca856..73f5369d 100644
--- a/src/util.js
+++ b/src/util.js
@@ -7,7 +7,7 @@
 // Backend uses the compiled file util.js
 // Frontend uses util.ts
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
+exports.parseTimeFormatFromVueDatePicker = exports.parseVueDatePickerTimeFormat = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
 const _dayjs = require("dayjs");
 const dayjs = _dayjs;
 exports.isDev = process.env.NODE_ENV === "development";
@@ -309,3 +309,45 @@ function getMaintenanceRelativeURL(id) {
     return "/maintenance/" + id;
 }
 exports.getMaintenanceRelativeURL = getMaintenanceRelativeURL;
+/**
+ * Parse to Time Object that used in VueDatePicker
+ * @param {string} time E.g. 12:00
+ * @returns object
+ */
+function parseVueDatePickerTimeFormat(time) {
+    if (!time) {
+        return {
+            hours: 0,
+            minutes: 0,
+        };
+    }
+    let array = time.split(":");
+    if (array.length < 2) {
+        throw new Error("parseVueDatePickerTimeFormat: Invalid Time");
+    }
+    let obj = {
+        hours: parseInt(array[0]),
+        minutes: parseInt(array[1]),
+        seconds: 0,
+    };
+    if (array.length >= 3) {
+        obj.seconds = parseInt(array[2]);
+    }
+    return obj;
+}
+exports.parseVueDatePickerTimeFormat = parseVueDatePickerTimeFormat;
+/**
+ * @returns string e.g. 12:00
+ */
+function parseTimeFormatFromVueDatePicker(obj) {
+    if (!obj) {
+        return obj;
+    }
+    let result = "";
+    result += obj.hours.toString().padStart(2, "0") + ":" + obj.minutes.toString().padStart(2, "0");
+    if (obj.seconds) {
+        result += ":" + obj.seconds.toString().padStart(2, "0");
+    }
+    return result;
+}
+exports.parseTimeFormatFromVueDatePicker = parseTimeFormatFromVueDatePicker;
diff --git a/src/util.ts b/src/util.ts
index 0dd8a62a..92da0fd5 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -342,3 +342,52 @@ export function getMonitorRelativeURL(id: string) {
 export function getMaintenanceRelativeURL(id: string) {
     return "/maintenance/" + id;
 }
+
+/**
+ * Parse to Time Object that used in VueDatePicker
+ * @param {string} time E.g. 12:00
+ * @returns object
+ */
+export function parseVueDatePickerTimeFormat(time: string) {
+    if (!time) {
+        return {
+            hours: 0,
+            minutes: 0,
+        };
+    }
+
+    let array = time.split(":");
+
+    if (array.length < 2) {
+        throw new Error("parseVueDatePickerTimeFormat: Invalid Time");
+    }
+
+    let obj =  {
+        hours: parseInt(array[0]),
+        minutes: parseInt(array[1]),
+        seconds: 0,
+    }
+    if (array.length >= 3) {
+        obj.seconds = parseInt(array[2]);
+    }
+    return obj;
+}
+
+/**
+ * @returns string e.g. 12:00
+ */
+export function parseTimeFormatFromVueDatePicker(obj : any) {
+    if (!obj) {
+        return obj;
+    }
+
+    let result = "";
+
+    result += obj.hours.toString().padStart(2, "0") + ":" + obj.minutes.toString().padStart(2, "0")
+
+    if (obj.seconds) {
+        result += ":" +  obj.seconds.toString().padStart(2, "0")
+    }
+
+    return result;
+}

From 3f63cb246b2d973fe175ddbe4e34cca34ab4d8e4 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 25 Sep 2022 19:38:28 +0800
Subject: [PATCH 167/803] [WIP] Handle timezone offset for timeRange

---
 server/model/maintenance.js                   | 41 +++++++++++++----
 .../maintenance-socket-handler.js             | 17 ++++---
 server/util-server.js                         | 46 +++++++++++++++++++
 src/languages/en.js                           |  2 +-
 src/pages/EditMaintenance.vue                 | 21 +++++----
 src/util.js                                   | 10 ++--
 src/util.ts                                   |  5 +-
 7 files changed, 110 insertions(+), 32 deletions(-)

diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index a27a358b..3b07d5f7 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -4,17 +4,19 @@ let timezone = require("dayjs/plugin/timezone");
 dayjs.extend(utc);
 dayjs.extend(timezone);
 const { BeanModel } = require("redbean-node/dist/bean-model");
-const { parseVueDatePickerTimeFormat, parseTimeFormatFromVueDatePicker } = require("../../src/util");
+const { parseTimeObject, parseTimeFromTimeObject } = require("../../src/util");
 const { isArray } = require("chart.js/helpers");
+const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
 
 class Maintenance extends BeanModel {
 
     /**
      * Return an object that ready to parse to JSON for public
      * Only show necessary data to public
+     * @param {string} timezone If not specified, the timeRange will be in UTC
      * @returns {Object}
      */
-    async toPublicJSON() {
+    async toPublicJSON(timezone = null) {
 
         let dateTimeRange = [];
         if (this.start_datetime) {
@@ -33,11 +35,21 @@ class Maintenance extends BeanModel {
         }
 
         let timeRange = [];
-        let startTime = parseVueDatePickerTimeFormat(this.start_time);
+        let startTime = parseTimeObject(this.start_time);
         timeRange.push(startTime);
-        let endTime = parseVueDatePickerTimeFormat(this.end_time);
+        let endTime = parseTimeObject(this.end_time);
         timeRange.push(endTime);
 
+        // Apply timezone offset
+        if (timezone) {
+            if (this.start_time) {
+                timeObjectToLocal(startTime, timezone);
+            }
+            if (this.end_time) {
+                timeObjectToLocal(endTime, timezone);
+            }
+        }
+
         let obj = {
             id: this.id,
             title: this.title,
@@ -65,17 +77,28 @@ class Maintenance extends BeanModel {
 
     /**
      * Return an object that ready to parse to JSON
+     * @param {string} timezone If not specified, the timeRange will be in UTC
      * @returns {Object}
      */
-    async toJSON() {
-        return this.toPublicJSON();
+    async toJSON(timezone = null) {
+        return this.toPublicJSON(timezone);
     }
 
-    static jsonToBean(bean, obj) {
+    static jsonToBean(bean, obj, timezone) {
         if (obj.id) {
             bean.id = obj.id;
         }
 
+        // Apply timezone offset to timeRange, as it cannot apply automatically.
+        if (timezone) {
+            if (obj.timeRange[0]) {
+                timeObjectToUTC(obj.timeRange[0], timezone);
+                if (obj.timeRange[1]) {
+                    timeObjectToUTC(obj.timeRange[1], timezone);
+                }
+            }
+        }
+
         bean.title = obj.title;
         bean.description = obj.description;
         bean.strategy = obj.strategy;
@@ -98,8 +121,8 @@ class Maintenance extends BeanModel {
             }
         }
 
-        bean.start_time = parseTimeFormatFromVueDatePicker(obj.timeRange[0]);
-        bean.end_time = parseTimeFormatFromVueDatePicker(obj.timeRange[1]);
+        bean.start_time = parseTimeFromTimeObject(obj.timeRange[0]);
+        bean.end_time = parseTimeFromTimeObject(obj.timeRange[1]);
 
         bean.weekdays = JSON.stringify(obj.weekdays);
         bean.days_of_month = JSON.stringify(obj.daysOfMonth);
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index df4a9a35..604f07bd 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -5,6 +5,11 @@ const apicache = require("../modules/apicache");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const Maintenance = require("../model/maintenance");
 const server = UptimeKumaServer.getInstance();
+const dayjs = require("dayjs");
+const utc = require("dayjs/plugin/utc");
+let timezone = require("dayjs/plugin/timezone");
+dayjs.extend(utc);
+dayjs.extend(timezone);
 
 /**
  * Handlers for Maintenance
@@ -12,13 +17,13 @@ const server = UptimeKumaServer.getInstance();
  */
 module.exports.maintenanceSocketHandler = (socket) => {
     // Add a new maintenance
-    socket.on("addMaintenance", async (maintenance, callback) => {
+    socket.on("addMaintenance", async (maintenance, timezone, callback) => {
         try {
             checkLogin(socket);
 
             log.debug("maintenance", maintenance);
 
-            let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance);
+            let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance, timezone);
             bean.user_id = socket.userID;
             let maintenanceID = await R.store(bean);
 
@@ -39,7 +44,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
     });
 
     // Edit a maintenance
-    socket.on("editMaintenance", async (maintenance, callback) => {
+    socket.on("editMaintenance", async (maintenance, timezone, callback) => {
         try {
             checkLogin(socket);
 
@@ -49,7 +54,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
                 throw new Error("Permission denied.");
             }
 
-            Maintenance.jsonToBean(bean, maintenance);
+            Maintenance.jsonToBean(bean, maintenance, timezone);
 
             await R.store(bean);
 
@@ -138,7 +143,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
         }
     });
 
-    socket.on("getMaintenance", async (maintenanceID, callback) => {
+    socket.on("getMaintenance", async (maintenanceID, timezone, callback) => {
         try {
             checkLogin(socket);
 
@@ -151,7 +156,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
 
             callback({
                 ok: true,
-                maintenance: await bean.toJSON(),
+                maintenance: await bean.toJSON(timezone),
             });
 
         } catch (e) {
diff --git a/server/util-server.js b/server/util-server.js
index 1517bcfe..cc5e478d 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -21,6 +21,11 @@ const {
         rfc2865: { file, attributes },
     },
 } = require("node-radius-utils");
+const dayjs = require("dayjs");
+const utc = require("dayjs/plugin/utc");
+let timezone = require("dayjs/plugin/timezone");
+dayjs.extend(utc);
+dayjs.extend(timezone);
 
 // From ping-lite
 exports.WIN = /^win/.test(process.platform);
@@ -645,3 +650,44 @@ module.exports.send403 = (res, msg = "") => {
         "msg": msg,
     });
 };
+
+function timeObjectConvertTimezone(obj, timezone, timeObjectToUTC = true) {
+    // e.g. +08:00
+    let offsetString = dayjs().tz(timezone).format("Z");
+    let hours = parseInt(offsetString.substring(1, 3));
+    let minutes = parseInt(offsetString.substring(4, 6));
+
+    if (
+        (timeObjectToUTC && offsetString.startsWith("+")) ||
+        (!timeObjectToUTC && offsetString.startsWith("-"))
+    ) {
+        hours *= -1;
+        minutes *= -1;
+    }
+
+    obj.hours += hours;
+    obj.minutes += minutes;
+
+    // Handle out of bound
+    if (obj.hours < 0) {
+        obj.hours += 24;
+    } else if (obj.hours > 24) {
+        obj.hours -= 24;
+    }
+
+    if (obj.minutes < 0) {
+        obj.minutes += 24;
+    } else if (obj.minutes > 24) {
+        obj.minutes -= 24;
+    }
+
+    return obj;
+}
+
+module.exports.timeObjectToUTC = (obj, timezone) => {
+    return timeObjectConvertTimezone(obj, timezone, true);
+};
+
+module.exports.timeObjectToLocal = (obj, timezone) => {
+    return timeObjectConvertTimezone(obj, timezone, false);
+};
diff --git a/src/languages/en.js b/src/languages/en.js
index d729d3a5..e77a31f4 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -607,7 +607,7 @@ export default {
     recurringInterval: "Interval",
     "Recurring": "Recurring",
     strategyManual: "Active/Inactive Manually",
-    warningTimezone: "It is NOT your current browser's timezone. It is your server's timezone.",
+    warningTimezone: "It is using your current Device/PC's timezone.",
     weekdayShortMon: "Mon",
     weekdayShortTue: "Tue",
     weekdayShortWed: "Wed",
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 3d8ab838..640962d7 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -109,7 +109,6 @@
                                         :monthChangeOnScroll="false"
                                         :minDate="minDate"
                                         format="yyyy-MM-dd HH:mm"
-                                        utc="preserve"
                                     />
                                 </div>
                             </template>
@@ -185,8 +184,8 @@
                                     <Datepicker
                                         v-model="maintenance.timeRange"
                                         :dark="$root.isDark"
-                                        timePicker disableTimeRangeValidation range
-                                        placeholder="Select Time"
+                                        timePicker
+                                        disableTimeRangeValidation range
                                         textInput
                                     />
                                 </div>
@@ -201,7 +200,7 @@
                                         :monthChangeOnScroll="false"
                                         :minDate="minDate"
                                         :enableTimePicker="false"
-                                        utc="preserve"
+                                        :utc="true"
                                     />
                                 </div>
                             </template>
@@ -357,6 +356,9 @@ export default {
     },
     methods: {
         init() {
+            // Use browser's timezone!
+            let timezone = dayjs.tz.guess();
+
             this.affectedMonitors = [];
             this.selectedStatusPages = [];
 
@@ -380,10 +382,8 @@ export default {
                     daysOfMonth: [],
                 };
             } else if (this.isEdit) {
-                this.$root.getSocket().emit("getMaintenance", this.$route.params.id, (res) => {
+                this.$root.getSocket().emit("getMaintenance", this.$route.params.id, timezone, (res) => {
                     if (res.ok) {
-                        res.maintenance.start_date = this.$root.datetimeFormat(res.maintenance.start_date, "YYYY-MM-DDTHH:mm");
-                        res.maintenance.end_date = this.$root.datetimeFormat(res.maintenance.end_date, "YYYY-MM-DDTHH:mm");
                         this.maintenance = res.maintenance;
 
                         this.$root.getSocket().emit("getMonitorMaintenance", this.$route.params.id, (res) => {
@@ -441,8 +441,11 @@ export default {
             this.maintenance.end_date = this.$root.toUTC(this.maintenance.end_date);
             */
 
+            // Use browser's timezone!
+            let timezone = dayjs.tz.guess();
+
             if (this.isAdd) {
-                this.$root.addMaintenance(this.maintenance, async (res) => {
+                this.$root.addMaintenance(this.maintenance, timezone, async (res) => {
                     if (res.ok) {
                         await this.addMonitorMaintenance(res.maintenanceID, async () => {
                             await this.addMaintenanceStatusPage(res.maintenanceID, () => {
@@ -459,7 +462,7 @@ export default {
 
                 });
             } else {
-                this.$root.getSocket().emit("editMaintenance", this.maintenance, async (res) => {
+                this.$root.getSocket().emit("editMaintenance", this.maintenance, timezone, async (res) => {
                     if (res.ok) {
                         await this.addMonitorMaintenance(res.maintenanceID, async () => {
                             await this.addMaintenanceStatusPage(res.maintenanceID, () => {
diff --git a/src/util.js b/src/util.js
index 73f5369d..15427cdd 100644
--- a/src/util.js
+++ b/src/util.js
@@ -7,7 +7,7 @@
 // Backend uses the compiled file util.js
 // Frontend uses util.ts
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.parseTimeFormatFromVueDatePicker = exports.parseVueDatePickerTimeFormat = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
+exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
 const _dayjs = require("dayjs");
 const dayjs = _dayjs;
 exports.isDev = process.env.NODE_ENV === "development";
@@ -314,7 +314,7 @@ exports.getMaintenanceRelativeURL = getMaintenanceRelativeURL;
  * @param {string} time E.g. 12:00
  * @returns object
  */
-function parseVueDatePickerTimeFormat(time) {
+function parseTimeObject(time) {
     if (!time) {
         return {
             hours: 0,
@@ -335,11 +335,11 @@ function parseVueDatePickerTimeFormat(time) {
     }
     return obj;
 }
-exports.parseVueDatePickerTimeFormat = parseVueDatePickerTimeFormat;
+exports.parseTimeObject = parseTimeObject;
 /**
  * @returns string e.g. 12:00
  */
-function parseTimeFormatFromVueDatePicker(obj) {
+function parseTimeFromTimeObject(obj) {
     if (!obj) {
         return obj;
     }
@@ -350,4 +350,4 @@ function parseTimeFormatFromVueDatePicker(obj) {
     }
     return result;
 }
-exports.parseTimeFormatFromVueDatePicker = parseTimeFormatFromVueDatePicker;
+exports.parseTimeFromTimeObject = parseTimeFromTimeObject;
diff --git a/src/util.ts b/src/util.ts
index 92da0fd5..cb51250b 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -348,7 +348,7 @@ export function getMaintenanceRelativeURL(id: string) {
  * @param {string} time E.g. 12:00
  * @returns object
  */
-export function parseVueDatePickerTimeFormat(time: string) {
+export function parseTimeObject(time: string) {
     if (!time) {
         return {
             hours: 0,
@@ -376,7 +376,7 @@ export function parseVueDatePickerTimeFormat(time: string) {
 /**
  * @returns string e.g. 12:00
  */
-export function parseTimeFormatFromVueDatePicker(obj : any) {
+export function parseTimeFromTimeObject(obj : any) {
     if (!obj) {
         return obj;
     }
@@ -391,3 +391,4 @@ export function parseTimeFormatFromVueDatePicker(obj : any) {
 
     return result;
 }
+

From 4157c7d5463a7467c849dd71fd2d17b846b81c95 Mon Sep 17 00:00:00 2001
From: Patrick <patrick@hindmar.sh>
Date: Mon, 26 Sep 2022 22:16:34 +1300
Subject: [PATCH 168/803] Add support for Squadcast incoming webhook

---
 server/notification-providers/squadcast.js | 76 ++++++++++++++++++++++
 server/notification.js                     |  2 +
 src/components/notifications/Squadcast.vue |  6 ++
 src/components/notifications/index.js      |  2 +
 src/languages/en.js                        |  1 +
 5 files changed, 87 insertions(+)
 create mode 100644 server/notification-providers/squadcast.js
 create mode 100644 src/components/notifications/Squadcast.vue

diff --git a/server/notification-providers/squadcast.js b/server/notification-providers/squadcast.js
new file mode 100644
index 00000000..0302cb6f
--- /dev/null
+++ b/server/notification-providers/squadcast.js
@@ -0,0 +1,76 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const { DOWN, UP } = require("../../src/util");
+
+class Squadcast extends NotificationProvider {
+
+    name = "squadcast";
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+
+        try {
+
+            let config = {};
+            let data = {
+                message: msg,
+                description: '',
+                tags: {},
+                heartbeat: heartbeatJSON,
+                source: 'uptime-kuma'
+            }
+
+            if (heartbeatJSON !== null) {
+                data.description = heartbeatJSON["msg"];
+                data.event_id = heartbeatJSON["monitorID"];
+
+                if (heartbeatJSON["status"] === DOWN) {
+                    data.message = `${monitorJSON['name']} is DOWN`;
+                    data.status = "trigger";
+                } else {
+                    data.message = `${monitorJSON['name']} is UP`;
+                    data.status = "resolve";
+                }
+
+                let address;
+                switch (monitorJSON["type"]) {
+                    case "ping":
+                        address = monitorJSON["hostname"];
+                        break;
+                    case "port":
+                    case "dns":
+                    case "steam":
+                        address = monitorJSON["hostname"];
+                        if (monitorJSON["port"]) {
+                            address += ":" + monitorJSON["port"];
+                        }
+                        break;
+                    default:
+                        address = monitorJSON["url"];
+                        break;
+                }
+
+                data.tags["AlertAddress"] = address;
+
+                monitorJSON["tags"].forEach(tag => {
+                    data.tags[tag["name"]] = {
+                        value: tag["value"]
+                    };
+                    if (tag["color"] !== null) {
+                        data.tags[tag["name"]]["color"] = tag["color"]
+                    }
+                });
+            }
+
+            await axios.post(notification.squadcastWebhookURL, data, config);
+            return okMsg;
+
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+
+    }
+
+}
+
+module.exports = Squadcast;
\ No newline at end of file
diff --git a/server/notification.js b/server/notification.js
index 3bf51243..7a4b4f29 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -32,6 +32,7 @@ const SerwerSMS = require("./notification-providers/serwersms");
 const Signal = require("./notification-providers/signal");
 const Slack = require("./notification-providers/slack");
 const SMTP = require("./notification-providers/smtp");
+const Squadcast = require("./notification-providers/squadcast");
 const Stackfield = require("./notification-providers/stackfield");
 const Teams = require("./notification-providers/teams");
 const TechulusPush = require("./notification-providers/techulus-push");
@@ -87,6 +88,7 @@ class Notification {
             new SMSManager(),
             new Slack(),
             new SMTP(),
+            new Squadcast(),
             new Stackfield(),
             new Teams(),
             new TechulusPush(),
diff --git a/src/components/notifications/Squadcast.vue b/src/components/notifications/Squadcast.vue
new file mode 100644
index 00000000..6650c44d
--- /dev/null
+++ b/src/components/notifications/Squadcast.vue
@@ -0,0 +1,6 @@
+<template>
+    <div class="mb-3">
+        <label for="webhook-url" class="form-label">{{ $t("Post URL") }}</label>
+        <input id="webhook-url" v-model="$parent.notification.squadcastWebhookURL" type="url" pattern="https?://.+" class="form-control" required>
+    </div>
+</template>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 6add06ea..319a7922 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -31,6 +31,7 @@ import SerwerSMS from "./SerwerSMS.vue";
 import Signal from "./Signal.vue";
 import SMSManager from "./SMSManager.vue";
 import Slack from "./Slack.vue";
+import Squadcast from "./Squadcast.vue";
 import Stackfield from "./Stackfield.vue";
 import STMP from "./SMTP.vue";
 import Teams from "./Teams.vue";
@@ -79,6 +80,7 @@ const NotificationFormList = {
     "signal": Signal,
     "SMSManager": SMSManager,
     "slack": Slack,
+    "squadcast": Squadcast,
     "smtp": STMP,
     "stackfield": Stackfield,
     "teams": Teams,
diff --git a/src/languages/en.js b/src/languages/en.js
index 7d980f63..1f20c7ea 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -582,4 +582,5 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
     backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
+    squadcast: "Squadcast",
 };

From bef9cb6a5fb06dbd2fb76c6ce6214b3c3b54b45f Mon Sep 17 00:00:00 2001
From: Patrick <patrick@hindmar.sh>
Date: Mon, 26 Sep 2022 22:30:43 +1300
Subject: [PATCH 169/803] Linting fixes

---
 server/notification-providers/squadcast.js | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/server/notification-providers/squadcast.js b/server/notification-providers/squadcast.js
index 0302cb6f..15553ff7 100644
--- a/server/notification-providers/squadcast.js
+++ b/server/notification-providers/squadcast.js
@@ -1,6 +1,6 @@
 const NotificationProvider = require("./notification-provider");
 const axios = require("axios");
-const { DOWN, UP } = require("../../src/util");
+const { DOWN } = require("../../src/util");
 
 class Squadcast extends NotificationProvider {
 
@@ -14,21 +14,21 @@ class Squadcast extends NotificationProvider {
             let config = {};
             let data = {
                 message: msg,
-                description: '',
+                description: "",
                 tags: {},
                 heartbeat: heartbeatJSON,
-                source: 'uptime-kuma'
-            }
+                source: "uptime-kuma"
+            };
 
             if (heartbeatJSON !== null) {
                 data.description = heartbeatJSON["msg"];
                 data.event_id = heartbeatJSON["monitorID"];
 
                 if (heartbeatJSON["status"] === DOWN) {
-                    data.message = `${monitorJSON['name']} is DOWN`;
+                    data.message = `${monitorJSON["name"]} is DOWN`;
                     data.status = "trigger";
                 } else {
-                    data.message = `${monitorJSON['name']} is UP`;
+                    data.message = `${monitorJSON["name"]} is UP`;
                     data.status = "resolve";
                 }
 
@@ -57,7 +57,7 @@ class Squadcast extends NotificationProvider {
                         value: tag["value"]
                     };
                     if (tag["color"] !== null) {
-                        data.tags[tag["name"]]["color"] = tag["color"]
+                        data.tags[tag["name"]]["color"] = tag["color"];
                     }
                 });
             }
@@ -73,4 +73,4 @@ class Squadcast extends NotificationProvider {
 
 }
 
-module.exports = Squadcast;
\ No newline at end of file
+module.exports = Squadcast;

From 5809088f27eb9604b043b782ac375f1feecc2e5a Mon Sep 17 00:00:00 2001
From: Justin Tisdale <justin@justintisdale.com>
Date: Mon, 26 Sep 2022 15:52:43 -0400
Subject: [PATCH 170/803] Don't override a user-defined content-type header

---
 server/model/monitor.js | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 509b841c..c541ecf3 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -249,20 +249,28 @@ class Monitor extends BeanModel {
 
                     log.debug("monitor", `[${this.name}] Prepare Options for axios`);
 
-                    // Set content-type header and body values based on the httpBodyEncoding type selected
-                    // TODO: Check if this.headers already contains a content-type header set by the user; if so, don't inject one
-                    let bodyValue = null;
-                    let contentType = null;
 
+
+                    // Check if this.headers already contains a content-type header set by the user; if so, don't inject one
+                    let contentTypeUserDefinedHeader = this.headers.find(function(header) {
+                        return header[0].toLowerCase() == "content-type";
+                    });
+
+                    let contentType = contentTypeUserDefinedHeader ? 
+                                        contentTypeUserDefinedHeader[1] :
+                                        null;
+
+                    let bodyValue = null;
+                    
                     if (this.body && !this.httpBodyEncoding || this.httpBodyEncoding === "json") {
                         bodyValue = JSON.parse(this.body);
-                        contentType = "application/json";
+                        contentType = contentType ? contentType : "application/json";
                     } else if (this.body && (this.httpBodyEncoding === "xml")) {
                         bodyValue = this.body;
-                        contentType = "text/xml";
+                        contentType = contentType ? contentType : "text/xml";
                     } else if (this.body && (this.httpBodyEncoding === "form")) {
                         bodyValue = this.body;
-                        contentType = "application/x-www-form-urlencoded";
+                        contentType = contentType ? contentType : "application/x-www-form-urlencoded";
                     }
 
                     const options = {

From 6537f4fe746c157c8a87ff25bbcefeb7a62522f3 Mon Sep 17 00:00:00 2001
From: Justin Tisdale <justin@justintisdale.com>
Date: Mon, 26 Sep 2022 17:09:10 -0400
Subject: [PATCH 171/803] content-type change

---
 server/model/monitor.js | 18 ++++--------------
 1 file changed, 4 insertions(+), 14 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index c541ecf3..48b0b1d3 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -249,28 +249,18 @@ class Monitor extends BeanModel {
 
                     log.debug("monitor", `[${this.name}] Prepare Options for axios`);
 
-
-
-                    // Check if this.headers already contains a content-type header set by the user; if so, don't inject one
-                    let contentTypeUserDefinedHeader = this.headers.find(function(header) {
-                        return header[0].toLowerCase() == "content-type";
-                    });
-
-                    let contentType = contentTypeUserDefinedHeader ? 
-                                        contentTypeUserDefinedHeader[1] :
-                                        null;
-
+                    let contentType = null;
                     let bodyValue = null;
                     
                     if (this.body && !this.httpBodyEncoding || this.httpBodyEncoding === "json") {
                         bodyValue = JSON.parse(this.body);
-                        contentType = contentType ? contentType : "application/json";
+                        contentType = "application/json";
                     } else if (this.body && (this.httpBodyEncoding === "xml")) {
                         bodyValue = this.body;
-                        contentType = contentType ? contentType : "text/xml";
+                        contentType = "text/xml";
                     } else if (this.body && (this.httpBodyEncoding === "form")) {
                         bodyValue = this.body;
-                        contentType = contentType ? contentType : "application/x-www-form-urlencoded";
+                        contentType = "application/x-www-form-urlencoded";
                     }
 
                     const options = {

From f6919aef1d3b59dd23229feef6f2815004f34a80 Mon Sep 17 00:00:00 2001
From: Justin Tisdale <justin@justintisdale.com>
Date: Mon, 26 Sep 2022 17:10:56 -0400
Subject: [PATCH 172/803] remove TODO

---
 src/pages/EditMonitor.vue | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index ba667670..ea246c60 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -741,7 +741,6 @@ export default {
          * @returns {boolean} Is the form input valid?
          */
         isInputValid() {
-            //TODO: Handle validation for all 3 possible options + null value
             if (this.monitor.body && (!this.monitor.httpBodyEncoding || this.monitor.httpBodyEncoding === "json")) {
                 try {
                     JSON.parse(this.monitor.body);

From 4002b9f57787220eda4863b76417bbc33aaed81a Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 27 Sep 2022 20:44:44 +0800
Subject: [PATCH 173/803] [WIP] Checking maintenance time using
 maintenance_timeslot table

---
 server/model/maintenance_timeslot.js          | 46 +++++++++++++++++++
 server/model/monitor.js                       | 12 ++++-
 server/model/status_page.js                   | 18 ++++----
 .../maintenance-socket-handler.js             |  3 ++
 src/components/Status.vue                     |  2 +-
 src/components/Uptime.vue                     |  2 +-
 src/languages/en.js                           |  1 +
 src/languages/zh-HK.js                        |  2 +
 src/mixins/socket.js                          |  2 +-
 9 files changed, 75 insertions(+), 13 deletions(-)
 create mode 100644 server/model/maintenance_timeslot.js

diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
new file mode 100644
index 00000000..f749caa5
--- /dev/null
+++ b/server/model/maintenance_timeslot.js
@@ -0,0 +1,46 @@
+const { BeanModel } = require("redbean-node/dist/bean-model");
+const { R } = require("redbean-node");
+const dayjs = require("dayjs");
+
+class MaintenanceTimeslot extends BeanModel {
+
+    async toPublicJSON() {
+
+    }
+
+    async toJSON() {
+
+    }
+
+    /**
+     *
+     * @param {Maintenance} maintenance
+     * @param {dayjs} startFrom (For recurring type only) Generate Timeslot from this date, if it is smaller than the current date, it will use the current date instead. As generating a passed timeslot is meaningless.
+     * @param {boolean} removeExist Remove existing timeslot before create
+     * @returns {Promise<void>}
+     */
+    static async generateTimeslot(maintenance, startFrom = null, removeExist = false) {
+        if (!startFrom) {
+            startFrom = dayjs();
+        }
+
+        if (removeExist) {
+            await R.exec("DELETE FROM maintenance_timeslot WHERE maintenance_id = ? ", [
+                maintenance.id
+            ]);
+        }
+
+        if (maintenance.strategy === "single") {
+            let bean = R.dispense("maintenance_timeslot");
+            bean.maintenance_id = maintenance.id;
+            bean.start_date = maintenance.start_datetime;
+            bean.end_date = maintenance.end_datetime;
+            bean.generated_next = true;
+            await R.store(bean);
+        } else {
+            throw new Error("Unknown maintenance strategy");
+        }
+    }
+}
+
+module.exports = MaintenanceTimeslot;
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 5a74215e..a13d7051 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1105,7 +1105,17 @@ class Monitor extends BeanModel {
      * @returns {Promise<boolean>}
      */
     static async isUnderMaintenance(monitorID) {
-        const maintenance = await R.getRow("SELECT COUNT(*) AS count FROM monitor_maintenance mm JOIN maintenance ON mm.maintenance_id = maintenance.id WHERE mm.monitor_id = ? AND datetime(maintenance.start_date) <= datetime('now') AND datetime(maintenance.end_date) >= datetime('now') LIMIT 1", [ monitorID ]);
+        const maintenance = await R.getRow(`
+            SELECT COUNT(*) AS count
+            FROM monitor_maintenance mm
+            JOIN maintenance
+                ON mm.maintenance_id = maintenance.id
+            JOIN maintenance_timeslot
+                ON maintenance_timeslot.maintenance_id = maintenance.id
+            WHERE mm.monitor_id = ?
+                AND maintenance_timeslot.start_date <= DATETIME('now')
+                AND maintenance_timeslot.end_date >= DATETIME('now')
+            LIMIT 1`, [ monitorID ]);
         return maintenance.count !== 0;
     }
 }
diff --git a/server/model/status_page.js b/server/model/status_page.js
index d296470d..4351db58 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -272,15 +272,15 @@ class StatusPage extends BeanModel {
             const publicMaintenanceList = [];
 
             let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
-            SELECT m.*
-            FROM maintenance m
-            JOIN maintenance_status_page msp
-            ON msp.maintenance_id = m.id
-            WHERE datetime(m.start_date) <= datetime('now')
-              AND datetime(m.end_date) >= datetime('now')
-              AND msp.status_page_id = ?
-            ORDER BY m.end_date
-        `, [ statusPageId ]));
+                SELECT m.*
+                FROM maintenance m, maintenance_status_page msp, maintenance_timeslot
+                WHERE  msp.maintenance_id = m.id
+                AND maintenance_timeslot.maintenance.id = m.id
+                AND maintenance_timeslot.start_date <= DATETIME('now')
+                AND maintenance_timeslot.end_date >= DATETIME('now')
+                AND msp.status_page_id = ?
+                ORDER BY m.end_date
+            `, [ statusPageId ]));
 
             for (const bean of maintenanceBeanList) {
                 publicMaintenanceList.push(await bean.toPublicJSON());
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index 604f07bd..5358b53e 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -8,6 +8,7 @@ const server = UptimeKumaServer.getInstance();
 const dayjs = require("dayjs");
 const utc = require("dayjs/plugin/utc");
 let timezone = require("dayjs/plugin/timezone");
+const MaintenanceTimeslot = require("../model/maintenance_timeslot");
 dayjs.extend(utc);
 dayjs.extend(timezone);
 
@@ -26,6 +27,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
             let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance, timezone);
             bean.user_id = socket.userID;
             let maintenanceID = await R.store(bean);
+            await MaintenanceTimeslot.generateTimeslot(bean);
 
             await server.sendMaintenanceList(socket);
 
@@ -57,6 +59,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
             Maintenance.jsonToBean(bean, maintenance, timezone);
 
             await R.store(bean);
+            await MaintenanceTimeslot.generateTimeslot(bean, null, true);
 
             await server.sendMaintenanceList(socket);
 
diff --git a/src/components/Status.vue b/src/components/Status.vue
index 391fb6d5..92ed8a6b 100644
--- a/src/components/Status.vue
+++ b/src/components/Status.vue
@@ -47,7 +47,7 @@ export default {
             }
 
             if (this.status === 3) {
-                return this.$t("Maintenance");
+                return this.$t("statusMaintenance");
             }
 
             return this.$t("Unknown");
diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index f089d4c1..8565975c 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -26,7 +26,7 @@ export default {
         uptime() {
 
             if (this.type === "maintenance") {
-                return this.$t("Maintenance");
+                return this.$t("statusMaintenance");
             }
 
             let key = this.monitor.id + "_" + this.type;
diff --git a/src/languages/en.js b/src/languages/en.js
index e77a31f4..fdcaf98e 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -10,6 +10,7 @@ export default {
     maxRedirectDescription: "Maximum number of redirects to follow. Set to 0 to disable redirects.",
     acceptedStatusCodesDescription: "Select status codes which are considered as a successful response.",
     Maintenance: "Maintenance",
+    statusMaintenance: "Maintenance",
     "Schedule maintenance": "Schedule maintenance",
     "Affected Monitors": "Affected Monitors",
     "Pick Affected Monitors...": "Pick Affected Monitors...",
diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js
index a55f4fb6..cd82be84 100644
--- a/src/languages/zh-HK.js
+++ b/src/languages/zh-HK.js
@@ -380,4 +380,6 @@ export default {
     proxyDescription: "必須將代理伺服器指派給監測器才能運作。",
     enableProxyDescription: "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
     setAsDefaultProxyDescription: "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
+    Maintenance: "維護",
+    statusMaintenance: "維護中",
 };
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 6da6ee64..74522ffe 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -588,7 +588,7 @@ export default {
 
                 if (this.monitorList[monitorID].maintenance) {
                     result[monitorID] = {
-                        text: this.$t("Maintenance"),
+                        text: this.$t("statusMaintenance"),
                         color: "maintenance",
                     };
                 } else if (! lastHeartBeat) {

From b1465c0282dde17c34171b3978c96cdac2c7dace Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 28 Sep 2022 00:20:17 +0800
Subject: [PATCH 174/803] - Maintenance standardize datetime format to
 YYYY-MM-DD hh:mm:ss - Import dayjs extensions one time only - Maintenance
 activeCondition centralize

---
 server/model/heartbeat.js                     |  4 --
 server/model/maintenance.js                   | 38 +++++++++++++------
 server/model/maintenance_timeslot.js          |  5 ++-
 server/model/monitor.js                       |  9 ++---
 server/model/status_page.js                   |  9 +++--
 server/server.js                              |  5 +++
 .../maintenance-socket-handler.js             |  4 --
 server/util-server.js                         |  4 --
 src/components/Datetime.vue                   |  6 ---
 src/components/PingChart.vue                  |  6 +--
 src/components/settings/General.vue           |  4 --
 src/main.js                                   |  7 ++++
 src/mixins/datetime.js                        |  6 ---
 src/util-frontend.js                          |  5 ---
 14 files changed, 51 insertions(+), 61 deletions(-)

diff --git a/server/model/heartbeat.js b/server/model/heartbeat.js
index 8c9d8645..fa02cae8 100644
--- a/server/model/heartbeat.js
+++ b/server/model/heartbeat.js
@@ -1,8 +1,4 @@
 const dayjs = require("dayjs");
-const utc = require("dayjs/plugin/utc");
-let timezone = require("dayjs/plugin/timezone");
-dayjs.extend(utc);
-dayjs.extend(timezone);
 const { BeanModel } = require("redbean-node/dist/bean-model");
 
 /**
diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 3b07d5f7..945e4d97 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -1,12 +1,9 @@
 const dayjs = require("dayjs");
-const utc = require("dayjs/plugin/utc");
-let timezone = require("dayjs/plugin/timezone");
-dayjs.extend(utc);
-dayjs.extend(timezone);
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { parseTimeObject, parseTimeFromTimeObject } = require("../../src/util");
 const { isArray } = require("chart.js/helpers");
 const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
+const { R } = require("redbean-node");
 
 class Maintenance extends BeanModel {
 
@@ -20,17 +17,18 @@ class Maintenance extends BeanModel {
 
         let dateTimeRange = [];
         if (this.start_datetime) {
-            dateTimeRange.push( this.start_datetime);
+
+            dateTimeRange.push(dayjs.utc(this.start_datetime).toISOString());
             if (this.end_datetime) {
-                dateTimeRange.push( this.end_datetime);
+                dateTimeRange.push(dayjs.utc(this.end_datetime).toISOString());
             }
         }
 
         let dateRange = [];
         if (this.start_date) {
-            dateRange.push( this.start_date);
+            dateRange.push(dayjs.utc(this.start_date).toISOString());
             if (this.end_date) {
-                dateRange.push( this.end_date);
+                dateRange.push(dayjs.utc(this.end_date).toISOString());
             }
         }
 
@@ -106,18 +104,18 @@ class Maintenance extends BeanModel {
         bean.active = obj.active;
 
         if (obj.dateRange[0]) {
-            bean.start_date = obj.dateRange[0];
+            bean.start_date = R.isoDate(dayjs(obj.dateRange[0]).utc());
 
             if (obj.dateRange[1]) {
-                bean.end_date = obj.dateRange[1];
+                bean.end_date = R.isoDate(dayjs(obj.dateRange[1]).utc());
             }
         }
 
         if (obj.dateTimeRange[0]) {
-            bean.start_datetime = obj.dateTimeRange[0];
+            bean.start_datetime = R.isoDateTime(dayjs(obj.dateTimeRange[0]).utc());
 
             if (obj.dateTimeRange[1]) {
-                bean.end_datetime = obj.dateTimeRange[1];
+                bean.end_datetime = R.isoDateTime(dayjs(obj.dateTimeRange[1]).utc());
             }
         }
 
@@ -129,6 +127,22 @@ class Maintenance extends BeanModel {
 
         return bean;
     }
+
+    /**
+     * SQL conditions for active maintenance
+     * @returns {string}
+     */
+    static getActiveMaintenanceSQLCondition() {
+        return `
+
+            (maintenance_timeslot.start_date <= DATETIME('now')
+            AND maintenance_timeslot.end_date >= DATETIME('now')
+            AND maintenance.active = 1)
+            AND
+            (maintenance.strategy = 'manual' AND active = 1)
+
+        `;
+    }
 }
 
 module.exports = Maintenance;
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index f749caa5..7917dd69 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -1,6 +1,7 @@
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { R } = require("redbean-node");
 const dayjs = require("dayjs");
+const { log } = require("../../src/util");
 
 class MaintenanceTimeslot extends BeanModel {
 
@@ -30,7 +31,9 @@ class MaintenanceTimeslot extends BeanModel {
             ]);
         }
 
-        if (maintenance.strategy === "single") {
+        if (maintenance.strategy === "manual") {
+            log.debug("maintenance", "No need to generate timeslot for manual type");
+        } else if (maintenance.strategy === "single") {
             let bean = R.dispense("maintenance_timeslot");
             bean.maintenance_id = maintenance.id;
             bean.start_date = maintenance.start_datetime;
diff --git a/server/model/monitor.js b/server/model/monitor.js
index a13d7051..9df127b0 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1,9 +1,5 @@
 const https = require("https");
 const dayjs = require("dayjs");
-const utc = require("dayjs/plugin/utc");
-let timezone = require("dayjs/plugin/timezone");
-dayjs.extend(utc);
-dayjs.extend(timezone);
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
 const { log, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger } = require("../../src/util");
@@ -17,6 +13,7 @@ const version = require("../../package.json").version;
 const apicache = require("../modules/apicache");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
+const Maintenance = require("./maintenance");
 
 /**
  * status:
@@ -1105,6 +1102,7 @@ class Monitor extends BeanModel {
      * @returns {Promise<boolean>}
      */
     static async isUnderMaintenance(monitorID) {
+        let activeCondition = Maintenance.getActiveMaintenanceSQLCondition();
         const maintenance = await R.getRow(`
             SELECT COUNT(*) AS count
             FROM monitor_maintenance mm
@@ -1113,8 +1111,7 @@ class Monitor extends BeanModel {
             JOIN maintenance_timeslot
                 ON maintenance_timeslot.maintenance_id = maintenance.id
             WHERE mm.monitor_id = ?
-                AND maintenance_timeslot.start_date <= DATETIME('now')
-                AND maintenance_timeslot.end_date >= DATETIME('now')
+              AND ${activeCondition}
             LIMIT 1`, [ monitorID ]);
         return maintenance.count !== 0;
     }
diff --git a/server/model/status_page.js b/server/model/status_page.js
index 4351db58..0620a1ee 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -2,6 +2,7 @@ const { BeanModel } = require("redbean-node/dist/bean-model");
 const { R } = require("redbean-node");
 const cheerio = require("cheerio");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
+const Maintenance = require("./maintenance");
 
 class StatusPage extends BeanModel {
 
@@ -271,14 +272,14 @@ class StatusPage extends BeanModel {
         try {
             const publicMaintenanceList = [];
 
+            let activeCondition = Maintenance.getActiveMaintenanceSQLCondition();
             let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
                 SELECT m.*
                 FROM maintenance m, maintenance_status_page msp, maintenance_timeslot
                 WHERE  msp.maintenance_id = m.id
-                AND maintenance_timeslot.maintenance.id = m.id
-                AND maintenance_timeslot.start_date <= DATETIME('now')
-                AND maintenance_timeslot.end_date >= DATETIME('now')
-                AND msp.status_page_id = ?
+                    AND maintenance_timeslot.maintenance.id = m.id
+                    AND msp.status_page_id = ?
+                    AND ${activeCondition}
                 ORDER BY m.end_date
             `, [ statusPageId ]));
 
diff --git a/server/server.js b/server/server.js
index 4aec2b27..1ad99899 100644
--- a/server/server.js
+++ b/server/server.js
@@ -33,6 +33,11 @@ log.info("server", "Importing Node libraries");
 const fs = require("fs");
 
 log.info("server", "Importing 3rd-party libraries");
+
+const dayjs = require("dayjs");
+dayjs.extend(require("dayjs/plugin/utc"));
+dayjs.extend(require("dayjs/plugin/timezone"));
+
 log.debug("server", "Importing express");
 const express = require("express");
 const expressStaticGzip = require("express-static-gzip");
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index 5358b53e..9ae36b5c 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -6,11 +6,7 @@ const { UptimeKumaServer } = require("../uptime-kuma-server");
 const Maintenance = require("../model/maintenance");
 const server = UptimeKumaServer.getInstance();
 const dayjs = require("dayjs");
-const utc = require("dayjs/plugin/utc");
-let timezone = require("dayjs/plugin/timezone");
 const MaintenanceTimeslot = require("../model/maintenance_timeslot");
-dayjs.extend(utc);
-dayjs.extend(timezone);
 
 /**
  * Handlers for Maintenance
diff --git a/server/util-server.js b/server/util-server.js
index cc5e478d..1c5f5914 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -22,10 +22,6 @@ const {
     },
 } = require("node-radius-utils");
 const dayjs = require("dayjs");
-const utc = require("dayjs/plugin/utc");
-let timezone = require("dayjs/plugin/timezone");
-dayjs.extend(utc);
-dayjs.extend(timezone);
 
 // From ping-lite
 exports.WIN = /^win/.test(process.platform);
diff --git a/src/components/Datetime.vue b/src/components/Datetime.vue
index b24ab0b3..84bae503 100644
--- a/src/components/Datetime.vue
+++ b/src/components/Datetime.vue
@@ -4,12 +4,6 @@
 
 <script>
 import dayjs from "dayjs";
-import relativeTime from "dayjs/plugin/relativeTime";
-import timezone from "dayjs/plugin/timezone"; // dependent on utc plugin
-import utc from "dayjs/plugin/utc";
-dayjs.extend(utc);
-dayjs.extend(timezone);
-dayjs.extend(relativeTime);
 
 export default {
     props: {
diff --git a/src/components/PingChart.vue b/src/components/PingChart.vue
index 4cece191..2733e68c 100644
--- a/src/components/PingChart.vue
+++ b/src/components/PingChart.vue
@@ -16,18 +16,14 @@
     </div>
 </template>
 
-<script lang="ts">
+<script lang="js">
 import { BarController, BarElement, Chart, Filler, LinearScale, LineController, LineElement, PointElement, TimeScale, Tooltip } from "chart.js";
 import "chartjs-adapter-dayjs";
 import dayjs from "dayjs";
-import timezone from "dayjs/plugin/timezone";
-import utc from "dayjs/plugin/utc";
 import { LineChart } from "vue-chart-3";
 import { useToast } from "vue-toastification";
 import { DOWN, PENDING, MAINTENANCE, log } from "../util.ts";
 
-dayjs.extend(utc);
-dayjs.extend(timezone);
 const toast = useToast();
 
 Chart.register(LineController, BarController, LineElement, PointElement, TimeScale, BarElement, LinearScale, Tooltip, Filler);
diff --git a/src/components/settings/General.vue b/src/components/settings/General.vue
index 19dc8077..242ad853 100644
--- a/src/components/settings/General.vue
+++ b/src/components/settings/General.vue
@@ -145,11 +145,7 @@
 <script>
 import HiddenInput from "../../components/HiddenInput.vue";
 import dayjs from "dayjs";
-import utc from "dayjs/plugin/utc";
-import timezone from "dayjs/plugin/timezone";
 import { timezoneList } from "../../util-frontend";
-dayjs.extend(utc);
-dayjs.extend(timezone);
 
 export default {
     components: {
diff --git a/src/main.js b/src/main.js
index 7783882b..5567023f 100644
--- a/src/main.js
+++ b/src/main.js
@@ -16,6 +16,13 @@ import theme from "./mixins/theme";
 import lang from "./mixins/lang";
 import { router } from "./router";
 import { appName } from "./util.ts";
+import dayjs from "dayjs";
+import timezone from "dayjs/plugin/timezone";
+import utc from "dayjs/plugin/utc";
+import relativeTime from "dayjs/plugin/relativeTime";
+dayjs.extend(utc);
+dayjs.extend(timezone);
+dayjs.extend(relativeTime);
 
 const app = createApp({
     mixins: [
diff --git a/src/mixins/datetime.js b/src/mixins/datetime.js
index 0e5317c6..3bbe1130 100644
--- a/src/mixins/datetime.js
+++ b/src/mixins/datetime.js
@@ -1,10 +1,4 @@
 import dayjs from "dayjs";
-import relativeTime from "dayjs/plugin/relativeTime";
-import timezone from "dayjs/plugin/timezone";
-import utc from "dayjs/plugin/utc";
-dayjs.extend(utc);
-dayjs.extend(timezone);
-dayjs.extend(relativeTime);
 
 /**
  * DateTime Mixin
diff --git a/src/util-frontend.js b/src/util-frontend.js
index 36dac49f..3323f327 100644
--- a/src/util-frontend.js
+++ b/src/util-frontend.js
@@ -1,12 +1,7 @@
 import dayjs from "dayjs";
-import timezone from "dayjs/plugin/timezone";
-import utc from "dayjs/plugin/utc";
 import timezones from "timezones-list";
 import { localeDirection, currentLocale } from "./i18n";
 
-dayjs.extend(utc);
-dayjs.extend(timezone);
-
 /**
  * Returns the offset from UTC in hours for the current locale.
  * @returns {number} The offset from UTC in hours.

From 204339fbedde88443a2968e3ff4c76f174475147 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 28 Sep 2022 00:48:15 +0800
Subject: [PATCH 175/803] Make two functions to convert ISO 8601  <=>
 YYYY-MM-DD hh:mm:ss

---
 server/model/maintenance.js          | 30 +++++-----------------------
 server/model/maintenance_timeslot.js |  4 ++--
 src/pages/EditMaintenance.vue        |  5 ++---
 src/util.js                          | 16 ++++++++++++---
 src/util.ts                          | 17 ++++++++++++++--
 5 files changed, 37 insertions(+), 35 deletions(-)

diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 945e4d97..3d0595a7 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -1,9 +1,7 @@
-const dayjs = require("dayjs");
 const { BeanModel } = require("redbean-node/dist/bean-model");
-const { parseTimeObject, parseTimeFromTimeObject } = require("../../src/util");
+const { parseTimeObject, parseTimeFromTimeObject, isoToUTCDateTime, utcToISODateTime } = require("../../src/util");
 const { isArray } = require("chart.js/helpers");
 const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
-const { R } = require("redbean-node");
 
 class Maintenance extends BeanModel {
 
@@ -15,20 +13,11 @@ class Maintenance extends BeanModel {
      */
     async toPublicJSON(timezone = null) {
 
-        let dateTimeRange = [];
-        if (this.start_datetime) {
-
-            dateTimeRange.push(dayjs.utc(this.start_datetime).toISOString());
-            if (this.end_datetime) {
-                dateTimeRange.push(dayjs.utc(this.end_datetime).toISOString());
-            }
-        }
-
         let dateRange = [];
         if (this.start_date) {
-            dateRange.push(dayjs.utc(this.start_date).toISOString());
+            dateRange.push(utcToISODateTime(this.start_date));
             if (this.end_date) {
-                dateRange.push(dayjs.utc(this.end_date).toISOString());
+                dateRange.push(utcToISODateTime(this.end_date));
             }
         }
 
@@ -55,7 +44,6 @@ class Maintenance extends BeanModel {
             strategy: this.strategy,
             intervalDay: this.interval_day,
             active: !!this.active,
-            dateTimeRange: dateTimeRange,
             dateRange: dateRange,
             timeRange: timeRange,
             weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [],
@@ -104,18 +92,10 @@ class Maintenance extends BeanModel {
         bean.active = obj.active;
 
         if (obj.dateRange[0]) {
-            bean.start_date = R.isoDate(dayjs(obj.dateRange[0]).utc());
+            bean.start_date = isoToUTCDateTime(obj.dateRange[0]);
 
             if (obj.dateRange[1]) {
-                bean.end_date = R.isoDate(dayjs(obj.dateRange[1]).utc());
-            }
-        }
-
-        if (obj.dateTimeRange[0]) {
-            bean.start_datetime = R.isoDateTime(dayjs(obj.dateTimeRange[0]).utc());
-
-            if (obj.dateTimeRange[1]) {
-                bean.end_datetime = R.isoDateTime(dayjs(obj.dateTimeRange[1]).utc());
+                bean.end_date = isoToUTCDateTime(obj.dateRange[1]);
             }
         }
 
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index 7917dd69..0ac5158d 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -36,8 +36,8 @@ class MaintenanceTimeslot extends BeanModel {
         } else if (maintenance.strategy === "single") {
             let bean = R.dispense("maintenance_timeslot");
             bean.maintenance_id = maintenance.id;
-            bean.start_date = maintenance.start_datetime;
-            bean.end_date = maintenance.end_datetime;
+            bean.start_date = maintenance.start_date;
+            bean.end_date = maintenance.end_date;
             bean.generated_next = true;
             await R.store(bean);
         } else {
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 640962d7..be9f7ce4 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -103,7 +103,7 @@
                                 <div class="my-3">
                                     <label class="form-label">{{ $t("DateTime Range") }}</label>
                                     <Datepicker
-                                        v-model="maintenance.dateTimeRange"
+                                        v-model="maintenance.dateRange"
                                         :dark="$root.isDark"
                                         range textInput
                                         :monthChangeOnScroll="false"
@@ -369,8 +369,7 @@ export default {
                     strategy: "single",
                     active: 1,
                     intervalDay: 1,
-                    dateTimeRange: [ this.minDate ],
-                    dateRange: [],
+                    dateRange: [ this.minDate ],
                     timeRange: [{
                         hours: 2,
                         minutes: 0,
diff --git a/src/util.js b/src/util.js
index 15427cdd..1fee0eaa 100644
--- a/src/util.js
+++ b/src/util.js
@@ -7,9 +7,8 @@
 // Backend uses the compiled file util.js
 // Frontend uses util.ts
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
-const _dayjs = require("dayjs");
-const dayjs = _dayjs;
+exports.utcToISODateTime = exports.isoToUTCDateTime = exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
+const dayjs = require("dayjs");
 exports.isDev = process.env.NODE_ENV === "development";
 exports.appName = "Uptime Kuma";
 exports.DOWN = 0;
@@ -351,3 +350,14 @@ function parseTimeFromTimeObject(obj) {
     return result;
 }
 exports.parseTimeFromTimeObject = parseTimeFromTimeObject;
+function isoToUTCDateTime(input) {
+    return dayjs(input).utc().format("YYYY-MM-DD HH:mm:ss");
+}
+exports.isoToUTCDateTime = isoToUTCDateTime;
+/**
+ * @param input
+ */
+function utcToISODateTime(input) {
+    return dayjs.utc(input).toISOString();
+}
+exports.utcToISODateTime = utcToISODateTime;
diff --git a/src/util.ts b/src/util.ts
index cb51250b..16511afa 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -6,8 +6,10 @@
 // Backend uses the compiled file util.js
 // Frontend uses util.ts
 
-import * as _dayjs from "dayjs";
-const dayjs = _dayjs;
+import * as dayjs  from "dayjs";
+import * as timezone from "dayjs/plugin/timezone";
+import * as utc from "dayjs/plugin/utc";
+import {R} from "redbean-node";
 
 export const isDev = process.env.NODE_ENV === "development";
 export const appName = "Uptime Kuma";
@@ -392,3 +394,14 @@ export function parseTimeFromTimeObject(obj : any) {
     return result;
 }
 
+
+export function isoToUTCDateTime(input : string) {
+    return dayjs(input).utc().format("YYYY-MM-DD HH:mm:ss");
+}
+
+/**
+ * @param input
+ */
+export function utcToISODateTime(input : string) {
+    return dayjs.utc(input).toISOString();
+}

From 6f86236b6380f2df0b0e80582692874c7076e6ab Mon Sep 17 00:00:00 2001
From: Christian Meis <christian.meis@online-service.de>
Date: Wed, 28 Sep 2022 10:13:18 +0200
Subject: [PATCH 176/803] Add support for icon to ntfy notification provider
 (requires minimum ntfy server version 1.28.0 and Android app 1.14.0, no iOS
 support as of today)

---
 server/notification-providers/ntfy.js | 1 +
 src/components/notifications/Ntfy.vue | 5 +++++
 src/languages/en.js                   | 1 +
 3 files changed, 7 insertions(+)

diff --git a/server/notification-providers/ntfy.js b/server/notification-providers/ntfy.js
index 21f358f6..3d009508 100644
--- a/server/notification-providers/ntfy.js
+++ b/server/notification-providers/ntfy.js
@@ -13,6 +13,7 @@ class Ntfy extends NotificationProvider {
                 "message": msg,
                 "priority": notification.ntfyPriority || 4,
                 "title": "Uptime-Kuma",
+                "icon": notification.ntfyIcon || '',
             });
 
             return okMsg;
diff --git a/src/components/notifications/Ntfy.vue b/src/components/notifications/Ntfy.vue
index d9a83b49..4728f891 100644
--- a/src/components/notifications/Ntfy.vue
+++ b/src/components/notifications/Ntfy.vue
@@ -16,6 +16,11 @@
         <label for="ntfy-priority" class="form-label">{{ $t("Priority") }}</label>
         <input id="ntfy-priority" v-model="$parent.notification.ntfyPriority" type="number" class="form-control" required min="1" max="5" step="1">
     </div>
+
+    <div class="mb-3">
+        <label for="ntfy-icon" class="form-label">{{ $t("IconUrl") }}</label>
+        <input id="ntfy-icon" v-model="$parent.notification.ntfyIcon" type="text" class="form-control" required>
+    </div>
 </template>
 
 <script>
diff --git a/src/languages/en.js b/src/languages/en.js
index 7d980f63..9d3a0177 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -582,4 +582,5 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
     backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
+    IconUrl: "Icon-URL",
 };

From 618d904001c061d015a551ba018d12d4cf33b825 Mon Sep 17 00:00:00 2001
From: Christian Meis <christian.meis@online-service.de>
Date: Wed, 28 Sep 2022 10:17:02 +0200
Subject: [PATCH 177/803] [empty commit] pull request for icon support in ntfy
 notification provider (fixes #2135)


From e12642cf2116b03a102d0a477196430b9ae142fc Mon Sep 17 00:00:00 2001
From: Christian Meis <christian.meis@online-service.de>
Date: Wed, 28 Sep 2022 10:24:56 +0200
Subject: [PATCH 178/803] Fix double quotes in fallback for no icon url in ntfy
 notification provider settings

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

diff --git a/server/notification-providers/ntfy.js b/server/notification-providers/ntfy.js
index 3d009508..3288d8fb 100644
--- a/server/notification-providers/ntfy.js
+++ b/server/notification-providers/ntfy.js
@@ -13,7 +13,7 @@ class Ntfy extends NotificationProvider {
                 "message": msg,
                 "priority": notification.ntfyPriority || 4,
                 "title": "Uptime-Kuma",
-                "icon": notification.ntfyIcon || '',
+                "icon": notification.ntfyIcon || "",
             });
 
             return okMsg;

From c03d911657ad84ec522bc586ca31f5215ba13685 Mon Sep 17 00:00:00 2001
From: Christian Meis <christian.meis@online-service.de>
Date: Wed, 28 Sep 2022 11:39:13 +0200
Subject: [PATCH 179/803] Update src/languages/en.js

Co-authored-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/languages/en.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/languages/en.js b/src/languages/en.js
index 9d3a0177..8bfaaabd 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -582,5 +582,5 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
     backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
-    IconUrl: "Icon-URL",
+    IconUrl: "Icon URL",
 };

From 929d23810616520a20e5ad875a3e2e9a511af8bf Mon Sep 17 00:00:00 2001
From: FarisDaffa <65797160+Faris0520@users.noreply.github.com>
Date: Sat, 1 Oct 2022 12:17:17 +0700
Subject: [PATCH 180/803] Update id-ID.js

---
 src/languages/id-ID.js | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index 36ee0341..3d3c3389 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -130,7 +130,7 @@ export default {
     "Repeat Password": "Ulangi Sandi",
     "Import Backup": "Impor Cadangan",
     "Export Backup": "Expor Cadangan",
-    Export: "Expor",
+    Export: "Ekspor",
     Import: "Impor",
     respTime: "Tanggapan. Waktu (milidetik)",
     notAvailableShort: "N/A",
@@ -192,7 +192,7 @@ export default {
     "Status Pages": "Halaman Status",
     defaultNotificationName: "{notification} saya Peringatan ({number})",
     here: "di sini",
-    Required: "Dibutuhkan",
+    Required: "Wajib",
     telegram: "Telegram",
     "Bot Token": "Bot Token",
     wayToGetTelegramToken: "Anda dapat mendapatkan token dari {0}.",
@@ -210,9 +210,9 @@ export default {
     secureOptionNone: "None / STARTTLS (25, 587)",
     secureOptionTLS: "TLS (465)",
     "Ignore TLS Error": "Abaikan Kesalahan TLS",
-    "From Email": "Dari Surel",
+    "From Email": "Dari Email",
     emailCustomSubject: "Subjek",
-    "To Email": "Ke Surel",
+    "To Email": "Ke Email",
     smtpCC: "CC",
     smtpBCC: "BCC",
     discord: "Discord",
@@ -232,7 +232,7 @@ export default {
     signalImportant: "PENTING: Anda tidak dapat mencampur grup dan nomor di penerima!",
     gotify: "Gotify",
     "Application Token": "Token Aplikasi",
-    "Server URL": "URL Peladen",
+    "Server URL": "URL Server",
     Priority: "Prioritas",
     slack: "Slack",
     "Icon Emoji": "Ikon Emoji",
@@ -274,9 +274,9 @@ export default {
     "LunaSea Device ID": "LunaSea Device ID",
     "Apprise URL": "Apprise URL",
     "Example:": "Contoh: {0}",
-    "Read more:": "Baca lebih lajut: {0}",
+    "Read more:": "Baca lebih lanjut: {0}",
     "Status:": "Status: {0}",
-    "Read more": "Baca lebih lajut",
+    "Read more": "Baca lebih lanjut",
     appriseInstalled: "Apprise diinstall.",
     appriseNotInstalled: "Apprise tidak diinstall. {0}",
     "Access Token": "Token Akses",
@@ -310,7 +310,7 @@ export default {
     BodyInvalidFormat: "Request Body memiliki format JSON yang tidak sesuai: ",
     "Monitor History": "Riyawat Monitor",
     clearDataOlderThan: "Simpan data riwayat monitoring selama {0} hari.",
-    PasswordsDoNotMatch: "Passwords tidak sama.",
+    PasswordsDoNotMatch: "Password tidak sama.",
     records: "catatan",
     "One record": "Satu catatan",
     steamApiKeyDescription: "Untuk monitoring Steam Game Server Anda membutuhkan kunci Steam Web-API. Anda dapat mendaftarkan Kunci API Anda melalui: ",
@@ -322,7 +322,7 @@ export default {
     recent: "Baru saja",
     Done: "Selesai",
     Info: "Info",
-    Security: "Keamaan",
+    Security: "Keamanan",
     "Steam API Key": "Steam API Key",
     "Shrink Database": "Shrink Database",
     "Pick a RR-Type...": "Pilih RR-Type...",
@@ -393,7 +393,7 @@ export default {
     alertaAlertState: "Status Siaga",
     alertaRecoverState: "Status Pemulihan",
     deleteStatusPageMsg: "Apakah Anda yakin untuk menghapus halaman status berikut?",
-    Proxies: "Proxies",
+    Proxies: "Proxy",
     default: "Bawaan",
     enabled: "Diaktifkan",
     setAsDefault: "Tetapkan sebagai bawaan",
@@ -403,7 +403,7 @@ export default {
     setAsDefaultProxyDescription: "Proxy berikut akan diaktifkan sebagai bawaan untuk monitor baru. Anda masih dapat menonaktifkan proxy secara terpisah untuk setiap monitor.",
     "Certificate Chain": "Certificate Chain",
     Valid: "Sahih",
-    Invalid: "Tidak Sahih",
+    Invalid: "Tidak Valid",
     AccessKeyId: "AccessKey ID",
     SecretAccessKey: "AccessKey Secret",
     PhoneNumbers: "Nomor Telepon",
@@ -433,7 +433,7 @@ export default {
     Installed: "Terpasang",
     "Not installed": "Tidak terpasang",
     Running: "Berlari",
-    "Not running": "Tidak berlari",
+    "Not running": "Tidak berjalan",
     "Remove Token": "Hapus Token",
     Start: "Mulai",
     Stop: "Berhenti",
@@ -444,7 +444,7 @@ export default {
     startOrEndWithOnly: "Mulai atau akhiri hanya dengan {0}",
     "No consecutive dashes": "Tanda hubung tidak berurutan",
     Next: "Selanjutnya",
-    "The slug is already taken. Please choose another slug.": "Slug is telah digunakan. Silakan pilih slug lain.",
+    "The slug is already taken. Please choose another slug.": "Slug telah digunakan. Silakan pilih slug lain.",
     "No Proxy": "TIdak ada Proxy",
     Authentication: "Autentikasi",
     "HTTP Basic Auth": "HTTP Basic Auth",

From 2e54dee817f02953393be0167ce71128dbfe8fac Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sat, 1 Oct 2022 15:03:28 +0100
Subject: [PATCH 181/803] Fixed Octopush Notifier not working #2144

The version number was passed as a string from the frontend but was
checked against a number in the backend provider. This caused the if else
if to fall through into an error. The literal it is now being compared
has been changed to a string and the unknown version error is no longer
encountered.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/notification-providers/octopush.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/notification-providers/octopush.js b/server/notification-providers/octopush.js
index 0eda940b..524a4a88 100644
--- a/server/notification-providers/octopush.js
+++ b/server/notification-providers/octopush.js
@@ -10,7 +10,7 @@ class Octopush extends NotificationProvider {
 
         try {
         // Default - V2
-            if (notification.octopushVersion === 2 || !notification.octopushVersion) {
+            if (notification.octopushVersion === "2" || !notification.octopushVersion) {
                 let config = {
                     headers: {
                         "api-key": notification.octopushAPIKey,
@@ -31,7 +31,7 @@ class Octopush extends NotificationProvider {
                     "sender": notification.octopushSenderName
                 };
                 await axios.post("https://api.octopush.com/v1/public/sms-campaign/send", data, config);
-            } else if (notification.octopushVersion === 1) {
+            } else if (notification.octopushVersion === "1") {
                 let data = {
                     "user_login": notification.octopushDMLogin,
                     "api_key": notification.octopushDMAPIKey,

From 63e408f4f2c3886874fb8a6cbd9e10a5ee6bd33a Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sat, 1 Oct 2022 15:42:34 +0100
Subject: [PATCH 182/803] Fixed octopush legacy doesn't return error code

The octopush legacy API does not return a HTTP error code and instead
always returns a HTTP 200. This means that no error it thrown even if
something like the parameters are incorrect.
Instead the error code is given in the json response data.
Therefore we must look at the response data and check for the presence
of the "error_code" key in the response data.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/notification-providers/octopush.js | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/server/notification-providers/octopush.js b/server/notification-providers/octopush.js
index 524a4a88..35d88f5f 100644
--- a/server/notification-providers/octopush.js
+++ b/server/notification-providers/octopush.js
@@ -49,7 +49,13 @@ class Octopush extends NotificationProvider {
                     },
                     params: data
                 };
-                await axios.post("https://www.octopush-dm.com/api/sms/json", {}, config);
+
+                // V1 API returns 200 even on error so we must check
+                // response data
+                let response = await axios.post("https://www.octopush-dm.com/api/sms/json", {}, config);
+                if ("error_code" in response.data) {
+                    this.throwGeneralAxiosError(`Octopush error ${JSON.stringify(response.data)}`);
+                }
             } else {
                 throw new Error("Unknown Octopush version!");
             }

From 97de3959cd3c71d17bcfa32a2a3ec131c3255e9b Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sat, 1 Oct 2022 19:48:00 +0100
Subject: [PATCH 183/803] Updated octopush error handling to accept 000

The legacy octopush API includes an error code with all responses. A
code other than 000 is an error.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/notification-providers/octopush.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/server/notification-providers/octopush.js b/server/notification-providers/octopush.js
index 35d88f5f..d5c475d3 100644
--- a/server/notification-providers/octopush.js
+++ b/server/notification-providers/octopush.js
@@ -54,7 +54,9 @@ class Octopush extends NotificationProvider {
                 // response data
                 let response = await axios.post("https://www.octopush-dm.com/api/sms/json", {}, config);
                 if ("error_code" in response.data) {
-                    this.throwGeneralAxiosError(`Octopush error ${JSON.stringify(response.data)}`);
+                    if (response.data.error_code !== "000") {
+                        this.throwGeneralAxiosError(`Octopush error ${JSON.stringify(response.data)}`);
+                    }
                 }
             } else {
                 throw new Error("Unknown Octopush version!");

From 314ae38f91dcb4702c5e2628ffac7e56230b014c Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sat, 1 Oct 2022 21:35:33 +0100
Subject: [PATCH 184/803] Changed name of SQL Server to avoid confusion

It appears that SQL Server causes some confusion among users as they
believe that it means any SQL database, not the Microsoft product SQL
Server. To avoid this issue, the display value has been changed to
Microsoft SQL Server. No backend changes have been made and it is still
stored as sqlserver in the database. This is only a frontent change.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/pages/EditMonitor.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 99cbeb95..947ff15e 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -46,7 +46,7 @@
                                             MQTT
                                         </option>
                                         <option value="sqlserver">
-                                            SQL Server
+                                            Microsoft SQL Server
                                         </option>
                                         <option value="postgres">
                                             PostgreSQL

From f9be91824665b4892b9a1e18c8ce15d321748f2e Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sun, 2 Oct 2022 01:52:53 +0100
Subject: [PATCH 185/803] Add support for MySQL/MariaDB databases #1817

This commit adds support for monitoring MySQL and MariaDB database
servers. The mysql2 package was choosen over mysql as it provides a
promise wrapper and is reportedly faster than the original mysql package
whilst still maintaining the same API.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 package-lock.json         | 165 ++++++++++++++++++++++++++++++++++++++
 package.json              |   1 +
 server/model/monitor.js   |  10 ++-
 server/util-server.js     |  23 ++++++
 src/pages/EditMonitor.vue |  10 ++-
 5 files changed, 206 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 65e380d1..80ae6d65 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -38,6 +38,7 @@
                 "limiter": "^2.1.0",
                 "mqtt": "^4.2.8",
                 "mssql": "^8.1.0",
+                "mysql2": "^2.3.3",
                 "node-cloudflared-tunnel": "~1.0.9",
                 "node-radius-client": "^1.0.0",
                 "nodemailer": "~6.6.5",
@@ -6359,6 +6360,14 @@
             "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
             "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
         },
+        "node_modules/denque": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+            "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
         "node_modules/depd": {
             "version": "1.1.2",
             "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -8449,6 +8458,14 @@
                 "node": ">=10"
             }
         },
+        "node_modules/generate-function": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
+            "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
+            "dependencies": {
+                "is-property": "^1.0.2"
+            }
+        },
         "node_modules/gensync": {
             "version": "1.0.0-beta.2",
             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -9414,6 +9431,11 @@
             "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
             "dev": true
         },
+        "node_modules/is-property": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+            "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
+        },
         "node_modules/is-regex": {
             "version": "1.1.4",
             "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -12334,6 +12356,11 @@
                 "node": ">=8"
             }
         },
+        "node_modules/long": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+            "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+        },
         "node_modules/lru-cache": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -12756,6 +12783,49 @@
                 "node": "^12.20.0 || >=14"
             }
         },
+        "node_modules/mysql2": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz",
+            "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==",
+            "dependencies": {
+                "denque": "^2.0.1",
+                "generate-function": "^2.3.1",
+                "iconv-lite": "^0.6.3",
+                "long": "^4.0.0",
+                "lru-cache": "^6.0.0",
+                "named-placeholders": "^1.1.2",
+                "seq-queue": "^0.0.5",
+                "sqlstring": "^2.3.2"
+            },
+            "engines": {
+                "node": ">= 8.0"
+            }
+        },
+        "node_modules/named-placeholders": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
+            "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
+            "dependencies": {
+                "lru-cache": "^4.1.3"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/named-placeholders/node_modules/lru-cache": {
+            "version": "4.1.5",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+            "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+            "dependencies": {
+                "pseudomap": "^1.0.2",
+                "yallist": "^2.1.2"
+            }
+        },
+        "node_modules/named-placeholders/node_modules/yallist": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+            "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
+        },
         "node_modules/nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -13990,6 +14060,11 @@
             "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
             "dev": true
         },
+        "node_modules/pseudomap": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+            "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
+        },
         "node_modules/psl": {
             "version": "1.9.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -15046,6 +15121,11 @@
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
             "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
         },
+        "node_modules/seq-queue": {
+            "version": "0.0.5",
+            "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
+            "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
+        },
         "node_modules/serve-static": {
             "version": "1.14.2",
             "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
@@ -15424,6 +15504,14 @@
             "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
             "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
         },
+        "node_modules/sqlstring": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
+            "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
         "node_modules/sshpk": {
             "version": "1.17.0",
             "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
@@ -22267,6 +22355,11 @@
             "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
             "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
         },
+        "denque": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+            "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
+        },
         "depd": {
             "version": "1.1.2",
             "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -23747,6 +23840,14 @@
                 "wide-align": "^1.1.2"
             }
         },
+        "generate-function": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
+            "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
+            "requires": {
+                "is-property": "^1.0.2"
+            }
+        },
         "gensync": {
             "version": "1.0.0-beta.2",
             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -24424,6 +24525,11 @@
             "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
             "dev": true
         },
+        "is-property": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+            "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
+        },
         "is-regex": {
             "version": "1.1.4",
             "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -26637,6 +26743,11 @@
                 }
             }
         },
+        "long": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+            "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+        },
         "lru-cache": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -26955,6 +27066,45 @@
                 }
             }
         },
+        "mysql2": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz",
+            "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==",
+            "requires": {
+                "denque": "^2.0.1",
+                "generate-function": "^2.3.1",
+                "iconv-lite": "^0.6.3",
+                "long": "^4.0.0",
+                "lru-cache": "^6.0.0",
+                "named-placeholders": "^1.1.2",
+                "seq-queue": "^0.0.5",
+                "sqlstring": "^2.3.2"
+            }
+        },
+        "named-placeholders": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
+            "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
+            "requires": {
+                "lru-cache": "^4.1.3"
+            },
+            "dependencies": {
+                "lru-cache": {
+                    "version": "4.1.5",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+                    "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+                    "requires": {
+                        "pseudomap": "^1.0.2",
+                        "yallist": "^2.1.2"
+                    }
+                },
+                "yallist": {
+                    "version": "2.1.2",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+                    "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
+                }
+            }
+        },
         "nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -27878,6 +28028,11 @@
             "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
             "dev": true
         },
+        "pseudomap": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+            "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
+        },
         "psl": {
             "version": "1.9.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -28677,6 +28832,11 @@
                 }
             }
         },
+        "seq-queue": {
+            "version": "0.0.5",
+            "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
+            "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
+        },
         "serve-static": {
             "version": "1.14.2",
             "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
@@ -28990,6 +29150,11 @@
             "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
             "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
         },
+        "sqlstring": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
+            "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
+        },
         "sshpk": {
             "version": "1.17.0",
             "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
diff --git a/package.json b/package.json
index 219042aa..9e19bf35 100644
--- a/package.json
+++ b/package.json
@@ -94,6 +94,7 @@
         "limiter": "^2.1.0",
         "mqtt": "^4.2.8",
         "mssql": "^8.1.0",
+        "mysql2": "^2.3.3",
         "node-cloudflared-tunnel": "~1.0.9",
         "node-radius-client": "^1.0.0",
         "nodemailer": "~6.6.5",
diff --git a/server/model/monitor.js b/server/model/monitor.js
index f96b4df0..ef350b62 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -7,7 +7,7 @@ dayjs.extend(timezone);
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
 const { log, UP, DOWN, PENDING, flipStatus, TimeLogger } = require("../../src/util");
-const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mqttAsync, setSetting, httpNtlm, radius } = require("../util-server");
+const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius } = require("../util-server");
 const { R } = require("redbean-node");
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { Notification } = require("../notification");
@@ -528,6 +528,14 @@ class Monitor extends BeanModel {
 
                     await postgresQuery(this.databaseConnectionString, this.databaseQuery);
 
+                    bean.msg = "";
+                    bean.status = UP;
+                    bean.ping = dayjs().valueOf() - startTime;
+                } else if (this.type === "mysql") {
+                    let startTime = dayjs().valueOf();
+
+                    await mysqlQuery(this.databaseConnectionString, this.databaseQuery);
+
                     bean.msg = "";
                     bean.status = UP;
                     bean.ping = dayjs().valueOf() - startTime;
diff --git a/server/util-server.js b/server/util-server.js
index 1517bcfe..7d271e85 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -13,6 +13,7 @@ const { badgeConstants } = require("./config");
 const mssql = require("mssql");
 const { Client } = require("pg");
 const postgresConParse = require("pg-connection-string").parse;
+const mysql = require("mysql2/promise");
 const { NtlmClient } = require("axios-ntlm");
 const { Settings } = require("./settings");
 const radiusClient = require("node-radius-client");
@@ -291,6 +292,28 @@ exports.postgresQuery = function (connectionString, query) {
     });
 };
 
+/**
+ * Run a query on MySQL/MariaDB
+ * @param {string} connectionString The database connection string
+ * @param {string} query The query to validate the database with
+ * @returns {Promise<(string[]|Object[]|Object)>}
+ */
+exports.mysqlQuery = function (connectionString, query) {
+    return new Promise((resolve, reject) => {
+        return mysql.createConnection(connectionString)
+            .then(connection => {
+                connection.connect();
+                return connection.query(query);
+            })
+            .then(res => {
+                resolve(res);
+            })
+            .catch(err => {
+                reject(err);
+            });
+    });
+};
+
 exports.radius = function (
     hostname,
     username,
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 947ff15e..a8fd2bbf 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -51,6 +51,9 @@
                                         <option value="postgres">
                                             PostgreSQL
                                         </option>
+                                        <option value="mysql">
+                                            MySQL/MariaDB
+                                        </option>
                                         <option value="radius">
                                             Radius
                                         </option>
@@ -235,8 +238,8 @@
                                 </div>
                             </template>
 
-                            <!-- SQL Server and PostgreSQL -->
-                            <template v-if="monitor.type === 'sqlserver' || monitor.type === 'postgres'">
+                            <!-- SQL Server / PostgreSQL / MySQL -->
+                            <template v-if="monitor.type === 'sqlserver' || monitor.type === 'postgres' || monitor.type === 'mysql'">
                                 <div class="my-3">
                                     <label for="sqlConnectionString" class="form-label">{{ $t("Connection String") }}</label>
 
@@ -246,6 +249,9 @@
                                     <template v-if="monitor.type === 'postgres'">
                                         <input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="postgres://username:password@host:port/database">
                                     </template>
+                                    <template v-if="monitor.type === 'mysql'">
+                                        <input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="mysql://username:password@host:port/database">
+                                    </template>
                                 </div>
                                 <div class="my-3">
                                     <label for="sqlQuery" class="form-label">{{ $t("Query") }}</label>

From 6a3eccf6a6631e249658c749f6a1bd3466347f92 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sun, 2 Oct 2022 02:26:38 +0100
Subject: [PATCH 186/803] Fixed alert features unnecessary URL field #2009

The filling of the URL field was incorrect previously. It has been
updated to handle new monitor types.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/notification-providers/teams.js | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/server/notification-providers/teams.js b/server/notification-providers/teams.js
index c398e03c..bcfc82c2 100644
--- a/server/notification-providers/teams.js
+++ b/server/notification-providers/teams.js
@@ -63,7 +63,7 @@ class Teams extends NotificationProvider {
             });
         }
 
-        if (monitorUrl) {
+        if (monitorUrl && monitorUrl !== "https://") {
             facts.push({
                 name: "URL",
                 value: monitorUrl,
@@ -127,13 +127,17 @@ class Teams extends NotificationProvider {
 
             let url;
 
-            if (monitorJSON["type"] === "port") {
-                url = monitorJSON["hostname"];
-                if (monitorJSON["port"]) {
-                    url += ":" + monitorJSON["port"];
-                }
-            } else {
-                url = monitorJSON["url"];
+            switch (monitorJSON["type"]) {
+                case "http":
+                case "keywork":
+                    url = monitorJSON["url"];
+                    break;
+                case "docker":
+                    url = monitorJSON["docker_host"];
+                    break;
+                default:
+                    url = monitorJSON["hostname"];
+                    break;
             }
 
             const payload = this._notificationPayloadFactory({

From ed7bc0e6d194f603eb6ca658b47560c10eeb1c2a Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Sun, 2 Oct 2022 09:55:58 +0300
Subject: [PATCH 187/803] Update bg-BG.js

Added New Fields
---
 src/languages/bg-BG.js | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index a234e56f..2002bc46 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -562,4 +562,24 @@ export default {
     "Docker Host": "Docker хост",
     "Docker Hosts": "Docker хостове",
     trustProxyDescription: "Trust 'X-Forwarded-*' headers.  Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
+    Examples: "Примери",
+    "Home Assistant URL": "Home Assistant URL адрес",
+    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token можете да създадете, като кликнете върху името на профила си (долу ляво) и превъртите до най-долу, след това кликнете върху Създаване на токен. ",
+    "Notification Service": "Услуга за известяване",
+    "default: notify all devices": "по подразбиране: извести всички устройства",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Списък с услугите за известяване може да бъде намерен в Home Assistant под \"Developer Tools > Services\", там потърсете \"notification\", за да намерите името на вашето устройство/телефон.",
+    "Automations can optionally be triggered in Home Assistant:": "Автоматизациите могат да се задействат при нужда в Home Assistant:",
+    "Trigger type:": "Задействане тип:",
+    "Event type:": "Събитие тип:",
+    "Event data:": "Събитие данни:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "След което изберете действие, например да превключите сцената, където RGB светлината е червена.",
+    "Frontend Version": "Фронтенд версия",
+    "Frontend Version do not match backend version!": "Фронтенд версията не съвпада с Бекенд версията!",
+    "Base URL": "Базов  URL адрес",
+    goAlertInfo: "GoAlert е приложение с отворен код за планиране на повиквания, автоматизирани ескалации и известия (като SMS или гласови повиквания). Автоматично ангажирайте точния човек, по точния начин и в точното време! {0}",
+    goAlertIntegrationKeyInfo: "Вземете общ API интеграционен ключ за услугата във формат \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обикновено стойността на параметъра token на копирания URL адрес.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Отпаднало: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
+    backupRecommend: "Моля, архивирайте дяла или папката (./data/) директно вместо това.",
 };

From da34685019b6902b3464423a72f3b867a614a1d7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?An=20=7C=20Anton=20R=C3=B6hm?=
 <18481195+AnTheMaker@users.noreply.github.com>
Date: Sun, 2 Oct 2022 13:38:33 +0200
Subject: [PATCH 188/803] fix typos

---
 CONTRIBUTING.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e9829c96..12fd6ed4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -27,7 +27,7 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
 
 ## Can I create a pull request for Uptime Kuma?
 
-Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create empty draft pull request or open an issue, so we can discuss first**. Especially for a large pull request or you don't know it will be merged or not.
+Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create an empty draft pull request or open an issue, so we can discuss first**. Especially for a large pull request or you don't know it will be merged or not.
 
 Here are some references:
 
@@ -48,7 +48,7 @@ Here are some references:
 - UI/UX is not close to Uptime Kuma 
 - Existing logic is completely modified or deleted for no reason
 - A function that is completely out of scope
-- Unnesscary large code changes (Hard to review, casuse code conflicts to other pull requests)
+- Unnecessary large code changes (Hard to review, causes code conflicts to other pull requests)
 
 I will mark your pull request in the [milestones](https://github.com/louislam/uptime-kuma/milestones), if I am plan to review and merge it.
 
@@ -183,7 +183,7 @@ By default, the Chromium window will be shown up during the test. Specifying `HE
 
 ## Dependencies
 
-Both frontend and backend share the same package.json. However, the frontend dependencies are eventually not be used in production environment, because it is usually also baked into dist files. So:
+Both frontend and backend share the same package.json. However, the frontend dependencies are eventually not used in the production environment, because it is usually also baked into dist files. So:
 
 - Frontend dependencies = "devDependencies"
   - Examples: vue, chart.js

From 8595824b5dd7ce4eb94d9e554be77e5f9fc982ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?An=20=7C=20Anton=20R=C3=B6hm?=
 <18481195+AnTheMaker@users.noreply.github.com>
Date: Sun, 2 Oct 2022 13:49:40 +0200
Subject: [PATCH 189/803] Improve German translation

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

diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index bd5bf87d..a6ae4077 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -68,7 +68,7 @@ export default {
     Timezone: "Zeitzone",
     "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
     "Allow indexing": "Indizierung zulassen",
-    "Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Seite ab",
+    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
     "Change Password": "Passwort ändern",
     "Current Password": "Aktuelles Passwort",
     "New Password": "Neues Passwort",
@@ -78,7 +78,7 @@ export default {
     "Disable Auth": "Authentifizierung deaktivieren",
     "Enable Auth": "Authentifizierung aktivieren",
     "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
-    "disableauth.message2": "Es ist für <strong>jemanden der eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access.",
+    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
     "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
     Logout: "Ausloggen",
     notificationDescription: "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
@@ -559,7 +559,7 @@ export default {
     "ntfy Topic": "ntfy Thema",
     Domain: "Domain",
     Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren modus, ein Passwort wird nicht benötigt.",
+    disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
     trustProxyDescription: "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
     wayToGetLineNotifyToken: "Du kannst hier ein Token erhalten: {0}",
     Examples: "Beispiele",

From a42f7416b525a9f067b9a5fb187429560782ab3c Mon Sep 17 00:00:00 2001
From: Mikkel-T <mikkel@mikkel-t.com>
Date: Sun, 2 Oct 2022 19:29:33 +0200
Subject: [PATCH 190/803] Improve the URL field in Discord embeds

Instead of having two different ways of showing the URL field in Discord embeds, always show the raw address.
---
 server/notification-providers/discord.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/notification-providers/discord.js b/server/notification-providers/discord.js
index 28ead7b7..3f1fc334 100644
--- a/server/notification-providers/discord.js
+++ b/server/notification-providers/discord.js
@@ -91,7 +91,7 @@ class Discord extends NotificationProvider {
                             },
                             {
                                 name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL",
-                                value: monitorJSON["type"] === "push" ? "Heartbeat" : address.startsWith("http") ? "[Visit Service](" + address + ")" : address,
+                                value: monitorJSON["type"] === "push" ? "Heartbeat" : address,
                             },
                             {
                                 name: "Time (UTC)",

From f6ac09b7513afccfed2c1e8a01921e3562351869 Mon Sep 17 00:00:00 2001
From: SametKUM <kumsamet@gmail.com>
Date: Sun, 2 Oct 2022 21:14:00 +0300
Subject: [PATCH 191/803] fix some translations

---
 src/languages/tr-TR.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index 75bc103c..1bf94993 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -224,7 +224,7 @@ export default {
     teams: "Microsoft Teams",
     "Webhook URL": "Webhook URL",
     wayToGetTeamsURL: "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
-    signal: "Signal",
+    signal: "Sinyal",
     Number: "Numara",
     Recipients: "Alıcılar",
     needSignalAPI: "REST API ile bir signal istemciniz olması gerekiyor.",
@@ -552,14 +552,14 @@ export default {
     deleteDockerHostMsg: "Bu docker ana bilgisayarını tüm monitörler için silmek istediğinizden emin misiniz?",
     socket: "Soket",
     tcp: "TCP / HTTP",
-    "Docker Container": "Docker Konteyneri",
+    "Docker Container": "Docker Konteyner",
     "Container Name / ID": "Konteyner Adı / Kimliği",
     "Docker Host": "Docker Ana Bilgisayarı",
     "Docker Hosts": "Docker Ana Bilgisayarları",
     "ntfy Topic": "ntfy Konu",
     Domain: "Domain",
     Workstation: "İş İstasyonu",
-    disableCloudflaredNoAuthMsg: "Yetki Yok modundasınız, şifre gerekli değil.",
+    disableCloudflaredNoAuthMsg: "Yetki yok modundasınız, şifre gerekli değil.",
     trustProxyDescription: "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.",
     wayToGetLineNotifyToken: "{0} adresinden bir erişim jetonu alabilirsiniz.",
     Examples: "Örnekler",

From d39a4770e05edf42c545af412bf23cde9c6f8d1a Mon Sep 17 00:00:00 2001
From: 5idereal <nelson22768384@gmail.com>
Date: Mon, 3 Oct 2022 13:11:39 +0800
Subject: [PATCH 192/803] sync

---
 src/languages/zh-TW.js | 56 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 50 insertions(+), 6 deletions(-)

diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
index 3405c02a..afb1fabc 100644
--- a/src/languages/zh-TW.js
+++ b/src/languages/zh-TW.js
@@ -2,6 +2,8 @@ export default {
     languageName: "繁體中文 (台灣)",
     checkEverySecond: "每 {0} 秒檢查一次",
     retryCheckEverySecond: "每 {0} 秒重試一次",
+    resendEveryXTimes: "Resend every {0} times",
+    resendDisabled: "Resend disabled",
     retriesDescription: "在服務被標記為離線並傳送通知前的最大重試次數",
     ignoreTLSError: "忽略 HTTPS 網站的 TLS/SSL 錯誤",
     upsideDownModeDescription: "反轉顯示狀態。若服務可以連線,將顯示離線。",
@@ -72,6 +74,7 @@ export default {
     "Heartbeat Interval": "心跳間隔",
     Retries: "重試次數",
     "Heartbeat Retry Interval": "心跳重試間隔",
+    "Resend Notification if Down X times consequently": "若 X 次心跳皆離線,重新傳送通知",
     Advanced: "進階",
     "Upside Down Mode": "顛倒模式",
     "Max. Redirects": "最大重新導向次數",
@@ -455,6 +458,8 @@ export default {
     "Message:": "訊息:",
     "Don't know how to get the token? Please read the guide:": "不知道如何取得權杖嗎?請閱讀指南:",
     "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您目前正透過 Cloudflare Tunnel 連線,可能會導致連線中斷。您確定要停止嗎?請輸入密碼以確認。",
+    "HTTP Headers": "HTTP 標頭",
+    "Trust Proxy": "信任的 Proxy",
     "Other Software": "其他軟體",
     "For example: nginx, Apache and Traefik.": "例如 nginx、Apache 和 Traefik。",
     "Please read": "請閱覽",
@@ -467,6 +472,7 @@ export default {
     "Domain Name Expiry Notification": "網域名稱到期通知",
     Proxy: "Proxy",
     "Date Created": "建立日期",
+    HomeAssistant: "Home Assistant",
     onebotHttpAddress: "OneBot HTTP 位址",
     onebotMessageType: "OneBot 訊息類型",
     onebotGroupMessage: "群組",
@@ -479,6 +485,12 @@ export default {
     "Domain Names": "網域名稱",
     signedInDisp: "以 {0} 身分登入",
     signedInDispDisabled: "驗證已停用。",
+    RadiusSecret: "Radius Secret",
+    RadiusSecretDescription: "Shared Secret between client and server",
+    RadiusCalledStationId: "Called Station Id",
+    RadiusCalledStationIdDescription: "Identifier of the called device",
+    RadiusCallingStationId: "Calling Station Id",
+    RadiusCallingStationIdDescription: "Identifier of the calling device",
     "Certificate Expiry Notification": "憑證到期通知",
     "API Username": "API 使用者名稱",
     "API Key": "API 金鑰",
@@ -504,9 +516,9 @@ export default {
     "pushoversounds intermission": "中場休息",
     "pushoversounds magic": "魔法",
     "pushoversounds mechanical": "機械",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds pianobar": "鋼琴酒吧",
+    "pushoversounds siren": "警鈴",
+    "pushoversounds spacealarm": "太空鬧鐘",
     "pushoversounds tugboat": "汽笛",
     "pushoversounds alien": "外星鬧鐘 (長)",
     "pushoversounds climb": "爬升 (長)",
@@ -531,11 +543,43 @@ export default {
     "Coming Soon": "即將推出",
     wayToGetClickSendSMSToken: "您可以從 {0} 取得 API 使用者名稱和金鑰。",
     "Connection String": "連線字串",
-    "Query": "查詢",
+    Query: "查詢",
     settingsCertificateExpiry: "TLS 憑證到期",
     certificationExpiryDescription: "TLS 將於 X 天後到期時觸發 HTTPS 監測器通知:",
+    "Setup Docker Host": "設定 Docker 主機",
+    "Connection Type": "連線類型",
+    "Docker Daemon": "Docker 精靈",
+    deleteDockerHostMsg: "您確定要為所有監測器刪除此 Docker 主機嗎?",
+    socket: "通訊端",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker 容器",
+    "Container Name / ID": "容器名稱 / ID",
+    "Docker Host": "Docker 主機",
+    "Docker Hosts": "Docker 主機",
     "ntfy Topic": "ntfy 主題",
-    "Domain": "網域",
-    "Workstation": "工作站",
+    Domain: "網域",
+    Workstation: "工作站",
     disableCloudflaredNoAuthMsg: "您處於無驗證模式。無須輸入密碼。",
+    trustProxyDescription: "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this. 如果您的 Uptime Kuma 架設於 Nginx 或 Apache ",
+    wayToGetLineNotifyToken: "您可以從 {0} 取得存取權杖",
+    Examples: "範例",
+    "Home Assistant URL": "Home Assistant 網址",
+    "Long-Lived Access Token": "長期有效存取權杖",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要建立長期有效存取權杖,請點擊您的個人檔案名稱 (左下角),捲動至最下方,然後點擊建立權杖。",
+    "Notification Service": "通知服務",
+    "default: notify all devices": "預設:通知所有服務",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
+    "Automations can optionally be triggered in Home Assistant:": " 	自動化程序可以 can optionally be triggered in Home Assistant:",
+    "Trigger type:": "觸發器類型:",
+    "Event type:": "事件類型:",
+    "Event data:": "事件資料:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
+    "Frontend Version": "前端版本",
+    "Frontend Version do not match backend version!": "前端版本與後端版本不符!",
+    "Base URL": "Base URL",
+    goAlertInfo: "GoAlert 是用於待命排程、升級自動化,以及通知 (如簡訊或語音通話) 的開源應用程式。自動在正確的時間、用洽當的方法、聯絡合適的人! {0}",
+    goAlertIntegrationKeyInfo: "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup. 由於新功能的增加,且此備份功能,故",
+    backupRecommend: "Please backup the volume or the data folder (./data/) directly instead. 請直接備份或 ./data/ 資料夾",
 };

From 7672057319c28ec2957622abbcb2559e3cf5abc6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 3 Oct 2022 15:51:29 +0800
Subject: [PATCH 193/803] [ntfy] Do not autofill

---
 src/components/notifications/Ntfy.vue | 14 +++++++-------
 src/languages/en.js                   |  1 +
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/components/notifications/Ntfy.vue b/src/components/notifications/Ntfy.vue
index a42dca30..ddcc3917 100644
--- a/src/components/notifications/Ntfy.vue
+++ b/src/components/notifications/Ntfy.vue
@@ -12,21 +12,21 @@
         </div>
     </div>
     <div class="mb-3">
-        <label for="ntfy-username" class="form-label">{{ $t("Username") }}</label>
+        <label for="ntfy-priority" class="form-label">{{ $t("Priority") }}</label>
+        <input id="ntfy-priority" v-model="$parent.notification.ntfyPriority" type="number" class="form-control" required min="1" max="5" step="1">
+    </div>
+    <div class="mb-3">
+        <label for="ntfy-username" class="form-label">{{ $t("Username") }} ({{ $t("Optional") }})</label>
         <div class="input-group mb-3">
             <input id="ntfy-username" v-model="$parent.notification.ntfyusername" type="text" class="form-control" required>
         </div>
     </div>
     <div class="mb-3">
-        <label for="ntfy-password" class="form-label">{{ $t("Password") }}</label>
+        <label for="ntfy-password" class="form-label">{{ $t("Password") }} ({{ $t("Optional") }})</label>
         <div class="input-group mb-3">
-            <HiddenInput id="ntfy-password" v-model="$parent.notification.ntfypassword"></HiddenInput>
+            <HiddenInput id="ntfy-password" v-model="$parent.notification.ntfypassword" autocomplete="new-password"></HiddenInput>
         </div>
     </div>
-    <div class="mb-3">
-        <label for="ntfy-priority" class="form-label">{{ $t("Priority") }}</label>
-        <input id="ntfy-priority" v-model="$parent.notification.ntfyPriority" type="number" class="form-control" required min="1" max="5" step="1">
-    </div>
 </template>
 
 <script>
diff --git a/src/languages/en.js b/src/languages/en.js
index 7d980f63..00e9551f 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -582,4 +582,5 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
     backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
+    "Optional": "Optional",
 };

From c2c3f981bcd1e6c487d2260b51542a816b36e763 Mon Sep 17 00:00:00 2001
From: 5idereal <nelson22768384@gmail.com>
Date: Mon, 3 Oct 2022 18:03:15 +0800
Subject: [PATCH 194/803] update zh-tw translation

---
 src/languages/zh-TW.js | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
index afb1fabc..e677d27e 100644
--- a/src/languages/zh-TW.js
+++ b/src/languages/zh-TW.js
@@ -2,8 +2,8 @@ export default {
     languageName: "繁體中文 (台灣)",
     checkEverySecond: "每 {0} 秒檢查一次",
     retryCheckEverySecond: "每 {0} 秒重試一次",
-    resendEveryXTimes: "Resend every {0} times",
-    resendDisabled: "Resend disabled",
+    resendEveryXTimes: "每 {0} 次便重新傳送",
+    resendDisabled: "重新傳送已停用",
     retriesDescription: "在服務被標記為離線並傳送通知前的最大重試次數",
     ignoreTLSError: "忽略 HTTPS 網站的 TLS/SSL 錯誤",
     upsideDownModeDescription: "反轉顯示狀態。若服務可以連線,將顯示離線。",
@@ -486,11 +486,11 @@ export default {
     signedInDisp: "以 {0} 身分登入",
     signedInDispDisabled: "驗證已停用。",
     RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Shared Secret between client and server",
-    RadiusCalledStationId: "Called Station Id",
-    RadiusCalledStationIdDescription: "Identifier of the called device",
-    RadiusCallingStationId: "Calling Station Id",
-    RadiusCallingStationIdDescription: "Identifier of the calling device",
+    RadiusSecretDescription: "客戶端與伺服器端的共享機密",
+    RadiusCalledStationId: "被叫站 Id",
+    RadiusCalledStationIdDescription: "被呼叫裝置的識別碼",
+    RadiusCallingStationId: "呼叫站 Id",
+    RadiusCallingStationIdDescription: "呼叫裝置的識別碼",
     "Certificate Expiry Notification": "憑證到期通知",
     "API Username": "API 使用者名稱",
     "API Key": "API 金鑰",
@@ -500,8 +500,8 @@ export default {
     "Octopush API Version": "Octopush API 版本",
     "Legacy Octopush-DM": "舊版 Octopush-DM",
     "endpoint": "端",
-    octopushAPIKey: "\"API key\" from HTTP API credentials in control panel",
-    octopushLogin: "\"Login\" from HTTP API credentials in control panel",
+    octopushAPIKey: "在控制台的 HTTP API 憑證取得的 \"API 金鑰\"",
+    octopushLogin: "在控制台的 HTTP API 憑證取得的 \"Login\"",
     promosmsLogin: "API 登入名稱",
     promosmsPassword: "API 密碼",
     "pushoversounds pushover": "Pushover (預設)",
@@ -560,7 +560,7 @@ export default {
     Domain: "網域",
     Workstation: "工作站",
     disableCloudflaredNoAuthMsg: "您處於無驗證模式。無須輸入密碼。",
-    trustProxyDescription: "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this. 如果您的 Uptime Kuma 架設於 Nginx 或 Apache ",
+    trustProxyDescription: "信任 'X-Forwarded-*' 標頭。如果您想要取得正確的客戶端 IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache 後方,您應啟用此選項。",
     wayToGetLineNotifyToken: "您可以從 {0} 取得存取權杖",
     Examples: "範例",
     "Home Assistant URL": "Home Assistant 網址",
@@ -568,18 +568,18 @@ export default {
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要建立長期有效存取權杖,請點擊您的個人檔案名稱 (左下角),捲動至最下方,然後點擊建立權杖。",
     "Notification Service": "通知服務",
     "default: notify all devices": "預設:通知所有服務",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
-    "Automations can optionally be triggered in Home Assistant:": " 	自動化程序可以 can optionally be triggered in Home Assistant:",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
+    "Automations can optionally be triggered in Home Assistant:": "可以選擇在 Home Assistant 中觸發自動化程序:",
     "Trigger type:": "觸發器類型:",
     "Event type:": "事件類型:",
     "Event data:": "事件資料:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "然後選擇動作,例如切換至 RGB 燈為紅色的場景。",
     "Frontend Version": "前端版本",
     "Frontend Version do not match backend version!": "前端版本與後端版本不符!",
-    "Base URL": "Base URL",
+    "Base URL": "基底網址",
     goAlertInfo: "GoAlert 是用於待命排程、升級自動化,以及通知 (如簡訊或語音通話) 的開源應用程式。自動在正確的時間、用洽當的方法、聯絡合適的人! {0}",
-    goAlertIntegrationKeyInfo: "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
+    goAlertIntegrationKeyInfo: "取得服務的通用 API 整合金鑰,格式為 \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"。通常是已複製的網址的權杖參數值。",
     goAlert: "GoAlert",
-    backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup. 由於新功能的增加,且此備份功能,故",
-    backupRecommend: "Please backup the volume or the data folder (./data/) directly instead. 請直接備份或 ./data/ 資料夾",
+    backupOutdatedWarning: "過時:由於新功能的增加,且未妥善維護,故此備份功能無法產生或復原完整備份。",
+    backupRecommend: "請直接備份磁碟區或 ./data/ 資料夾。",
 };

From b0d6b5b13d59de628eeb8820cfb3023d8501566a Mon Sep 17 00:00:00 2001
From: George Tsomlektsis <ultrawelfaredev@gmail.com>
Date: Mon, 3 Oct 2022 17:48:34 +0300
Subject: [PATCH 195/803] Fixed entry route not redirecting correctly when the
 status entry page changes slug.

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

diff --git a/server/server.js b/server/server.js
index 0c9a45e6..0f215245 100644
--- a/server/server.js
+++ b/server/server.js
@@ -155,7 +155,9 @@ let needSetup = false;
     Database.init(args);
     await initDatabase(testMode);
 
-    exports.entryPage = await setting("entryPage");
+    const entryPage = (await getSettings("general"))["entryPage"];
+    exports.entryPage = entryPage;
+    UptimeKumaServer.getInstance().entryPage = entryPage;
     await StatusPage.loadDomainMappingList();
 
     log.info("server", "Adding route");
@@ -176,14 +178,15 @@ let needSetup = false;
 
         log.debug("entry", `Request Domain: ${hostname}`);
 
+        const uptimeKumaEntryPage=UptimeKumaServer.getInstance().entryPage;
         if (hostname in StatusPage.domainMappingList) {
             log.debug("entry", "This is a status page domain");
 
             let slug = StatusPage.domainMappingList[hostname];
             await StatusPage.handleStatusPageResponse(response, server.indexHTML, slug);
 
-        } else if (exports.entryPage && exports.entryPage.startsWith("statusPage-")) {
-            response.redirect("/status/" + exports.entryPage.replace("statusPage-", ""));
+        } else if (uptimeKumaEntryPage && uptimeKumaEntryPage.startsWith('statusPage-')) {
+            response.redirect("/status/" + uptimeKumaEntryPage.replace("statusPage-", ""));
 
         } else {
             response.redirect("/dashboard");
@@ -200,7 +203,7 @@ let needSetup = false;
     // Robots.txt
     app.get("/robots.txt", async (_request, response) => {
         let txt = "User-agent: *\nDisallow:";
-        if (! await setting("searchEngineIndex")) {
+        if (!await setting("searchEngineIndex")) {
             txt += " /";
         }
         response.setHeader("Content-Type", "text/plain");
@@ -1085,6 +1088,7 @@ let needSetup = false;
 
                 await setSettings("general", data);
                 exports.entryPage = data.entryPage;
+                UptimeKumaServer.getInstance().entryPage = data.entryPage;
 
                 callback({
                     ok: true,

From 3e699f8ac3c544cd0dd7d9459ef9b8da3c7efd65 Mon Sep 17 00:00:00 2001
From: George Tsomlektsis <ultrawelfaredev@gmail.com>
Date: Mon, 3 Oct 2022 18:01:52 +0300
Subject: [PATCH 196/803] Fix linting errors.

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

diff --git a/server/server.js b/server/server.js
index 0f215245..620e5bb4 100644
--- a/server/server.js
+++ b/server/server.js
@@ -178,14 +178,14 @@ let needSetup = false;
 
         log.debug("entry", `Request Domain: ${hostname}`);
 
-        const uptimeKumaEntryPage=UptimeKumaServer.getInstance().entryPage;
+        const uptimeKumaEntryPage = UptimeKumaServer.getInstance().entryPage;
         if (hostname in StatusPage.domainMappingList) {
             log.debug("entry", "This is a status page domain");
 
             let slug = StatusPage.domainMappingList[hostname];
             await StatusPage.handleStatusPageResponse(response, server.indexHTML, slug);
 
-        } else if (uptimeKumaEntryPage && uptimeKumaEntryPage.startsWith('statusPage-')) {
+        } else if (uptimeKumaEntryPage && uptimeKumaEntryPage.startsWith("statusPage-")) {
             response.redirect("/status/" + uptimeKumaEntryPage.replace("statusPage-", ""));
 
         } else {

From 068675716086fe8cd24922dddc6c7d2db5c07a95 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 4 Oct 2022 16:19:56 +0800
Subject: [PATCH 197/803] [Docker Monitor] Change `tcp://` to `http://`

---
 server/docker.js                                | 14 +++++++++++++-
 server/model/monitor.js                         |  3 ++-
 server/socket-handlers/docker-socket-handler.js |  2 +-
 src/components/DockerHostDialog.vue             |  3 ++-
 4 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/server/docker.js b/server/docker.js
index 177fa6cb..ff231502 100644
--- a/server/docker.js
+++ b/server/docker.js
@@ -75,7 +75,7 @@ class DockerHost {
         if (dockerHost.dockerType === "socket") {
             options.socketPath = dockerHost.dockerDaemon;
         } else if (dockerHost.dockerType === "tcp") {
-            options.baseURL = dockerHost.dockerDaemon;
+            options.baseURL = DockerHost.patchDockerURL(dockerHost.dockerDaemon);
         }
 
         let res = await axios.request(options);
@@ -99,6 +99,18 @@ class DockerHost {
         }
 
     }
+
+    /**
+     * Since axios 0.27.X, it does not accept `tcp://` protocol.
+     * Change it to `http://` on the fly in order to fix it. (https://github.com/louislam/uptime-kuma/issues/2165)
+     */
+    static patchDockerURL(url) {
+        if (typeof url === "string") {
+            // Replace the first occurrence only with g
+            return url.replace(/tcp:\/\//g, "http://");
+        }
+        return url;
+    }
 }
 
 module.exports = {
diff --git a/server/model/monitor.js b/server/model/monitor.js
index f96b4df0..ac892560 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -17,6 +17,7 @@ const version = require("../../package.json").version;
 const apicache = require("../modules/apicache");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
+const { DockerHost } = require("../docker");
 
 /**
  * status:
@@ -498,7 +499,7 @@ class Monitor extends BeanModel {
                     if (dockerHost._dockerType === "socket") {
                         options.socketPath = dockerHost._dockerDaemon;
                     } else if (dockerHost._dockerType === "tcp") {
-                        options.baseURL = dockerHost._dockerDaemon;
+                        options.baseURL = DockerHost.patchDockerURL(dockerHost._dockerDaemon);
                     }
 
                     log.debug(`[${this.name}] Axios Request`);
diff --git a/server/socket-handlers/docker-socket-handler.js b/server/socket-handlers/docker-socket-handler.js
index 5a53494d..542f18ce 100644
--- a/server/socket-handlers/docker-socket-handler.js
+++ b/server/socket-handlers/docker-socket-handler.js
@@ -56,7 +56,7 @@ module.exports.dockerSocketHandler = (socket) => {
             let amount = await DockerHost.testDockerHost(dockerHost);
             let msg;
 
-            if (amount > 1) {
+            if (amount >= 1) {
                 msg = "Connected Successfully. Amount of containers: " + amount;
             } else {
                 msg = "Connected Successfully, but there are no containers?";
diff --git a/src/components/DockerHostDialog.vue b/src/components/DockerHostDialog.vue
index 92a8ce45..50ffa49c 100644
--- a/src/components/DockerHostDialog.vue
+++ b/src/components/DockerHostDialog.vue
@@ -30,7 +30,8 @@
                                 {{ $t("Examples") }}:
                                 <ul>
                                     <li>/var/run/docker.sock</li>
-                                    <li>tcp://localhost:2375</li>
+                                    <li>http://localhost:2375</li>
+                                    <li>https://localhost:2376 (TLS)</li>
                                 </ul>
                             </div>
                         </div>

From 16b2cf0e89ea421aa2640e3c1fa330e6d2f837e4 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 4 Oct 2022 17:50:11 +0800
Subject: [PATCH 198/803] Update to 1.18.2

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

diff --git a/package.json b/package.json
index 219042aa..2357bfe4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.0",
+    "version": "1.18.2",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -40,7 +40,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.18.0 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.18.2 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From afbc283423c633240c9628308508c9c32ec69d8b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 4 Oct 2022 22:23:57 +0800
Subject: [PATCH 199/803] Move Cypress directory and convert it to JavaScript
 (#2170)

---
 config/cypress.config.js                      | 26 +++++++++++++++++++
 cypress.config.ts                             | 15 -----------
 cypress/e2e/setup.cy.ts                       | 24 -----------------
 cypress/support/actors/actor.ts               |  8 ------
 cypress/support/e2e.ts                        |  1 -
 cypress/support/tasks/setup-task.ts           | 15 -----------
 package.json                                  |  3 ++-
 src/util.js                                   |  6 ++---
 test/cypress/e2e/setup.cy.js                  | 18 +++++++++++++
 {cypress => test/cypress}/plugins/index.js    |  0
 test/cypress/support/actors/actor.js          |  8 ++++++
 .../cypress/support/commands.js               |  0
 .../cypress/support/const/user-data.js        |  2 +-
 test/cypress/support/e2e.js                   |  1 +
 .../cypress/support/pages/dashboard-page.js   |  2 +-
 .../cypress/support/pages/setup-page.js       |  2 +-
 test/cypress/support/tasks/setup-task.js      | 11 ++++++++
 tsconfig.json                                 |  8 +++---
 18 files changed, 75 insertions(+), 75 deletions(-)
 create mode 100644 config/cypress.config.js
 delete mode 100644 cypress.config.ts
 delete mode 100644 cypress/e2e/setup.cy.ts
 delete mode 100644 cypress/support/actors/actor.ts
 delete mode 100644 cypress/support/e2e.ts
 delete mode 100644 cypress/support/tasks/setup-task.ts
 create mode 100644 test/cypress/e2e/setup.cy.js
 rename {cypress => test/cypress}/plugins/index.js (100%)
 create mode 100644 test/cypress/support/actors/actor.js
 rename cypress/support/commands.ts => test/cypress/support/commands.js (100%)
 rename cypress/support/const/user-data.ts => test/cypress/support/const/user-data.js (62%)
 create mode 100644 test/cypress/support/e2e.js
 rename cypress/support/pages/dasboard-page.ts => test/cypress/support/pages/dashboard-page.js (62%)
 rename cypress/support/pages/setup-page.ts => test/cypress/support/pages/setup-page.js (90%)
 create mode 100644 test/cypress/support/tasks/setup-task.js

diff --git a/config/cypress.config.js b/config/cypress.config.js
new file mode 100644
index 00000000..4eeb6845
--- /dev/null
+++ b/config/cypress.config.js
@@ -0,0 +1,26 @@
+const { defineConfig } = require("cypress");
+
+module.exports = defineConfig({
+    e2e: {
+        setupNodeEvents(on, config) {
+
+        },
+        fixturesFolder: "test/cypress/fixtures",
+        screenshotsFolder: "test/cypress/screenshots",
+        videosFolder: "test/cypress/videos",
+        downloadsFolder: "test/cypress/downloads",
+        supportFile: "test/cypress/support/e2e.js",
+        baseUrl: "http://localhost:3002",
+        defaultCommandTimeout: 10000,
+        pageLoadTimeout: 60000,
+        viewportWidth: 1920,
+        viewportHeight: 1080,
+        specPattern: [
+            "test/cypress/e2e/setup.cy.js",
+            "test/cypress/e2e/**/*.js"
+        ],
+    },
+    env: {
+        baseUrl: "http://localhost:3002",
+    },
+});
diff --git a/cypress.config.ts b/cypress.config.ts
deleted file mode 100644
index d97e0875..00000000
--- a/cypress.config.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { defineConfig } from "cypress";
-
-export default defineConfig({
-    e2e: {
-        baseUrl: "http://localhost:3002",
-        defaultCommandTimeout: 10000,
-        pageLoadTimeout: 60000,
-        viewportWidth: 1920,
-        viewportHeight: 1080,
-        specPattern: ["cypress/e2e/setup.cy.ts", "cypress/e2e/**/*.ts"],
-    },
-    env: {
-        baseUrl: "http://localhost:3002",
-    },
-});
diff --git a/cypress/e2e/setup.cy.ts b/cypress/e2e/setup.cy.ts
deleted file mode 100644
index 94e18ede..00000000
--- a/cypress/e2e/setup.cy.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { actor } from "../support/actors/actor";
-import { DEFAULT_USER_DATA } from "../support/const/user-data";
-import { DashboardPage } from "../support/pages/dasboard-page";
-import { SetupPage } from "../support/pages/setup-page";
-
-describe("user can create a new account on setup page", () => {
-    before(() => {
-        cy.visit("/setup");
-    });
-
-    it("user can create new account", () => {
-        cy.url().should("be.equal", SetupPage.url);
-        actor.setupTask.fillAndSubmitSetupForm(
-            DEFAULT_USER_DATA.username,
-            DEFAULT_USER_DATA.password,
-            DEFAULT_USER_DATA.password
-        );
-
-        cy.url().should("be.equal", DashboardPage.url);
-        cy.get('[role="alert"]')
-            .should("be.visible")
-            .and("contain.text", "Added Successfully.");
-    });
-});
diff --git a/cypress/support/actors/actor.ts b/cypress/support/actors/actor.ts
deleted file mode 100644
index 680c26ce..00000000
--- a/cypress/support/actors/actor.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { SetupTask } from "../tasks/setup-task";
-
-class Actor {
-    setupTask: SetupTask = new SetupTask();
-}
-
-const actor = new Actor();
-export { actor };
diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts
deleted file mode 100644
index f887c29a..00000000
--- a/cypress/support/e2e.ts
+++ /dev/null
@@ -1 +0,0 @@
-import "./commands";
diff --git a/cypress/support/tasks/setup-task.ts b/cypress/support/tasks/setup-task.ts
deleted file mode 100644
index 866e3ca5..00000000
--- a/cypress/support/tasks/setup-task.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { SetupPage } from "../pages/setup-page";
-
-export class SetupTask {
-    fillAndSubmitSetupForm(
-        username: string,
-        password: string,
-        passwordRepeat: string
-    ) {
-        cy.get(SetupPage.usernameInput).type(username);
-        cy.get(SetupPage.passWordInput).type(password);
-        cy.get(SetupPage.passwordRepeatInput).type(passwordRepeat);
-
-        cy.get(SetupPage.submitSetupForm).click();
-    }
-}
diff --git a/package.json b/package.json
index 2357bfe4..479876a6 100644
--- a/package.json
+++ b/package.json
@@ -62,7 +62,8 @@
         "build-dist-and-restart": "npm run build && npm run start-server-dev",
         "start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev",
         "cy:test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --e2e",
-        "cy:run": "npx cypress run --browser chrome --headless"
+        "cy:run": "npx cypress run --browser chrome --headless --config-file ./config/cypress.config.js",
+        "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\""
     },
     "dependencies": {
         "@louislam/sqlite3": "~15.0.6",
diff --git a/src/util.js b/src/util.js
index d5e3617f..d766feb7 100644
--- a/src/util.js
+++ b/src/util.js
@@ -280,9 +280,9 @@ function getCryptoRandomInt(min, max) {
 }
 exports.getCryptoRandomInt = getCryptoRandomInt;
 /**
- * Generate a secret
- * @param length Lenght of secret to generate
- * @returns
+ * Generate a random alphanumeric string of fixed length
+ * @param length Length of string to generate
+ * @returns string
  */
 function genSecret(length = 64) {
     let secret = "";
diff --git a/test/cypress/e2e/setup.cy.js b/test/cypress/e2e/setup.cy.js
new file mode 100644
index 00000000..57960403
--- /dev/null
+++ b/test/cypress/e2e/setup.cy.js
@@ -0,0 +1,18 @@
+const actor = require("../support/actors/actor");
+const userData = require("../support/const/user-data");
+const dashboardPage = require("../support/pages/dashboard-page");
+const setupPage = require("../support/pages/setup-page");
+
+describe("user can create a new account on setup page", () => {
+    before(() => {
+        cy.visit("/setup");
+    });
+    it("user can create new account", () => {
+        cy.url().should("be.equal", setupPage.SetupPage.url);
+        actor.actor.setupTask.fillAndSubmitSetupForm(userData.DEFAULT_USER_DATA.username, userData.DEFAULT_USER_DATA.password, userData.DEFAULT_USER_DATA.password);
+        cy.url().should("be.equal", dashboardPage.DashboardPage.url);
+        cy.get('[role="alert"]')
+            .should("be.visible")
+            .and("contain.text", "Added Successfully.");
+    });
+});
diff --git a/cypress/plugins/index.js b/test/cypress/plugins/index.js
similarity index 100%
rename from cypress/plugins/index.js
rename to test/cypress/plugins/index.js
diff --git a/test/cypress/support/actors/actor.js b/test/cypress/support/actors/actor.js
new file mode 100644
index 00000000..9775880b
--- /dev/null
+++ b/test/cypress/support/actors/actor.js
@@ -0,0 +1,8 @@
+const setupTask = require("../tasks/setup-task");
+class Actor {
+    constructor() {
+        this.setupTask = new setupTask.SetupTask();
+    }
+}
+const actor = new Actor();
+exports.actor = actor;
diff --git a/cypress/support/commands.ts b/test/cypress/support/commands.js
similarity index 100%
rename from cypress/support/commands.ts
rename to test/cypress/support/commands.js
diff --git a/cypress/support/const/user-data.ts b/test/cypress/support/const/user-data.js
similarity index 62%
rename from cypress/support/const/user-data.ts
rename to test/cypress/support/const/user-data.js
index ee2264dd..983597bd 100644
--- a/cypress/support/const/user-data.ts
+++ b/test/cypress/support/const/user-data.js
@@ -1,4 +1,4 @@
-export const DEFAULT_USER_DATA = {
+exports.DEFAULT_USER_DATA = {
     username: "testuser",
     password: "testuser123",
 };
diff --git a/test/cypress/support/e2e.js b/test/cypress/support/e2e.js
new file mode 100644
index 00000000..449ab857
--- /dev/null
+++ b/test/cypress/support/e2e.js
@@ -0,0 +1 @@
+require("./commands");
diff --git a/cypress/support/pages/dasboard-page.ts b/test/cypress/support/pages/dashboard-page.js
similarity index 62%
rename from cypress/support/pages/dasboard-page.ts
rename to test/cypress/support/pages/dashboard-page.js
index 48660dc1..fc2d67e1 100644
--- a/cypress/support/pages/dasboard-page.ts
+++ b/test/cypress/support/pages/dashboard-page.js
@@ -1,3 +1,3 @@
-export const DashboardPage = {
+exports.DashboardPage = {
     url: Cypress.env("baseUrl") + "/dashboard",
 };
diff --git a/cypress/support/pages/setup-page.ts b/test/cypress/support/pages/setup-page.js
similarity index 90%
rename from cypress/support/pages/setup-page.ts
rename to test/cypress/support/pages/setup-page.js
index 8c1b9cfa..44a525a8 100644
--- a/cypress/support/pages/setup-page.ts
+++ b/test/cypress/support/pages/setup-page.js
@@ -1,4 +1,4 @@
-export const SetupPage = {
+exports.SetupPage = {
     url: Cypress.env("baseUrl") + "/setup",
     usernameInput: '[data-cy="username-input"]',
     passWordInput: '[data-cy="password-input"]',
diff --git a/test/cypress/support/tasks/setup-task.js b/test/cypress/support/tasks/setup-task.js
new file mode 100644
index 00000000..205f78c2
--- /dev/null
+++ b/test/cypress/support/tasks/setup-task.js
@@ -0,0 +1,11 @@
+const setupPage = require("../pages/setup-page");
+
+class SetupTask {
+    fillAndSubmitSetupForm(username, password, passwordRepeat) {
+        cy.get(setupPage.SetupPage.usernameInput).type(username);
+        cy.get(setupPage.SetupPage.passWordInput).type(password);
+        cy.get(setupPage.SetupPage.passwordRepeatInput).type(passwordRepeat);
+        cy.get(setupPage.SetupPage.submitSetupForm).click();
+    }
+}
+exports.SetupTask = SetupTask;
diff --git a/tsconfig.json b/tsconfig.json
index cd5f7c5d..c5454642 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -11,11 +11,9 @@
         "removeComments": false,
         "preserveConstEnums": true,
         "sourceMap": false,
-        "strict": true,
-        "types": ["cypress"]
+        "strict": true
     },
     "files": [
-        "./src/util.ts",
-    ],
-    "include": ["cypress/**/*.ts"]
+        "./src/util.ts"
+    ]
 }

From f1a9046193f014148d6fcdaf53ee53c6a2f4608e Mon Sep 17 00:00:00 2001
From: Sympatron GmbH <35803463+Sympatron@users.noreply.github.com>
Date: Tue, 4 Oct 2022 15:30:19 +0000
Subject: [PATCH 200/803] Prevent terminal window from showing when using ping
 on Windows (#2152)

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

diff --git a/server/ping-lite.js b/server/ping-lite.js
index b7d003b8..05dff31d 100644
--- a/server/ping-lite.js
+++ b/server/ping-lite.js
@@ -105,7 +105,7 @@ Ping.prototype.send = function (callback) {
     let _exited;
     let _errored;
 
-    this._ping = spawn(this._bin, this._args); // spawn the binary
+    this._ping = spawn(this._bin, this._args, { windowsHide: true }); // spawn the binary
 
     this._ping.on("error", function (err) { // handle binary errors
         _errored = true;

From d565320f7422fe4493fc2f22962219780848476e Mon Sep 17 00:00:00 2001
From: Muhammed Hussein karimi <info@karimi.dev>
Date: Wed, 5 Oct 2022 08:23:58 +0330
Subject: [PATCH 201/803] New Demo Server (#2172)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
---
 README.md | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index b81c0be2..2ebf31a0 100644
--- a/README.md
+++ b/README.md
@@ -15,11 +15,12 @@ It is a self-hosted monitoring tool like "Uptime Robot".
 
 Try it!
 
-https://demo.uptime.kuma.pet
+https://demo.uptime.kuma.pet (Tokyo Server)
+https://demo.uptime-kuma.karimi.dev:27000 (Europe server)
 
-It is a temporary live demo, all data will be deleted after 10 minutes. The server is located in Tokyo, so if you live far from there, it may affect your experience. I suggest that you should install and try it out for the best demo experience.
+It is a temporary live demo, all data will be deleted after 10 minutes. Use the one that is closer to you, but I suggest that you should install and try it out for the best demo experience.
 
-VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much!
+Tokyo VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much!
 
 ## ⭐ Features
 

From 12696dd53ea1eb5407c46cda05d38ac30603121f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 5 Oct 2022 12:54:25 +0800
Subject: [PATCH 202/803] Update README.md

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

diff --git a/README.md b/README.md
index 2ebf31a0..cb81f4db 100644
--- a/README.md
+++ b/README.md
@@ -15,8 +15,8 @@ It is a self-hosted monitoring tool like "Uptime Robot".
 
 Try it!
 
-https://demo.uptime.kuma.pet (Tokyo Server)
-https://demo.uptime-kuma.karimi.dev:27000 (Europe server)
+- https://demo.uptime.kuma.pet (Tokyo Server)
+- https://demo.uptime-kuma.karimi.dev:27000 (Europe server)
 
 It is a temporary live demo, all data will be deleted after 10 minutes. Use the one that is closer to you, but I suggest that you should install and try it out for the best demo experience.
 

From e5145a209ac642a36da539dc414f26da75486c52 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 5 Oct 2022 13:28:13 +0800
Subject: [PATCH 203/803] Update cypress config

---
 config/cypress.config.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/config/cypress.config.js b/config/cypress.config.js
index 4eeb6845..26784e88 100644
--- a/config/cypress.config.js
+++ b/config/cypress.config.js
@@ -1,7 +1,9 @@
 const { defineConfig } = require("cypress");
 
 module.exports = defineConfig({
+    projectId: "vyjuem",
     e2e: {
+        experimentalStudio: true,
         setupNodeEvents(on, config) {
 
         },

From 64ba2dce2483eb413ac2c4c1ca6d3e513d8fcafe Mon Sep 17 00:00:00 2001
From: Cyril59310 <70776486+cyril59310@users.noreply.github.com>
Date: Wed, 5 Oct 2022 07:57:38 +0200
Subject: [PATCH 204/803] Update FR language (#2173)

---
 src/languages/fr-FR.js | 120 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 110 insertions(+), 10 deletions(-)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 10b8c1ba..22df2728 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -200,7 +200,7 @@ export default {
     chatIDNotFound: "ID du salon introuvable, envoyez un message via le bot avant",
     webhook: "Webhook",
     "Post URL": "Post URL",
-    "Content Type": "Content Type",
+    "Content Type": "Type de contenu",
     webhookJsonDesc: "{0} est bien/bon pour tous les serveurs HTTP modernes comme express.js",
     webhookFormDataDesc: "{multipart} est bien/bon pour du PHP, vous avez juste besoin de mettre le json via/depuis {decodeFunction}",
     smtp: "Email (SMTP)",
@@ -227,8 +227,8 @@ export default {
     wayToCheckSignalURL: "Vous pouvez regarder l'URL sur comment le mettre en place :",
     signalImportant: "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
     gotify: "Gotify",
-    "Application Token": "Application Token",
-    "Server URL": "Server URL",
+    "Application Token": "Jeton d'application",
+    "Server URL": "URL du serveur",
     Priority: "Priorité",
     slack: "Slack",
     "Icon Emoji": "Icon Emoji",
@@ -287,7 +287,7 @@ export default {
     promosmsTypeSpeed: "SMS SPEED - La plus haute des priorités dans le système. Très rapide et fiable mais cher (environ le double du prix d'un SMS FULL).",
     promosmsPhoneNumber: "Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)",
     promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Primary Base URL": "Primary Base URL",
+    "Primary Base URL": "URL principale",
     emailCustomSubject: "Sujet personalisé",
     clicksendsms: "ClickSend SMS",
     checkPrice: "Vérification {0} tarifs :",
@@ -342,13 +342,13 @@ export default {
     Title: "Titre",
     Content: "Contenu",
     Style: "Style",
-    info: "info",
+    info: "Info",
     warning: "Attention",
-    danger: "danger",
+    danger: "Danger",
     error: "Erreur",
-    critical: "critique",
-    primary: "primaire",
-    light: "blanc",
+    critical: "Critique",
+    primary: "Primaire",
+    light: "Blanc",
     dark: "Noir",
     Post: "Post",
     "Please input title and content": "Veuillez entrer le titre et le contenu",
@@ -390,7 +390,7 @@ export default {
     Installed: "Installé",
     "Not installed": "Pas installé",
     "Remove Token": "Supprimer le jeton",
-    Slug: "chemin",
+    Slug: "Chemin",
     "The slug is already taken. Please choose another slug.": "Le chemin est déjà pris. Veuillez choisir un autre chemin.",
     Authentication: "Authentication",
     "Page Not Found": "Page non trouvée",
@@ -431,4 +431,104 @@ export default {
     "Trigger type:": "Type de déclencheur:",
     "Event type:": "Type d'événement:",
     "Event data:": "Données d'événement:",
+    topic: "Topic",
+    topicExplanation: "MQTT sujet à surveiller",
+    successMessage: "Message de réussite",
+    successMessageExplanation: "MQTT message qui sera considéré comme un succès",
+    "Powered by": "Propulsé par",
+    serwersms: "SerwerSMS.pl",
+    stackfield: "Stackfield",
+    smtpDkimSettings: "Paramètres DKIM",
+    smtpDkimDesc: "Veuillez vous référer au Nodemailer DKIM {0} pour l'utilisation.",
+    documentation: "Documentation",
+    smtpDkimDomain: "Nom de domaine",
+    smtpDkimKeySelector: "Sélecteur de clé",
+    smtpDkimPrivateKey: "Clé privée",
+    smtpDkimHashAlgo: "Algorithme de hachage (facultatif)",
+    smtpDkimheaderFieldNames: "Clés d'en-tête à signer (facultatif)",
+    smtpDkimskipFields: "Clés d'en-tête à ne pas signer (facultatif)",
+    wayToGetPagerDutyKey: "Vous pouvez l'obtenir en allant dans Service -> Annuaire des services -> (Sélectionner un service) -> Intégrations -> Ajouter une intégration. Ici, vous pouvez rechercher \"Events API V2\". Plus d'infos {0}",
+    "Integration Key": "Clé d'intégration",
+    "Integration URL": "URL d'intégration",
+    "Auto resolve or acknowledged": "Résolution automatique ou accusé de réception",
+    "do nothing": "ne fais rien",
+    "auto acknowledged": "accusé de réception automatique",
+    "auto resolve": "résolution automatique",
+    AccessKeyId: "ID de clé d'accès",
+    SecretAccessKey: "Clé secrète d'accès",
+    PhoneNumbers: "Les numéros de téléphone",
+    SignName: "Signature",
+    "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
+    SecretKey: "Clé secrète",
+    "For safety, must use secret key": "Pour la sécurité, doit utiliser la clé secrète",
+    "Device Token": "Jeton d'appareil",
+    Platform: "Plateforme",
+    Retry: "Recommencez",
+    Topic: "Topic",
+    "Proxy server has authentication": "Le serveur proxy a une authentification",
+    Running: "Fonctionne",
+    "Not running": "Ne fonctionne pas",
+    Start: "Start",
+    Stop: "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "No Proxy": "Pas de Proxy",
+    "HTTP Basic Auth": "Authentification de base HTTP",
+    "Reverse Proxy": "Proxy inverse",
+    wayToGetCloudflaredURL: "(Télécharger cloudflared depuis {0})",
+    cloudflareWebsite: "le site Cloudflare ",
+    "Message:": "Message:",
+    "Don't know how to get the token? Please read the guide:": "Vous ne savez pas comment obtenir le jeton ? Veuillez lire le guide:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexion actuelle peut être perdue si vous vous connectez actuellement via Cloudflare Tunnel. Êtes-vous sûr de vouloir l'arrêter ? Tapez votre mot de passe actuel pour le confirmer.",
+    "HTTP Headers": "En-têtes HTTP",
+    "Trust Proxy": "Proxy de confiance",
+    "Other Software": "Autres logiciels",
+    "For example: nginx, Apache and Traefik.": "Par exemple : nginx, Apache et Traefik.",
+    "Please read": "S'il vous plaît Lisez",
+    "Valid To:": "Valable pour:",
+    "Days Remaining:": "Jours restant:",
+    "Domain Name Expiry Notification": "Notification d'expiration de nom de domaine",
+    "Date Created": "Date de création",
+    HomeAssistant: "Home Assistant",
+    onebotHttpAddress: "Adresse HTTP OneBot",
+    onebotMessageType: "Type de message OneBot",
+    onebotGroupMessage: "Groupe",
+    onebotUserOrGroupId: "ID de groupe/utilisateur",
+    onebotSafetyTips: "Pour des raisons de sécurité, vous devez définir un jeton d'accès",
+    "PushDeer Key": "Clé PushDeer",
+    "Show Powered By": "Afficher \"Propulsé par\"",
+    RadiusSecretDescription: "Secret partagé entre le client et le serveur",
+    RadiusCalledStationId: "Identifiant de la station appelée",
+    RadiusCalledStationIdDescription: "Identifiant de l'appareil appelé",
+    RadiusCallingStationId: "Identifiant de la station appelante",
+    RadiusCallingStationIdDescription: "Identifiant de l'appareil appelant",
+    "Certificate Expiry Notification": "Notification d'expiration du certificat",
+    "API Username": "Nom d'utilisateur de l'API",
+    "API Key": "clé API",
+    "Recipient Number": "Numéro du destinataire",
+    "From Name/Number": "De Nom/Numéro",
+    "Leave blank to use a shared sender number.": "Laisser vide pour utiliser un numéro d'expéditeur partagé.",
+    "Octopush API Version": "Version de l'API Octopush",
+    octopushAPIKey: "\"Clé API\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+    octopushLogin: "\"Connexion\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+    "Using a Reverse Proxy?": "Utiliser un proxy inverse ?",
+    "Check how to config it for WebSocket": "Vérifiez comment le configurer pour WebSocket",
+    wayToGetClickSendSMSToken: "Vous pouvez obtenir le nom d'utilisateur API et la clé API à partir de {0} .",
+    "Connection String": "Chaîne de connexion",
+    Query: "Requête",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Conteneur Docker",
+    Workstation: "Poste de travail",
+    disableCloudflaredNoAuthMsg: "Vous êtes en mode No Auth, un mot de passe n'est pas nécessaire.",
+    "Long-Lived Access Token": "Jeton d'accès de longue durée",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ensuite, choisissez une action, par exemple basculer la scène là où une lumière RVB est rouge.",
+    "Frontend Version": "Frontend Version",
+    "Frontend Version do not match backend version!": "La version frontale ne correspond pas à la version principale !",
+    "Base URL": "URL de base",
+    goAlertInfo: "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Engagez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
+    goAlertIntegrationKeyInfo: "Obtenez la clé d'intégration d'API générique pour le service dans ce format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" généralement la valeur du paramètre de jeton de l'URL copiée.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est un peu non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
+    backupRecommend: "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
+    Optional: "Optionnel",
+    squadcast: "Squadcast",
 };

From a5c102e750f49b510fbf229bb97ce338fadad1f3 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 5 Oct 2022 14:19:50 +0800
Subject: [PATCH 205/803] Update README.md

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

diff --git a/README.md b/README.md
index cb81f4db..55a6ec50 100644
--- a/README.md
+++ b/README.md
@@ -15,13 +15,11 @@ It is a self-hosted monitoring tool like "Uptime Robot".
 
 Try it!
 
-- https://demo.uptime.kuma.pet (Tokyo Server)
-- https://demo.uptime-kuma.karimi.dev:27000 (Europe server)
+- Tokyo Demo Server: https://demo.uptime.kuma.pet (Sponsored by [Uptime Kuma Sponsors](https://github.com/louislam/uptime-kuma#%EF%B8%8F-sponsors))
+- Europe Demo Server: https://demo.uptime-kuma.karimi.dev:27000 (Provided by [@mhkarimi1383](https://github.com/mhkarimi1383))
 
 It is a temporary live demo, all data will be deleted after 10 minutes. Use the one that is closer to you, but I suggest that you should install and try it out for the best demo experience.
 
-Tokyo VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much!
-
 ## ⭐ Features
 
 * Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / Ping / DNS Record / Push / Steam Game Server / Docker Containers.

From b993859926566efc31ed962029d857e04a58d493 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 5 Oct 2022 14:26:30 +0800
Subject: [PATCH 206/803] Drop Jest e2e testing (#2174)

---
 config/jest-debug-env.js        |   33 -
 config/jest-frontend.config.js  |    5 -
 config/jest-puppeteer.config.js |   20 -
 config/jest.config.js           |   12 -
 package-lock.json               | 1367 +------------------------------
 package.json                    |    4 -
 server/util-server.js           |    2 +-
 test/e2e.spec.js                |  329 --------
 test/frontend.spec.js           |   42 -
 test/prepare-jest.js            |   10 -
 10 files changed, 3 insertions(+), 1821 deletions(-)
 delete mode 100644 config/jest-debug-env.js
 delete mode 100644 config/jest-frontend.config.js
 delete mode 100644 config/jest-puppeteer.config.js
 delete mode 100644 config/jest.config.js
 delete mode 100644 test/e2e.spec.js
 delete mode 100644 test/frontend.spec.js
 delete mode 100644 test/prepare-jest.js

diff --git a/config/jest-debug-env.js b/config/jest-debug-env.js
deleted file mode 100644
index 74f6d783..00000000
--- a/config/jest-debug-env.js
+++ /dev/null
@@ -1,33 +0,0 @@
-const PuppeteerEnvironment = require("jest-environment-puppeteer");
-const util = require("util");
-
-class DebugEnv extends PuppeteerEnvironment {
-    async handleTestEvent(event, state) {
-        const ignoredEvents = [
-            "setup",
-            "add_hook",
-            "start_describe_definition",
-            "add_test",
-            "finish_describe_definition",
-            "run_start",
-            "run_describe_start",
-            "test_start",
-            "hook_start",
-            "hook_success",
-            "test_fn_start",
-            "test_fn_success",
-            "test_done",
-            "run_describe_finish",
-            "run_finish",
-            "teardown",
-            "test_fn_failure",
-        ];
-        if (!ignoredEvents.includes(event.name)) {
-            console.log(
-                new Date().toString() + ` Unhandled event [${event.name}] ` + util.inspect(event)
-            );
-        }
-    }
-}
-
-module.exports = DebugEnv;
diff --git a/config/jest-frontend.config.js b/config/jest-frontend.config.js
deleted file mode 100644
index ab6af7f1..00000000
--- a/config/jest-frontend.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
-    "rootDir": "..",
-    "testRegex": "./test/frontend.spec.js",
-};
-
diff --git a/config/jest-puppeteer.config.js b/config/jest-puppeteer.config.js
deleted file mode 100644
index dc4f7b34..00000000
--- a/config/jest-puppeteer.config.js
+++ /dev/null
@@ -1,20 +0,0 @@
-module.exports = {
-    "launch": {
-        "dumpio": true,
-        "slowMo": 500,
-        "headless": process.env.HEADLESS_TEST || false,
-        "userDataDir": "./data/test-chrome-profile",
-        args: [
-            "--disable-setuid-sandbox",
-            "--disable-gpu",
-            "--disable-dev-shm-usage",
-            "--no-default-browser-check",
-            "--no-experiments",
-            "--no-first-run",
-            "--no-pings",
-            "--no-sandbox",
-            "--no-zygote",
-            "--single-process",
-        ],
-    }
-};
diff --git a/config/jest.config.js b/config/jest.config.js
deleted file mode 100644
index 2d3f585e..00000000
--- a/config/jest.config.js
+++ /dev/null
@@ -1,12 +0,0 @@
-module.exports = {
-    "verbose": true,
-    "preset": "jest-puppeteer",
-    "globals": {
-        "__DEV__": true
-    },
-    "testRegex": "./test/e2e.spec.js",
-    "testEnvironment": "./config/jest-debug-env.js",
-    "rootDir": "..",
-    "testTimeout": 30000,
-};
-
diff --git a/package-lock.json b/package-lock.json
index 65e380d1..71827042 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.0",
+    "version": "1.18.2",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.18.0",
+            "version": "1.18.2",
             "license": "MIT",
             "dependencies": {
                 "@louislam/sqlite3": "~15.0.6",
@@ -83,12 +83,10 @@
                 "eslint-plugin-vue": "~8.7.1",
                 "favico.js": "^0.3.10",
                 "jest": "~27.2.5",
-                "jest-puppeteer": "~6.0.3",
                 "postcss-html": "~1.5.0",
                 "postcss-rtlcss": "~3.7.2",
                 "postcss-scss": "~4.0.4",
                 "prismjs": "^1.27.0",
-                "puppeteer": "~13.1.3",
                 "qrcode": "~1.5.0",
                 "rollup-plugin-visualizer": "^5.6.0",
                 "sass": "~1.42.1",
@@ -4231,15 +4229,6 @@
             "resolved": "https://registry.npmjs.org/args-parser/-/args-parser-1.3.0.tgz",
             "integrity": "sha512-If3Zi4BSjlQIJ9fgAhSiKi0oJtgMzSqh0H4wvl7XSeO16FKx7QqaHld8lZeEajPX7y1C5qKKeNgyrfyvmjmjUQ=="
         },
-        "node_modules/arr-union": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-            "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/array-flatten": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -5317,34 +5306,6 @@
                 "wrap-ansi": "^7.0.0"
             }
         },
-        "node_modules/clone-deep": {
-            "version": "0.2.4",
-            "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
-            "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==",
-            "dev": true,
-            "dependencies": {
-                "for-own": "^0.1.3",
-                "is-plain-object": "^2.0.1",
-                "kind-of": "^3.0.2",
-                "lazy-cache": "^1.0.3",
-                "shallow-clone": "^0.1.2"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/clone-deep/node_modules/is-plain-object": {
-            "version": "2.0.4",
-            "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-            "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-            "dev": true,
-            "dependencies": {
-                "isobject": "^3.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/clone-regexp": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
@@ -5935,19 +5896,6 @@
             "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz",
             "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg=="
         },
-        "node_modules/cwd": {
-            "version": "0.10.0",
-            "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz",
-            "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==",
-            "dev": true,
-            "dependencies": {
-                "find-pkg": "^0.1.2",
-                "fs-exists-sync": "^0.1.0"
-            },
-            "engines": {
-                "node": ">=0.8"
-            }
-        },
         "node_modules/cypress": {
             "version": "10.7.0",
             "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.7.0.tgz",
@@ -6400,12 +6348,6 @@
             "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz",
             "integrity": "sha512-nMNZG0zfMgmdv8S5O0TM5cpwNbGKRGPCxVsr0SmA3NZZy9CYBbuNLL0PD3Acx9e5LIUgwONXtM9kM6RlawPxEQ=="
         },
-        "node_modules/devtools-protocol": {
-            "version": "0.0.948846",
-            "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.948846.tgz",
-            "integrity": "sha512-5fGyt9xmMqUl2VI7+rnUkKCiAQIpLns8sfQtTENy5L70ktbNw0Z3TFJ1JoFNYdx/jffz4YXU45VF75wKZD7sZQ==",
-            "dev": true
-        },
         "node_modules/diff-sequences": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
@@ -7717,18 +7659,6 @@
                 "node": ">= 0.8.0"
             }
         },
-        "node_modules/expand-tilde": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
-            "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==",
-            "dev": true,
-            "dependencies": {
-                "os-homedir": "^1.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/expect": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
@@ -7744,12 +7674,6 @@
                 "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
             }
         },
-        "node_modules/expect-puppeteer": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-6.1.1.tgz",
-            "integrity": "sha512-cnQF96qdoEcOD63j5NQMc0RtW9WRMW/WHKXEKsuDQ2tszhVH3qC7zkXXS4D0LTt9qCB3DEExioqylsQXvqPrUw==",
-            "dev": true
-        },
         "node_modules/express": {
             "version": "4.17.3",
             "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
@@ -8073,115 +7997,6 @@
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
             "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
         },
-        "node_modules/find-file-up": {
-            "version": "0.1.3",
-            "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz",
-            "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==",
-            "dev": true,
-            "dependencies": {
-                "fs-exists-sync": "^0.1.0",
-                "resolve-dir": "^0.1.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/find-pkg": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz",
-            "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==",
-            "dev": true,
-            "dependencies": {
-                "find-file-up": "^0.1.2"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/find-process": {
-            "version": "1.4.7",
-            "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz",
-            "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.0.0",
-                "commander": "^5.1.0",
-                "debug": "^4.1.1"
-            },
-            "bin": {
-                "find-process": "bin/find-process.js"
-            }
-        },
-        "node_modules/find-process/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/find-process/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/find-process/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/find-process/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/find-process/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/find-process/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
         "node_modules/find-up": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -8233,27 +8048,6 @@
                 }
             }
         },
-        "node_modules/for-in": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-            "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/for-own": {
-            "version": "0.1.5",
-            "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
-            "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==",
-            "dev": true,
-            "dependencies": {
-                "for-in": "^1.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/forever-agent": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -8326,21 +8120,6 @@
                 "safe-buffer": "~5.1.0"
             }
         },
-        "node_modules/fs-constants": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
-            "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
-            "dev": true
-        },
-        "node_modules/fs-exists-sync": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
-            "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/fs-extra": {
             "version": "10.1.0",
             "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -8606,46 +8385,6 @@
                 "node": ">=10"
             }
         },
-        "node_modules/global-modules": {
-            "version": "0.2.3",
-            "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
-            "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==",
-            "dev": true,
-            "dependencies": {
-                "global-prefix": "^0.1.4",
-                "is-windows": "^0.2.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/global-prefix": {
-            "version": "0.1.5",
-            "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
-            "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==",
-            "dev": true,
-            "dependencies": {
-                "homedir-polyfill": "^1.0.0",
-                "ini": "^1.3.4",
-                "is-windows": "^0.2.0",
-                "which": "^1.2.12"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/global-prefix/node_modules/which": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-            "dev": true,
-            "dependencies": {
-                "isexe": "^2.0.0"
-            },
-            "bin": {
-                "which": "bin/which"
-            }
-        },
         "node_modules/globals": {
             "version": "11.12.0",
             "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -8822,18 +8561,6 @@
             "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==",
             "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues."
         },
-        "node_modules/homedir-polyfill": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
-            "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
-            "dev": true,
-            "dependencies": {
-                "parse-passwd": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/hosted-git-info": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
@@ -9186,12 +8913,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/is-buffer": {
-            "version": "1.1.6",
-            "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-            "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-            "dev": true
-        },
         "node_modules/is-callable": {
             "version": "1.2.4",
             "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
@@ -9254,15 +8975,6 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
-        "node_modules/is-extendable": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-            "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/is-extglob": {
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -9545,15 +9257,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/is-windows": {
-            "version": "0.2.0",
-            "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
-            "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/is-wsl": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -9588,15 +9291,6 @@
             "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
             "devOptional": true
         },
-        "node_modules/isobject": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-            "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/isstream": {
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -10064,91 +9758,6 @@
                 "node": ">=8"
             }
         },
-        "node_modules/jest-dev-server": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.1.1.tgz",
-            "integrity": "sha512-z5LnaGDvlIkdMv/rppSO4+rq+GyQKf1xI9oiBxf9/2EBeN2hxRaWiMvaLNDnHPZj2PAhBXsycrKslDDoZO2Xtw==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.1.2",
-                "cwd": "^0.10.0",
-                "find-process": "^1.4.7",
-                "prompts": "^2.4.2",
-                "spawnd": "^6.0.2",
-                "tree-kill": "^1.2.2",
-                "wait-on": "^6.0.1"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-dev-server/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-dev-server/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
         "node_modules/jest-diff": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
@@ -10367,89 +9976,6 @@
                 "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
             }
         },
-        "node_modules/jest-environment-puppeteer": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-6.1.1.tgz",
-            "integrity": "sha512-Ces37g8Gdj7QaVxszeoXlvmsZxcEJN9EPUdJt8fGMLA+6ARVFKyVmFgP9xVeGyjTvzsXdtIiJdeOKMLMeD8r2A==",
-            "dev": true,
-            "dependencies": {
-                "chalk": "^4.1.2",
-                "cwd": "^0.10.0",
-                "jest-dev-server": "^6.1.1",
-                "jest-environment-node": "^27.4.4",
-                "merge-deep": "^3.0.3"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/ansi-styles": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-            "dev": true,
-            "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/chalk": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-            "dev": true,
-            "dependencies": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/color-convert": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-            "dev": true,
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/color-name": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-            "dev": true
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/has-flag": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/jest-environment-puppeteer/node_modules/supports-color": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-            "dev": true,
-            "dependencies": {
-                "has-flag": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
         "node_modules/jest-get-type": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
@@ -10801,19 +10327,6 @@
                 }
             }
         },
-        "node_modules/jest-puppeteer": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-6.0.3.tgz",
-            "integrity": "sha512-6GRdbkWwNu8dfzo4icpwc50+K5ECYpWyD9sxpRa03PA8Hi3byl0dcAx+NjCivSezWjAl2Iwwhujqb+bczei0Bg==",
-            "dev": true,
-            "dependencies": {
-                "expect-puppeteer": "^6.0.2",
-                "jest-environment-puppeteer": "^6.0.3"
-            },
-            "peerDependencies": {
-                "puppeteer": ">= 1.5.0"
-            }
-        },
         "node_modules/jest-regex-util": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
@@ -11863,18 +11376,6 @@
             "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
             "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
         },
-        "node_modules/kind-of": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-            "dev": true,
-            "dependencies": {
-                "is-buffer": "^1.1.5"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/kleur": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -11982,15 +11483,6 @@
                 "node": "> 0.8"
             }
         },
-        "node_modules/lazy-cache": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
-            "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/leven": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -12454,20 +11946,6 @@
             "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
             "dev": true
         },
-        "node_modules/merge-deep": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
-            "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
-            "dev": true,
-            "dependencies": {
-                "arr-union": "^3.1.0",
-                "clone-deep": "^0.2.4",
-                "kind-of": "^3.0.2"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/merge-descriptors": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -12619,28 +12097,6 @@
                 "node": ">= 8"
             }
         },
-        "node_modules/mixin-object": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
-            "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==",
-            "dev": true,
-            "dependencies": {
-                "for-in": "^0.1.3",
-                "is-extendable": "^0.1.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/mixin-object/node_modules/for-in": {
-            "version": "0.1.8",
-            "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
-            "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/mkdirp": {
             "version": "1.0.4",
             "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -12652,12 +12108,6 @@
                 "node": ">=10"
             }
         },
-        "node_modules/mkdirp-classic": {
-            "version": "0.5.3",
-            "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
-            "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
-            "dev": true
-        },
         "node_modules/mqemitter": {
             "version": "4.5.0",
             "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
@@ -13292,15 +12742,6 @@
                 "node": ">= 0.8.0"
             }
         },
-        "node_modules/os-homedir": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-            "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/ospath": {
             "version": "1.2.2",
             "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
@@ -13426,15 +12867,6 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
-        "node_modules/parse-passwd": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-            "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/parse5": {
             "version": "7.0.0",
             "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz",
@@ -13910,15 +13342,6 @@
             "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
             "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
         },
-        "node_modules/progress": {
-            "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-            "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.4.0"
-            }
-        },
         "node_modules/prom-client": {
             "version": "13.2.0",
             "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-13.2.0.tgz",
@@ -13984,12 +13407,6 @@
                 "node": ">= 0.10"
             }
         },
-        "node_modules/proxy-from-env": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
-            "dev": true
-        },
         "node_modules/psl": {
             "version": "1.9.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -14013,87 +13430,6 @@
                 "node": ">=6"
             }
         },
-        "node_modules/puppeteer": {
-            "version": "13.1.3",
-            "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.1.3.tgz",
-            "integrity": "sha512-nqcJNThLUG0Dgo++2mMtGR2FCyg7olJJhj/rm0A65muyN3nrH6lGvnNRzEaNmSnHWvjaDIG9ox5kxQB+nXTg5A==",
-            "dev": true,
-            "hasInstallScript": true,
-            "dependencies": {
-                "debug": "4.3.2",
-                "devtools-protocol": "0.0.948846",
-                "extract-zip": "2.0.1",
-                "https-proxy-agent": "5.0.0",
-                "node-fetch": "2.6.7",
-                "pkg-dir": "4.2.0",
-                "progress": "2.0.3",
-                "proxy-from-env": "1.1.0",
-                "rimraf": "3.0.2",
-                "tar-fs": "2.1.1",
-                "unbzip2-stream": "1.4.3",
-                "ws": "8.2.3"
-            },
-            "engines": {
-                "node": ">=10.18.1"
-            }
-        },
-        "node_modules/puppeteer/node_modules/debug": {
-            "version": "4.3.2",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-            "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-            "dev": true,
-            "dependencies": {
-                "ms": "2.1.2"
-            },
-            "engines": {
-                "node": ">=6.0"
-            },
-            "peerDependenciesMeta": {
-                "supports-color": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/puppeteer/node_modules/https-proxy-agent": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
-            "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
-            "dev": true,
-            "dependencies": {
-                "agent-base": "6",
-                "debug": "4"
-            },
-            "engines": {
-                "node": ">= 6"
-            }
-        },
-        "node_modules/puppeteer/node_modules/ms": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-            "dev": true
-        },
-        "node_modules/puppeteer/node_modules/ws": {
-            "version": "8.2.3",
-            "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
-            "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
-            "dev": true,
-            "engines": {
-                "node": ">=10.0.0"
-            },
-            "peerDependencies": {
-                "bufferutil": "^4.0.1",
-                "utf-8-validate": "^5.0.2"
-            },
-            "peerDependenciesMeta": {
-                "bufferutil": {
-                    "optional": true
-                },
-                "utf-8-validate": {
-                    "optional": true
-                }
-            }
-        },
         "node_modules/qlobber": {
             "version": "5.0.3",
             "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
@@ -14728,19 +14064,6 @@
                 "node": ">=8"
             }
         },
-        "node_modules/resolve-dir": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
-            "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==",
-            "dev": true,
-            "dependencies": {
-                "expand-tilde": "^1.2.2",
-                "global-modules": "^0.2.3"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/resolve-from": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -15070,42 +14393,6 @@
             "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
             "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
         },
-        "node_modules/shallow-clone": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
-            "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==",
-            "dev": true,
-            "dependencies": {
-                "is-extendable": "^0.1.1",
-                "kind-of": "^2.0.1",
-                "lazy-cache": "^0.2.3",
-                "mixin-object": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/shallow-clone/node_modules/kind-of": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
-            "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==",
-            "dev": true,
-            "dependencies": {
-                "is-buffer": "^1.0.2"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/shallow-clone/node_modules/lazy-cache": {
-            "version": "0.2.7",
-            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
-            "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==",
-            "dev": true,
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/shebang-command": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -15359,17 +14646,6 @@
             "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==",
             "dev": true
         },
-        "node_modules/spawnd": {
-            "version": "6.0.2",
-            "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-6.0.2.tgz",
-            "integrity": "sha512-+YJtx0dvy2wt304MrHD//tASc84zinBUYU1jacPBzrjhZUd7RsDo25krxr4HUHAQzEQFuMAs4/p+yLYU5ciZ1w==",
-            "dev": true,
-            "dependencies": {
-                "exit": "^0.1.2",
-                "signal-exit": "^3.0.6",
-                "tree-kill": "^1.2.2"
-            }
-        },
         "node_modules/spdx-correct": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@@ -15914,40 +15190,6 @@
                 "node": ">= 10"
             }
         },
-        "node_modules/tar-fs": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
-            "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
-            "dev": true,
-            "dependencies": {
-                "chownr": "^1.1.1",
-                "mkdirp-classic": "^0.5.2",
-                "pump": "^3.0.0",
-                "tar-stream": "^2.1.4"
-            }
-        },
-        "node_modules/tar-fs/node_modules/chownr": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-            "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
-            "dev": true
-        },
-        "node_modules/tar-stream": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
-            "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
-            "dev": true,
-            "dependencies": {
-                "bl": "^4.0.3",
-                "end-of-stream": "^1.4.1",
-                "fs-constants": "^1.0.0",
-                "inherits": "^2.0.3",
-                "readable-stream": "^3.1.1"
-            },
-            "engines": {
-                "node": ">=6"
-            }
-        },
         "node_modules/tarn": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
@@ -16349,16 +15591,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/unbzip2-stream": {
-            "version": "1.4.3",
-            "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
-            "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
-            "dev": true,
-            "dependencies": {
-                "buffer": "^5.2.1",
-                "through": "^2.3.8"
-            }
-        },
         "node_modules/unicode-canonical-property-names-ecmascript": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -20628,12 +19860,6 @@
             "resolved": "https://registry.npmjs.org/args-parser/-/args-parser-1.3.0.tgz",
             "integrity": "sha512-If3Zi4BSjlQIJ9fgAhSiKi0oJtgMzSqh0H4wvl7XSeO16FKx7QqaHld8lZeEajPX7y1C5qKKeNgyrfyvmjmjUQ=="
         },
-        "arr-union": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-            "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
-            "dev": true
-        },
         "array-flatten": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -21462,30 +20688,6 @@
                 "wrap-ansi": "^7.0.0"
             }
         },
-        "clone-deep": {
-            "version": "0.2.4",
-            "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
-            "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==",
-            "dev": true,
-            "requires": {
-                "for-own": "^0.1.3",
-                "is-plain-object": "^2.0.1",
-                "kind-of": "^3.0.2",
-                "lazy-cache": "^1.0.3",
-                "shallow-clone": "^0.1.2"
-            },
-            "dependencies": {
-                "is-plain-object": {
-                    "version": "2.0.4",
-                    "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-                    "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-                    "dev": true,
-                    "requires": {
-                        "isobject": "^3.0.1"
-                    }
-                }
-            }
-        },
         "clone-regexp": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
@@ -21950,16 +21152,6 @@
             "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz",
             "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg=="
         },
-        "cwd": {
-            "version": "0.10.0",
-            "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz",
-            "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==",
-            "dev": true,
-            "requires": {
-                "find-pkg": "^0.1.2",
-                "fs-exists-sync": "^0.1.0"
-            }
-        },
         "cypress": {
             "version": "10.7.0",
             "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.7.0.tgz",
@@ -22299,12 +21491,6 @@
             "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz",
             "integrity": "sha512-nMNZG0zfMgmdv8S5O0TM5cpwNbGKRGPCxVsr0SmA3NZZy9CYBbuNLL0PD3Acx9e5LIUgwONXtM9kM6RlawPxEQ=="
         },
-        "devtools-protocol": {
-            "version": "0.0.948846",
-            "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.948846.tgz",
-            "integrity": "sha512-5fGyt9xmMqUl2VI7+rnUkKCiAQIpLns8sfQtTENy5L70ktbNw0Z3TFJ1JoFNYdx/jffz4YXU45VF75wKZD7sZQ==",
-            "dev": true
-        },
         "diff-sequences": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
@@ -23167,15 +22353,6 @@
             "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
             "dev": true
         },
-        "expand-tilde": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
-            "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==",
-            "dev": true,
-            "requires": {
-                "os-homedir": "^1.0.1"
-            }
-        },
         "expect": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
@@ -23188,12 +22365,6 @@
                 "jest-message-util": "^27.5.1"
             }
         },
-        "expect-puppeteer": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-6.1.1.tgz",
-            "integrity": "sha512-cnQF96qdoEcOD63j5NQMc0RtW9WRMW/WHKXEKsuDQ2tszhVH3qC7zkXXS4D0LTt9qCB3DEExioqylsQXvqPrUw==",
-            "dev": true
-        },
         "express": {
             "version": "4.17.3",
             "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
@@ -23464,87 +22635,6 @@
                 }
             }
         },
-        "find-file-up": {
-            "version": "0.1.3",
-            "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz",
-            "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==",
-            "dev": true,
-            "requires": {
-                "fs-exists-sync": "^0.1.0",
-                "resolve-dir": "^0.1.0"
-            }
-        },
-        "find-pkg": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz",
-            "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==",
-            "dev": true,
-            "requires": {
-                "find-file-up": "^0.1.2"
-            }
-        },
-        "find-process": {
-            "version": "1.4.7",
-            "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz",
-            "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==",
-            "dev": true,
-            "requires": {
-                "chalk": "^4.0.0",
-                "commander": "^5.1.0",
-                "debug": "^4.1.1"
-            },
-            "dependencies": {
-                "ansi-styles": {
-                    "version": "4.3.0",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
-                    "requires": {
-                        "color-convert": "^2.0.1"
-                    }
-                },
-                "chalk": {
-                    "version": "4.1.2",
-                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-                    "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-                    "dev": true,
-                    "requires": {
-                        "ansi-styles": "^4.1.0",
-                        "supports-color": "^7.1.0"
-                    }
-                },
-                "color-convert": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
-                    "requires": {
-                        "color-name": "~1.1.4"
-                    }
-                },
-                "color-name": {
-                    "version": "1.1.4",
-                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
-                },
-                "has-flag": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-                    "dev": true
-                },
-                "supports-color": {
-                    "version": "7.2.0",
-                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-                    "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-                    "dev": true,
-                    "requires": {
-                        "has-flag": "^4.0.0"
-                    }
-                }
-            }
-        },
         "find-up": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -23576,21 +22666,6 @@
             "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
             "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
         },
-        "for-in": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-            "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
-            "dev": true
-        },
-        "for-own": {
-            "version": "0.1.5",
-            "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
-            "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==",
-            "dev": true,
-            "requires": {
-                "for-in": "^1.0.1"
-            }
-        },
         "forever-agent": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -23653,18 +22728,6 @@
                 }
             }
         },
-        "fs-constants": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
-            "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
-            "dev": true
-        },
-        "fs-exists-sync": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
-            "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==",
-            "dev": true
-        },
         "fs-extra": {
             "version": "10.1.0",
             "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -23858,39 +22921,6 @@
                 }
             }
         },
-        "global-modules": {
-            "version": "0.2.3",
-            "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
-            "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==",
-            "dev": true,
-            "requires": {
-                "global-prefix": "^0.1.4",
-                "is-windows": "^0.2.0"
-            }
-        },
-        "global-prefix": {
-            "version": "0.1.5",
-            "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
-            "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==",
-            "dev": true,
-            "requires": {
-                "homedir-polyfill": "^1.0.0",
-                "ini": "^1.3.4",
-                "is-windows": "^0.2.0",
-                "which": "^1.2.12"
-            },
-            "dependencies": {
-                "which": {
-                    "version": "1.3.1",
-                    "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-                    "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-                    "dev": true,
-                    "requires": {
-                        "isexe": "^2.0.0"
-                    }
-                }
-            }
-        },
         "globals": {
             "version": "11.12.0",
             "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -24017,15 +23047,6 @@
             "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz",
             "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ=="
         },
-        "homedir-polyfill": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
-            "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
-            "dev": true,
-            "requires": {
-                "parse-passwd": "^1.0.0"
-            }
-        },
         "hosted-git-info": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
@@ -24275,12 +23296,6 @@
                 "has-tostringtag": "^1.0.0"
             }
         },
-        "is-buffer": {
-            "version": "1.1.6",
-            "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-            "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-            "dev": true
-        },
         "is-callable": {
             "version": "1.2.4",
             "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
@@ -24316,12 +23331,6 @@
             "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
             "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
         },
-        "is-extendable": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-            "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
-            "dev": true
-        },
         "is-extglob": {
             "version": "2.1.1",
             "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -24510,12 +23519,6 @@
                 "call-bind": "^1.0.2"
             }
         },
-        "is-windows": {
-            "version": "0.2.0",
-            "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
-            "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==",
-            "dev": true
-        },
         "is-wsl": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -24544,12 +23547,6 @@
             "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
             "devOptional": true
         },
-        "isobject": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-            "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
-            "dev": true
-        },
         "isstream": {
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -24893,72 +23890,6 @@
                 }
             }
         },
-        "jest-dev-server": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.1.1.tgz",
-            "integrity": "sha512-z5LnaGDvlIkdMv/rppSO4+rq+GyQKf1xI9oiBxf9/2EBeN2hxRaWiMvaLNDnHPZj2PAhBXsycrKslDDoZO2Xtw==",
-            "dev": true,
-            "requires": {
-                "chalk": "^4.1.2",
-                "cwd": "^0.10.0",
-                "find-process": "^1.4.7",
-                "prompts": "^2.4.2",
-                "spawnd": "^6.0.2",
-                "tree-kill": "^1.2.2",
-                "wait-on": "^6.0.1"
-            },
-            "dependencies": {
-                "ansi-styles": {
-                    "version": "4.3.0",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
-                    "requires": {
-                        "color-convert": "^2.0.1"
-                    }
-                },
-                "chalk": {
-                    "version": "4.1.2",
-                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-                    "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-                    "dev": true,
-                    "requires": {
-                        "ansi-styles": "^4.1.0",
-                        "supports-color": "^7.1.0"
-                    }
-                },
-                "color-convert": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
-                    "requires": {
-                        "color-name": "~1.1.4"
-                    }
-                },
-                "color-name": {
-                    "version": "1.1.4",
-                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
-                },
-                "has-flag": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-                    "dev": true
-                },
-                "supports-color": {
-                    "version": "7.2.0",
-                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-                    "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-                    "dev": true,
-                    "requires": {
-                        "has-flag": "^4.0.0"
-                    }
-                }
-            }
-        },
         "jest-diff": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
@@ -25124,70 +24055,6 @@
                 "jest-util": "^27.5.1"
             }
         },
-        "jest-environment-puppeteer": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-6.1.1.tgz",
-            "integrity": "sha512-Ces37g8Gdj7QaVxszeoXlvmsZxcEJN9EPUdJt8fGMLA+6ARVFKyVmFgP9xVeGyjTvzsXdtIiJdeOKMLMeD8r2A==",
-            "dev": true,
-            "requires": {
-                "chalk": "^4.1.2",
-                "cwd": "^0.10.0",
-                "jest-dev-server": "^6.1.1",
-                "jest-environment-node": "^27.4.4",
-                "merge-deep": "^3.0.3"
-            },
-            "dependencies": {
-                "ansi-styles": {
-                    "version": "4.3.0",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
-                    "requires": {
-                        "color-convert": "^2.0.1"
-                    }
-                },
-                "chalk": {
-                    "version": "4.1.2",
-                    "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-                    "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-                    "dev": true,
-                    "requires": {
-                        "ansi-styles": "^4.1.0",
-                        "supports-color": "^7.1.0"
-                    }
-                },
-                "color-convert": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
-                    "requires": {
-                        "color-name": "~1.1.4"
-                    }
-                },
-                "color-name": {
-                    "version": "1.1.4",
-                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
-                },
-                "has-flag": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-                    "dev": true
-                },
-                "supports-color": {
-                    "version": "7.2.0",
-                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-                    "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-                    "dev": true,
-                    "requires": {
-                        "has-flag": "^4.0.0"
-                    }
-                }
-            }
-        },
         "jest-get-type": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
@@ -25448,16 +24315,6 @@
             "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
             "dev": true
         },
-        "jest-puppeteer": {
-            "version": "6.0.3",
-            "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-6.0.3.tgz",
-            "integrity": "sha512-6GRdbkWwNu8dfzo4icpwc50+K5ECYpWyD9sxpRa03PA8Hi3byl0dcAx+NjCivSezWjAl2Iwwhujqb+bczei0Bg==",
-            "dev": true,
-            "requires": {
-                "expect-puppeteer": "^6.0.2",
-                "jest-environment-puppeteer": "^6.0.3"
-            }
-        },
         "jest-regex-util": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
@@ -26277,15 +25134,6 @@
             "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
             "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
         },
-        "kind-of": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-            "dev": true,
-            "requires": {
-                "is-buffer": "^1.1.5"
-            }
-        },
         "kleur": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -26349,12 +25197,6 @@
             "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
             "dev": true
         },
-        "lazy-cache": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
-            "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
-            "dev": true
-        },
         "leven": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -26722,17 +25564,6 @@
             "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
             "dev": true
         },
-        "merge-deep": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
-            "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
-            "dev": true,
-            "requires": {
-                "arr-union": "^3.1.0",
-                "clone-deep": "^0.2.4",
-                "kind-of": "^3.0.2"
-            }
-        },
         "merge-descriptors": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -26844,35 +25675,11 @@
                 "yallist": "^4.0.0"
             }
         },
-        "mixin-object": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
-            "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==",
-            "dev": true,
-            "requires": {
-                "for-in": "^0.1.3",
-                "is-extendable": "^0.1.1"
-            },
-            "dependencies": {
-                "for-in": {
-                    "version": "0.1.8",
-                    "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
-                    "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==",
-                    "dev": true
-                }
-            }
-        },
         "mkdirp": {
             "version": "1.0.4",
             "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
             "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         },
-        "mkdirp-classic": {
-            "version": "0.5.3",
-            "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
-            "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
-            "dev": true
-        },
         "mqemitter": {
             "version": "4.5.0",
             "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
@@ -27381,12 +26188,6 @@
                 "word-wrap": "^1.2.3"
             }
         },
-        "os-homedir": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-            "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
-            "dev": true
-        },
         "ospath": {
             "version": "1.2.2",
             "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
@@ -27473,12 +26274,6 @@
                 "lines-and-columns": "^1.1.6"
             }
         },
-        "parse-passwd": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-            "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
-            "dev": true
-        },
         "parse5": {
             "version": "7.0.0",
             "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz",
@@ -27811,12 +26606,6 @@
             "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
             "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
         },
-        "progress": {
-            "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-            "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-            "dev": true
-        },
         "prom-client": {
             "version": "13.2.0",
             "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-13.2.0.tgz",
@@ -27872,12 +26661,6 @@
                 "ipaddr.js": "1.9.1"
             }
         },
-        "proxy-from-env": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
-            "dev": true
-        },
         "psl": {
             "version": "1.9.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -27898,59 +26681,6 @@
             "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
             "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
         },
-        "puppeteer": {
-            "version": "13.1.3",
-            "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.1.3.tgz",
-            "integrity": "sha512-nqcJNThLUG0Dgo++2mMtGR2FCyg7olJJhj/rm0A65muyN3nrH6lGvnNRzEaNmSnHWvjaDIG9ox5kxQB+nXTg5A==",
-            "dev": true,
-            "requires": {
-                "debug": "4.3.2",
-                "devtools-protocol": "0.0.948846",
-                "extract-zip": "2.0.1",
-                "https-proxy-agent": "5.0.0",
-                "node-fetch": "2.6.7",
-                "pkg-dir": "4.2.0",
-                "progress": "2.0.3",
-                "proxy-from-env": "1.1.0",
-                "rimraf": "3.0.2",
-                "tar-fs": "2.1.1",
-                "unbzip2-stream": "1.4.3",
-                "ws": "8.2.3"
-            },
-            "dependencies": {
-                "debug": {
-                    "version": "4.3.2",
-                    "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-                    "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-                    "dev": true,
-                    "requires": {
-                        "ms": "2.1.2"
-                    }
-                },
-                "https-proxy-agent": {
-                    "version": "5.0.0",
-                    "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
-                    "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
-                    "dev": true,
-                    "requires": {
-                        "agent-base": "6",
-                        "debug": "4"
-                    }
-                },
-                "ms": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-                    "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-                    "dev": true
-                },
-                "ws": {
-                    "version": "8.2.3",
-                    "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
-                    "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
-                    "dev": true
-                }
-            }
-        },
         "qlobber": {
             "version": "5.0.3",
             "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
@@ -28447,16 +27177,6 @@
                 }
             }
         },
-        "resolve-dir": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
-            "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==",
-            "dev": true,
-            "requires": {
-                "expand-tilde": "^1.2.2",
-                "global-modules": "^0.2.3"
-            }
-        },
         "resolve-from": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -28698,35 +27418,6 @@
             "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
             "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
         },
-        "shallow-clone": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
-            "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==",
-            "dev": true,
-            "requires": {
-                "is-extendable": "^0.1.1",
-                "kind-of": "^2.0.1",
-                "lazy-cache": "^0.2.3",
-                "mixin-object": "^2.0.1"
-            },
-            "dependencies": {
-                "kind-of": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
-                    "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==",
-                    "dev": true,
-                    "requires": {
-                        "is-buffer": "^1.0.2"
-                    }
-                },
-                "lazy-cache": {
-                    "version": "0.2.7",
-                    "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
-                    "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==",
-                    "dev": true
-                }
-            }
-        },
         "shebang-command": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -28928,17 +27619,6 @@
             "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==",
             "dev": true
         },
-        "spawnd": {
-            "version": "6.0.2",
-            "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-6.0.2.tgz",
-            "integrity": "sha512-+YJtx0dvy2wt304MrHD//tASc84zinBUYU1jacPBzrjhZUd7RsDo25krxr4HUHAQzEQFuMAs4/p+yLYU5ciZ1w==",
-            "dev": true,
-            "requires": {
-                "exit": "^0.1.2",
-                "signal-exit": "^3.0.6",
-                "tree-kill": "^1.2.2"
-            }
-        },
         "spdx-correct": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@@ -29363,39 +28043,6 @@
                 "yallist": "^4.0.0"
             }
         },
-        "tar-fs": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
-            "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
-            "dev": true,
-            "requires": {
-                "chownr": "^1.1.1",
-                "mkdirp-classic": "^0.5.2",
-                "pump": "^3.0.0",
-                "tar-stream": "^2.1.4"
-            },
-            "dependencies": {
-                "chownr": {
-                    "version": "1.1.4",
-                    "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-                    "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
-                    "dev": true
-                }
-            }
-        },
-        "tar-stream": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
-            "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
-            "dev": true,
-            "requires": {
-                "bl": "^4.0.3",
-                "end-of-stream": "^1.4.1",
-                "fs-constants": "^1.0.0",
-                "inherits": "^2.0.3",
-                "readable-stream": "^3.1.1"
-            }
-        },
         "tarn": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
@@ -29704,16 +28351,6 @@
                 "which-boxed-primitive": "^1.0.2"
             }
         },
-        "unbzip2-stream": {
-            "version": "1.4.3",
-            "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
-            "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
-            "dev": true,
-            "requires": {
-                "buffer": "^5.2.1",
-                "through": "^2.3.8"
-            }
-        },
         "unicode-canonical-property-names-ecmascript": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
diff --git a/package.json b/package.json
index 479876a6..4f7da681 100644
--- a/package.json
+++ b/package.json
@@ -25,8 +25,6 @@
         "build": "vite build --config ./config/vite.config.js",
         "test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test",
         "test-with-build": "npm run build && npm test",
-        "jest": "node test/prepare-jest.js && npm run jest-frontend && npm run jest-backend",
-        "jest-frontend": "cross-env TEST_FRONTEND=1 jest --config=./config/jest-frontend.config.js",
         "jest-backend": "cross-env TEST_BACKEND=1 jest --config=./config/jest-backend.config.js",
         "tsc": "tsc",
         "vite-preview-dist": "vite preview --host --config ./config/vite.config.js",
@@ -140,12 +138,10 @@
         "eslint-plugin-vue": "~8.7.1",
         "favico.js": "^0.3.10",
         "jest": "~27.2.5",
-        "jest-puppeteer": "~6.0.3",
         "postcss-html": "~1.5.0",
         "postcss-rtlcss": "~3.7.2",
         "postcss-scss": "~4.0.4",
         "prismjs": "^1.27.0",
-        "puppeteer": "~13.1.3",
         "qrcode": "~1.5.0",
         "rollup-plugin-visualizer": "^5.6.0",
         "sass": "~1.42.1",
diff --git a/server/util-server.js b/server/util-server.js
index 1517bcfe..cf303ba8 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -557,7 +557,7 @@ exports.doubleCheckPassword = async (socket, currentPassword) => {
 exports.startUnitTest = async () => {
     console.log("Starting unit test...");
     const npm = /^win/.test(process.platform) ? "npm.cmd" : "npm";
-    const child = childProcess.spawn(npm, [ "run", "jest" ]);
+    const child = childProcess.spawn(npm, [ "run", "jest-backend" ]);
 
     child.stdout.on("data", (data) => {
         console.log(data.toString());
diff --git a/test/e2e.spec.js b/test/e2e.spec.js
deleted file mode 100644
index 8de8ceb1..00000000
--- a/test/e2e.spec.js
+++ /dev/null
@@ -1,329 +0,0 @@
-// eslint-disable-next-line no-unused-vars
-const { Page, Browser } = require("puppeteer");
-const { sleep } = require("../src/util");
-
-/**
- * Set back the correct data type for page object
- * @type {Page}
- */
-page;
-
-/**
- * @type {Browser}
- */
-browser;
-
-beforeAll(async () => {
-    await page.setViewport({
-        width: 1280,
-        height: 720,
-        deviceScaleFactor: 1,
-    });
-});
-
-afterAll(() => {
-
-});
-
-const baseURL = "http://127.0.0.1:3002";
-
-describe("Init", () => {
-    const title = "Uptime Kuma";
-
-    beforeAll(async () => {
-        await page.goto(baseURL);
-    });
-
-    it(`should be titled "${title}"`, async () => {
-        await expect(page.title()).resolves.toEqual(title);
-    });
-
-    // Setup Page
-    it("Setup", async () => {
-        // Create an Admin
-        await page.waitForSelector("#floatingInput");
-        await page.waitForSelector("#repeat");
-        await page.click("#floatingInput");
-        await page.type("#floatingInput", "admin");
-        await page.type("#floatingPassword", "admin123");
-        await page.type("#repeat", "admin123");
-        await page.click(".btn-primary[type=submit]");
-        await sleep(3000);
-
-        // Go to /setup again
-        await page.goto(baseURL + "/setup");
-        await sleep(3000);
-        let pathname = await page.evaluate(() => location.pathname);
-        expect(pathname).toEqual("/dashboard");
-
-        // Go to /
-        await page.goto(baseURL);
-        await page.waitForSelector("h1.mb-3");
-        pathname = await page.evaluate(() => location.pathname);
-        expect(pathname).toEqual("/dashboard");
-    });
-
-    it("should create monitor", async () => {
-        // Create monitor
-        await page.goto(baseURL + "/add");
-        await page.waitForSelector("#name");
-
-        await page.type("#name", "Myself");
-        await page.waitForSelector("#url");
-        await page.click("#url", { clickCount: 3 });
-        await page.keyboard.type(baseURL);
-        await page.keyboard.press("Enter");
-
-        await page.waitForFunction(() => {
-            const badge = document.querySelector("span.badge");
-            return badge && badge.innerText == "100%";
-        }, { timeout: 5000 });
-
-    });
-
-    // Settings Page
-    /*
-    describe("Settings", () => {
-        beforeEach(async () => {
-            await page.goto(baseURL + "/settings");
-        });
-
-        it("Change Language", async () => {
-            await page.goto(baseURL + "/settings/appearance");
-            await page.waitForSelector("#language");
-
-            await page.select("#language", "zh-HK");
-            let languageTitle = await page.evaluate(() => document.querySelector("[for=language]").innerText);
-            expect(languageTitle).toEqual("語言");
-
-            await page.select("#language", "en");
-            languageTitle = await page.evaluate(() => document.querySelector("[for=language]").innerText);
-            expect(languageTitle).toEqual("Language");
-        });
-
-        it("Change Theme", async () => {
-            await page.goto(baseURL + "/settings/appearance");
-
-            // Dark
-            await click(page, ".btn[for=btncheck2]");
-            await page.waitForSelector("div.dark");
-
-            await page.waitForSelector(".btn[for=btncheck1]");
-
-            // Light
-            await click(page, ".btn[for=btncheck1]");
-            await page.waitForSelector("div.light");
-        });
-
-        it("Change Heartbeat Bar Style", async () => {
-            await page.goto(baseURL + "/settings/appearance");
-
-            // Bottom
-            await click(page, ".btn[for=btncheck5]");
-            await page.waitForSelector("div.hp-bar-big");
-
-            // None
-            await click(page, ".btn[for=btncheck6]");
-            await page.waitForSelector("div.hp-bar-big", {
-                hidden: true,
-                timeout: 1000
-            });
-        });
-
-        // TODO: Timezone
-
-        it("Search Engine Visibility", async () => {
-            // Default
-            let res = await axios.get(baseURL + "/robots.txt");
-            expect(res.data).toContain("Disallow: /");
-
-            // Yes
-            await click(page, "#searchEngineIndexYes");
-            await click(page, "form > div > .btn[type=submit]");
-            await sleep(1000);
-            res = await axios.get(baseURL + "/robots.txt");
-            expect(res.data).not.toContain("Disallow: /");
-
-            // No
-            await click(page, "#searchEngineIndexNo");
-            await click(page, "form > div > .btn[type=submit]");
-            await sleep(1000);
-            res = await axios.get(baseURL + "/robots.txt");
-            expect(res.data).toContain("Disallow: /");
-        });
-
-        it("Entry Page", async () => {
-            const newPage = await browser.newPage();
-
-            // Default
-            await newPage.goto(baseURL);
-            await newPage.waitForSelector("h1.mb-3", { timeout: 3000 });
-            let pathname = await newPage.evaluate(() => location.pathname);
-            expect(pathname).toEqual("/dashboard");
-
-            // Status Page
-            await click(page, "#entryPageNo");
-            await click(page, "form > div > .btn[type=submit]");
-            await sleep(1000);
-            await newPage.goto(baseURL);
-            await newPage.waitForSelector("img.logo", { timeout: 3000 });
-            pathname = await newPage.evaluate(() => location.pathname);
-            expect(pathname).toEqual("/status");
-
-            // Back to Dashboard
-            await click(page, "#entryPageYes");
-            await click(page, "form > div > .btn[type=submit]");
-            await sleep(1000);
-            await newPage.goto(baseURL);
-            await newPage.waitForSelector("h1.mb-3", { timeout: 3000 });
-            pathname = await newPage.evaluate(() => location.pathname);
-            expect(pathname).toEqual("/dashboard");
-
-            await newPage.close();
-        });
-
-        it("Change Password (wrong current password)", async () => {
-            await page.goto(baseURL + "/settings/security");
-            await page.waitForSelector("#current-password");
-
-            await page.type("#current-password", "wrong_passw$$d");
-            await page.type("#new-password", "new_password123");
-            await page.type("#repeat-new-password", "new_password123");
-
-            // Save
-            await click(page, "form > div > .btn[type=submit]", 0);
-            await sleep(1000);
-
-            await click(page, "#logout-btn");
-            await login("admin", "new_password123");
-            let elementCount = await page.evaluate(() => document.querySelectorAll("#floatingPassword").length);
-            expect(elementCount).toEqual(1);
-
-            await login("admin", "admin123");
-        });
-
-        it("Change Password (wrong repeat)", async () => {
-            await page.goto(baseURL + "/settings/security");
-            await page.waitForSelector("#current-password");
-
-            await page.type("#current-password", "admin123");
-            await page.type("#new-password", "new_password123");
-            await page.type("#repeat-new-password", "new_password1234567898797898");
-
-            await click(page, "form > div > .btn[type=submit]", 0);
-            await sleep(1000);
-
-            await click(page, "#logout-btn");
-            await login("admin", "new_password123");
-
-            let elementCount = await page.evaluate(() => document.querySelectorAll("#floatingPassword").length);
-            expect(elementCount).toEqual(1);
-
-            await login("admin", "admin123");
-            await page.waitForSelector("#current-password");
-            let pathname = await page.evaluate(() => location.pathname);
-            expect(pathname).toEqual("/settings/security");
-        });
-
-        // TODO: 2FA
-
-        // TODO: Export Backup
-
-        // TODO: Import Backup
-
-        it("Should disable & enable auth", async () => {
-            await page.goto(baseURL + "/settings/security");
-            await click(page, "#disableAuth-btn");
-            await click(page, ".btn.btn-danger[data-bs-dismiss='modal']", 2); // Not a good way to do it
-            await page.waitForSelector("#enableAuth-btn", { timeout: 3000 });
-            await page.waitForSelector("#logout-btn", {
-                hidden: true,
-                timeout: 3000
-            });
-
-            const newPage = await browser.newPage();
-            await newPage.goto(baseURL);
-            await newPage.waitForSelector("span.badge", { timeout: 3000 });
-            newPage.close();
-
-            await click(page, "#enableAuth-btn");
-            await login("admin", "admin123");
-            await page.waitForSelector("#disableAuth-btn", { timeout: 3000 });
-        });
-
-        // it("Should clear all statistics", async () => {
-        //     await page.goto(baseURL + "/settings/monitor-history");
-        //     await click(page, "#clearAllStats-btn");
-        //     await click(page, ".btn.btn-danger");
-        //     await page.waitForFunction(() => {
-        //         const badge = document.querySelector("span.badge");
-        //         return badge && badge.innerText == "0%";
-        //     }, { timeout: 3000 });
-        // });
-    });
-     */
-
-    /*
-     * TODO
-     * Create Monitor - All type
-     * Edit Monitor
-     * Delete Monitor
-     *
-     * Create Notification (token problem, maybe hard to test)
-     *
-     */
-
-    describe("Status Page", () => {
-        const title = "Uptime Kuma";
-        beforeAll(async () => {
-            await page.goto(baseURL + "/status");
-        });
-        it(`should be titled "${title}"`, async () => {
-            await expect(page.title()).resolves.toEqual(title);
-        });
-    });
-});
-
-/**
- * Test login
- * @param {string} username
- * @param {string} password
- */
-async function login(username, password) {
-    await input(page, "#floatingInput", username);
-    await input(page, "#floatingPassword", password);
-    await page.click(".btn-primary[type=submit]");
-    await sleep(5000);
-}
-
-/**
- * Click on an element on the page
- * @param {Page} page Puppeteer page instance
- * @param {string} selector
- * @param {number} elementIndex
- * @returns {Promise<any>}
- */
-async function click(page, selector, elementIndex = 0) {
-    await page.waitForSelector(selector, {
-        timeout: 5000,
-    });
-    return await page.evaluate((s, i) => {
-        return document.querySelectorAll(s)[i].click();
-    }, selector, elementIndex);
-}
-
-/**
- * Input text into selected field
- * @param {Page} page Puppeteer page instance
- * @param {string} selector
- * @param {string} text Text to input
- */
-async function input(page, selector, text) {
-    await page.waitForSelector(selector, {
-        timeout: 5000,
-    });
-    const element = await page.$(selector);
-    await element.click({ clickCount: 3 });
-    await page.keyboard.press("Backspace");
-    await page.type(selector, text);
-}
diff --git a/test/frontend.spec.js b/test/frontend.spec.js
deleted file mode 100644
index 63121a6b..00000000
--- a/test/frontend.spec.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// eslint-disable-next-line no-global-assign
-global.localStorage = {};
-global.navigator = {
-    language: "en"
-};
-
-const { currentLocale } = require("../src/i18n");
-
-describe("Test i18n.js", () => {
-
-    it("currentLocale()", () => {
-        expect(currentLocale()).toEqual("en");
-
-        navigator.language = "zh-HK";
-        expect(currentLocale()).toEqual("zh-HK");
-
-        // Note that in Safari on iOS prior to 10.2, the country code returned is lowercase: "en-us", "fr-fr" etc.
-        // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language
-        navigator.language = "zh-hk";
-        expect(currentLocale()).toEqual("en");
-
-        navigator.language = "en-US";
-        expect(currentLocale()).toEqual("en");
-
-        navigator.language = "ja-ZZ";
-        expect(currentLocale()).toEqual("ja");
-
-        navigator.language = "zz";
-        expect(currentLocale()).toEqual("en");
-
-        navigator.language = "zz-ZZ";
-        expect(currentLocale()).toEqual("en");
-
-        localStorage.locale = "en";
-        expect(currentLocale()).toEqual("en");
-
-        localStorage.locale = "zh-HK";
-        expect(currentLocale()).toEqual("zh-HK");
-    });
-
-});
-
diff --git a/test/prepare-jest.js b/test/prepare-jest.js
deleted file mode 100644
index 3fd89d10..00000000
--- a/test/prepare-jest.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const fs = require("fs");
-const rmSync = require("../extra/fs-rmSync.js");
-
-const path = "./data/test-chrome-profile";
-
-if (fs.existsSync(path)) {
-    rmSync(path, {
-        recursive: true,
-    });
-}

From 528a615fb2b330c05efc86a41cea678bc5b1dff3 Mon Sep 17 00:00:00 2001
From: CL0Pinette <51855790+CL0Pinette@users.noreply.github.com>
Date: Wed, 5 Oct 2022 11:30:49 +0200
Subject: [PATCH 207/803] Add free.fr SMS notification provider (#2159)

---
 server/notification-providers/freemobile.js | 24 +++++++++++++++++++++
 server/notification.js                      |  2 ++
 src/components/notifications/FreeMobile.vue | 12 +++++++++++
 src/components/notifications/index.js       |  2 ++
 4 files changed, 40 insertions(+)
 create mode 100644 server/notification-providers/freemobile.js
 create mode 100644 src/components/notifications/FreeMobile.vue

diff --git a/server/notification-providers/freemobile.js b/server/notification-providers/freemobile.js
new file mode 100644
index 00000000..919150fa
--- /dev/null
+++ b/server/notification-providers/freemobile.js
@@ -0,0 +1,24 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+
+class FreeMobile extends NotificationProvider {
+
+    name = "FreeMobile";
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+        try {
+            await axios.post(`https://smsapi.free-mobile.fr/sendmsg?msg=${encodeURIComponent(msg.replace("🔴", "⛔️"))}`, {
+                "user": notification.freemobileUser,
+                "pass": notification.freemobilePass,
+            });
+
+            return okMsg;
+
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+}
+
+module.exports = FreeMobile;
diff --git a/server/notification.js b/server/notification.js
index 7a4b4f29..aed92e5d 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -9,6 +9,7 @@ const ClickSendSMS = require("./notification-providers/clicksendsms");
 const DingDing = require("./notification-providers/dingding");
 const Discord = require("./notification-providers/discord");
 const Feishu = require("./notification-providers/feishu");
+const FreeMobile = require("./notification-providers/freemobile");
 const GoogleChat = require("./notification-providers/google-chat");
 const Gorush = require("./notification-providers/gorush");
 const Gotify = require("./notification-providers/gotify");
@@ -63,6 +64,7 @@ class Notification {
             new DingDing(),
             new Discord(),
             new Feishu(),
+            new FreeMobile(),
             new GoogleChat(),
             new Gorush(),
             new Gotify(),
diff --git a/src/components/notifications/FreeMobile.vue b/src/components/notifications/FreeMobile.vue
new file mode 100644
index 00000000..852d9ae2
--- /dev/null
+++ b/src/components/notifications/FreeMobile.vue
@@ -0,0 +1,12 @@
+<template>
+    <div class="mb-3">
+        <label for="freemobileUser" class="form-label">{{ $t("Free Mobile User Identifier") }}<span style="color: red;"><sup>*</sup></span></label>
+        <input id="freemobileUser" v-model="$parent.notification.freemobileUser" type="text" class="form-control" required>
+    </div>
+
+    <div class="mb-3">
+        <label for="freemobilePass" class="form-label">{{ $t("Free Mobile API Key") }}<span style="color: red;"><sup>*</sup></span></label>
+        <input id="freemobilePass" v-model="$parent.notification.freemobilePass" type="text" class="form-control" required>
+    </div>
+</template>
+
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 319a7922..bca4a510 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -7,6 +7,7 @@ import ClickSendSMS from "./ClickSendSMS.vue";
 import DingDing from "./DingDing.vue";
 import Discord from "./Discord.vue";
 import Feishu from "./Feishu.vue";
+import FreeMobile from "./FreeMobile.vue";
 import GoogleChat from "./GoogleChat.vue";
 import Gorush from "./Gorush.vue";
 import Gotify from "./Gotify.vue";
@@ -56,6 +57,7 @@ const NotificationFormList = {
     "DingDing": DingDing,
     "discord": Discord,
     "Feishu": Feishu,
+    "FreeMobile": FreeMobile,
     "GoogleChat": GoogleChat,
     "gorush": Gorush,
     "gotify": Gotify,

From c28d8ddff9342da501e60df23cbb79e3259a4306 Mon Sep 17 00:00:00 2001
From: Ben Scobie <benscobie@users.noreply.github.com>
Date: Wed, 5 Oct 2022 16:45:21 +0100
Subject: [PATCH 208/803] Correctly handle multiple IPs in X-Forwarded-For
 (#2177)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
---
 package.json                 |  4 +-
 server/uptime-kuma-server.js |  4 +-
 test/backend.spec.js         | 83 +++++++++++++++++++++++++++++++++++-
 3 files changed, 87 insertions(+), 4 deletions(-)

diff --git a/package.json b/package.json
index 4f7da681..1411168d 100644
--- a/package.json
+++ b/package.json
@@ -23,9 +23,9 @@
         "start-server": "node server/server.js",
         "start-server-dev": "cross-env NODE_ENV=development node server/server.js",
         "build": "vite build --config ./config/vite.config.js",
-        "test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --test",
+        "test": "node test/prepare-test-server.js && npm run jest-backend",
         "test-with-build": "npm run build && npm test",
-        "jest-backend": "cross-env TEST_BACKEND=1 jest --config=./config/jest-backend.config.js",
+        "jest-backend": "cross-env TEST_BACKEND=1 jest --runInBand --detectOpenHandles --forceExit --config=./config/jest-backend.config.js",
         "tsc": "tsc",
         "vite-preview-dist": "vite preview --host --config ./config/vite.config.js",
         "build-docker": "npm run build && npm run build-docker-debian && npm run build-docker-alpine",
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 98de65a4..6e77e1fd 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -138,7 +138,9 @@ class UptimeKumaServer {
         }
 
         if (await Settings.get("trustProxy")) {
-            return socket.client.conn.request.headers["x-forwarded-for"]
+            const forwardedFor = socket.client.conn.request.headers["x-forwarded-for"];
+
+            return (typeof forwardedFor === "string" ? forwardedFor.split(",")[0].trim() : null)
                 || socket.client.conn.request.headers["x-real-ip"]
                 || clientIP.replace(/^.*:/, "");
         } else {
diff --git a/test/backend.spec.js b/test/backend.spec.js
index 6deb2853..5b9fa92c 100644
--- a/test/backend.spec.js
+++ b/test/backend.spec.js
@@ -1,7 +1,11 @@
-const { genSecret, DOWN } = require("../src/util");
+const { genSecret, DOWN, log} = require("../src/util");
 const utilServerRewire = require("../server/util-server");
 const Discord = require("../server/notification-providers/discord");
 const axios = require("axios");
+const { UptimeKumaServer } = require("../server/uptime-kuma-server");
+const Database = require("../server/database");
+const {Settings} = require("../server/settings");
+const fs = require("fs");
 
 jest.mock("axios");
 
@@ -225,3 +229,80 @@ describe("The function filterAndJoin", () => {
         expect(result).toBe("");
     });
 });
+
+describe("Test uptimeKumaServer.getClientIP()", () => {
+    it("should able to get a correct client IP", async () => {
+        Database.init({
+            "data-dir": "./data/test"
+        });
+
+        if (! fs.existsSync(Database.path)) {
+            log.info("server", "Copying Database");
+            fs.copyFileSync(Database.templatePath, Database.path);
+        }
+
+        await Database.connect(true);
+        await Database.patch();
+
+        const fakeSocket = {
+            client: {
+                conn: {
+                    remoteAddress: "192.168.10.10",
+                    request: {
+                        headers: {
+                        }
+                    }
+                }
+            }
+        }
+        const server = Object.create(UptimeKumaServer.prototype);
+        let ip = await server.getClientIP(fakeSocket);
+
+        await Settings.set("trustProxy", false);
+        expect(await Settings.get("trustProxy")).toBe(false);
+        expect(ip).toBe("192.168.10.10");
+
+        fakeSocket.client.conn.request.headers["x-forwarded-for"] = "10.10.10.10";
+        ip = await server.getClientIP(fakeSocket);
+        expect(ip).toBe("192.168.10.10");
+
+        fakeSocket.client.conn.request.headers["x-real-ip"] = "20.20.20.20";
+        ip = await server.getClientIP(fakeSocket);
+        expect(ip).toBe("192.168.10.10");
+
+        await Settings.set("trustProxy", true);
+        expect(await Settings.get("trustProxy")).toBe(true);
+
+        fakeSocket.client.conn.request.headers["x-forwarded-for"] = "10.10.10.10";
+        ip = await server.getClientIP(fakeSocket);
+        expect(ip).toBe("10.10.10.10");
+
+        // x-real-ip
+        delete fakeSocket.client.conn.request.headers["x-forwarded-for"];
+        ip = await server.getClientIP(fakeSocket);
+        expect(ip).toBe("20.20.20.20");
+
+        fakeSocket.client.conn.request.headers["x-forwarded-for"] = "2001:db8:85a3:8d3:1319:8a2e:370:7348";
+        ip = await server.getClientIP(fakeSocket);
+        expect(ip).toBe("2001:db8:85a3:8d3:1319:8a2e:370:7348");
+
+        fakeSocket.client.conn.request.headers["x-forwarded-for"] = "203.0.113.195";
+        ip = await server.getClientIP(fakeSocket);
+        expect(ip).toBe("203.0.113.195");
+
+        fakeSocket.client.conn.request.headers["x-forwarded-for"] = "203.0.113.195, 2001:db8:85a3:8d3:1319:8a2e:370:7348";
+        ip = await server.getClientIP(fakeSocket);
+        expect(ip).toBe("203.0.113.195");
+
+        fakeSocket.client.conn.request.headers["x-forwarded-for"] = "203.0.113.195,2001:db8:85a3:8d3:1319:8a2e:370:7348,150.172.238.178";
+        ip = await server.getClientIP(fakeSocket);
+        expect(ip).toBe("203.0.113.195");
+
+        // Elements are comma-separated, with optional whitespace surrounding the commas.
+        fakeSocket.client.conn.request.headers["x-forwarded-for"] = "203.0.113.195 , 2001:db8:85a3:8d3:1319:8a2e:370:7348,150.172.238.178";
+        ip = await server.getClientIP(fakeSocket);
+        expect(ip).toBe("203.0.113.195");
+
+        await Database.close();
+    }, 120000);
+});

From b879428a0305c9bb4b84a51f6e068a43ea760c73 Mon Sep 17 00:00:00 2001
From: janhartje <jan@janhartje.com>
Date: Wed, 5 Oct 2022 17:48:07 +0200
Subject: [PATCH 209/803] feat(notification): add additional Header to webhook

---
 server/notification-providers/webhook.js | 11 ++++--
 src/components/notifications/Webhook.vue | 46 ++++++++++++++++++------
 src/languages/en.js                      |  2 ++
 3 files changed, 46 insertions(+), 13 deletions(-)

diff --git a/server/notification-providers/webhook.js b/server/notification-providers/webhook.js
index ca1c106a..347b6ec9 100644
--- a/server/notification-providers/webhook.js
+++ b/server/notification-providers/webhook.js
@@ -28,8 +28,15 @@ class Webhook extends NotificationProvider {
                 finalData = data;
             }
 
-            if (notification.webhookAuthorizationHeader) {
-                config.headers["Authorization"] = notification.webhookAuthorizationHeader;
+            if (notification.webhookAdditionalHeaders) {
+                try {
+                    config.headers = {
+                        ...config.headers,
+                        ...JSON.parse(notification.webhookAdditionalHeaders)
+                    };
+                } catch (err) {
+                    throw "Addional Headers is not a valid JSON";
+                }
             }
 
             await axios.post(notification.webhookURL, finalData, config);
diff --git a/src/components/notifications/Webhook.vue b/src/components/notifications/Webhook.vue
index 241ecd9a..1b85a540 100644
--- a/src/components/notifications/Webhook.vue
+++ b/src/components/notifications/Webhook.vue
@@ -12,7 +12,9 @@
     </div>
 
     <div class="mb-3">
-        <label for="webhook-content-type" class="form-label">{{ $t("Content Type") }}</label>
+        <label for="webhook-content-type" class="form-label">{{
+            $t("Content Type")
+        }}</label>
         <select
             id="webhook-content-type"
             v-model="$parent.notification.webhookContentType"
@@ -24,7 +26,7 @@
         </select>
 
         <div class="form-text">
-            <p>{{ $t("webhookJsonDesc", ["\"application/json\""]) }}</p>
+            <p>{{ $t("webhookJsonDesc", ['"application/json"']) }}</p>
             <i18n-t tag="p" keypath="webhookFormDataDesc">
                 <template #multipart>"multipart/form-data"</template>
                 <template #decodeFunction>
@@ -35,20 +37,42 @@
     </div>
 
     <div class="mb-3">
-        <label for="authorization-header" class="form-label">{{ $t("Authorization Header") }}</label>
-        <HiddenInput
-            id="authorization-header"
-            v-model="$parent.notification.webhookAuthorizationHeader"
-            autocomplete="one-time-code"
-        ></HiddenInput>
+        <i18n-t
+            tag="label"
+            class="form-label"
+            for="additionalHeaders"
+            keypath="webhookAdditionalHeadersTitle"
+        >
+        </i18n-t>
+        <textarea
+            id="additionalHeaders"
+            v-model="$parent.notification.webhookAdditionalHeaders"
+            class="form-control"
+            :placeholder="headersPlaceholder"
+        ></textarea>
+        <div class="form-text">
+            <i18n-t tag="p" keypath="webhookAdditionalHeadersDesc"> </i18n-t>
+        </div>
     </div>
 </template>
 
 <script>
-import HiddenInput from "../HiddenInput.vue";
 export default {
-    components: {
-        HiddenInput,
+    computed: {
+        headersPlaceholder() {
+            return this.$t("Example:", [
+                `
+{
+    "HeaderName": "HeaderValue"
+}`,
+            ]);
+        },
     },
 };
 </script>
+
+<style lang="scss" scoped>
+textarea {
+    min-height: 200px;
+}
+</style>
diff --git a/src/languages/en.js b/src/languages/en.js
index 4bf92e92..4c7338d2 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -206,6 +206,8 @@ export default {
     "Content Type": "Content Type",
     webhookJsonDesc: "{0} is good for any modern HTTP servers such as Express.js",
     webhookFormDataDesc: "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
+    webhookAdditionalHeadersTitle: "Additional Headers",
+    webhookAdditionalHeadersDesc: "Sets additional headers sent with the webhook.",
     smtp: "Email (SMTP)",
     secureOptionNone: "None / STARTTLS (25, 587)",
     secureOptionTLS: "TLS (465)",

From 4a7e96f9ea6235d797b3a0f68b8300d82aadfea6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 6 Oct 2022 12:08:10 +0800
Subject: [PATCH 210/803] Init C# Project for building exe

---
 .dockerignore                                 |   5 +-
 .gitignore                                    |   3 +
 extra/exe-builder/App.config                  |  10 ++
 extra/exe-builder/Program.cs                  |  59 +++++++++
 extra/exe-builder/Properties/AssemblyInfo.cs  |  36 ++++++
 .../Properties/Resources.Designer.cs          |  62 ++++++++++
 extra/exe-builder/Properties/Resources.resx   | 117 ++++++++++++++++++
 .../Properties/Settings.Designer.cs           |  23 ++++
 .../exe-builder/Properties/Settings.settings  |   7 ++
 extra/exe-builder/UptimeKuma.csproj           |  79 ++++++++++++
 extra/exe-builder/UptimeKuma.sln              |  16 +++
 .../UptimeKuma.sln.DotSettings.user           |   3 +
 12 files changed, 418 insertions(+), 2 deletions(-)
 create mode 100644 extra/exe-builder/App.config
 create mode 100644 extra/exe-builder/Program.cs
 create mode 100644 extra/exe-builder/Properties/AssemblyInfo.cs
 create mode 100644 extra/exe-builder/Properties/Resources.Designer.cs
 create mode 100644 extra/exe-builder/Properties/Resources.resx
 create mode 100644 extra/exe-builder/Properties/Settings.Designer.cs
 create mode 100644 extra/exe-builder/Properties/Settings.settings
 create mode 100644 extra/exe-builder/UptimeKuma.csproj
 create mode 100644 extra/exe-builder/UptimeKuma.sln
 create mode 100644 extra/exe-builder/UptimeKuma.sln.DotSettings.user

diff --git a/.dockerignore b/.dockerignore
index babc429a..22b71b38 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -31,6 +31,7 @@ tsconfig.json
 /tmp
 /babel.config.js
 /ecosystem.config.js
+extra/exe-builder
 
 ### .gitignore content (commented rules are duplicated)
 
@@ -45,6 +46,6 @@ dist-ssr
 #!/data/.gitkeep
 #.vscode
 
-
-
 ### End of .gitignore content
+
+
diff --git a/.gitignore b/.gitignore
index 8eb05867..8e0edeac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,6 @@ dist-ssr
 
 cypress/videos
 cypress/screenshots
+
+extra/exe-builder/bin
+extra/exe-builder/obj
diff --git a/extra/exe-builder/App.config b/extra/exe-builder/App.config
new file mode 100644
index 00000000..09265d8b
--- /dev/null
+++ b/extra/exe-builder/App.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <startup>
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
+    </startup>
+
+    <System.Windows.Forms.ApplicationConfigurationSection>
+        <add key="DpiAwareness" value="PerMonitorV2" />
+    </System.Windows.Forms.ApplicationConfigurationSection>
+</configuration>
diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
new file mode 100644
index 00000000..5516a1ff
--- /dev/null
+++ b/extra/exe-builder/Program.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Reflection;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using UptimeKuma.Properties;
+
+namespace UptimeKuma {
+    static class Program {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main() {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new UptimeKumaApplicationContext());
+        }
+    }
+
+    public class UptimeKumaApplicationContext : ApplicationContext
+    {
+        private NotifyIcon trayIcon;
+
+        public UptimeKumaApplicationContext()
+        {
+            // Initialize Tray Icon
+            trayIcon = new NotifyIcon();
+
+            trayIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
+            trayIcon.ContextMenu = new ContextMenu(new MenuItem[] {
+                new MenuItem("Check for Update", CheckForUpdate),
+                new MenuItem("About", About),
+                new MenuItem("Exit", Exit),
+            });
+
+            trayIcon.Visible = true;
+        }
+
+        void Exit(object sender, EventArgs e)
+        {
+            // Hide tray icon, otherwise it will remain shown until user mouses over it
+            trayIcon.Visible = false;
+            Application.Exit();
+        }
+
+        void About(object sender, EventArgs e)
+        {
+            MessageBox.Show("Uptime Kuma v1.0.0" + Environment.NewLine + "© 2022 Louis Lam", "Info");
+        }
+
+        void CheckForUpdate(object sneder, EventArgs e) {
+
+        }
+    }
+}
+
diff --git a/extra/exe-builder/Properties/AssemblyInfo.cs b/extra/exe-builder/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..2552870b
--- /dev/null
+++ b/extra/exe-builder/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Uptime Kuma")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Uptime Kuma")]
+[assembly: AssemblyCopyright("Copyright © 2022 Louis Lam")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("2DB53988-1D93-4AC0-90C4-96ADEAAC5C04")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/extra/exe-builder/Properties/Resources.Designer.cs b/extra/exe-builder/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..8c8e559c
--- /dev/null
+++ b/extra/exe-builder/Properties/Resources.Designer.cs
@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace UptimeKuma.Properties {
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder",
+        "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        private static global::System.Resources.ResourceManager resourceMan;
+
+        private static global::System.Globalization.CultureInfo resourceCulture;
+
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance",
+            "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState
+            .Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if ((resourceMan == null)) {
+                    global::System.Resources.ResourceManager temp =
+                        new global::System.Resources.ResourceManager("UptimeKuma.Properties.Resources",
+                            typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+
+                return resourceMan;
+            }
+        }
+
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState
+            .Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get { return resourceCulture; }
+            set { resourceCulture = value; }
+        }
+    }
+}
\ No newline at end of file
diff --git a/extra/exe-builder/Properties/Resources.resx b/extra/exe-builder/Properties/Resources.resx
new file mode 100644
index 00000000..ffecec85
--- /dev/null
+++ b/extra/exe-builder/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/extra/exe-builder/Properties/Settings.Designer.cs b/extra/exe-builder/Properties/Settings.Designer.cs
new file mode 100644
index 00000000..6c63b395
--- /dev/null
+++ b/extra/exe-builder/Properties/Settings.Designer.cs
@@ -0,0 +1,23 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace UptimeKuma.Properties {
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(
+        "Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        private static Settings defaultInstance =
+            ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+        public static Settings Default {
+            get { return defaultInstance; }
+        }
+    }
+}
\ No newline at end of file
diff --git a/extra/exe-builder/Properties/Settings.settings b/extra/exe-builder/Properties/Settings.settings
new file mode 100644
index 00000000..abf36c5d
--- /dev/null
+++ b/extra/exe-builder/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
new file mode 100644
index 00000000..d62166e4
--- /dev/null
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+    <PropertyGroup>
+        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+        <ProjectGuid>{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}</ProjectGuid>
+        <OutputType>WinExe</OutputType>
+        <RootNamespace>UptimeKuma</RootNamespace>
+        <AssemblyName>uptime-kuma</AssemblyName>
+        <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+        <FileAlignment>512</FileAlignment>
+        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+        <Deterministic>true</Deterministic>
+        <ApplicationIcon>..\..\public\favicon.ico</ApplicationIcon>
+        <LangVersion>10</LangVersion>
+    </PropertyGroup>
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+        <PlatformTarget>AnyCPU</PlatformTarget>
+        <DebugSymbols>true</DebugSymbols>
+        <DebugType>full</DebugType>
+        <Optimize>false</Optimize>
+        <OutputPath>bin\Debug\</OutputPath>
+        <DefineConstants>DEBUG;TRACE</DefineConstants>
+        <ErrorReport>prompt</ErrorReport>
+        <WarningLevel>4</WarningLevel>
+    </PropertyGroup>
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+        <PlatformTarget>AnyCPU</PlatformTarget>
+        <DebugType>pdbonly</DebugType>
+        <Optimize>true</Optimize>
+        <OutputPath>bin\Release\</OutputPath>
+        <DefineConstants>TRACE</DefineConstants>
+        <ErrorReport>prompt</ErrorReport>
+        <WarningLevel>4</WarningLevel>
+    </PropertyGroup>
+    <ItemGroup>
+        <Reference Include="System" />
+        <Reference Include="System.Core" />
+        <Reference Include="System.Xml.Linq" />
+        <Reference Include="System.Data.DataSetExtensions" />
+        <Reference Include="Microsoft.CSharp" />
+        <Reference Include="System.Data" />
+        <Reference Include="System.Deployment" />
+        <Reference Include="System.Drawing" />
+        <Reference Include="System.Net.Http" />
+        <Reference Include="System.Windows.Forms" />
+        <Reference Include="System.Xml" />
+    </ItemGroup>
+    <ItemGroup>
+        <Compile Include="Program.cs" />
+        <Compile Include="Properties\AssemblyInfo.cs" />
+        <EmbeddedResource Include="Properties\Resources.resx">
+            <Generator>ResXFileCodeGenerator</Generator>
+            <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+            <SubType>Designer</SubType>
+        </EmbeddedResource>
+        <Compile Include="Properties\Resources.Designer.cs">
+            <AutoGen>True</AutoGen>
+            <DependentUpon>Resources.resx</DependentUpon>
+        </Compile>
+        <None Include="..\..\public\favicon.ico">
+          <Link>favicon.ico</Link>
+        </None>
+        <None Include="Properties\Settings.settings">
+            <Generator>SettingsSingleFileGenerator</Generator>
+            <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+        </None>
+        <Compile Include="Properties\Settings.Designer.cs">
+            <AutoGen>True</AutoGen>
+            <DependentUpon>Settings.settings</DependentUpon>
+            <DesignTimeSharedInput>True</DesignTimeSharedInput>
+        </Compile>
+    </ItemGroup>
+    <ItemGroup>
+        <None Include="App.config" />
+    </ItemGroup>
+    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/extra/exe-builder/UptimeKuma.sln b/extra/exe-builder/UptimeKuma.sln
new file mode 100644
index 00000000..201d7e23
--- /dev/null
+++ b/extra/exe-builder/UptimeKuma.sln
@@ -0,0 +1,16 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UptimeKuma", "UptimeKuma.csproj", "{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+EndGlobal
diff --git a/extra/exe-builder/UptimeKuma.sln.DotSettings.user b/extra/exe-builder/UptimeKuma.sln.DotSettings.user
new file mode 100644
index 00000000..b4ca9dad
--- /dev/null
+++ b/extra/exe-builder/UptimeKuma.sln.DotSettings.user
@@ -0,0 +1,3 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=UptimeKuma_002FProperties_002FResources/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>
\ No newline at end of file

From c24b64921d08b6d5c0cfc060fe35e43ecdbce20b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 6 Oct 2022 23:28:06 +0800
Subject: [PATCH 211/803] Fix #2183 ntfy issue

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

diff --git a/server/notification-providers/ntfy.js b/server/notification-providers/ntfy.js
index 17d6d812..5381da46 100644
--- a/server/notification-providers/ntfy.js
+++ b/server/notification-providers/ntfy.js
@@ -9,7 +9,7 @@ class Ntfy extends NotificationProvider {
         let okMsg = "Sent Successfully.";
         try {
             let headers = {};
-            if (notification.ntfyusername.length > 0) {
+            if (notification.ntfyusername) {
                 headers = {
                     "Authorization": "Basic " + Buffer.from(notification.ntfyusername + ":" + notification.ntfypassword).toString("base64"),
                 };

From da778f05ac30a681eeb71735dd21fc86eaef4a23 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 7 Oct 2022 00:16:07 +0800
Subject: [PATCH 212/803] Update

---
 extra/exe-builder/Program.cs | 42 ++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 7 deletions(-)

diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 5516a1ff..840bc873 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Drawing;
 using System.Linq;
 using System.Reflection;
@@ -23,6 +24,7 @@ namespace UptimeKuma {
     public class UptimeKumaApplicationContext : ApplicationContext
     {
         private NotifyIcon trayIcon;
+        private Process process;
 
         public UptimeKumaApplicationContext()
         {
@@ -31,19 +33,41 @@ namespace UptimeKuma {
 
             trayIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
             trayIcon.ContextMenu = new ContextMenu(new MenuItem[] {
+                new MenuItem("Open", Open),
                 new MenuItem("Check for Update", CheckForUpdate),
                 new MenuItem("About", About),
                 new MenuItem("Exit", Exit),
             });
 
             trayIcon.Visible = true;
+
+            var startInfo = new ProcessStartInfo();
+            startInfo.FileName = "node/node.exe";
+            startInfo.Arguments = "server/server.js";
+            startInfo.RedirectStandardOutput = true;
+            startInfo.RedirectStandardError = true;
+            startInfo.UseShellExecute = false;
+            startInfo.CreateNoWindow = true;
+            startInfo.WorkingDirectory = "core";
+
+            process = new Process();
+            process.StartInfo = startInfo;
+            process.EnableRaisingEvents = true;
+            try {
+                process.Start();
+                Open(null, null);
+            } catch (Exception e) {
+                MessageBox.Show("Startup failed: " + e.Message, "Uptime Kuma Error");
+                throw;
+            }
         }
 
-        void Exit(object sender, EventArgs e)
-        {
-            // Hide tray icon, otherwise it will remain shown until user mouses over it
-            trayIcon.Visible = false;
-            Application.Exit();
+        void Open(object sender, EventArgs e) {
+            Process.Start("http://localhost:3001");
+        }
+
+        void CheckForUpdate(object sender, EventArgs e) {
+
         }
 
         void About(object sender, EventArgs e)
@@ -51,8 +75,12 @@ namespace UptimeKuma {
             MessageBox.Show("Uptime Kuma v1.0.0" + Environment.NewLine + "© 2022 Louis Lam", "Info");
         }
 
-        void CheckForUpdate(object sneder, EventArgs e) {
-
+        void Exit(object sender, EventArgs e)
+        {
+            // Hide tray icon, otherwise it will remain shown until user mouses over it
+            trayIcon.Visible = false;
+            process.Close();
+            Application.Exit();
         }
     }
 }

From 60460442f869f2cc581690bd7c8930b3eb7777b8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 7 Oct 2022 00:25:34 +0800
Subject: [PATCH 213/803] Update to 1.18.3

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

diff --git a/package.json b/package.json
index 1411168d..df0bdbfb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.2",
+    "version": "1.18.3",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -38,7 +38,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.18.2 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.18.3 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 6e07ed20816969bfd1c6c06eb518171938312782 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 7 Oct 2022 15:02:19 +0800
Subject: [PATCH 214/803] Fix #2186

---
 package-lock.json           | 41 +++++++++++++++++++++++++++----------
 package.json                |  1 +
 server/model/status_page.js | 15 ++++++++++----
 3 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 71827042..4f222171 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.2",
+    "version": "1.18.3",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.18.2",
+            "version": "1.18.3",
             "license": "MIT",
             "dependencies": {
                 "@louislam/sqlite3": "~15.0.6",
@@ -33,6 +33,7 @@
                 "http-proxy-agent": "^5.0.0",
                 "https-proxy-agent": "^5.0.0",
                 "iconv-lite": "^0.6.3",
+                "jsesc": "^3.0.2",
                 "jsonwebtoken": "~8.5.1",
                 "jwt-decode": "^3.1.2",
                 "limiter": "^2.1.0",
@@ -474,6 +475,18 @@
                 "node": ">=6.9.0"
             }
         },
+        "node_modules/@babel/generator/node_modules/jsesc": {
+            "version": "2.5.2",
+            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+            "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+            "dev": true,
+            "bin": {
+                "jsesc": "bin/jsesc"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
         "node_modules/@babel/helper-annotate-as-pure": {
             "version": "7.18.6",
             "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
@@ -11229,15 +11242,14 @@
             "dev": true
         },
         "node_modules/jsesc": {
-            "version": "2.5.2",
-            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-            "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-            "dev": true,
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+            "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
             "bin": {
                 "jsesc": "bin/jsesc"
             },
             "engines": {
-                "node": ">=4"
+                "node": ">=6"
             }
         },
         "node_modules/json-parse-even-better-errors": {
@@ -16957,6 +16969,14 @@
                 "@babel/types": "^7.18.13",
                 "@jridgewell/gen-mapping": "^0.3.2",
                 "jsesc": "^2.5.1"
+            },
+            "dependencies": {
+                "jsesc": {
+                    "version": "2.5.2",
+                    "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+                    "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+                    "dev": true
+                }
             }
         },
         "@babel/helper-annotate-as-pure": {
@@ -25010,10 +25030,9 @@
             }
         },
         "jsesc": {
-            "version": "2.5.2",
-            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-            "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-            "dev": true
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+            "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="
         },
         "json-parse-even-better-errors": {
             "version": "2.3.1",
diff --git a/package.json b/package.json
index df0bdbfb..d478a1d2 100644
--- a/package.json
+++ b/package.json
@@ -88,6 +88,7 @@
         "http-proxy-agent": "^5.0.0",
         "https-proxy-agent": "^5.0.0",
         "iconv-lite": "^0.6.3",
+        "jsesc": "^3.0.2",
         "jsonwebtoken": "~8.5.1",
         "jwt-decode": "^3.1.2",
         "limiter": "^2.1.0",
diff --git a/server/model/status_page.js b/server/model/status_page.js
index 82d184bf..7682272c 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -2,6 +2,7 @@ const { BeanModel } = require("redbean-node/dist/bean-model");
 const { R } = require("redbean-node");
 const cheerio = require("cheerio");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
+const jsesc = require("jsesc");
 
 class StatusPage extends BeanModel {
 
@@ -56,13 +57,19 @@ class StatusPage extends BeanModel {
         head.append(`<meta property="og:description" content="${description155}" />`);
 
         // Preload data
-        const json = JSON.stringify(await StatusPage.getStatusPageData(statusPage));
-        head.append(`
-            <script>
-                window.preloadData = ${json}
+        // Add jsesc, fix https://github.com/louislam/uptime-kuma/issues/2186
+        const escapedJSONObject = jsesc(JSON.stringify(await StatusPage.getStatusPageData(statusPage)), {
+            "isScriptContext": true
+        });
+
+        const script = $(`
+            <script id="preload-data" data-json="{}">
+                window.preloadData = ${escapedJSONObject};
             </script>
         `);
 
+        head.append(script);
+
         // manifest.json
         $("link[rel=manifest]").attr("href", `/api/status-page/${statusPage.slug}/manifest.json`);
 

From 7d3cc002ea8fe95c7ca23885052280110e7f5217 Mon Sep 17 00:00:00 2001
From: Vasilis The Pikachu <vascreeper@yahoo.com>
Date: Fri, 7 Oct 2022 08:55:12 +0000
Subject: [PATCH 215/803] Added greek language

---
 src/i18n.js            |   1 +
 src/languages/el-GR.js | 585 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 586 insertions(+)
 create mode 100644 src/languages/el-GR.js

diff --git a/src/i18n.js b/src/i18n.js
index 8495cd99..4c19eb00 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -34,6 +34,7 @@ const languageList = {
     "zh-TW": "繁體中文 (台灣)",
     "uk-UA": "Український",
     "th-TH": "ไทย",
+    "el-GR": "Ελληνικά",
 };
 
 let messages = {
diff --git a/src/languages/el-GR.js b/src/languages/el-GR.js
new file mode 100644
index 00000000..29af0417
--- /dev/null
+++ b/src/languages/el-GR.js
@@ -0,0 +1,585 @@
+export default {
+    languageName: "Ελληνικά",
+    checkEverySecond: "Έλεγχος κάθε {0} δευτερόλεπτα",
+    retryCheckEverySecond: "Επανάληψη κάθε {0} δευτερόλεπτα",
+    resendEveryXTimes: "Επανάληψη αποστολής ειδοποίησης κάθε {0} φορές",
+    resendDisabled: "Η επανάληψη αποστολής ειδοποίησης είναι απενεργοποιημένη",
+    retriesDescription: "Μέγιστες επαναλήψεις προτού η υπηρεσία επισημανθεί ως κατω και σταλεί μια ειδοποίηση",
+    ignoreTLSError: "Παράβλεψη σφάλματος TLS/SSL για ιστότοπους HTTPS",
+    upsideDownModeDescription: "Αναποδογυρίστε την κατάσταση. Εάν η υπηρεσία είναι προσβάσιμη, είναι ΚΑΤΩ.",
+    maxRedirectDescription: "Μέγιστος αριθμός redirect που θα ακολουθήσουν. Ρυθμίστε το 0 για να απενεργοποιήσετε τα redirect.",
+    acceptedStatusCodesDescription: "Επιλέξτε κωδικούς κατάστασης που θεωρούνται επιτυχή.",
+    passwordNotMatchMsg: "Ο κωδικός δεν ταιριάζει.",
+    notificationDescription: "Οι ειδοποιήσεις πρέπει να εκχωρηθούν σε μια παρακολούθηση για να λειτουργήσουν.",
+    keywordDescription: "Αναζήτηση λέξης-κλειδιού σε απλή απόκριση HTML ή JSON. Η αναζήτηση είναι διάκριση πεζών-κεφαλαίων.",
+    pauseDashboardHome: "Παύση",
+    deleteMonitorMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την παρακολούθηση;",
+    deleteNotificationMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την ειδοποίηση για όλες τις παρακολούθησης?",
+    dnsPortDescription: "Θύρα διακομιστή DNS. Προεπιλογή σε 53. Μπορείτε να αλλάξετε τη θύρα ανά πάσα στιγμή.",
+    resolverserverDescription: "Το Cloudflare είναι ο προεπιλεγμένος διακομιστής. Μπορείτε να αλλάξετε τον διακομιστή επίλυσης ανά πάσα στιγμήhe default server. You can change the resolver server anytime.",
+    rrtypeDescription: "Επιλέξτε τον τύπο RR που θέλετε να παρακολουθήσετε",
+    pauseMonitorMsg: "Είστε βέβαιοι ότι θέλετε να κάνετε παύση;",
+    enableDefaultNotificationDescription: "Αυτή η ειδοποίηση θα είναι ενεργοποιημένη από προεπιλογή για νέες παρακολούθησης. Μπορείτε ακόμα να απενεργοποιήσετε την ειδοποίηση ξεχωριστά για κάθε παρακολούθηση.",
+    clearEventsMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα συμβάντα για αυτήν την παρακολούθηση;",
+    clearHeartbeatsMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλους τους καρδιακούς παλμούς για αυτήν την παρακολούθηση;",
+    confirmClearStatisticsMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε ΟΛΑ τα στατιστικά στοιχεία;?",
+    importHandleDescription: "Επιλέξτε «Παράλειψη υπάρχοντος» εάν θέλετε να παραλείψετε κάθε παρακολούθηση ή ειδοποίηση με το ίδιο όνομα. Το 'Overwrite' θα διαγράψει κάθε υπάρχουσα παρακολούθηση και ειδοποίηση.",
+    confirmImportMsg: "Είστε βέβαιοι ότι θέλετε να εισαγάγετε το αντίγραφο ασφαλείας; Επαληθεύστε ότι έχετε επιλέξει τη σωστή επιλογή.",
+    twoFAVerifyLabel: "Εισαγάγετε το 2FA κωδικό για να επαληθεύσετε: ",
+    tokenValidSettingsMsg: "Ο κωδικός 2FA είναι έγκυρο! Τώρα μπορείτε να αποθηκεύσετε τις ρυθμίσεις 2FA",
+    confirmEnableTwoFAMsg: "Είστε βέβαιοι ότι θέλετε να ενεργοποιήσετε το 2FA;",
+    confirmDisableTwoFAMsg: "Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε το 2FA;",
+    Settings: "Ρυθμίσεις",
+    Dashboard: "Πίνακας",
+    "New Update": "Νέα αναβάθμιση",
+    Language: "Γλώσσα",
+    Appearance: "Εμφάνιση",
+    Theme: "Θέμα",
+    General: "Γενικά",
+    "Primary Base URL": "Κύρια βασική διεύθυνση URL",
+    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: "Current",
+    Uptime: "Χρόνος λειτουργίας",
+    "Cert Exp.": "Cert Exp.",
+    day: "ημέρα | ημέρες",
+    "-day": "-ημέρα",
+    hour: "ώρα",
+    "-hour": "-ώρα",
+    Response: "Απάντηση",
+    Ping: "Ping",
+    "Monitor Type": "Τύπος παρακολούθησης",
+    Keyword: "Λέξη-κλειδί",
+    "Friendly Name": "Φιλικό όνομα",
+    URL: "URL",
+    Hostname: "Hostname",
+    Port: "Port",
+    "Heartbeat Interval": "Διάστημα καρδιακών παλμών",
+    Retries: "Επαναλήψεις",
+    "Heartbeat Retry Interval": "Διάστημα επανάληψης παλμών καρδιάς",
+    "Resend Notification if Down X times consequently": "Αποστολή νέας ειδοποίησης εάν κατω X φορές κατά συνέχεια",
+    Advanced: "Προχωρημένα",
+    "Upside Down Mode": "Ανάποδη λειτουργία",
+    "Max. Redirects": "Μέγιστη. Ανακατευθύνσεις",
+    "Accepted Status Codes": "Αποδεκτοί Κωδικοί Κατάστασης",
+    "Push URL": "Push URL",
+    needPushEvery: "Θα πρέπει να καλείτε αυτήν τη διεύθυνση URL κάθε {0} δευτερόλεπτα.",
+    pushOptionalParams: "Προαιρετικές παράμετροι: {0}",
+    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": "Ενεργοποίηση ελέγχου ταυτότητας",
+    "disableauth.message1": "Είστε βέβαιοι ότι θέλετε να <strong>απενεργοποιήσετε τον έλεγχο ταυτότητας</strong>;",
+    "disableauth.message2": "Έχει σχεδιαστεί για σενάρια <strong>όπου σκοπεύετε να εφαρμόσετε έλεγχο ταυτότητας τρίτου μέρους</strong> μπροστά από το Uptime Kuma, όπως το Cloudflare Access, Authelia ή άλλους μηχανισμούς ελέγχου ταυτότητας.",
+    "Please use this option carefully!": "Χρησιμοποιήστε αυτή την επιλογή προσεκτικά!",
+    Logout: "Αποσύνδεση",
+    Leave: "Φύγετε",
+    "I understand, please disable": "Καταλαβαίνω, απενεργοποιήστε",
+    Confirm: "Επιβεβαίωση",
+    Yes: "Ναί",
+    No: "Οχι",
+    Username: "Όνομα χρήστη",
+    Password: "Κωδικός πρόσβασης",
+    "Remember me": "Θυμήσου με",
+    Login: "Σύνδεση",
+    "No Monitors, please": "Δεν υπάρχουν παρακολούθησης παρακαλώ",
+    "add one": "προσθέστε ένα",
+    "Notification Type": "Είδος ειδοποίησης",
+    Email: "Email",
+    Test: "Δοκιμή",
+    "Certificate Info": "Πληροφορίες πιστοποιητικού",
+    "Resolver Server": "Διακομιστής επίλυσης",
+    "Resource Record Type": "Τύπος εγγραφής πόρων",
+    "Last Result": "Τελευταίο Αποτέλεσμα",
+    "Create your admin account": "Δημιουργήστε τον λογαριασμό διαχειριστή σας",
+    "Repeat Password": "Επαναλάβετε τον κωδικό πρόσβασης",
+    "Import Backup": "Εισαγωγή αντιγράφων ασφαλείας",
+    "Export Backup": "Εξαγωγή αντιγράφων ασφαλείας",
+    Export: "Εξαγωγή",
+    Import: "Εισαγωγή",
+    respTime: "Χρόν. Aπό (ms)",
+    notAvailableShort: "N/A",
+    "Default enabled": "Προεπιλογή ενεργοποιημένη",
+    "Apply on all existing monitors": "Εφαρμόστε σε όλες τις υπάρχουσες παρακολούθησης",
+    Create: "Δημιουργία",
+    "Clear Data": "Καθαρισμός δεδομένων",
+    Events: "Γεγονότα",
+    Heartbeats: "Παλμοι καρδιας",
+    "Auto Get": "Αυτόματη λήψη",
+    backupDescription: "Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας γία ολλες της παρακολούθησης και ειδοποιήσης σε ένα αρχείο JSON..",
+    backupDescription2: "Σημείωση: δεν περιλαμβάνονται δεδομένα ιστορικού και συμβάντων.",
+    backupDescription3: "Στο αρχείο εξαγωγής περιλαμβάνονται ευαίσθητα δεδομένα, όπως token ειδοποιήσεων. Aποθηκεύστε την εξαγωγή με ασφάλεια..",
+    alertNoFile: "Επιλέξτε ένα αρχείο για εισαγωγή.",
+    alertWrongFileType: "Επιλέξτε ένα αρχείο JSON.",
+    "Clear all statistics": "Εκκαθάριση όλων των στατιστικών",
+    "Skip existing": "Παράβλεψη υπάρχοντος",
+    Overwrite: "Αντικατάσταση",
+    Options: "Επιλογές",
+    "Keep both": "Κράτα και τα δύο",
+    "Verify Token": "Επαλήθευση Token",
+    "Setup 2FA": "Ρύθμιση 2FA",
+    "Enable 2FA": "Ενεργοποίηση 2FA",
+    "Disable 2FA": "Απενεργοποίηση 2FA",
+    "2FA Settings": "Ρυθμίσεις 2FA",
+    "Two Factor Authentication": "Έλεγχος ταυτότητας δύο παραγόντων",
+    Active: "Ενεργός",
+    Inactive: "Ανενεργό",
+    Token: "Token",
+    "Show URI": "Εμφάνιση URI",
+    Tags: "Ετικέτες",
+    "Add New below or Select...": "Προσθήκη νέου παρακάτω ή Επιλέξτε...",
+    "Tag with this name already exist.": "Υπάρχει ήδη η ετικέτα με αυτό το όνομα.",
+    "Tag with this value already exist.": "Υπάρχει ήδη ετικέτα με αυτό το value.",
+    color: "χρώμα",
+    "value (optional)": "value (optional)",
+    Gray: "Γκρί",
+    Red: "Κόκκινο",
+    Orange: "Πορτοκάλι",
+    Green: "Πράσινο",
+    Blue: "Μπλε",
+    Indigo: "Indigo",
+    Purple: "Μωβ",
+    Pink: "Ροζ",
+    "Search...": "Αναζήτηση...",
+    "Avg. Ping": "Μέσo.Ping",
+    "Avg. Response": "Μέσo. Aπάντηση",
+    "Entry Page": "Σελίδα εισαγωγής",
+    statusPageNothing: "Δεν υπάρχει τίποτα εδώ, προσθέστε μια ομάδα ή μια παρακολούθηση.",
+    "No Services": "Δεν υπάρχουν υπηρεσίες",
+    "All Systems Operational": "Όλα τα συστήματα λειτουργούν",
+    "Partially Degraded Service": "Μερικώς υποβαθμισμένη υπηρεσία",
+    "Degraded Service": "Υποβαθμισμένη υπηρεσία",
+    "Add Group": "Προσθήκη γρουπ",
+    "Add a monitor": "Προσθήκη παρακολούθησης",
+    "Edit Status Page": "Επεξεργασία σελίδας κατάστασης",
+    "Go to Dashboard": "Μεταβείτε στον Πίνακα ελέγχου",
+    "Status Page": "Σελίδα κατάστασης",
+    "Status Pages": "Σελίδες κατάστασης",
+    defaultNotificationName: "Η ειδοποίηση μου {notification} ({number})",
+    here: "εδώ",
+    Required: "Απαιτείται",
+    telegram: "Telegram",
+    "Bot Token": "Διακριτικό Bot",
+    wayToGetTelegramToken: "Μπορείτε να πάρετε ένα διακριτικό από {0}.",
+    "Chat ID": "Chat ID",
+    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
+    wayToGetTelegramChatID: "Μπορείτε να λάβετε το αναγνωριστικό συνομιλίας σας στέλνοντας ένα μήνυμα στο bot και μεταβαίνοντας σε αυτήν τη διεύθυνση URL για να προβάλετε το chat_id:",
+    "YOUR BOT TOKEN HERE": "ΤΟ BOT ΣΑΣ ΔΙΑΚΡΙΤΙΚΌ ΕΔΩ",
+    chatIDNotFound: "Το Chat ID δεν βρέθηκε. Στείλτε πρώτα ένα μήνυμα σε αυτό το bot",
+    webhook: "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Τύπος περιεχομένου",
+    webhookJsonDesc: "{0} είναι καλό για οποιονδήποτε σύγχρονο διακομιστή HTTP όπως το Express.js",
+    webhookFormDataDesc: "{multipart} είναι καλό για την PHP. Το JSON θα πρέπει να αναλυθεί με {decodeFunction}",
+    smtp: "Email (SMTP)",
+    secureOptionNone: "None / STARTTLS (25, 587)",
+    secureOptionTLS: "TLS (465)",
+    "Ignore TLS Error": "Παράβλεψη σφάλματος TLS",
+    "From Email": "Από Email",
+    emailCustomSubject: "Προσαρμοσμένο θέμα",
+    "To Email": "Προς Email",
+    smtpCC: "CC",
+    smtpBCC: "BCC",
+    discord: "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    wayToGetDiscordURL: "Μπορείτε να το αποκτήσετε μεταβαίνοντας στις Ρυθμίσεις διακομιστή -> Ενσωματώσεις -> Δημιουργία Webhook",
+    "Bot Display Name": "Εμφανιζόμενο όνομα bot",
+    "Prefix Custom Message": "Προσαρμοσμένο μήνυμα",
+    "Hello @everyone is...": "Γεια {'@'}everyone ειναι...",
+    teams: "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    wayToGetTeamsURL: "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
+    signal: "Signal",
+    Number: "Αριθμός",
+    Recipients: "Αποδέκτες",
+    needSignalAPI: "Πρέπει να έχετε ένα signal client με REST API..",
+    wayToCheckSignalURL: "Μπορείτε να ελέγξετε αυτό το URL για να δείτε πώς να ρυθμίσετε ένα:",
+    signalImportant: "ΣΗΜΑΝΤΙΚΟ: Δεν μπορείτε να συνδυάσετε ομάδες και αριθμούς στους παραλήπτες!",
+    gotify: "Gotify",
+    "Application Token": "Token εφαρμογής",
+    "Server URL": "URL διακομιστή",
+    Priority: "Προτεραιότητα",
+    slack: "Slack",
+    "Icon Emoji": "Εικονίδιο Emoji",
+    "Channel Name": "Όνομα καναλιού",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    aboutWebhooks: "Περισσότερες πληροφορίες σχετικά με τα Webhooks στο: {0}",
+    aboutChannelName: "Εισαγάγετε το όνομα του καναλιού στο {0} Όνομα καναλιού εάν θέλετε να παρακάμψετε το κανάλι Webhook. Π.χ.: #other-channel",
+    aboutKumaURL: "Εάν αφήσετε κενό το πεδίο URL Uptime Kuma, θα είναι προεπιλεγμένο στη σελίδα Project GitHub..",
+    emojiCheatSheet: "Φύλλο εξαπάτησης emoji: {0}",
+    "rocket.chat": "Rocket.Chat",
+    pushover: "Pushover",
+    pushy: "Pushy",
+    PushByTechulus: "Push by Techulus",
+    octopush: "Octopush",
+    promosms: "PromoSMS",
+    clicksendsms: "ClickSend SMS",
+    lunasea: "LunaSea",
+    apprise: "Apprise (Support 50+ Notification services)",
+    GoogleChat: "Google Chat (Google Workspace only)",
+    pushbullet: "Pushbullet",
+    line: "Line Messenger",
+    mattermost: "Mattermost",
+    "User Key": "Κλειδί χρήστη",
+    Device: "Συσκευή",
+    "Message Title": "Τίτλος μηνύματος",
+    "Notification Sound": "Ήχος ειδοποίησης",
+    "More info on:": "Περισσότερες πληροφορίες στο: {0}",
+    pushoverDesc1: "Η προτεραιότητα έκτακτης ανάγκης (2) έχει προεπιλεγμένο χρονικό όριο 30 δευτερολέπτων μεταξύ των επαναλήψεων και θα λήξει μετά από 1 ώρα.",
+    pushoverDesc2: "Εάν θέλετε να στέλνετε ειδοποιήσεις σε διαφορετικές συσκευές, συμπληρώστε το πεδίο Συσκευή.",
+    "SMS Type": "Τύπος SMS",
+    octopushTypePremium: "Premium (Γρήγορη - συνιστάται για ειδοποίηση)",
+    octopushTypeLowCost: "Χαμηλό κόστος (Αργό - μερικές φορές μπλοκάρεται από τον χειριστή)",
+    checkPrice: "Ελέγξτε τις τιμές {0}:",
+    apiCredentials: "API credentials",
+    octopushLegacyHint: "Χρησιμοποιείτε την παλαιού τύπου έκδοση του Octopush (2011-2020) ή τη νέα έκδοση;",
+    "Check octopush prices": "Ελέγξτε τις τιμές OctoPush {0}.",
+    octopushPhoneNumber: "Αριθμός τηλεφώνου (διεθνής μορφή, π.χ.: +30694345678)",
+    octopushSMSSender: "Όνομα αποστολέα SMS: 3-11 αλφαριθμητικοί χαρακτήρες και διάστημα (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Παράδειγμα: {0}",
+    "Read more:": "Διαβάστε περισσότερα: {0}",
+    "Status:": "Κατάσταση: {0}",
+    "Read more": "Διαβάστε περισσότερα",
+    appriseInstalled: "Το Apprise έχει εγκατασταθεί.",
+    appriseNotInstalled: "Το Apprise δεν έχει εγκατασταθεί. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel Access Token",
+    "Line Developers Console": "Line Developers Console",
+    lineDevConsoleTo: "Line Developers Console - {0}",
+    "Basic Settings": "Βασικές ρυθμίσεις",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    wayToGetLineChannelToken: "Πρώτα αποκτήστε πρόσβαση στο {0}, δημιουργήστε έναν πάροχο και ένα κανάλι (Messanging API) και, στη συνέχεια, μπορείτε να λάβετε το channel access token και το user ID από τα παραπάνω στοιχεία μενού.",
+    "Icon URL": "Διεύθυνση URL εικονιδίου",
+    aboutIconURL: "Μπορείτε να παρέχετε έναν σύνδεσμο προς μια εικόνα στο \"Icon URL\" για να παρακάμψετε την προεπιλεγμένη εικόνα προφίλ. Δεν θα χρησιμοποιηθεί εάν έχει οριστεί το εικονίδιο Emoji.",
+    aboutMattermostChannelName: "Μπορείτε να παρακάμψετε το προεπιλεγμένο κανάλι στο οποίο δημοσιεύει το Webhook εισάγοντας το όνομα του καναλιού στο πεδίο \"Όνομα καναλιού\". Αυτό πρέπει να ενεργοποιηθεί στις ρυθμίσεις του Mattermost Webhook. Π.χ.: #other-channel",
+    matrix: "Matrix",
+    promosmsTypeEco: "SMS ECO - φθηνό αλλά αργό και συχνά υπερφορτωμένο. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
+    promosmsTypeFlash: "SMS FLASH - Το μήνυμα θα εμφανίζεται αυτόματα στη συσκευή του παραλήπτη. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
+    promosmsTypeFull: "SMS FULL - Premium επίπεδο SMS, Μπορείτε να χρησιμοποιήσετε το Όνομα Αποστολέα σας (Πρέπει πρώτα να καταχωρήσετε το όνομα). Αξιόπιστο για ειδοποιήσεις.",
+    promosmsTypeSpeed: "SMS SPEED - Υψηλότερη προτεραιότητα στο σύστημα. Πολύ γρήγορο και αξιόπιστο αλλά ακριβό (περίπου διπλάσια τιμή SMS FULL).",
+    promosmsPhoneNumber: "Αριθμός τηλεφώνου (για πολωνούς παραλήπτες Μπορείτε να παραλείψετε τους κωδικούς περιοχής)",
+    promosmsSMSSender: "Όνομα αποστολέα SMS: Προεγγεγραμμένο όνομα ή ένα από τα προεπιλεγμένα: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    matrixHomeserverURL: "Homeserver URL (με http(s):// και προαιρετικά θύρα)",
+    "Internal Room Id": "Internal Room ID",
+    matrixDesc1: "Μπορείτε να βρείτε το internal room ID ανατρέχοντας στην ενότητα για προχωρημένους των ρυθμίσεων δωματίου στο πρόγραμμα-πελάτη Matrix. Θα πρέπει να μοιάζει με !QMdRCpUIfLwsfjxye6:home.server.",
+    matrixDesc2: "Συνιστάται ανεπιφύλακτα να δημιουργήσετε έναν νέο χρήστη και να μην χρησιμοποιήσετε το διακριτικό πρόσβασης του χρήστη Matrix, καθώς θα επιτρέψει την πλήρη πρόσβαση στον λογαριασμό σας και σε όλα τα δωμάτια στα οποία συμμετέχετε. Αντίθετα, δημιουργήστε έναν νέο χρήστη και προσκαλέστε τον μόνο στο δωμάτιο στο οποίο θέλετε να λαμβάνετε την ειδοποίηση. Μπορείτε να λάβετε το access token εκτελώντας {0}",
+    Method: "Μέθοδος",
+    Body: "Σώμα",
+    Headers: "Headers",
+    PushUrl: "Push URL",
+    HeadersInvalidFormat: "The request headers are not valid JSON: ",
+    BodyInvalidFormat: "The request body is not valid JSON: ",
+    "Monitor History": "Ιστορικο Παρακολούθησης",
+    clearDataOlderThan: "Διατηρήστε τα δεδομένα ιστορικού παρακολούθησης για {0} ημέρες.",
+    PasswordsDoNotMatch: "Οι κωδικοί πρόσβασης δεν ταιριάζουν.",
+    records: "εγγραφές",
+    "One record": "Μία εγγραφή",
+    steamApiKeyDescription: "Για την παρακολούθηση ενός διακομιστή παιχνιδιών Steam χρειάζεστε ένα κλειδί Steam Web-API. Μπορείτε να καταχωρήσετε το κλειδί API σας εδώ: ",
+    "Current User": "Τρέχων χρήστης",
+    topic: "Θέμα",
+    topicExplanation: "Θέμα MQTT προς παρακολούθηση",
+    successMessage: "Μήνυμα επιτυχίας",
+    successMessageExplanation: "Μήνυμα MQTT που θα θεωρηθεί επιτυχές",
+    recent: "Πρόσφατος",
+    Done: "Ολοκληρώθηκε",
+    Info: "Πληροφορίες",
+    Security: "Ασφάλεια",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Συρρίκνωση βάσης δεδομένων",
+    "Pick a RR-Type...": "Επιλέξτε έναν τύπο RR...",
+    "Pick Accepted Status Codes...": "Επιλέξτε Αποδεκτούς κωδικούς κατάστασης...",
+    Default: "Προκαθορισμένο",
+    "HTTP Options": "Επιλογές HTTP",
+    "Create Incident": "Δημιουργία περιστατικού",
+    Title: "Τίτλος",
+    Content: "Περιεχόμενο",
+    Style: "Στυλ",
+    info: "πληροφορίες",
+    warning: "προειδοποίηση",
+    danger: "κίνδυνος",
+    error: "σφάλμα",
+    critical: "κριτικό",
+    primary: "primary",
+    light: "light",
+    dark: "dark",
+    Post: "Δημοσίευση",
+    "Please input title and content": "Παρακαλούμε εισαγάγετε τίτλο και περιεχόμενο",
+    Created: "Δημιουργήθηκε",
+    "Last Updated": "Τελευταία ενημέρωση",
+    Unpin: "Ξεκαρφιτσώστε",
+    "Switch to Light Theme": "Μετάβαση σε Ανιχτό θέμα",
+    "Switch to Dark Theme": "Μετάβαση σε Σκούρο θέμα",
+    "Show Tags": "Εμφάνιση ετικετών",
+    "Hide Tags": "Απόκρυψη ετικετών",
+    Description: "Περιγραφή",
+    "No monitors available.": "Δεν υπάρχουν διαθέσιμες παρακολουθήσεις.",
+    "Add one": "Προσθέστε ένα",
+    "No Monitors": "Χωρίς παρακολουθήσεις",
+    "Untitled Group": "Ομάδα χωρίς τίτλο",
+    Services: "Υπηρεσίες",
+    Discard: "Απορρίψει",
+    Cancel: "Ακυρο",
+    "Powered by": "Με την υποστήριξη του",
+    shrinkDatabaseDescription: "Ενεργοποίηση βάσης δεδομένων VACUUM για SQLite. Εάν η βάση δεδομένων σας έχει δημιουργηθεί μετά την έκδοση 1.10.0, το AUTO_VACUUM είναι ήδη ενεργοποιημένο και αυτή η ενέργεια δεν χρειάζεται.",
+    serwersms: "SerwerSMS.pl",
+    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
+    serwersmsAPIPassword: "API κωδικός πρόσβασης",
+    serwersmsPhoneNumber: "Αριθμός τηλεφώνου",
+    serwersmsSenderName: "Όνομα αποστολέα SMS (καταχωρήθηκε μέσω της πύλης πελατών)",
+    stackfield: "Stackfield",
+    Customize: "Προσαρμογή",
+    "Custom Footer": "Προσαρμογή Footer",
+    "Custom CSS": "Προσαρμογή CSS",
+    smtpDkimSettings: "Ρυθμίσεις DKIM",
+    smtpDkimDesc: "Ανατρέξτε στο Nodemailer DKIM {0} για χρήση.",
+    documentation: "documentation",
+    smtpDkimDomain: "Domain Name",
+    smtpDkimKeySelector: "Key Selector",
+    smtpDkimPrivateKey: "Private Key",
+    smtpDkimHashAlgo: "Hash Algorithm (Optional)",
+    smtpDkimheaderFieldNames: "Header Keys to sign (Optional)",
+    smtpDkimskipFields: "Header Keys not to sign (Optional)",
+    wayToGetPagerDutyKey: "Μπορείτε να το λάβετε μεταβαίνοντας στο Service -> Service Directory -> (Επιλέξτε μια υπηρεσία) -> Integrations -> Add integration. Εδώ μπορείτε να κάνετε αναζήτηση για \"Events API V2\". Περισσότερες πληροφορίες {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Αυτόματη επίλυση ή αναγνώριση",
+    "do nothing": "μην κάνεις τίποτα",
+    "auto acknowledged": "αυτόματη αναγνώριση",
+    "auto resolve": "αυτόματη επίλυση",
+    gorush: "Gorush",
+    alerta: "Alerta",
+    alertaApiEndpoint: "API Endpoint",
+    alertaEnvironment: "Environment",
+    alertaApiKey: "API Key",
+    alertaAlertState: "Alert State",
+    alertaRecoverState: "Recover State",
+    deleteStatusPageMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν τη σελίδα κατάστασης?",
+    Proxies: "Proxies",
+    default: "Προκαθορισμένο",
+    enabled: "Ενεργοποιημένο",
+    setAsDefault: "Ορίσετε ως προεπιλογή",
+    deleteProxyMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το proxy για όλες τις παρακολουθήσεις;",
+    proxyDescription: "Πρέπει να εκχωρηθούν proxies σε μια οθπαρακολουθή για να λειτουργήσουν..",
+    enableProxyDescription: "Το proxy δεν θα επηρεάσει τα αιτήματα της παρακολουθήσεις μέχρι να ενεργοποιηθεί. Μπορείτε να ελέγξετε την προσωρινή απενεργοποίηση του proxy από όλες τις παρακολουθήσεις βάσει κατάστασης ενεργοποίησης.",
+    setAsDefaultProxyDescription: "Αυτός το proxy θα είναι ενεργοποιημένο από προεπιλογή για νέες παρακολουθήσεις. Μπορείτε ακόμα να απενεργοποιήσετε το proxy ξεχωριστά για κάθε οθόνη.",
+    "Certificate Chain": "Certificate Chain",
+    Valid: "Εγκυρο",
+    Invalid: "Μη έγκυρο",
+    AccessKeyId: "AccessKey ID",
+    SecretAccessKey: "AccessKey Secret",
+    PhoneNumbers: "PhoneNumbers",
+    TemplateCode: "TemplateCode",
+    SignName: "SignName",
+    "Sms template must contain parameters: ": "Το πρότυπο SMS πρέπει να περιέχει παραμέτρους: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Ομάδα",
+    "Bark Sound": "Bark Ήχος",
+    WebHookUrl: "WebHookUrl",
+    SecretKey: "SecretKey",
+    "For safety, must use secret key": "Για ασφάλεια, πρέπει να χρησιμοποιήσετε secret key",
+    "Device Token": "Device Token",
+    Platform: "Platform",
+    iOS: "iOS",
+    Android: "Android",
+    Huawei: "Huawei",
+    High: "High",
+    Retry: "Ξαναδοκιμάσετε",
+    Topic: "Θέμα",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Ρύθμιση Proxy",
+    "Proxy Protocol": "Πρωτόκολλο Proxy",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Το Proxy διαθέτει έλεγχο ταυτότητας",
+    User: "Χρήστης",
+    Installed: "Εγκατεστημένο",
+    "Not installed": "Μη εγκατεστημενο",
+    Running: "Τρέχη",
+    "Not running": "Δεν τρεχη",
+    "Remove Token": "Κατάργηση Token",
+    Start: "Αρχή",
+    Stop: "Στάση",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Προσθήκη νέας σελίδας κατάστασης",
+    Slug: "Slug",
+    "Accept characters:": "Αποδοχή χαρακτήρων:",
+    startOrEndWithOnly: "Ξεκινήστε ή τελειώστε μόνο με {0}",
+    "No consecutive dashes": "Χωρίς διαδοχικές παύλες",
+    Next: "Επόμενο",
+    "The slug is already taken. Please choose another slug.": "Ο slug έχει ήδη πιαστεί. Επιλέξτε άλλο slug.",
+    "No Proxy": "Οχι Proxy",
+    Authentication: "Authentication",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Σελίδα νέας κατάστασης",
+    "Page Not Found": "Η σελίδα δεν βρέθηκε",
+    "Reverse Proxy": "Αντίστροφο Proxy",
+    Backup: "Αντιγράφων ασφαλείας",
+    About: "Σχετικά με",
+    wayToGetCloudflaredURL: "(Λήψη cloudflared από {0})",
+    cloudflareWebsite: "Ιστοσελίδα Cloudflare",
+    "Message:": "Μήνυμα:",
+    "Don't know how to get the token? Please read the guide:": "Δεν ξέρετε πώς να αποκτήσετε το token; Διαβάστε τον οδηγό:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Η τρέχουσα σύνδεση μπορεί να χαθεί εάν αυτή τη στιγμή συνδέεστε μέσω του Cloudflare Tunnel. Θέλετε σίγουρα να το σταματήσετε; Πληκτρολογήστε τον τρέχοντα κωδικό πρόσβασής σας για να τον επιβεβαιώσετε.",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Εμπιστοσύνη του Proxy",
+    "Other Software": "Other Software",
+    "For example: nginx, Apache and Traefik.": "Για παράδειγμα: nginx, Apache και Traefik.",
+    "Please read": "Παρακαλώ διαβάστε",
+    "Subject:": "Θέμα:",
+    "Valid To:": "Εγκυρο για:",
+    "Days Remaining:": "Ημέρες που απομένουν:",
+    "Issuer:": "Εκδότης:",
+    "Fingerprint:": "Δακτυλικό αποτύπωμα:",
+    "No status pages": "Δεν υπάρχουν σελίδες κατάστασης",
+    "Domain Name Expiry Notification": "Ειδοποίηση λήξης ονόματος τομέα",
+    Proxy: "Proxy",
+    "Date Created": "Ημερομηνία Δημιουργίας",
+    HomeAssistant: "Home Assistant",
+    onebotHttpAddress: "OneBot HTTP Address",
+    onebotMessageType: "OneBot Message Type",
+    onebotGroupMessage: "Group",
+    onebotPrivateMessage: "Private",
+    onebotUserOrGroupId: "Group/User ID",
+    onebotSafetyTips: "Για ασφάλεια, πρέπει να ορίσετε το acess token",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Κείμενο υποσέλιδου",
+    "Show Powered By": "Εμφάνιση Powered By",
+    "Domain Names": "Ονόματα Τομέα",
+    signedInDisp: "Συνδεθήκατε ως {0}",
+    signedInDispDisabled: "Εξουσιοδότηση είναι απενεργοποιημένη.",
+    RadiusSecret: "Radius Secret",
+    RadiusSecretDescription: "Shared Secret μεταξύ client και το server",
+    RadiusCalledStationId: "Called Station Id",
+    RadiusCalledStationIdDescription: "Identifier της καλούμενης συσκευής",
+    RadiusCallingStationId: "Calling Station Id",
+    RadiusCallingStationIdDescription: "Identifier oτης συσκευής κλήσης",
+    "Certificate Expiry Notification": "Ειδοποίηση Λήξης Πιστοποιητικού",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "Αριθμός Παραλήπτη",
+    "From Name/Number": "Από Όνομα/Αριθμός",
+    "Leave blank to use a shared sender number.": "Αφήστε το κενό για να χρησιμοποιήσετε έναν κοινόχρηστο αριθμό αποστολέα.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "endpoint",
+    octopushAPIKey: "\"API key\" από το HTTP API credentials στον πίνακα ελέγχου",
+    octopushLogin: "\"Login\" από το HTTP API credentials στον πίνακα ελέγχου",
+    promosmsLogin: "API Login Name",
+    promosmsPassword: "API Password",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    pushyAPIKey: "Μυστικό API Key",
+    pushyToken: "Τoken Συσκευής",
+    "Show update if available": "Εμφάνιση ενημέρωσης εάν είναι διαθέσιμη",
+    "Also check beta release": "Ελέγξτε επίσης την έκδοση beta",
+    "Using a Reverse Proxy?": "Χρησιμοποιείτε reverse proxy;",
+    "Check how to config it for WebSocket": "Ελέγξτε πώς να το ρυθμίσετε για το WebSocket",
+    "Steam Game Server": "Διακομιστής παιχνιδιών Steam",
+    "Most likely causes:": "Πιο πιθανές αιτίες:",
+    "The resource is no longer available.": "Ο πόρος δεν είναι πλέον διαθέσιμος.",
+    "There might be a typing error in the address.": "Μπορεί να υπάρχει σφάλμα πληκτρολόγησης στη διεύθυνση.",
+    "What you can try:": "Τι μπορείτε να δοκιμάσετε:",
+    "Retype the address.": "Πληκτρολογήστε ξανά τη διεύθυνση.",
+    "Go back to the previous page.": "Επιστρέψτε στην προηγούμενη σελίδα.",
+    "Coming Soon": "Ερχεται σύντομα",
+    wayToGetClickSendSMSToken: "Μπορείτε να πάρετε το API Username και API Key απο {0} .",
+    "Connection String": "Connection String",
+    Query: "Query",
+    settingsCertificateExpiry: "Λήξη πιστοποιητικού TLS",
+    certificationExpiryDescription: "Οι παρακολουθήσεις HTTPS ενεργοποιούν ειδοποίηση όταν λήξει το πιστοποιητικό TLS σε:",
+    "Setup Docker Host": "Ρύθμιση Docker Host",
+    "Connection Type": "Τύπος σύνδεσης",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον κεντρικό υπολογιστή βάσης για όλες τις παρακολουθήσεις;",
+    socket: "Socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    Domain: "Domain",
+    Workstation: "Workstation",
+    disableCloudflaredNoAuthMsg: "Βρίσκεστε σε λειτουργία No Auth, δεν απαιτείται κωδικός πρόσβασης.",
+    trustProxyDescription: "Εμπιστευτείτε τις κεφαλίδες 'X-Forwarded-*'. Εάν θέλετε να λάβετε τη σωστή IP πελάτη και το Uptime Kuma σας βρίσκεται πίσω το Nginx ή το Apache, θα πρέπει να το ενεργοποιήσετε.",
+    wayToGetLineNotifyToken: "Μπορείτε να λάβετε ένα access token από το {0}",
+    Examples: "Παραδείγματα",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token μπορεί να δημιουργηθεί κάνοντας κλικ στο όνομα του προφίλ σας (κάτω αριστερά) και κάνοντας κύλιση προς τα κάτω και, στη συνέχεια, κάντε κλικ στο Create Token. ",
+    "Notification Service": "Υπηρεσία ειδοποιήσεων",
+    "default: notify all devices": "προεπιλογή: ειδοποίηση όλων των συσκευών",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Μπορείτε να βρείτε μια λίστα με τις Υπηρεσίες ειδοποιήσεων στον Home assistant στην περιοχή \"Developer Tools > Services\" αναζήτηση για \"notification\" για να βρείτε το όνομα της συσκευής/τηλεφώνου σας.",
+    "Automations can optionally be triggered in Home Assistant:": "Οι αυτοματισμοί μπορούν προαιρετικά να ενεργοποιηθούν στο Home Assistant:",
+    "Trigger type:": "Τύπος ενεργοποίησης:",
+    "Event type:": "Τύπος συμβάντος:",
+    "Event data:": "Δεδομένα συμβάντος:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Στη συνέχεια, επιλέξτε μια ενέργεια, για παράδειγμα αλλάξτε τη σκηνή στο σημείο όπου ένα φως RGB είναι κόκκινο.",
+    "Frontend Version": "Έκδοση Frontend",
+    "Frontend Version do not match backend version!": "Η Frontend έκδοση δεν ταιριάζει με την έκδοση backend!",
+    "Base URL": "Βασική διεύθυνση URL",
+    goAlertInfo: "Το GoAlert είναι μια εφαρμογή ανοιχτού κώδικα για προγραμματισμό κλήσεων, αυτοματοποιημένες κλιμακώσεις και ειδοποιήσεις (όπως SMS ή φωνητικές κλήσεις). Αλληλεπιδράστε αυτόματα με το σωστό άτομο, με τον σωστό τρόπο και τη σωστή στιγμή! {0}",
+    goAlertIntegrationKeyInfo: "Λάβετε το generic API integration key για την υπηρεσία σε αυτήν τη μορφή \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" συνήθως την τιμή της παραμέτρου διακριτικού της αντιγραμμένης διεύθυνσης URL.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται πολη, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
+    backupRecommend: "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του τόμου ή του φακέλου δεδομένων (./data/) απευθείας.",
+};

From e29527e22fad7f9691b3fed4b29466f9bd1ced9c Mon Sep 17 00:00:00 2001
From: Vasilis The Pikachu <vasilis@pikachu.systems>
Date: Fri, 7 Oct 2022 11:33:29 +0200
Subject: [PATCH 216/803] Update Greek

---
 src/languages/el-GR.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/languages/el-GR.js b/src/languages/el-GR.js
index 29af0417..92a2d775 100644
--- a/src/languages/el-GR.js
+++ b/src/languages/el-GR.js
@@ -55,7 +55,7 @@ export default {
     "No important events": "Δεν υπάρχουν σημαντικά γεγονότα",
     Resume: "Συνέχιση",
     Edit: "Επεξεργασία",
-    Delete: "Διαγράφω",
+    Delete: "Διαγράφη",
     Current: "Current",
     Uptime: "Χρόνος λειτουργίας",
     "Cert Exp.": "Cert Exp.",
@@ -448,11 +448,11 @@ export default {
     "No Proxy": "Οχι Proxy",
     Authentication: "Authentication",
     "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "Σελίδα νέας κατάστασης",
+    "New Status Page": "Νέας Σελίδα κατάστασης",
     "Page Not Found": "Η σελίδα δεν βρέθηκε",
     "Reverse Proxy": "Αντίστροφο Proxy",
     Backup: "Αντιγράφων ασφαλείας",
-    About: "Σχετικά με",
+    About: "Σχετικά με το Uptime Kuma",
     wayToGetCloudflaredURL: "(Λήψη cloudflared από {0})",
     cloudflareWebsite: "Ιστοσελίδα Cloudflare",
     "Message:": "Μήνυμα:",

From 4c456547807dc3fb4d6de0a4da741ef252cb5c7e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 7 Oct 2022 18:38:14 +0800
Subject: [PATCH 217/803] WIP

---
 extra/exe-builder/Program.cs        | 69 +++++++++++++++++++++--------
 extra/exe-builder/UptimeKuma.csproj |  5 ++-
 2 files changed, 55 insertions(+), 19 deletions(-)

diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 840bc873..84ecda31 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -4,6 +4,7 @@ using System.Diagnostics;
 using System.Drawing;
 using System.Linq;
 using System.Reflection;
+using System.Runtime.InteropServices;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using UptimeKuma.Properties;
@@ -14,7 +15,7 @@ namespace UptimeKuma {
         /// The main entry point for the application.
         /// </summary>
         [STAThread]
-        static void Main() {
+        static void Main(string[] args) {
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
             Application.Run(new UptimeKumaApplicationContext());
@@ -28,37 +29,44 @@ namespace UptimeKuma {
 
         public UptimeKumaApplicationContext()
         {
-            // Initialize Tray Icon
             trayIcon = new NotifyIcon();
 
             trayIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
             trayIcon.ContextMenu = new ContextMenu(new MenuItem[] {
-                new MenuItem("Open", Open),
-                new MenuItem("Check for Update", CheckForUpdate),
-                new MenuItem("About", About),
-                new MenuItem("Exit", Exit),
+                new("Open", Open),
+                //new("Debug Console", DebugConsole),
+                new("Check for Update...", CheckForUpdate),
+                new("Visit GitHub...", VisitGitHub),
+                new("About", About),
+                new("Exit", Exit),
             });
 
+            trayIcon.MouseDoubleClick += new MouseEventHandler(Open);
+
             trayIcon.Visible = true;
 
-            var startInfo = new ProcessStartInfo();
-            startInfo.FileName = "node/node.exe";
-            startInfo.Arguments = "server/server.js";
-            startInfo.RedirectStandardOutput = true;
-            startInfo.RedirectStandardError = true;
-            startInfo.UseShellExecute = false;
-            startInfo.CreateNoWindow = true;
-            startInfo.WorkingDirectory = "core";
+            var startInfo = new ProcessStartInfo {
+                FileName = "node/node.exe",
+                Arguments = "server/server.js --data-dir=\"../data/\"",
+                RedirectStandardOutput = false,
+                RedirectStandardError = false,
+                UseShellExecute = false,
+                CreateNoWindow = true,
+                WorkingDirectory = "core"
+            };
 
             process = new Process();
             process.StartInfo = startInfo;
             process.EnableRaisingEvents = true;
+            process.Exited += new EventHandler(ProcessExited);
+
+
             try {
                 process.Start();
-                Open(null, null);
+                //Open(null, null);
+
             } catch (Exception e) {
                 MessageBox.Show("Startup failed: " + e.Message, "Uptime Kuma Error");
-                throw;
             }
         }
 
@@ -66,10 +74,19 @@ namespace UptimeKuma {
             Process.Start("http://localhost:3001");
         }
 
-        void CheckForUpdate(object sender, EventArgs e) {
+        void DebugConsole(object sender, EventArgs e) {
 
         }
 
+        void CheckForUpdate(object sender, EventArgs e) {
+            Process.Start("https://github.com/louislam/uptime-kuma/releases");
+        }
+
+        void VisitGitHub(object sender, EventArgs e)
+        {
+            Process.Start("https://github.com/louislam/uptime-kuma");
+        }
+
         void About(object sender, EventArgs e)
         {
             MessageBox.Show("Uptime Kuma v1.0.0" + Environment.NewLine + "© 2022 Louis Lam", "Info");
@@ -79,9 +96,25 @@ namespace UptimeKuma {
         {
             // Hide tray icon, otherwise it will remain shown until user mouses over it
             trayIcon.Visible = false;
-            process.Close();
+            process.Kill();
+        }
+
+        void ProcessExited(object sender, EventArgs e) {
+
+            if (process.ExitCode != 0) {
+                var line = "";
+                while (!process.StandardOutput.EndOfStream)
+                {
+                    line += process.StandardOutput.ReadLine();
+                }
+
+                MessageBox.Show("Uptime Kuma exited unexpectedly. Exit code: " + process.ExitCode + " " + line);
+            }
+
+            trayIcon.Visible = false;
             Application.Exit();
         }
+
     }
 }
 
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
index d62166e4..c3c6aad2 100644
--- a/extra/exe-builder/UptimeKuma.csproj
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -13,7 +13,7 @@
         <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
         <Deterministic>true</Deterministic>
         <ApplicationIcon>..\..\public\favicon.ico</ApplicationIcon>
-        <LangVersion>10</LangVersion>
+        <LangVersion>9</LangVersion>
     </PropertyGroup>
     <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
         <PlatformTarget>AnyCPU</PlatformTarget>
@@ -34,6 +34,9 @@
         <ErrorReport>prompt</ErrorReport>
         <WarningLevel>4</WarningLevel>
     </PropertyGroup>
+    <PropertyGroup>
+      <PostBuildEvent>COPY "$(SolutionDir)bin\Debug\uptime-kuma.exe" "C:\Users\LouisLam\Desktop\uptime-kuma-win64\"</PostBuildEvent>
+    </PropertyGroup>
     <ItemGroup>
         <Reference Include="System" />
         <Reference Include="System.Core" />

From 4f6dec41c617267860ec9c686477e03c633e7c4b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 7 Oct 2022 20:46:43 +0800
Subject: [PATCH 218/803] Fix ntfy username should not be required

---
 src/components/notifications/Ntfy.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/notifications/Ntfy.vue b/src/components/notifications/Ntfy.vue
index ddcc3917..b0f7888a 100644
--- a/src/components/notifications/Ntfy.vue
+++ b/src/components/notifications/Ntfy.vue
@@ -18,7 +18,7 @@
     <div class="mb-3">
         <label for="ntfy-username" class="form-label">{{ $t("Username") }} ({{ $t("Optional") }})</label>
         <div class="input-group mb-3">
-            <input id="ntfy-username" v-model="$parent.notification.ntfyusername" type="text" class="form-control" required>
+            <input id="ntfy-username" v-model="$parent.notification.ntfyusername" type="text" class="form-control">
         </div>
     </div>
     <div class="mb-3">

From 43c1ec640c41e83b0cb7783b1760f7781fab8f4a Mon Sep 17 00:00:00 2001
From: AnnAngela <naganjue@vip.qq.com>
Date: Sat, 8 Oct 2022 01:45:00 +0800
Subject: [PATCH 219/803] feat: :globe_with_meridians: Update zh-cn and en
 translation (#2167)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
---
 src/components/notifications/HomeAssistant.vue |  2 +-
 src/components/notifications/SMSManager.vue    |  2 +-
 src/languages/en.js                            |  6 ++++++
 src/languages/zh-CN.js                         | 14 ++++++++++++++
 4 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/components/notifications/HomeAssistant.vue b/src/components/notifications/HomeAssistant.vue
index 67e370a1..de368095 100644
--- a/src/components/notifications/HomeAssistant.vue
+++ b/src/components/notifications/HomeAssistant.vue
@@ -18,7 +18,7 @@
         <input id="notificationService" v-model="$parent.notification.notificationService" type="text" :placeholder="$t('default: notify all devices')" class="form-control">
 
         <div class="form-text">
-            <p>{{ $t("A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.") }}</p>
+            <p>{{ $t('A list of Notification Services can be found in Home Assistant under "Developer Tools > Services" search for "notification" to find your device/phone name.') }}</p>
             <p>{{ $t("Automations can optionally be triggered in Home Assistant:") }}</p>
             <p>
                 {{ $t("Trigger type:") }} <code>Event</code><br />
diff --git a/src/components/notifications/SMSManager.vue b/src/components/notifications/SMSManager.vue
index 25db624f..1be952ae 100644
--- a/src/components/notifications/SMSManager.vue
+++ b/src/components/notifications/SMSManager.vue
@@ -2,7 +2,7 @@
     <div class="mb-3">
         <label for="smsmanager-key" class="form-label">API Key</label>
         <div class="form-text">
-            {{ $t("SMSManager API Docs ") }}
+            {{ $t("SMSManager API Docs") }}
             <a href="https://smsmanager.cz/api/http#send" target="_blank">{{ $t("here") }}</a>
         </div>
         <input id="smsmanager-key" v-model="$parent.notification.smsmanagerApiKey" type="text" class="form-control">
diff --git a/src/languages/en.js b/src/languages/en.js
index 4bf92e92..e277958b 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -584,4 +584,10 @@ export default {
     backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
     "Optional": "Optional",
     squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "SMSManager API Docs ",
+    "Gateway Type": "Gateway Type",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "You can divide numbers with",
+    "or": "or",
 };
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index a37d4ae4..0d21efda 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -581,4 +581,18 @@ export default {
     "Then choose an action, for example switch the scene to where an RGB light is red.": "然后您可以选择关联操作,例如切换到 RGB 灯发出红光的场景",
     "Frontend Version": "前端版本",
     "Frontend Version do not match backend version!": "前端版本与后端版本不符!",
+    "Base URL": "API 基础地址",
+    goAlertInfo: "GoAlert 是一个用于呼叫调度、自动汇报和通知(如 SMS 或语音呼叫)的开源应用程序。在正确的时间以正确的方式自动让正确的人参与!{0}",
+    goAlertIntegrationKeyInfo: "使用形如 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 的通用 API 集成密钥,通常是复制来的链接中的 token 参数值。",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "已弃用:由于大量新功能的加入,以及备份功能没有时时维护,现在备份功能已经无法生成完整的备份和恢复完整的设置。",
+    backupRecommend: "请改为直接备份 docker 卷或者数据文件夹(./data/)。",
+    Optional: "可选的",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "SMSManager API 文档在",
+    "Gateway Type": "网关类型",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "可用的分隔符:",
+    "or": "或",
 };

From 59e7aa74a3a7c542b06d05b963216c4246a65b06 Mon Sep 17 00:00:00 2001
From: Vasilis The Pikachu <vascreeper@yahoo.com>
Date: Fri, 7 Oct 2022 17:51:45 +0000
Subject: [PATCH 220/803] Remove some double dots & fix backuprecommended

---
 src/languages/el-GR.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/languages/el-GR.js b/src/languages/el-GR.js
index 92a2d775..c520a607 100644
--- a/src/languages/el-GR.js
+++ b/src/languages/el-GR.js
@@ -141,9 +141,9 @@ export default {
     Events: "Γεγονότα",
     Heartbeats: "Παλμοι καρδιας",
     "Auto Get": "Αυτόματη λήψη",
-    backupDescription: "Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας γία ολλες της παρακολούθησης και ειδοποιήσης σε ένα αρχείο JSON..",
+    backupDescription: "Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας γία ολλες της παρακολούθησης και ειδοποιήσης σε ένα αρχείο JSON.",
     backupDescription2: "Σημείωση: δεν περιλαμβάνονται δεδομένα ιστορικού και συμβάντων.",
-    backupDescription3: "Στο αρχείο εξαγωγής περιλαμβάνονται ευαίσθητα δεδομένα, όπως token ειδοποιήσεων. Aποθηκεύστε την εξαγωγή με ασφάλεια..",
+    backupDescription3: "Στο αρχείο εξαγωγής περιλαμβάνονται ευαίσθητα δεδομένα, όπως token ειδοποιήσεων. Aποθηκεύστε την εξαγωγή με ασφάλεια.",
     alertNoFile: "Επιλέξτε ένα αρχείο για εισαγωγή.",
     alertWrongFileType: "Επιλέξτε ένα αρχείο JSON.",
     "Clear all statistics": "Εκκαθάριση όλων των στατιστικών",
@@ -581,5 +581,5 @@ export default {
     goAlertIntegrationKeyInfo: "Λάβετε το generic API integration key για την υπηρεσία σε αυτήν τη μορφή \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" συνήθως την τιμή της παραμέτρου διακριτικού της αντιγραμμένης διεύθυνσης URL.",
     goAlert: "GoAlert",
     backupOutdatedWarning: "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται πολη, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
-    backupRecommend: "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του τόμου ή του φακέλου δεδομένων (./data/) απευθείας.",
+    backupRecommend: "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του volume ή του φακέλου δεδομένων (./data/) απευθείας.",
 };

From df2f5368459cccab1a4713c11aaf3f51273dfc4c Mon Sep 17 00:00:00 2001
From: wellart <wella.design@gmail.com>
Date: Sat, 8 Oct 2022 01:15:03 +0700
Subject: [PATCH 221/803] [id-ID.js] Fix some type and word (#2149)

Co-authored-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/languages/id-ID.js | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index 3d3c3389..f8ee3ab7 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -126,10 +126,10 @@ export default {
     "Resolver Server": "Resolver Server",
     "Resource Record Type": "Resource Record Type",
     "Last Result": "Hasil Terakhir",
-    "Create your admin account": "Buat admin akun Anda",
+    "Create your admin account": "Buat akun admin anda",
     "Repeat Password": "Ulangi Sandi",
     "Import Backup": "Impor Cadangan",
-    "Export Backup": "Expor Cadangan",
+    "Export Backup": "Ekspor Cadangan",
     Export: "Ekspor",
     Import: "Impor",
     respTime: "Tanggapan. Waktu (milidetik)",
@@ -217,7 +217,7 @@ export default {
     smtpBCC: "BCC",
     discord: "Discord",
     "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Anda bisa mendapatkan ini dengan pergi ke Server Settings -> Integrations -> Create Webhook",
+    wayToGetDiscordURL: "Anda bisa mendapatkan ini dengan pergi ke Server Pengaturan -> Integrasi -> Buat Webhook",
     "Bot Display Name": "Nama Bot",
     "Prefix Custom Message": "Awalan Pesan",
     "Hello @everyone is...": "Halo {'@'}everyone is...",
@@ -328,7 +328,7 @@ export default {
     "Pick a RR-Type...": "Pilih RR-Type...",
     "Pick Accepted Status Codes...": "Pilih Kode Status yang Diterima...",
     Default: "Default",
-    "HTTP Options": "HTTP Options",
+    "HTTP Options": "Opsi HTTP",
     "Create Incident": "Buat Incident",
     Title: "Judul",
     Content: "Konten",
@@ -379,8 +379,8 @@ export default {
     smtpDkimheaderFieldNames: "Header Keys untuk ditambahkan (Optional)",
     smtpDkimskipFields: "Header Keys not untuk ditambahkan (Optional)",
     wayToGetPagerDutyKey: "Anda dapat menambahkan melalui Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Lalu Anda dapat menjadi dengan kata kunci \"Events API V2\". Informasi tambahan {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
+    "Integration Key": "Kunci Integrasi",
+    "Integration URL": "URL Integrasi",
     "Auto resolve or acknowledged": "Penyelesaian otomatis atau diakui",
     "do nothing": "tidak melakukan apapun",
     "auto acknowledged": "otomatis diakui",
@@ -402,14 +402,14 @@ export default {
     enableProxyDescription: "Proxy berikut tidak akan berdampak ke monitor hingga diaktifkan. Anda dapat mengontrol menonaktifkan sementara proxy dari semua monitor dengan status aktivasi.",
     setAsDefaultProxyDescription: "Proxy berikut akan diaktifkan sebagai bawaan untuk monitor baru. Anda masih dapat menonaktifkan proxy secara terpisah untuk setiap monitor.",
     "Certificate Chain": "Certificate Chain",
-    Valid: "Sahih",
+    Valid: "Valid",
     Invalid: "Tidak Valid",
     AccessKeyId: "AccessKey ID",
     SecretAccessKey: "AccessKey Secret",
     PhoneNumbers: "Nomor Telepon",
     TemplateCode: "Kode Template",
     SignName: "Nama Tanda",
-    "Sms template must contain parameters: ": "Template SMS harus memuat parameter: ",
+    "Sms template must contain parameters: ": "Template SMS harus berisi parameter: ",
     "Bark Endpoint": "Bark Endpoint",
     "Bark Group": "Bark Group",
     "Bark Sound": "Bark Sound",
@@ -432,7 +432,7 @@ export default {
     User: "Pengguna",
     Installed: "Terpasang",
     "Not installed": "Tidak terpasang",
-    Running: "Berlari",
+    Running: "Berjalan",
     "Not running": "Tidak berjalan",
     "Remove Token": "Hapus Token",
     Start: "Mulai",
@@ -445,7 +445,7 @@ export default {
     "No consecutive dashes": "Tanda hubung tidak berurutan",
     Next: "Selanjutnya",
     "The slug is already taken. Please choose another slug.": "Slug telah digunakan. Silakan pilih slug lain.",
-    "No Proxy": "TIdak ada Proxy",
+    "No Proxy": "Tidak ada Proxy",
     Authentication: "Autentikasi",
     "HTTP Basic Auth": "HTTP Basic Auth",
     "New Status Page": "Halaman Status Baru",
@@ -457,7 +457,7 @@ export default {
     cloudflareWebsite: "Situs Cloudflare",
     "Message:": "Pesan:",
     "Don't know how to get the token? Please read the guide:": "Tidak tahu cara mendapatkan token? Silakan baca panduannya:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Koneksi saat ini mungkin hilang jika Anda saat ini terhubung melalui CloudflareTunnel. Apakah Anda yakin ingin menghentikannya? Ketik kata sandi Anda saat ini untuk mengonfirmasinya.",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Koneksi saat ini mungkin hilang jika Anda saat ini terhubung melalui Cloudflare Tunel. Apakah Anda yakin ingin menghentikannya? Ketik kata sandi Anda saat ini untuk mengonfirmasinya.",
     "HTTP Headers": "HTTP Headers",
     "Trust Proxy": "Proxy Terpercaya",
     "Other Software": "Perangkat Lunak lainnya",
@@ -494,7 +494,7 @@ export default {
     "Certificate Expiry Notification": "Pemberitahuan Kedaluwarsa Sertifikat",
     "API Username": "Nama Pengguna API",
     "API Key": "Kunci API",
-    "Recipient Number": "Nomor Penerima Recipient Number",
+    "Recipient Number": "Nomor Penerima",
     "From Name/Number": "Dari Nama/Nomor",
     "Leave blank to use a shared sender number.": "Biarkan kosong untuk menggunakan nomor pengirim bersama.",
     "Octopush API Version": "Versi API Octopush",
@@ -542,9 +542,9 @@ export default {
     "Go back to the previous page.": "Kembali ke halaman sebelumnya.",
     "Coming Soon": "Segera",
     wayToGetClickSendSMSToken: "Anda bisa mendapatkan Nama Pengguna API dan Kunci API dari {0} .",
-    "Connection String": "Connection String",
+    "Connection String": "String Koneksi",
     Query: "Query",
-    settingsCertificateExpiry: "Kedaluwarsa Sertifikat TLS",
+    settingsCertificateExpiry: "Sertifikat TLS Kadaluarsa",
     certificationExpiryDescription: "Monitor HTTPS memicu pemberitahuan saat sertifikat TLS kedaluwarsa dalam:",
     "Setup Docker Host": "Siapkan Host Docker",
     "Connection Type": "Jenis Koneksi",
@@ -570,9 +570,9 @@ export default {
     "default: notify all devices": "bawaan: notifikasi seluruh perangkat",
     "A listof Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Daftar Layanan Pemberitahuan dapat ditemukan di Home Assistant pada \"Developer Tools > Services\" cari \"notification\" lalu cari nama perangkat Anda.",
     "Automations can optionally be triggered in Home Assistant:": "Otomatisasi dapat dipicu secara opsional di Home Assistant:",
-    "Trigger type:": "Trigger type:",
-    "Event type:": "Event type:",
-    "Event data:": "Event data:",
+    "Trigger type:": "Tipe Trigger/Pemicu:",
+    "Event type:": "Tipe event:",
+    "Event data:": "Data event:",
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Kemudian pilih tindakan, misalnya alihkan ke tempat dimana lampu RGB berwarna merah.",
     "Frontend Version": "Versi Frontend",
     "Frontend Version do not match backend version!": "Versi Frontend tidak sama dengan versi backend!",
@@ -580,6 +580,6 @@ export default {
     goAlertInfo: "GoAlert adalah aplikasi open source untuk penjadwalan panggilan, eskalasi otomatis dan pemberitahuan (seperti SMS atau panggilan suara). Secara otomatis melibatkan orang yang tepat, dengan cara yang benar, dan pada waktu yang tepat! {0}",
     goAlertIntegrationKeyInfo: "Dapatkan kunci integrasi API generik untuk layanan dalam format ini \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biasanya nilai parameter token dari URL yang disalin.",
     goAlert: "GoAlert",
-    backupOutdatedWarning: "Usang: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
+    backupOutdatedWarning: "Tidak digunakan lagi: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
     backupRecommend: "Harap cadangkan volume atau folder data (./data/) secara langsung.",
 };

From f67d7cdf3f3edf66415747bde53c944a600df57d Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sat, 8 Oct 2022 08:01:47 +0100
Subject: [PATCH 222/803] Make update-language-files command more useful
 (#2198)

* [empty commit] pull request for Fix language update script

* Avoid mass changes with update-language-files

This commit updates the update-language-files script to prevent mass
changes as seen on a number of recent PRs where the contributer has
ran the script and comitted the results.
The script has been updated to now require the --language argument to
specify which language file to update. This ensures that only that file
is updated instead of all files. If the provided language code does not
already exist, a new file with that code is created. This should make
it easier to add new languages as you only need to pass the language
code to the script.
The base lang code is now also passed as an optional argument to negate
the need for a seperate script entry in package.json.
The script has been restructures into a couple of functions to make it
easier to understand.
ESlint now only checks the changed file instead of
them all in order to improve performance.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>

* Updated translation docs for new command

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>

* [update-language-files] Add cross-env-shell

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
---
 extra/update-language-files/index.js | 77 ++++++++++++++++------------
 package.json                         |  3 +-
 src/languages/README.md              | 13 +++--
 3 files changed, 52 insertions(+), 41 deletions(-)

diff --git a/extra/update-language-files/index.js b/extra/update-language-files/index.js
index e449fe34..078c4e6f 100644
--- a/extra/update-language-files/index.js
+++ b/extra/update-language-files/index.js
@@ -1,51 +1,45 @@
 // Need to use ES6 to read language files
 
 import fs from "fs";
-import path from "path";
 import util from "util";
 import rmSync from "../fs-rmSync.js";
 
-// https://stackoverflow.com/questions/13786160/copy-folder-recursively-in-node-js
 /**
- * Look ma, it's cp -R.
- * @param {string} src  The path to the thing to copy.
- * @param {string} dest The path to the new copy.
+ * Copy across the required language files
+ * Creates a local directory (./languages) and copies the required files
+ * into it.
+ * @param {string} langCode Code of language to update. A file will be
+ * created with this code if one does not already exist
+ * @param {string} baseLang The second base language file to copy. This
+ * will be ignored if set to "en" as en.js is copied by default
  */
-const copyRecursiveSync = function (src, dest) {
-    let exists = fs.existsSync(src);
-    let stats = exists && fs.statSync(src);
-    let isDirectory = exists && stats.isDirectory();
+function copyFiles(langCode, baseLang) {
+    if (fs.existsSync("./languages")) {
+        rmSync("./languages", { recursive: true });
+    }
+    fs.mkdirSync("./languages");
 
-    if (isDirectory) {
-        fs.mkdirSync(dest);
-        fs.readdirSync(src).forEach(function (childItemName) {
-            copyRecursiveSync(path.join(src, childItemName),
-                path.join(dest, childItemName));
-        });
+    if (!fs.existsSync(`../../src/languages/${langCode}.js`)) {
+        fs.closeSync(fs.openSync(`./languages/${langCode}.js`, "a"));
     } else {
-        fs.copyFileSync(src, dest);
+        fs.copyFileSync(`../../src/languages/${langCode}.js`, `./languages/${langCode}.js`);
+    }
+    fs.copyFileSync("../../src/languages/en.js", "./languages/en.js");
+    if (baseLang !== "en") {
+        fs.copyFileSync(`../../src/languages/${baseLang}.js`, `./languages/${baseLang}.js`);
     }
-};
-
-console.log("Arguments:", process.argv);
-const baseLangCode = process.argv[2] || "en";
-console.log("Base Lang: " + baseLangCode);
-if (fs.existsSync("./languages")) {
-    rmSync("./languages", { recursive: true });
 }
-copyRecursiveSync("../../src/languages", "./languages");
 
-const en = (await import("./languages/en.js")).default;
-const baseLang = (await import(`./languages/${baseLangCode}.js`)).default;
-const files = fs.readdirSync("./languages");
-console.log("Files:", files);
-
-for (const file of files) {
-    if (! file.endsWith(".js")) {
-        console.log("Skipping " + file);
-        continue;
-    }
+/**
+ * Update the specified language file
+ * @param {string} langCode Language code to update
+ * @param {string} baseLang Second language to copy keys from
+ */
+async function updateLanguage(langCode, baseLangCode) {
+    const en = (await import("./languages/en.js")).default;
+    const baseLang = (await import(`./languages/${baseLangCode}.js`)).default;
 
+    let file = langCode + ".js";
     console.log("Processing " + file);
     const lang = await import("./languages/" + file);
 
@@ -83,5 +77,20 @@ for (const file of files) {
     fs.writeFileSync(`../../src/languages/${file}`, code);
 }
 
+// Get command line arguments
+const baseLangCode = process.env.npm_config_baselang || "en";
+const langCode = process.env.npm_config_language;
+
+// We need the file to edit
+if (langCode == null) {
+    throw new Error("Argument --language=<code> must be provided");
+}
+
+console.log("Base Lang: " + baseLangCode);
+console.log("Updating: " + langCode);
+
+copyFiles(langCode, baseLangCode);
+await updateLanguage(langCode, baseLangCode);
 rmSync("./languages", { recursive: true });
+
 console.log("Done. Fixing formatting by ESLint...");
diff --git a/package.json b/package.json
index d478a1d2..f5f78f3a 100644
--- a/package.json
+++ b/package.json
@@ -51,8 +51,7 @@
         "test-nodejs16": "docker build --progress plain -f test/ubuntu-nodejs16.dockerfile .",
         "simple-dns-server": "node extra/simple-dns-server.js",
         "simple-mqtt-server": "node extra/simple-mqtt-server.js",
-        "update-language-files-with-base-lang": "cd extra/update-language-files && node index.js %npm_config_base_lang% && eslint ../../src/languages/**.js --fix",
-        "update-language-files": "cd extra/update-language-files && node index.js && eslint ../../src/languages/**.js --fix",
+        "update-language-files": "cd extra/update-language-files && node index.js && cross-env-shell eslint ../../src/languages/$npm_config_language.js --fix",
         "ncu-patch": "npm-check-updates -u -t patch",
         "release-final": "node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js",
         "release-beta": "node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta .  --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts",
diff --git a/src/languages/README.md b/src/languages/README.md
index d505476a..eddd6102 100644
--- a/src/languages/README.md
+++ b/src/languages/README.md
@@ -1,10 +1,13 @@
 # How to translate
 
 1. Fork this repo.
-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. Run `npm run update-language-files`. You can also use this command to check if there are new strings to translate for your language.
-4. Your language file should be filled in. You can translate now.
-5. Add it into `languageList` constant.
-6. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
+2. Run `npm run update-language-files --language=<code>` where `<code>`
+   is a valid ISO language code:
+   http://www.lingoes.net/en/translator/langcode.htm. You can also use
+   this command to check if there are new strings to
+   translate for your language.
+3. Your language file should be filled in. You can translate now.
+4. Add it into `languageList` constant.
+5. 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 [the issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏

From 3eaccb560ed1a0590a6bb3bf7f73765bbe06db00 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 8 Oct 2022 16:23:11 +0800
Subject: [PATCH 223/803] Implement Download Logic

---
 extra/exe-builder/DownloadForm.Designer.cs |  84 +++++
 extra/exe-builder/DownloadForm.cs          |  65 ++++
 extra/exe-builder/DownloadForm.resx        | 377 +++++++++++++++++++++
 extra/exe-builder/Program.cs               |  23 +-
 extra/exe-builder/UptimeKuma.csproj        |   9 +
 5 files changed, 554 insertions(+), 4 deletions(-)
 create mode 100644 extra/exe-builder/DownloadForm.Designer.cs
 create mode 100644 extra/exe-builder/DownloadForm.cs
 create mode 100644 extra/exe-builder/DownloadForm.resx

diff --git a/extra/exe-builder/DownloadForm.Designer.cs b/extra/exe-builder/DownloadForm.Designer.cs
new file mode 100644
index 00000000..26a474e9
--- /dev/null
+++ b/extra/exe-builder/DownloadForm.Designer.cs
@@ -0,0 +1,84 @@
+using System.ComponentModel;
+
+namespace UptimeKuma {
+    partial class DownloadForm {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing) {
+            if (disposing && (components != null)) {
+                components.Dispose();
+            }
+
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent() {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DownloadForm));
+            this.progressBar = new System.Windows.Forms.ProgressBar();
+            this.label = new System.Windows.Forms.Label();
+            this.labelData = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // progressBar
+            // 
+            this.progressBar.Location = new System.Drawing.Point(12, 12);
+            this.progressBar.Name = "progressBar";
+            this.progressBar.Size = new System.Drawing.Size(472, 41);
+            this.progressBar.TabIndex = 0;
+            // 
+            // label
+            // 
+            this.label.Location = new System.Drawing.Point(12, 59);
+            this.label.Name = "label";
+            this.label.Size = new System.Drawing.Size(472, 23);
+            this.label.TabIndex = 1;
+            this.label.Text = "Preparing...";
+            // 
+            // labelData
+            // 
+            this.labelData.Location = new System.Drawing.Point(12, 82);
+            this.labelData.Name = "labelData";
+            this.labelData.Size = new System.Drawing.Size(472, 23);
+            this.labelData.TabIndex = 2;
+            // 
+            // DownloadForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(496, 117);
+            this.Controls.Add(this.labelData);
+            this.Controls.Add(this.label);
+            this.Controls.Add(this.progressBar);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.MaximizeBox = false;
+            this.Name = "DownloadForm";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "Uptime Kuma";
+            this.Load += new System.EventHandler(this.DownloadForm_Load);
+            this.ResumeLayout(false);
+        }
+
+        private System.Windows.Forms.Label labelData;
+
+        private System.Windows.Forms.Label label;
+
+        private System.Windows.Forms.ProgressBar progressBar;
+
+        #endregion
+    }
+}
+
diff --git a/extra/exe-builder/DownloadForm.cs b/extra/exe-builder/DownloadForm.cs
new file mode 100644
index 00000000..9c740e31
--- /dev/null
+++ b/extra/exe-builder/DownloadForm.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Net;
+using System.Windows.Forms;
+
+namespace UptimeKuma {
+    public partial class DownloadForm : Form {
+        private readonly Queue<DownloadItem> downloadQueue = new();
+        private readonly WebClient webClient = new();
+
+        public DownloadForm() {
+            InitializeComponent();
+        }
+
+        private void DownloadForm_Load(object sender, EventArgs e) {
+            webClient.DownloadProgressChanged += DownloadProgressChanged;
+            webClient.DownloadFileCompleted += DownloadFileCompleted;
+
+            if (!File.Exists("node")) {
+                downloadQueue.Enqueue(new DownloadItem {
+                    URL = "https://nodejs.org/dist/v16.17.1/node-v16.17.1-win-x64.zip",
+                    Filename = "node.zip"
+                });
+            }
+
+            if (!File.Exists("node")) {
+                downloadQueue.Enqueue(new DownloadItem {
+                    URL = "https://github.com/louislam/uptime-kuma/archive/refs/tags/1.18.3.zip",
+                    Filename = "core.zip"
+                });
+            }
+
+            DownloadNextFile();
+        }
+
+        void DownloadNextFile() {
+            if (downloadQueue.Count > 0) {
+                var item = downloadQueue.Dequeue();
+                label.Text = item.URL;
+                webClient.DownloadFileAsync(new Uri(item.URL), item.Filename);
+            } else {
+                // TODO: Finished, extract?
+            }
+        }
+
+        void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
+            progressBar.Value = e.ProgressPercentage;
+            var total = e.TotalBytesToReceive / 1024;
+            var current = e.BytesReceived / 1024;
+            labelData.Text = $"{current}KB/{total}KB";
+        }
+
+        void DownloadFileCompleted(object sender, AsyncCompletedEventArgs  e) {
+            DownloadNextFile();
+        }
+    }
+
+    public class DownloadItem {
+        public string URL { get; set; }
+        public string Filename { get; set; }
+    }
+}
+
diff --git a/extra/exe-builder/DownloadForm.resx b/extra/exe-builder/DownloadForm.resx
new file mode 100644
index 00000000..e87e0c0d
--- /dev/null
+++ b/extra/exe-builder/DownloadForm.resx
@@ -0,0 +1,377 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA
+        AABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////BPT09Bfu7u4e8fHxJPPz8yv19fUy9fX1M/Pz8yvx8fEk9vb2HPPz8xXMzMwFAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+        /wHv7+8f7u7uPPPz81Tx8fFs8fHxgPHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGB8fHxcfHx8V3x8fFI9PT0MOvr6w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADy8vIU8fHxS/Dw8Hbx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fFr9PT0R/Dw8CIAAAABAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA8vLyFPHx8Vnx8fGB8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fFs9fX1Mb+/vwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAICAgALy8vI88fHxfvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvLy8nby8vI8gICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAzMzMBfHx8Vrx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8vLyYf///wwAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwF8vLyYPHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8W/z8/MWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv7+9R8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLw8PB26urqDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLy8ijx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgu7w7Ifj79ud2u7PtNLrw83P677dzeu85c3r
+        u+rM67rwzOu68c7rverQ68Dj0uvD3NbuyM3b7c+64u7apujv5ZPx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxXgAAAAEAAAAAAAAAAAAAAAAAAAAA4+PjCfDw
+        8Hfx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLd7tSmzeu92MbqsvvG6bH/xumy/8fq
+        s//H6rP/yOq0/8jqtf/J6rb/yeq2/8rrt//K67j/y+u4/8vruf/M67r/zOu7/83ru//Q7MDx1u7Kz9/t
+        163s8OuJ8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgu/v7y8AAAAAAAAAAAAA
+        AAAAAAAA7u7uPfHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC5PDdl8jqtuTE6a7/xOmv/8Xp
+        sP/G6bH/xumx/8bpsv/H6rP/x+qz/8jqtP/I6rX/yeq2/8nqtv/K67f/yuu4/8vruP/L67n/zOu6/8zr
+        u//N67v/zey8/87svf/P67742e3Mx+jv5ZLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvDw
+        8HWAgIACAAAAAAAAAACqqqoD8vLyc/Hx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLf7degxOiu+cPo
+        rf/D6a7/xOmu/8Xpr//F6bD/xumx/8bpsf/G6bL/x+qz/8fqs//I6rT/yOq1/8nqtv/J6rb/yuu3/8rr
+        uP/L67j/y+u5/8zruv/M67v/zeu7/83svP/O7L3/zuy9/87svfzc7tK28fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fEkAAAAAAAAAADz8/Mq8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgunv
+        5o3D6a/0wuis/8Lorf/D6K3/xOmu/8Tprv/F6a//xemw/8bpsf/G6bH/xumy/8fqs//H6rP/yOq0/8jq
+        tf/J6rb/yeq2/8rrt//K67j/y+u4/8vruf/M67r/zOu7/83ru//N7Lz/zuy9/87svf/O7L3/3e/TtPHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLy8vJNAAAAAAAAAADy8vJM8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgszqutDB6Kv/weir/8LorP/D6K3/w+it/8Tprv/E6a7/xemv/8XpsP/G6bH/xumx/8bp
+        sv/H6rP/x+qz/8jqtP/I6rX/yeq2/8nqtv/K67f/yuu4/8vruP/L67n/zOu6/8zru//N67v/zey8/87s
+        vf/O7L3/zuy++u3w6Yzx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLy8vJ1AAAAAAAAAADx8fFr8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC6O/kjsDoqvzA6Kr/weir/8Loq//C6Kz/w+it/8Porf/E6a7/xOmu/8Xp
+        r//F6bD/xumx/8bpsf/G6bL/x+qz/8fqtP/I6rT/yOq1/8nqtv/J6rb/yuu3/8rruP/L67n/y+u5/8zr
+        uv/M67v/zeu7/83svP/O7L3/zuy9/93u07Xx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC////Bv//
+        /wfx8fGB8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC1ezJsr/nqf/A56n/weiq/8Hoq//C6Kv/wuis/8Po
+        rf/D6K3/xOmu/8Pprv+856T/uOed/7bmmv+05Zf/teWZ/7jnnf+86KP/wOio/8fqs//J6rb/yeq2/8rr
+        t//K67j/y+u5/8vruf/M67r/zOu7/83ru//N7Lz/zuy9/9buyNLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8vLyE/Ly8hPx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCy+q6zr/nqP/A56n/wOep/8Ho
+        qv/B6Kv/wuir/8LorP+u5Y//neF2/5bgav+V4Gr/luBr/5fhbP+Y4W7/meFv/5rhcf+b4nL/nOJ0/53i
+        dv+j5H//reaM/7nnnf/E6q//y+y4/8vruf/L67n/zOu6/8zru//N67v/zey8/9Lsxd/x8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC7+/vIPb29hzx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCx+m03L/n
+        qP+/56j/wOep/8Dnqf/B6Kr/weir/7nmn/+R32T/kt9l/5PfZ/+U4Gj/leBq/5bga/+X4W3/mOFu/5nh
+        b/+a4XH/m+Jy/5zidP+d4nX/nuN3/5/jeP+f4nn/weqq/8rruP/L67n/y+u5/8zruv/M67v/zeu7/9Ls
+        w+Lx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8PDwI/Hx8SXx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGCxeix5L/nqP+/56j/v+eo/8Dnqf/A56n/weiq/7Pllv+Q3mP/kd9k/5LfZf+T32f/lOBo/5Xg
+        av+W4Gv/l+Ft/5jhbv+Z4W//muFx/5vicv+c4nT/neJ1/57jd/+f43j/xOmu/8rrt//K67j/y+u5/8vr
+        uf/M67r/zOu7/9Tsxtfx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC9PT0GO/v7yDx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGCx+m037/nqP+/56j/v+eo/7/nqP/A56n/wOip/7TmmP+P3mH/kN5j/5Hf
+        ZP+S32b/k99n/5TgaP+V4Gr/luBr/5fhbf+Y4W7/meFw/5rhcf+b4nL/nOJ0/53idf+h5Hz/yuu2/8nq
+        t//K67f/yuu4/8vruf/L67n/zOu6/9ftysrx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC7e3tDvT0
+        9Bfx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCyOq117/nqP+/56j/v+eo/7/nqP+/56j/wOep/7vn
+        of+O3mD/j95h/5DeY/+R32T/kt9m/5PfZ/+U4Gj/leBq/5bga/+X4W3/mOFu/5nhcP+a4nH/m+Jy/5zi
+        dP+r5Yr/yOq1/8nqtv/J6rf/yuu3/8rruP/L67n/y+u5/9zu1LHx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLz8/OA////A+7u7g/x8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCz+q+xb/nqP+/56j/v+eo/7/n
+        qP+/56j/v+eo/8Dnqf+S4Gb/jt5g/4/eYf+Q3mP/kd9k/5LfZv+T32f/lOBo/5Xgav+W4Gv/l+Ft/5jh
+        bv+Z4XD/muJx/5vic/+4553/yOq0/8jqtf/J6rb/yeq3/8rrt//K67j/y+u5/+bw4Zfx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fFrAAAAAP///wHz8/N88fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC1+zMrr/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+f4Xn/jd5f/47eYP+P3mH/kN5j/5HfZP+S32b/k99n/5Tg
+        af+V4Gr/luBr/5fhbf+Y4W7/meFw/5vic//F6rD/x+q0/8jqtP/I6rX/yeq2/8nqt//K67f/zOu88u/x
+        74Px8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLv7+9QAAAAAAAAAADw8PBm8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC5e7gk7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+u5I//jN1d/43eX/+O3mD/j95h/5De
+        Y/+R32T/kt9m/5PfZ/+U4Gn/leBq/5bga/+X4W3/mOFu/6rliP/G6rL/x+qz/8fqtP/I6rT/yOq1/8nq
+        tv/J6rf/1OzGy/Hx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YL19fUzAAAAAAAAAADy8vJO8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgsPoru2/56j/v+eo/7/nqP+/56j/v+eo/7/nqP++6Kf/j95i/4zd
+        Xf+N3l//jt5g/4/eYv+Q3mP/kd9k/5LfZv+T32f/lOBp/5Xgav+W4Gz/l+Ft/7voov/G6bL/xuqy/8fq
+        s//H6rT/yOq1/8jqtf/J6rb/4e/Zo/Hx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLw8PARAAAAAAAA
+        AADu7u4u8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgszpvMm/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/q+SL/4vdXP+M3V3/jd5f/47eYP+P3mL/kN9j/5HfZP+S32b/k99n/5Tgaf+V4Gr/qOOH/8Xp
+        sP/G6bH/xumy/8bqsv/H6rP/x+q0/8jqtf/K67jy8PHwhPHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8WoAAAAAAAAAAAAAAADo6OgL8fHxgfHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxguDv2J2/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/6Xjgv+L3Vz/jN1d/43eX/+O3mD/j95i/5DfY/+R32T/kt9m/5Pf
+        Z/+k44D/xOmu/8XpsP/F6bD/xumx/8bpsv/G6rL/x+qz/8fqtP/W7cnB8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvPz80AAAAAAAAAAAAAAAAAAAAAA8PDwZ/Hx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLD6K/rv+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+u5I//kt5n/4zdXf+N3l//jt5g/4/e
+        Yv+Q32P/luFs/67kj//D6K3/xOmu/8Tpr//F6bD/xemw/8bpsf/G6bL/xuqy/8fqtP7o7+WR8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvPz8xYAAAAAAAAAAAAAAAAAAAAA8vLyPPHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLV7ci0v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/wOio/7Xl
+        mv+u5I7/rOSM/67kj/+35pz/wumr/8Lorf/D6K3/w+it/8Tprv/E6a//xemw/8XpsP/G6bH/xumy/9Ds
+        wNPx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8vLyZQAAAAAAAAAAAAAAAAAAAAAAAAAA////DPHx
+        8YDx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGCx+m03L/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/wOep/8Doqv/B6Kr/weir/8LorP/C6K3/w+it/8Porv/E6a7/xOmv/8Xp
+        sP/F6bD/yOq18uvw6Yvx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC7+/vMQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAPHx8Vzx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC6O/ij8LorPG/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/8Dnqf/A6Kr/weiq/8Hoq//C6Kz/wuit/8Po
+        rf/D6K7/xOmu/8Tpr//F6bH74u/anvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLw8PB6////BQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPz8yrx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxguHu
+        2pnB56v2v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP/A56n/wOiq/8Ho
+        q//B6Kv/wuis/8Lorf/D6K3/w+mu/8Tprv3b7dKq8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fFJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHy8vJf8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLi7tyXwumt8L/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/wOep/8Doqv/B6Kv/weir/8LorP/C6K3/xOiv+d7u1aTx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvLy8nb///8KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv7+8Q8/Pze/Hx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC6/Dpiszqu82/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/8Dnqf/A6Kr/weir/8Hoq//H6bTj5e7elfHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvPz8yoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA9fX1MvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLe7tShx+mz3r/n
+        qP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/v+eo/7/nqP/A56n/xumy5drtz6rv8e+D8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8vLyTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHx8Unx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgubv45DU68e2y+q6z8XoseTD6a7uweir9MPpru7F6bHly+q50tLsxLrl796U8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLy8vJh////AwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wHx8fFZ8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8Wzf398IAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8D8/PzVfHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8PDwZujo
+        6AsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////AfHx8Ujx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fFa////BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/Mp8vLydvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8/PzfPHx8TcAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CvLy8lDz8/N/8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvPz84Hx8fFa8PDwEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADw8PAR8vLyTvHx8X3x8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fF/8/PzVvT09BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wXz8/Mq8/PzU/Hx8XDx8fGB8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLy8vJz8fHxWO/v7y////8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8G7e3tHfLy
+        8ifu7u4u8PDwNPT09C/y8vIo7+/vH+Pj4wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP///////wAA////////AAD///////8AAP//gAf//wAA//gAAD//AAD/wAAAB/8AAP+A
+        AAAB/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAPAADwAAAAAAcAAOAAAAAABwAA4AAAAAAD
+        AADAAAAAAAMAAMAAAAAAAwAAwAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAA
+        AAAAAQAAgAAAAAABAACAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAABwAAwAAAAAAH
+        AADgAAAAAAcAAOAAAAAADwAA4AAAAAAPAADwAAAAAB8AAPAAAAAAHwAA+AAAAAA/AAD8AAAAAD8AAPwA
+        AAAAfwAA/gAAAAD/AAD/AAAAAf8AAP+AAAAD/wAA/8AAAAf/AAD/8AAAH/8AAP/8AAA//wAA//8AAf//
+        AAD//+AP//8AAP///////wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAgICAAu/v7xD09PQX7u7uHvDw8CP29vYb8vLyFOrq6gwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA
+        gALy8vIm7+/vT/Pz82fz8/N98fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvDw8Hrw8PBm7+/vUPT0
+        9C3o6OgLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOPj
+        4wnz8/NC8vLydPHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YHy8vJj8/PzKoCAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADx8fEl8vLydfHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxcfHx8SUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA9PT0LfHx8YDx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8/PzgPLy8j0AAAABAAAAAAAA
+        AAAAAAAAAAAAAO3t7Rzx8fGA8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLr8OmM5O7emeTv
+        3Z7h79mj5fDem+nv45Tu8u6H8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvLy
+        8joAAAAAAAAAAAAAAAD///8E8fHxbvHx8YLx8fGC8fHxgvHx8YLx8fGC7vDshtns0K7N67zayeq288fq
+        s//I6rT/yOq1/8nqtv/K67f/y+u4/8vruf/P7L7w0+zF29vv0Lrn8OKX8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8/PzfvPz8xUAAAAAAAAAAPX19TLx8fGC8fHxgvHx8YLx8fGC8fHxgt3u1KXF6rHzxOmv/8Xp
+        sP/G6bH/xumy/8fqs//I6rT/yOq1/8nqtv/K67f/y+u4/8vruf/M67v/zey8/87svf/S7MPj4u7Zp/Hx
+        8YLx8fGC8fHxgvHx8YLx8fGC8/PzVQAAAAAAAAAA8fHxavHx8YLx8fGC8fHxgvHx8YLf7defwuis/cPo
+        rf/E6a7/xOmv/8XpsP/G6bH/xumy/8fqs//I6rT/yOq1/8nqtv/K67f/y+u4/8vruv/M67v/zey8/87s
+        vf/N67z/3e7SufHx8YLx8fGC8fHxgvHx8YLz8/N8////Bf///w3x8fGC8fHxgvHx8YLx8fGC8fHxgsXp
+        sOnB6Kv/wuis/8Porf/E6a7/xOmv/8XpsP/G6bH/xumy/8fqs//I6rT/yOq1/8nqtv/K67f/y+u4/8vr
+        uv/M67v/zey8/87svf/O67z96/Hoj/Hx8YLx8fGC8fHxgvHx8YLy8vIm8/PzK/Hx8YLx8fGC8fHxgvHx
+        8YLg79icwOep/8Hoqv/B6Kv/wuis/8Porf/E6a7/wuit/73opP+76KL/u+eh/77opv/D6a3/yeu1/8nq
+        tv/K67f/y+u5/8zruv/M67v/zey8/87svf/d7tSz8fHxgvHx8YLx8fGC8fHxgvHx8Tby8vI68fHxgvHx
+        8YLx8fGC8fHxgtTrxre/56j/wOep/8Hoqv/B6Kv/uOad/53idv+V4Gn/leBq/5fhbP+Y4W//muFx/5vi
+        c/+e4Xb/puWD/7PmlP/D6a3/y+u5/8zruv/M67v/zey8/9rtzsHx8fGC8fHxgvHx8YLx8fGC8/PzQfPz
+        80Lx8fGC8fHxgvHx8YLx8fGC0OvAwr/nqP+/56j/wOep/8Hoqv+o44b/kd9k/5LfZv+U4Gj/leBq/5fh
+        bf+Y4W//muFx/5vic/+d4nX/n+N3/7fnm//K67j/y+u5/8zruv/M67v/2u3QvPHx8YLx8fGC8fHxgvHx
+        8YLy8vI98/PzP/Hx8YLx8fGC8fHxgvHx8YLQ6sK/v+eo/7/nqP+/56j/wOep/6jjhv+P3mL/kd9k/5Lf
+        Zv+U4Gj/leBr/5fhbf+Y4W//muFx/5zic/+d4nX/v+mm/8nqt//K67j/y+u5/8zruv/f79au8fHxgvHx
+        8YLx8fGC8fHxgvX19TLx8fE38fHxgvHx8YLx8fGC8fHxgtTrybO/56j/v+eo/7/nqP+/56j/sOSS/47e
+        YP+P3mL/kd9k/5LfZv+U4Gj/leBr/5fhbf+Z4W//muJx/5/jd//H6bP/yeq2/8nqt//K67j/y+u5/+nv
+        45Tx8fGC8fHxgvHx8YLx8fGC7+/vIPHx8SXx8fGC8fHxgvHx8YLx8fGC4e/Zm7/nqP+/56j/v+eo/7/n
+        qP+956X/jt5h/47eYP+P3mL/kd9k/5LfZv+U4Gn/luBr/5fhbf+Z4W//q+aK/8fqs//I6rT/yeq2/8nq
+        t//N7Lvw8fHxgvHx8YLx8fGC8fHxgvPz84D///8G6+vrDfHx8YLx8fGC8fHxgvHx8YLv8e+Dweis87/n
+        qP+/56j/v+eo/7/nqP+d4XX/jN1e/47eYP+P3mL/kd9k/5PfZ/+U4Gn/luBr/5fhbf+86KP/xuqy/8fq
+        s//I6rX/yeq2/9Tsx8nx8fGC8fHxgvHx8YLx8fGC8PDwaAAAAAAAAAAA8fHxbPHx8YLx8fGC8fHxgvHx
+        8YLM6rrMv+eo/7/nqP+/56j/v+eo/7blmv+N3V//jN1e/47eYP+Q3mL/kd9k/5PfZ/+U4Gn/qeSH/8Xp
+        sP/G6bH/xuqy/8fqs//I6rX/5fDem/Hx8YLx8fGC8fHxgvHx8YLz8/M/AAAAAAAAAADz8/NB8fHxgvHx
+        8YLx8fGC8fHxgt3s06O/56j/v+eo/7/nqP+/56j/v+eo/7Xmmf+U32n/jN1e/47eYP+Q3mL/k99o/6zk
+        i//D6a7/xemv/8XpsP/G6bH/xuqy/8vqu+jx8fGC8fHxgvHx8YLx8fGC8fHxgvPz8xUAAAAAAAAAAPT0
+        9Bfx8fGC8fHxgvHx8YLx8fGC8fHvg8Tpsee/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+35pz/suWV/7Xm
+        mf/A6Kj/wuit/8Porf/E6a7/xemv/8XpsP/G6bH/3e3UqvHx8YLx8fGC8fHxgvHx8YLw8PBmAAAAAAAA
+        AAAAAAAAAAAAAPHx8W7x8fGC8fHxgvHx8YLx8fGC4u7cmMHnqvm/56j/v+eo/7/nqP+/56j/v+eo/7/n
+        qP+/56j/wOep/8Hoqv/C6Kz/wuit/8Porf/E6a7/xemv/9Hrwszx8fGC8fHxgvHx8YLx8fGC8fHxgvX1
+        9TEAAAAAAAAAAAAAAAAAAAAA7u7uO/Hx8YLx8fGC8fHxgvHx8YLx8fGC3e7SpMHoqfq/56j/v+eo/7/n
+        qP+/56j/v+eo/7/nqP+/56j/wOip/8Hoq//C6Kz/wuit/8Porf/O67zV8PHwhPHx8YLx8fGC8fHxgvHx
+        8YLy8vJ2////BQAAAAAAAAAAAAAAAAAAAACqqqoD8PDwafHx8YLx8fGC8fHxgvHx8YLx8fGC4O/YnMTo
+        ruy/56j/v+eo/7/nqP+/56j/v+eo/7/nqP+/56j/wOip/8Hoq//C6Kz90uvEwe/x74Px8fGC8fHxgvHx
+        8YLx8fGC8fHxgvPz8ykAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/MW8fHxfPHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8PLuhdXtyLXF6bHlv+eo/7/nqP+/56j/v+eo/7/nqP/B6Kv0zeq8zOXv4JTx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLy8vJNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy8vIm8fHxgPHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLs8OmJ4e/Zm93u06Pf7def5+/hkvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxXf///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADy8vIo8/PzffHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8VnMzMwFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAD29vYb8fHxbvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvPz83/v7+9BgICAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwF8/PzQPLy8nnx8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgvPz84Hx8fFc9PT0GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////B/X19TLx8fFc8PDwevHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8fHxgPHx8Wv09PRE9PT0FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA7+/vEPb29hvw8PAj7+/vH/T09Be/v78EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////8B///wAA//wAAD/wAAAP4AAAB+AA
+        AAfAAAADwAAAA4AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAADwAAAA8AAAAPAAAAH4AAAB+AA
+        AA/wAAAP+AAAH/gAAD/+AAB//wAB///AA///+B////////////8oAAAAEAAAACAAAAABACAAAAAAAAAE
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CfDw8BH///8GAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAu7u7i7x8fFe8PDwevHx8YLx8fGC8fHxgvDw
+        8Hvx8fFs7+/vT/Dw8CMAAAABAAAAAAAAAAAAAAAA5ubmCvLy8l/x8fGC8fHxgvHx8YLx8fGC8fHxgvHx
+        8YLx8fGC8fHxgvHx8YLx8fGC8/PzZu7u7g8AAAAAAAAAAPHx8V3x8fGC8fHxgunv5o7Z7c200+vFytTs
+        xc7W7cnH2+7QueLu2qbu8OyH8fHxgvHx8YLx8fFu////BfHx8STx8fGC8fHxgtrtzq3D6a/8xemw/8bp
+        sv/I6rT/yeq2/8vruP/M67v/z+u++Nzu0bjx8fGC8fHxgu/v7zDx8fFI8fHxguzw6ojC56z3wuis/8Tp
+        rv/E6q3/weiq/8fqsv/J6rb/y+u5/8zru//N67z/6/HpjfHx8YLy8vJN8fHxXPHx8YLg79icv+eo/8Ho
+        qv+k4n//lOBo/5fhbf+a4XH/n+J5/7Pmlv/L67n/zOu7/+Xw353x8fGC8fHxXvHx8Vrx8fGC4O3Zm7/n
+        qP+/56j/nuF3/5HfZP+U4Gj/l+Ft/5ricf+x5pL/yeq3/8vruf/r8emN8fHxgu/v70/x8fFK8fHxguzw
+        6ojA6Kn8v+eo/6njiP+O3mD/kd9k/5Tgaf+X4W3/vuim/8jqtP/N67zr8fHxgvHx8YLy8vI68/PzK/Hx
+        8YLx8fGCx+m03L/nqP++6Kb/meBw/47eYP+S32X/q+SL/8XpsP/G6rL/1+zLvvHx8YLz8/OB8PDwEdXV
+        1Qbx8fF98fHxgt/t1Z/A56j9v+eo/7/nqP+656H/vuim/8Lorf/E6a7/yOq18Ovw6Yvx8fGC8vLyYwAA
+        AAAAAAAA8fHxR/Hx8YLx8fGC2O3NrMDnqfq/56j/v+eo/7/nqP/B6Kv/xumy7OTu3Zfx8fGC8/PzgfLy
+        8icAAAAAAAAAAP///wPz8/Nm8fHxgvHx8YLo7+SO0+zFuczquszM6bzJ1+zMru7w7Ibx8fGC8fHxgvHx
+        8UcAAAAAAAAAAAAAAAAAAAAA4+PjCfHx8Vzx8fGC8fHxgvHx8YLx8fGC8fHxgvHx8YLx8fGC8fHxgfPz
+        80D///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8/PzK/Ly8mDz8/N+8fHxgvHx8YLy8vJ68vLyUezs
+        7BsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAevr6w3j4+MJAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD8fwAA4AcAAMADAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
+        AADAAwAAwAMAAOAHAADwDwAA/n8AAP//AAA=
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 84ecda31..84aa6e45 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Drawing;
+using System.IO;
 using System.Linq;
 using System.Reflection;
 using System.Runtime.InteropServices;
@@ -42,9 +43,23 @@ namespace UptimeKuma {
             });
 
             trayIcon.MouseDoubleClick += new MouseEventHandler(Open);
-
             trayIcon.Visible = true;
 
+            if (File.Exists("core") && File.Exists("node")) {
+                // Go go go
+                StartProcess();
+            } else {
+                DownloadFiles();
+            }
+        }
+
+        void DownloadFiles() {
+            var form = new DownloadForm();
+            form.Closed += Exit;
+            form.Show();
+        }
+
+        void StartProcess() {
             var startInfo = new ProcessStartInfo {
                 FileName = "node/node.exe",
                 Arguments = "server/server.js --data-dir=\"../data/\"",
@@ -58,8 +73,7 @@ namespace UptimeKuma {
             process = new Process();
             process.StartInfo = startInfo;
             process.EnableRaisingEvents = true;
-            process.Exited += new EventHandler(ProcessExited);
-
+            process.Exited += ProcessExited;
 
             try {
                 process.Start();
@@ -96,7 +110,8 @@ namespace UptimeKuma {
         {
             // Hide tray icon, otherwise it will remain shown until user mouses over it
             trayIcon.Visible = false;
-            process.Kill();
+            process?.Kill();
+            Application.Exit();
         }
 
         void ProcessExited(object sender, EventArgs e) {
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
index c3c6aad2..aa0a8bf8 100644
--- a/extra/exe-builder/UptimeKuma.csproj
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -51,8 +51,17 @@
         <Reference Include="System.Xml" />
     </ItemGroup>
     <ItemGroup>
+        <Compile Include="DownloadForm.cs">
+          <SubType>Form</SubType>
+        </Compile>
+        <Compile Include="DownloadForm.Designer.cs">
+          <DependentUpon>DownloadForm.cs</DependentUpon>
+        </Compile>
         <Compile Include="Program.cs" />
         <Compile Include="Properties\AssemblyInfo.cs" />
+        <EmbeddedResource Include="DownloadForm.resx">
+          <DependentUpon>DownloadForm.cs</DependentUpon>
+        </EmbeddedResource>
         <EmbeddedResource Include="Properties\Resources.resx">
             <Generator>ResXFileCodeGenerator</Generator>
             <LastGenOutput>Resources.Designer.cs</LastGenOutput>

From 230e5110b1db0527c763daa680fa556a06d3bd9b Mon Sep 17 00:00:00 2001
From: Kevin Falentio <f@lentio.my.id>
Date: Sat, 8 Oct 2022 19:59:22 +0700
Subject: [PATCH 224/803] Fix typo in id-ID language file (#2202)

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

diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index f8ee3ab7..fe5d3594 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -565,7 +565,7 @@ export default {
     Examples: "Contoh",
     "Home Assistant URL": "Home Assistant URL",
     "Long-Lived Access Token": "Token Akses Berumur Panjang",
-    "Long-Lived Access Token canbe created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token Akses Berumur Panjang dapat dibuat dengan mengklik nama profil Anda (kiri bawah) dan menggulir ke bawah lalu klik Buat Token. ",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token Akses Berumur Panjang dapat dibuat dengan mengklik nama profil Anda (kiri bawah) dan menggulir ke bawah lalu klik Buat Token. ",
     "Notification Service": "Layanan Pemberitahuan",
     "default: notify all devices": "bawaan: notifikasi seluruh perangkat",
     "A listof Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Daftar Layanan Pemberitahuan dapat ditemukan di Home Assistant pada \"Developer Tools > Services\" cari \"notification\" lalu cari nama perangkat Anda.",

From 655ba015a07c87e7b1a24ce8cafbe171103acad1 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 8 Oct 2022 23:47:27 +0800
Subject: [PATCH 225/803] WIP

---
 extra/exe-builder/DownloadForm.cs   | 127 ++++++++++++++++++++++++++--
 extra/exe-builder/Program.cs        |   2 +-
 extra/exe-builder/UptimeKuma.csproj |   3 +-
 3 files changed, 121 insertions(+), 11 deletions(-)

diff --git a/extra/exe-builder/DownloadForm.cs b/extra/exe-builder/DownloadForm.cs
index 9c740e31..5bb88b6d 100644
--- a/extra/exe-builder/DownloadForm.cs
+++ b/extra/exe-builder/DownloadForm.cs
@@ -1,14 +1,19 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Diagnostics;
 using System.IO;
+using System.IO.Compression;
 using System.Net;
+using System.Threading;
+using System.Threading.Tasks;
 using System.Windows.Forms;
 
 namespace UptimeKuma {
     public partial class DownloadForm : Form {
         private readonly Queue<DownloadItem> downloadQueue = new();
         private readonly WebClient webClient = new();
+        private DownloadItem currentDownloadItem;
 
         public DownloadForm() {
             InitializeComponent();
@@ -18,17 +23,19 @@ namespace UptimeKuma {
             webClient.DownloadProgressChanged += DownloadProgressChanged;
             webClient.DownloadFileCompleted += DownloadFileCompleted;
 
-            if (!File.Exists("node")) {
+            if (!Directory.Exists("node")) {
                 downloadQueue.Enqueue(new DownloadItem {
                     URL = "https://nodejs.org/dist/v16.17.1/node-v16.17.1-win-x64.zip",
-                    Filename = "node.zip"
+                    Filename = "node.zip",
+                    TargetFolder = "node"
                 });
             }
 
-            if (!File.Exists("node")) {
+            if (!Directory.Exists("node")) {
                 downloadQueue.Enqueue(new DownloadItem {
                     URL = "https://github.com/louislam/uptime-kuma/archive/refs/tags/1.18.3.zip",
-                    Filename = "core.zip"
+                    Filename = "core.zip",
+                    TargetFolder = "core"
                 });
             }
 
@@ -38,28 +45,130 @@ namespace UptimeKuma {
         void DownloadNextFile() {
             if (downloadQueue.Count > 0) {
                 var item = downloadQueue.Dequeue();
-                label.Text = item.URL;
-                webClient.DownloadFileAsync(new Uri(item.URL), item.Filename);
+
+                currentDownloadItem = item;
+
+                // Download if the zip file is not existing
+                if (!File.Exists(item.Filename)) {
+                    label.Text = item.URL;
+                    webClient.DownloadFileAsync(new Uri(item.URL), item.Filename);
+                } else {
+                    progressBar.Value = 100;
+                    label.Text = "Use local " + item.Filename;
+                    DownloadFileCompleted(null, null);
+                }
             } else {
-                // TODO: Finished, extract?
+                npmSetup();
             }
         }
 
+        void npmSetup() {
+            if (Directory.Exists("core/node_modules")) {
+               // Application.Restart();
+            }
+
+            label.Text = "npm run setup";
+            progressBar.Value = 50;
+            labelData.Text = "";
+
+            var startInfo = new ProcessStartInfo {
+                FileName = "cmd.exe",
+                Arguments = "run setup",
+                RedirectStandardOutput = false,
+                RedirectStandardError = false,
+                RedirectStandardInput = true,
+                UseShellExecute = false,
+                CreateNoWindow = false,
+                WorkingDirectory = "core"
+            };
+
+            var process = new Process();
+            process.StartInfo = startInfo;
+            process.EnableRaisingEvents = true;
+            process.Exited += (object _, EventArgs e) => {
+               // Application.Restart();
+               progressBar.Value = 100;
+
+               if (process.ExitCode == 0) {
+                   label.Text = "Done";
+               } else {
+                   label.Text = "Failed, exit code: " + process.ExitCode;
+               }
+
+            };
+            process.Start();
+            process.StandardInput.WriteLine("\"../node/npm\" run setup");
+        }
+
         void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
             progressBar.Value = e.ProgressPercentage;
             var total = e.TotalBytesToReceive / 1024;
             var current = e.BytesReceived / 1024;
-            labelData.Text = $"{current}KB/{total}KB";
+
+            if (total > 0) {
+                labelData.Text = $"{current}KB/{total}KB";
+            }
         }
 
-        void DownloadFileCompleted(object sender, AsyncCompletedEventArgs  e) {
+        async void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) {
+            Extract(currentDownloadItem);
             DownloadNextFile();
         }
+
+        void Extract(DownloadItem item) {
+            if (Directory.Exists(item.TargetFolder)) {
+                var dir = new DirectoryInfo(item.TargetFolder);
+                dir.Delete(true);
+            }
+
+            if (Directory.Exists("temp")) {
+                var dir = new DirectoryInfo("temp");
+                dir.Delete(true);
+            }
+
+            labelData.Text = $"Extracting {item.Filename}...";
+
+            ZipFile.ExtractToDirectory(item.Filename, "temp");
+
+            string[] dirList;
+
+            // Move to the correct level
+            dirList = Directory.GetDirectories("temp");
+
+
+
+            if (dirList.Length > 0) {
+                var dir = dirList[0];
+
+                // As sometime ExtractToDirectory is still locking the directory, loop until ok
+                while (true) {
+                    try {
+                        Directory.Move(dir, item.TargetFolder);
+                        break;
+                    } catch (Exception exception) {
+                        Thread.Sleep(1000);
+                    }
+                }
+
+            } else {
+                MessageBox.Show("Unexcepted Error: Cannot move extracted files, folder not found.");
+            }
+
+            labelData.Text = $"Extracted";
+
+            if (Directory.Exists("temp")) {
+                var dir = new DirectoryInfo("temp");
+                dir.Delete(true);
+            }
+
+            File.Delete(item.Filename);
+        }
     }
 
     public class DownloadItem {
         public string URL { get; set; }
         public string Filename { get; set; }
+        public string TargetFolder { get; set; }
     }
 }
 
diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 84aa6e45..1b78f038 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -45,7 +45,7 @@ namespace UptimeKuma {
             trayIcon.MouseDoubleClick += new MouseEventHandler(Open);
             trayIcon.Visible = true;
 
-            if (File.Exists("core") && File.Exists("node")) {
+            if (Directory.Exists("core") && Directory.Exists("node") && Directory.Exists("core/node_modules")) {
                 // Go go go
                 StartProcess();
             } else {
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
index aa0a8bf8..2ad857b2 100644
--- a/extra/exe-builder/UptimeKuma.csproj
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -35,11 +35,12 @@
         <WarningLevel>4</WarningLevel>
     </PropertyGroup>
     <PropertyGroup>
-      <PostBuildEvent>COPY "$(SolutionDir)bin\Debug\uptime-kuma.exe" "C:\Users\LouisLam\Desktop\uptime-kuma-win64\"</PostBuildEvent>
+      <PostBuildEvent>COPY "$(SolutionDir)bin\Debug\uptime-kuma.exe" "%UserProfile%\Desktop\uptime-kuma-win64\"</PostBuildEvent>
     </PropertyGroup>
     <ItemGroup>
         <Reference Include="System" />
         <Reference Include="System.Core" />
+        <Reference Include="System.IO.Compression.FileSystem" />
         <Reference Include="System.Xml.Linq" />
         <Reference Include="System.Data.DataSetExtensions" />
         <Reference Include="Microsoft.CSharp" />

From ad1a7c255f214d2ce0be9d71d0d232d246fb64f9 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 8 Oct 2022 23:56:58 +0800
Subject: [PATCH 226/803] Drop exports.entryPage fully

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

diff --git a/server/server.js b/server/server.js
index 620e5bb4..2efad753 100644
--- a/server/server.js
+++ b/server/server.js
@@ -127,6 +127,7 @@ const StatusPage = require("./model/status_page");
 const { cloudflaredSocketHandler, autoStart: cloudflaredAutoStart, stop: cloudflaredStop } = require("./socket-handlers/cloudflared-socket-handler");
 const { proxySocketHandler } = require("./socket-handlers/proxy-socket-handler");
 const { dockerSocketHandler } = require("./socket-handlers/docker-socket-handler");
+const { Settings } = require("./settings");
 
 app.use(express.json());
 
@@ -155,9 +156,7 @@ let needSetup = false;
     Database.init(args);
     await initDatabase(testMode);
 
-    const entryPage = (await getSettings("general"))["entryPage"];
-    exports.entryPage = entryPage;
-    UptimeKumaServer.getInstance().entryPage = entryPage;
+    server.entryPage = await Settings.get("entryPage");
     await StatusPage.loadDomainMappingList();
 
     log.info("server", "Adding route");
@@ -178,7 +177,7 @@ let needSetup = false;
 
         log.debug("entry", `Request Domain: ${hostname}`);
 
-        const uptimeKumaEntryPage = UptimeKumaServer.getInstance().entryPage;
+        const uptimeKumaEntryPage = server.entryPage;
         if (hostname in StatusPage.domainMappingList) {
             log.debug("entry", "This is a status page domain");
 
@@ -1087,8 +1086,7 @@ let needSetup = false;
                 }
 
                 await setSettings("general", data);
-                exports.entryPage = data.entryPage;
-                UptimeKumaServer.getInstance().entryPage = data.entryPage;
+                server.entryPage = data.entryPage;
 
                 callback({
                     ok: true,

From a487347b3316cc3192b312a195ac44a46160d310 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 9 Oct 2022 03:47:06 +0800
Subject: [PATCH 227/803] [exe] install dependencies and download dist

---
 extra/exe-builder/DownloadForm.cs | 21 +++++++++++----------
 extra/exe-builder/Program.cs      |  2 +-
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/extra/exe-builder/DownloadForm.cs b/extra/exe-builder/DownloadForm.cs
index 5bb88b6d..f16af422 100644
--- a/extra/exe-builder/DownloadForm.cs
+++ b/extra/exe-builder/DownloadForm.cs
@@ -63,12 +63,6 @@ namespace UptimeKuma {
         }
 
         void npmSetup() {
-            if (Directory.Exists("core/node_modules")) {
-               // Application.Restart();
-            }
-
-            label.Text = "npm run setup";
-            progressBar.Value = 50;
             labelData.Text = "";
 
             var startInfo = new ProcessStartInfo {
@@ -86,10 +80,12 @@ namespace UptimeKuma {
             process.StartInfo = startInfo;
             process.EnableRaisingEvents = true;
             process.Exited += (object _, EventArgs e) => {
-               // Application.Restart();
-               progressBar.Value = 100;
+                progressBar.Value = 100;
 
                if (process.ExitCode == 0) {
+                   Task.Delay(2000).ContinueWith((task) => {
+                       Application.Restart();
+                   });
                    label.Text = "Done";
                } else {
                    label.Text = "Failed, exit code: " + process.ExitCode;
@@ -97,7 +93,12 @@ namespace UptimeKuma {
 
             };
             process.Start();
-            process.StandardInput.WriteLine("\"../node/npm\" run setup");
+            label.Text = "Installing dependencies and download dist files";
+            progressBar.Value = 50;
+
+            process.StandardInput.WriteLine("\"../node/npm\" ci --production");
+            process.StandardInput.WriteLine("\"../node/npm\" run download-dist");
+            process.StandardInput.WriteLine("exit");
         }
 
         void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
@@ -110,7 +111,7 @@ namespace UptimeKuma {
             }
         }
 
-        async void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) {
+        void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) {
             Extract(currentDownloadItem);
             DownloadNextFile();
         }
diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 1b78f038..82c76b05 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -45,7 +45,7 @@ namespace UptimeKuma {
             trayIcon.MouseDoubleClick += new MouseEventHandler(Open);
             trayIcon.Visible = true;
 
-            if (Directory.Exists("core") && Directory.Exists("node") && Directory.Exists("core/node_modules")) {
+            if (Directory.Exists("core") && Directory.Exists("node") && Directory.Exists("core/node_modules") && Directory.Exists("core/dist")) {
                 // Go go go
                 StartProcess();
             } else {

From 1c8631af8d5b3547f1fff5bea1ee3da75b7ee45f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 9 Oct 2022 16:02:47 +0800
Subject: [PATCH 228/803] Pin dependencies (#2205)

---
 package-lock.json | 48 +++++++++++++++++++++++------------------------
 package.json      | 48 +++++++++++++++++++++++------------------------
 2 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 4f222171..6053fa5f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,47 +12,47 @@
                 "@louislam/sqlite3": "~15.0.6",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
-                "axios-ntlm": "^1.3.0",
-                "badge-maker": "^3.3.1",
+                "axios-ntlm": "~1.3.0",
+                "badge-maker": "~3.3.1",
                 "bcryptjs": "~2.4.3",
                 "bree": "~7.1.5",
                 "cacheable-lookup": "~6.0.4",
-                "chardet": "^1.3.0",
+                "chardet": "~1.4.0",
                 "check-password-strength": "^2.0.5",
-                "cheerio": "^1.0.0-rc.10",
-                "chroma-js": "^2.1.2",
+                "cheerio": "~1.0.0-rc.12",
+                "chroma-js": "~2.4.2",
                 "command-exists": "~1.2.9",
                 "compare-versions": "~3.6.0",
-                "compression": "^1.7.4",
-                "dayjs": "^1.11.0",
+                "compression": "~1.7.4",
+                "dayjs": "~1.11.5",
                 "express": "~4.17.3",
                 "express-basic-auth": "~1.2.1",
-                "express-static-gzip": "^2.1.7",
+                "express-static-gzip": "~2.1.7",
                 "form-data": "~4.0.0",
                 "http-graceful-shutdown": "~3.1.7",
-                "http-proxy-agent": "^5.0.0",
-                "https-proxy-agent": "^5.0.0",
-                "iconv-lite": "^0.6.3",
-                "jsesc": "^3.0.2",
+                "http-proxy-agent": "~5.0.0",
+                "https-proxy-agent": "~5.0.1",
+                "iconv-lite": "~0.6.3",
+                "jsesc": "~3.0.2",
                 "jsonwebtoken": "~8.5.1",
-                "jwt-decode": "^3.1.2",
-                "limiter": "^2.1.0",
-                "mqtt": "^4.2.8",
-                "mssql": "^8.1.0",
+                "jwt-decode": "~3.1.2",
+                "limiter": "~2.1.0",
+                "mqtt": "~4.3.7",
+                "mssql": "~8.1.4",
                 "node-cloudflared-tunnel": "~1.0.9",
-                "node-radius-client": "^1.0.0",
+                "node-radius-client": "~1.0.0",
                 "nodemailer": "~6.6.5",
                 "notp": "~2.0.3",
                 "password-hash": "~1.2.2",
-                "pg": "^8.7.3",
-                "pg-connection-string": "^2.5.0",
+                "pg": "~8.8.0",
+                "pg-connection-string": "~2.5.0",
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
                 "redbean-node": "0.1.4",
                 "socket.io": "~4.4.1",
                 "socket.io-client": "~4.4.1",
                 "socks-proxy-agent": "6.1.1",
-                "tar": "^6.1.11",
+                "tar": "~6.1.11",
                 "tcp-ping": "~0.1.1",
                 "thirty-two": "~1.0.2"
             },
@@ -82,18 +82,18 @@
                 "dns2": "~2.0.1",
                 "eslint": "~8.14.0",
                 "eslint-plugin-vue": "~8.7.1",
-                "favico.js": "^0.3.10",
+                "favico.js": "~0.3.10",
                 "jest": "~27.2.5",
                 "postcss-html": "~1.5.0",
                 "postcss-rtlcss": "~3.7.2",
                 "postcss-scss": "~4.0.4",
-                "prismjs": "^1.27.0",
+                "prismjs": "~1.29.0",
                 "qrcode": "~1.5.0",
                 "rollup-plugin-visualizer": "^5.6.0",
                 "sass": "~1.42.1",
                 "stylelint": "~14.7.1",
                 "stylelint-config-standard": "~25.0.0",
-                "terser": "^5.15.0",
+                "terser": "~5.15.0",
                 "timezones-list": "~3.0.1",
                 "typescript": "~4.4.4",
                 "v-pagination-3": "~0.1.7",
@@ -106,7 +106,7 @@
                 "vue-i18n": "~9.1.9",
                 "vue-image-crop-upload": "~3.0.3",
                 "vue-multiselect": "~3.0.0-alpha.2",
-                "vue-prism-editor": "^2.0.0-alpha.2",
+                "vue-prism-editor": "~2.0.0-alpha.2",
                 "vue-qrcode": "~1.0.0",
                 "vue-router": "~4.0.14",
                 "vue-toastification": "~2.0.0-rc.5",
diff --git a/package.json b/package.json
index f5f78f3a..0c72722d 100644
--- a/package.json
+++ b/package.json
@@ -66,47 +66,47 @@
         "@louislam/sqlite3": "~15.0.6",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",
-        "axios-ntlm": "^1.3.0",
-        "badge-maker": "^3.3.1",
+        "axios-ntlm": "~1.3.0",
+        "badge-maker": "~3.3.1",
         "bcryptjs": "~2.4.3",
         "bree": "~7.1.5",
         "cacheable-lookup": "~6.0.4",
-        "chardet": "^1.3.0",
+        "chardet": "~1.4.0",
         "check-password-strength": "^2.0.5",
-        "cheerio": "^1.0.0-rc.10",
-        "chroma-js": "^2.1.2",
+        "cheerio": "~1.0.0-rc.12",
+        "chroma-js": "~2.4.2",
         "command-exists": "~1.2.9",
         "compare-versions": "~3.6.0",
-        "compression": "^1.7.4",
-        "dayjs": "^1.11.0",
+        "compression": "~1.7.4",
+        "dayjs": "~1.11.5",
         "express": "~4.17.3",
         "express-basic-auth": "~1.2.1",
-        "express-static-gzip": "^2.1.7",
+        "express-static-gzip": "~2.1.7",
         "form-data": "~4.0.0",
         "http-graceful-shutdown": "~3.1.7",
-        "http-proxy-agent": "^5.0.0",
-        "https-proxy-agent": "^5.0.0",
-        "iconv-lite": "^0.6.3",
-        "jsesc": "^3.0.2",
+        "http-proxy-agent": "~5.0.0",
+        "https-proxy-agent": "~5.0.1",
+        "iconv-lite": "~0.6.3",
+        "jsesc": "~3.0.2",
         "jsonwebtoken": "~8.5.1",
-        "jwt-decode": "^3.1.2",
-        "limiter": "^2.1.0",
-        "mqtt": "^4.2.8",
-        "mssql": "^8.1.0",
+        "jwt-decode": "~3.1.2",
+        "limiter": "~2.1.0",
+        "mqtt": "~4.3.7",
+        "mssql": "~8.1.4",
         "node-cloudflared-tunnel": "~1.0.9",
-        "node-radius-client": "^1.0.0",
+        "node-radius-client": "~1.0.0",
         "nodemailer": "~6.6.5",
         "notp": "~2.0.3",
         "password-hash": "~1.2.2",
-        "pg": "^8.7.3",
-        "pg-connection-string": "^2.5.0",
+        "pg": "~8.8.0",
+        "pg-connection-string": "~2.5.0",
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
         "redbean-node": "0.1.4",
         "socket.io": "~4.4.1",
         "socket.io-client": "~4.4.1",
         "socks-proxy-agent": "6.1.1",
-        "tar": "^6.1.11",
+        "tar": "~6.1.11",
         "tcp-ping": "~0.1.1",
         "thirty-two": "~1.0.2"
     },
@@ -136,18 +136,18 @@
         "dns2": "~2.0.1",
         "eslint": "~8.14.0",
         "eslint-plugin-vue": "~8.7.1",
-        "favico.js": "^0.3.10",
+        "favico.js": "~0.3.10",
         "jest": "~27.2.5",
         "postcss-html": "~1.5.0",
         "postcss-rtlcss": "~3.7.2",
         "postcss-scss": "~4.0.4",
-        "prismjs": "^1.27.0",
+        "prismjs": "~1.29.0",
         "qrcode": "~1.5.0",
         "rollup-plugin-visualizer": "^5.6.0",
         "sass": "~1.42.1",
         "stylelint": "~14.7.1",
         "stylelint-config-standard": "~25.0.0",
-        "terser": "^5.15.0",
+        "terser": "~5.15.0",
         "timezones-list": "~3.0.1",
         "typescript": "~4.4.4",
         "v-pagination-3": "~0.1.7",
@@ -160,7 +160,7 @@
         "vue-i18n": "~9.1.9",
         "vue-image-crop-upload": "~3.0.3",
         "vue-multiselect": "~3.0.0-alpha.2",
-        "vue-prism-editor": "^2.0.0-alpha.2",
+        "vue-prism-editor": "~2.0.0-alpha.2",
         "vue-qrcode": "~1.0.0",
         "vue-router": "~4.0.14",
         "vue-toastification": "~2.0.0-rc.5",

From 07f9aafd7bce1b6d5226744654070a2fc7d54745 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 9 Oct 2022 16:50:47 +0800
Subject: [PATCH 229/803] Update to 1.18.4

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

diff --git a/package.json b/package.json
index 0c72722d..180bea28 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.3",
+    "version": "1.18.4",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -38,7 +38,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.18.3 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.18.4 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From a36f24d827f2dd37c247cee6a124495bbd0e3d19 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 9 Oct 2022 20:59:58 +0800
Subject: [PATCH 230/803] Add configurable server timezone

---
 package-lock.json                   |  4 ++--
 package.json                        |  2 +-
 server/server.js                    | 24 ++++++++++++++++++------
 server/uptime-kuma-server.js        | 25 +++++++++++++++++++++++++
 src/components/settings/General.vue | 20 ++++++++++++++++++--
 src/util.js                         |  2 +-
 src/util.ts                         |  2 +-
 7 files changed, 66 insertions(+), 13 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 2fdcb272..fb50f275 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.3",
+    "version": "1.18.4",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.18.3",
+            "version": "1.18.4",
             "license": "MIT",
             "dependencies": {
                 "@louislam/sqlite3": "~15.0.6",
diff --git a/package.json b/package.json
index a77ea3d7..c3f7a886 100644
--- a/package.json
+++ b/package.json
@@ -123,7 +123,7 @@
         "@vitejs/plugin-legacy": "~2.1.0",
         "@vitejs/plugin-vue": "~3.1.0",
         "@vue/compiler-sfc": "~3.2.36",
-        "@vuepic/vue-datepicker": "^3.4.8",
+        "@vuepic/vue-datepicker": "~3.4.8",
         "aedes": "^0.46.3",
         "babel-plugin-rewire": "~1.2.0",
         "bootstrap": "5.1.3",
diff --git a/server/server.js b/server/server.js
index 1ad99899..f80d5d57 100644
--- a/server/server.js
+++ b/server/server.js
@@ -5,6 +5,11 @@
  */
 console.log("Welcome to Uptime Kuma");
 
+// As the log function need to use dayjs, it should be very top
+const dayjs = require("dayjs");
+dayjs.extend(require("dayjs/plugin/utc"));
+dayjs.extend(require("dayjs/plugin/timezone"));
+
 // Check Node.js Version
 const nodeVersion = parseInt(process.versions.node.split(".")[0]);
 const requiredVersion = 14;
@@ -34,10 +39,6 @@ const fs = require("fs");
 
 log.info("server", "Importing 3rd-party libraries");
 
-const dayjs = require("dayjs");
-dayjs.extend(require("dayjs/plugin/utc"));
-dayjs.extend(require("dayjs/plugin/timezone"));
-
 log.debug("server", "Importing express");
 const express = require("express");
 const expressStaticGzip = require("express-static-gzip");
@@ -160,6 +161,7 @@ let needSetup = false;
 (async () => {
     Database.init(args);
     await initDatabase(testMode);
+    await server.initAfterDatabaseReady();
 
     exports.entryPage = await setting("entryPage");
     await StatusPage.loadDomainMappingList();
@@ -1061,10 +1063,15 @@ let needSetup = false;
         socket.on("getSettings", async (callback) => {
             try {
                 checkLogin(socket);
+                const data = await getSettings("general");
+
+                if (!data.serverTimezone) {
+                    data.serverTimezone = await server.getTimezone();
+                }
 
                 callback({
                     ok: true,
-                    data: await getSettings("general"),
+                    data: data,
                 });
 
             } catch (e) {
@@ -1092,9 +1099,14 @@ let needSetup = false;
                 await setSettings("general", data);
                 exports.entryPage = data.entryPage;
 
+                // Also need to apply timezone globally
+                if (data.serverTimezone) {
+                    await server.setTimezone(data.serverTimezone);
+                }
+
                 callback({
                     ok: true,
-                    msg: "Saved"
+                    msg: "Saved " + dayjs()
                 });
 
                 sendInfo(socket);
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 7de53fe6..15583159 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -9,6 +9,7 @@ const Database = require("./database");
 const util = require("util");
 const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
 const { Settings } = require("./settings");
+const dayjs = require("dayjs");
 
 /**
  * `module.exports` (alias: `server`) should be inside this class, in order to avoid circular dependency issue.
@@ -84,6 +85,13 @@ class UptimeKumaServer {
         this.io = new Server(this.httpServer);
     }
 
+    async initAfterDatabaseReady() {
+        process.env.TZ = await this.getTimezone();
+        dayjs.tz.setDefault(process.env.TZ);
+        log.debug("DEBUG", "Timezone: " + process.env.TZ);
+        log.debug("DEBUG", "Current Time: " + dayjs.tz().format());
+    }
+
     async sendMonitorList(socket) {
         let list = await this.getMonitorJSONList(socket.userID);
         this.io.to(socket.userID).emit("monitorList", list);
@@ -184,6 +192,23 @@ class UptimeKumaServer {
             return clientIP.replace(/^.*:/, "");
         }
     }
+
+    async getTimezone() {
+        let timezone = await Settings.get("serverTimezone");
+        if (timezone) {
+            return timezone;
+        } else if (process.env.TZ) {
+            return process.env.TZ;
+        } else {
+            return dayjs.tz.guess();
+        }
+    }
+
+    async setTimezone(timezone) {
+        await Settings.set("serverTimezone", timezone, "general");
+        process.env.TZ = timezone;
+        dayjs.tz.setDefault(timezone);
+    }
 }
 
 module.exports = {
diff --git a/src/components/settings/General.vue b/src/components/settings/General.vue
index 242ad853..57c8e0ca 100644
--- a/src/components/settings/General.vue
+++ b/src/components/settings/General.vue
@@ -1,10 +1,10 @@
 <template>
     <div>
         <form class="my-4" @submit.prevent="saveGeneral">
-            <!-- Timezone -->
+            <!-- Client side Timezone -->
             <div class="mb-4">
                 <label for="timezone" class="form-label">
-                    {{ $t("Timezone") }}
+                    {{ $t("Display Timezone") }}
                 </label>
                 <select id="timezone" v-model="$root.userTimezone" class="form-select">
                     <option value="auto">
@@ -20,6 +20,22 @@
                 </select>
             </div>
 
+            <!-- Server Timezone -->
+            <div class="mb-4">
+                <label for="timezone" class="form-label">
+                    {{ $t("Server Timezone") }}
+                </label>
+                <select id="timezone" v-model="settings.serverTimezone" class="form-select">
+                    <option
+                        v-for="(timezone, index) in timezoneList"
+                        :key="index"
+                        :value="timezone.value"
+                    >
+                        {{ timezone.name }}
+                    </option>
+                </select>
+            </div>
+
             <!-- Search Engine -->
             <div class="mb-4">
                 <label class="form-label">
diff --git a/src/util.js b/src/util.js
index 1fee0eaa..2c914cb6 100644
--- a/src/util.js
+++ b/src/util.js
@@ -101,7 +101,7 @@ class Logger {
         }
         module = module.toUpperCase();
         level = level.toUpperCase();
-        const now = new Date().toISOString();
+        const now = dayjs.tz(new Date()).format();
         const formattedMessage = (typeof msg === "string") ? `${now} [${module}] ${level}: ${msg}` : msg;
         if (level === "INFO") {
             console.info(formattedMessage);
diff --git a/src/util.ts b/src/util.ts
index 16511afa..363bfc06 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -116,7 +116,7 @@ class Logger {
         module = module.toUpperCase();
         level = level.toUpperCase();
 
-        const now = new Date().toISOString();
+        const now = dayjs.tz(new Date()).format();
         const formattedMessage = (typeof msg === "string") ? `${now} [${module}] ${level}: ${msg}` : msg;
 
         if (level === "INFO") {

From a577fba84883937848e1b70e5c3ec348976b531b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 10 Oct 2022 02:28:03 +0800
Subject: [PATCH 231/803] Change DateTime Range using serverTimezone

---
 server/client.js              |  6 ++++--
 server/model/maintenance.js   | 10 +++++-----
 src/languages/en.js           |  2 +-
 src/pages/EditMaintenance.vue |  8 ++++----
 src/util.js                   | 18 ++++++++++++++++--
 src/util.ts                   | 17 ++++++++++++++++-
 6 files changed, 46 insertions(+), 15 deletions(-)

diff --git a/server/client.js b/server/client.js
index a0c52e1e..795b3ad4 100644
--- a/server/client.js
+++ b/server/client.js
@@ -4,7 +4,8 @@
 const { TimeLogger } = require("../src/util");
 const { R } = require("redbean-node");
 const { UptimeKumaServer } = require("./uptime-kuma-server");
-const io = UptimeKumaServer.getInstance().io;
+const server = UptimeKumaServer.getInstance();
+const io = server.io;
 const { setting } = require("./util-server");
 const checkVersion = require("./check-version");
 
@@ -121,7 +122,8 @@ async function sendInfo(socket) {
     socket.emit("info", {
         version: checkVersion.version,
         latestVersion: checkVersion.latestVersion,
-        primaryBaseURL: await setting("primaryBaseURL")
+        primaryBaseURL: await setting("primaryBaseURL"),
+        serverTimezone: await server.getTimezone(),
     });
 }
 
diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 3d0595a7..840267ef 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -1,5 +1,5 @@
 const { BeanModel } = require("redbean-node/dist/bean-model");
-const { parseTimeObject, parseTimeFromTimeObject, isoToUTCDateTime, utcToISODateTime } = require("../../src/util");
+const { parseTimeObject, parseTimeFromTimeObject, isoToUTCDateTime, utcToISODateTime, SQL_DATETIME_FORMAT, utcToLocal, localToUTC } = require("../../src/util");
 const { isArray } = require("chart.js/helpers");
 const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
 
@@ -15,9 +15,9 @@ class Maintenance extends BeanModel {
 
         let dateRange = [];
         if (this.start_date) {
-            dateRange.push(utcToISODateTime(this.start_date));
+            dateRange.push(utcToLocal(this.start_date));
             if (this.end_date) {
-                dateRange.push(utcToISODateTime(this.end_date));
+                dateRange.push(utcToLocal(this.end_date));
             }
         }
 
@@ -92,10 +92,10 @@ class Maintenance extends BeanModel {
         bean.active = obj.active;
 
         if (obj.dateRange[0]) {
-            bean.start_date = isoToUTCDateTime(obj.dateRange[0]);
+            bean.start_date = localToUTC(obj.dateRange[0]);
 
             if (obj.dateRange[1]) {
-                bean.end_date = isoToUTCDateTime(obj.dateRange[1]);
+                bean.end_date = localToUTC(obj.dateRange[1]);
             }
         }
 
diff --git a/src/languages/en.js b/src/languages/en.js
index 5a959f27..d6a65b04 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -616,7 +616,7 @@ export default {
     recurringInterval: "Interval",
     "Recurring": "Recurring",
     strategyManual: "Active/Inactive Manually",
-    warningTimezone: "It is using your current Device/PC's timezone.",
+    warningTimezone: "It is using the server's timezone",
     weekdayShortMon: "Mon",
     weekdayShortTue: "Tue",
     weekdayShortWed: "Wed",
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index be9f7ce4..946059cb 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -82,7 +82,7 @@
 
                             <h2 class="mt-5">{{ $t("Date and Time") }}</h2>
 
-                            <div>⚠️ {{ $t("warningTimezone") }}</div>
+                            <div>⚠️ {{ $t("warningTimezone") }}: {{ $root.info.serverTimezone }}</div>
 
                             <!-- Strategy -->
                             <div class="my-3">
@@ -105,10 +105,11 @@
                                     <Datepicker
                                         v-model="maintenance.dateRange"
                                         :dark="$root.isDark"
-                                        range textInput
+                                        range
                                         :monthChangeOnScroll="false"
                                         :minDate="minDate"
                                         format="yyyy-MM-dd HH:mm"
+                                        modelType="yyyy-MM-dd HH:mm:ss"
                                     />
                                 </div>
                             </template>
@@ -186,7 +187,6 @@
                                         :dark="$root.isDark"
                                         timePicker
                                         disableTimeRangeValidation range
-                                        textInput
                                     />
                                 </div>
 
@@ -196,7 +196,7 @@
                                     <Datepicker
                                         v-model="maintenance.dateRange"
                                         :dark="$root.isDark"
-                                        range textInput datePicker
+                                        range datePicker
                                         :monthChangeOnScroll="false"
                                         :minDate="minDate"
                                         :enableTimePicker="false"
diff --git a/src/util.js b/src/util.js
index 2c914cb6..ec2d2322 100644
--- a/src/util.js
+++ b/src/util.js
@@ -7,7 +7,7 @@
 // Backend uses the compiled file util.js
 // Frontend uses util.ts
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.utcToISODateTime = exports.isoToUTCDateTime = exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
+exports.localToUTC = exports.utcToLocal = exports.utcToISODateTime = exports.isoToUTCDateTime = exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.SQL_DATETIME_FORMAT = exports.SQL_DATE_FORMAT = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
 const dayjs = require("dayjs");
 exports.isDev = process.env.NODE_ENV === "development";
 exports.appName = "Uptime Kuma";
@@ -19,6 +19,8 @@ exports.STATUS_PAGE_ALL_DOWN = 0;
 exports.STATUS_PAGE_ALL_UP = 1;
 exports.STATUS_PAGE_PARTIAL_DOWN = 2;
 exports.STATUS_PAGE_MAINTENANCE = 3;
+exports.SQL_DATE_FORMAT = "YYYY-MM-DD";
+exports.SQL_DATETIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
 /** Flip the status of s */
 function flipStatus(s) {
     if (s === exports.UP) {
@@ -351,7 +353,7 @@ function parseTimeFromTimeObject(obj) {
 }
 exports.parseTimeFromTimeObject = parseTimeFromTimeObject;
 function isoToUTCDateTime(input) {
-    return dayjs(input).utc().format("YYYY-MM-DD HH:mm:ss");
+    return dayjs(input).utc().format(exports.SQL_DATETIME_FORMAT);
 }
 exports.isoToUTCDateTime = isoToUTCDateTime;
 /**
@@ -361,3 +363,15 @@ function utcToISODateTime(input) {
     return dayjs.utc(input).toISOString();
 }
 exports.utcToISODateTime = utcToISODateTime;
+/**
+/**
+ * For SQL_DATETIME_FORMAT
+ */
+function utcToLocal(input) {
+    return dayjs.utc(input).local().format(exports.SQL_DATETIME_FORMAT);
+}
+exports.utcToLocal = utcToLocal;
+function localToUTC(input) {
+    return dayjs(input).utc().format(exports.SQL_DATETIME_FORMAT);
+}
+exports.localToUTC = localToUTC;
diff --git a/src/util.ts b/src/util.ts
index 363bfc06..34e0905d 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -23,6 +23,9 @@ export const STATUS_PAGE_ALL_UP = 1;
 export const STATUS_PAGE_PARTIAL_DOWN = 2;
 export const STATUS_PAGE_MAINTENANCE = 3;
 
+export const SQL_DATE_FORMAT = "YYYY-MM-DD";
+export const SQL_DATETIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
+
 /** Flip the status of s */
 export function flipStatus(s: number) {
     if (s === UP) {
@@ -396,7 +399,7 @@ export function parseTimeFromTimeObject(obj : any) {
 
 
 export function isoToUTCDateTime(input : string) {
-    return dayjs(input).utc().format("YYYY-MM-DD HH:mm:ss");
+    return dayjs(input).utc().format(SQL_DATETIME_FORMAT);
 }
 
 /**
@@ -405,3 +408,15 @@ export function isoToUTCDateTime(input : string) {
 export function utcToISODateTime(input : string) {
     return dayjs.utc(input).toISOString();
 }
+
+/**
+/**
+ * For SQL_DATETIME_FORMAT
+ */
+export function utcToLocal(input : string) {
+    return dayjs.utc(input).local().format(SQL_DATETIME_FORMAT);
+}
+
+export function localToUTC(input : string) {
+    return dayjs(input).utc().format(SQL_DATETIME_FORMAT);
+}

From 71af23cf0003c4a5086a9eb44abeabd1ccb8bdce Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 10 Oct 2022 02:47:24 +0800
Subject: [PATCH 232/803] Fix #2207

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

diff --git a/server/model/status_page.js b/server/model/status_page.js
index 7682272c..68c7f8b0 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -58,7 +58,7 @@ class StatusPage extends BeanModel {
 
         // Preload data
         // Add jsesc, fix https://github.com/louislam/uptime-kuma/issues/2186
-        const escapedJSONObject = jsesc(JSON.stringify(await StatusPage.getStatusPageData(statusPage)), {
+        const escapedJSONObject = jsesc(await StatusPage.getStatusPageData(statusPage), {
             "isScriptContext": true
         });
 

From bd42450e55dc29bdd1daddb1080aaa6d81b32912 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 10 Oct 2022 16:23:32 +0800
Subject: [PATCH 233/803] Update vue-i18n from 9.1.9 to 9.2.2, force to use
 production version of vue-i18n in order to improve the performance

---
 package-lock.json | 186 +++++++++++++++++-----------------------------
 package.json      |   2 +-
 src/i18n.js       |   2 +-
 3 files changed, 71 insertions(+), 119 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6053fa5f..44af1469 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.3",
+    "version": "1.18.4",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.18.3",
+            "version": "1.18.4",
             "license": "MIT",
             "dependencies": {
                 "@louislam/sqlite3": "~15.0.6",
@@ -103,7 +103,7 @@
                 "vue-chart-3": "3.0.9",
                 "vue-confirm-dialog": "~1.0.2",
                 "vue-contenteditable": "~3.0.4",
-                "vue-i18n": "~9.1.9",
+                "vue-i18n": "~9.2.2",
                 "vue-image-crop-upload": "~3.0.3",
                 "vue-multiselect": "~3.0.0-alpha.2",
                 "vue-prism-editor": "~2.0.0-alpha.2",
@@ -2338,92 +2338,65 @@
             "dev": true
         },
         "node_modules/@intlify/core-base": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.10.tgz",
-            "integrity": "sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz",
+            "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==",
             "dev": true,
             "dependencies": {
-                "@intlify/devtools-if": "9.1.10",
-                "@intlify/message-compiler": "9.1.10",
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/runtime": "9.1.10",
-                "@intlify/shared": "9.1.10",
-                "@intlify/vue-devtools": "9.1.10"
+                "@intlify/devtools-if": "9.2.2",
+                "@intlify/message-compiler": "9.2.2",
+                "@intlify/shared": "9.2.2",
+                "@intlify/vue-devtools": "9.2.2"
             },
             "engines": {
-                "node": ">= 10"
+                "node": ">= 14"
             }
         },
         "node_modules/@intlify/devtools-if": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.10.tgz",
-            "integrity": "sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz",
+            "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==",
             "dev": true,
             "dependencies": {
-                "@intlify/shared": "9.1.10"
+                "@intlify/shared": "9.2.2"
             },
             "engines": {
-                "node": ">= 10"
+                "node": ">= 14"
             }
         },
         "node_modules/@intlify/message-compiler": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.10.tgz",
-            "integrity": "sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz",
+            "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==",
             "dev": true,
             "dependencies": {
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/shared": "9.1.10",
+                "@intlify/shared": "9.2.2",
                 "source-map": "0.6.1"
             },
             "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@intlify/message-resolver": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.10.tgz",
-            "integrity": "sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==",
-            "dev": true,
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/@intlify/runtime": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.10.tgz",
-            "integrity": "sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==",
-            "dev": true,
-            "dependencies": {
-                "@intlify/message-compiler": "9.1.10",
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/shared": "9.1.10"
-            },
-            "engines": {
-                "node": ">= 10"
+                "node": ">= 14"
             }
         },
         "node_modules/@intlify/shared": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.10.tgz",
-            "integrity": "sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz",
+            "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==",
             "dev": true,
             "engines": {
-                "node": ">= 10"
+                "node": ">= 14"
             }
         },
         "node_modules/@intlify/vue-devtools": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.10.tgz",
-            "integrity": "sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz",
+            "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==",
             "dev": true,
             "dependencies": {
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/runtime": "9.1.10",
-                "@intlify/shared": "9.1.10"
+                "@intlify/core-base": "9.2.2",
+                "@intlify/shared": "9.2.2"
             },
             "engines": {
-                "node": ">= 10"
+                "node": ">= 14"
             }
         },
         "node_modules/@istanbuljs/load-nyc-config": {
@@ -16107,18 +16080,18 @@
             }
         },
         "node_modules/vue-i18n": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.1.10.tgz",
-            "integrity": "sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz",
+            "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==",
             "dev": true,
             "dependencies": {
-                "@intlify/core-base": "9.1.10",
-                "@intlify/shared": "9.1.10",
-                "@intlify/vue-devtools": "9.1.10",
-                "@vue/devtools-api": "^6.0.0-beta.7"
+                "@intlify/core-base": "9.2.2",
+                "@intlify/shared": "9.2.2",
+                "@intlify/vue-devtools": "9.2.2",
+                "@vue/devtools-api": "^6.2.1"
             },
             "engines": {
-                "node": ">= 10"
+                "node": ">= 14"
             },
             "peerDependencies": {
                 "vue": "^3.0.0"
@@ -18279,71 +18252,50 @@
             "dev": true
         },
         "@intlify/core-base": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.10.tgz",
-            "integrity": "sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz",
+            "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==",
             "dev": true,
             "requires": {
-                "@intlify/devtools-if": "9.1.10",
-                "@intlify/message-compiler": "9.1.10",
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/runtime": "9.1.10",
-                "@intlify/shared": "9.1.10",
-                "@intlify/vue-devtools": "9.1.10"
+                "@intlify/devtools-if": "9.2.2",
+                "@intlify/message-compiler": "9.2.2",
+                "@intlify/shared": "9.2.2",
+                "@intlify/vue-devtools": "9.2.2"
             }
         },
         "@intlify/devtools-if": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.10.tgz",
-            "integrity": "sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz",
+            "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==",
             "dev": true,
             "requires": {
-                "@intlify/shared": "9.1.10"
+                "@intlify/shared": "9.2.2"
             }
         },
         "@intlify/message-compiler": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.10.tgz",
-            "integrity": "sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz",
+            "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==",
             "dev": true,
             "requires": {
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/shared": "9.1.10",
+                "@intlify/shared": "9.2.2",
                 "source-map": "0.6.1"
             }
         },
-        "@intlify/message-resolver": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.10.tgz",
-            "integrity": "sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==",
-            "dev": true
-        },
-        "@intlify/runtime": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.10.tgz",
-            "integrity": "sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==",
-            "dev": true,
-            "requires": {
-                "@intlify/message-compiler": "9.1.10",
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/shared": "9.1.10"
-            }
-        },
         "@intlify/shared": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.10.tgz",
-            "integrity": "sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz",
+            "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==",
             "dev": true
         },
         "@intlify/vue-devtools": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.10.tgz",
-            "integrity": "sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz",
+            "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==",
             "dev": true,
             "requires": {
-                "@intlify/message-resolver": "9.1.10",
-                "@intlify/runtime": "9.1.10",
-                "@intlify/shared": "9.1.10"
+                "@intlify/core-base": "9.2.2",
+                "@intlify/shared": "9.2.2"
             }
         },
         "@istanbuljs/load-nyc-config": {
@@ -28795,15 +28747,15 @@
             }
         },
         "vue-i18n": {
-            "version": "9.1.10",
-            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.1.10.tgz",
-            "integrity": "sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==",
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz",
+            "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==",
             "dev": true,
             "requires": {
-                "@intlify/core-base": "9.1.10",
-                "@intlify/shared": "9.1.10",
-                "@intlify/vue-devtools": "9.1.10",
-                "@vue/devtools-api": "^6.0.0-beta.7"
+                "@intlify/core-base": "9.2.2",
+                "@intlify/shared": "9.2.2",
+                "@intlify/vue-devtools": "9.2.2",
+                "@vue/devtools-api": "^6.2.1"
             }
         },
         "vue-image-crop-upload": {
diff --git a/package.json b/package.json
index 180bea28..6f48fedd 100644
--- a/package.json
+++ b/package.json
@@ -157,7 +157,7 @@
         "vue-chart-3": "3.0.9",
         "vue-confirm-dialog": "~1.0.2",
         "vue-contenteditable": "~3.0.4",
-        "vue-i18n": "~9.1.9",
+        "vue-i18n": "~9.2.2",
         "vue-image-crop-upload": "~3.0.3",
         "vue-multiselect": "~3.0.0-alpha.2",
         "vue-prism-editor": "~2.0.0-alpha.2",
diff --git a/src/i18n.js b/src/i18n.js
index 4c19eb00..902177cf 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -1,4 +1,4 @@
-import { createI18n } from "vue-i18n/index";
+import { createI18n } from "vue-i18n/dist/vue-i18n.esm-browser.prod.js";
 import en from "./languages/en";
 
 const languageList = {

From c1ccaa7a9feb3dfc9390039f86f183f077c78283 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 10 Oct 2022 20:48:11 +0800
Subject: [PATCH 234/803] WIP

---
 package-lock.json                             |  2 +-
 server/model/maintenance.js                   | 32 +++++---------
 server/model/maintenance_timeslot.js          |  6 +++
 .../maintenance-socket-handler.js             | 13 +++---
 server/util-server.js                         | 26 +++++++++--
 src/languages/en.js                           |  1 +
 src/pages/EditMaintenance.vue                 | 15 +++----
 src/pages/ManageMaintenance.vue               | 43 ++++++++++++++++++-
 8 files changed, 93 insertions(+), 45 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f422d6a8..161208af 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -69,7 +69,7 @@
                 "@vitejs/plugin-legacy": "~2.1.0",
                 "@vitejs/plugin-vue": "~3.1.0",
                 "@vue/compiler-sfc": "~3.2.36",
-                "@vuepic/vue-datepicker": "^3.4.8",
+                "@vuepic/vue-datepicker": "~3.4.8",
                 "aedes": "^0.46.3",
                 "babel-plugin-rewire": "~1.2.0",
                 "bootstrap": "5.1.3",
diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 840267ef..d46b9d4b 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -1,5 +1,5 @@
 const { BeanModel } = require("redbean-node/dist/bean-model");
-const { parseTimeObject, parseTimeFromTimeObject, isoToUTCDateTime, utcToISODateTime, SQL_DATETIME_FORMAT, utcToLocal, localToUTC } = require("../../src/util");
+const { parseTimeObject, parseTimeFromTimeObject, utcToLocal, localToUTC } = require("../../src/util");
 const { isArray } = require("chart.js/helpers");
 const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
 
@@ -11,7 +11,7 @@ class Maintenance extends BeanModel {
      * @param {string} timezone If not specified, the timeRange will be in UTC
      * @returns {Object}
      */
-    async toPublicJSON(timezone = null) {
+    async toPublicJSON() {
 
         let dateRange = [];
         if (this.start_date) {
@@ -22,21 +22,11 @@ class Maintenance extends BeanModel {
         }
 
         let timeRange = [];
-        let startTime = parseTimeObject(this.start_time);
+        let startTime = timeObjectToLocal(parseTimeObject(this.start_time));
         timeRange.push(startTime);
-        let endTime = parseTimeObject(this.end_time);
+        let endTime = timeObjectToLocal(parseTimeObject(this.end_time));
         timeRange.push(endTime);
 
-        // Apply timezone offset
-        if (timezone) {
-            if (this.start_time) {
-                timeObjectToLocal(startTime, timezone);
-            }
-            if (this.end_time) {
-                timeObjectToLocal(endTime, timezone);
-            }
-        }
-
         let obj = {
             id: this.id,
             title: this.title,
@@ -70,18 +60,16 @@ class Maintenance extends BeanModel {
         return this.toPublicJSON(timezone);
     }
 
-    static jsonToBean(bean, obj, timezone) {
+    static jsonToBean(bean, obj) {
         if (obj.id) {
             bean.id = obj.id;
         }
 
         // Apply timezone offset to timeRange, as it cannot apply automatically.
-        if (timezone) {
-            if (obj.timeRange[0]) {
-                timeObjectToUTC(obj.timeRange[0], timezone);
-                if (obj.timeRange[1]) {
-                    timeObjectToUTC(obj.timeRange[1], timezone);
-                }
+        if (obj.timeRange[0]) {
+            timeObjectToUTC(obj.timeRange[0]);
+            if (obj.timeRange[1]) {
+                timeObjectToUTC(obj.timeRange[1]);
             }
         }
 
@@ -118,7 +106,7 @@ class Maintenance extends BeanModel {
             (maintenance_timeslot.start_date <= DATETIME('now')
             AND maintenance_timeslot.end_date >= DATETIME('now')
             AND maintenance.active = 1)
-            AND
+            OR
             (maintenance.strategy = 'manual' AND active = 1)
 
         `;
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index 0ac5158d..4db3a1db 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -40,6 +40,12 @@ class MaintenanceTimeslot extends BeanModel {
             bean.end_date = maintenance.end_date;
             bean.generated_next = true;
             await R.store(bean);
+        } else if (maintenance.strategy === "recurring-interval") {
+            // TODO
+        } else if (maintenance.strategy === "recurring-weekday") {
+            // TODO
+        } else if (maintenance.strategy === "recurring-day-of-month") {
+            // TODO
         } else {
             throw new Error("Unknown maintenance strategy");
         }
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index 9ae36b5c..49527f23 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -5,7 +5,6 @@ const apicache = require("../modules/apicache");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const Maintenance = require("../model/maintenance");
 const server = UptimeKumaServer.getInstance();
-const dayjs = require("dayjs");
 const MaintenanceTimeslot = require("../model/maintenance_timeslot");
 
 /**
@@ -14,13 +13,13 @@ const MaintenanceTimeslot = require("../model/maintenance_timeslot");
  */
 module.exports.maintenanceSocketHandler = (socket) => {
     // Add a new maintenance
-    socket.on("addMaintenance", async (maintenance, timezone, callback) => {
+    socket.on("addMaintenance", async (maintenance, callback) => {
         try {
             checkLogin(socket);
 
             log.debug("maintenance", maintenance);
 
-            let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance, timezone);
+            let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance);
             bean.user_id = socket.userID;
             let maintenanceID = await R.store(bean);
             await MaintenanceTimeslot.generateTimeslot(bean);
@@ -42,7 +41,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
     });
 
     // Edit a maintenance
-    socket.on("editMaintenance", async (maintenance, timezone, callback) => {
+    socket.on("editMaintenance", async (maintenance, callback) => {
         try {
             checkLogin(socket);
 
@@ -52,7 +51,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
                 throw new Error("Permission denied.");
             }
 
-            Maintenance.jsonToBean(bean, maintenance, timezone);
+            Maintenance.jsonToBean(bean, maintenance);
 
             await R.store(bean);
             await MaintenanceTimeslot.generateTimeslot(bean, null, true);
@@ -142,7 +141,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
         }
     });
 
-    socket.on("getMaintenance", async (maintenanceID, timezone, callback) => {
+    socket.on("getMaintenance", async (maintenanceID, callback) => {
         try {
             checkLogin(socket);
 
@@ -155,7 +154,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
 
             callback({
                 ok: true,
-                maintenance: await bean.toJSON(timezone),
+                maintenance: await bean.toJSON(),
             });
 
         } catch (e) {
diff --git a/server/util-server.js b/server/util-server.js
index ddb9dab5..7c81cde7 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -648,8 +648,14 @@ module.exports.send403 = (res, msg = "") => {
 };
 
 function timeObjectConvertTimezone(obj, timezone, timeObjectToUTC = true) {
-    // e.g. +08:00
-    let offsetString = dayjs().tz(timezone).format("Z");
+    let offsetString;
+
+    if (timezone) {
+        offsetString = dayjs().tz(timezone).format("Z");
+    } else {
+        offsetString = dayjs().format("Z");
+    }
+
     let hours = parseInt(offsetString.substring(1, 3));
     let minutes = parseInt(offsetString.substring(4, 6));
 
@@ -680,10 +686,22 @@ function timeObjectConvertTimezone(obj, timezone, timeObjectToUTC = true) {
     return obj;
 }
 
-module.exports.timeObjectToUTC = (obj, timezone) => {
+/**
+ *
+ * @param {object} obj
+ * @param {string} timezone
+ * @returns {object}
+ */
+module.exports.timeObjectToUTC = (obj, timezone = undefined) => {
     return timeObjectConvertTimezone(obj, timezone, true);
 };
 
-module.exports.timeObjectToLocal = (obj, timezone) => {
+/**
+ *
+ * @param {object} obj
+ * @param {string} timezone
+ * @returns {object}
+ */
+module.exports.timeObjectToLocal = (obj, timezone = undefined) => {
     return timeObjectConvertTimezone(obj, timezone, false);
 };
diff --git a/src/languages/en.js b/src/languages/en.js
index d6a65b04..835fa248 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -630,4 +630,5 @@ export default {
     lastDay2: "2nd Last Day of Month",
     lastDay3: "3rd Last Day of Month",
     lastDay4: "4th Last Day of Month",
+    "No Maintenance": "No Maintenance",
 };
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 946059cb..790588d8 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -200,7 +200,8 @@
                                         :monthChangeOnScroll="false"
                                         :minDate="minDate"
                                         :enableTimePicker="false"
-                                        :utc="true"
+                                        format="yyyy-MM-dd"
+                                        modelType="yyyy-MM-dd HH:mm:ss"
                                     />
                                 </div>
                             </template>
@@ -356,9 +357,6 @@ export default {
     },
     methods: {
         init() {
-            // Use browser's timezone!
-            let timezone = dayjs.tz.guess();
-
             this.affectedMonitors = [];
             this.selectedStatusPages = [];
 
@@ -381,7 +379,7 @@ export default {
                     daysOfMonth: [],
                 };
             } else if (this.isEdit) {
-                this.$root.getSocket().emit("getMaintenance", this.$route.params.id, timezone, (res) => {
+                this.$root.getSocket().emit("getMaintenance", this.$route.params.id, (res) => {
                     if (res.ok) {
                         this.maintenance = res.maintenance;
 
@@ -440,11 +438,8 @@ export default {
             this.maintenance.end_date = this.$root.toUTC(this.maintenance.end_date);
             */
 
-            // Use browser's timezone!
-            let timezone = dayjs.tz.guess();
-
             if (this.isAdd) {
-                this.$root.addMaintenance(this.maintenance, timezone, async (res) => {
+                this.$root.addMaintenance(this.maintenance, async (res) => {
                     if (res.ok) {
                         await this.addMonitorMaintenance(res.maintenanceID, async () => {
                             await this.addMaintenanceStatusPage(res.maintenanceID, () => {
@@ -461,7 +456,7 @@ export default {
 
                 });
             } else {
-                this.$root.getSocket().emit("editMaintenance", this.maintenance, timezone, async (res) => {
+                this.$root.getSocket().emit("editMaintenance", this.maintenance, async (res) => {
                     if (res.ok) {
                         await this.addMonitorMaintenance(res.maintenanceID, async () => {
                             await this.addMaintenanceStatusPage(res.maintenanceID, () => {
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index 4bfa9059..51e3ee28 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -13,7 +13,7 @@
 
             <div class="shadow-box">
                 <span v-if="Object.keys(sortedMaintenanceList).length === 0" class="d-flex align-items-center justify-content-center my-3">
-                    {{ $t("No maintenance") }}
+                    {{ $t("No Maintenance") }}
                 </span>
 
                 <div
@@ -34,9 +34,19 @@
 
                     <div class="buttons">
                         <router-link v-if="false" :to="maintenanceURL(item.id)" class="btn btn-light">{{ $t("Details") }}</router-link>
+
+                        <button v-if="item.active" class="btn btn-light" @click="pauseDialog">
+                            <font-awesome-icon icon="pause" /> {{ $t("Pause") }}
+                        </button>
+
+                        <button v-if="!item.active" class="btn btn-primary" @click="resumeMaintenance">
+                            <font-awesome-icon icon="play" /> {{ $t("Resume") }}
+                        </button>
+
                         <router-link :to="'/maintenance/edit/' + item.id" class="btn btn-secondary">
                             <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
                         </router-link>
+
                         <button class="btn btn-danger" @click="deleteDialog(item.id)">
                             <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
                         </button>
@@ -48,6 +58,10 @@
                 <a href="https://github.com/louislam/uptime-kuma/wiki/Maintenance" target="_blank">Learn More</a>
             </div>
 
+            <Confirm ref="confirmPause" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="pauseMaintenance">
+                {{ $t("pauseMaintenanceMsg") }}
+            </Confirm>
+
             <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteMaintenance">
                 {{ $t("deleteMaintenanceMsg") }}
             </Confirm>
@@ -148,6 +162,33 @@ export default {
                 }
             });
         },
+
+        /**
+         * Show dialog to confirm pause
+         */
+        pauseDialog() {
+            this.$refs.confirmPause.show();
+        },
+
+        /**
+         * Pause maintenance
+         */
+        pauseMonitor() {
+            return;
+            this.$root.getSocket().emit("pauseMaintenance", selectedMaintenanceID, (res) => {
+                this.$root.toastRes(res);
+            });
+        },
+
+        /**
+         * Resume maintenance
+         */
+        resumeMaintenance() {
+            return;
+            this.$root.getSocket().emit("resumeMaintenance", selectedMaintenanceID, (res) => {
+                this.$root.toastRes(res);
+            });
+        },
     },
 };
 </script>

From c84de4d2598c363b4a45ab0ddef09ca8c50b11c4 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 01:45:30 +0800
Subject: [PATCH 235/803] WIP: Add maintenance status

---
 server/model/maintenance.js     | 53 ++++++++++++++++++++++-
 server/model/monitor.js         |  6 +--
 src/assets/app.scss             | 14 ++++++
 src/layouts/Layout.vue          |  2 +-
 src/mixins/datetime.js          |  4 --
 src/pages/ManageMaintenance.vue | 77 ++++++++++++++++-----------------
 6 files changed, 108 insertions(+), 48 deletions(-)

diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index d46b9d4b..2ab2a5bb 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -2,13 +2,14 @@ const { BeanModel } = require("redbean-node/dist/bean-model");
 const { parseTimeObject, parseTimeFromTimeObject, utcToLocal, localToUTC } = require("../../src/util");
 const { isArray } = require("chart.js/helpers");
 const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
+const { R } = require("redbean-node");
+const dayjs = require("dayjs");
 
 class Maintenance extends BeanModel {
 
     /**
      * Return an object that ready to parse to JSON for public
      * Only show necessary data to public
-     * @param {string} timezone If not specified, the timeRange will be in UTC
      * @returns {Object}
      */
     async toPublicJSON() {
@@ -38,6 +39,7 @@ class Maintenance extends BeanModel {
             timeRange: timeRange,
             weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [],
             daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [],
+            timeslotList: await this.getTimeslotList(),
         };
 
         if (!isArray(obj.weekdays)) {
@@ -48,9 +50,45 @@ class Maintenance extends BeanModel {
             obj.daysOfMonth = [];
         }
 
+        // Maintenance Status
+        if (!obj.active) {
+            obj.status = "inactive";
+        } else if (obj.strategy === "manual" || obj.timeslotList.length > 0) {
+            for (let timeslot of obj.timeslotList) {
+                if (dayjs.utc(timeslot.start_date) <= dayjs.utc() && dayjs.utc(timeslot.end_date) >= dayjs.utc()) {
+                    obj.status = "under-maintenance";
+                    break;
+                }
+            }
+
+            if (!obj.status) {
+                obj.status = "scheduled";
+            }
+        } else if (obj.timeslotList.length === 0) {
+            obj.status = "ended";
+        } else {
+            obj.status = "unknown";
+        }
+
         return obj;
     }
 
+    /**
+     * Only get future or current timeslots only
+     * @returns {Promise<[]>}
+     */
+    async getTimeslotList() {
+        return await R.getAll(`
+            SELECT maintenance_timeslot.*
+            FROM maintenance_timeslot, maintenance
+            WHERE maintenance_timeslot.maintenance_id = maintenance.id
+            AND maintenance.id = ?
+            AND ${Maintenance.getActiveAndFutureMaintenanceSQLCondition()}
+        `, [
+            this.id
+        ]);
+    }
+
     /**
      * Return an object that ready to parse to JSON
      * @param {string} timezone If not specified, the timeRange will be in UTC
@@ -111,6 +149,19 @@ class Maintenance extends BeanModel {
 
         `;
     }
+
+    /**
+     * SQL conditions for active and future maintenance
+     * @returns {string}
+     */
+    static getActiveAndFutureMaintenanceSQLCondition() {
+        return `
+            (maintenance_timeslot.end_date >= DATETIME('now')
+            AND maintenance.active = 1)
+            OR
+            (maintenance.strategy = 'manual' AND active = 1)
+        `;
+    }
 }
 
 module.exports = Maintenance;
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 4c51d220..d77c5529 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1109,10 +1109,10 @@ class Monitor extends BeanModel {
             FROM monitor_maintenance mm
             JOIN maintenance
                 ON mm.maintenance_id = maintenance.id
-            JOIN maintenance_timeslot
+                AND mm.monitor_id = ?
+            LEFT JOIN maintenance_timeslot
                 ON maintenance_timeslot.maintenance_id = maintenance.id
-            WHERE mm.monitor_id = ?
-              AND ${activeCondition}
+            WHERE ${activeCondition}
             LIMIT 1`, [ monitorID ]);
         return maintenance.count !== 0;
     }
diff --git a/src/assets/app.scss b/src/assets/app.scss
index 81cf7724..be324afd 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -269,6 +269,20 @@ optgroup {
         color: white;
     }
 
+    .btn-normal {
+        $bg-color: $dark-header-bg;
+
+        color: $dark-font-color;
+        background-color: $bg-color;
+        border-color: $bg-color;
+
+        &:hover {
+            $hover-color: darken($bg-color, 3%);
+            background-color: $hover-color;
+            border-color: $hover-color;
+        }
+    }
+
     .btn-warning {
         color: $dark-font-color2;
 
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index 7ece4982..acd9446c 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -58,7 +58,7 @@
                             </li>
 
                             <li>
-                                <router-link to="/settings" class="dropdown-item" :class="{ active: $route.path.includes('settings') }">
+                                <router-link to="/settings/general" class="dropdown-item" :class="{ active: $route.path.includes('settings') }">
                                     <font-awesome-icon icon="cog" /> {{ $t("Settings") }}
                                 </router-link>
                             </li>
diff --git a/src/mixins/datetime.js b/src/mixins/datetime.js
index 3bbe1130..4fa2fa83 100644
--- a/src/mixins/datetime.js
+++ b/src/mixins/datetime.js
@@ -12,10 +12,6 @@ export default {
     },
 
     methods: {
-        isActiveMaintenance(endDate) {
-            return (dayjs.utc(endDate).unix() >= dayjs.utc().unix());
-        },
-
         toUTC(value) {
             return dayjs.tz(value, this.timezone).utc().format();
         },
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index 51e3ee28..28bea9b8 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -20,7 +20,7 @@
                     v-for="(item, index) in sortedMaintenanceList"
                     :key="index"
                     class="item"
-                    :class="{ 'ended': !$root.isActiveMaintenance(item.end_date) }"
+                    :class="item.status"
                 >
                     <div class="left-part">
                         <div
@@ -35,7 +35,7 @@
                     <div class="buttons">
                         <router-link v-if="false" :to="maintenanceURL(item.id)" class="btn btn-light">{{ $t("Details") }}</router-link>
 
-                        <button v-if="item.active" class="btn btn-light" @click="pauseDialog">
+                        <button v-if="item.active" class="btn btn-normal" @click="pauseDialog">
                             <font-awesome-icon icon="pause" /> {{ $t("Pause") }}
                         </button>
 
@@ -43,7 +43,7 @@
                             <font-awesome-icon icon="play" /> {{ $t("Resume") }}
                         </button>
 
-                        <router-link :to="'/maintenance/edit/' + item.id" class="btn btn-secondary">
+                        <router-link :to="'/maintenance/edit/' + item.id" class="btn btn-normal">
                             <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
                         </router-link>
 
@@ -90,36 +90,6 @@ export default {
             let result = Object.values(this.$root.maintenanceList);
 
             result.sort((m1, m2) => {
-
-                if (this.$root.isActiveMaintenance(m1.end_date) !== this.$root.isActiveMaintenance(m2.end_date)) {
-                    if (!this.$root.isActiveMaintenance(m2.end_date)) {
-                        return -1;
-                    }
-                    if (!this.$root.isActiveMaintenance(m1.end_date)) {
-                        return 1;
-                    }
-                }
-
-                if (this.$root.isActiveMaintenance(m1.end_date) && this.$root.isActiveMaintenance(m2.end_date)) {
-                    if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
-                        return -1;
-                    }
-
-                    if (Date.parse(m2.end_date) < Date.parse(m1.end_date)) {
-                        return 1;
-                    }
-                }
-
-                if (!this.$root.isActiveMaintenance(m1.end_date) && !this.$root.isActiveMaintenance(m2.end_date)) {
-                    if (Date.parse(m1.end_date) < Date.parse(m2.end_date)) {
-                        return 1;
-                    }
-
-                    if (Date.parse(m2.end_date) < Date.parse(m1.end_date)) {
-                        return -1;
-                    }
-                }
-
                 return m1.title.localeCompare(m2.title);
             });
 
@@ -173,7 +143,7 @@ export default {
         /**
          * Pause maintenance
          */
-        pauseMonitor() {
+        pauseMaintenance() {
             return;
             this.$root.getSocket().emit("pauseMaintenance", selectedMaintenanceID, (res) => {
                 this.$root.toastRes(res);
@@ -211,13 +181,43 @@ export default {
             background-color: $highlight-white;
         }
 
+        &.under-maintenance {
+            background-color: rgba(23, 71, 245, 0.16);
+
+            &:hover {
+                background-color: rgba(23, 71, 245, 0.3) !important;
+            }
+
+            .circle {
+                background-color: $maintenance;
+            }
+        }
+
+        &.scheduled {
+            .circle {
+                background-color: $primary;
+            }
+        }
+
+        &.inactive {
+            .circle {
+                background-color: $danger;
+            }
+        }
+
         &.ended {
             .left-part {
-                opacity: 0.5;
+                opacity: 0.3;
+            }
 
-                .circle {
-                    background-color: $dark-font-color;
-                }
+            .circle {
+                background-color: $dark-font-color;
+            }
+        }
+
+        &.unknown {
+            .circle {
+                background-color: $dark-font-color;
             }
         }
 
@@ -230,7 +230,6 @@ export default {
                 width: 25px;
                 height: 25px;
                 border-radius: 50rem;
-                background-color: $maintenance;
             }
 
             .info {

From d5c02fc627e87a301eb4d7e9ff6466f05424773d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 01:59:47 +0800
Subject: [PATCH 236/803] Update Maintenance list order by status

---
 src/pages/ManageMaintenance.vue | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index 28bea9b8..5820aada 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -83,6 +83,13 @@ export default {
     data() {
         return {
             selectedMaintenanceID: undefined,
+            statusOrderList: {
+                "under-maintenance": 1000,
+                "scheduled": 900,
+                "inactive": 800,
+                "ended": 700,
+                "unknown": 0,
+            }
         };
     },
     computed: {
@@ -90,7 +97,11 @@ export default {
             let result = Object.values(this.$root.maintenanceList);
 
             result.sort((m1, m2) => {
-                return m1.title.localeCompare(m2.title);
+                if (this.statusOrderList[m1.status] === this.statusOrderList[m2.status]) {
+                    return m1.title.localeCompare(m2.title);
+                } else {
+                    return this.statusOrderList[m1.status] < this.statusOrderList[m2.status];
+                }
             });
 
             return result;

From 2ee8378814d5cf92dceabcf2d9e4e79505001f16 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 02:32:57 +0800
Subject: [PATCH 237/803] Update to 1.18.5

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

diff --git a/package.json b/package.json
index 6f48fedd..b1a76d36 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.4",
+    "version": "1.18.5",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -38,7 +38,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.18.4 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.18.5 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 2271ac4a5a181bfcb0c8836a3a6f812215e03685 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 14:52:47 +0800
Subject: [PATCH 238/803] Add info.serverTimezoneOffset and improve some styles

---
 package-lock.json               |  4 ++--
 server/client.js                |  2 ++
 src/assets/app.scss             |  5 +++++
 src/pages/EditMaintenance.vue   |  4 ++--
 src/pages/ManageMaintenance.vue | 26 ++++++++++++++------------
 src/util.js                     |  1 -
 src/util.ts                     |  1 -
 7 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 161208af..0b9454ae 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.4",
+    "version": "1.18.5",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.18.4",
+            "version": "1.18.5",
             "license": "MIT",
             "dependencies": {
                 "@louislam/sqlite3": "~15.0.6",
diff --git a/server/client.js b/server/client.js
index 795b3ad4..dcc778df 100644
--- a/server/client.js
+++ b/server/client.js
@@ -8,6 +8,7 @@ const server = UptimeKumaServer.getInstance();
 const io = server.io;
 const { setting } = require("./util-server");
 const checkVersion = require("./check-version");
+const dayjs = require("dayjs");
 
 /**
  * Send list of notification providers to client
@@ -124,6 +125,7 @@ async function sendInfo(socket) {
         latestVersion: checkVersion.latestVersion,
         primaryBaseURL: await setting("primaryBaseURL"),
         serverTimezone: await server.getTimezone(),
+        serverTimezoneOffset: dayjs().format("Z"),
     });
 }
 
diff --git a/src/assets/app.scss b/src/assets/app.scss
index be324afd..7eb95931 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -101,6 +101,11 @@ optgroup {
     }
 }
 
+// Override Bootstrap
+.btn-group > .btn:hover {
+    z-index: initial;
+}
+
 .btn {
     padding-left: 20px;
     padding-right: 20px;
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 790588d8..24229293 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -5,7 +5,7 @@
             <form @submit.prevent="submit">
                 <div class="shadow-box">
                     <div class="row">
-                        <div class="col-xl-7">
+                        <div class="col-xl-10">
                             <!-- Title -->
                             <div class="mb-3">
                                 <label for="name" class="form-label">{{ $t("Title") }}</label>
@@ -82,7 +82,7 @@
 
                             <h2 class="mt-5">{{ $t("Date and Time") }}</h2>
 
-                            <div>⚠️ {{ $t("warningTimezone") }}: {{ $root.info.serverTimezone }}</div>
+                            <div>⚠️ {{ $t("warningTimezone") }}: <mark>{{ $root.info.serverTimezone }} ({{ $root.info.serverTimezoneOffset }})</mark></div>
 
                             <!-- Strategy -->
                             <div class="my-3">
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index 5820aada..725e94b0 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -35,21 +35,23 @@
                     <div class="buttons">
                         <router-link v-if="false" :to="maintenanceURL(item.id)" class="btn btn-light">{{ $t("Details") }}</router-link>
 
-                        <button v-if="item.active" class="btn btn-normal" @click="pauseDialog">
-                            <font-awesome-icon icon="pause" /> {{ $t("Pause") }}
-                        </button>
+                        <div class="btn-group" role="group">
+                            <button v-if="item.active" class="btn btn-normal" @click="pauseDialog">
+                                <font-awesome-icon icon="pause" /> {{ $t("Pause") }}
+                            </button>
 
-                        <button v-if="!item.active" class="btn btn-primary" @click="resumeMaintenance">
-                            <font-awesome-icon icon="play" /> {{ $t("Resume") }}
-                        </button>
+                            <button v-if="!item.active" class="btn btn-primary" @click="resumeMaintenance">
+                                <font-awesome-icon icon="play" /> {{ $t("Resume") }}
+                            </button>
 
-                        <router-link :to="'/maintenance/edit/' + item.id" class="btn btn-normal">
-                            <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
-                        </router-link>
+                            <router-link :to="'/maintenance/edit/' + item.id" class="btn btn-normal">
+                                <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
+                            </router-link>
 
-                        <button class="btn btn-danger" @click="deleteDialog(item.id)">
-                            <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
-                        </button>
+                            <button class="btn btn-danger" @click="deleteDialog(item.id)">
+                                <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
+                            </button>
+                        </div>
                     </div>
                 </div>
             </div>
diff --git a/src/util.js b/src/util.js
index ec2d2322..2213d4d0 100644
--- a/src/util.js
+++ b/src/util.js
@@ -363,7 +363,6 @@ function utcToISODateTime(input) {
     return dayjs.utc(input).toISOString();
 }
 exports.utcToISODateTime = utcToISODateTime;
-/**
 /**
  * For SQL_DATETIME_FORMAT
  */
diff --git a/src/util.ts b/src/util.ts
index 34e0905d..966383f8 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -409,7 +409,6 @@ export function utcToISODateTime(input : string) {
     return dayjs.utc(input).toISOString();
 }
 
-/**
 /**
  * For SQL_DATETIME_FORMAT
  */

From 180d881ac122fb8f85805153f2342725a4843851 Mon Sep 17 00:00:00 2001
From: Alexander Borzov <59200516+Borzoff@users.noreply.github.com>
Date: Tue, 11 Oct 2022 10:35:08 +0300
Subject: [PATCH 239/803] Update ru-RU.js (#2217)

---
 src/languages/ru-RU.js | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js
index 0aaf0968..6922f51b 100644
--- a/src/languages/ru-RU.js
+++ b/src/languages/ru-RU.js
@@ -393,6 +393,12 @@ export default {
     alertaAlertState: "Состояние алерта",
     alertaRecoverState: "Состояние восстановления",
     Proxies: "Прокси",
+    "Setup Proxy": "Настройка Прокси",
+    "Proxy Protocol": "Протокол Прокси",
+    "Proxy Server": "Прокси",
+    "Proxy server has authentication": "Прокси имеет аутентификацию",
+    "Reverse Proxy": "Обратный прокси",
+    "No Proxy": "Без прокси",
     default: "По умолчанию",
     enabled: "Включено",
     setAsDefault: "Установлено по умолчанию",

From 1e8a16504b7454f0e53692f948548280445b1449 Mon Sep 17 00:00:00 2001
From: Christian Meis <christian.meis@online-service.de>
Date: Tue, 11 Oct 2022 11:15:33 +0200
Subject: [PATCH 240/803] Make icon optional for ntfy notificaation provider.
 Add Icon header to ntfy request only, if icon is actually defined.

---
 server/notification-providers/ntfy.js | 11 +++++++----
 src/components/notifications/Ntfy.vue |  2 +-
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/server/notification-providers/ntfy.js b/server/notification-providers/ntfy.js
index 3288d8fb..64064f57 100644
--- a/server/notification-providers/ntfy.js
+++ b/server/notification-providers/ntfy.js
@@ -7,15 +7,18 @@ class Ntfy extends NotificationProvider {
 
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
-        try {
-            await axios.post(`${notification.ntfyserverurl}`, {
+        var ntfyparams = {
                 "topic": notification.ntfytopic,
                 "message": msg,
                 "priority": notification.ntfyPriority || 4,
                 "title": "Uptime-Kuma",
-                "icon": notification.ntfyIcon || "",
-            });
+        };
+        if (notification.ntfyIcon) {
+        	ntfyparams.icon = notification.ntfyIcon;
+	    }
 
+        try {
+            await axios.post(`${notification.ntfyserverurl}`, ntfyparams);
             return okMsg;
 
         } catch (error) {
diff --git a/src/components/notifications/Ntfy.vue b/src/components/notifications/Ntfy.vue
index 4728f891..5764429f 100644
--- a/src/components/notifications/Ntfy.vue
+++ b/src/components/notifications/Ntfy.vue
@@ -19,7 +19,7 @@
 
     <div class="mb-3">
         <label for="ntfy-icon" class="form-label">{{ $t("IconUrl") }}</label>
-        <input id="ntfy-icon" v-model="$parent.notification.ntfyIcon" type="text" class="form-control" required>
+        <input id="ntfy-icon" v-model="$parent.notification.ntfyIcon" type="text" class="form-control">
     </div>
 </template>
 

From e07aa982c34c5b72f08b9408aab08b39a8d49088 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 18:23:17 +0800
Subject: [PATCH 241/803] WIP

---
 server/client.js                              |  2 +-
 server/model/maintenance.js                   | 20 +++++---
 server/model/maintenance_timeslot.js          | 16 +++++-
 .../maintenance-socket-handler.js             | 50 +++++++++++++++++++
 server/uptime-kuma-server.js                  |  4 ++
 src/assets/app.scss                           | 18 +++++--
 src/languages/en.js                           |  6 +++
 src/pages/ManageMaintenance.vue               | 49 ++++++++++++++----
 src/util.js                                   | 11 ++--
 src/util.ts                                   |  9 ++--
 10 files changed, 152 insertions(+), 33 deletions(-)

diff --git a/server/client.js b/server/client.js
index dcc778df..bed2ba03 100644
--- a/server/client.js
+++ b/server/client.js
@@ -125,7 +125,7 @@ async function sendInfo(socket) {
         latestVersion: checkVersion.latestVersion,
         primaryBaseURL: await setting("primaryBaseURL"),
         serverTimezone: await server.getTimezone(),
-        serverTimezoneOffset: dayjs().format("Z"),
+        serverTimezoneOffset: server.getTimezoneOffset(),
     });
 }
 
diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 2ab2a5bb..4910d2a0 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -39,9 +39,15 @@ class Maintenance extends BeanModel {
             timeRange: timeRange,
             weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [],
             daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [],
-            timeslotList: await this.getTimeslotList(),
+            timeslotList: [],
         };
 
+        const timeslotList = await this.getTimeslotList();
+
+        for (let timeslot of timeslotList) {
+            obj.timeslotList.push(await timeslot.toPublicJSON());
+        }
+
         if (!isArray(obj.weekdays)) {
             obj.weekdays = [];
         }
@@ -53,7 +59,9 @@ class Maintenance extends BeanModel {
         // Maintenance Status
         if (!obj.active) {
             obj.status = "inactive";
-        } else if (obj.strategy === "manual" || obj.timeslotList.length > 0) {
+        } else if (obj.strategy === "manual") {
+            obj.status = "under-maintenance";
+        } else if (obj.timeslotList.length > 0) {
             for (let timeslot of obj.timeslotList) {
                 if (dayjs.utc(timeslot.start_date) <= dayjs.utc() && dayjs.utc(timeslot.end_date) >= dayjs.utc()) {
                     obj.status = "under-maintenance";
@@ -78,7 +86,7 @@ class Maintenance extends BeanModel {
      * @returns {Promise<[]>}
      */
     async getTimeslotList() {
-        return await R.getAll(`
+        return R.convertToBeans("maintenance_timeslot", await R.getAll(`
             SELECT maintenance_timeslot.*
             FROM maintenance_timeslot, maintenance
             WHERE maintenance_timeslot.maintenance_id = maintenance.id
@@ -86,7 +94,7 @@ class Maintenance extends BeanModel {
             AND ${Maintenance.getActiveAndFutureMaintenanceSQLCondition()}
         `, [
             this.id
-        ]);
+        ]));
     }
 
     /**
@@ -156,10 +164,10 @@ class Maintenance extends BeanModel {
      */
     static getActiveAndFutureMaintenanceSQLCondition() {
         return `
-            (maintenance_timeslot.end_date >= DATETIME('now')
+            ((maintenance_timeslot.end_date >= DATETIME('now')
             AND maintenance.active = 1)
             OR
-            (maintenance.strategy = 'manual' AND active = 1)
+            (maintenance.strategy = 'manual' AND active = 1))
         `;
     }
 }
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index 4db3a1db..f06806ac 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -1,16 +1,28 @@
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { R } = require("redbean-node");
 const dayjs = require("dayjs");
-const { log } = require("../../src/util");
+const { log, utcToLocal, SQL_DATETIME_FORMAT_WITHOUT_SECOND } = require("../../src/util");
+const { UptimeKumaServer } = require("../uptime-kuma-server");
 
 class MaintenanceTimeslot extends BeanModel {
 
     async toPublicJSON() {
+        const serverTimezoneOffset = await UptimeKumaServer.getInstance().getTimezoneOffset();
 
+        const obj = {
+            id: this.id,
+            startDate: this.start_date,
+            endDate: this.end_date,
+            startDateServerTimezone: utcToLocal(this.start_date, SQL_DATETIME_FORMAT_WITHOUT_SECOND),
+            endDateServerTimezone: utcToLocal(this.end_date, SQL_DATETIME_FORMAT_WITHOUT_SECOND),
+            serverTimezoneOffset,
+        };
+
+        return obj;
     }
 
     async toJSON() {
-
+        return await this.toPublicJSON();
     }
 
     /**
diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index 49527f23..5294050c 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -258,4 +258,54 @@ module.exports.maintenanceSocketHandler = (socket) => {
             });
         }
     });
+
+    socket.on("pauseMaintenance", async (maintenanceID, callback) => {
+        try {
+            checkLogin(socket);
+
+            log.debug("maintenance", `Pause Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+            await R.exec("UPDATE maintenance SET active = 0 WHERE id = ? ", [
+                maintenanceID,
+            ]);
+
+            callback({
+                ok: true,
+                msg: "Paused Successfully.",
+            });
+
+            await server.sendMaintenanceList(socket);
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    socket.on("resumeMaintenance", async (maintenanceID, callback) => {
+        try {
+            checkLogin(socket);
+
+            log.debug("maintenance", `Resume Maintenance: ${maintenanceID} User ID: ${socket.userID}`);
+
+            await R.exec("UPDATE maintenance SET active = 1 WHERE id = ? ", [
+                maintenanceID,
+            ]);
+
+            callback({
+                ok: true,
+                msg: "Resume Successfully",
+            });
+
+            await server.sendMaintenanceList(socket);
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
 };
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 15583159..667f6b6a 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -204,6 +204,10 @@ class UptimeKumaServer {
         }
     }
 
+    async getTimezoneOffset() {
+        return dayjs().format("Z");
+    }
+
     async setTimezone(timezone) {
         await Settings.set("serverTimezone", timezone, "general");
         process.env.TZ = timezone;
diff --git a/src/assets/app.scss b/src/assets/app.scss
index 7eb95931..7da76fff 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -101,11 +101,6 @@ optgroup {
     }
 }
 
-// Override Bootstrap
-.btn-group > .btn:hover {
-    z-index: initial;
-}
-
 .btn {
     padding-left: 20px;
     padding-right: 20px;
@@ -125,6 +120,19 @@ optgroup {
     }
 }
 
+.btn-normal {
+    $bg-color: #F5F5F5;
+
+    background-color: $bg-color;
+    border-color: $bg-color;
+
+    &:hover {
+        $hover-color: darken($bg-color, 3%);
+        background-color: $hover-color;
+        border-color: $hover-color;
+    }
+}
+
 .btn-warning {
     color: white;
 
diff --git a/src/languages/en.js b/src/languages/en.js
index 835fa248..a1c9b560 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -631,4 +631,10 @@ export default {
     lastDay3: "3rd Last Day of Month",
     lastDay4: "4th Last Day of Month",
     "No Maintenance": "No Maintenance",
+    pauseMaintenanceMsg: "Are you sure want to pause?",
+    "maintenanceStatus-under-maintenance": "Under Maintenance",
+    "maintenanceStatus-inactive": "Inactive",
+    "maintenanceStatus-scheduled": "Scheduled",
+    "maintenanceStatus-ended": "Ended",
+    "maintenanceStatus-unknown": "Unknown",
 };
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index 725e94b0..af9c0ba5 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -28,7 +28,18 @@
                         ></div>
                         <div class="info">
                             <div class="title">{{ item.title }}</div>
-                            <div>{{ item.description }}</div>
+                            <div v-if="false">{{ item.description }}</div>
+                            <div class="status">
+                                {{ $t("maintenanceStatus-" + item.status) }}
+                            </div>
+
+                            <div v-if="item.strategy === 'manual'" class="timeslot">
+                                {{ $t("Manual") }}
+                            </div>
+                            <div v-else-if="item.timeslotList.length > 0" class="timeslot">
+                                {{ item.timeslotList[0].startDateServerTimezone }} <span class="to">-</span> {{ item.timeslotList[0].endDateServerTimezone }}
+                                (UTC{{ item.timeslotList[0].serverTimezoneOffset }})
+                            </div>
                         </div>
                     </div>
 
@@ -36,11 +47,11 @@
                         <router-link v-if="false" :to="maintenanceURL(item.id)" class="btn btn-light">{{ $t("Details") }}</router-link>
 
                         <div class="btn-group" role="group">
-                            <button v-if="item.active" class="btn btn-normal" @click="pauseDialog">
+                            <button v-if="item.active" class="btn btn-normal" @click="pauseDialog(item.id)">
                                 <font-awesome-icon icon="pause" /> {{ $t("Pause") }}
                             </button>
 
-                            <button v-if="!item.active" class="btn btn-primary" @click="resumeMaintenance">
+                            <button v-if="!item.active" class="btn btn-primary" @click="resumeMaintenance(item.id)">
                                 <font-awesome-icon icon="play" /> {{ $t("Resume") }}
                             </button>
 
@@ -149,7 +160,8 @@ export default {
         /**
          * Show dialog to confirm pause
          */
-        pauseDialog() {
+        pauseDialog(maintenanceID) {
+            this.selectedMaintenanceID = maintenanceID;
             this.$refs.confirmPause.show();
         },
 
@@ -157,8 +169,7 @@ export default {
          * Pause maintenance
          */
         pauseMaintenance() {
-            return;
-            this.$root.getSocket().emit("pauseMaintenance", selectedMaintenanceID, (res) => {
+            this.$root.getSocket().emit("pauseMaintenance", this.selectedMaintenanceID, (res) => {
                 this.$root.toastRes(res);
             });
         },
@@ -166,9 +177,8 @@ export default {
         /**
          * Resume maintenance
          */
-        resumeMaintenance() {
-            return;
-            this.$root.getSocket().emit("resumeMaintenance", selectedMaintenanceID, (res) => {
+        resumeMaintenance(id) {
+            this.$root.getSocket().emit("resumeMaintenance", id, (res) => {
                 this.$root.toastRes(res);
             });
         },
@@ -189,6 +199,7 @@ export default {
         justify-content: space-between;
         padding: 10px;
         min-height: 90px;
+        margin-bottom: 5px;
 
         &:hover {
             background-color: $highlight-white;
@@ -251,9 +262,27 @@ export default {
                     font-size: 20px;
                 }
 
-                .slug {
+                .status {
                     font-size: 14px;
                 }
+
+                .timeslot {
+                    margin-top: 5px;
+                    display: inline-block;
+                    font-size: 14px;
+                    background-color: rgba(255, 255, 255, 0.5);
+                    border-radius: 20px;
+                    padding: 0 10px;
+
+                    .to {
+                        margin: 0 6px;
+                    }
+
+                    .dark & {
+                        color: white;
+                        background-color: rgba(255, 255, 255, 0.1);
+                    }
+                }
             }
         }
 
diff --git a/src/util.js b/src/util.js
index 2213d4d0..9cdecc17 100644
--- a/src/util.js
+++ b/src/util.js
@@ -7,7 +7,7 @@
 // Backend uses the compiled file util.js
 // Frontend uses util.ts
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.localToUTC = exports.utcToLocal = exports.utcToISODateTime = exports.isoToUTCDateTime = exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.SQL_DATETIME_FORMAT = exports.SQL_DATE_FORMAT = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
+exports.localToUTC = exports.utcToLocal = exports.utcToISODateTime = exports.isoToUTCDateTime = exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.SQL_DATETIME_FORMAT_WITHOUT_SECOND = exports.SQL_DATETIME_FORMAT = exports.SQL_DATE_FORMAT = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
 const dayjs = require("dayjs");
 exports.isDev = process.env.NODE_ENV === "development";
 exports.appName = "Uptime Kuma";
@@ -21,6 +21,7 @@ exports.STATUS_PAGE_PARTIAL_DOWN = 2;
 exports.STATUS_PAGE_MAINTENANCE = 3;
 exports.SQL_DATE_FORMAT = "YYYY-MM-DD";
 exports.SQL_DATETIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
+exports.SQL_DATETIME_FORMAT_WITHOUT_SECOND = "YYYY-MM-DD HH:mm";
 /** Flip the status of s */
 function flipStatus(s) {
     if (s === exports.UP) {
@@ -366,11 +367,11 @@ exports.utcToISODateTime = utcToISODateTime;
 /**
  * For SQL_DATETIME_FORMAT
  */
-function utcToLocal(input) {
-    return dayjs.utc(input).local().format(exports.SQL_DATETIME_FORMAT);
+function utcToLocal(input, format = exports.SQL_DATETIME_FORMAT) {
+    return dayjs.utc(input).local().format(format);
 }
 exports.utcToLocal = utcToLocal;
-function localToUTC(input) {
-    return dayjs(input).utc().format(exports.SQL_DATETIME_FORMAT);
+function localToUTC(input, format = exports.SQL_DATETIME_FORMAT) {
+    return dayjs(input).utc().format(format);
 }
 exports.localToUTC = localToUTC;
diff --git a/src/util.ts b/src/util.ts
index 966383f8..5d8acfcd 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -25,6 +25,7 @@ export const STATUS_PAGE_MAINTENANCE = 3;
 
 export const SQL_DATE_FORMAT = "YYYY-MM-DD";
 export const SQL_DATETIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
+export const SQL_DATETIME_FORMAT_WITHOUT_SECOND = "YYYY-MM-DD HH:mm";
 
 /** Flip the status of s */
 export function flipStatus(s: number) {
@@ -412,10 +413,10 @@ export function utcToISODateTime(input : string) {
 /**
  * For SQL_DATETIME_FORMAT
  */
-export function utcToLocal(input : string) {
-    return dayjs.utc(input).local().format(SQL_DATETIME_FORMAT);
+export function utcToLocal(input : string, format = SQL_DATETIME_FORMAT) {
+    return dayjs.utc(input).local().format(format);
 }
 
-export function localToUTC(input : string) {
-    return dayjs(input).utc().format(SQL_DATETIME_FORMAT);
+export function localToUTC(input : string, format = SQL_DATETIME_FORMAT) {
+    return dayjs(input).utc().format(format);
 }

From dfb75c8afb83aee87051966b87d4bb6312433e80 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 20:56:48 +0800
Subject: [PATCH 242/803] Update status page's maintenance message

---
 server/model/status_page.js        | 14 ++++----
 src/components/MaintenanceTime.vue | 44 +++++++++++++++++++++++++
 src/languages/en.js                |  6 ++--
 src/pages/EditMaintenance.vue      | 16 ---------
 src/pages/ManageMaintenance.vue    | 28 ++--------------
 src/pages/StatusPage.vue           | 53 +++++++++++++-----------------
 6 files changed, 80 insertions(+), 81 deletions(-)
 create mode 100644 src/components/MaintenanceTime.vue

diff --git a/server/model/status_page.js b/server/model/status_page.js
index a5a3a4b7..4e7b38cf 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -91,7 +91,7 @@ class StatusPage extends BeanModel {
             incident = incident.toPublicJSON();
         }
 
-        let maintenance = await StatusPage.getMaintenanceList(statusPage.id);
+        let maintenanceList = await StatusPage.getMaintenanceList(statusPage.id);
 
         // Public Group List
         const publicGroupList = [];
@@ -111,7 +111,7 @@ class StatusPage extends BeanModel {
             config: await statusPage.toPublicJSON(),
             incident,
             publicGroupList,
-            maintenance,
+            maintenanceList,
         };
     }
 
@@ -281,13 +281,13 @@ class StatusPage extends BeanModel {
 
             let activeCondition = Maintenance.getActiveMaintenanceSQLCondition();
             let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
-                SELECT m.*
-                FROM maintenance m, maintenance_status_page msp, maintenance_timeslot
-                WHERE  msp.maintenance_id = m.id
-                    AND maintenance_timeslot.maintenance.id = m.id
+                SELECT maintenance.*
+                FROM maintenance, maintenance_status_page msp, maintenance_timeslot
+                WHERE msp.maintenance_id = maintenance.id
+                    AND maintenance_timeslot.maintenance_id = maintenance.id
                     AND msp.status_page_id = ?
                     AND ${activeCondition}
-                ORDER BY m.end_date
+                ORDER BY maintenance.end_date
             `, [ statusPageId ]));
 
             for (const bean of maintenanceBeanList) {
diff --git a/src/components/MaintenanceTime.vue b/src/components/MaintenanceTime.vue
new file mode 100644
index 00000000..66ee4abf
--- /dev/null
+++ b/src/components/MaintenanceTime.vue
@@ -0,0 +1,44 @@
+<template>
+    <div class="timeslot">
+        <div v-if="maintenance.strategy === 'manual'">
+            {{ $t("Manual") }}
+        </div>
+        <div v-else-if="maintenance.timeslotList.length > 0">
+            {{ maintenance.timeslotList[0].startDateServerTimezone }}
+            <span class="to">-</span>
+            {{ maintenance.timeslotList[0].endDateServerTimezone }}
+            (UTC{{ maintenance.timeslotList[0].serverTimezoneOffset }})
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        maintenance: {
+            type: Object,
+            required: true
+        },
+    },
+};
+</script>
+
+<style lang="scss">
+.timeslot {
+    margin-top: 5px;
+    display: inline-block;
+    font-size: 14px;
+    background-color: rgba(255, 255, 255, 0.5);
+    border-radius: 20px;
+    padding: 0 10px;
+
+    .to {
+        margin: 0 6px;
+    }
+
+    .dark & {
+        color: white;
+        background-color: rgba(255, 255, 255, 0.1);
+    }
+}
+</style>
diff --git a/src/languages/en.js b/src/languages/en.js
index a1c9b560..a4c937e6 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -20,13 +20,10 @@ export default {
     "Selected status pages": "Selected status pages",
     "Select status pages...": "Select status pages...",
     recurringIntervalMessage: "Run once every day | Run once every {0} days",
-    "End": "End",
     affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
     affectedStatusPages: "Show this maintenance message on selected status pages",
     atLeastOneMonitor: "Select at least one affected monitor",
-    maintenanceInvalidDate: "Invalid maintenance end date entered",
     selectedStatusPagesDescription: "Select status pages to display maintenance info on",
-    atLeastOneStatusPage: "Select at least one status page",
     maintenanceTitleExample: "Network infrastructure maintenance",
     maintenanceDescriptionExample: "Example: Network infrastructure maintenance is underway which will affect some of our services.",
     passwordNotMatchMsg: "The repeat password does not match.",
@@ -637,4 +634,7 @@ export default {
     "maintenanceStatus-scheduled": "Scheduled",
     "maintenanceStatus-ended": "Ended",
     "maintenanceStatus-unknown": "Unknown",
+    "Display Timezone": "Display Timezone",
+    "Server Timezone": "Server Timezone",
+    statusPageMaintenanceEndDate: "End",
 };
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 24229293..71df19b1 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -422,22 +422,6 @@ export default {
                 return this.processing = false;
             }
 
-            /*
-            TODO: Temporary disable
-            if (this.maintenance.start_date >= this.maintenance.end_date) {
-                toast.error(this.$t("maintenanceInvalidDate"));
-                return this.processing = false;
-            }
-
-            if (!this.showOnAllPages && this.selectedStatusPages.length === 0) {
-                toast.error(this.$t("atLeastOneStatusPage"));
-                return this.processing = false;
-            }
-
-            this.maintenance.start_date = this.$root.toUTC(this.maintenance.start_date);
-            this.maintenance.end_date = this.$root.toUTC(this.maintenance.end_date);
-            */
-
             if (this.isAdd) {
                 this.$root.addMaintenance(this.maintenance, async (res) => {
                     if (res.ok) {
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index af9c0ba5..9ded0459 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -33,13 +33,7 @@
                                 {{ $t("maintenanceStatus-" + item.status) }}
                             </div>
 
-                            <div v-if="item.strategy === 'manual'" class="timeslot">
-                                {{ $t("Manual") }}
-                            </div>
-                            <div v-else-if="item.timeslotList.length > 0" class="timeslot">
-                                {{ item.timeslotList[0].startDateServerTimezone }} <span class="to">-</span> {{ item.timeslotList[0].endDateServerTimezone }}
-                                (UTC{{ item.timeslotList[0].serverTimezoneOffset }})
-                            </div>
+                            <MaintenanceTime :maintenance="item" />
                         </div>
                     </div>
 
@@ -86,11 +80,13 @@
 import { getResBaseURL } from "../util-frontend";
 import { getMaintenanceRelativeURL } from "../util.ts";
 import Confirm from "../components/Confirm.vue";
+import MaintenanceTime from "../components/MaintenanceTime.vue";
 import { useToast } from "vue-toastification";
 const toast = useToast();
 
 export default {
     components: {
+        MaintenanceTime,
         Confirm,
     },
     data() {
@@ -265,24 +261,6 @@ export default {
                 .status {
                     font-size: 14px;
                 }
-
-                .timeslot {
-                    margin-top: 5px;
-                    display: inline-block;
-                    font-size: 14px;
-                    background-color: rgba(255, 255, 255, 0.5);
-                    border-radius: 20px;
-                    padding: 0 10px;
-
-                    .to {
-                        margin: 0 6px;
-                    }
-
-                    .dark & {
-                        color: white;
-                        background-color: rgba(255, 255, 255, 0.1);
-                    }
-                }
             }
         }
 
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 699c236d..6cecf668 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -195,33 +195,6 @@
                 </div>
             </div>
 
-            <!-- Maintenance -->
-            <template v-if="maintenance.length">
-                <div
-                    v-for="maintenanceItem in maintenance" :key="maintenanceItem.id"
-                    class="shadow-box alert mb-4 p-3 bg-maintenance mt-4 position-relative" role="alert"
-                >
-                    <div class="item">
-                        <div class="row">
-                            <div class="col-1 col-md-1 d-flex justify-content-center align-items-center">
-                                <font-awesome-icon
-                                    icon="wrench"
-                                    class="maintenance-icon"
-                                />
-                            </div>
-                            <div class="col-11 col-md-11">
-                                <h4 class="alert-heading">{{ maintenanceItem.title }}</h4>
-                                <div class="content">{{ maintenanceItem.description }}</div>
-
-                                <div class="date mt-3">
-                                    {{ $t("End") }}: {{ $root.datetimeMaintenance(maintenanceItem.end_date) }}
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </template>
-
             <!-- Overall Status -->
             <div class="shadow-box list  p-4 overall-status mb-4">
                 <div v-if="Object.keys($root.publicMonitorList).length === 0 && loadedData">
@@ -247,7 +220,7 @@
 
                     <div v-else-if="isMaintenance">
                         <font-awesome-icon icon="wrench" class="status-maintenance" />
-                        {{ $t("Maintenance") }}
+                        {{ $t("maintenanceStatus-under-maintenance") }}
                     </div>
 
                     <div v-else>
@@ -256,6 +229,18 @@
                 </template>
             </div>
 
+            <!-- Maintenance -->
+            <template v-if="maintenanceList.length > 0">
+                <div
+                    v-for="maintenance in maintenanceList" :key="maintenance.id"
+                    class="shadow-box alert mb-4 p-3 bg-maintenance mt-4 position-relative" role="alert"
+                >
+                    <h4 class="alert-heading">{{ maintenance.title }}</h4>
+                    <div class="content">{{ maintenance.description }}</div>
+                    <MaintenanceTime :maintenance="maintenance" />
+                </div>
+            </template>
+
             <!-- Description -->
             <strong v-if="editMode">{{ $t("Description") }}:</strong>
             <Editable v-model="config.description" :contenteditable="editMode" tag="div" class="mb-4 description" />
@@ -327,6 +312,7 @@ import "vue-prism-editor/dist/prismeditor.min.css"; // import the styles somewhe
 import { useToast } from "vue-toastification";
 import Confirm from "../components/Confirm.vue";
 import PublicGroupList from "../components/PublicGroupList.vue";
+import MaintenanceTime from "../components/MaintenanceTime.vue";
 import { getResBaseURL } from "../util-frontend";
 import { STATUS_PAGE_ALL_DOWN, STATUS_PAGE_ALL_UP, STATUS_PAGE_MAINTENANCE, STATUS_PAGE_PARTIAL_DOWN, UP, MAINTENANCE } from "../util.ts";
 
@@ -348,6 +334,7 @@ export default {
         ImageCropUpload,
         Confirm,
         PrismEditor,
+        MaintenanceTime,
     },
 
     // Leave Page for vue route change
@@ -388,7 +375,7 @@ export default {
             loadedData: false,
             baseURL: "",
             clickedEditButton: false,
-            maintenance: [],
+            maintenanceList: [],
         };
     },
     computed: {
@@ -594,7 +581,7 @@ export default {
             }
 
             this.incident = res.data.incident;
-            this.maintenance = res.data.maintenance;
+            this.maintenanceList = res.data.maintenanceList;
             this.$root.publicGroupList = res.data.publicGroupList;
         }).catch( function (error) {
             if (error.response.status === 404) {
@@ -1069,4 +1056,10 @@ footer {
     }
 }
 
+.bg-maintenance {
+    .alert-heading {
+        font-weight: bold;
+    }
+}
+
 </style>

From 39b67251631176dbaf628ef5731133abd9c313a6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 21:48:43 +0800
Subject: [PATCH 243/803] Update maintenance tables

---
 db/patch-maintenance-table.sql       | 34 -----------------
 db/patch-maintenance-table2.sql      | 56 ++++++++++++++++++++++++++++
 server/database.js                   |  2 +-
 server/model/maintenance_timeslot.js |  2 +-
 server/uptime-kuma-server.js         |  2 +-
 5 files changed, 59 insertions(+), 37 deletions(-)
 delete mode 100644 db/patch-maintenance-table.sql
 create mode 100644 db/patch-maintenance-table2.sql

diff --git a/db/patch-maintenance-table.sql b/db/patch-maintenance-table.sql
deleted file mode 100644
index ce14f766..00000000
--- a/db/patch-maintenance-table.sql
+++ /dev/null
@@ -1,34 +0,0 @@
--- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
-BEGIN TRANSACTION;
-
-CREATE TABLE maintenance
-(
-    id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-    title       VARCHAR(150),
-    description TEXT,
-    user_id     INTEGER REFERENCES user ON UPDATE CASCADE ON DELETE SET NULL,
-    start_date  DATETIME,
-    end_date    DATETIME
-);
-
-CREATE TABLE monitor_maintenance
-(
-    id             INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-    monitor_id     INTEGER NOT NULL,
-    maintenance_id INTEGER NOT NULL,
-    CONSTRAINT FK_maintenance FOREIGN KEY (maintenance_id) REFERENCES maintenance (id) ON DELETE CASCADE ON UPDATE CASCADE,
-    CONSTRAINT FK_monitor FOREIGN KEY (monitor_id) REFERENCES monitor (id) ON DELETE CASCADE ON UPDATE CASCADE
-);
-
-CREATE TABLE maintenance_status_page
-(
-    id             INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-    status_page_id INTEGER NOT NULL,
-    maintenance_id INTEGER NOT NULL,
-    CONSTRAINT FK_maintenance FOREIGN KEY (maintenance_id) REFERENCES maintenance (id) ON DELETE CASCADE ON UPDATE CASCADE,
-    CONSTRAINT FK_status_page FOREIGN KEY (status_page_id) REFERENCES status_page (id) ON DELETE CASCADE ON UPDATE CASCADE
-);
-
-create index maintenance_user_id on maintenance (user_id);
-
-COMMIT;
diff --git a/db/patch-maintenance-table2.sql b/db/patch-maintenance-table2.sql
new file mode 100644
index 00000000..76644596
--- /dev/null
+++ b/db/patch-maintenance-table2.sql
@@ -0,0 +1,56 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+-- Just for someone who tested maintenance before (patch-maintenance-table.sql)
+DROP TABLE IF EXISTS maintenance_status_page;
+DROP TABLE IF EXISTS monitor_maintenance;
+DROP TABLE IF EXISTS maintenance;
+DROP TABLE IF EXISTS maintenance_timeslot;
+
+-- maintenance
+CREATE TABLE [maintenance] (
+    [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+    [title] VARCHAR(150) NOT NULL,
+    [description] TEXT NOT NULL,
+    [user_id] INTEGER REFERENCES [user]([id]) ON DELETE SET NULL ON UPDATE CASCADE,
+    [active] BOOLEAN NOT NULL DEFAULT 1,
+    [strategy] VARCHAR(50) NOT NULL DEFAULT 'single',
+    [start_date] DATETIME,
+    [end_date] DATETIME,
+    [start_time] TIME,
+    [end_time] TIME,
+    [weekdays] VARCHAR2(250) DEFAULT '[]',
+    [days_of_month] TEXT DEFAULT '[]',
+    [interval_day] INTEGER
+);
+
+CREATE INDEX [maintenance_user_id] ON [maintenance]([user_id]);
+
+-- maintenance_status_page
+CREATE TABLE maintenance_status_page (
+    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+    status_page_id INTEGER NOT NULL,
+    maintenance_id INTEGER NOT NULL,
+    CONSTRAINT FK_maintenance FOREIGN KEY (maintenance_id) REFERENCES maintenance (id) ON DELETE CASCADE ON UPDATE CASCADE,
+    CONSTRAINT FK_status_page FOREIGN KEY (status_page_id) REFERENCES status_page (id) ON DELETE CASCADE ON UPDATE CASCADE
+);
+
+-- maintenance_timeslot
+CREATE TABLE [maintenance_timeslot] (
+    [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+    [maintenance_id] INTEGER NOT NULL CONSTRAINT [FK_maintenance] REFERENCES [maintenance]([id]) ON DELETE CASCADE ON UPDATE CASCADE,
+    [start_date] DATETIME NOT NULL,
+    [end_date] DATETIME,
+    [generated_next] BOOLEAN DEFAULT 0
+);
+
+-- monitor_maintenance
+CREATE TABLE monitor_maintenance (
+    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+    monitor_id INTEGER NOT NULL,
+    maintenance_id INTEGER NOT NULL,
+    CONSTRAINT FK_maintenance FOREIGN KEY (maintenance_id) REFERENCES maintenance (id) ON DELETE CASCADE ON UPDATE CASCADE,
+    CONSTRAINT FK_monitor FOREIGN KEY (monitor_id) REFERENCES monitor (id) ON DELETE CASCADE ON UPDATE CASCADE
+);
+
+COMMIT;
diff --git a/server/database.js b/server/database.js
index 5666d9a6..16f12445 100644
--- a/server/database.js
+++ b/server/database.js
@@ -64,7 +64,7 @@ class Database {
         "patch-add-other-auth.sql": { parents: [ "patch-monitor-basic-auth.sql" ] },
         "patch-add-radius-monitor.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
-        "patch-maintenance-table.sql": true,
+        "patch-maintenance-table2.sql": true,
     };
 
     /**
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index f06806ac..3ac64b6b 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -7,7 +7,7 @@ const { UptimeKumaServer } = require("../uptime-kuma-server");
 class MaintenanceTimeslot extends BeanModel {
 
     async toPublicJSON() {
-        const serverTimezoneOffset = await UptimeKumaServer.getInstance().getTimezoneOffset();
+        const serverTimezoneOffset = UptimeKumaServer.getInstance().getTimezoneOffset();
 
         const obj = {
             id: this.id,
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 667f6b6a..ac832f8e 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -204,7 +204,7 @@ class UptimeKumaServer {
         }
     }
 
-    async getTimezoneOffset() {
+    getTimezoneOffset() {
         return dayjs().format("Z");
     }
 

From d95e7226586fb504e08d59666e58e5ac6eb534fe Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 22:09:18 +0800
Subject: [PATCH 244/803] Init dayjs for backend.spec.js

---
 test/backend.spec.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/test/backend.spec.js b/test/backend.spec.js
index 5b9fa92c..644a0fd0 100644
--- a/test/backend.spec.js
+++ b/test/backend.spec.js
@@ -6,6 +6,9 @@ const { UptimeKumaServer } = require("../server/uptime-kuma-server");
 const Database = require("../server/database");
 const {Settings} = require("../server/settings");
 const fs = require("fs");
+const dayjs = require("dayjs");
+dayjs.extend(require("dayjs/plugin/utc"));
+dayjs.extend(require("dayjs/plugin/timezone"));
 
 jest.mock("axios");
 

From 7b9766091e79282cb039e2ace956f264a7029d1c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 22:18:09 +0800
Subject: [PATCH 245/803] Revert testing

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

diff --git a/server/server.js b/server/server.js
index f80d5d57..41cf7c37 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1106,7 +1106,7 @@ let needSetup = false;
 
                 callback({
                     ok: true,
-                    msg: "Saved " + dayjs()
+                    msg: "Saved"
                 });
 
                 sendInfo(socket);

From 8cc3e4b7c1a0e69d419f943862d338e9f480f293 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 11 Oct 2022 22:28:00 +0800
Subject: [PATCH 246/803] Revert

---
 src/languages/en.js    |  1 -
 src/layouts/Layout.vue | 20 +-------------------
 2 files changed, 1 insertion(+), 20 deletions(-)

diff --git a/src/languages/en.js b/src/languages/en.js
index a4c937e6..7db8147f 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -59,7 +59,6 @@ export default {
     "Check Update On GitHub": "Check Update On GitHub",
     List: "List",
     Add: "Add",
-    "Add Monitor": "Add Monitor",
     "Add New Monitor": "Add New Monitor",
     "Quick Stats": "Quick Stats",
     Up: "Up",
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index acd9446c..d13e8a8d 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -103,7 +103,7 @@
 
             <router-link to="/add" class="nav-link">
                 <div><font-awesome-icon icon="plus" /></div>
-                {{ $t("Add Monitor") }}
+                {{ $t("Add") }}
             </router-link>
 
             <router-link to="/settings" class="nav-link">
@@ -317,22 +317,4 @@ main {
         background-color: $dark-bg;
     }
 }
-
-.scroll {
-    display: flex;
-    flex-wrap: nowrap;
-    overflow-x: auto;
-    -webkit-overflow-scrolling: touch;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-}
-
-.scroll::-webkit-scrollbar {
-    display: none;
-}
-
-.scroll a {
-    flex: 0 0 auto;
-    min-width: fit-content;
-}
-
 </style>

From 2faf866e9ed5014452a61c96e3df436677ec39cf Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 12 Oct 2022 17:02:16 +0800
Subject: [PATCH 247/803] Implement generateTimeslot() for recurring interval
 type

---
 server/model/maintenance.js          | 11 +++-
 server/model/maintenance_timeslot.js | 75 ++++++++++++++++++++++++----
 server/server.js                     |  2 +
 server/util-server.js                | 14 +++---
 src/components/MaintenanceTime.vue   |  6 +--
 src/pages/EditMaintenance.vue        |  3 +-
 6 files changed, 87 insertions(+), 24 deletions(-)

diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 4910d2a0..d1197009 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -1,5 +1,5 @@
 const { BeanModel } = require("redbean-node/dist/bean-model");
-const { parseTimeObject, parseTimeFromTimeObject, utcToLocal, localToUTC } = require("../../src/util");
+const { parseTimeObject, parseTimeFromTimeObject, utcToLocal, localToUTC, log } = require("../../src/util");
 const { isArray } = require("chart.js/helpers");
 const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
 const { R } = require("redbean-node");
@@ -62,8 +62,15 @@ class Maintenance extends BeanModel {
         } else if (obj.strategy === "manual") {
             obj.status = "under-maintenance";
         } else if (obj.timeslotList.length > 0) {
+            let currentTimestamp = dayjs().unix();
+
             for (let timeslot of obj.timeslotList) {
-                if (dayjs.utc(timeslot.start_date) <= dayjs.utc() && dayjs.utc(timeslot.end_date) >= dayjs.utc()) {
+                if (dayjs.utc(timeslot.startDate).unix() <= currentTimestamp && dayjs.utc(timeslot.endDate).unix() >= currentTimestamp) {
+                    log.debug("timeslot", "Timeslot ID: " + timeslot.id);
+                    log.debug("timeslot", "currentTimestamp:" + currentTimestamp);
+                    log.debug("timeslot", "timeslot.start_date:" + dayjs.utc(timeslot.startDate).unix());
+                    log.debug("timeslot", "timeslot.end_date:" + dayjs.utc(timeslot.endDate).unix());
+
                     obj.status = "under-maintenance";
                     break;
                 }
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index 3ac64b6b..4c13632d 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -1,7 +1,7 @@
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { R } = require("redbean-node");
 const dayjs = require("dayjs");
-const { log, utcToLocal, SQL_DATETIME_FORMAT_WITHOUT_SECOND } = require("../../src/util");
+const { log, utcToLocal, SQL_DATETIME_FORMAT_WITHOUT_SECOND, localToUTC } = require("../../src/util");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 
 class MaintenanceTimeslot extends BeanModel {
@@ -26,17 +26,12 @@ class MaintenanceTimeslot extends BeanModel {
     }
 
     /**
-     *
      * @param {Maintenance} maintenance
-     * @param {dayjs} startFrom (For recurring type only) Generate Timeslot from this date, if it is smaller than the current date, it will use the current date instead. As generating a passed timeslot is meaningless.
+     * @param {dayjs} minDate (For recurring type only) Generate a next timeslot from this date.
      * @param {boolean} removeExist Remove existing timeslot before create
-     * @returns {Promise<void>}
+     * @returns {Promise<MaintenanceTimeslot>}
      */
-    static async generateTimeslot(maintenance, startFrom = null, removeExist = false) {
-        if (!startFrom) {
-            startFrom = dayjs();
-        }
-
+    static async generateTimeslot(maintenance, minDate = null, removeExist = false) {
         if (removeExist) {
             await R.exec("DELETE FROM maintenance_timeslot WHERE maintenance_id = ? ", [
                 maintenance.id
@@ -51,9 +46,67 @@ class MaintenanceTimeslot extends BeanModel {
             bean.start_date = maintenance.start_date;
             bean.end_date = maintenance.end_date;
             bean.generated_next = true;
-            await R.store(bean);
+            return await R.store(bean);
         } else if (maintenance.strategy === "recurring-interval") {
-            // TODO
+            let bean = R.dispense("maintenance_timeslot");
+
+            // Prevent dead loop, in case interval_day is not set
+            if (!maintenance.interval_day || maintenance.interval_day <= 0) {
+                maintenance.interval_day = 1;
+            }
+
+            let startOfTheDay = dayjs.utc(maintenance.start_date).format("HH:mm");
+            log.debug("timeslot", "startOfTheDay: " + startOfTheDay);
+
+            // Start Time
+            let startTimeSecond = dayjs.utc(maintenance.start_time, "HH:mm").diff(dayjs.utc(startOfTheDay, "HH:mm"), "second");
+            log.debug("timeslot", "startTime: " + startTimeSecond);
+
+            // Duration
+            let duration = dayjs.utc(maintenance.end_time, "HH:mm").diff(dayjs.utc(maintenance.start_time, "HH:mm"), "second");
+            // Add 24hours if it is across day
+            if (duration < 0) {
+                duration += 24 * 3600;
+            }
+
+            // Bake StartDate + StartTime = Start DateTime
+            let startDateTime = dayjs.utc(maintenance.start_date).add(startTimeSecond, "second");
+            let endDateTime;
+
+            // Keep generating from the first possible date, until it is ok
+            while (true) {
+                log.debug("timeslot", "startDateTime: " + startDateTime.format());
+
+                // Handling out of effective date range
+                if (startDateTime.diff(dayjs.utc(maintenance.end_date)) > 0) {
+                    log.debug("timeslot", "Out of effective date range");
+                    return null;
+                }
+
+                endDateTime = startDateTime.add(duration, "second");
+
+                // If endDateTime is out of effective date range, use the end datetime from effective date range
+                if (endDateTime.diff(dayjs.utc(maintenance.end_date)) > 0) {
+                    endDateTime = dayjs.utc(maintenance.end_date);
+                }
+
+                // If minDate is set, the endDateTime must be bigger than it.
+                // And the endDateTime must be bigger current time
+                if (
+                    (!minDate || endDateTime.diff(minDate) > 0) &&
+                    endDateTime.diff(dayjs()) > 0
+                ) {
+                    break;
+                }
+
+                startDateTime = startDateTime.add(maintenance.interval_day, "day");
+            }
+
+            bean.maintenance_id = maintenance.id;
+            bean.start_date = localToUTC(startDateTime);
+            bean.end_date = localToUTC(endDateTime);
+            bean.generated_next = false;
+            return await R.store(bean);
         } else if (maintenance.strategy === "recurring-weekday") {
             // TODO
         } else if (maintenance.strategy === "recurring-day-of-month") {
diff --git a/server/server.js b/server/server.js
index 41cf7c37..03b8b6cd 100644
--- a/server/server.js
+++ b/server/server.js
@@ -9,6 +9,7 @@ console.log("Welcome to Uptime Kuma");
 const dayjs = require("dayjs");
 dayjs.extend(require("dayjs/plugin/utc"));
 dayjs.extend(require("dayjs/plugin/timezone"));
+dayjs.extend(require("dayjs/plugin/customParseFormat"));
 
 // Check Node.js Version
 const nodeVersion = parseInt(process.versions.node.split(".")[0]);
@@ -1110,6 +1111,7 @@ let needSetup = false;
                 });
 
                 sendInfo(socket);
+                server.sendMaintenanceList(socket);
 
             } catch (e) {
                 callback({
diff --git a/server/util-server.js b/server/util-server.js
index 7c81cde7..ac8bc488 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -671,18 +671,20 @@ function timeObjectConvertTimezone(obj, timezone, timeObjectToUTC = true) {
     obj.minutes += minutes;
 
     // Handle out of bound
+    if (obj.minutes < 0) {
+        obj.minutes += 60;
+        obj.hours--;
+    } else if (obj.minutes > 60) {
+        obj.minutes -= 60;
+        obj.hours++;
+    }
+
     if (obj.hours < 0) {
         obj.hours += 24;
     } else if (obj.hours > 24) {
         obj.hours -= 24;
     }
 
-    if (obj.minutes < 0) {
-        obj.minutes += 24;
-    } else if (obj.minutes > 24) {
-        obj.minutes -= 24;
-    }
-
     return obj;
 }
 
diff --git a/src/components/MaintenanceTime.vue b/src/components/MaintenanceTime.vue
index 66ee4abf..07d65740 100644
--- a/src/components/MaintenanceTime.vue
+++ b/src/components/MaintenanceTime.vue
@@ -1,9 +1,9 @@
 <template>
-    <div class="timeslot">
-        <div v-if="maintenance.strategy === 'manual'">
+    <div>
+        <div v-if="maintenance.strategy === 'manual'" class="timeslot">
             {{ $t("Manual") }}
         </div>
-        <div v-else-if="maintenance.timeslotList.length > 0">
+        <div v-else-if="maintenance.timeslotList.length > 0" class="timeslot">
             {{ maintenance.timeslotList[0].startDateServerTimezone }}
             <span class="to">-</span>
             {{ maintenance.timeslotList[0].endDateServerTimezone }}
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 71df19b1..8cf28dfb 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -199,8 +199,7 @@
                                         range datePicker
                                         :monthChangeOnScroll="false"
                                         :minDate="minDate"
-                                        :enableTimePicker="false"
-                                        format="yyyy-MM-dd"
+                                        format="yyyy-MM-dd HH:mm:ss"
                                         modelType="yyyy-MM-dd HH:mm:ss"
                                     />
                                 </div>

From edacff123bcb0706a9c18c0112e23176e837d1d0 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 12 Oct 2022 22:13:07 +0800
Subject: [PATCH 248/803] Add UTC in the serverTimezone dropdown

---
 server/client.js                    | 1 -
 server/model/maintenance.js         | 5 ++---
 src/components/settings/General.vue | 1 +
 src/util.ts                         | 1 -
 4 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/server/client.js b/server/client.js
index bed2ba03..ef96c7f4 100644
--- a/server/client.js
+++ b/server/client.js
@@ -8,7 +8,6 @@ const server = UptimeKumaServer.getInstance();
 const io = server.io;
 const { setting } = require("./util-server");
 const checkVersion = require("./check-version");
-const dayjs = require("dayjs");
 
 /**
  * Send list of notification providers to client
diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index d1197009..a507f870 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -1,6 +1,5 @@
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { parseTimeObject, parseTimeFromTimeObject, utcToLocal, localToUTC, log } = require("../../src/util");
-const { isArray } = require("chart.js/helpers");
 const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
 const { R } = require("redbean-node");
 const dayjs = require("dayjs");
@@ -48,11 +47,11 @@ class Maintenance extends BeanModel {
             obj.timeslotList.push(await timeslot.toPublicJSON());
         }
 
-        if (!isArray(obj.weekdays)) {
+        if (!Array.isArray(obj.weekdays)) {
             obj.weekdays = [];
         }
 
-        if (!isArray(obj.daysOfMonth)) {
+        if (!Array.isArray(obj.daysOfMonth)) {
             obj.daysOfMonth = [];
         }
 
diff --git a/src/components/settings/General.vue b/src/components/settings/General.vue
index 57c8e0ca..0b8ce83f 100644
--- a/src/components/settings/General.vue
+++ b/src/components/settings/General.vue
@@ -26,6 +26,7 @@
                     {{ $t("Server Timezone") }}
                 </label>
                 <select id="timezone" v-model="settings.serverTimezone" class="form-select">
+                    <option value="UTC">UTC</option>
                     <option
                         v-for="(timezone, index) in timezoneList"
                         :key="index"
diff --git a/src/util.ts b/src/util.ts
index 5d8acfcd..fd2b466b 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -9,7 +9,6 @@
 import * as dayjs  from "dayjs";
 import * as timezone from "dayjs/plugin/timezone";
 import * as utc from "dayjs/plugin/utc";
-import {R} from "redbean-node";
 
 export const isDev = process.env.NODE_ENV === "development";
 export const appName = "Uptime Kuma";

From cb5f90aa89eae0d84c7eb62c98c956b7055183a3 Mon Sep 17 00:00:00 2001
From: MagicFun1241 <nganzikov@gmail.com>
Date: Wed, 12 Oct 2022 19:27:50 +0300
Subject: [PATCH 249/803] Update Russian locale (#2218)

* Update ru-RU.js

* Remove duplicates

* Remove duplicates x2

* Revert to previous version for one translation

* Removed conflicting lines

* Remove conflicting 'Reverse Proxy' key
---
 src/languages/ru-RU.js | 172 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 172 insertions(+)

diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js
index 6922f51b..2e6fdf7b 100644
--- a/src/languages/ru-RU.js
+++ b/src/languages/ru-RU.js
@@ -406,4 +406,176 @@ export default {
     proxyDescription: "Прокси должны быть привязаны к монитору, чтобы работать.",
     enableProxyDescription: "Этот прокси не будет влиять на запросы монитора, пока не будет активирован. Вы можете контролировать временное отключение прокси для всех мониторов через статус активации.",
     setAsDefaultProxyDescription: "Этот прокси будет по умолчанию включен для новых мониторов. Вы всё ещё можете отдельно отключать прокси в каждом мониторе.",
+    Invalid: "Недействительный",
+    AccessKeyId: "AccessKey ID",
+    SecretAccessKey: "AccessKey Secret",
+    PhoneNumbers: "PhoneNumbers",
+    TemplateCode: "TemplateCode",
+    SignName: "SignName",
+    "Sms template must contain parameters: ": "Шаблон СМС должен содержать параметры: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    WebHookUrl: "WebHookUrl",
+    SecretKey: "SecretKey",
+    "For safety, must use secret key": "В целях безопасности необходимо использовать секретный ключ",
+    "Device Token": "Токен устройства",
+    Platform: "Платформа",
+    iOS: "iOS",
+    Android: "Android",
+    Huawei: "Huawei",
+    High: "High",
+    Retry: "Повторить",
+    Topic: "Тема",
+    "WeCom Bot Key": "WeCom Bot Key",
+    User: "Пользователь",
+    Installed: "Установлено",
+    "Not installed": "Не установлено",
+    Running: "Запускается",
+    "Not running": "Не запускается",
+    "Remove Token": "Удалить токен",
+    Start: "Запустить",
+    Stop: "Остановить",
+    "Uptime Kuma": "Uptime Kuma",
+    Slug: "Slug",
+    "Accept characters:": "Принимаемые символы:",
+    startOrEndWithOnly: "Начинается или кончается только {0}",
+    "No consecutive dashes": "Без последовательных тире",
+    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "Page Not Found": "Страница не найдена",
+    wayToGetCloudflaredURL: "(Скачать cloudflared с {0})",
+    cloudflareWebsite: "Cloudflare Website",
+    "Message:": "Сообщение:",
+    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
+    "HTTP Headers": "HTTP заголовки",
+    "Trust Proxy": "Доверять прокси",
+    "Other Software": "Другое программное обеспечение",
+    "For example: nginx, Apache and Traefik.": "К примеру: nginx, Apache и Traefik.",
+    "Please read": "Пожалуйста, прочитайте",
+    "Subject:": "Тема:",
+    "Valid To:": "Действителен до:",
+    "Days Remaining:": "Дней осталось:",
+    "Issuer:": "Издатель:",
+    "Fingerprint:": "Отпечаток:",
+    "No status pages": "Нет статусных страниц",
+    "Domain Name Expiry Notification": "Уведомление об истечении срока действия доменного имени",
+    Proxy: "Прокси",
+    "Date Created": "Дата создания",
+    HomeAssistant: "Home Assistant",
+    onebotHttpAddress: "OneBot HTTP Address",
+    onebotMessageType: "OneBot Message Type",
+    onebotGroupMessage: "Группа",
+    onebotPrivateMessage: "Private",
+    onebotUserOrGroupId: "Группа/ID пользователя",
+    onebotSafetyTips: "В целях безопасности необходимо установить токен доступа",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Текст нижнего колонтитула",
+    "Show Powered By": "Показывать на чем создано",
+    "Domain Names": "Доменные имена",
+    signedInDisp: "Вы вошли как {0}",
+    signedInDispDisabled: "Аутентификация отключена.",
+    RadiusSecret: "Секрет Radius",
+    RadiusSecretDescription: "Общий секрет между клиентом и сервером",
+    RadiusCalledStationId: "Идентификатор вызываемой станции",
+    RadiusCalledStationIdDescription: "Идентификатор вызываемого устройства",
+    RadiusCallingStationId: "Идентификатор вызывающей станции",
+    RadiusCallingStationIdDescription: "Идентификатор вызывающего устройства",
+    "Certificate Expiry Notification": "Уведомление об истечении срока действия сертификата",
+    "API Username": "Имя пользователя API",
+    "API Key": "API ключ",
+    "Recipient Number": "Номер получателя",
+    "From Name/Number": "Имя/номер отправителя",
+    "Leave blank to use a shared sender number.": "Оставьте пустым, чтобы использовать общий номер отправителя.",
+    "Octopush API Version": "Версия API Octopush",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "endpoint",
+    octopushAPIKey: "\"API key\" из учетных данных HTTP API в панели управления",
+    octopushLogin: "\"Login\" из учетных данных HTTP API в панели управления",
+    promosmsLogin: "Логин API",
+    promosmsPassword: "Пароль API",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    pushyAPIKey: "Secret API Key",
+    pushyToken: "Токен устройства",
+    "Using a Reverse Proxy?": "Используете обратный прокси?",
+    "Check how to config it for WebSocket": "Проверьте, как настроить его для WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Наиболее вероятные причины:",
+    "The resource is no longer available.": "Ресурс больше не доступен.",
+    "There might be a typing error in the address.": "В адресе может быть опечатка.",
+    "What you can try:": "Что вы можете попробовать:",
+    "Retype the address.": "Повторите адрес.",
+    "Go back to the previous page.": "Вернуться на предыдущую страницу.",
+    "Coming Soon": "Скоро",
+    wayToGetClickSendSMSToken: "Вы можете получить имя пользователя API и ключ API из {0} .",
+    "Connection String": "Строка подключения",
+    Query: "Запрос",
+    settingsCertificateExpiry: "Истекание TLS сертификата",
+    certificationExpiryDescription: "HTTPS Мониторы инициируют уведомление, когда срок действия сертификата TLS истечет:",
+    "Setup Docker Host": "Настроить Docker Host",
+    "Connection Type": "Тип соединения",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "Are you sure want to delete this docker host for all monitors?",
+    socket: "Socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker контейнер",
+    "Container Name / ID": "Название контейнера / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    Domain: "Домен",
+    Workstation: "Workstation",
+    disableCloudflaredNoAuthMsg: "Вы находитесь в режиме без авторизации, пароль не требуется.",
+    trustProxyDescription: "Доверять заголовкам 'X-Forwarded-*'. Если вы хотите получить правильный IP-адрес клиента, а ваш Uptime Kuma находится под Nginx или Apache, вам следует включить этот параметр.",
+    wayToGetLineNotifyToken: "Вы можете получить токен доступа в {0}",
+    Examples: "Примеры",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Токен доступа с длительным сроком службы",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
+    "Notification Service": "Служба уведомлений",
+    "default: notify all devices": "по стандарту: уведомлять все устройства",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
+    "Automations can optionally be triggered in Home Assistant:": "При желании автоматизацию можно активировать в Home Assistant.:",
+    "Trigger type:": "Тип триггера:",
+    "Event type:": "Тип события:",
+    "Event data:": "Данные события:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Затем выберите действие, например, переключите сцену на красный индикатор RGB..",
+    "Frontend Version": "Версия интерфейса",
+    "Frontend Version do not match backend version!": "Версия интерфейса не соответствует версии серверной части!",
+    "Base URL": "Базовый URL",
+    goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
+    goAlertIntegrationKeyInfo: "Получить общий ключ интеграции API для сервиса в этом формате \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обычно значение параметра токена скопированного URL.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Устарело: поскольку добавлено множество функций, а эта функция резервного копирования немного не поддерживается, она не может создать или восстановить полную резервную копию.",
+    backupRecommend: "Сделайте резервную копию тома или папки с данными (./data/) напрямую.",
+    "Optional": "Необязательно",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "Документация к API SMSManager ",
+    "Gateway Type": "Тип шлюза",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "Вы можете делить числа с",
+    "or": "или",
 };

From f459ea845c6a1b192fa35efa44f3116aca921dd1 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 12 Oct 2022 17:32:05 +0100
Subject: [PATCH 250/803] Added #2182 Add support for custom radius ports
 (#2197)

This commit adds support for the port to be specified when using the
radius monitor type. A check has been implemented to ensure that a null
value is not passed to the radius check function as could occur with
monitors that were created before this change was introduced. The
default port of 1812 is displayed when the user selects the radius
monitor in much the same way as the DNS port is handled. The port was
not included in the hostname in the form hostname:port in order to avoid
issues with IPv6 addresses and monitors that had been created before
this change was implemented.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/model/monitor.js   | 14 +++++++++++++-
 server/util-server.js     | 13 +++++++++++++
 src/pages/EditMonitor.vue |  8 +++++---
 3 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index ac892560..c0a3cce6 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -534,6 +534,17 @@ class Monitor extends BeanModel {
                     bean.ping = dayjs().valueOf() - startTime;
                 } else if (this.type === "radius") {
                     let startTime = dayjs().valueOf();
+
+                    // Handle monitors that were created before the
+                    // update and as such don't have a value for
+                    // this.port.
+                    let port;
+                    if (this.port == null) {
+                        port = 1812;
+                    } else {
+                        port = this.port;
+                    }
+
                     try {
                         const resp = await radius(
                             this.hostname,
@@ -541,7 +552,8 @@ class Monitor extends BeanModel {
                             this.radiusPassword,
                             this.radiusCalledStationId,
                             this.radiusCallingStationId,
-                            this.radiusSecret
+                            this.radiusSecret,
+                            port
                         );
                         if (resp.code) {
                             bean.msg = resp.code;
diff --git a/server/util-server.js b/server/util-server.js
index cf303ba8..b975a43f 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -291,6 +291,17 @@ exports.postgresQuery = function (connectionString, query) {
     });
 };
 
+/**
+ * Query radius server
+ * @param {string} hostname Hostname of radius server
+ * @param {string} username Username to use
+ * @param {string} password Password to use
+ * @param {string} calledStationId ID of called station
+ * @param {string} callingStationId ID of calling station
+ * @param {string} secret Secret to use
+ * @param {number} [port=1812] Port to contact radius server on
+ * @returns {Promise<any>}
+ */
 exports.radius = function (
     hostname,
     username,
@@ -298,9 +309,11 @@ exports.radius = function (
     calledStationId,
     callingStationId,
     secret,
+    port = 1812,
 ) {
     const client = new radiusClient({
         host: hostname,
+        hostPort: port,
         dictionaries: [ file ],
     });
 
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 99cbeb95..6d1a7e51 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -97,8 +97,8 @@
                             </div>
 
                             <!-- Port -->
-                            <!-- For TCP Port / Steam / MQTT Type -->
-                            <div v-if="monitor.type === 'port' || monitor.type === 'steam' || monitor.type === 'mqtt'" class="my-3">
+                            <!-- For TCP Port / Steam / MQTT / Radius Type -->
+                            <div v-if="monitor.type === 'port' || monitor.type === 'steam' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
                                 <label for="port" class="form-label">{{ $t("Port") }}</label>
                                 <input id="port" v-model="monitor.port" type="number" class="form-control" required min="0" max="65535" step="1">
                             </div>
@@ -616,9 +616,11 @@ export default {
             }
 
             // Set default port for DNS if not already defined
-            if (! this.monitor.port || this.monitor.port === "53") {
+            if (! this.monitor.port || this.monitor.port === "53" || this.monitor.port === "1812") {
                 if (this.monitor.type === "dns") {
                     this.monitor.port = "53";
+                } else if (this.monitor.type === "radius") {
+                    this.monitor.port = "1812";
                 } else {
                     this.monitor.port = undefined;
                 }

From 6b47ad07ca673815463d056e64f1d1912a20a2fa Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 12 Oct 2022 22:03:05 +0100
Subject: [PATCH 251/803] [empty commit] pull request for #2126 remove
 hardcoded ping


From c662d259b0a59e59a650f00a04253e0d81707ab2 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 13 Oct 2022 19:28:02 +0800
Subject: [PATCH 252/803]  Firefox Better Support #2206

---
 src/components/HiddenInput.vue                | 2 +-
 src/components/notifications/ClickSendSMS.vue | 2 +-
 src/components/notifications/GoAlert.vue      | 2 +-
 src/components/notifications/Gotify.vue       | 2 +-
 src/components/notifications/Line.vue         | 2 +-
 src/components/notifications/Matrix.vue       | 2 +-
 src/components/notifications/Octopush.vue     | 2 +-
 src/components/notifications/PromoSMS.vue     | 2 +-
 src/components/notifications/PushDeer.vue     | 2 +-
 src/components/notifications/Pushbullet.vue   | 2 +-
 src/components/notifications/Pushover.vue     | 4 ++--
 src/components/notifications/Pushy.vue        | 4 ++--
 src/components/notifications/SMTP.vue         | 2 +-
 src/components/notifications/ServerChan.vue   | 2 +-
 src/components/notifications/SerwerSMS.vue    | 2 +-
 src/components/notifications/TechulusPush.vue | 2 +-
 src/components/notifications/Telegram.vue     | 2 +-
 src/components/settings/General.vue           | 5 +++--
 src/components/settings/ReverseProxy.vue      | 2 +-
 19 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/src/components/HiddenInput.vue b/src/components/HiddenInput.vue
index 6287af05..fb86a398 100644
--- a/src/components/HiddenInput.vue
+++ b/src/components/HiddenInput.vue
@@ -42,7 +42,7 @@ export default {
         /** Should the field auto complete */
         autocomplete: {
             type: String,
-            default: undefined,
+            default: "new-password",
         },
         /** Is the input required? */
         required: {
diff --git a/src/components/notifications/ClickSendSMS.vue b/src/components/notifications/ClickSendSMS.vue
index dbd4d0aa..dbaca045 100644
--- a/src/components/notifications/ClickSendSMS.vue
+++ b/src/components/notifications/ClickSendSMS.vue
@@ -6,7 +6,7 @@
         </i18n-t>
         <input id="clicksendsms-login" v-model="$parent.notification.clicksendsmsLogin" type="text" class="form-control" required>
         <label for="clicksendsms-key" class="form-label">{{ $t("API Key") }}</label>
-        <HiddenInput id="clicksendsms-key" v-model="$parent.notification.clicksendsmsPassword" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="clicksendsms-key" v-model="$parent.notification.clicksendsmsPassword" :required="true" autocomplete="new-password"></HiddenInput>
     </div>
     <div class="mb-3">
         <div class="form-text">
diff --git a/src/components/notifications/GoAlert.vue b/src/components/notifications/GoAlert.vue
index a1465b50..cefb848d 100644
--- a/src/components/notifications/GoAlert.vue
+++ b/src/components/notifications/GoAlert.vue
@@ -11,7 +11,7 @@
 
     <div class="mb-3">
         <label for="goalert-token" class="form-label">{{ $t("Token") }}</label>
-        <HiddenInput id="goalert-token" v-model="$parent.notification.goAlertToken" autocomplete="one-time-code" :required="true"></HiddenInput>
+        <HiddenInput id="goalert-token" v-model="$parent.notification.goAlertToken" autocomplete="new-password" :required="true"></HiddenInput>
 
         <div class="form-text">
             {{ $t("goAlertIntegrationKeyInfo") }}
diff --git a/src/components/notifications/Gotify.vue b/src/components/notifications/Gotify.vue
index 5c294f6d..8b9a8a16 100644
--- a/src/components/notifications/Gotify.vue
+++ b/src/components/notifications/Gotify.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="mb-3">
         <label for="gotify-application-token" class="form-label">{{ $t("Application Token") }}</label>
-        <HiddenInput id="gotify-application-token" v-model="$parent.notification.gotifyapplicationToken" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="gotify-application-token" v-model="$parent.notification.gotifyapplicationToken" :required="true" autocomplete="new-password"></HiddenInput>
     </div>
     <div class="mb-3">
         <label for="gotify-server-url" class="form-label">{{ $t("Server URL") }}</label>
diff --git a/src/components/notifications/Line.vue b/src/components/notifications/Line.vue
index 34ceb4ac..dcd6142b 100644
--- a/src/components/notifications/Line.vue
+++ b/src/components/notifications/Line.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="mb-3">
         <label for="line-channel-access-token" class="form-label">{{ $t("Channel access token") }}</label>
-        <HiddenInput id="line-channel-access-token" v-model="$parent.notification.lineChannelAccessToken" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="line-channel-access-token" v-model="$parent.notification.lineChannelAccessToken" :required="true" autocomplete="new-password"></HiddenInput>
     </div>
     <i18n-t tag="div" keypath="lineDevConsoleTo" class="form-text">
         <b>{{ $t("Basic Settings") }}</b>
diff --git a/src/components/notifications/Matrix.vue b/src/components/notifications/Matrix.vue
index d4790646..a9fd6340 100644
--- a/src/components/notifications/Matrix.vue
+++ b/src/components/notifications/Matrix.vue
@@ -9,7 +9,7 @@
     </div>
     <div class="mb-3">
         <label for="access-token" class="form-label">{{ $t("Access Token") }}</label><span style="color: red;"><sup>*</sup></span>
-        <HiddenInput id="access-token" v-model="$parent.notification.accessToken" :required="true" autocomplete="one-time-code" :maxlength="500"></HiddenInput>
+        <HiddenInput id="access-token" v-model="$parent.notification.accessToken" :required="true" autocomplete="new-password" :maxlength="500"></HiddenInput>
     </div>
 
     <div class="form-text">
diff --git a/src/components/notifications/Octopush.vue b/src/components/notifications/Octopush.vue
index 7d5fe469..15cebe8b 100644
--- a/src/components/notifications/Octopush.vue
+++ b/src/components/notifications/Octopush.vue
@@ -11,7 +11,7 @@
     </div>
     <div class="mb-3">
         <label for="octopush-key" class="form-label">{{ $t("octopushAPIKey") }}</label>
-        <HiddenInput id="octopush-key" v-model="$parent.notification.octopushAPIKey" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="octopush-key" v-model="$parent.notification.octopushAPIKey" :required="true" autocomplete="new-password"></HiddenInput>
         <label for="octopush-login" class="form-label">{{ $t("octopushLogin") }}</label>
         <input id="octopush-login" v-model="$parent.notification.octopushLogin" type="text" class="form-control" required>
     </div>
diff --git a/src/components/notifications/PromoSMS.vue b/src/components/notifications/PromoSMS.vue
index 93ecdc8c..03c02222 100644
--- a/src/components/notifications/PromoSMS.vue
+++ b/src/components/notifications/PromoSMS.vue
@@ -3,7 +3,7 @@
         <label for="promosms-login" class="form-label">{{ $t("promosmsLogin") }}</label>
         <input id="promosms-login" v-model="$parent.notification.promosmsLogin" type="text" class="form-control" required>
         <label for="promosms-key" class="form-label">{{ $t("promosmsPassword") }}</label>
-        <HiddenInput id="promosms-key" v-model="$parent.notification.promosmsPassword" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="promosms-key" v-model="$parent.notification.promosmsPassword" :required="true" autocomplete="new-password"></HiddenInput>
     </div>
     <div class="mb-3">
         <label for="promosms-type-sms" class="form-label">{{ $t("SMS Type") }}</label>
diff --git a/src/components/notifications/PushDeer.vue b/src/components/notifications/PushDeer.vue
index c2b7f5cb..f6184963 100644
--- a/src/components/notifications/PushDeer.vue
+++ b/src/components/notifications/PushDeer.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="mb-3">
         <label for="pushdeer-key" class="form-label">{{ $t("PushDeer Key") }}</label>
-        <HiddenInput id="pushdeer-key" v-model="$parent.notification.pushdeerKey" :required="true" autocomplete="one-time-code" placeholder="PDUxxxx"></HiddenInput>
+        <HiddenInput id="pushdeer-key" v-model="$parent.notification.pushdeerKey" :required="true" autocomplete="new-password" placeholder="PDUxxxx"></HiddenInput>
     </div>
 
     <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
diff --git a/src/components/notifications/Pushbullet.vue b/src/components/notifications/Pushbullet.vue
index 37a2e095..866576aa 100644
--- a/src/components/notifications/Pushbullet.vue
+++ b/src/components/notifications/Pushbullet.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="mb-3">
         <label for="pushbullet-access-token" class="form-label">{{ $t("Access Token") }}</label>
-        <HiddenInput id="pushbullet-access-token" v-model="$parent.notification.pushbulletAccessToken" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="pushbullet-access-token" v-model="$parent.notification.pushbulletAccessToken" :required="true" autocomplete="new-password"></HiddenInput>
     </div>
 
     <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
diff --git a/src/components/notifications/Pushover.vue b/src/components/notifications/Pushover.vue
index 4bf6edb3..d9f24b29 100644
--- a/src/components/notifications/Pushover.vue
+++ b/src/components/notifications/Pushover.vue
@@ -1,9 +1,9 @@
 <template>
     <div class="mb-3">
         <label for="pushover-user" class="form-label">{{ $t("User Key") }}<span style="color: red;"><sup>*</sup></span></label>
-        <HiddenInput id="pushover-user" v-model="$parent.notification.pushoveruserkey" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="pushover-user" v-model="$parent.notification.pushoveruserkey" :required="true" autocomplete="new-password"></HiddenInput>
         <label for="pushover-app-token" class="form-label">{{ $t("Application Token") }}<span style="color: red;"><sup>*</sup></span></label>
-        <HiddenInput id="pushover-app-token" v-model="$parent.notification.pushoverapptoken" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="pushover-app-token" v-model="$parent.notification.pushoverapptoken" :required="true" autocomplete="new-password"></HiddenInput>
         <label for="pushover-device" class="form-label">{{ $t("Device") }}</label>
         <input id="pushover-device" v-model="$parent.notification.pushoverdevice" type="text" class="form-control">
         <label for="pushover-device" class="form-label">{{ $t("Message Title") }}</label>
diff --git a/src/components/notifications/Pushy.vue b/src/components/notifications/Pushy.vue
index 3537eb4f..13e7b499 100644
--- a/src/components/notifications/Pushy.vue
+++ b/src/components/notifications/Pushy.vue
@@ -1,13 +1,13 @@
 <template>
     <div class="mb-3">
         <label for="pushy-app-token" class="form-label">{{ $t("pushyAPIKey") }}</label>
-        <HiddenInput id="pushy-app-token" v-model="$parent.notification.pushyAPIKey" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="pushy-app-token" v-model="$parent.notification.pushyAPIKey" :required="true" autocomplete="new-password"></HiddenInput>
     </div>
 
     <div class="mb-3">
         <label for="pushy-user-key" class="form-label">{{ $t("pushyToken") }}</label>
         <div class="input-group mb-3">
-            <HiddenInput id="pushy-user-key" v-model="$parent.notification.pushyToken" :required="true" autocomplete="one-time-code"></HiddenInput>
+            <HiddenInput id="pushy-user-key" v-model="$parent.notification.pushyToken" :required="true" autocomplete="new-password"></HiddenInput>
         </div>
     </div>
     <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
diff --git a/src/components/notifications/SMTP.vue b/src/components/notifications/SMTP.vue
index 899f8f9b..54470796 100644
--- a/src/components/notifications/SMTP.vue
+++ b/src/components/notifications/SMTP.vue
@@ -34,7 +34,7 @@
 
         <div class="mb-3">
             <label for="password" class="form-label">{{ $t("Password") }}</label>
-            <HiddenInput id="password" v-model="$parent.notification.smtpPassword" :required="false" autocomplete="one-time-code"></HiddenInput>
+            <HiddenInput id="password" v-model="$parent.notification.smtpPassword" :required="false" autocomplete="new-password"></HiddenInput>
         </div>
 
         <div class="mb-3">
diff --git a/src/components/notifications/ServerChan.vue b/src/components/notifications/ServerChan.vue
index cec75675..c7476c20 100644
--- a/src/components/notifications/ServerChan.vue
+++ b/src/components/notifications/ServerChan.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="mb-3">
         <label for="serverchan-sendkey" class="form-label">{{ $t("SendKey") }}</label>
-        <HiddenInput id="serverchan-sendkey" v-model="$parent.notification.serverChanSendKey" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="serverchan-sendkey" v-model="$parent.notification.serverChanSendKey" :required="true" autocomplete="new-password"></HiddenInput>
     </div>
 </template>
 
diff --git a/src/components/notifications/SerwerSMS.vue b/src/components/notifications/SerwerSMS.vue
index f2c3463b..32a0ff7a 100644
--- a/src/components/notifications/SerwerSMS.vue
+++ b/src/components/notifications/SerwerSMS.vue
@@ -5,7 +5,7 @@
     </div>
     <div class="mb-3">
         <label for="serwersms-key" class="form-label">{{ $t('serwersmsAPIPassword') }}</label>
-        <HiddenInput id="serwersms-key" v-model="$parent.notification.serwersmsPassword" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="serwersms-key" v-model="$parent.notification.serwersmsPassword" :required="true" autocomplete="new-password"></HiddenInput>
     </div>
     <div class="mb-3">
         <label for="serwersms-phone-number" class="form-label">{{ $t("serwersmsPhoneNumber") }}</label>
diff --git a/src/components/notifications/TechulusPush.vue b/src/components/notifications/TechulusPush.vue
index 86d4e5fe..bece17e2 100644
--- a/src/components/notifications/TechulusPush.vue
+++ b/src/components/notifications/TechulusPush.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="mb-3">
         <label for="push-api-key" class="form-label">{{ $t("API Key") }}</label>
-        <HiddenInput id="push-api-key" v-model="$parent.notification.pushAPIKey" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="push-api-key" v-model="$parent.notification.pushAPIKey" :required="true" autocomplete="new-password"></HiddenInput>
     </div>
 
     <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 20deff7b..9daf31ac 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -1,7 +1,7 @@
 <template>
     <div class="mb-3">
         <label for="telegram-bot-token" class="form-label">{{ $t("Bot Token") }}</label>
-        <HiddenInput id="telegram-bot-token" v-model="$parent.notification.telegramBotToken" :required="true" autocomplete="one-time-code"></HiddenInput>
+        <HiddenInput id="telegram-bot-token" v-model="$parent.notification.telegramBotToken" :required="true" autocomplete="new-password"></HiddenInput>
         <i18n-t tag="div" keypath="wayToGetTelegramToken" class="form-text">
             <a href="https://t.me/BotFather" target="_blank">https://t.me/BotFather</a>
         </i18n-t>
diff --git a/src/components/settings/General.vue b/src/components/settings/General.vue
index 19dc8077..c460dc53 100644
--- a/src/components/settings/General.vue
+++ b/src/components/settings/General.vue
@@ -1,6 +1,6 @@
 <template>
     <div>
-        <form class="my-4" @submit.prevent="saveGeneral">
+        <form class="my-4" autocomplete="off" @submit.prevent="saveGeneral">
             <!-- Timezone -->
             <div class="mb-4">
                 <label for="timezone" class="form-label">
@@ -105,6 +105,7 @@
                         name="primaryBaseURL"
                         placeholder="https://"
                         pattern="https?://.+"
+                        autocomplete="new-password"
                     />
                     <button class="btn btn-outline-primary" type="button" @click="autoGetPrimaryBaseURL">
                         {{ $t("Auto Get") }}
@@ -122,7 +123,7 @@
                 <HiddenInput
                     id="steamAPIKey"
                     v-model="settings.steamAPIKey"
-                    autocomplete="one-time-code"
+                    autocomplete="new-password"
                 />
                 <div class="form-text">
                     {{ $t("steamApiKeyDescription") }}
diff --git a/src/components/settings/ReverseProxy.vue b/src/components/settings/ReverseProxy.vue
index 0fab7629..04ed9c0c 100644
--- a/src/components/settings/ReverseProxy.vue
+++ b/src/components/settings/ReverseProxy.vue
@@ -41,7 +41,7 @@
                 <HiddenInput
                     id="cloudflareTunnelToken"
                     v-model="cloudflareTunnelToken"
-                    autocomplete="one-time-code"
+                    autocomplete="new-password"
                     :readonly="running"
                 />
                 <div class="form-text">

From aecf95864eaf2c2d9a939bdca7336c88d05f4ac8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 14 Oct 2022 13:26:41 +0800
Subject: [PATCH 253/803] Add index for maintenance tables

---
 db/patch-maintenance-table2.sql | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/db/patch-maintenance-table2.sql b/db/patch-maintenance-table2.sql
index 76644596..24f6da8c 100644
--- a/db/patch-maintenance-table2.sql
+++ b/db/patch-maintenance-table2.sql
@@ -24,7 +24,14 @@ CREATE TABLE [maintenance] (
     [interval_day] INTEGER
 );
 
-CREATE INDEX [maintenance_user_id] ON [maintenance]([user_id]);
+CREATE INDEX [manual_active] ON [maintenance] (
+    [strategy],
+    [active]
+);
+
+CREATE INDEX [active] ON [maintenance] ([active]);
+
+CREATE INDEX [maintenance_user_id] ON [maintenance] ([user_id]);
 
 -- maintenance_status_page
 CREATE TABLE maintenance_status_page (
@@ -35,6 +42,12 @@ CREATE TABLE maintenance_status_page (
     CONSTRAINT FK_status_page FOREIGN KEY (status_page_id) REFERENCES status_page (id) ON DELETE CASCADE ON UPDATE CASCADE
 );
 
+CREATE INDEX [status_page_id_index]
+    ON [maintenance_status_page]([status_page_id]);
+
+CREATE INDEX [maintenance_id_index]
+    ON [maintenance_status_page]([maintenance_id]);
+
 -- maintenance_timeslot
 CREATE TABLE [maintenance_timeslot] (
     [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
@@ -44,6 +57,14 @@ CREATE TABLE [maintenance_timeslot] (
     [generated_next] BOOLEAN DEFAULT 0
 );
 
+CREATE INDEX [maintenance_id] ON [maintenance_timeslot] ([maintenance_id] DESC);
+
+CREATE INDEX [active_timeslot_index] ON [maintenance_timeslot] (
+    [maintenance_id] DESC,
+    [start_date] DESC,
+    [end_date] DESC
+);
+
 -- monitor_maintenance
 CREATE TABLE monitor_maintenance (
     id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
@@ -53,4 +74,8 @@ CREATE TABLE monitor_maintenance (
     CONSTRAINT FK_monitor FOREIGN KEY (monitor_id) REFERENCES monitor (id) ON DELETE CASCADE ON UPDATE CASCADE
 );
 
+CREATE INDEX [maintenance_id_index2] ON [monitor_maintenance]([maintenance_id]);
+
+CREATE INDEX [monitor_id_index] ON [monitor_maintenance]([monitor_id]);
+
 COMMIT;

From b60dde0b2d62eaaf550a85965cfc5f735fea78bb Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 15 Oct 2022 15:18:54 +0800
Subject: [PATCH 254/803] Update SQLite

---
 package-lock.json | 18 +++++++++---------
 package.json      |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 44af1469..77678352 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,15 +1,15 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.4",
+    "version": "1.18.5",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.18.4",
+            "version": "1.18.5",
             "license": "MIT",
             "dependencies": {
-                "@louislam/sqlite3": "~15.0.6",
+                "@louislam/sqlite3": "15.1.2",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
                 "axios-ntlm": "~1.3.0",
@@ -3115,9 +3115,9 @@
             "integrity": "sha512-iHHyIRLEfXLqBN+BkyH8u8imMYr4ihRbFDEk8toqTwUECETVQFCTh2U59Sw2oMoRVaS3XRIb7pyCulltq2jFVA=="
         },
         "node_modules/@louislam/sqlite3": {
-            "version": "15.0.6",
-            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-15.0.6.tgz",
-            "integrity": "sha512-+HF/4OEy+yakYzJlSPJbLDtf499t0s0eaglXC9y3Oa9OBZ+dKAaTW5+Ft1RCvfUJLFw/oyYjHtMsg9V+7NT05g==",
+            "version": "15.1.2",
+            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-15.1.2.tgz",
+            "integrity": "sha512-VRquWrCKKwfOnzwVh6hOud8lHPvv2R7Jic3gyZCL5kiZpNfmJ71DLCV9SNgLaMDloU+mVWymLev8vehlf7xf5g==",
             "hasInstallScript": true,
             "dependencies": {
                 "@mapbox/node-pre-gyp": "^1.0.0",
@@ -18851,9 +18851,9 @@
             "integrity": "sha512-iHHyIRLEfXLqBN+BkyH8u8imMYr4ihRbFDEk8toqTwUECETVQFCTh2U59Sw2oMoRVaS3XRIb7pyCulltq2jFVA=="
         },
         "@louislam/sqlite3": {
-            "version": "15.0.6",
-            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-15.0.6.tgz",
-            "integrity": "sha512-+HF/4OEy+yakYzJlSPJbLDtf499t0s0eaglXC9y3Oa9OBZ+dKAaTW5+Ft1RCvfUJLFw/oyYjHtMsg9V+7NT05g==",
+            "version": "15.1.2",
+            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-15.1.2.tgz",
+            "integrity": "sha512-VRquWrCKKwfOnzwVh6hOud8lHPvv2R7Jic3gyZCL5kiZpNfmJ71DLCV9SNgLaMDloU+mVWymLev8vehlf7xf5g==",
             "requires": {
                 "@mapbox/node-pre-gyp": "^1.0.0",
                 "node-addon-api": "^4.2.0",
diff --git a/package.json b/package.json
index b1a76d36..ee7496d9 100644
--- a/package.json
+++ b/package.json
@@ -63,7 +63,7 @@
         "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\""
     },
     "dependencies": {
-        "@louislam/sqlite3": "~15.0.6",
+        "@louislam/sqlite3": "15.1.2",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",
         "axios-ntlm": "~1.3.0",

From 0b8d4cdaac1c613c27bb15ff9119ec6a72931a1b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 15 Oct 2022 17:17:26 +0800
Subject: [PATCH 255/803] Generate Next Timeslot for recurring interval

---
 db/patch-maintenance-table2.sql |  2 ++
 server/server.js                |  2 ++
 server/uptime-kuma-server.js    | 25 +++++++++++++++++++++++++
 3 files changed, 29 insertions(+)

diff --git a/db/patch-maintenance-table2.sql b/db/patch-maintenance-table2.sql
index 24f6da8c..96b2ebde 100644
--- a/db/patch-maintenance-table2.sql
+++ b/db/patch-maintenance-table2.sql
@@ -65,6 +65,8 @@ CREATE INDEX [active_timeslot_index] ON [maintenance_timeslot] (
     [end_date] DESC
 );
 
+CREATE INDEX [generated_next_index] ON [maintenance_timeslot] ([generated_next]);
+
 -- monitor_maintenance
 CREATE TABLE monitor_maintenance (
     id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
diff --git a/server/server.js b/server/server.js
index fb6a0a21..888294b1 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1721,6 +1721,8 @@ async function shutdownFunction(signal) {
     log.info("server", "Shutdown requested");
     log.info("server", "Called signal: " + signal);
 
+    await server.stop();
+
     log.info("server", "Stopping all monitors");
     for (let id in server.monitorList) {
         let monitor = server.monitorList[id];
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index ac832f8e..f84bf312 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -45,6 +45,8 @@ class UptimeKumaServer {
      */
     indexHTML = "";
 
+    generateMaintenanceTimeslotsInterval = undefined;
+
     static getInstance(args) {
         if (UptimeKumaServer.instance == null) {
             UptimeKumaServer.instance = new UptimeKumaServer(args);
@@ -90,6 +92,9 @@ class UptimeKumaServer {
         dayjs.tz.setDefault(process.env.TZ);
         log.debug("DEBUG", "Timezone: " + process.env.TZ);
         log.debug("DEBUG", "Current Time: " + dayjs.tz().format());
+
+        await this.generateMaintenanceTimeslots();
+        this.generateMaintenanceTimeslotsInterval = setInterval(this.generateMaintenanceTimeslots, 60 * 1000);
     }
 
     async sendMonitorList(socket) {
@@ -213,8 +218,28 @@ class UptimeKumaServer {
         process.env.TZ = timezone;
         dayjs.tz.setDefault(timezone);
     }
+
+    async generateMaintenanceTimeslots() {
+
+        let list = await R.find("maintenance_timeslot", " generated_next = 0 AND start_date <= DATETIME('now') ");
+
+        for (let maintenanceTimeslot of list) {
+            let maintenance = await maintenanceTimeslot.maintenance;
+            await MaintenanceTimeslot.generateTimeslot(maintenance, maintenanceTimeslot.end_date, false);
+            maintenanceTimeslot.generated_next = true;
+            await R.store(maintenanceTimeslot);
+        }
+
+    }
+
+    async stop() {
+        clearTimeout(this.generateMaintenanceTimeslotsInterval);
+    }
 }
 
 module.exports = {
     UptimeKumaServer
 };
+
+// Must be at the end
+const MaintenanceTimeslot = require("./model/maintenance_timeslot");

From d8a676abb63d7f49691f84b3b609a5b8e9d1f2a6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 15 Oct 2022 18:49:09 +0800
Subject: [PATCH 256/803] Implement recurring day of month and day of week

---
 server/model/maintenance.js          |  34 ++++++
 server/model/maintenance_timeslot.js | 168 ++++++++++++++++++---------
 src/languages/en.js                  |   1 +
 src/pages/EditMaintenance.vue        |  11 +-
 4 files changed, 154 insertions(+), 60 deletions(-)

diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index a507f870..35030801 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -112,6 +112,40 @@ class Maintenance extends BeanModel {
         return this.toPublicJSON(timezone);
     }
 
+    getDayOfWeekList() {
+        log.debug("timeslot", "List: " + this.weekdays);
+        return JSON.parse(this.weekdays).sort(function (a, b) {
+            return a - b;
+        });
+    }
+
+    getDayOfMonthList() {
+        return JSON.parse(this.days_of_month).sort(function (a, b) {
+            return a - b;
+        });
+    }
+
+    getStartDateTime() {
+        let startOfTheDay = dayjs.utc(this.start_date).format("HH:mm");
+        log.debug("timeslot", "startOfTheDay: " + startOfTheDay);
+
+        // Start Time
+        let startTimeSecond = dayjs.utc(this.start_time, "HH:mm").diff(dayjs.utc(startOfTheDay, "HH:mm"), "second");
+        log.debug("timeslot", "startTime: " + startTimeSecond);
+
+        // Bake StartDate + StartTime = Start DateTime
+        return dayjs.utc(this.start_date).add(startTimeSecond, "second");
+    }
+
+    getDuration() {
+        let duration = dayjs.utc(this.end_time, "HH:mm").diff(dayjs.utc(this.start_time, "HH:mm"), "second");
+        // Add 24hours if it is across day
+        if (duration < 0) {
+            duration += 24 * 3600;
+        }
+        return duration;
+    }
+
     static jsonToBean(bean, obj) {
         if (obj.id) {
             bean.id = obj.id;
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index 4c13632d..b20b9473 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -40,6 +40,7 @@ class MaintenanceTimeslot extends BeanModel {
 
         if (maintenance.strategy === "manual") {
             log.debug("maintenance", "No need to generate timeslot for manual type");
+
         } else if (maintenance.strategy === "single") {
             let bean = R.dispense("maintenance_timeslot");
             bean.maintenance_id = maintenance.id;
@@ -47,74 +48,131 @@ class MaintenanceTimeslot extends BeanModel {
             bean.end_date = maintenance.end_date;
             bean.generated_next = true;
             return await R.store(bean);
-        } else if (maintenance.strategy === "recurring-interval") {
-            let bean = R.dispense("maintenance_timeslot");
 
+        } else if (maintenance.strategy === "recurring-interval") {
             // Prevent dead loop, in case interval_day is not set
             if (!maintenance.interval_day || maintenance.interval_day <= 0) {
                 maintenance.interval_day = 1;
             }
 
-            let startOfTheDay = dayjs.utc(maintenance.start_date).format("HH:mm");
-            log.debug("timeslot", "startOfTheDay: " + startOfTheDay);
+            return await this.handleRecurringType(maintenance, minDate, (startDateTime) => {
+                return startDateTime.add(maintenance.interval_day, "day");
+            });
 
-            // Start Time
-            let startTimeSecond = dayjs.utc(maintenance.start_time, "HH:mm").diff(dayjs.utc(startOfTheDay, "HH:mm"), "second");
-            log.debug("timeslot", "startTime: " + startTimeSecond);
-
-            // Duration
-            let duration = dayjs.utc(maintenance.end_time, "HH:mm").diff(dayjs.utc(maintenance.start_time, "HH:mm"), "second");
-            // Add 24hours if it is across day
-            if (duration < 0) {
-                duration += 24 * 3600;
-            }
-
-            // Bake StartDate + StartTime = Start DateTime
-            let startDateTime = dayjs.utc(maintenance.start_date).add(startTimeSecond, "second");
-            let endDateTime;
-
-            // Keep generating from the first possible date, until it is ok
-            while (true) {
-                log.debug("timeslot", "startDateTime: " + startDateTime.format());
-
-                // Handling out of effective date range
-                if (startDateTime.diff(dayjs.utc(maintenance.end_date)) > 0) {
-                    log.debug("timeslot", "Out of effective date range");
-                    return null;
-                }
-
-                endDateTime = startDateTime.add(duration, "second");
-
-                // If endDateTime is out of effective date range, use the end datetime from effective date range
-                if (endDateTime.diff(dayjs.utc(maintenance.end_date)) > 0) {
-                    endDateTime = dayjs.utc(maintenance.end_date);
-                }
-
-                // If minDate is set, the endDateTime must be bigger than it.
-                // And the endDateTime must be bigger current time
-                if (
-                    (!minDate || endDateTime.diff(minDate) > 0) &&
-                    endDateTime.diff(dayjs()) > 0
-                ) {
-                    break;
-                }
-
-                startDateTime = startDateTime.add(maintenance.interval_day, "day");
-            }
-
-            bean.maintenance_id = maintenance.id;
-            bean.start_date = localToUTC(startDateTime);
-            bean.end_date = localToUTC(endDateTime);
-            bean.generated_next = false;
-            return await R.store(bean);
         } else if (maintenance.strategy === "recurring-weekday") {
-            // TODO
+            let dayOfWeekList = maintenance.getDayOfWeekList();
+
+            if (dayOfWeekList.length <= 0) {
+                log.debug("timeslot", "No weekdays selected?");
+                return null;
+            }
+
+            return await this.handleRecurringType(maintenance, minDate, (startDateTime) => {
+                while (true) {
+                    startDateTime = startDateTime.add(1, "day");
+
+                    log.debug("timeslot", "nextDateTime: " + startDateTime);
+
+                    let day = startDateTime.local().day();
+                    log.debug("timeslot", "nextDateTime.day(): " + day);
+
+                    if (dayOfWeekList.includes(day)) {
+                        return startDateTime;
+                    }
+                }
+            });
+
         } else if (maintenance.strategy === "recurring-day-of-month") {
-            // TODO
+            let dayOfMonthList = maintenance.getDayOfMonthList();
+            if (dayOfMonthList.length <= 0) {
+                log.debug("timeslot", "No day selected?");
+                return null;
+            }
+
+            return await this.handleRecurringType(maintenance, minDate, (startDateTime) => {
+                while (true) {
+
+                    startDateTime = startDateTime.add(1, "day");
+
+                    let day = parseInt(startDateTime.local().format("D"));
+
+                    log.debug("timeslot", "day: " + day);
+
+                    // Check 1-31
+                    if (dayOfMonthList.includes(day)) {
+                        return startDateTime;
+                    }
+
+                    // Check "lastDay1","lastDay2"...
+                    let daysInMonth = startDateTime.daysInMonth();
+                    let lastDayList = [];
+
+                    // Small first, e.g. 28 > 29 > 30 > 31
+                    for (let i = 4; i >= 1; i--) {
+                        if (dayOfMonthList.includes("lastDay" + i)) {
+                            lastDayList.push(daysInMonth - i + 1);
+                        }
+                    }
+                    log.debug("timeslot", "lastDayList: " + lastDayList);
+                    if (lastDayList.includes(day)) {
+                        return startDateTime;
+                    }
+                }
+            });
         } else {
             throw new Error("Unknown maintenance strategy");
         }
     }
+
+    /**
+     * Generate a next timeslot for all recurring types
+     * @param maintenance
+     * @param minDate
+     * @param nextDayCallback The logic how to get the next possible day
+     * @returns {Promise<null|MaintenanceTimeslot>}
+     */
+    static async handleRecurringType(maintenance, minDate, nextDayCallback) {
+        let bean = R.dispense("maintenance_timeslot");
+
+        let duration = maintenance.getDuration();
+        let startDateTime = maintenance.getStartDateTime();
+        let endDateTime;
+
+        // Keep generating from the first possible date, until it is ok
+        while (true) {
+            log.debug("timeslot", "startDateTime: " + startDateTime.format());
+
+            // Handling out of effective date range
+            if (startDateTime.diff(dayjs.utc(maintenance.end_date)) > 0) {
+                log.debug("timeslot", "Out of effective date range");
+                return null;
+            }
+
+            endDateTime = startDateTime.add(duration, "second");
+
+            // If endDateTime is out of effective date range, use the end datetime from effective date range
+            if (endDateTime.diff(dayjs.utc(maintenance.end_date)) > 0) {
+                endDateTime = dayjs.utc(maintenance.end_date);
+            }
+
+            // If minDate is set, the endDateTime must be bigger than it.
+            // And the endDateTime must be bigger current time
+            if (
+                (!minDate || endDateTime.diff(minDate) > 0) &&
+                endDateTime.diff(dayjs()) > 0
+            ) {
+                break;
+            }
+
+            startDateTime = nextDayCallback(startDateTime);
+        }
+
+        bean.maintenance_id = maintenance.id;
+        bean.start_date = localToUTC(startDateTime);
+        bean.end_date = localToUTC(endDateTime);
+        bean.generated_next = false;
+        return await R.store(bean);
+    }
 }
 
 module.exports = MaintenanceTimeslot;
diff --git a/src/languages/en.js b/src/languages/en.js
index 7db8147f..187d4810 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -620,6 +620,7 @@ export default {
     weekdayShortFri: "Fri",
     weekdayShortSat: "Sat",
     weekdayShortSun: "Sun",
+    dayOfWeek: "Day of Week",
     dayOfMonth: "Day of Month",
     lastDay: "Last Day",
     lastDay1: "Last Day of Month",
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 8cf28dfb..8b2be35a 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -91,8 +91,8 @@
                                     <option value="manual">{{ $t("strategyManual") }}</option>
                                     <option value="single">Single Maintenance Window</option>
                                     <option value="recurring-interval">{{ $t("Recurring") }} - {{ $t("recurringInterval") }}</option>
-                                    <option value="recurring-weekday">{{ $t("Recurring") }} - Weekday</option>
-                                    <option value="recurring-day-of-month">{{ $t("Recurring") }} - Day of Month</option>
+                                    <option value="recurring-weekday">{{ $t("Recurring") }} - {{ $t("dayOfWeek") }}</option>
+                                    <option value="recurring-day-of-month">{{ $t("Recurring") }} - {{ $t("dayOfMonth") }}</option>
                                     <option v-if="false" value="recurring-day-of-year">{{ $t("Recurring") }} - Day of Year</option>
                                 </select>
                             </div>
@@ -136,7 +136,7 @@
                             <template v-if="maintenance.strategy === 'recurring-weekday'">
                                 <div class="my-3">
                                     <label for="interval-day" class="form-label">
-                                        {{ $t("Weekday") }}
+                                        {{ $t("dayOfWeek") }}
                                     </label>
 
                                     <!-- Weekday Picker -->
@@ -201,6 +201,7 @@
                                         :minDate="minDate"
                                         format="yyyy-MM-dd HH:mm:ss"
                                         modelType="yyyy-MM-dd HH:mm:ss"
+                                        required
                                     />
                                 </div>
                             </template>
@@ -297,9 +298,9 @@ export default {
                     value: 6,
                 },
                 {
-                    id: "weekday7",
+                    id: "weekday0",
                     langKey: "weekdayShortSun",
-                    value: 7,
+                    value: 0,
                 },
             ],
         };

From 24cb212a37cd50b50f9bc1463e7b48bb484475b7 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 15 Oct 2022 20:15:50 +0800
Subject: [PATCH 257/803] Fix recurring

---
 server/model/maintenance_timeslot.js | 81 ++++++++++++++++------------
 server/model/monitor.js              |  2 +
 server/uptime-kuma-server.js         |  9 +++-
 3 files changed, 55 insertions(+), 37 deletions(-)

diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index b20b9473..2babe6bc 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -57,30 +57,37 @@ class MaintenanceTimeslot extends BeanModel {
 
             return await this.handleRecurringType(maintenance, minDate, (startDateTime) => {
                 return startDateTime.add(maintenance.interval_day, "day");
+            }, () => {
+                return true;
             });
 
         } else if (maintenance.strategy === "recurring-weekday") {
             let dayOfWeekList = maintenance.getDayOfWeekList();
+            log.debug("timeslot", dayOfWeekList);
 
             if (dayOfWeekList.length <= 0) {
                 log.debug("timeslot", "No weekdays selected?");
                 return null;
             }
 
+            const isValid = (startDateTime) => {
+                log.debug("timeslot", "nextDateTime: " + startDateTime);
+
+                let day = startDateTime.local().day();
+                log.debug("timeslot", "nextDateTime.day(): " + day);
+
+                return dayOfWeekList.includes(day);
+            };
+
             return await this.handleRecurringType(maintenance, minDate, (startDateTime) => {
                 while (true) {
                     startDateTime = startDateTime.add(1, "day");
 
-                    log.debug("timeslot", "nextDateTime: " + startDateTime);
-
-                    let day = startDateTime.local().day();
-                    log.debug("timeslot", "nextDateTime.day(): " + day);
-
-                    if (dayOfWeekList.includes(day)) {
+                    if (isValid(startDateTime)) {
                         return startDateTime;
                     }
                 }
-            });
+            }, isValid);
 
         } else if (maintenance.strategy === "recurring-day-of-month") {
             let dayOfMonthList = maintenance.getDayOfMonthList();
@@ -89,36 +96,38 @@ class MaintenanceTimeslot extends BeanModel {
                 return null;
             }
 
+            const isValid = (startDateTime) => {
+                let day = parseInt(startDateTime.local().format("D"));
+
+                log.debug("timeslot", "day: " + day);
+
+                // Check 1-31
+                if (dayOfMonthList.includes(day)) {
+                    return startDateTime;
+                }
+
+                // Check "lastDay1","lastDay2"...
+                let daysInMonth = startDateTime.daysInMonth();
+                let lastDayList = [];
+
+                // Small first, e.g. 28 > 29 > 30 > 31
+                for (let i = 4; i >= 1; i--) {
+                    if (dayOfMonthList.includes("lastDay" + i)) {
+                        lastDayList.push(daysInMonth - i + 1);
+                    }
+                }
+                log.debug("timeslot", lastDayList);
+                return lastDayList.includes(day);
+            };
+
             return await this.handleRecurringType(maintenance, minDate, (startDateTime) => {
                 while (true) {
-
                     startDateTime = startDateTime.add(1, "day");
-
-                    let day = parseInt(startDateTime.local().format("D"));
-
-                    log.debug("timeslot", "day: " + day);
-
-                    // Check 1-31
-                    if (dayOfMonthList.includes(day)) {
-                        return startDateTime;
-                    }
-
-                    // Check "lastDay1","lastDay2"...
-                    let daysInMonth = startDateTime.daysInMonth();
-                    let lastDayList = [];
-
-                    // Small first, e.g. 28 > 29 > 30 > 31
-                    for (let i = 4; i >= 1; i--) {
-                        if (dayOfMonthList.includes("lastDay" + i)) {
-                            lastDayList.push(daysInMonth - i + 1);
-                        }
-                    }
-                    log.debug("timeslot", "lastDayList: " + lastDayList);
-                    if (lastDayList.includes(day)) {
+                    if (isValid(startDateTime)) {
                         return startDateTime;
                     }
                 }
-            });
+            }, isValid);
         } else {
             throw new Error("Unknown maintenance strategy");
         }
@@ -128,10 +137,11 @@ class MaintenanceTimeslot extends BeanModel {
      * Generate a next timeslot for all recurring types
      * @param maintenance
      * @param minDate
-     * @param nextDayCallback The logic how to get the next possible day
+     * @param {function} nextDayCallback The logic how to get the next possible day
+     * @param {function} isValidCallback Check the day whether is matched the current strategy
      * @returns {Promise<null|MaintenanceTimeslot>}
      */
-    static async handleRecurringType(maintenance, minDate, nextDayCallback) {
+    static async handleRecurringType(maintenance, minDate, nextDayCallback, isValidCallback) {
         let bean = R.dispense("maintenance_timeslot");
 
         let duration = maintenance.getDuration();
@@ -157,13 +167,14 @@ class MaintenanceTimeslot extends BeanModel {
 
             // If minDate is set, the endDateTime must be bigger than it.
             // And the endDateTime must be bigger current time
+            // Is valid under current recurring strategy
             if (
                 (!minDate || endDateTime.diff(minDate) > 0) &&
-                endDateTime.diff(dayjs()) > 0
+                endDateTime.diff(dayjs()) > 0 &&
+                isValidCallback(startDateTime)
             ) {
                 break;
             }
-
             startDateTime = nextDayCallback(startDateTime);
         }
 
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 43e9e358..e8342b09 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -623,6 +623,8 @@ class Monitor extends BeanModel {
                 log.debug("monitor", `[${this.name}] apicache clear`);
                 apicache.clear();
 
+                UptimeKumaServer.getInstance().sendMaintenanceListByUserID(this.user_id);
+
             } else {
                 bean.important = false;
 
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index f84bf312..078cc31d 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -10,6 +10,7 @@ const util = require("util");
 const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
 const { Settings } = require("./settings");
 const dayjs = require("dayjs");
+// DO NOT IMPORT HERE IF THE MODULES USED `UptimeKumaServer.getInstance()`
 
 /**
  * `module.exports` (alias: `server`) should be inside this class, in order to avoid circular dependency issue.
@@ -130,8 +131,12 @@ class UptimeKumaServer {
      * @returns {Object}
      */
     async sendMaintenanceList(socket) {
-        let list = await this.getMaintenanceJSONList(socket.userID);
-        this.io.to(socket.userID).emit("maintenanceList", list);
+        return await this.sendMaintenanceListByUserID(socket.userID);
+    }
+
+    async sendMaintenanceListByUserID(userID) {
+        let list = await this.getMaintenanceJSONList(userID);
+        this.io.to(userID).emit("maintenanceList", list);
         return list;
     }
 

From 6f4424de280d0c6f5740018b34c3cc46253d08c8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 15 Oct 2022 20:44:02 +0800
Subject: [PATCH 258/803] Remove unused language keys

---
 src/languages/en.js | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/src/languages/en.js b/src/languages/en.js
index 187d4810..f7434d39 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -15,17 +15,12 @@ export default {
     "Affected Monitors": "Affected Monitors",
     "Pick Affected Monitors...": "Pick Affected Monitors...",
     "Start of maintenance": "Start of maintenance",
-    "Expected end of maintenance": "Expected end of maintenance",
     "All Status Pages": "All Status Pages",
-    "Selected status pages": "Selected status pages",
     "Select status pages...": "Select status pages...",
     recurringIntervalMessage: "Run once every day | Run once every {0} days",
     affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
     affectedStatusPages: "Show this maintenance message on selected status pages",
     atLeastOneMonitor: "Select at least one affected monitor",
-    selectedStatusPagesDescription: "Select status pages to display maintenance info on",
-    maintenanceTitleExample: "Network infrastructure maintenance",
-    maintenanceDescriptionExample: "Example: Network infrastructure maintenance is underway which will affect some of our services.",
     passwordNotMatchMsg: "The repeat password does not match.",
     notificationDescription: "Notifications must be assigned to a monitor to function.",
     keywordDescription: "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
@@ -136,7 +131,6 @@ export default {
     "Remember me": "Remember me",
     Login: "Login",
     "No Monitors, please": "No Monitors, please",
-    "No Maintenance, please": "No Maintenance, please",
     "add one": "add one",
     "Notification Type": "Notification Type",
     Email: "Email",

From 64f84eb11834281fa79b20756ccc93f1c112fd91 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 15 Oct 2022 21:01:48 +0800
Subject: [PATCH 259/803] Update Details.vue's button styles

---
 src/pages/Details.vue | 37 ++++++++++++++-----------------------
 1 file changed, 14 insertions(+), 23 deletions(-)

diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 7cf25892..6d6a8dd9 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -20,18 +20,20 @@
             </p>
 
             <div class="functions">
-                <button v-if="monitor.active" class="btn btn-light" @click="pauseDialog">
-                    <font-awesome-icon icon="pause" /> {{ $t("Pause") }}
-                </button>
-                <button v-if="! monitor.active" class="btn btn-primary" @click="resumeMonitor">
-                    <font-awesome-icon icon="play" /> {{ $t("Resume") }}
-                </button>
-                <router-link :to=" '/edit/' + monitor.id " class="btn btn-secondary">
-                    <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
-                </router-link>
-                <button class="btn btn-danger" @click="deleteDialog">
-                    <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
-                </button>
+                <div class="btn-group" role="group">
+                    <button v-if="monitor.active" class="btn btn-normal" @click="pauseDialog">
+                        <font-awesome-icon icon="pause" /> {{ $t("Pause") }}
+                    </button>
+                    <button v-if="! monitor.active" class="btn btn-primary" @click="resumeMonitor">
+                        <font-awesome-icon icon="play" /> {{ $t("Resume") }}
+                    </button>
+                    <router-link :to=" '/edit/' + monitor.id " class="btn btn-normal">
+                        <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
+                    </router-link>
+                    <button class="btn btn-danger" @click="deleteDialog">
+                        <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
+                    </button>
+                </div>
             </div>
 
             <div class="shadow-box">
@@ -392,11 +394,6 @@ export default {
 @media (max-width: 550px) {
     .functions {
         text-align: center;
-
-        button, a {
-            margin-left: 10px !important;
-            margin-right: 10px !important;
-        }
     }
 
     .ping-chart-wrapper {
@@ -439,12 +436,6 @@ export default {
     }
 }
 
-.functions {
-    button, a {
-        margin-right: 20px;
-    }
-}
-
 .shadow-box {
     padding: 20px;
     margin-top: 25px;

From 06755f249d78c6a236b4ba2d83d1a5fc13b7c268 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 15 Oct 2022 21:02:56 +0800
Subject: [PATCH 260/803] Update to 1.19.0-beta.0

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

diff --git a/package.json b/package.json
index 8c774d71..5b9f3736 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.5",
+    "version": "1.19.0-beta.0",
     "license": "MIT",
     "repository": {
         "type": "git",

From a774b3736942552d191ad4267ca61a31e327aeaa Mon Sep 17 00:00:00 2001
From: Cyril59310 <70776486+cyril59310@users.noreply.github.com>
Date: Sat, 15 Oct 2022 19:42:28 +0200
Subject: [PATCH 261/803] Update FR language + fixed daytime error (#2226)

* Update FR language

* fix a daytime error + add for translation

* Update language file FR + fixed daytime error
---
 src/languages/fr-FR.js        | 53 +++++++++++++++++++++++++++++++++++
 src/pages/EditMaintenance.vue |  4 +--
 2 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 22df2728..034a69ba 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -531,4 +531,57 @@ export default {
     backupRecommend: "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
     Optional: "Optionnel",
     squadcast: "Squadcast",
+    Maintenance: "Maintenance",
+    statusMaintenance: "Maintenance",
+    "Schedule maintenance": "Planifier la maintenance",
+    "Affected Monitors": "Moniteurs concernés",
+    "Pick Affected Monitors...": "Sélectionnez les moniteurs concernés...",
+    "Start of maintenance": "Début de la maintenance",
+    "All Status Pages": "Toutes les pages d'état",
+    "Select status pages...": "Sélectionnez les pages d'état...",
+    recurringIntervalMessage: "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
+    affectedMonitorsDescription: "Sélectionnez les moniteurs concernés par la maintenance en cours",
+    affectedStatusPages: "Afficher ce message de maintenance sur les pages d'état sélectionnées",
+    atLeastOneMonitor: "Sélectionnez au moins un moniteur concerné",
+    deleteMaintenanceMsg: "Voulez-vous vraiment supprimer cette maintenance ?",
+    pushyAPIKey: "Clé API secrète",
+    pushyToken: "Jeton d'appareil",
+    "You can divide numbers with": "Vous pouvez diviser des nombres avec",
+    or: "ou",
+    recurringInterval: "Intervalle",
+    Recurring: "Récurrent",
+    "Single Maintenance Window": "Fenêtre de maintenance unique",
+    "Maintenance Time Window of a Day": "Fenêtre de temps de maintenance",
+    "Effective Date Range": "Plage de dates d'effet",
+    strategyManual: "activer/desactiver manuellement",
+    warningTimezone: "Il utilise le fuseau horaire du serveur",
+    weekdayShortMon: "Lun",
+    weekdayShortTue: "Mar",
+    weekdayShortWed: "Mer",
+    weekdayShortThu: "Jeu",
+    weekdayShortFri: "Ven",
+    weekdayShortSat: "Sam",
+    weekdayShortSun: "Dim",
+    dayOfWeek: "Jour de la semaine",
+    dayOfMonth: "Jour du mois",
+    lastDay: "Dernier jour",
+    lastDay1: "Dernier jour du mois",
+    lastDay2: "2ème dernier jour du mois",
+    lastDay3: "3ème dernier jour du mois",
+    lastDay4: "4ème dernier jour du mois",
+    "No Maintenance": "Aucune Maintenance",
+    pauseMaintenanceMsg: "Voulez-vous vraiment mettre en pause ?",
+    "maintenanceStatus-under-maintenance": "En maintenance",
+    "maintenanceStatus-inactive": "Inactif",
+    "maintenanceStatus-scheduled": "Programmé",
+    "maintenanceStatus-ended": "Terminé",
+    "maintenanceStatus-unknown": "Inconnue",
+    "Display Timezone": "Afficher le fuseau horaire",
+    "Server Timezone": "Fuseau horaire du serveur",
+    "Date and Time": "Date et heure",
+    "DateTime Range": "Plage de dates et d'heures",
+    Strategy: "Stratégie",
+    statusPageMaintenanceEndDate: "Fin",
+    "Free Mobile User Identifier": "Identifiant d'utilisateur Free Mobile",
+    "Free Mobile API Key": "Clé API Free Mobile",
 };
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index 8b2be35a..d668d1ad 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -89,7 +89,7 @@
                                 <label for="strategy" class="form-label">{{ $t("Strategy") }}</label>
                                 <select id="strategy" v-model="maintenance.strategy" class="form-select">
                                     <option value="manual">{{ $t("strategyManual") }}</option>
-                                    <option value="single">Single Maintenance Window</option>
+                                    <option value="single">{{ $t("Single Maintenance Window") }}</option>
                                     <option value="recurring-interval">{{ $t("Recurring") }} - {{ $t("recurringInterval") }}</option>
                                     <option value="recurring-weekday">{{ $t("Recurring") }} - {{ $t("dayOfWeek") }}</option>
                                     <option value="recurring-day-of-month">{{ $t("Recurring") }} - {{ $t("dayOfMonth") }}</option>
@@ -284,7 +284,7 @@ export default {
                 },
                 {
                     id: "weekday4",
-                    langKey: "weekdayShortTue",
+                    langKey: "weekdayShortThu",
                     value: 4,
                 },
                 {

From 92ea019fd43a2b819d270f4316fb3cb001302c62 Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Sun, 16 Oct 2022 07:21:23 +0300
Subject: [PATCH 262/803] Update bg-BG.js

- Added new  fields
- Translated new fields
---
 src/languages/bg-BG.js | 49 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 2002bc46..994d0d7f 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -582,4 +582,53 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "Отпаднало: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
     backupRecommend: "Моля, архивирайте дяла или папката (./data/) директно вместо това.",
+    Maintenance: "Поддръжка",
+    statusMaintenance: "Поддръжка",
+    "Schedule maintenance": "Планиране на поддръжка",
+    "Affected Monitors": "Засегнати монитори",
+    "Pick Affected Monitors...": "Изберете засегнати монитори...",
+    "Start of maintenance": "Стартирай поддръжка",
+    "All Status Pages": "Всички статус страници",
+    "Select status pages...": "Изберете статус страници...",
+    recurringIntervalMessage: "Изпълнявай ежедневно | Изпълнявай всеки {0} дни",
+    affectedMonitorsDescription: "Изберете монитори, засегнати от текущата поддръжка",
+    affectedStatusPages: "Покажи това съобщение за поддръжка на избрани статус страници",
+    atLeastOneMonitor: "Изберете поне един засегнат монитор",
+    deleteMaintenanceMsg: "Сигурни ли сте, че желаете да изтриете тази поддръжка?",
+    Optional: "По желание",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "SMSManager API Документация ",
+    "Gateway Type": "Тип на шлюза",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "Може да разделяте числата с",
+    or: "или",
+    recurringInterval: "Интервал",
+    Recurring: "Повтаряне",
+    strategyManual: "Активен/Неактивен ръчно",
+    warningTimezone: "Използва се часовата зона на сървъра",
+    weekdayShortMon: "Пон",
+    weekdayShortTue: "Вт",
+    weekdayShortWed: "Ср",
+    weekdayShortThu: "Чет",
+    weekdayShortFri: "Пет",
+    weekdayShortSat: "Съб",
+    weekdayShortSun: "Нед",
+    dayOfWeek: "Ден",
+    dayOfMonth: "Дата",
+    lastDay: "Последен ден",
+    lastDay1: "Последен ден от месеца",
+    lastDay2: "2-ри последен ден на месеца",
+    lastDay3: "3-ти последен ден на месеца",
+    lastDay4: "4-ти последен ден на месеца",
+    "No Maintenance": "Няма поддръжка",
+    pauseMaintenanceMsg: "Сигурни ли сте, че желаете да направите пауза?",
+    "maintenanceStatus-under-maintenance": "В режим подръжка",
+    "maintenanceStatus-inactive": "Неактивен",
+    "maintenanceStatus-scheduled": "Планиран",
+    "maintenanceStatus-ended": "Прилючена",
+    "maintenanceStatus-unknown": "Неизвестен",
+    "Display Timezone": "Покажи часова зона",
+    "Server Timezone": "Часова зона на сървъра",
+    statusPageMaintenanceEndDate: "Край",
 };

From 5761bc9b90cb3139f3268bcf5930abb3196d61d2 Mon Sep 17 00:00:00 2001
From: falentio <riv.kevinfalent.io@gmail.com>
Date: Sun, 16 Oct 2022 13:49:25 +0700
Subject: [PATCH 263/803] fix typos in id lang

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

diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index fe5d3594..da8a0fe6 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -568,7 +568,7 @@ export default {
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token Akses Berumur Panjang dapat dibuat dengan mengklik nama profil Anda (kiri bawah) dan menggulir ke bawah lalu klik Buat Token. ",
     "Notification Service": "Layanan Pemberitahuan",
     "default: notify all devices": "bawaan: notifikasi seluruh perangkat",
-    "A listof Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Daftar Layanan Pemberitahuan dapat ditemukan di Home Assistant pada \"Developer Tools > Services\" cari \"notification\" lalu cari nama perangkat Anda.",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Daftar Layanan Pemberitahuan dapat ditemukan di Home Assistant pada \"Developer Tools > Services\" cari \"notification\" lalu cari nama perangkat Anda.",
     "Automations can optionally be triggered in Home Assistant:": "Otomatisasi dapat dipicu secara opsional di Home Assistant:",
     "Trigger type:": "Tipe Trigger/Pemicu:",
     "Event type:": "Tipe event:",

From c0e67b6de9bfd3110ad8549fe1dc9a38250a9a87 Mon Sep 17 00:00:00 2001
From: Dave <dave.turmawan@outlook.com>
Date: Mon, 17 Oct 2022 20:09:25 +0700
Subject: [PATCH 264/803] Update id-ID.js

---
 src/languages/id-ID.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
index da8a0fe6..3a716392 100644
--- a/src/languages/id-ID.js
+++ b/src/languages/id-ID.js
@@ -27,8 +27,8 @@ export default {
     confirmImportMsg: "Apakah Anda yakin untuk mengimpor cadangan? Pastikan Anda telah memilih opsi impor yang tepat.",
     twoFAVerifyLabel: "Silakan ketik token Anda untuk memverifikasi bahwa 2FA berfungsi",
     tokenValidSettingsMsg: "Token benar! Anda sekarang dapat menyimpan pengaturan 2FA.",
-    confirmEnableTwoFAMsg: "Apakah anda yakin ingin mengaktifkan 2FA?",
-    confirmDisableTwoFAMsg: "Apakah anda yakin ingin menonaktifkan 2FA?",
+    confirmEnableTwoFAMsg: "Apakah Anda yakin ingin mengaktifkan 2FA?",
+    confirmDisableTwoFAMsg: "Apakah Anda yakin ingin menonaktifkan 2FA?",
     Settings: "Pengaturan",
     Dashboard: "Dasbor",
     "New Update": "Pembaruan Baru",
@@ -126,7 +126,7 @@ export default {
     "Resolver Server": "Resolver Server",
     "Resource Record Type": "Resource Record Type",
     "Last Result": "Hasil Terakhir",
-    "Create your admin account": "Buat akun admin anda",
+    "Create your admin account": "Buat akun admin Anda",
     "Repeat Password": "Ulangi Sandi",
     "Import Backup": "Impor Cadangan",
     "Export Backup": "Ekspor Cadangan",

From c7871427c3c2b8bce9da357b6381bfb01eae10c5 Mon Sep 17 00:00:00 2001
From: Denis Mishankov <mishankov@mail.com>
Date: Mon, 17 Oct 2022 20:20:51 +0300
Subject: [PATCH 265/803] compute title value

---
 src/components/Uptime.vue | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index 8565975c..422ae0ff 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -1,5 +1,5 @@
 <template>
-    <span :class="className" :title="24 + $t('-hour')">{{ uptime }}</span>
+    <span :class="className" :title="title">{{ uptime }}</span>
 </template>
 
 <script>
@@ -75,6 +75,14 @@ export default {
 
             return "";
         },
+
+        title() {
+            if (this.type === "720") {
+                return `30 ${this.$t("-day")}`;
+            }
+
+            return `24 ${this.$t("-hour")}`;
+        }
     },
 };
 </script>

From 7313aa656386e0b8c12af2210950abc4991a036c Mon Sep 17 00:00:00 2001
From: Denis Mishankov <mishankov@mail.com>
Date: Mon, 17 Oct 2022 20:36:52 +0300
Subject: [PATCH 266/803] fix spaces

---
 src/components/Uptime.vue | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index 422ae0ff..df9bd47a 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -78,10 +78,10 @@ export default {
 
         title() {
             if (this.type === "720") {
-                return `30 ${this.$t("-day")}`;
+                return `30${this.$t("-day")}`;
             }
 
-            return `24 ${this.$t("-hour")}`;
+            return `24${this.$t("-hour")}`;
         }
     },
 };

From 781f85592146cffdee3d6f9e95eae8298f9ff3b5 Mon Sep 17 00:00:00 2001
From: Marcin Kiszka <mkiszka525@gmail.com>
Date: Mon, 24 Oct 2022 12:44:29 +0200
Subject: [PATCH 267/803] [empty commit] pull request for Added support for
 SMSEagle device API notifications


From 08763b700ab22436f362ae2b13c1f5ec803eb41d Mon Sep 17 00:00:00 2001
From: Marcin Kiszka <mkiszka525@gmail.com>
Date: Mon, 24 Oct 2022 12:45:56 +0200
Subject: [PATCH 268/803] Added support for SMSEagle device API notifications

---
 server/notification-providers/smseagle.js | 71 +++++++++++++++++++++++
 server/notification.js                    |  2 +
 src/components/notifications/SMSEagle.vue | 40 +++++++++++++
 src/components/notifications/index.js     |  2 +
 src/languages/en.js                       | 10 ++++
 src/languages/pl.js                       | 10 ++++
 6 files changed, 135 insertions(+)
 create mode 100644 server/notification-providers/smseagle.js
 create mode 100644 src/components/notifications/SMSEagle.vue

diff --git a/server/notification-providers/smseagle.js b/server/notification-providers/smseagle.js
new file mode 100644
index 00000000..c431297e
--- /dev/null
+++ b/server/notification-providers/smseagle.js
@@ -0,0 +1,71 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+
+class SMSEagle extends NotificationProvider {
+
+    name = "SMSEagle";
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+
+        try {
+            let config = {
+                headers: {
+                    "Content-Type": "application/json",
+                }
+            };
+
+            let postData;
+            let sendMethod;
+            let recipientType;
+
+            let encoding = (notification.smseagleEncoding) ? "1" : "0";
+            let priority = (notification.smseaglePriority) ? notification.smseaglePriority : "0";
+
+            if (notification.smseagleRecipientType === "smseagle-contact") {
+                recipientType = "contactname";
+                sendMethod = "sms.send_tocontact";
+            }
+            if (notification.smseagleRecipientType === "smseagle-group") {
+                recipientType = "groupname";
+                sendMethod = "sms.send_togroup";
+            }
+            if (notification.smseagleRecipientType === "smseagle-to") {
+                recipientType = "to";
+                sendMethod = "sms.send_sms";
+            }
+
+            let params = {
+                access_token: notification.smseagleToken,
+                [recipientType]: notification.smseagleRecipient,
+                message: msg,
+                responsetype: "extended",
+                unicode: encoding,
+                highpriority: priority
+            };
+
+            postData = {
+                method: sendMethod,
+                params: params
+            };
+
+            let resp = await axios.post(notification.smseagleUrl + "/jsonrpc/sms", postData, config);
+
+            if ((JSON.stringify(resp.data)).indexOf("message_id") === -1) {
+                let error = "";
+                if (resp.data.result && resp.data.result.error_text) {
+                    error = `SMSEagle API returned error: ${JSON.stringify(resp.data.result.error_text)}`;
+                } else {
+                    error = "SMSEagle API returned an unexpected response";
+                }
+                throw new Error(error);
+            }
+
+            return okMsg;
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+}
+
+module.exports = SMSEagle;
diff --git a/server/notification.js b/server/notification.js
index aed92e5d..9069601b 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -32,6 +32,7 @@ const RocketChat = require("./notification-providers/rocket-chat");
 const SerwerSMS = require("./notification-providers/serwersms");
 const Signal = require("./notification-providers/signal");
 const Slack = require("./notification-providers/slack");
+const SMSEagle = require("./notification-providers/smseagle");
 const SMTP = require("./notification-providers/smtp");
 const Squadcast = require("./notification-providers/squadcast");
 const Stackfield = require("./notification-providers/stackfield");
@@ -89,6 +90,7 @@ class Notification {
             new Signal(),
             new SMSManager(),
             new Slack(),
+            new SMSEagle(),
             new SMTP(),
             new Squadcast(),
             new Stackfield(),
diff --git a/src/components/notifications/SMSEagle.vue b/src/components/notifications/SMSEagle.vue
new file mode 100644
index 00000000..ec781313
--- /dev/null
+++ b/src/components/notifications/SMSEagle.vue
@@ -0,0 +1,40 @@
+<template>
+    <div class="mb-3">
+        <label for="smseagle-url" class="form-label">{{ $t("smseagleUrl") }}</label>
+        <input id="smseagle-url" v-model="$parent.notification.smseagleUrl" type="text" minlength="7" class="form-control" placeholder="http://127.0.0.1" required>
+    </div>
+    <div class="mb-3">
+        <label for="smseagle-token" class="form-label">{{ $t("smseagleToken") }}</label>
+        <HiddenInput id="smseagle-token" v-model="$parent.notification.smseagleToken" :required="true"></HiddenInput>
+    </div>
+    <div class="mb-3">
+        <label for="smseagle-recipient-type" class="form-label">{{ $t("smseagleRecipientType") }}</label>
+        <select id="smseagle-recipient-type" v-model="$parent.notification.smseagleRecipientType" class="form-select">
+            <option value="smseagle-to" selected>{{ $t("smseagleTo") }}</option>
+            <option value="smseagle-group">{{ $t("smseagleGroup") }}</option>
+            <option value="smseagle-contact">{{ $t("smseagleContact") }}</option>
+        </select>
+    </div>
+    <div class="mb-3">
+        <label for="smseagle-recipient" class="form-label">{{ $t("smseagleRecipient") }}</label>
+        <input id="smseagle-recipient" v-model="$parent.notification.smseagleRecipient" type="text" class="form-control" required>
+    </div>
+    <div class="mb-3">
+        <label for="smseagle-priority" class="form-label">{{ $t("smseaglePriority") }}</label>
+        <input id="smseagle-priority" v-model="$parent.notification.smseaglePriority" type="number" class="form-control" min="0" max="9" step="1" placeholder="0">
+    </div>
+    <div class="mb-3 form-check form-switch">
+        <label for="smseagle-encoding" class="form-label">{{ $t("smseagleEncoding") }}</label>
+        <input id="smseagle-encoding" v-model="$parent.notification.smseagleEncoding" type="checkbox" class="form-check-input">
+    </div>
+</template>
+
+<script>
+import HiddenInput from "../HiddenInput.vue";
+
+export default {
+    components: {
+        HiddenInput,
+    },
+};
+</script>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index bca4a510..0c220b71 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -33,6 +33,7 @@ import Signal from "./Signal.vue";
 import SMSManager from "./SMSManager.vue";
 import Slack from "./Slack.vue";
 import Squadcast from "./Squadcast.vue";
+import SMSEagle from "./SMSEagle.vue";
 import Stackfield from "./Stackfield.vue";
 import STMP from "./SMTP.vue";
 import Teams from "./Teams.vue";
@@ -83,6 +84,7 @@ const NotificationFormList = {
     "SMSManager": SMSManager,
     "slack": Slack,
     "squadcast": Squadcast,
+    "SMSEagle": SMSEagle,
     "smtp": STMP,
     "stackfield": Stackfield,
     "teams": Teams,
diff --git a/src/languages/en.js b/src/languages/en.js
index f7434d39..18529d70 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -378,6 +378,16 @@ export default {
     serwersmsAPIPassword: "API Password",
     serwersmsPhoneNumber: "Phone number",
     serwersmsSenderName: "SMS Sender Name (registered via customer portal)",
+    smseagle: "SMSEagle",
+    smseagleTo: "Phone number(s)",
+    smseagleGroup: "Phonebook group name(s)",
+    smseagleContact: "Phonebook contact name(s)",
+    smseagleRecipientType: "Recipient type",
+    smseagleRecipient: "Recipient(s) (multiple must be separated with comma)",
+    smseagleToken: "API Access token",
+    smseagleUrl: "Your SMSEagle device URL",
+    smseagleEncoding: "Send as Unicode",
+    smseaglePriority: "Message priority (0-9, default = 0)",
     stackfield: "Stackfield",
     Customize: "Customize",
     "Custom Footer": "Custom Footer",
diff --git a/src/languages/pl.js b/src/languages/pl.js
index 3e962746..e18b50eb 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -359,6 +359,16 @@ export default {
     serwersmsAPIPassword: "Hasło API",
     serwersmsPhoneNumber: "Numer telefonu",
     serwersmsSenderName: "Nazwa nadawcy (zatwierdzona w panelu klienta)",
+    smseagle: "SMSEagle",
+    smseagleTo: "Numer/y telefonu",
+    smseagleGroup: "Grupa/y z Książki adresowej",
+    smseagleContact: "Kontakt/y z Książki adresowej",
+    smseagleRecipientType: "Typ odbiorcy",
+    smseagleRecipient: "Odbiorca/y (wiele musi być oddzielone przecinkami)",
+    smseagleToken: "Klucz dostępu API",
+    smseagleUrl: "URL Twojego urządzenia SMSEagle",
+    smseagleEncoding: "Wyślij jako Unicode",
+    smseaglePriority: "Priorytet wiadomości (0-9, domyślnie = 0)",
     stackfield: "Stackfield",
     Customize: "Dostosuj",
     "Custom Footer": "Niestandardowa stopka",

From 5cd58e6fa3752ee0026265eaa5045e1a88665919 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <saibamenppl@gmail.com>
Date: Mon, 24 Oct 2022 23:36:21 +0200
Subject: [PATCH 269/803] Add info about `npm install` to translators

Without this, you can have wrong indentation from ESLint
---
 src/languages/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/languages/README.md b/src/languages/README.md
index eddd6102..2c0ba83a 100644
--- a/src/languages/README.md
+++ b/src/languages/README.md
@@ -1,7 +1,8 @@
 # How to translate
 
 1. Fork this repo.
-2. Run `npm run update-language-files --language=<code>` where `<code>`
+2. Run `npm install`
+3. Run `npm run update-language-files --language=<code>` where `<code>`
    is a valid ISO language code:
    http://www.lingoes.net/en/translator/langcode.htm. You can also use
    this command to check if there are new strings to

From e7e7751e7ba9aac34d8aa430180b290a07224ad9 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <saibamenppl@gmail.com>
Date: Mon, 24 Oct 2022 23:38:38 +0200
Subject: [PATCH 270/803] Correct order

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

diff --git a/src/languages/README.md b/src/languages/README.md
index 2c0ba83a..c217ea0f 100644
--- a/src/languages/README.md
+++ b/src/languages/README.md
@@ -7,8 +7,8 @@
    http://www.lingoes.net/en/translator/langcode.htm. You can also use
    this command to check if there are new strings to
    translate for your language.
-3. Your language file should be filled in. You can translate now.
-4. Add it into `languageList` constant.
-5. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
+4. Your language file should be filled in. You can translate now.
+5. Add it into `languageList` constant.
+6. 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 [the issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏

From 134b3b8ac16dd285b3c3e914a4cc971afa6e59b4 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <adam.stachowicz@fingo.info>
Date: Tue, 25 Oct 2022 01:27:25 +0200
Subject: [PATCH 271/803] Fix 'dayjs' is never used warning

---
 server/model/heartbeat.js   | 1 -
 src/components/Datetime.vue | 2 --
 2 files changed, 3 deletions(-)

diff --git a/server/model/heartbeat.js b/server/model/heartbeat.js
index fa02cae8..b7847f87 100644
--- a/server/model/heartbeat.js
+++ b/server/model/heartbeat.js
@@ -1,4 +1,3 @@
-const dayjs = require("dayjs");
 const { BeanModel } = require("redbean-node/dist/bean-model");
 
 /**
diff --git a/src/components/Datetime.vue b/src/components/Datetime.vue
index 84bae503..0d4e182c 100644
--- a/src/components/Datetime.vue
+++ b/src/components/Datetime.vue
@@ -3,8 +3,6 @@
 </template>
 
 <script>
-import dayjs from "dayjs";
-
 export default {
     props: {
         /** Value of date time */

From f04fe4d2303c946b4e21fb9795d303b74a125d80 Mon Sep 17 00:00:00 2001
From: Benjamin Reich <dev@benjaminreich.de>
Date: Fri, 21 Oct 2022 14:50:29 +0200
Subject: [PATCH 272/803] add new german translations

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

diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index a6ae4077..78e96a29 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -576,4 +576,59 @@ export default {
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
     "Frontend Version": "Frontend Version",
     "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
+    Maintenance: "Wartung",
+    statusMaintenance: "Wartung",
+    "Schedule maintenance": "Geplante Wartung",
+    "Affected Monitors": "Betroffene Monitore",
+    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
+    "Start of maintenance": "Beginn der Wartung",
+    "All Status Pages": "Alle Status Seiten",
+    "Select status pages...": "Wähle Status Seiten...",
+    recurringIntervalMessage: "einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
+    affectedMonitorsDescription: "Wähle alle Monitore die von der Wartung betroffen sind",
+    affectedStatusPages: "Zeige diese Nachricht auf ausgewählten Status Seiten",
+    atLeastOneMonitor: "Wähle mindestens einen Monitor",
+    deleteMaintenanceMsg: "Möchtest du diese Wartung löschen?",
+    "Base URL": "Basis URL",
+    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaft Planung, automaitsche Esklaltion und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt! {0}",
+    goAlertIntegrationKeyInfo: "Bekomm einenen gernerischen API Schlüssel in folgeden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise der Wert des Token aus der URL.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingspielt werden.",
+    backupRecommend: "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
+    Optional: "Optional",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "SMSManager API Dokumente",
+    "Gateway Type": "Gateway Type",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "Du kannst Zahlen teilen mit",
+    or: "oder",
+    recurringInterval: "Intervall",
+    Recurring: "Wiederkehrend",
+    strategyManual: "Active/Inactive Manually",
+    warningTimezone: "Es wird die Zeitzone des Servers genutzt",
+    weekdayShortMon: "Mo",
+    weekdayShortTue: "Di",
+    weekdayShortWed: "Mi",
+    weekdayShortThu: "Do",
+    weekdayShortFri: "Fr",
+    weekdayShortSat: "Sa",
+    weekdayShortSun: "So",
+    dayOfWeek: "Tag der Woche",
+    dayOfMonth: "Tag im Monat",
+    lastDay: "Letzter Tag",
+    lastDay1: "Letzter Tag im Monat",
+    lastDay2: "Vorletzer Tag im Monat",
+    lastDay3: "3. letzter Tag im Monat",
+    lastDay4: "4. letzter Tag im Monat",
+    "No Maintenance": "Keine Wartung",
+    pauseMaintenanceMsg: "Möchtest du wirklich pausieren?",
+    "maintenanceStatus-under-maintenance": "Unter Wartung",
+    "maintenanceStatus-inactive": "Inaktiv",
+    "maintenanceStatus-scheduled": "Geplant",
+    "maintenanceStatus-ended": "Ende",
+    "maintenanceStatus-unknown": "Unbekannt",
+    "Display Timezone": "Zeitzone anzeigen",
+    "Server Timezone": "Server Zeitzone",
+    statusPageMaintenanceEndDate: "Ende",
 };

From 434174d3505fefd6ae95a76e050a91def1e33707 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <adam.stachowicz@fingo.info>
Date: Thu, 27 Oct 2022 10:46:32 +0200
Subject: [PATCH 273/803] I18n PL update (#2264)

* [PL] Only formatting by ESLint for now

* Translate new i18n keys to polish + small grammar/typo fixes

* ESLint again after npm install...
---
 src/languages/pl.js | 172 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 168 insertions(+), 4 deletions(-)

diff --git a/src/languages/pl.js b/src/languages/pl.js
index 3e962746..fc365ef8 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -125,7 +125,7 @@ export default {
     Export: "Eksportuj",
     Import: "Importuj",
     respTime: "Czas odp. (ms)",
-    notAvailableShort: "N/A",
+    notAvailableShort: "N/D",
     "Default enabled": "Włącz domyślnie",
     "Apply on all existing monitors": "Zastosuj do istniejących monitorów",
     Create: "Stwórz",
@@ -181,7 +181,7 @@ export default {
     "Edit Status Page": "Edytuj stronę statusu",
     "Go to Dashboard": "Idź do panelu",
     "Status Page": "Strona statusu",
-    "Status Pages": "Strona statusu",
+    "Status Pages": "Strony statusów",
     defaultNotificationName: "Moje powiadomienie {notification} ({number})",
     here: "tutaj",
     Required: "Wymagane",
@@ -435,7 +435,7 @@ export default {
     "HTTP Basic Auth": "Podstawowa autoryzacja HTTP",
     "New Status Page": "Nowa strona statusu",
     "Page Not Found": "Strona nie została znaleziona",
-    "Reverse Proxy": "Odwrotne Proxy",
+    "Reverse Proxy": "Zwrotny serwer proxy",
     Backup: "Backup",
     About: "O skrypcie",
     wayToGetCloudflaredURL: "(Pobierz cloudflared z {0})",
@@ -447,7 +447,7 @@ export default {
     "For example: nginx, Apache and Traefik.": "Na przykład: nginx, Apache i Traefik.",
     "Please read": "Przeczytaj proszę",
     "Subject:": "Temat:",
-    "Valid To:": "Ważdny do:",
+    "Valid To:": "Ważny do:",
     "Days Remaining:": "Pozostało dni:",
     "Issuer:": "Wydawca:",
     "Fingerprint:": "Odcisk palca:",
@@ -467,4 +467,168 @@ export default {
     "Domain Names": "Domeny",
     signedInDisp: "Zalogowany jako {0}",
     signedInDispDisabled: "Autoryzacja wyłączona.",
+    resendEveryXTimes: "Wysyłaj ponownie co {0} razy",
+    resendDisabled: "Ponowne wysyłanie jest wyłączone",
+    Maintenance: "Konserwacja",
+    statusMaintenance: "Konserwacja",
+    "Schedule maintenance": "Planowanie konserwacji",
+    "Affected Monitors": "Monitory dotknięte problemem",
+    "Pick Affected Monitors...": "Wybierz monitory, których to dotyczy...",
+    "Start of maintenance": "Rozpoczęcie konserwacji",
+    "All Status Pages": "Wszystkie strony statusu",
+    "Select status pages...": "Wybierz strony statusu...",
+    recurringIntervalMessage: "Uruchom raz dziennie | Uruchom raz na {0} dni",
+    affectedMonitorsDescription: "Wybierz monitory, których dotyczy bieżąca konserwacja",
+    affectedStatusPages: "Pokaż ten komunikat o konserwacji na wybranych stronach statusu",
+    atLeastOneMonitor: "Wybierz co najmniej jeden monitor, którego dotyczy problem",
+    deleteMaintenanceMsg: "Czy na pewno chcesz usunąć tę konserwację?",
+    dnsPortDescription: "Port serwera DNS. Domyślnie 53. Możesz zmienić port w dowolnym momencie.",
+    "Resend Notification if Down X times consequently": "Wyślij ponownie powiadomienie, jeśli nie działa X razy pod rząd",
+    error: "błąd",
+    critical: "krytyczny",
+    wayToGetPagerDutyKey: "Możesz to uzyskać, przechodząc do Service -> Service Directory -> (wybierz usługę) -> Integrations -> Add integration. Tutaj możesz wyszukać \"Events API V2\". Więcej informacji {0}",
+    "Integration Key": "Klucz integracji",
+    "Integration URL": "Adres URL integracji",
+    "Auto resolve or acknowledged": "Automatycznie rozwiązany lub potwierdzony",
+    "do nothing": "nie rób nic",
+    "auto acknowledged": "auto potwierdzony",
+    "auto resolve": "automatycznie rozwiązany",
+    "Bark Group": "Grupa Bark",
+    "Bark Sound": "Dźwięk Bark",
+    "HTTP Headers": "Nagłówki HTTP",
+    "Trust Proxy": "Ufaj proxy",
+    HomeAssistant: "Home Assistant",
+    RadiusSecret: "Sekretny klucz Radius",
+    RadiusSecretDescription: "Współdzielony sekretny klucz pomiędzy klientem a serwerem",
+    RadiusCalledStationId: "Id stacji wywoływanej",
+    RadiusCalledStationIdDescription: "Identyfikator wywoływanego urządzenia",
+    RadiusCallingStationId: "Id stacji wywoławczej",
+    RadiusCallingStationIdDescription: "Identyfikator urządzenia wywołującego",
+    "Certificate Expiry Notification": "Powiadomienie o wygaśnięciu certyfikatu",
+    "API Username": "Nazwa użytkownika API",
+    "API Key": "Klucz API",
+    "Recipient Number": "Numer odbiorcy",
+    "From Name/Number": "Od nazwa/numer",
+    "Leave blank to use a shared sender number.": "Pozostaw puste, aby użyć wspólnego numeru nadawcy.",
+    "Octopush API Version": "Wersja API Octopush",
+    "Legacy Octopush-DM": "Starsze Octopush-DM",
+    endpoint: "punkt końcowy",
+    octopushAPIKey: "\"API key\" z poświadczeń HTTP API w panelu sterowania",
+    octopushLogin: "\"Login\" z poświadczeń HTTP API w panelu sterowania",
+    promosmsLogin: "Nazwa logowania API",
+    promosmsPassword: "Hasło API",
+    "pushoversounds pushover": "Pushover (domyślny)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (długie)",
+    "pushoversounds climb": "Climb (długie)",
+    "pushoversounds persistent": "Persistent (długie)",
+    "pushoversounds echo": "Pushover Echo (długie)",
+    "pushoversounds updown": "Up Down (długie)",
+    "pushoversounds vibrate": "Tylko wibracje",
+    "pushoversounds none": "Brak (cisza)",
+    pushyAPIKey: "Tajny klucz API",
+    pushyToken: "Token urządzenia",
+    "Show update if available": "Pokaż aktualizację, jeśli jest dostępna",
+    "Also check beta release": "Sprawdź również wydanie beta",
+    "Using a Reverse Proxy?": "Używasz odwróconego proxy?",
+    "Check how to config it for WebSocket": "Sprawdź jak go skonfigurować dla WebSocket",
+    "Steam Game Server": "Serwer gry Steam",
+    "Most likely causes:": "Najbardziej prawdopodobne przyczyny:",
+    "The resource is no longer available.": "Zasób nie jest już dostępny.",
+    "There might be a typing error in the address.": "W adresie może być błąd w pisowni.",
+    "What you can try:": "Co możesz spróbować:",
+    "Retype the address.": "Ponownie wpisz adres.",
+    "Go back to the previous page.": "Wróć do poprzedniej strony.",
+    "Coming Soon": "Wkrótce",
+    wayToGetClickSendSMSToken: "Możesz uzyskać nazwę użytkownika API i klucz API z {0}.",
+    "Connection String": "Ciąg połączenia",
+    Query: "Zapytanie",
+    settingsCertificateExpiry: "Wygaśnięcie certyfikatu TLS",
+    certificationExpiryDescription: "Monitory HTTPS uruchamiają powiadomienia o wygaśnięciu certyfikatu TLS w:",
+    "Setup Docker Host": "Konfiguracja hosta Docker",
+    "Connection Type": "Typ połączenia",
+    "Docker Daemon": "Demon Dockera",
+    deleteDockerHostMsg: "Czy na pewno chcesz usunąć ten host Dockera dla wszystkich monitorów?",
+    socket: "Gniazdo",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Kontener Dockera",
+    "Container Name / ID": "Nazwa kontenera / ID",
+    "Docker Host": "Host Dockera",
+    "Docker Hosts": "Hosty Dockera",
+    "ntfy Topic": "Temat ntfy",
+    Domain: "Domena",
+    Workstation: "Stacja robocza",
+    disableCloudflaredNoAuthMsg: "Jesteś w trybie No Auth, hasło nie jest wymagane.",
+    trustProxyDescription: "Zaufaj nagłówkom 'X-Forwarded-*'. Jeśli chcesz uzyskać poprawne IP klienta, a twój Uptime Kuma jest za Nginx lub Apache, powinieneś to włączyć.",
+    wayToGetLineNotifyToken: "Możesz uzyskać token dostępu z {0}",
+    Examples: "Przykłady",
+    "Home Assistant URL": "URL Home Assistant",
+    "Long-Lived Access Token": "Długotrwały token dostępu",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Długotrwały token dostępu można utworzyć klikając na nazwę swojego profilu (na dole po lewej stronie) i przewijając do dołu, a następnie klikając Create Token. ",
+    "Notification Service": "Usługa powiadamiania",
+    "default: notify all devices": "domyślnie: powiadamiaj wszystkie urządzenia",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Listę usług powiadamiania można znaleźć w Home Assistant pod \"Developer Tools > Services\" wyszukaj \"notification\", aby znaleźć nazwę swojego urządzenia/telefonu.",
+    "Automations can optionally be triggered in Home Assistant:": "Automaty mogą być opcjonalnie uruchamiane w Home Assistant:",
+    "Trigger type:": "Typ wyzwalacza:",
+    "Event type:": "Typ zdarzenia:",
+    "Event data:": "Dane o zdarzeniu:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Następnie wybierz akcję, na przykład przełącz scenę na taką, w której światło RGB jest czerwone.",
+    "Frontend Version": "Wersja frontu",
+    "Frontend Version do not match backend version!": "Wersja frontu nie pasuje do wersji backendu!",
+    "Base URL": "Bazowy adres URL",
+    goAlertInfo: "GoAlert to aplikacja open source do planowania, automatycznych eskalacji i powiadomień (jak SMS lub połączenia głosowe). Automatycznie angażuj właściwą osobę, we właściwy sposób i we właściwym czasie! {0}",
+    goAlertIntegrationKeyInfo: "Pobierz generyczny klucz integracyjny API dla usługi, którego wartość skopiowanego tokena URL jest zwykle w formacie \"aaaaaaaa-bbb-cccc-dddd-eeeeee\".",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Przestarzałe: ponieważ dodano wiele funkcji i funkcja tworzenia kopii zapasowych nie jest wystarczająco utrzymywana, nie może generować ani przywracać pełnej kopii zapasowej.",
+    backupRecommend: "Zamiast tego należy wykonać bezpośrednią kopię zapasową woluminu lub folderu danych (./data/).",
+    Optional: "Opcjonalne",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "Dokumentacja API SMSManager ",
+    "Gateway Type": "Typ bramy",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "Możesz dzielić liczby przez",
+    or: "lub",
+    recurringInterval: "odstęp czasu",
+    Recurring: "powtarzający się",
+    strategyManual: "Aktywowany/dezaktywowany ręcznie",
+    warningTimezone: "Używa strefy czasowej serwera",
+    weekdayShortMon: "pon",
+    weekdayShortTue: "wt",
+    weekdayShortWed: "śr",
+    weekdayShortThu: "czw",
+    weekdayShortFri: "pt",
+    weekdayShortSat: "sob",
+    weekdayShortSun: "niedz",
+    dayOfWeek: "Dzień tygodnia",
+    dayOfMonth: "Dzień miesiąca",
+    lastDay: "Ostatni dzień",
+    lastDay1: "Ostatni dzień miesiąca",
+    lastDay2: "2. ostatni dzień miesiąca",
+    lastDay3: "3. ostatni dzień miesiąca",
+    lastDay4: "4. ostatni dzień miesiąca",
+    "No Maintenance": "Brak konserwacji",
+    pauseMaintenanceMsg: "Jesteś pewien, że chcesz zatrzymać?",
+    "maintenanceStatus-under-maintenance": "Podczas konserwacji",
+    "maintenanceStatus-inactive": "Nieaktywny",
+    "maintenanceStatus-scheduled": "Zaplanowany",
+    "maintenanceStatus-ended": "Zakończony",
+    "maintenanceStatus-unknown": "Nieznany",
+    "Display Timezone": "Wyświetlana strefa czasowa",
+    "Server Timezone": "Strefa czasowa serwera",
+    statusPageMaintenanceEndDate: "Koniec",
 };

From 1cb6940590c85efdf5faf9372dc14bf78c8cafc2 Mon Sep 17 00:00:00 2001
From: 5idereal <nelson22768384@gmail.com>
Date: Fri, 28 Oct 2022 15:50:00 +0800
Subject: [PATCH 274/803] update zh-tw translation

---
 src/languages/zh-TW.js | 51 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 50 insertions(+), 1 deletion(-)

diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
index e677d27e..5f7bfb6e 100644
--- a/src/languages/zh-TW.js
+++ b/src/languages/zh-TW.js
@@ -9,11 +9,24 @@ export default {
     upsideDownModeDescription: "反轉顯示狀態。若服務可以連線,將顯示離線。",
     maxRedirectDescription: "最大重新導向跟隨次數。設為 0 將停用重新導向。",
     acceptedStatusCodesDescription: "選擇視為成功回應的狀態碼。",
+    Maintenance: "維護",
+    statusMaintenance: "維護",
+    "Schedule maintenance": "排程維護",
+    "Affected Monitors": "受影響的監測器",
+    "Pick Affected Monitors...": "挑選受影響的監測器...",
+    "Start of maintenance": "維護起始",
+    "All Status Pages": "所有狀態頁",
+    "Select status pages...": "選擇狀態頁...",
+    recurringIntervalMessage: "每日執行 | 每 {0} 天執行",
+    affectedMonitorsDescription: "選擇受目前維護影響的監測器",
+    affectedStatusPages: "在已選取的狀態頁中顯示此維護訊息",
+    atLeastOneMonitor: "至少選擇一個受影響的監測器",
     passwordNotMatchMsg: "密碼不相符。",
     notificationDescription: "必須將通知指派給監測器才能運作。",
     keywordDescription: "HTML 或 JSON 回應的搜尋關鍵字。區分大小寫。",
     pauseDashboardHome: "暫停",
     deleteMonitorMsg: "您確定要刪除此監測器嗎?",
+    deleteMaintenanceMsg: "您確定要刪除此維護嗎?",
     deleteNotificationMsg: "您確定要為所有監測器刪除此通知嗎?",
     dnsPortDescription: "DNS 伺服器連接埠。預設為 53。您可以隨時變更連接埠。",
     resolverserverDescription: "Cloudflare 為預設伺服器。您可以隨時更換解析伺服器。",
@@ -305,7 +318,7 @@ export default {
     Method: "方法",
     Body: "主體",
     Headers: "標頭",
-    PushUrl: "Push URL",
+    PushUrl: "Push 網址",
     HeadersInvalidFormat: "要求標頭不是有效的 JSON:",
     BodyInvalidFormat: "請求主體不是有效的 JSON:",
     "Monitor History": "監測器歷史紀錄",
@@ -582,4 +595,40 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "過時:由於新功能的增加,且未妥善維護,故此備份功能無法產生或復原完整備份。",
     backupRecommend: "請直接備份磁碟區或 ./data/ 資料夾。",
+    "Optional": "選填",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "SMSManager API 文件 ",
+    "Gateway Type": "閘道類型",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "若要除數,您可以使用",
+    "or": "或是",
+    recurringInterval: "間隔",
+    "Recurring": "週期性",
+    strategyManual: "手動切換使用中/非使用中",
+    warningTimezone: "正在使用伺服器的時區",
+    weekdayShortMon: "一",
+    weekdayShortTue: "二",
+    weekdayShortWed: "三",
+    weekdayShortThu: "四",
+    weekdayShortFri: "五",
+    weekdayShortSat: "六",
+    weekdayShortSun: "日",
+    dayOfWeek: "每周特定一天",
+    dayOfMonth: "每月特定一天",
+    lastDay: "最後一天",
+    lastDay1: "每月的最後一天",
+    lastDay2: "每月的倒數第二天",
+    lastDay3: "每月的倒數第三天",
+    lastDay4: "每月的倒數第四天",
+    "No Maintenance": "無維護",
+    pauseMaintenanceMsg: "您確定要暫停嗎?",
+    "maintenanceStatus-under-maintenance": "維護中",
+    "maintenanceStatus-inactive": "非使用中",
+    "maintenanceStatus-scheduled": "已排程",
+    "maintenanceStatus-ended": "已結束",
+    "maintenanceStatus-unknown": "未知",
+    "Display Timezone": "顯示時區",
+    "Server Timezone": "伺服器時區",
+    statusPageMaintenanceEndDate: "結束",
 };

From 54efde818503793ed28c81dbf3cfca51d223087f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 29 Oct 2022 23:29:33 +0800
Subject: [PATCH 275/803] Update socket.io and remove an useless event listener

---
 package-lock.json    | 239 ++++++++++++-------------------------------
 package.json         |   4 +-
 src/mixins/socket.js |   1 -
 3 files changed, 68 insertions(+), 176 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3347c1bd..5adb1841 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.18.5",
+    "version": "1.19.0-beta.0",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.18.5",
+            "version": "1.19.0-beta.0",
             "license": "MIT",
             "dependencies": {
                 "@louislam/sqlite3": "15.1.2",
@@ -49,8 +49,8 @@
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
                 "redbean-node": "0.1.4",
-                "socket.io": "~4.4.1",
-                "socket.io-client": "~4.4.1",
+                "socket.io": "~4.5.3",
+                "socket.io-client": "~4.5.3",
                 "socks-proxy-agent": "6.1.1",
                 "tar": "~6.1.11",
                 "tcp-ping": "~0.1.1",
@@ -3366,9 +3366,9 @@
             }
         },
         "node_modules/@socket.io/component-emitter": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz",
-            "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q=="
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
+            "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
         },
         "node_modules/@tediousjs/connection-string": {
             "version": "0.3.0",
@@ -3450,11 +3450,6 @@
                 "@popperjs/core": "^2.9.2"
             }
         },
-        "node_modules/@types/component-emitter": {
-            "version": "1.2.11",
-            "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
-            "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ=="
-        },
         "node_modules/@types/connect": {
             "version": "3.4.35",
             "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@@ -4593,11 +4588,6 @@
             "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
             "dev": true
         },
-        "node_modules/backo2": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
-            "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA=="
-        },
         "node_modules/badge-maker": {
             "version": "3.3.1",
             "resolved": "https://registry.npmjs.org/badge-maker/-/badge-maker-3.3.1.tgz",
@@ -5444,11 +5434,6 @@
             "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
             "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
         },
-        "node_modules/component-emitter": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-            "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
-        },
         "node_modules/compressible": {
             "version": "2.0.18",
             "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -6547,9 +6532,9 @@
             }
         },
         "node_modules/engine.io": {
-            "version": "6.1.3",
-            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz",
-            "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==",
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz",
+            "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==",
             "dependencies": {
                 "@types/cookie": "^0.4.1",
                 "@types/cors": "^2.8.12",
@@ -6567,19 +6552,15 @@
             }
         },
         "node_modules/engine.io-client": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz",
-            "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==",
+            "version": "6.2.3",
+            "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz",
+            "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==",
             "dependencies": {
-                "@socket.io/component-emitter": "~3.0.0",
+                "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.1",
-                "engine.io-parser": "~5.0.0",
-                "has-cors": "1.1.0",
-                "parseqs": "0.0.6",
-                "parseuri": "0.0.6",
+                "engine.io-parser": "~5.0.3",
                 "ws": "~8.2.3",
-                "xmlhttprequest-ssl": "~2.0.0",
-                "yeast": "0.1.2"
+                "xmlhttprequest-ssl": "~2.0.0"
             }
         },
         "node_modules/engine.io-client/node_modules/ws": {
@@ -8493,11 +8474,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/has-cors": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
-            "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA=="
-        },
         "node_modules/has-flag": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -12891,16 +12867,6 @@
                 "url": "https://github.com/inikulin/parse5?sponsor=1"
             }
         },
-        "node_modules/parseqs": {
-            "version": "0.0.6",
-            "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
-            "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
-        },
-        "node_modules/parseuri": {
-            "version": "0.0.6",
-            "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
-            "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
-        },
         "node_modules/parseurl": {
             "version": "1.3.3",
             "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -14514,61 +14480,46 @@
             }
         },
         "node_modules/socket.io": {
-            "version": "4.4.1",
-            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz",
-            "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==",
+            "version": "4.5.3",
+            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz",
+            "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==",
             "dependencies": {
                 "accepts": "~1.3.4",
                 "base64id": "~2.0.0",
                 "debug": "~4.3.2",
-                "engine.io": "~6.1.0",
-                "socket.io-adapter": "~2.3.3",
-                "socket.io-parser": "~4.0.4"
+                "engine.io": "~6.2.0",
+                "socket.io-adapter": "~2.4.0",
+                "socket.io-parser": "~4.2.0"
             },
             "engines": {
                 "node": ">=10.0.0"
             }
         },
         "node_modules/socket.io-adapter": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
-            "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ=="
+            "version": "2.4.0",
+            "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
+            "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
         },
         "node_modules/socket.io-client": {
-            "version": "4.4.1",
-            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz",
-            "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==",
+            "version": "4.5.3",
+            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz",
+            "integrity": "sha512-I/hqDYpQ6JKwtJOf5ikM+Qz+YujZPMEl6qBLhxiP0nX+TfXKhW4KZZG8lamrD6Y5ngjmYHreESVasVCgi5Kl3A==",
             "dependencies": {
-                "@socket.io/component-emitter": "~3.0.0",
-                "backo2": "~1.0.2",
+                "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.2",
-                "engine.io-client": "~6.1.1",
-                "parseuri": "0.0.6",
-                "socket.io-parser": "~4.1.1"
-            },
-            "engines": {
-                "node": ">=10.0.0"
-            }
-        },
-        "node_modules/socket.io-client/node_modules/socket.io-parser": {
-            "version": "4.1.2",
-            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz",
-            "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==",
-            "dependencies": {
-                "@socket.io/component-emitter": "~3.0.0",
-                "debug": "~4.3.1"
+                "engine.io-client": "~6.2.3",
+                "socket.io-parser": "~4.2.0"
             },
             "engines": {
                 "node": ">=10.0.0"
             }
         },
         "node_modules/socket.io-parser": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz",
-            "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==",
+            "version": "4.2.1",
+            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
+            "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
             "dependencies": {
-                "@types/component-emitter": "^1.2.10",
-                "component-emitter": "~1.3.0",
+                "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.1"
             },
             "engines": {
@@ -16636,11 +16587,6 @@
                 "fd-slicer": "~1.1.0"
             }
         },
-        "node_modules/yeast": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
-            "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg=="
-        },
         "node_modules/yocto-queue": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -19080,9 +19026,9 @@
             }
         },
         "@socket.io/component-emitter": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz",
-            "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q=="
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
+            "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
         },
         "@tediousjs/connection-string": {
             "version": "0.3.0",
@@ -19161,11 +19107,6 @@
                 "@popperjs/core": "^2.9.2"
             }
         },
-        "@types/component-emitter": {
-            "version": "1.2.11",
-            "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
-            "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ=="
-        },
         "@types/connect": {
             "version": "3.4.35",
             "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@@ -20154,11 +20095,6 @@
                 }
             }
         },
-        "backo2": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
-            "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA=="
-        },
         "badge-maker": {
             "version": "3.3.1",
             "resolved": "https://registry.npmjs.org/badge-maker/-/badge-maker-3.3.1.tgz",
@@ -20798,11 +20734,6 @@
             "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
             "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
         },
-        "component-emitter": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-            "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
-        },
         "compressible": {
             "version": "2.0.18",
             "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -21645,9 +21576,9 @@
             }
         },
         "engine.io": {
-            "version": "6.1.3",
-            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz",
-            "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==",
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz",
+            "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==",
             "requires": {
                 "@types/cookie": "^0.4.1",
                 "@types/cors": "^2.8.12",
@@ -21669,19 +21600,15 @@
             }
         },
         "engine.io-client": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.1.1.tgz",
-            "integrity": "sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g==",
+            "version": "6.2.3",
+            "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz",
+            "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==",
             "requires": {
-                "@socket.io/component-emitter": "~3.0.0",
+                "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.1",
-                "engine.io-parser": "~5.0.0",
-                "has-cors": "1.1.0",
-                "parseqs": "0.0.6",
-                "parseuri": "0.0.6",
+                "engine.io-parser": "~5.0.3",
                 "ws": "~8.2.3",
-                "xmlhttprequest-ssl": "~2.0.0",
-                "yeast": "0.1.2"
+                "xmlhttprequest-ssl": "~2.0.0"
             },
             "dependencies": {
                 "ws": {
@@ -22993,11 +22920,6 @@
             "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
             "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="
         },
-        "has-cors": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
-            "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA=="
-        },
         "has-flag": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -26287,16 +26209,6 @@
                 "parse5": "^7.0.0"
             }
         },
-        "parseqs": {
-            "version": "0.0.6",
-            "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
-            "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
-        },
-        "parseuri": {
-            "version": "0.0.6",
-            "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
-            "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
-        },
         "parseurl": {
             "version": "1.3.3",
             "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -27505,54 +27417,40 @@
             "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
         },
         "socket.io": {
-            "version": "4.4.1",
-            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz",
-            "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==",
+            "version": "4.5.3",
+            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz",
+            "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==",
             "requires": {
                 "accepts": "~1.3.4",
                 "base64id": "~2.0.0",
                 "debug": "~4.3.2",
-                "engine.io": "~6.1.0",
-                "socket.io-adapter": "~2.3.3",
-                "socket.io-parser": "~4.0.4"
+                "engine.io": "~6.2.0",
+                "socket.io-adapter": "~2.4.0",
+                "socket.io-parser": "~4.2.0"
             }
         },
         "socket.io-adapter": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz",
-            "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ=="
+            "version": "2.4.0",
+            "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
+            "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
         },
         "socket.io-client": {
-            "version": "4.4.1",
-            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.4.1.tgz",
-            "integrity": "sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ==",
+            "version": "4.5.3",
+            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz",
+            "integrity": "sha512-I/hqDYpQ6JKwtJOf5ikM+Qz+YujZPMEl6qBLhxiP0nX+TfXKhW4KZZG8lamrD6Y5ngjmYHreESVasVCgi5Kl3A==",
             "requires": {
-                "@socket.io/component-emitter": "~3.0.0",
-                "backo2": "~1.0.2",
+                "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.2",
-                "engine.io-client": "~6.1.1",
-                "parseuri": "0.0.6",
-                "socket.io-parser": "~4.1.1"
-            },
-            "dependencies": {
-                "socket.io-parser": {
-                    "version": "4.1.2",
-                    "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz",
-                    "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==",
-                    "requires": {
-                        "@socket.io/component-emitter": "~3.0.0",
-                        "debug": "~4.3.1"
-                    }
-                }
+                "engine.io-client": "~6.2.3",
+                "socket.io-parser": "~4.2.0"
             }
         },
         "socket.io-parser": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz",
-            "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==",
+            "version": "4.2.1",
+            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
+            "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
             "requires": {
-                "@types/component-emitter": "^1.2.10",
-                "component-emitter": "~1.3.0",
+                "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.1"
             }
         },
@@ -29123,11 +29021,6 @@
                 "fd-slicer": "~1.1.0"
             }
         },
-        "yeast": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
-            "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg=="
-        },
         "yocto-queue": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 5b9f3736..1f614480 100644
--- a/package.json
+++ b/package.json
@@ -103,8 +103,8 @@
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
         "redbean-node": "0.1.4",
-        "socket.io": "~4.4.1",
-        "socket.io-client": "~4.4.1",
+        "socket.io": "~4.5.3",
+        "socket.io-client": "~4.5.3",
         "socks-proxy-agent": "6.1.1",
         "tar": "~6.1.11",
         "tcp-ping": "~0.1.1",
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 74522ffe..ef18a6e9 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -58,7 +58,6 @@ export default {
     },
 
     created() {
-        window.addEventListener("resize", this.onResize);
         this.initSocketIO();
     },
 

From 2ea71839d106a7decb055f7ca387c5ffe45211e6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 29 Oct 2022 23:37:05 +0800
Subject: [PATCH 276/803] Add `npm run start-server-watch-dev` for watching
 server code changes and restart (Node.js 19 only)

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

diff --git a/package.json b/package.json
index 1f614480..2a876f91 100644
--- a/package.json
+++ b/package.json
@@ -20,8 +20,9 @@
         "dev": "concurrently -k -r \"wait-on tcp:3000 && npm run start-server-dev \" \"npm run start-frontend-dev\"",
         "start-frontend-dev": "cross-env NODE_ENV=development vite --host --config ./config/vite.config.js",
         "start": "npm run start-server",
-        "start-server": "node server/server.js",
+        "start-server": "node --watch server/server.js",
         "start-server-dev": "cross-env NODE_ENV=development node server/server.js",
+        "start-server-watch-dev": "cross-env NODE_ENV=development node  --watch server/server.js",
         "build": "vite build --config ./config/vite.config.js",
         "test": "node test/prepare-test-server.js && npm run jest-backend",
         "test-with-build": "npm run build && npm test",

From 214ddc264d88f1d72171226928593dee577f2942 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 29 Oct 2022 23:40:09 +0800
Subject: [PATCH 277/803] Fix mistake

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

diff --git a/package.json b/package.json
index 2a876f91..c7de137e 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
         "dev": "concurrently -k -r \"wait-on tcp:3000 && npm run start-server-dev \" \"npm run start-frontend-dev\"",
         "start-frontend-dev": "cross-env NODE_ENV=development vite --host --config ./config/vite.config.js",
         "start": "npm run start-server",
-        "start-server": "node --watch server/server.js",
+        "start-server": "node server/server.js",
         "start-server-dev": "cross-env NODE_ENV=development node server/server.js",
         "start-server-watch-dev": "cross-env NODE_ENV=development node  --watch server/server.js",
         "build": "vite build --config ./config/vite.config.js",

From 68862c0b3f5b23f21b21fff43729e5d853bf33c2 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 1 Nov 2022 20:27:40 +0800
Subject: [PATCH 278/803] Fix Pushbullet do not handle general message
 correctly and fix name convention (Close #1890)

---
 server/notification-providers/pushbullet.js | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/server/notification-providers/pushbullet.js b/server/notification-providers/pushbullet.js
index 7f7a1c8d..1346655d 100644
--- a/server/notification-providers/pushbullet.js
+++ b/server/notification-providers/pushbullet.js
@@ -19,26 +19,26 @@ class Pushbullet extends NotificationProvider {
                 }
             };
             if (heartbeatJSON == null) {
-                let testdata = {
+                let data = {
                     "type": "note",
                     "title": "Uptime Kuma Alert",
-                    "body": "Testing Successful.",
+                    "body": msg,
                 };
-                await axios.post(pushbulletUrl, testdata, config);
+                await axios.post(pushbulletUrl, data, config);
             } else if (heartbeatJSON["status"] === DOWN) {
-                let downdata = {
+                let downData = {
                     "type": "note",
                     "title": "UptimeKuma Alert: " + monitorJSON["name"],
                     "body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"],
                 };
-                await axios.post(pushbulletUrl, downdata, config);
+                await axios.post(pushbulletUrl, downData, config);
             } else if (heartbeatJSON["status"] === UP) {
-                let updata = {
+                let upData = {
                     "type": "note",
                     "title": "UptimeKuma Alert: " + monitorJSON["name"],
                     "body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"],
                 };
-                await axios.post(pushbulletUrl, updata, config);
+                await axios.post(pushbulletUrl, upData, config);
             }
             return okMsg;
         } catch (error) {

From 204015f1f5cf6af75f31cde0c918bdf873231629 Mon Sep 17 00:00:00 2001
From: Ealrang <53871457+Ealrang@users.noreply.github.com>
Date: Sat, 12 Nov 2022 22:15:04 +0800
Subject: [PATCH 279/803] Update zh-CN.js

Correct typos
---
 src/languages/zh-CN.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index 0d21efda..ff11c7e9 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -2,7 +2,7 @@ export default {
     languageName: "简体中文",
     checkEverySecond: "检测频率 {0} 秒",
     retryCheckEverySecond: "重试间隔 {0} 秒",
-    retriesDescription: "服务被标记为故障并发送通知之前得最大重试次数",
+    retriesDescription: "服务被标记为故障并发送通知之前的最大重试次数",
     ignoreTLSError: "忽略 HTTPS 站点的 TLS/SSL 错误",
     upsideDownModeDescription: "反转状态监控,如果服务可访问,则认为是故障。",
     maxRedirectDescription: "允许的最大重定向次数。设置为 0 禁用重定向。",

From 4042c263907b20aa9d4b9dd2c584f1ff740061ce Mon Sep 17 00:00:00 2001
From: Dafnik <git@dafnik.me>
Date: Mon, 14 Nov 2022 18:05:48 +0100
Subject: [PATCH 280/803] Fix 'undefined' in link preview generation

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

diff --git a/server/model/status_page.js b/server/model/status_page.js
index 4e7b38cf..fbbff391 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -38,7 +38,7 @@ class StatusPage extends BeanModel {
      */
     static async renderHTML(indexHTML, statusPage) {
         const $ = cheerio.load(indexHTML);
-        const description155 = statusPage.description?.substring(0, 155);
+        const description155 = statusPage.description?.substring(0, 155) ?? "";
 
         $("title").text(statusPage.title);
         $("meta[name=description]").attr("content", description155);

From b059a36e668a278df89749db5804f8e7900fd0fb Mon Sep 17 00:00:00 2001
From: rmarops <richie.markham@nuborders.com>
Date: Wed, 16 Nov 2022 20:50:34 -0500
Subject: [PATCH 281/803] added MongoDB ping monitor

---
 package-lock.json         | 2181 +++++++++++++++++++++++++++++++++++++
 package.json              |    1 +
 server/model/monitor.js   |   10 +-
 server/util-server.js     |   22 +
 src/pages/EditMonitor.vue |   14 +
 5 files changed, 2227 insertions(+), 1 deletion(-)

diff --git a/package-lock.json b/package-lock.json
index e2e1f5d1..93118feb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -38,6 +38,7 @@
                 "jsonwebtoken": "~8.5.1",
                 "jwt-decode": "~3.1.2",
                 "limiter": "~2.1.0",
+                "mongodb": "^4.12.0",
                 "mqtt": "~4.3.7",
                 "mssql": "~8.1.4",
                 "node-cloudflared-tunnel": "~1.0.9",
@@ -167,6 +168,1050 @@
                 "node": ">=6.0.0"
             }
         },
+        "node_modules/@aws-crypto/ie11-detection": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz",
+            "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/sha256-browser": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
+            "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/ie11-detection": "^2.0.0",
+                "@aws-crypto/sha256-js": "^2.0.0",
+                "@aws-crypto/supports-web-crypto": "^2.0.0",
+                "@aws-crypto/util": "^2.0.0",
+                "@aws-sdk/types": "^3.1.0",
+                "@aws-sdk/util-locate-window": "^3.0.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/sha256-js": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
+            "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/util": "^2.0.0",
+                "@aws-sdk/types": "^3.1.0",
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/sha256-js/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/supports-web-crypto": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz",
+            "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/util": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz",
+            "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "^3.110.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/util/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-sdk/abort-controller": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.212.0.tgz",
+            "integrity": "sha512-mXeBSuDi0Fpul4zk9VH2z0VKN+/+6hyJ9SXSRhn3LpMcyj3GeZtXyTB2wCsfxXYGxeGbV+bIzbPbhZza6wNfWg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-cognito-identity": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.212.0.tgz",
+            "integrity": "sha512-0yt6lyYUYng5Nnn5EyTnoVZuVXD3r6eaDjrIZQTc8yhNkbTg+eRLlGnJVkrn/O9NPRS52XqxLCbJc/Wk2SSH+w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/client-sts": "3.212.0",
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/credential-provider-node": "3.212.0",
+                "@aws-sdk/fetch-http-handler": "3.212.0",
+                "@aws-sdk/hash-node": "3.212.0",
+                "@aws-sdk/invalid-dependency": "3.212.0",
+                "@aws-sdk/middleware-content-length": "3.212.0",
+                "@aws-sdk/middleware-endpoint": "3.212.0",
+                "@aws-sdk/middleware-host-header": "3.212.0",
+                "@aws-sdk/middleware-logger": "3.212.0",
+                "@aws-sdk/middleware-recursion-detection": "3.212.0",
+                "@aws-sdk/middleware-retry": "3.212.0",
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/middleware-signing": "3.212.0",
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/middleware-user-agent": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/node-http-handler": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/smithy-client": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.212.0",
+                "@aws-sdk/util-defaults-mode-node": "3.212.0",
+                "@aws-sdk/util-endpoints": "3.212.0",
+                "@aws-sdk/util-user-agent-browser": "3.212.0",
+                "@aws-sdk/util-user-agent-node": "3.212.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-sso": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.212.0.tgz",
+            "integrity": "sha512-b9lFI8Uz6YxIzAlS2uq62y5fX097lwcdkiq2N8YN2U7YgHQaKMIFnV8ZqkDdhZi2eUKwhSdUZzQy0tF6en2Ubg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/fetch-http-handler": "3.212.0",
+                "@aws-sdk/hash-node": "3.212.0",
+                "@aws-sdk/invalid-dependency": "3.212.0",
+                "@aws-sdk/middleware-content-length": "3.212.0",
+                "@aws-sdk/middleware-endpoint": "3.212.0",
+                "@aws-sdk/middleware-host-header": "3.212.0",
+                "@aws-sdk/middleware-logger": "3.212.0",
+                "@aws-sdk/middleware-recursion-detection": "3.212.0",
+                "@aws-sdk/middleware-retry": "3.212.0",
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/middleware-user-agent": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/node-http-handler": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/smithy-client": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.212.0",
+                "@aws-sdk/util-defaults-mode-node": "3.212.0",
+                "@aws-sdk/util-endpoints": "3.212.0",
+                "@aws-sdk/util-user-agent-browser": "3.212.0",
+                "@aws-sdk/util-user-agent-node": "3.212.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-sso-oidc": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.212.0.tgz",
+            "integrity": "sha512-Co0AU+y9KEAZUraT36ttFZlmwARsr82q2nQji5E8zg3zlUHtqGvMJqxArudz3iOb2E9WRi75MwAQmLO2xEk45A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/fetch-http-handler": "3.212.0",
+                "@aws-sdk/hash-node": "3.212.0",
+                "@aws-sdk/invalid-dependency": "3.212.0",
+                "@aws-sdk/middleware-content-length": "3.212.0",
+                "@aws-sdk/middleware-endpoint": "3.212.0",
+                "@aws-sdk/middleware-host-header": "3.212.0",
+                "@aws-sdk/middleware-logger": "3.212.0",
+                "@aws-sdk/middleware-recursion-detection": "3.212.0",
+                "@aws-sdk/middleware-retry": "3.212.0",
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/middleware-user-agent": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/node-http-handler": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/smithy-client": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.212.0",
+                "@aws-sdk/util-defaults-mode-node": "3.212.0",
+                "@aws-sdk/util-endpoints": "3.212.0",
+                "@aws-sdk/util-user-agent-browser": "3.212.0",
+                "@aws-sdk/util-user-agent-node": "3.212.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-sts": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.212.0.tgz",
+            "integrity": "sha512-Zl8665HT1Do/yfiFEtqEjLkHSkAo5Isg2QU65Kbknj2W2DFj92a1cRvMlHanDLxlpuoryGP9/u1efYZeWeIdlg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/credential-provider-node": "3.212.0",
+                "@aws-sdk/fetch-http-handler": "3.212.0",
+                "@aws-sdk/hash-node": "3.212.0",
+                "@aws-sdk/invalid-dependency": "3.212.0",
+                "@aws-sdk/middleware-content-length": "3.212.0",
+                "@aws-sdk/middleware-endpoint": "3.212.0",
+                "@aws-sdk/middleware-host-header": "3.212.0",
+                "@aws-sdk/middleware-logger": "3.212.0",
+                "@aws-sdk/middleware-recursion-detection": "3.212.0",
+                "@aws-sdk/middleware-retry": "3.212.0",
+                "@aws-sdk/middleware-sdk-sts": "3.212.0",
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/middleware-signing": "3.212.0",
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/middleware-user-agent": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/node-http-handler": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/smithy-client": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.212.0",
+                "@aws-sdk/util-defaults-mode-node": "3.212.0",
+                "@aws-sdk/util-endpoints": "3.212.0",
+                "@aws-sdk/util-user-agent-browser": "3.212.0",
+                "@aws-sdk/util-user-agent-node": "3.212.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "fast-xml-parser": "4.0.11",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/config-resolver": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.212.0.tgz",
+            "integrity": "sha512-hIP/Izpv6GCsDTnHCd/X9Ro7Mw5le+gr2VbkZHWR0c8+3xZWp8N5S0QnUBogF3Dv2KwPbmHP+bs/vqqo3miUjQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/signature-v4": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-cognito-identity": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.212.0.tgz",
+            "integrity": "sha512-0BEML2iBGXyFnD1HNQ28B+9Ev7NGcu9itYcJue5mBkCOka3mW55xAPYwp3es0rhQ1oeBziqCjHIIRsp7wGIvsQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-cognito-identity": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-env": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.212.0.tgz",
+            "integrity": "sha512-HNYoqetLqTxwl0Grl4ez8Dx3I3hJfskxH2PTHYI1/iAqrY/gSB2oBOusvBeksbYrScnQM2IGqEcMJ4lzGLOH+w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-imds": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.212.0.tgz",
+            "integrity": "sha512-Bg7cX2N5pJ//ft3Y8HWtpDSEMMgRTNMaNlIvTlDbAKYp7HBZRWSf9ZJnz2slT7qbyaJyRP5pSJC4XRm83g4leA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-ini": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.212.0.tgz",
+            "integrity": "sha512-H7qRIP8qV7tRrCSJx2p5oQVMJASQWZUmi4l699hDMejmCO/m4pUMQFmWn2FXtZv8gTfzlkmp3wMixD5jnfL7pw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/credential-provider-env": "3.212.0",
+                "@aws-sdk/credential-provider-imds": "3.212.0",
+                "@aws-sdk/credential-provider-sso": "3.212.0",
+                "@aws-sdk/credential-provider-web-identity": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-node": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.212.0.tgz",
+            "integrity": "sha512-T44hoU3GCYHS+4GDVs7S/v2bBHmmYpnPayQsYXhDElQKXP0cFzQ78F8et4IU5lM94hwK+ISRQPrKaq4p77evkw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/credential-provider-env": "3.212.0",
+                "@aws-sdk/credential-provider-imds": "3.212.0",
+                "@aws-sdk/credential-provider-ini": "3.212.0",
+                "@aws-sdk/credential-provider-process": "3.212.0",
+                "@aws-sdk/credential-provider-sso": "3.212.0",
+                "@aws-sdk/credential-provider-web-identity": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-process": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.212.0.tgz",
+            "integrity": "sha512-bGaVKSm5Tf5VZtlM2V6k+M9nSKzlb14ldCcH0PGGMaK/dqnEJDVSxXPu3fWyomaxbLt7Is3AUMh6L2bq3kuXyA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-sso": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.212.0.tgz",
+            "integrity": "sha512-OGatVUnWLp7PePs2H2RyYmTrwurl0tAfW+LWfVAPgYyvi2RQgTmSK5LJ3pXKxz3TvaSHkCvsT0NWNqdWY+iKWQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-sso": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/token-providers": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-web-identity": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.212.0.tgz",
+            "integrity": "sha512-zPF3KiVT14aeu4cRyEUelAJEAzFp++9ULLigQXhKBbFYaiOZMAHKRASO/WUK1ixYBC+ax4G1rbihLfQimXMtVA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-providers": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.212.0.tgz",
+            "integrity": "sha512-ea1KFqSpGsXcAD5IdDxKsWimLQ2/HiKQnlJUpXyDEP1Sk3if/Gtnn17Hk6GgXByaqppDqful9Lu9esxc3mNDkg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-cognito-identity": "3.212.0",
+                "@aws-sdk/client-sso": "3.212.0",
+                "@aws-sdk/client-sts": "3.212.0",
+                "@aws-sdk/credential-provider-cognito-identity": "3.212.0",
+                "@aws-sdk/credential-provider-env": "3.212.0",
+                "@aws-sdk/credential-provider-imds": "3.212.0",
+                "@aws-sdk/credential-provider-ini": "3.212.0",
+                "@aws-sdk/credential-provider-node": "3.212.0",
+                "@aws-sdk/credential-provider-process": "3.212.0",
+                "@aws-sdk/credential-provider-sso": "3.212.0",
+                "@aws-sdk/credential-provider-web-identity": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/fetch-http-handler": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.212.0.tgz",
+            "integrity": "sha512-u7ehnpAVN8D0asWhyQitNVf1j5LdzCuxP/14Dx8+PvrUdZxQNVq2FVB+tkQvOs9pDHE/oROjVo7GNO42bmkitA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/querystring-builder": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/hash-node": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.212.0.tgz",
+            "integrity": "sha512-pwZkz83EvXHGURBYjBYS7Cr+gSr6pi23RDlP/aXREjJGs9QUQyixBh78oX5a3p6bB8JeizPcZS1dXKJ9OKCHAw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/invalid-dependency": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.212.0.tgz",
+            "integrity": "sha512-zKVx+4Silmsr5Nvv9aGL5FmuHvdP9Dcvy/22fmWa3RRvCSNRpvFDeXtcDB5FvNpbWbO+qJyGj/OeqB/XejV13w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/is-array-buffer": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz",
+            "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-content-length": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.212.0.tgz",
+            "integrity": "sha512-gR6jeKGYNYqNLFRcuX3vv5PN1POLlB/9LDVYl3k/NNaCg8L1EKqqEtG84Gmn1AXH+2s6zMNs+gt5ygeqZQe2Cw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-endpoint": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.212.0.tgz",
+            "integrity": "sha512-6ntKYehjxLun8hPXIPHSI2pGr/pHuQ6jcyO5wBq1kydSIIGiESl8H84DEt+yRvroCiYgbU+I8cACnRE0uv0bLA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/signature-v4": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-host-header": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.212.0.tgz",
+            "integrity": "sha512-W00mxzK2OXy91Ncxri3cZJIxxSBzE72bX8FDa3xgC0ujbj49lw+rol6aV/Fw8Nda3CZ5xxulvJ4sXHt2eOtXSA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-logger": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.212.0.tgz",
+            "integrity": "sha512-BSQqzKp4abf2wXvJEstB0zdr68yJMZXA14h53eSvtzykZLfvvFixR1nyVgKq+PKm1VaJ2fuZr10tjWRVQg1pYA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-recursion-detection": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.212.0.tgz",
+            "integrity": "sha512-ATHPNtnd7nlm0jRXvr/c2xbxcna5ZGXEWTM5tUjIflOK9Rl3PCRce/hoQnHs45kv4l3daC53sPuRvTQ8O7K67A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-retry": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.212.0.tgz",
+            "integrity": "sha512-lIi/JkYXalY6CYw2dJbQ/Xo64Ah3wfJ63BMTFQHQk1htnIDBnLd9a6ng96JgXJQMSO4ZEqRW/709NBlC157hbw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/service-error-classification": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "tslib": "^2.3.1",
+                "uuid": "^8.3.2"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-sdk-sts": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.212.0.tgz",
+            "integrity": "sha512-IcMfno3RJEXXS1Ch5lY0hgdSkGn9XW9m3XoKu1DjhEqR34ENDzvUmEN2PimIcZnz+9W59CU9UAMs/amRhwhlmw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/middleware-signing": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/signature-v4": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-serde": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.212.0.tgz",
+            "integrity": "sha512-KwRpwi/8vNDV0l8uvu1DPk0q3WR2pnp9VtUNZ6u9zU54hvVL+Z1PtQh/WfzJzNvtCHvtc/gVMs3Daqb/Ecrm5Q==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-signing": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.212.0.tgz",
+            "integrity": "sha512-pth95aEsxqQO0lrRAHZNVI5hrMtA14nEUPFjiLaXtOssZrjD6mBzXPRy1nKob6XWXOp/Vy0mnyI/FT/NnMflFw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/signature-v4": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-stack": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.212.0.tgz",
+            "integrity": "sha512-AZ5f9ChioHsxGUojlzqI57sYyM9oW9SN/7AuiNafXU02j9jw7DKiYRn43lRUhgYnb/REhedHA5SsqIBF5eut/w==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-user-agent": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.212.0.tgz",
+            "integrity": "sha512-CVSY2kt+RaP6CVqSKp+1sPUAQFusTLZLFHVK0YPFzcIySJMqJC0l0/BzLhaIf5Bs3JHa/VGym8oDpp881yimHA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/node-config-provider": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.212.0.tgz",
+            "integrity": "sha512-8AfOEDPe/D9DccUgredYg07GH2jrw07FCTyA1Pug5Hgbas7w14zbhLyQB0l6gcOJEuh34e/7oV9hN3s1hctnJg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/node-http-handler": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.212.0.tgz",
+            "integrity": "sha512-wt4jK8HeYMjuQbWB4+Xt/nGyTvIwtLhm0SHcRgcoTsUjEiaPio/xNanyBWhPSUM87jpyG6bQMCzUtDbPeLqhkA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/abort-controller": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/querystring-builder": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/property-provider": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.212.0.tgz",
+            "integrity": "sha512-NMCIABfw3VZ7Vtn6iSeZRuSToRLxIHq0eGoUgO7T4fUp3U5vqYt28A5UY65KB9ifUPpNSllEG3EhEqs5qFw5+w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/protocol-http": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.212.0.tgz",
+            "integrity": "sha512-EhkLPQC2TeqC3RGKfW87zoKj/gsWS4JJlRl5U6KMXejBMKQPzuopUiF9gQJ2iuou9BT8B+RsG2qgSHzrxp6lKw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/querystring-builder": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.212.0.tgz",
+            "integrity": "sha512-4CaQstj0Aki3vc96Z0d481raNagmy9gnJtIv6yveATJ/57lk/RUv2WtTUOzpFKv/oNx5khix2tpbRqK9nCUxVg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/querystring-parser": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.212.0.tgz",
+            "integrity": "sha512-ttarfAHMOYKgFHeBdgXID9SlNS7erH4gavN3fvf5R1RliCytUnzsTTvqa7CmVBFy0Xc/2yA+/6FFDKlOsS8tRg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/service-error-classification": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.212.0.tgz",
+            "integrity": "sha512-jCv+uuFq4yGjP8FoCmoOGqnKNHHREDOFf7OxVSCluGMg2LXHfGxxqkqNFJlT3p+QdEp323GSWFY+PUsMJy7BLQ==",
+            "optional": true,
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/shared-ini-file-loader": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.212.0.tgz",
+            "integrity": "sha512-wKWqCA1oU57V//D3uAjQKGGj6rm6YKH4pWIU38Ypb/xNafiB7C51KtwpQVsS2HCNfmGrD03sGLKEZCSy9jvIlA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/signature-v4": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.212.0.tgz",
+            "integrity": "sha512-tCrzWA60AWGDRmY9OyUrG0BzD+dDbAtHSqcY2LchGHOlMmv501/WXBIvn9fDfKp8GJj6Lb3VcG9cY1jCuKKcmg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-hex-encoding": "3.201.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/smithy-client": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.212.0.tgz",
+            "integrity": "sha512-dQUlM/eltp9JVEVQWGxU/6Or8jGQWK5mgmbP+BUHkfDgoMIeOFksIYon211KhE18EjoGgav1mr4/HHlcnekI2w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/token-providers": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.212.0.tgz",
+            "integrity": "sha512-pTe4PM14b58nbfvIP9B0zW5dUIxEb/ALVzSLuxpJwJRI51E5QZmXJMT3P77MUd6niqKw0cRrnEHIgznD67JHSg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-sso-oidc": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/types": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.212.0.tgz",
+            "integrity": "sha512-uXBXB1PBYxfPyIvgmjbGdYBlS7rdeMG58uCaY3Ga5scY2xQnj7HU7knATKuIKk2DH1lLT0inqtsRVJS25zRK5w==",
+            "optional": true,
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/url-parser": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.212.0.tgz",
+            "integrity": "sha512-mTUQQRcVYqur7aHDuDMDKxN7Yr/5kIZB1RtMjIwtimTcf7TZaskN6sLTPo42YgASM6XQQhJECZaOE7Ow16i6Mg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/querystring-parser": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-base64": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz",
+            "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-body-length-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+            "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-body-length-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz",
+            "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-buffer-from": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz",
+            "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-config-provider": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz",
+            "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-defaults-mode-browser": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.212.0.tgz",
+            "integrity": "sha512-tAs9+/lTtil545kyCqy7qjnnCq4S2S+4kBhHXgwRNPT85Nx5XCEEheWH6VZ45YufRaiRNFfX0n+odDwzDaev6g==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-defaults-mode-node": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.212.0.tgz",
+            "integrity": "sha512-fNl1IDqn1mAoiM2Xv5KGAczXHy2+tPlouunIEePnQKTq0pzT3WqR13qleTfu1EcEz1oyGnDRoK91aP61Jxh3OQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/credential-provider-imds": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-endpoints": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.212.0.tgz",
+            "integrity": "sha512-/ADfvrZwhzUphre3pliO290IFOflvHyBBEaKn9WfRQ5veZxl+CuOEjxkwTJfHUrfWbh+xpCuOewWVLCptmoC4A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-hex-encoding": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz",
+            "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-locate-window": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz",
+            "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-middleware": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.212.0.tgz",
+            "integrity": "sha512-621glUpwVKJRB8QxRG/5cAKIq8LKPdl/l8CS7vDg34f6j9BJmP5YVPcTzzQ6iskQAblkndiBAnSjp7kGujxuGg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-uri-escape": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz",
+            "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-user-agent-browser": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.212.0.tgz",
+            "integrity": "sha512-xXz16ge9NdKCwlD+952rfvgHdDe+pbCavbVMNdR60joHq5KYGR1e02l0LRNVe48/C9dAo2ezeJ+YnTPaw3Yl8Q==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.212.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-user-agent-node": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.212.0.tgz",
+            "integrity": "sha512-HE8VwtMtTXGkwUjryNpy+qyg7wrQxCGplDP59yo0YVn86B5f9nhRi/2jRAsKo9yf94iP7PXAz65TY9+KJC8UIg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            },
+            "peerDependencies": {
+                "aws-crt": ">=1.0.0"
+            },
+            "peerDependenciesMeta": {
+                "aws-crt": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@aws-sdk/util-utf8-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz",
+            "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-utf8-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz",
+            "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
         "node_modules/@azure/abort-controller": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
@@ -3715,6 +4760,20 @@
             "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
             "dev": true
         },
+        "node_modules/@types/webidl-conversions": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+            "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+        },
+        "node_modules/@types/whatwg-url": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+            "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+            "dependencies": {
+                "@types/node": "*",
+                "@types/webidl-conversions": "*"
+            }
+        },
         "node_modules/@types/yargs": {
             "version": "16.0.4",
             "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
@@ -4840,6 +5899,12 @@
                 "@popperjs/core": "^2.10.2"
             }
         },
+        "node_modules/bowser": {
+            "version": "2.11.0",
+            "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+            "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+            "optional": true
+        },
         "node_modules/brace-expansion": {
             "version": "1.1.11",
             "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -4925,6 +5990,17 @@
                 "node-int64": "^0.4.0"
             }
         },
+        "node_modules/bson": {
+            "version": "4.7.0",
+            "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz",
+            "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==",
+            "dependencies": {
+                "buffer": "^5.6.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/buffer": {
             "version": "5.7.1",
             "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -7804,6 +8880,22 @@
             "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
             "dev": true
         },
+        "node_modules/fast-xml-parser": {
+            "version": "4.0.11",
+            "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+            "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+            "optional": true,
+            "dependencies": {
+                "strnum": "^1.0.5"
+            },
+            "bin": {
+                "fxparser": "src/cli/cli.js"
+            },
+            "funding": {
+                "type": "paypal",
+                "url": "https://paypal.me/naturalintelligence"
+            }
+        },
         "node_modules/fastest-levenshtein": {
             "version": "1.0.16",
             "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -11999,6 +13091,12 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/memory-pager": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+            "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+            "optional": true
+        },
         "node_modules/meow": {
             "version": "9.0.0",
             "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
@@ -12199,6 +13297,63 @@
                 "node": ">=10"
             }
         },
+        "node_modules/mongodb": {
+            "version": "4.12.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.12.0.tgz",
+            "integrity": "sha512-ssWod7DqVE4faluZESdOqYhV1BI5CQA5c31sr+zxDLJDBX9EA5VJLo8RNSItPTwxExmuGn/T6MbETQWjywNehA==",
+            "dependencies": {
+                "bson": "^4.7.0",
+                "mongodb-connection-string-url": "^2.5.4",
+                "socks": "^2.7.1"
+            },
+            "engines": {
+                "node": ">=12.9.0"
+            },
+            "optionalDependencies": {
+                "@aws-sdk/credential-providers": "^3.186.0",
+                "saslprep": "^1.0.3"
+            }
+        },
+        "node_modules/mongodb-connection-string-url": {
+            "version": "2.5.4",
+            "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz",
+            "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==",
+            "dependencies": {
+                "@types/whatwg-url": "^8.2.1",
+                "whatwg-url": "^11.0.0"
+            }
+        },
+        "node_modules/mongodb-connection-string-url/node_modules/tr46": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+            "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+            "dependencies": {
+                "punycode": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+            "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": {
+            "version": "11.0.0",
+            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+            "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+            "dependencies": {
+                "tr46": "^3.0.0",
+                "webidl-conversions": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/mqemitter": {
             "version": "4.5.0",
             "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
@@ -14482,6 +15637,18 @@
             "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
+        "node_modules/saslprep": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+            "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+            "optional": true,
+            "dependencies": {
+                "sparse-bitfield": "^3.0.3"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/sass": {
             "version": "1.42.1",
             "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz",
@@ -14809,6 +15976,15 @@
             "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
             "dev": true
         },
+        "node_modules/sparse-bitfield": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+            "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+            "optional": true,
+            "dependencies": {
+                "memory-pager": "^1.0.2"
+            }
+        },
         "node_modules/spawn-command": {
             "version": "0.0.2-1",
             "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
@@ -15069,6 +16245,12 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/strnum": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+            "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+            "optional": true
+        },
         "node_modules/style-search": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
@@ -16878,6 +18060,893 @@
                 }
             }
         },
+        "@aws-crypto/ie11-detection": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz",
+            "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==",
+            "optional": true,
+            "requires": {
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/sha256-browser": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
+            "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/ie11-detection": "^2.0.0",
+                "@aws-crypto/sha256-js": "^2.0.0",
+                "@aws-crypto/supports-web-crypto": "^2.0.0",
+                "@aws-crypto/util": "^2.0.0",
+                "@aws-sdk/types": "^3.1.0",
+                "@aws-sdk/util-locate-window": "^3.0.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/sha256-js": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
+            "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/util": "^2.0.0",
+                "@aws-sdk/types": "^3.1.0",
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/supports-web-crypto": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz",
+            "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==",
+            "optional": true,
+            "requires": {
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/util": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz",
+            "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "^3.110.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-sdk/abort-controller": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.212.0.tgz",
+            "integrity": "sha512-mXeBSuDi0Fpul4zk9VH2z0VKN+/+6hyJ9SXSRhn3LpMcyj3GeZtXyTB2wCsfxXYGxeGbV+bIzbPbhZza6wNfWg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-cognito-identity": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.212.0.tgz",
+            "integrity": "sha512-0yt6lyYUYng5Nnn5EyTnoVZuVXD3r6eaDjrIZQTc8yhNkbTg+eRLlGnJVkrn/O9NPRS52XqxLCbJc/Wk2SSH+w==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/client-sts": "3.212.0",
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/credential-provider-node": "3.212.0",
+                "@aws-sdk/fetch-http-handler": "3.212.0",
+                "@aws-sdk/hash-node": "3.212.0",
+                "@aws-sdk/invalid-dependency": "3.212.0",
+                "@aws-sdk/middleware-content-length": "3.212.0",
+                "@aws-sdk/middleware-endpoint": "3.212.0",
+                "@aws-sdk/middleware-host-header": "3.212.0",
+                "@aws-sdk/middleware-logger": "3.212.0",
+                "@aws-sdk/middleware-recursion-detection": "3.212.0",
+                "@aws-sdk/middleware-retry": "3.212.0",
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/middleware-signing": "3.212.0",
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/middleware-user-agent": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/node-http-handler": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/smithy-client": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.212.0",
+                "@aws-sdk/util-defaults-mode-node": "3.212.0",
+                "@aws-sdk/util-endpoints": "3.212.0",
+                "@aws-sdk/util-user-agent-browser": "3.212.0",
+                "@aws-sdk/util-user-agent-node": "3.212.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-sso": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.212.0.tgz",
+            "integrity": "sha512-b9lFI8Uz6YxIzAlS2uq62y5fX097lwcdkiq2N8YN2U7YgHQaKMIFnV8ZqkDdhZi2eUKwhSdUZzQy0tF6en2Ubg==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/fetch-http-handler": "3.212.0",
+                "@aws-sdk/hash-node": "3.212.0",
+                "@aws-sdk/invalid-dependency": "3.212.0",
+                "@aws-sdk/middleware-content-length": "3.212.0",
+                "@aws-sdk/middleware-endpoint": "3.212.0",
+                "@aws-sdk/middleware-host-header": "3.212.0",
+                "@aws-sdk/middleware-logger": "3.212.0",
+                "@aws-sdk/middleware-recursion-detection": "3.212.0",
+                "@aws-sdk/middleware-retry": "3.212.0",
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/middleware-user-agent": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/node-http-handler": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/smithy-client": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.212.0",
+                "@aws-sdk/util-defaults-mode-node": "3.212.0",
+                "@aws-sdk/util-endpoints": "3.212.0",
+                "@aws-sdk/util-user-agent-browser": "3.212.0",
+                "@aws-sdk/util-user-agent-node": "3.212.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-sso-oidc": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.212.0.tgz",
+            "integrity": "sha512-Co0AU+y9KEAZUraT36ttFZlmwARsr82q2nQji5E8zg3zlUHtqGvMJqxArudz3iOb2E9WRi75MwAQmLO2xEk45A==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/fetch-http-handler": "3.212.0",
+                "@aws-sdk/hash-node": "3.212.0",
+                "@aws-sdk/invalid-dependency": "3.212.0",
+                "@aws-sdk/middleware-content-length": "3.212.0",
+                "@aws-sdk/middleware-endpoint": "3.212.0",
+                "@aws-sdk/middleware-host-header": "3.212.0",
+                "@aws-sdk/middleware-logger": "3.212.0",
+                "@aws-sdk/middleware-recursion-detection": "3.212.0",
+                "@aws-sdk/middleware-retry": "3.212.0",
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/middleware-user-agent": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/node-http-handler": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/smithy-client": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.212.0",
+                "@aws-sdk/util-defaults-mode-node": "3.212.0",
+                "@aws-sdk/util-endpoints": "3.212.0",
+                "@aws-sdk/util-user-agent-browser": "3.212.0",
+                "@aws-sdk/util-user-agent-node": "3.212.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-sts": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.212.0.tgz",
+            "integrity": "sha512-Zl8665HT1Do/yfiFEtqEjLkHSkAo5Isg2QU65Kbknj2W2DFj92a1cRvMlHanDLxlpuoryGP9/u1efYZeWeIdlg==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/credential-provider-node": "3.212.0",
+                "@aws-sdk/fetch-http-handler": "3.212.0",
+                "@aws-sdk/hash-node": "3.212.0",
+                "@aws-sdk/invalid-dependency": "3.212.0",
+                "@aws-sdk/middleware-content-length": "3.212.0",
+                "@aws-sdk/middleware-endpoint": "3.212.0",
+                "@aws-sdk/middleware-host-header": "3.212.0",
+                "@aws-sdk/middleware-logger": "3.212.0",
+                "@aws-sdk/middleware-recursion-detection": "3.212.0",
+                "@aws-sdk/middleware-retry": "3.212.0",
+                "@aws-sdk/middleware-sdk-sts": "3.212.0",
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/middleware-signing": "3.212.0",
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/middleware-user-agent": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/node-http-handler": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/smithy-client": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.212.0",
+                "@aws-sdk/util-defaults-mode-node": "3.212.0",
+                "@aws-sdk/util-endpoints": "3.212.0",
+                "@aws-sdk/util-user-agent-browser": "3.212.0",
+                "@aws-sdk/util-user-agent-node": "3.212.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "fast-xml-parser": "4.0.11",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/config-resolver": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.212.0.tgz",
+            "integrity": "sha512-hIP/Izpv6GCsDTnHCd/X9Ro7Mw5le+gr2VbkZHWR0c8+3xZWp8N5S0QnUBogF3Dv2KwPbmHP+bs/vqqo3miUjQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/signature-v4": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-cognito-identity": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.212.0.tgz",
+            "integrity": "sha512-0BEML2iBGXyFnD1HNQ28B+9Ev7NGcu9itYcJue5mBkCOka3mW55xAPYwp3es0rhQ1oeBziqCjHIIRsp7wGIvsQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-cognito-identity": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-env": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.212.0.tgz",
+            "integrity": "sha512-HNYoqetLqTxwl0Grl4ez8Dx3I3hJfskxH2PTHYI1/iAqrY/gSB2oBOusvBeksbYrScnQM2IGqEcMJ4lzGLOH+w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-imds": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.212.0.tgz",
+            "integrity": "sha512-Bg7cX2N5pJ//ft3Y8HWtpDSEMMgRTNMaNlIvTlDbAKYp7HBZRWSf9ZJnz2slT7qbyaJyRP5pSJC4XRm83g4leA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-ini": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.212.0.tgz",
+            "integrity": "sha512-H7qRIP8qV7tRrCSJx2p5oQVMJASQWZUmi4l699hDMejmCO/m4pUMQFmWn2FXtZv8gTfzlkmp3wMixD5jnfL7pw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/credential-provider-env": "3.212.0",
+                "@aws-sdk/credential-provider-imds": "3.212.0",
+                "@aws-sdk/credential-provider-sso": "3.212.0",
+                "@aws-sdk/credential-provider-web-identity": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-node": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.212.0.tgz",
+            "integrity": "sha512-T44hoU3GCYHS+4GDVs7S/v2bBHmmYpnPayQsYXhDElQKXP0cFzQ78F8et4IU5lM94hwK+ISRQPrKaq4p77evkw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/credential-provider-env": "3.212.0",
+                "@aws-sdk/credential-provider-imds": "3.212.0",
+                "@aws-sdk/credential-provider-ini": "3.212.0",
+                "@aws-sdk/credential-provider-process": "3.212.0",
+                "@aws-sdk/credential-provider-sso": "3.212.0",
+                "@aws-sdk/credential-provider-web-identity": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-process": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.212.0.tgz",
+            "integrity": "sha512-bGaVKSm5Tf5VZtlM2V6k+M9nSKzlb14ldCcH0PGGMaK/dqnEJDVSxXPu3fWyomaxbLt7Is3AUMh6L2bq3kuXyA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-sso": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.212.0.tgz",
+            "integrity": "sha512-OGatVUnWLp7PePs2H2RyYmTrwurl0tAfW+LWfVAPgYyvi2RQgTmSK5LJ3pXKxz3TvaSHkCvsT0NWNqdWY+iKWQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-sso": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/token-providers": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-web-identity": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.212.0.tgz",
+            "integrity": "sha512-zPF3KiVT14aeu4cRyEUelAJEAzFp++9ULLigQXhKBbFYaiOZMAHKRASO/WUK1ixYBC+ax4G1rbihLfQimXMtVA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-providers": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.212.0.tgz",
+            "integrity": "sha512-ea1KFqSpGsXcAD5IdDxKsWimLQ2/HiKQnlJUpXyDEP1Sk3if/Gtnn17Hk6GgXByaqppDqful9Lu9esxc3mNDkg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-cognito-identity": "3.212.0",
+                "@aws-sdk/client-sso": "3.212.0",
+                "@aws-sdk/client-sts": "3.212.0",
+                "@aws-sdk/credential-provider-cognito-identity": "3.212.0",
+                "@aws-sdk/credential-provider-env": "3.212.0",
+                "@aws-sdk/credential-provider-imds": "3.212.0",
+                "@aws-sdk/credential-provider-ini": "3.212.0",
+                "@aws-sdk/credential-provider-node": "3.212.0",
+                "@aws-sdk/credential-provider-process": "3.212.0",
+                "@aws-sdk/credential-provider-sso": "3.212.0",
+                "@aws-sdk/credential-provider-web-identity": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/fetch-http-handler": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.212.0.tgz",
+            "integrity": "sha512-u7ehnpAVN8D0asWhyQitNVf1j5LdzCuxP/14Dx8+PvrUdZxQNVq2FVB+tkQvOs9pDHE/oROjVo7GNO42bmkitA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/querystring-builder": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/hash-node": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.212.0.tgz",
+            "integrity": "sha512-pwZkz83EvXHGURBYjBYS7Cr+gSr6pi23RDlP/aXREjJGs9QUQyixBh78oX5a3p6bB8JeizPcZS1dXKJ9OKCHAw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/invalid-dependency": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.212.0.tgz",
+            "integrity": "sha512-zKVx+4Silmsr5Nvv9aGL5FmuHvdP9Dcvy/22fmWa3RRvCSNRpvFDeXtcDB5FvNpbWbO+qJyGj/OeqB/XejV13w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/is-array-buffer": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz",
+            "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-content-length": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.212.0.tgz",
+            "integrity": "sha512-gR6jeKGYNYqNLFRcuX3vv5PN1POLlB/9LDVYl3k/NNaCg8L1EKqqEtG84Gmn1AXH+2s6zMNs+gt5ygeqZQe2Cw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-endpoint": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.212.0.tgz",
+            "integrity": "sha512-6ntKYehjxLun8hPXIPHSI2pGr/pHuQ6jcyO5wBq1kydSIIGiESl8H84DEt+yRvroCiYgbU+I8cACnRE0uv0bLA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/middleware-serde": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/signature-v4": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/url-parser": "3.212.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-host-header": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.212.0.tgz",
+            "integrity": "sha512-W00mxzK2OXy91Ncxri3cZJIxxSBzE72bX8FDa3xgC0ujbj49lw+rol6aV/Fw8Nda3CZ5xxulvJ4sXHt2eOtXSA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-logger": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.212.0.tgz",
+            "integrity": "sha512-BSQqzKp4abf2wXvJEstB0zdr68yJMZXA14h53eSvtzykZLfvvFixR1nyVgKq+PKm1VaJ2fuZr10tjWRVQg1pYA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-recursion-detection": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.212.0.tgz",
+            "integrity": "sha512-ATHPNtnd7nlm0jRXvr/c2xbxcna5ZGXEWTM5tUjIflOK9Rl3PCRce/hoQnHs45kv4l3daC53sPuRvTQ8O7K67A==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-retry": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.212.0.tgz",
+            "integrity": "sha512-lIi/JkYXalY6CYw2dJbQ/Xo64Ah3wfJ63BMTFQHQk1htnIDBnLd9a6ng96JgXJQMSO4ZEqRW/709NBlC157hbw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/service-error-classification": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "tslib": "^2.3.1",
+                "uuid": "^8.3.2"
+            }
+        },
+        "@aws-sdk/middleware-sdk-sts": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.212.0.tgz",
+            "integrity": "sha512-IcMfno3RJEXXS1Ch5lY0hgdSkGn9XW9m3XoKu1DjhEqR34ENDzvUmEN2PimIcZnz+9W59CU9UAMs/amRhwhlmw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/middleware-signing": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/signature-v4": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-serde": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.212.0.tgz",
+            "integrity": "sha512-KwRpwi/8vNDV0l8uvu1DPk0q3WR2pnp9VtUNZ6u9zU54hvVL+Z1PtQh/WfzJzNvtCHvtc/gVMs3Daqb/Ecrm5Q==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-signing": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.212.0.tgz",
+            "integrity": "sha512-pth95aEsxqQO0lrRAHZNVI5hrMtA14nEUPFjiLaXtOssZrjD6mBzXPRy1nKob6XWXOp/Vy0mnyI/FT/NnMflFw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/signature-v4": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-stack": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.212.0.tgz",
+            "integrity": "sha512-AZ5f9ChioHsxGUojlzqI57sYyM9oW9SN/7AuiNafXU02j9jw7DKiYRn43lRUhgYnb/REhedHA5SsqIBF5eut/w==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-user-agent": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.212.0.tgz",
+            "integrity": "sha512-CVSY2kt+RaP6CVqSKp+1sPUAQFusTLZLFHVK0YPFzcIySJMqJC0l0/BzLhaIf5Bs3JHa/VGym8oDpp881yimHA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/node-config-provider": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.212.0.tgz",
+            "integrity": "sha512-8AfOEDPe/D9DccUgredYg07GH2jrw07FCTyA1Pug5Hgbas7w14zbhLyQB0l6gcOJEuh34e/7oV9hN3s1hctnJg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/node-http-handler": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.212.0.tgz",
+            "integrity": "sha512-wt4jK8HeYMjuQbWB4+Xt/nGyTvIwtLhm0SHcRgcoTsUjEiaPio/xNanyBWhPSUM87jpyG6bQMCzUtDbPeLqhkA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/abort-controller": "3.212.0",
+                "@aws-sdk/protocol-http": "3.212.0",
+                "@aws-sdk/querystring-builder": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/property-provider": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.212.0.tgz",
+            "integrity": "sha512-NMCIABfw3VZ7Vtn6iSeZRuSToRLxIHq0eGoUgO7T4fUp3U5vqYt28A5UY65KB9ifUPpNSllEG3EhEqs5qFw5+w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/protocol-http": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.212.0.tgz",
+            "integrity": "sha512-EhkLPQC2TeqC3RGKfW87zoKj/gsWS4JJlRl5U6KMXejBMKQPzuopUiF9gQJ2iuou9BT8B+RsG2qgSHzrxp6lKw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/querystring-builder": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.212.0.tgz",
+            "integrity": "sha512-4CaQstj0Aki3vc96Z0d481raNagmy9gnJtIv6yveATJ/57lk/RUv2WtTUOzpFKv/oNx5khix2tpbRqK9nCUxVg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/querystring-parser": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.212.0.tgz",
+            "integrity": "sha512-ttarfAHMOYKgFHeBdgXID9SlNS7erH4gavN3fvf5R1RliCytUnzsTTvqa7CmVBFy0Xc/2yA+/6FFDKlOsS8tRg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/service-error-classification": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.212.0.tgz",
+            "integrity": "sha512-jCv+uuFq4yGjP8FoCmoOGqnKNHHREDOFf7OxVSCluGMg2LXHfGxxqkqNFJlT3p+QdEp323GSWFY+PUsMJy7BLQ==",
+            "optional": true
+        },
+        "@aws-sdk/shared-ini-file-loader": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.212.0.tgz",
+            "integrity": "sha512-wKWqCA1oU57V//D3uAjQKGGj6rm6YKH4pWIU38Ypb/xNafiB7C51KtwpQVsS2HCNfmGrD03sGLKEZCSy9jvIlA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/signature-v4": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.212.0.tgz",
+            "integrity": "sha512-tCrzWA60AWGDRmY9OyUrG0BzD+dDbAtHSqcY2LchGHOlMmv501/WXBIvn9fDfKp8GJj6Lb3VcG9cY1jCuKKcmg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "@aws-sdk/types": "3.212.0",
+                "@aws-sdk/util-hex-encoding": "3.201.0",
+                "@aws-sdk/util-middleware": "3.212.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/smithy-client": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.212.0.tgz",
+            "integrity": "sha512-dQUlM/eltp9JVEVQWGxU/6Or8jGQWK5mgmbP+BUHkfDgoMIeOFksIYon211KhE18EjoGgav1mr4/HHlcnekI2w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/middleware-stack": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/token-providers": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.212.0.tgz",
+            "integrity": "sha512-pTe4PM14b58nbfvIP9B0zW5dUIxEb/ALVzSLuxpJwJRI51E5QZmXJMT3P77MUd6niqKw0cRrnEHIgznD67JHSg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-sso-oidc": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/shared-ini-file-loader": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/types": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.212.0.tgz",
+            "integrity": "sha512-uXBXB1PBYxfPyIvgmjbGdYBlS7rdeMG58uCaY3Ga5scY2xQnj7HU7knATKuIKk2DH1lLT0inqtsRVJS25zRK5w==",
+            "optional": true
+        },
+        "@aws-sdk/url-parser": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.212.0.tgz",
+            "integrity": "sha512-mTUQQRcVYqur7aHDuDMDKxN7Yr/5kIZB1RtMjIwtimTcf7TZaskN6sLTPo42YgASM6XQQhJECZaOE7Ow16i6Mg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/querystring-parser": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-base64": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz",
+            "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-body-length-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+            "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-body-length-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz",
+            "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-buffer-from": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz",
+            "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-config-provider": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz",
+            "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-defaults-mode-browser": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.212.0.tgz",
+            "integrity": "sha512-tAs9+/lTtil545kyCqy7qjnnCq4S2S+4kBhHXgwRNPT85Nx5XCEEheWH6VZ45YufRaiRNFfX0n+odDwzDaev6g==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-defaults-mode-node": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.212.0.tgz",
+            "integrity": "sha512-fNl1IDqn1mAoiM2Xv5KGAczXHy2+tPlouunIEePnQKTq0pzT3WqR13qleTfu1EcEz1oyGnDRoK91aP61Jxh3OQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/config-resolver": "3.212.0",
+                "@aws-sdk/credential-provider-imds": "3.212.0",
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/property-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-endpoints": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.212.0.tgz",
+            "integrity": "sha512-/ADfvrZwhzUphre3pliO290IFOflvHyBBEaKn9WfRQ5veZxl+CuOEjxkwTJfHUrfWbh+xpCuOewWVLCptmoC4A==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-hex-encoding": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz",
+            "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-locate-window": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz",
+            "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-middleware": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.212.0.tgz",
+            "integrity": "sha512-621glUpwVKJRB8QxRG/5cAKIq8LKPdl/l8CS7vDg34f6j9BJmP5YVPcTzzQ6iskQAblkndiBAnSjp7kGujxuGg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-uri-escape": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz",
+            "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-user-agent-browser": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.212.0.tgz",
+            "integrity": "sha512-xXz16ge9NdKCwlD+952rfvgHdDe+pbCavbVMNdR60joHq5KYGR1e02l0LRNVe48/C9dAo2ezeJ+YnTPaw3Yl8Q==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.212.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-user-agent-node": {
+            "version": "3.212.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.212.0.tgz",
+            "integrity": "sha512-HE8VwtMtTXGkwUjryNpy+qyg7wrQxCGplDP59yo0YVn86B5f9nhRi/2jRAsKo9yf94iP7PXAz65TY9+KJC8UIg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/node-config-provider": "3.212.0",
+                "@aws-sdk/types": "3.212.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-utf8-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz",
+            "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-utf8-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz",
+            "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
         "@azure/abort-controller": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
@@ -19581,6 +21650,20 @@
             "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
             "dev": true
         },
+        "@types/webidl-conversions": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+            "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+        },
+        "@types/whatwg-url": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+            "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+            "requires": {
+                "@types/node": "*",
+                "@types/webidl-conversions": "*"
+            }
+        },
         "@types/yargs": {
             "version": "16.0.4",
             "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
@@ -20506,6 +22589,12 @@
             "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
             "dev": true
         },
+        "bowser": {
+            "version": "2.11.0",
+            "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+            "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+            "optional": true
+        },
         "brace-expansion": {
             "version": "1.1.11",
             "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -20569,6 +22658,14 @@
                 "node-int64": "^0.4.0"
             }
         },
+        "bson": {
+            "version": "4.7.0",
+            "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz",
+            "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==",
+            "requires": {
+                "buffer": "^5.6.0"
+            }
+        },
         "buffer": {
             "version": "5.7.1",
             "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -22622,6 +24719,15 @@
             "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
             "dev": true
         },
+        "fast-xml-parser": {
+            "version": "4.0.11",
+            "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+            "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+            "optional": true,
+            "requires": {
+                "strnum": "^1.0.5"
+            }
+        },
         "fastest-levenshtein": {
             "version": "1.0.16",
             "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -25742,6 +27848,12 @@
             "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
             "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
         },
+        "memory-pager": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+            "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+            "optional": true
+        },
         "meow": {
             "version": "9.0.0",
             "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
@@ -25884,6 +27996,51 @@
             "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
             "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         },
+        "mongodb": {
+            "version": "4.12.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.12.0.tgz",
+            "integrity": "sha512-ssWod7DqVE4faluZESdOqYhV1BI5CQA5c31sr+zxDLJDBX9EA5VJLo8RNSItPTwxExmuGn/T6MbETQWjywNehA==",
+            "requires": {
+                "@aws-sdk/credential-providers": "^3.186.0",
+                "bson": "^4.7.0",
+                "mongodb-connection-string-url": "^2.5.4",
+                "saslprep": "^1.0.3",
+                "socks": "^2.7.1"
+            }
+        },
+        "mongodb-connection-string-url": {
+            "version": "2.5.4",
+            "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.4.tgz",
+            "integrity": "sha512-SeAxuWs0ez3iI3vvmLk/j2y+zHwigTDKQhtdxTgt5ZCOQQS5+HW4g45/Xw5vzzbn7oQXCNQ24Z40AkJsizEy7w==",
+            "requires": {
+                "@types/whatwg-url": "^8.2.1",
+                "whatwg-url": "^11.0.0"
+            },
+            "dependencies": {
+                "tr46": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+                    "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+                    "requires": {
+                        "punycode": "^2.1.1"
+                    }
+                },
+                "webidl-conversions": {
+                    "version": "7.0.0",
+                    "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+                    "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
+                },
+                "whatwg-url": {
+                    "version": "11.0.0",
+                    "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+                    "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+                    "requires": {
+                        "tr46": "^3.0.0",
+                        "webidl-conversions": "^7.0.0"
+                    }
+                }
+            }
+        },
         "mqemitter": {
             "version": "4.5.0",
             "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
@@ -27611,6 +29768,15 @@
             "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
+        "saslprep": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+            "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+            "optional": true,
+            "requires": {
+                "sparse-bitfield": "^3.0.3"
+            }
+        },
         "sass": {
             "version": "1.42.1",
             "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz",
@@ -27873,6 +30039,15 @@
             "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
             "dev": true
         },
+        "sparse-bitfield": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+            "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+            "optional": true,
+            "requires": {
+                "memory-pager": "^1.0.2"
+            }
+        },
         "spawn-command": {
             "version": "0.0.2-1",
             "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
@@ -28069,6 +30244,12 @@
             "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
             "dev": true
         },
+        "strnum": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+            "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+            "optional": true
+        },
         "style-search": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
diff --git a/package.json b/package.json
index 6166d9e9..cb7db40f 100644
--- a/package.json
+++ b/package.json
@@ -93,6 +93,7 @@
         "jsonwebtoken": "~8.5.1",
         "jwt-decode": "~3.1.2",
         "limiter": "~2.1.0",
+        "mongodb": "^4.12.0",
         "mqtt": "~4.3.7",
         "mssql": "~8.1.4",
         "node-cloudflared-tunnel": "~1.0.9",
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 51c6c181..0a8a6ea4 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -3,7 +3,7 @@ const dayjs = require("dayjs");
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
 const { log, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger } = require("../../src/util");
-const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery } = require("../util-server");
+const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mongodbPing, mqttAsync, setSetting, httpNtlm, radius, grpcQuery } = require("../util-server");
 const { R } = require("redbean-node");
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { Notification } = require("../notification");
@@ -578,6 +578,14 @@ class Monitor extends BeanModel {
 
                     await postgresQuery(this.databaseConnectionString, this.databaseQuery);
 
+                    bean.msg = "";
+                    bean.status = UP;
+                    bean.ping = dayjs().valueOf() - startTime;
+                } else if (this.type === "mongodb") {
+                    let startTime = dayjs().valueOf();
+
+                    await mongodbPing(this.databaseConnectionString);
+
                     bean.msg = "";
                     bean.status = UP;
                     bean.ping = dayjs().valueOf() - startTime;
diff --git a/server/util-server.js b/server/util-server.js
index 8f242b7a..9b55864e 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -13,6 +13,7 @@ const { badgeConstants } = require("./config");
 const mssql = require("mssql");
 const { Client } = require("pg");
 const postgresConParse = require("pg-connection-string").parse;
+const { MongoClient } = require("mongodb");
 const { NtlmClient } = require("axios-ntlm");
 const { Settings } = require("./settings");
 const grpc = require("@grpc/grpc-js");
@@ -294,6 +295,27 @@ exports.postgresQuery = function (connectionString, query) {
     });
 };
 
+/**
+ * Connect to and Ping a MongoDB database
+ * @param {string} connectionString The database connection string
+ * @returns {Promise<(string[]|Object[]|Object)>}
+ */
+exports.mongodbPing = async function (connectionString) {
+    let client, db;
+    try {
+        client = await MongoClient.connect(connectionString, {useNewUrlParser: true})
+        db = client.db();
+        dbping = await db.command({ ping: 1 });
+        if (dbping["ok"] === 1) {
+            return 'UP'
+        }
+        throw Error("failed");
+    }
+    catch(err){ console.error(err); }
+    finally{ client.close(); }
+}
+
+
 /**
  * Query radius server
  * @param {string} hostname Hostname of radius server
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 88e5aef9..ed606bde 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -54,6 +54,9 @@
                                         <option value="postgres">
                                             PostgreSQL
                                         </option>
+                                        <option value="mongodb">
+                                            MongoDB
+                                        </option>
                                         <option value="radius">
                                             Radius
                                         </option>
@@ -262,6 +265,17 @@
                                 </div>
                             </template>
 
+                            <!-- MongoDB -->
+                            <template v-if="monitor.type === 'mongodb'">
+                                <div class="my-3">
+                                    <label for="sqlConnectionString" class="form-label">{{ $t("Connection String") }}</label>
+
+                                    <template v-if="monitor.type === 'mongodb'">
+                                        <input id="sqlConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="mongodb://username:password@host:port/database">
+                                    </template>
+                                </div>
+                            </template>
+
                             <!-- Interval -->
                             <div class="my-3">
                                 <label for="interval" class="form-label">{{ $t("Heartbeat Interval") }} ({{ $t("checkEverySecond", [ monitor.interval ]) }})</label>

From 2103edb6044edc635e620a6c2ecb3d3ba33546c3 Mon Sep 17 00:00:00 2001
From: rmarops <richie.markham@nuborders.com>
Date: Wed, 16 Nov 2022 22:21:15 -0500
Subject: [PATCH 282/803] moved client close out of finally block and fixed
 linting errors

---
 server/util-server.js | 29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index 9b55864e..ef15f7c3 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -301,20 +301,23 @@ exports.postgresQuery = function (connectionString, query) {
  * @returns {Promise<(string[]|Object[]|Object)>}
  */
 exports.mongodbPing = async function (connectionString) {
-    let client, db;
-    try {
-        client = await MongoClient.connect(connectionString, {useNewUrlParser: true})
-        db = client.db();
-        dbping = await db.command({ ping: 1 });
-        if (dbping["ok"] === 1) {
-            return 'UP'
-        }
-        throw Error("failed");
-    }
-    catch(err){ console.error(err); }
-    finally{ client.close(); }
-}
+    let client;
 
+    try {
+        client = await MongoClient.connect(connectionString, { useNewUrlParser: true });
+        let db = client.db();
+        let dbping = await db.command({ ping: 1 });
+        await client.close();
+        if (dbping["ok"] === 1) {
+            return "UP";
+        } else {
+            throw Error("failed");
+        }
+    } catch (err) {
+        console.error(err);
+        throw Error(err)
+    }
+};
 
 /**
  * Query radius server

From 0e30843a75fbe8194d224f0e196fb7507e4fd5ee Mon Sep 17 00:00:00 2001
From: rmarops <richie.markham@nuborders.com>
Date: Wed, 16 Nov 2022 22:27:18 -0500
Subject: [PATCH 283/803] fixed lint check missing semicolon

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

diff --git a/server/util-server.js b/server/util-server.js
index ef15f7c3..b96a1f4e 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -315,7 +315,7 @@ exports.mongodbPing = async function (connectionString) {
         }
     } catch (err) {
         console.error(err);
-        throw Error(err)
+        throw Error(err);
     }
 };
 

From b053bc61ce099eab8d8b8fe30317f03f39a5833c Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Thu, 17 Nov 2022 18:34:02 +0000
Subject: [PATCH 284/803] Fixed MySQL monitor to close connection

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/util-server.js | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index 7d271e85..701d61e6 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -13,7 +13,7 @@ const { badgeConstants } = require("./config");
 const mssql = require("mssql");
 const { Client } = require("pg");
 const postgresConParse = require("pg-connection-string").parse;
-const mysql = require("mysql2/promise");
+const mysql = require("mysql2");
 const { NtlmClient } = require("axios-ntlm");
 const { Settings } = require("./settings");
 const radiusClient = require("node-radius-client");
@@ -300,16 +300,16 @@ exports.postgresQuery = function (connectionString, query) {
  */
 exports.mysqlQuery = function (connectionString, query) {
     return new Promise((resolve, reject) => {
-        return mysql.createConnection(connectionString)
-            .then(connection => {
-                connection.connect();
-                return connection.query(query);
-            })
+        const connection = mysql.createConnection(connectionString);
+        connection.promise().query(query)
             .then(res => {
                 resolve(res);
             })
             .catch(err => {
                 reject(err);
+            })
+            .finally(() => {
+                connection.end();
             });
     });
 };

From a5f23b98392a95d2fd2f2a76f6e4e06c6c07040e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 20 Nov 2022 00:07:19 +0800
Subject: [PATCH 285/803] Update Apprise from 1.0 to 1.2

---
 docker/alpine-base.dockerfile | 2 +-
 docker/debian-base.dockerfile | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/docker/alpine-base.dockerfile b/docker/alpine-base.dockerfile
index 1d74de05..1b8034f4 100644
--- a/docker/alpine-base.dockerfile
+++ b/docker/alpine-base.dockerfile
@@ -4,5 +4,5 @@ WORKDIR /app
 
 # Install apprise, iputils for non-root ping, setpriv
 RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
-    pip3 --no-cache-dir install apprise==1.0.0 && \
+    pip3 --no-cache-dir install apprise==1.2.0 && \
     rm -rf /root/.cache
diff --git a/docker/debian-base.dockerfile b/docker/debian-base.dockerfile
index 20bef3dd..5ca4a7ed 100644
--- a/docker/debian-base.dockerfile
+++ b/docker/debian-base.dockerfile
@@ -11,7 +11,7 @@ WORKDIR /app
 RUN apt update && \
     apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
         sqlite3 iputils-ping util-linux dumb-init && \
-    pip3 --no-cache-dir install apprise==1.0.0 && \
+    pip3 --no-cache-dir install apprise==1.2.0 && \
     rm -rf /var/lib/apt/lists/* && \
     apt --yes autoremove
 

From cd270bd8b581e092d42332542264278f5380d5d6 Mon Sep 17 00:00:00 2001
From: Joshua Brunner <joshua.brunner@bluewin.ch>
Date: Tue, 22 Nov 2022 11:18:16 +0100
Subject: [PATCH 286/803] Add socks5h support

Add socks5h support as an extra option to not break previous socks5 implementation.
Allows to toggle between socks5 and socks5h explicit.

Fixes #2296
---
 server/proxy.js                | 3 ++-
 src/components/ProxyDialog.vue | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/server/proxy.js b/server/proxy.js
index 22c63b39..2f2b5769 100644
--- a/server/proxy.js
+++ b/server/proxy.js
@@ -7,7 +7,7 @@ const { UptimeKumaServer } = require("./uptime-kuma-server");
 
 class Proxy {
 
-    static SUPPORTED_PROXY_PROTOCOLS = [ "http", "https", "socks", "socks5", "socks4" ];
+    static SUPPORTED_PROXY_PROTOCOLS = [ "http", "https", "socks", "socks5", "socks5h", "socks4" ];
 
     /**
      * Saves and updates given proxy entity
@@ -126,6 +126,7 @@ class Proxy {
                 break;
             case "socks":
             case "socks5":
+            case "socks5h":
             case "socks4":
                 agent = new SocksProxyAgent({
                     ...httpAgentOptions,
diff --git a/src/components/ProxyDialog.vue b/src/components/ProxyDialog.vue
index 434c571b..74e5878b 100644
--- a/src/components/ProxyDialog.vue
+++ b/src/components/ProxyDialog.vue
@@ -17,6 +17,7 @@
                                 <option value="http">HTTP</option>
                                 <option value="socks">SOCKS</option>
                                 <option value="socks5">SOCKS v5</option>
+                                <option value="socks5h">SOCKS v5 (+DNS)</option>
                                 <option value="socks4">SOCKS v4</option>
                             </select>
                         </div>

From e0a1ad8a1c2b5f79ac7a39bbd21252f7093a6eee Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 25 Nov 2022 01:32:33 +0800
Subject: [PATCH 287/803] Update dependencies and drop `start-server-watch-dev`
 as it is unstable

---
 package-lock.json | 1712 +++++++++++++++++++++++----------------------
 package.json      |    5 +-
 2 files changed, 883 insertions(+), 834 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d66612b7..42dab68b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
             "version": "1.19.0-beta.0",
             "license": "MIT",
             "dependencies": {
-                "@grpc/grpc-js": "^1.7.0",
+                "@grpc/grpc-js": "~1.7.3",
                 "@louislam/sqlite3": "15.1.2",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
@@ -40,7 +40,7 @@
                 "limiter": "~2.1.0",
                 "mqtt": "~4.3.7",
                 "mssql": "~8.1.4",
-                "mysql2": "^2.3.3",
+                "mysql2": "~2.3.3",
                 "node-cloudflared-tunnel": "~1.0.9",
                 "node-radius-client": "~1.0.0",
                 "nodemailer": "~6.6.5",
@@ -235,20 +235,20 @@
             }
         },
         "node_modules/@azure/core-paging": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.3.0.tgz",
-            "integrity": "sha512-H6Tg9eBm0brHqLy0OSAGzxIh1t4UL8eZVrSUMJ60Ra9cwq2pOskFqVpz2pYoHDsBY1jZ4V/P8LRGb5D5pmC6rg==",
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.4.0.tgz",
+            "integrity": "sha512-tabFtZTg8D9XqZKEfNUOGh63SuYeOxmvH4GDcOJN+R1bZWZ1FZskctgY9Pmuwzhn+0Xvq9rmimK9hsvtLkeBsw==",
             "dependencies": {
                 "tslib": "^2.2.0"
             },
             "engines": {
-                "node": ">=12.0.0"
+                "node": ">=14.0.0"
             }
         },
         "node_modules/@azure/core-rest-pipeline": {
-            "version": "1.9.2",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.2.tgz",
-            "integrity": "sha512-8rXI6ircjenaLp+PkOFpo37tQ1PQfztZkfVj97BIF3RPxHAsoVSgkJtu3IK/bUEWcb7HzXSoyBe06M7ODRkRyw==",
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.0.tgz",
+            "integrity": "sha512-m6c4iAalfaf6sytOOQhLKFprEHSkSjQuRgkW7MTMnAN+GENDDL4XZJp7WKFnq9VpKUE+ggq+rp5xX9GI93lumw==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -262,7 +262,7 @@
                 "uuid": "^8.3.0"
             },
             "engines": {
-                "node": ">=12.0.0"
+                "node": ">=14.0.0"
             }
         },
         "node_modules/@azure/core-tracing": {
@@ -366,16 +366,24 @@
             }
         },
         "node_modules/@azure/msal-browser": {
-            "version": "2.30.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.30.0.tgz",
-            "integrity": "sha512-4Y9+rjJiTFP7KEmuq1btmIrBgk0ImNyKsXj6A6NHZALd1X0M6W7L7kxpH6F+d1tEkMv8bYnZdn7IcauXbL8Llw==",
+            "version": "2.32.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.0.tgz",
+            "integrity": "sha512-uDP0vNmIefM6+RjILGKu+zOiN+VGnEvxRfUIV5hOWOWLLkG7kcDPYG/v/EJMoG+R5DYW9jXA5nvZT76t5HdEAQ==",
             "dependencies": {
-                "@azure/msal-common": "^7.6.0"
+                "@azure/msal-common": "^9.0.0"
             },
             "engines": {
                 "node": ">=0.8.0"
             }
         },
+        "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": {
+            "version": "9.0.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
+            "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg==",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
         "node_modules/@azure/msal-common": {
             "version": "7.6.0",
             "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.6.0.tgz",
@@ -385,11 +393,11 @@
             }
         },
         "node_modules/@azure/msal-node": {
-            "version": "1.14.2",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.2.tgz",
-            "integrity": "sha512-t3whVhhLdZVVeDEtUPD2Wqfa8BDi3EDMnpWp8dbuRW0GhUpikBfs4AQU0Fe6P9zS87n9LpmUTLrIcPEEuzkvfA==",
+            "version": "1.14.4",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.4.tgz",
+            "integrity": "sha512-j9GzZu5mTLWtuJ+cYN6e67UNymIS5OysblrOzH8lakt9XxH0GCPYjuqbOEKTP84r+Rbj3io+TuW1KS+0Xxuj/g==",
             "dependencies": {
-                "@azure/msal-common": "^7.6.0",
+                "@azure/msal-common": "^9.0.0",
                 "jsonwebtoken": "^8.5.1",
                 "uuid": "^8.3.0"
             },
@@ -397,6 +405,14 @@
                 "node": "10 || 12 || 14 || 16 || 18"
             }
         },
+        "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
+            "version": "9.0.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
+            "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg==",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
         "node_modules/@babel/code-frame": {
             "version": "7.18.6",
             "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -410,30 +426,30 @@
             }
         },
         "node_modules/@babel/compat-data": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz",
-            "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
+            "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/core": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz",
-            "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz",
+            "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==",
             "dev": true,
             "dependencies": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.19.6",
-                "@babel/helper-compilation-targets": "^7.19.3",
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helpers": "^7.19.4",
-                "@babel/parser": "^7.19.6",
+                "@babel/generator": "^7.20.2",
+                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-module-transforms": "^7.20.2",
+                "@babel/helpers": "^7.20.1",
+                "@babel/parser": "^7.20.2",
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.6",
-                "@babel/types": "^7.19.4",
+                "@babel/traverse": "^7.20.1",
+                "@babel/types": "^7.20.2",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -467,12 +483,12 @@
             }
         },
         "node_modules/@babel/generator": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz",
-            "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==",
+            "version": "7.20.4",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz",
+            "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.19.4",
+                "@babel/types": "^7.20.2",
                 "@jridgewell/gen-mapping": "^0.3.2",
                 "jsesc": "^2.5.1"
             },
@@ -518,12 +534,12 @@
             }
         },
         "node_modules/@babel/helper-compilation-targets": {
-            "version": "7.19.3",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz",
-            "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+            "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.19.3",
+                "@babel/compat-data": "^7.20.0",
                 "@babel/helper-validator-option": "^7.18.6",
                 "browserslist": "^4.21.3",
                 "semver": "^6.3.0"
@@ -536,9 +552,9 @@
             }
         },
         "node_modules/@babel/helper-create-class-features-plugin": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz",
-            "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz",
+            "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
@@ -546,7 +562,7 @@
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-member-expression-to-functions": "^7.18.9",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.18.9",
+                "@babel/helper-replace-supers": "^7.19.1",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             },
             "engines": {
@@ -660,19 +676,19 @@
             }
         },
         "node_modules/@babel/helper-module-transforms": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz",
-            "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
+            "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-module-imports": "^7.18.6",
-                "@babel/helper-simple-access": "^7.19.4",
+                "@babel/helper-simple-access": "^7.20.2",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "@babel/helper-validator-identifier": "^7.19.1",
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.6",
-                "@babel/types": "^7.19.4"
+                "@babel/traverse": "^7.20.1",
+                "@babel/types": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -691,9 +707,9 @@
             }
         },
         "node_modules/@babel/helper-plugin-utils": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz",
-            "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+            "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
@@ -734,24 +750,24 @@
             }
         },
         "node_modules/@babel/helper-simple-access": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz",
-            "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+            "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.19.4"
+                "@babel/types": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz",
-            "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
+            "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.18.9"
+                "@babel/types": "^7.20.0"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -812,14 +828,14 @@
             }
         },
         "node_modules/@babel/helpers": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz",
-            "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
+            "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
             "dev": true,
             "dependencies": {
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.4",
-                "@babel/types": "^7.19.4"
+                "@babel/traverse": "^7.20.1",
+                "@babel/types": "^7.20.0"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -840,9 +856,9 @@
             }
         },
         "node_modules/@babel/parser": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz",
-            "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==",
+            "version": "7.20.3",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
+            "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==",
             "dev": true,
             "bin": {
                 "parser": "bin/babel-parser.js"
@@ -884,9 +900,9 @@
             }
         },
         "node_modules/@babel/plugin-proposal-async-generator-functions": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz",
-            "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz",
+            "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-environment-visitor": "^7.18.9",
@@ -1031,16 +1047,16 @@
             }
         },
         "node_modules/@babel/plugin-proposal-object-rest-spread": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz",
-            "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz",
+            "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.19.4",
-                "@babel/helper-compilation-targets": "^7.19.3",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/compat-data": "^7.20.1",
+                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.18.8"
+                "@babel/plugin-transform-parameters": "^7.20.1"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1208,12 +1224,12 @@
             }
         },
         "node_modules/@babel/plugin-syntax-import-assertions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz",
-            "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz",
+            "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.19.0"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1349,12 +1365,12 @@
             }
         },
         "node_modules/@babel/plugin-syntax-typescript": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz",
-            "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
+            "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.19.0"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1411,12 +1427,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-block-scoping": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz",
-            "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz",
+            "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-plugin-utils": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1426,18 +1442,18 @@
             }
         },
         "node_modules/@babel/plugin-transform-classes": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz",
-            "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz",
+            "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.19.0",
+                "@babel/helper-compilation-targets": "^7.20.0",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-replace-supers": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-replace-supers": "^7.19.1",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "globals": "^11.1.0"
             },
@@ -1464,12 +1480,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-destructuring": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz",
-            "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz",
+            "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-plugin-utils": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1702,12 +1718,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-parameters": {
-            "version": "7.18.8",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz",
-            "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==",
+            "version": "7.20.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz",
+            "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1870,18 +1886,18 @@
             }
         },
         "node_modules/@babel/preset-env": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz",
-            "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz",
+            "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.19.4",
-                "@babel/helper-compilation-targets": "^7.19.3",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/compat-data": "^7.20.1",
+                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-validator-option": "^7.18.6",
                 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
                 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
-                "@babel/plugin-proposal-async-generator-functions": "^7.19.1",
+                "@babel/plugin-proposal-async-generator-functions": "^7.20.1",
                 "@babel/plugin-proposal-class-properties": "^7.18.6",
                 "@babel/plugin-proposal-class-static-block": "^7.18.6",
                 "@babel/plugin-proposal-dynamic-import": "^7.18.6",
@@ -1890,7 +1906,7 @@
                 "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
                 "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
                 "@babel/plugin-proposal-numeric-separator": "^7.18.6",
-                "@babel/plugin-proposal-object-rest-spread": "^7.19.4",
+                "@babel/plugin-proposal-object-rest-spread": "^7.20.2",
                 "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
                 "@babel/plugin-proposal-optional-chaining": "^7.18.9",
                 "@babel/plugin-proposal-private-methods": "^7.18.6",
@@ -1901,7 +1917,7 @@
                 "@babel/plugin-syntax-class-static-block": "^7.14.5",
                 "@babel/plugin-syntax-dynamic-import": "^7.8.3",
                 "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-                "@babel/plugin-syntax-import-assertions": "^7.18.6",
+                "@babel/plugin-syntax-import-assertions": "^7.20.0",
                 "@babel/plugin-syntax-json-strings": "^7.8.3",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
                 "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
@@ -1914,10 +1930,10 @@
                 "@babel/plugin-transform-arrow-functions": "^7.18.6",
                 "@babel/plugin-transform-async-to-generator": "^7.18.6",
                 "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
-                "@babel/plugin-transform-block-scoping": "^7.19.4",
-                "@babel/plugin-transform-classes": "^7.19.0",
+                "@babel/plugin-transform-block-scoping": "^7.20.2",
+                "@babel/plugin-transform-classes": "^7.20.2",
                 "@babel/plugin-transform-computed-properties": "^7.18.9",
-                "@babel/plugin-transform-destructuring": "^7.19.4",
+                "@babel/plugin-transform-destructuring": "^7.20.2",
                 "@babel/plugin-transform-dotall-regex": "^7.18.6",
                 "@babel/plugin-transform-duplicate-keys": "^7.18.9",
                 "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
@@ -1925,14 +1941,14 @@
                 "@babel/plugin-transform-function-name": "^7.18.9",
                 "@babel/plugin-transform-literals": "^7.18.9",
                 "@babel/plugin-transform-member-expression-literals": "^7.18.6",
-                "@babel/plugin-transform-modules-amd": "^7.18.6",
-                "@babel/plugin-transform-modules-commonjs": "^7.18.6",
-                "@babel/plugin-transform-modules-systemjs": "^7.19.0",
+                "@babel/plugin-transform-modules-amd": "^7.19.6",
+                "@babel/plugin-transform-modules-commonjs": "^7.19.6",
+                "@babel/plugin-transform-modules-systemjs": "^7.19.6",
                 "@babel/plugin-transform-modules-umd": "^7.18.6",
                 "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1",
                 "@babel/plugin-transform-new-target": "^7.18.6",
                 "@babel/plugin-transform-object-super": "^7.18.6",
-                "@babel/plugin-transform-parameters": "^7.18.8",
+                "@babel/plugin-transform-parameters": "^7.20.1",
                 "@babel/plugin-transform-property-literals": "^7.18.6",
                 "@babel/plugin-transform-regenerator": "^7.18.6",
                 "@babel/plugin-transform-reserved-words": "^7.18.6",
@@ -1944,7 +1960,7 @@
                 "@babel/plugin-transform-unicode-escapes": "^7.18.10",
                 "@babel/plugin-transform-unicode-regex": "^7.18.6",
                 "@babel/preset-modules": "^0.1.5",
-                "@babel/types": "^7.19.4",
+                "@babel/types": "^7.20.2",
                 "babel-plugin-polyfill-corejs2": "^0.3.3",
                 "babel-plugin-polyfill-corejs3": "^0.6.0",
                 "babel-plugin-polyfill-regenerator": "^0.4.1",
@@ -1975,20 +1991,20 @@
             }
         },
         "node_modules/@babel/runtime": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz",
-            "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz",
+            "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==",
             "dependencies": {
-                "regenerator-runtime": "^0.13.4"
+                "regenerator-runtime": "^0.13.10"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/standalone": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.19.6.tgz",
-            "integrity": "sha512-SUOBMtHlxGpXf14X85c1vtHyxYgIODBUdclntETSEGkgI274MNPBUkOVWpvFmRhMuLokK3CL07qJoK2e5CIToA==",
+            "version": "7.20.4",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.4.tgz",
+            "integrity": "sha512-27bv4h47jbaFZ7+e7gT1VEo9PNL1ynxqUX6/BERLz1qxm/5gzpbcHX+47VnSeYHyEyGZkRznpSOd8zPBhiz6tw==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
@@ -2009,19 +2025,19 @@
             }
         },
         "node_modules/@babel/traverse": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz",
-            "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
+            "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.19.6",
+                "@babel/generator": "^7.20.1",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.19.6",
-                "@babel/types": "^7.19.4",
+                "@babel/parser": "^7.20.1",
+                "@babel/types": "^7.20.0",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             },
@@ -2030,9 +2046,9 @@
             }
         },
         "node_modules/@babel/types": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz",
-            "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
+            "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-string-parser": "^7.19.4",
@@ -2130,9 +2146,9 @@
             }
         },
         "node_modules/@esbuild/android-arm": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz",
-            "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz",
+            "integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==",
             "cpu": [
                 "arm"
             ],
@@ -2146,9 +2162,9 @@
             }
         },
         "node_modules/@esbuild/linux-loong64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz",
-            "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz",
+            "integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==",
             "cpu": [
                 "loong64"
             ],
@@ -2185,9 +2201,9 @@
             }
         },
         "node_modules/@eslint/eslintrc/node_modules/globals": {
-            "version": "13.17.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
-            "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+            "version": "13.18.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
+            "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -2261,9 +2277,9 @@
             }
         },
         "node_modules/@fortawesome/vue-fontawesome": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.1.tgz",
-            "integrity": "sha512-CdXZJoCS+aEPec26ZP7hWWU3SaJlQPZSCGdgpQ2qGl2HUmtUUNrI3zC4XWdn1JUmh3t5OuDeRG1qB4eGRNSD4A==",
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.2.tgz",
+            "integrity": "sha512-xHVtVY8ASUeEvgcA/7vULUesENhD+pi/EirRHdMBqooHlXBqK+yrV6d8tUye1m5UKQKVgYAHMhUBfOnoiwvc8Q==",
             "dev": true,
             "peerDependencies": {
                 "@fortawesome/fontawesome-svg-core": "~1 || ~6",
@@ -3399,9 +3415,9 @@
             "dev": true
         },
         "node_modules/@sinonjs/commons": {
-            "version": "1.8.3",
-            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
-            "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
+            "version": "1.8.5",
+            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz",
+            "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==",
             "dev": true,
             "dependencies": {
                 "type-detect": "4.0.8"
@@ -3443,9 +3459,9 @@
             }
         },
         "node_modules/@types/babel__core": {
-            "version": "7.1.19",
-            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
-            "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==",
+            "version": "7.1.20",
+            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
+            "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.1.0",
@@ -3579,9 +3595,9 @@
             "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
         },
         "node_modules/@types/http-errors": {
-            "version": "1.8.2",
-            "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz",
-            "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w=="
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
+            "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ=="
         },
         "node_modules/@types/istanbul-lib-coverage": {
             "version": "2.0.4",
@@ -3636,9 +3652,9 @@
             }
         },
         "node_modules/@types/lodash": {
-            "version": "4.14.186",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz",
-            "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw=="
+            "version": "4.14.190",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz",
+            "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw=="
         },
         "node_modules/@types/long": {
             "version": "4.0.2",
@@ -3657,9 +3673,9 @@
             "dev": true
         },
         "node_modules/@types/node": {
-            "version": "18.11.6",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.6.tgz",
-            "integrity": "sha512-j3CEDa2vd96K0AXF8Wur7UucACvnjkk8hYyQAHhUNciabZLDl9nfAEVUSwmh245OOZV15bRA3Y590Gi5jUcDJg=="
+            "version": "18.11.9",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz",
+            "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg=="
         },
         "node_modules/@types/normalize-package-data": {
             "version": "2.4.1",
@@ -3762,9 +3778,9 @@
             }
         },
         "node_modules/@vitejs/plugin-legacy/node_modules/core-js": {
-            "version": "3.26.0",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz",
-            "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==",
+            "version": "3.26.1",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz",
+            "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==",
             "dev": true,
             "hasInstallScript": true,
             "funding": {
@@ -3786,39 +3802,39 @@
             }
         },
         "node_modules/@vue/compiler-core": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz",
-            "integrity": "sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
+            "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.41",
+                "@vue/shared": "3.2.45",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "node_modules/@vue/compiler-dom": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz",
-            "integrity": "sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
+            "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
             "dev": true,
             "dependencies": {
-                "@vue/compiler-core": "3.2.41",
-                "@vue/shared": "3.2.41"
+                "@vue/compiler-core": "3.2.45",
+                "@vue/shared": "3.2.45"
             }
         },
         "node_modules/@vue/compiler-sfc": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz",
-            "integrity": "sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
+            "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.41",
-                "@vue/compiler-dom": "3.2.41",
-                "@vue/compiler-ssr": "3.2.41",
-                "@vue/reactivity-transform": "3.2.41",
-                "@vue/shared": "3.2.41",
+                "@vue/compiler-core": "3.2.45",
+                "@vue/compiler-dom": "3.2.45",
+                "@vue/compiler-ssr": "3.2.45",
+                "@vue/reactivity-transform": "3.2.45",
+                "@vue/shared": "3.2.45",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7",
                 "postcss": "^8.1.10",
@@ -3835,13 +3851,13 @@
             }
         },
         "node_modules/@vue/compiler-ssr": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz",
-            "integrity": "sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
+            "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
             "dev": true,
             "dependencies": {
-                "@vue/compiler-dom": "3.2.41",
-                "@vue/shared": "3.2.41"
+                "@vue/compiler-dom": "3.2.45",
+                "@vue/shared": "3.2.45"
             }
         },
         "node_modules/@vue/devtools-api": {
@@ -3860,14 +3876,14 @@
             }
         },
         "node_modules/@vue/reactivity-transform": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz",
-            "integrity": "sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
+            "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.41",
-                "@vue/shared": "3.2.41",
+                "@vue/compiler-core": "3.2.45",
+                "@vue/shared": "3.2.45",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             }
@@ -3972,9 +3988,9 @@
             "dev": true
         },
         "node_modules/@vue/shared": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz",
-            "integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
+            "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
             "dev": true
         },
         "node_modules/@vuepic/vue-datepicker": {
@@ -4222,9 +4238,9 @@
             }
         },
         "node_modules/anymatch": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-            "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+            "version": "3.1.3",
+            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+            "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
             "dev": true,
             "dependencies": {
                 "normalize-path": "^3.0.0",
@@ -4382,22 +4398,29 @@
             }
         },
         "node_modules/axios-ntlm": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.0.tgz",
-            "integrity": "sha512-NPNsIMO1SGX5scs3ZWJqsV7iRLvET+DlRl94aZ7Sx14zA8RTQh9EDxsJmxB9cKjardKfp2Vge444uYYLfvWC0Q==",
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.1.tgz",
+            "integrity": "sha512-YhjZj6UUzFzGirh7SiKbyvoXCWiZFMjjx2WJ8ouUUGNrqw/QgTc4H3M+7a6CTGENfLgXi2OiEhVeHmqoCffdYQ==",
             "dependencies": {
-                "axios": "^0.21.3",
+                "axios": "^1.2.0",
                 "dev-null": "^0.1.1"
             }
         },
         "node_modules/axios-ntlm/node_modules/axios": {
-            "version": "0.21.4",
-            "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
-            "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz",
+            "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==",
             "dependencies": {
-                "follow-redirects": "^1.14.0"
+                "follow-redirects": "^1.15.0",
+                "form-data": "^4.0.0",
+                "proxy-from-env": "^1.1.0"
             }
         },
+        "node_modules/axios-ntlm/node_modules/proxy-from-env": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+        },
         "node_modules/babel-jest": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
@@ -5059,9 +5082,9 @@
             }
         },
         "node_modules/caniuse-lite": {
-            "version": "1.0.30001425",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz",
-            "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==",
+            "version": "1.0.30001434",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
+            "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==",
             "dev": true,
             "funding": [
                 {
@@ -5235,10 +5258,13 @@
             "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
         },
         "node_modules/ci-info": {
-            "version": "3.5.0",
-            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz",
-            "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==",
-            "dev": true
+            "version": "3.7.0",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz",
+            "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
         },
         "node_modules/cjs-module-lexer": {
             "version": "1.2.2",
@@ -5506,9 +5532,9 @@
             }
         },
         "node_modules/concurrently": {
-            "version": "7.5.0",
-            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.5.0.tgz",
-            "integrity": "sha512-5E3mwiS+i2JYBzr5BpXkFxOnleZTMsG+WnE/dCG4/P+oiVXrbmrBwJ2ozn4SxwB2EZDrKR568X+puVohxz3/Mg==",
+            "version": "7.6.0",
+            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz",
+            "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==",
             "dev": true,
             "dependencies": {
                 "chalk": "^4.1.0",
@@ -5632,9 +5658,9 @@
             }
         },
         "node_modules/concurrently/node_modules/yargs": {
-            "version": "17.6.0",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz",
-            "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==",
+            "version": "17.6.2",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
+            "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==",
             "dev": true,
             "dependencies": {
                 "cliui": "^8.0.1",
@@ -5643,7 +5669,7 @@
                 "require-directory": "^2.1.1",
                 "string-width": "^4.2.3",
                 "y18n": "^5.0.5",
-                "yargs-parser": "^21.0.0"
+                "yargs-parser": "^21.1.1"
             },
             "engines": {
                 "node": ">=12"
@@ -5733,9 +5759,9 @@
             }
         },
         "node_modules/core-js-compat": {
-            "version": "3.26.0",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz",
-            "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==",
+            "version": "3.26.1",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz",
+            "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==",
             "dev": true,
             "dependencies": {
                 "browserslist": "^4.21.4"
@@ -5764,9 +5790,9 @@
             }
         },
         "node_modules/cosmiconfig": {
-            "version": "7.0.1",
-            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
-            "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+            "version": "7.1.0",
+            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+            "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
             "dev": true,
             "dependencies": {
                 "@types/parse-json": "^4.0.0",
@@ -5780,9 +5806,9 @@
             }
         },
         "node_modules/cron-validate": {
-            "version": "1.4.4",
-            "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.4.tgz",
-            "integrity": "sha512-QvVpGR32350w3BWVB4zT84UhA5kq/oWDmSfbbTFLJanq63KS8rsunV+0PKAQIeIJ+gHhysVF4sJ8gsq8+3gfAw==",
+            "version": "1.4.5",
+            "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.5.tgz",
+            "integrity": "sha512-nKlOJEnYKudMn/aNyNH8xxWczlfpaazfWV32Pcx/2St51r2bxWbGhZD7uwzMcRhunA/ZNL+Htm/i0792Z59UMQ==",
             "dependencies": {
                 "yup": "0.32.9"
             }
@@ -5984,9 +6010,9 @@
             }
         },
         "node_modules/cypress/node_modules/@types/node": {
-            "version": "14.18.32",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz",
-            "integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==",
+            "version": "14.18.33",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
+            "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==",
             "dev": true
         },
         "node_modules/cypress/node_modules/ansi-styles": {
@@ -6164,9 +6190,9 @@
             }
         },
         "node_modules/decamelize-keys": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
-            "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+            "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
             "dev": true,
             "dependencies": {
                 "decamelize": "^1.1.0",
@@ -6174,6 +6200,9 @@
             },
             "engines": {
                 "node": ">=0.10.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
             }
         },
         "node_modules/decamelize-keys/node_modules/map-obj": {
@@ -6506,9 +6535,9 @@
             }
         },
         "node_modules/engine.io": {
-            "version": "6.2.0",
-            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz",
-            "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==",
+            "version": "6.2.1",
+            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
+            "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
             "dependencies": {
                 "@types/cookie": "^0.4.1",
                 "@types/cors": "^2.8.12",
@@ -6664,16 +6693,16 @@
             }
         },
         "node_modules/es-aggregate-error": {
-            "version": "1.0.8",
-            "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.8.tgz",
-            "integrity": "sha512-AKUb5MKLWMozPlFRHOKqWD7yta5uaEhH21qwtnf6FlKjNjTJOoqFi0/G14+FfSkIQhhu6X68Af4xgRC6y8qG4A==",
+            "version": "1.0.9",
+            "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.9.tgz",
+            "integrity": "sha512-fvnX40sb538wdU6r4s35cq4EY6Lr09Upj40BEVem4LEsuW8XgQep9yD5Q1U2KftokNp1rWODFJ2qwZSsAjFpbg==",
             "dependencies": {
                 "define-properties": "^1.1.4",
-                "es-abstract": "^1.19.5",
+                "es-abstract": "^1.20.4",
                 "function-bind": "^1.1.1",
                 "functions-have-names": "^1.2.3",
-                "get-intrinsic": "^1.1.1",
-                "globalthis": "^1.0.2",
+                "get-intrinsic": "^1.1.3",
+                "globalthis": "^1.0.3",
                 "has-property-descriptors": "^1.0.0"
             },
             "engines": {
@@ -6700,9 +6729,9 @@
             }
         },
         "node_modules/esbuild": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz",
-            "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
+            "integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==",
             "dev": true,
             "hasInstallScript": true,
             "bin": {
@@ -6712,34 +6741,34 @@
                 "node": ">=12"
             },
             "optionalDependencies": {
-                "@esbuild/android-arm": "0.15.12",
-                "@esbuild/linux-loong64": "0.15.12",
-                "esbuild-android-64": "0.15.12",
-                "esbuild-android-arm64": "0.15.12",
-                "esbuild-darwin-64": "0.15.12",
-                "esbuild-darwin-arm64": "0.15.12",
-                "esbuild-freebsd-64": "0.15.12",
-                "esbuild-freebsd-arm64": "0.15.12",
-                "esbuild-linux-32": "0.15.12",
-                "esbuild-linux-64": "0.15.12",
-                "esbuild-linux-arm": "0.15.12",
-                "esbuild-linux-arm64": "0.15.12",
-                "esbuild-linux-mips64le": "0.15.12",
-                "esbuild-linux-ppc64le": "0.15.12",
-                "esbuild-linux-riscv64": "0.15.12",
-                "esbuild-linux-s390x": "0.15.12",
-                "esbuild-netbsd-64": "0.15.12",
-                "esbuild-openbsd-64": "0.15.12",
-                "esbuild-sunos-64": "0.15.12",
-                "esbuild-windows-32": "0.15.12",
-                "esbuild-windows-64": "0.15.12",
-                "esbuild-windows-arm64": "0.15.12"
+                "@esbuild/android-arm": "0.15.15",
+                "@esbuild/linux-loong64": "0.15.15",
+                "esbuild-android-64": "0.15.15",
+                "esbuild-android-arm64": "0.15.15",
+                "esbuild-darwin-64": "0.15.15",
+                "esbuild-darwin-arm64": "0.15.15",
+                "esbuild-freebsd-64": "0.15.15",
+                "esbuild-freebsd-arm64": "0.15.15",
+                "esbuild-linux-32": "0.15.15",
+                "esbuild-linux-64": "0.15.15",
+                "esbuild-linux-arm": "0.15.15",
+                "esbuild-linux-arm64": "0.15.15",
+                "esbuild-linux-mips64le": "0.15.15",
+                "esbuild-linux-ppc64le": "0.15.15",
+                "esbuild-linux-riscv64": "0.15.15",
+                "esbuild-linux-s390x": "0.15.15",
+                "esbuild-netbsd-64": "0.15.15",
+                "esbuild-openbsd-64": "0.15.15",
+                "esbuild-sunos-64": "0.15.15",
+                "esbuild-windows-32": "0.15.15",
+                "esbuild-windows-64": "0.15.15",
+                "esbuild-windows-arm64": "0.15.15"
             }
         },
         "node_modules/esbuild-android-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz",
-            "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz",
+            "integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==",
             "cpu": [
                 "x64"
             ],
@@ -6753,9 +6782,9 @@
             }
         },
         "node_modules/esbuild-android-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz",
-            "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz",
+            "integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==",
             "cpu": [
                 "arm64"
             ],
@@ -6769,9 +6798,9 @@
             }
         },
         "node_modules/esbuild-darwin-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz",
-            "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz",
+            "integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==",
             "cpu": [
                 "x64"
             ],
@@ -6785,9 +6814,9 @@
             }
         },
         "node_modules/esbuild-darwin-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz",
-            "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz",
+            "integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==",
             "cpu": [
                 "arm64"
             ],
@@ -6801,9 +6830,9 @@
             }
         },
         "node_modules/esbuild-freebsd-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz",
-            "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz",
+            "integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==",
             "cpu": [
                 "x64"
             ],
@@ -6817,9 +6846,9 @@
             }
         },
         "node_modules/esbuild-freebsd-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz",
-            "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz",
+            "integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==",
             "cpu": [
                 "arm64"
             ],
@@ -6833,9 +6862,9 @@
             }
         },
         "node_modules/esbuild-linux-32": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz",
-            "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz",
+            "integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==",
             "cpu": [
                 "ia32"
             ],
@@ -6849,9 +6878,9 @@
             }
         },
         "node_modules/esbuild-linux-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz",
-            "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz",
+            "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==",
             "cpu": [
                 "x64"
             ],
@@ -6865,9 +6894,9 @@
             }
         },
         "node_modules/esbuild-linux-arm": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz",
-            "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz",
+            "integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==",
             "cpu": [
                 "arm"
             ],
@@ -6881,9 +6910,9 @@
             }
         },
         "node_modules/esbuild-linux-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz",
-            "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz",
+            "integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==",
             "cpu": [
                 "arm64"
             ],
@@ -6897,9 +6926,9 @@
             }
         },
         "node_modules/esbuild-linux-mips64le": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz",
-            "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz",
+            "integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==",
             "cpu": [
                 "mips64el"
             ],
@@ -6913,9 +6942,9 @@
             }
         },
         "node_modules/esbuild-linux-ppc64le": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz",
-            "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz",
+            "integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==",
             "cpu": [
                 "ppc64"
             ],
@@ -6929,9 +6958,9 @@
             }
         },
         "node_modules/esbuild-linux-riscv64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz",
-            "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz",
+            "integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==",
             "cpu": [
                 "riscv64"
             ],
@@ -6945,9 +6974,9 @@
             }
         },
         "node_modules/esbuild-linux-s390x": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz",
-            "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz",
+            "integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==",
             "cpu": [
                 "s390x"
             ],
@@ -6961,9 +6990,9 @@
             }
         },
         "node_modules/esbuild-netbsd-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz",
-            "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz",
+            "integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==",
             "cpu": [
                 "x64"
             ],
@@ -6977,9 +7006,9 @@
             }
         },
         "node_modules/esbuild-openbsd-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz",
-            "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz",
+            "integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==",
             "cpu": [
                 "x64"
             ],
@@ -6993,9 +7022,9 @@
             }
         },
         "node_modules/esbuild-sunos-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz",
-            "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz",
+            "integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==",
             "cpu": [
                 "x64"
             ],
@@ -7009,9 +7038,9 @@
             }
         },
         "node_modules/esbuild-windows-32": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz",
-            "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz",
+            "integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==",
             "cpu": [
                 "ia32"
             ],
@@ -7025,9 +7054,9 @@
             }
         },
         "node_modules/esbuild-windows-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz",
-            "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz",
+            "integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==",
             "cpu": [
                 "x64"
             ],
@@ -7041,9 +7070,9 @@
             }
         },
         "node_modules/esbuild-windows-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz",
-            "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz",
+            "integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==",
             "cpu": [
                 "arm64"
             ],
@@ -7380,9 +7409,9 @@
             }
         },
         "node_modules/eslint/node_modules/globals": {
-            "version": "13.17.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
-            "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+            "version": "13.18.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
+            "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -7436,9 +7465,9 @@
             }
         },
         "node_modules/espree": {
-            "version": "9.4.0",
-            "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
-            "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
+            "version": "9.4.1",
+            "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+            "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
             "dev": true,
             "dependencies": {
                 "acorn": "^8.8.0",
@@ -8319,9 +8348,9 @@
             }
         },
         "node_modules/global-dirs": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
-            "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+            "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
             "dev": true,
             "dependencies": {
                 "ini": "2.0.0"
@@ -8624,9 +8653,9 @@
             }
         },
         "node_modules/http-graceful-shutdown": {
-            "version": "3.1.9",
-            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.9.tgz",
-            "integrity": "sha512-+ciDBK4LyVfCwGBX/bCF4jbkori9X7x9Wt+1Rdj/IJupLozxk7jf5iXAPcPbJXkSE8WZtsQKKjT/UGsvGRWuVA==",
+            "version": "3.1.11",
+            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.11.tgz",
+            "integrity": "sha512-tfOwKDZA8kJqDNBK2ur+o55HbhDHoflvDCDgjbmm5eAn0RhqhdlUjVygj8e258B5nn5kNsEFOl7DbXLskKrgGA==",
             "dependencies": {
                 "debug": "^4.3.4"
             },
@@ -10331,9 +10360,9 @@
             }
         },
         "node_modules/jest-pnp-resolver": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-            "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+            "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
             "dev": true,
             "engines": {
                 "node": ">=6"
@@ -13024,9 +13053,9 @@
             }
         },
         "node_modules/parse5": {
-            "version": "7.1.1",
-            "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz",
-            "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==",
+            "version": "7.1.2",
+            "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+            "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
             "dependencies": {
                 "entities": "^4.4.0"
             },
@@ -13270,9 +13299,9 @@
             }
         },
         "node_modules/postcss": {
-            "version": "8.4.18",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
-            "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
+            "version": "8.4.19",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz",
+            "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==",
             "dev": true,
             "funding": [
                 {
@@ -13380,9 +13409,9 @@
             }
         },
         "node_modules/postcss-selector-parser": {
-            "version": "6.0.10",
-            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
-            "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+            "version": "6.0.11",
+            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
+            "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
             "dev": true,
             "dependencies": {
                 "cssesc": "^3.0.0",
@@ -13571,9 +13600,9 @@
             }
         },
         "node_modules/protobufjs/node_modules/long": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz",
-            "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w=="
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
+            "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
         },
         "node_modules/proxy-addr": {
             "version": "2.0.7",
@@ -13588,9 +13617,9 @@
             }
         },
         "node_modules/proxy-from-env": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+            "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
             "dev": true
         },
         "node_modules/pseudomap": {
@@ -13973,9 +14002,9 @@
             }
         },
         "node_modules/redbean-node/node_modules/@types/node": {
-            "version": "14.18.32",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz",
-            "integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow=="
+            "version": "14.18.33",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
+            "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg=="
         },
         "node_modules/redent": {
             "version": "3.0.0",
@@ -14009,14 +14038,14 @@
             }
         },
         "node_modules/regenerator-runtime": {
-            "version": "0.13.10",
-            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz",
-            "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw=="
+            "version": "0.13.11",
+            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+            "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
         },
         "node_modules/regenerator-transform": {
-            "version": "0.15.0",
-            "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
-            "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
+            "version": "0.15.1",
+            "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+            "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
             "dev": true,
             "dependencies": {
                 "@babel/runtime": "^7.8.4"
@@ -14051,9 +14080,9 @@
             }
         },
         "node_modules/regexpu-core": {
-            "version": "5.2.1",
-            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz",
-            "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==",
+            "version": "5.2.2",
+            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz",
+            "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==",
             "dev": true,
             "dependencies": {
                 "regenerate": "^1.4.2",
@@ -14061,7 +14090,7 @@
                 "regjsgen": "^0.7.1",
                 "regjsparser": "^0.9.1",
                 "unicode-match-property-ecmascript": "^2.0.0",
-                "unicode-match-property-value-ecmascript": "^2.0.0"
+                "unicode-match-property-value-ecmascript": "^2.1.0"
             },
             "engines": {
                 "node": ">=4"
@@ -14390,9 +14419,9 @@
             }
         },
         "node_modules/rollup-plugin-visualizer/node_modules/yargs": {
-            "version": "17.6.0",
-            "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz",
-            "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==",
+            "version": "17.6.2",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
+            "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==",
             "dev": true,
             "dependencies": {
                 "cliui": "^8.0.1",
@@ -14401,7 +14430,7 @@
                 "require-directory": "^2.1.1",
                 "string-width": "^4.2.3",
                 "y18n": "^5.0.5",
-                "yargs-parser": "^21.0.0"
+                "yargs-parser": "^21.1.1"
             },
             "engines": {
                 "node": ">=12"
@@ -14772,16 +14801,16 @@
             }
         },
         "node_modules/socket.io": {
-            "version": "4.5.3",
-            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz",
-            "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==",
+            "version": "4.5.4",
+            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
+            "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
             "dependencies": {
                 "accepts": "~1.3.4",
                 "base64id": "~2.0.0",
                 "debug": "~4.3.2",
-                "engine.io": "~6.2.0",
+                "engine.io": "~6.2.1",
                 "socket.io-adapter": "~2.4.0",
-                "socket.io-parser": "~4.2.0"
+                "socket.io-parser": "~4.2.1"
             },
             "engines": {
                 "node": ">=10.0.0"
@@ -14793,14 +14822,14 @@
             "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
         },
         "node_modules/socket.io-client": {
-            "version": "4.5.3",
-            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz",
-            "integrity": "sha512-I/hqDYpQ6JKwtJOf5ikM+Qz+YujZPMEl6qBLhxiP0nX+TfXKhW4KZZG8lamrD6Y5ngjmYHreESVasVCgi5Kl3A==",
+            "version": "4.5.4",
+            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz",
+            "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==",
             "dependencies": {
                 "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.2",
                 "engine.io-client": "~6.2.3",
-                "socket.io-parser": "~4.2.0"
+                "socket.io-parser": "~4.2.1"
             },
             "engines": {
                 "node": ">=10.0.0"
@@ -14978,9 +15007,9 @@
             }
         },
         "node_modules/stack-utils": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
-            "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+            "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
             "dev": true,
             "dependencies": {
                 "escape-string-regexp": "^2.0.0"
@@ -15074,26 +15103,26 @@
             }
         },
         "node_modules/string.prototype.trimend": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
-            "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+            "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
             "dependencies": {
                 "call-bind": "^1.0.2",
                 "define-properties": "^1.1.4",
-                "es-abstract": "^1.19.5"
+                "es-abstract": "^1.20.4"
             },
             "funding": {
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
         "node_modules/string.prototype.trimstart": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
-            "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+            "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
             "dependencies": {
                 "call-bind": "^1.0.2",
                 "define-properties": "^1.1.4",
-                "es-abstract": "^1.19.5"
+                "es-abstract": "^1.20.4"
             },
             "funding": {
                 "url": "https://github.com/sponsors/ljharb"
@@ -15342,9 +15371,9 @@
             "dev": true
         },
         "node_modules/table": {
-            "version": "6.8.0",
-            "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
-            "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
+            "version": "6.8.1",
+            "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
+            "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
             "dev": true,
             "dependencies": {
                 "ajv": "^8.0.1",
@@ -15358,9 +15387,9 @@
             }
         },
         "node_modules/table/node_modules/ajv": {
-            "version": "8.11.0",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
-            "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
+            "version": "8.11.2",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz",
+            "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==",
             "dev": true,
             "dependencies": {
                 "fast-deep-equal": "^3.1.1",
@@ -15430,9 +15459,9 @@
             }
         },
         "node_modules/tar": {
-            "version": "6.1.11",
-            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-            "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
+            "version": "6.1.12",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz",
+            "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==",
             "dependencies": {
                 "chownr": "^2.0.0",
                 "fs-minipass": "^2.0.0",
@@ -15442,7 +15471,7 @@
                 "yallist": "^4.0.0"
             },
             "engines": {
-                "node": ">= 10"
+                "node": ">=10"
             }
         },
         "node_modules/tarn": {
@@ -15727,9 +15756,9 @@
             }
         },
         "node_modules/tslib": {
-            "version": "2.4.0",
-            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
-            "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+            "version": "2.4.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
+            "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
         },
         "node_modules/tunnel": {
             "version": "0.0.6",
@@ -15867,9 +15896,9 @@
             }
         },
         "node_modules/unicode-match-property-value-ecmascript": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
-            "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+            "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
             "dev": true,
             "engines": {
                 "node": ">=4"
@@ -16595,9 +16624,9 @@
             }
         },
         "node_modules/wait-on/node_modules/joi": {
-            "version": "17.6.4",
-            "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.4.tgz",
-            "integrity": "sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw==",
+            "version": "17.7.0",
+            "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz",
+            "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==",
             "dev": true,
             "dependencies": {
                 "@hapi/hoek": "^9.0.0",
@@ -17013,17 +17042,17 @@
             }
         },
         "@azure/core-paging": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.3.0.tgz",
-            "integrity": "sha512-H6Tg9eBm0brHqLy0OSAGzxIh1t4UL8eZVrSUMJ60Ra9cwq2pOskFqVpz2pYoHDsBY1jZ4V/P8LRGb5D5pmC6rg==",
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.4.0.tgz",
+            "integrity": "sha512-tabFtZTg8D9XqZKEfNUOGh63SuYeOxmvH4GDcOJN+R1bZWZ1FZskctgY9Pmuwzhn+0Xvq9rmimK9hsvtLkeBsw==",
             "requires": {
                 "tslib": "^2.2.0"
             }
         },
         "@azure/core-rest-pipeline": {
-            "version": "1.9.2",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.9.2.tgz",
-            "integrity": "sha512-8rXI6ircjenaLp+PkOFpo37tQ1PQfztZkfVj97BIF3RPxHAsoVSgkJtu3IK/bUEWcb7HzXSoyBe06M7ODRkRyw==",
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.0.tgz",
+            "integrity": "sha512-m6c4iAalfaf6sytOOQhLKFprEHSkSjQuRgkW7MTMnAN+GENDDL4XZJp7WKFnq9VpKUE+ggq+rp5xX9GI93lumw==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -17125,11 +17154,18 @@
             }
         },
         "@azure/msal-browser": {
-            "version": "2.30.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.30.0.tgz",
-            "integrity": "sha512-4Y9+rjJiTFP7KEmuq1btmIrBgk0ImNyKsXj6A6NHZALd1X0M6W7L7kxpH6F+d1tEkMv8bYnZdn7IcauXbL8Llw==",
+            "version": "2.32.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.0.tgz",
+            "integrity": "sha512-uDP0vNmIefM6+RjILGKu+zOiN+VGnEvxRfUIV5hOWOWLLkG7kcDPYG/v/EJMoG+R5DYW9jXA5nvZT76t5HdEAQ==",
             "requires": {
-                "@azure/msal-common": "^7.6.0"
+                "@azure/msal-common": "^9.0.0"
+            },
+            "dependencies": {
+                "@azure/msal-common": {
+                    "version": "9.0.0",
+                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
+                    "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg=="
+                }
             }
         },
         "@azure/msal-common": {
@@ -17138,13 +17174,20 @@
             "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q=="
         },
         "@azure/msal-node": {
-            "version": "1.14.2",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.2.tgz",
-            "integrity": "sha512-t3whVhhLdZVVeDEtUPD2Wqfa8BDi3EDMnpWp8dbuRW0GhUpikBfs4AQU0Fe6P9zS87n9LpmUTLrIcPEEuzkvfA==",
+            "version": "1.14.4",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.4.tgz",
+            "integrity": "sha512-j9GzZu5mTLWtuJ+cYN6e67UNymIS5OysblrOzH8lakt9XxH0GCPYjuqbOEKTP84r+Rbj3io+TuW1KS+0Xxuj/g==",
             "requires": {
-                "@azure/msal-common": "^7.6.0",
+                "@azure/msal-common": "^9.0.0",
                 "jsonwebtoken": "^8.5.1",
                 "uuid": "^8.3.0"
+            },
+            "dependencies": {
+                "@azure/msal-common": {
+                    "version": "9.0.0",
+                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
+                    "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg=="
+                }
             }
         },
         "@babel/code-frame": {
@@ -17157,27 +17200,27 @@
             }
         },
         "@babel/compat-data": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz",
-            "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
+            "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
             "dev": true
         },
         "@babel/core": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz",
-            "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz",
+            "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==",
             "dev": true,
             "requires": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.19.6",
-                "@babel/helper-compilation-targets": "^7.19.3",
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helpers": "^7.19.4",
-                "@babel/parser": "^7.19.6",
+                "@babel/generator": "^7.20.2",
+                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-module-transforms": "^7.20.2",
+                "@babel/helpers": "^7.20.1",
+                "@babel/parser": "^7.20.2",
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.6",
-                "@babel/types": "^7.19.4",
+                "@babel/traverse": "^7.20.1",
+                "@babel/types": "^7.20.2",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -17197,12 +17240,12 @@
             }
         },
         "@babel/generator": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz",
-            "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==",
+            "version": "7.20.4",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz",
+            "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.19.4",
+                "@babel/types": "^7.20.2",
                 "@jridgewell/gen-mapping": "^0.3.2",
                 "jsesc": "^2.5.1"
             },
@@ -17235,21 +17278,21 @@
             }
         },
         "@babel/helper-compilation-targets": {
-            "version": "7.19.3",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz",
-            "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+            "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.19.3",
+                "@babel/compat-data": "^7.20.0",
                 "@babel/helper-validator-option": "^7.18.6",
                 "browserslist": "^4.21.3",
                 "semver": "^6.3.0"
             }
         },
         "@babel/helper-create-class-features-plugin": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz",
-            "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz",
+            "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
@@ -17257,7 +17300,7 @@
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-member-expression-to-functions": "^7.18.9",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.18.9",
+                "@babel/helper-replace-supers": "^7.19.1",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             }
         },
@@ -17338,19 +17381,19 @@
             }
         },
         "@babel/helper-module-transforms": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz",
-            "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
+            "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
             "dev": true,
             "requires": {
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-module-imports": "^7.18.6",
-                "@babel/helper-simple-access": "^7.19.4",
+                "@babel/helper-simple-access": "^7.20.2",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "@babel/helper-validator-identifier": "^7.19.1",
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.6",
-                "@babel/types": "^7.19.4"
+                "@babel/traverse": "^7.20.1",
+                "@babel/types": "^7.20.2"
             }
         },
         "@babel/helper-optimise-call-expression": {
@@ -17363,9 +17406,9 @@
             }
         },
         "@babel/helper-plugin-utils": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz",
-            "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+            "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
             "dev": true
         },
         "@babel/helper-remap-async-to-generator": {
@@ -17394,21 +17437,21 @@
             }
         },
         "@babel/helper-simple-access": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz",
-            "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+            "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.19.4"
+                "@babel/types": "^7.20.2"
             }
         },
         "@babel/helper-skip-transparent-expression-wrappers": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz",
-            "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
+            "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.18.9"
+                "@babel/types": "^7.20.0"
             }
         },
         "@babel/helper-split-export-declaration": {
@@ -17451,14 +17494,14 @@
             }
         },
         "@babel/helpers": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz",
-            "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
+            "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
             "dev": true,
             "requires": {
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.4",
-                "@babel/types": "^7.19.4"
+                "@babel/traverse": "^7.20.1",
+                "@babel/types": "^7.20.0"
             }
         },
         "@babel/highlight": {
@@ -17473,9 +17516,9 @@
             }
         },
         "@babel/parser": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz",
-            "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==",
+            "version": "7.20.3",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
+            "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==",
             "dev": true
         },
         "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
@@ -17499,9 +17542,9 @@
             }
         },
         "@babel/plugin-proposal-async-generator-functions": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz",
-            "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz",
+            "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==",
             "dev": true,
             "requires": {
                 "@babel/helper-environment-visitor": "^7.18.9",
@@ -17592,16 +17635,16 @@
             }
         },
         "@babel/plugin-proposal-object-rest-spread": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz",
-            "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz",
+            "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.19.4",
-                "@babel/helper-compilation-targets": "^7.19.3",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/compat-data": "^7.20.1",
+                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.18.8"
+                "@babel/plugin-transform-parameters": "^7.20.1"
             }
         },
         "@babel/plugin-proposal-optional-catch-binding": {
@@ -17712,12 +17755,12 @@
             }
         },
         "@babel/plugin-syntax-import-assertions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz",
-            "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz",
+            "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.19.0"
             }
         },
         "@babel/plugin-syntax-import-meta": {
@@ -17811,12 +17854,12 @@
             }
         },
         "@babel/plugin-syntax-typescript": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz",
-            "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
+            "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.19.0"
             }
         },
         "@babel/plugin-transform-arrow-functions": {
@@ -17849,27 +17892,27 @@
             }
         },
         "@babel/plugin-transform-block-scoping": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz",
-            "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz",
+            "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-classes": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz",
-            "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz",
+            "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.19.0",
+                "@babel/helper-compilation-targets": "^7.20.0",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-replace-supers": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-replace-supers": "^7.19.1",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "globals": "^11.1.0"
             }
@@ -17884,12 +17927,12 @@
             }
         },
         "@babel/plugin-transform-destructuring": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz",
-            "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz",
+            "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-dotall-regex": {
@@ -18032,12 +18075,12 @@
             }
         },
         "@babel/plugin-transform-parameters": {
-            "version": "7.18.8",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz",
-            "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==",
+            "version": "7.20.3",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz",
+            "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-property-literals": {
@@ -18134,18 +18177,18 @@
             }
         },
         "@babel/preset-env": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz",
-            "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz",
+            "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.19.4",
-                "@babel/helper-compilation-targets": "^7.19.3",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/compat-data": "^7.20.1",
+                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-validator-option": "^7.18.6",
                 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
                 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
-                "@babel/plugin-proposal-async-generator-functions": "^7.19.1",
+                "@babel/plugin-proposal-async-generator-functions": "^7.20.1",
                 "@babel/plugin-proposal-class-properties": "^7.18.6",
                 "@babel/plugin-proposal-class-static-block": "^7.18.6",
                 "@babel/plugin-proposal-dynamic-import": "^7.18.6",
@@ -18154,7 +18197,7 @@
                 "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
                 "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
                 "@babel/plugin-proposal-numeric-separator": "^7.18.6",
-                "@babel/plugin-proposal-object-rest-spread": "^7.19.4",
+                "@babel/plugin-proposal-object-rest-spread": "^7.20.2",
                 "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
                 "@babel/plugin-proposal-optional-chaining": "^7.18.9",
                 "@babel/plugin-proposal-private-methods": "^7.18.6",
@@ -18165,7 +18208,7 @@
                 "@babel/plugin-syntax-class-static-block": "^7.14.5",
                 "@babel/plugin-syntax-dynamic-import": "^7.8.3",
                 "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-                "@babel/plugin-syntax-import-assertions": "^7.18.6",
+                "@babel/plugin-syntax-import-assertions": "^7.20.0",
                 "@babel/plugin-syntax-json-strings": "^7.8.3",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
                 "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
@@ -18178,10 +18221,10 @@
                 "@babel/plugin-transform-arrow-functions": "^7.18.6",
                 "@babel/plugin-transform-async-to-generator": "^7.18.6",
                 "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
-                "@babel/plugin-transform-block-scoping": "^7.19.4",
-                "@babel/plugin-transform-classes": "^7.19.0",
+                "@babel/plugin-transform-block-scoping": "^7.20.2",
+                "@babel/plugin-transform-classes": "^7.20.2",
                 "@babel/plugin-transform-computed-properties": "^7.18.9",
-                "@babel/plugin-transform-destructuring": "^7.19.4",
+                "@babel/plugin-transform-destructuring": "^7.20.2",
                 "@babel/plugin-transform-dotall-regex": "^7.18.6",
                 "@babel/plugin-transform-duplicate-keys": "^7.18.9",
                 "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
@@ -18189,14 +18232,14 @@
                 "@babel/plugin-transform-function-name": "^7.18.9",
                 "@babel/plugin-transform-literals": "^7.18.9",
                 "@babel/plugin-transform-member-expression-literals": "^7.18.6",
-                "@babel/plugin-transform-modules-amd": "^7.18.6",
-                "@babel/plugin-transform-modules-commonjs": "^7.18.6",
-                "@babel/plugin-transform-modules-systemjs": "^7.19.0",
+                "@babel/plugin-transform-modules-amd": "^7.19.6",
+                "@babel/plugin-transform-modules-commonjs": "^7.19.6",
+                "@babel/plugin-transform-modules-systemjs": "^7.19.6",
                 "@babel/plugin-transform-modules-umd": "^7.18.6",
                 "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1",
                 "@babel/plugin-transform-new-target": "^7.18.6",
                 "@babel/plugin-transform-object-super": "^7.18.6",
-                "@babel/plugin-transform-parameters": "^7.18.8",
+                "@babel/plugin-transform-parameters": "^7.20.1",
                 "@babel/plugin-transform-property-literals": "^7.18.6",
                 "@babel/plugin-transform-regenerator": "^7.18.6",
                 "@babel/plugin-transform-reserved-words": "^7.18.6",
@@ -18208,7 +18251,7 @@
                 "@babel/plugin-transform-unicode-escapes": "^7.18.10",
                 "@babel/plugin-transform-unicode-regex": "^7.18.6",
                 "@babel/preset-modules": "^0.1.5",
-                "@babel/types": "^7.19.4",
+                "@babel/types": "^7.20.2",
                 "babel-plugin-polyfill-corejs2": "^0.3.3",
                 "babel-plugin-polyfill-corejs3": "^0.6.0",
                 "babel-plugin-polyfill-regenerator": "^0.4.1",
@@ -18230,17 +18273,17 @@
             }
         },
         "@babel/runtime": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz",
-            "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz",
+            "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==",
             "requires": {
-                "regenerator-runtime": "^0.13.4"
+                "regenerator-runtime": "^0.13.10"
             }
         },
         "@babel/standalone": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.19.6.tgz",
-            "integrity": "sha512-SUOBMtHlxGpXf14X85c1vtHyxYgIODBUdclntETSEGkgI274MNPBUkOVWpvFmRhMuLokK3CL07qJoK2e5CIToA==",
+            "version": "7.20.4",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.4.tgz",
+            "integrity": "sha512-27bv4h47jbaFZ7+e7gT1VEo9PNL1ynxqUX6/BERLz1qxm/5gzpbcHX+47VnSeYHyEyGZkRznpSOd8zPBhiz6tw==",
             "dev": true
         },
         "@babel/template": {
@@ -18255,27 +18298,27 @@
             }
         },
         "@babel/traverse": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz",
-            "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==",
+            "version": "7.20.1",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
+            "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.19.6",
+                "@babel/generator": "^7.20.1",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.19.6",
-                "@babel/types": "^7.19.4",
+                "@babel/parser": "^7.20.1",
+                "@babel/types": "^7.20.0",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             }
         },
         "@babel/types": {
-            "version": "7.19.4",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz",
-            "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==",
+            "version": "7.20.2",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
+            "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
             "dev": true,
             "requires": {
                 "@babel/helper-string-parser": "^7.19.4",
@@ -18362,16 +18405,16 @@
             }
         },
         "@esbuild/android-arm": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz",
-            "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz",
+            "integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==",
             "dev": true,
             "optional": true
         },
         "@esbuild/linux-loong64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz",
-            "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz",
+            "integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==",
             "dev": true,
             "optional": true
         },
@@ -18393,9 +18436,9 @@
             },
             "dependencies": {
                 "globals": {
-                    "version": "13.17.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
-                    "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+                    "version": "13.18.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
+                    "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -18443,9 +18486,9 @@
             }
         },
         "@fortawesome/vue-fontawesome": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.1.tgz",
-            "integrity": "sha512-CdXZJoCS+aEPec26ZP7hWWU3SaJlQPZSCGdgpQ2qGl2HUmtUUNrI3zC4XWdn1JUmh3t5OuDeRG1qB4eGRNSD4A==",
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.2.tgz",
+            "integrity": "sha512-xHVtVY8ASUeEvgcA/7vULUesENhD+pi/EirRHdMBqooHlXBqK+yrV6d8tUye1m5UKQKVgYAHMhUBfOnoiwvc8Q==",
             "dev": true
         },
         "@grpc/grpc-js": {
@@ -19350,9 +19393,9 @@
             "dev": true
         },
         "@sinonjs/commons": {
-            "version": "1.8.3",
-            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
-            "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
+            "version": "1.8.5",
+            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz",
+            "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==",
             "dev": true,
             "requires": {
                 "type-detect": "4.0.8"
@@ -19391,9 +19434,9 @@
             }
         },
         "@types/babel__core": {
-            "version": "7.1.19",
-            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
-            "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==",
+            "version": "7.1.20",
+            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
+            "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.1.0",
@@ -19527,9 +19570,9 @@
             "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
         },
         "@types/http-errors": {
-            "version": "1.8.2",
-            "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz",
-            "integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w=="
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
+            "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ=="
         },
         "@types/istanbul-lib-coverage": {
             "version": "2.0.4",
@@ -19584,9 +19627,9 @@
             }
         },
         "@types/lodash": {
-            "version": "4.14.186",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz",
-            "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw=="
+            "version": "4.14.190",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz",
+            "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw=="
         },
         "@types/long": {
             "version": "4.0.2",
@@ -19605,9 +19648,9 @@
             "dev": true
         },
         "@types/node": {
-            "version": "18.11.6",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.6.tgz",
-            "integrity": "sha512-j3CEDa2vd96K0AXF8Wur7UucACvnjkk8hYyQAHhUNciabZLDl9nfAEVUSwmh245OOZV15bRA3Y590Gi5jUcDJg=="
+            "version": "18.11.9",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz",
+            "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg=="
         },
         "@types/normalize-package-data": {
             "version": "2.4.1",
@@ -19703,9 +19746,9 @@
             },
             "dependencies": {
                 "core-js": {
-                    "version": "3.26.0",
-                    "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz",
-                    "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==",
+                    "version": "3.26.1",
+                    "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz",
+                    "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==",
                     "dev": true
                 }
             }
@@ -19717,39 +19760,39 @@
             "dev": true
         },
         "@vue/compiler-core": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz",
-            "integrity": "sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
+            "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.41",
+                "@vue/shared": "3.2.45",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "@vue/compiler-dom": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz",
-            "integrity": "sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
+            "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
             "dev": true,
             "requires": {
-                "@vue/compiler-core": "3.2.41",
-                "@vue/shared": "3.2.41"
+                "@vue/compiler-core": "3.2.45",
+                "@vue/shared": "3.2.45"
             }
         },
         "@vue/compiler-sfc": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz",
-            "integrity": "sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
+            "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.41",
-                "@vue/compiler-dom": "3.2.41",
-                "@vue/compiler-ssr": "3.2.41",
-                "@vue/reactivity-transform": "3.2.41",
-                "@vue/shared": "3.2.41",
+                "@vue/compiler-core": "3.2.45",
+                "@vue/compiler-dom": "3.2.45",
+                "@vue/compiler-ssr": "3.2.45",
+                "@vue/reactivity-transform": "3.2.45",
+                "@vue/shared": "3.2.45",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7",
                 "postcss": "^8.1.10",
@@ -19768,13 +19811,13 @@
             }
         },
         "@vue/compiler-ssr": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz",
-            "integrity": "sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
+            "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
             "dev": true,
             "requires": {
-                "@vue/compiler-dom": "3.2.41",
-                "@vue/shared": "3.2.41"
+                "@vue/compiler-dom": "3.2.45",
+                "@vue/shared": "3.2.45"
             }
         },
         "@vue/devtools-api": {
@@ -19801,14 +19844,14 @@
             }
         },
         "@vue/reactivity-transform": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz",
-            "integrity": "sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
+            "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.41",
-                "@vue/shared": "3.2.41",
+                "@vue/compiler-core": "3.2.45",
+                "@vue/shared": "3.2.45",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             },
@@ -19912,9 +19955,9 @@
             }
         },
         "@vue/shared": {
-            "version": "3.2.41",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz",
-            "integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==",
+            "version": "3.2.45",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
+            "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
             "dev": true
         },
         "@vuepic/vue-datepicker": {
@@ -20105,9 +20148,9 @@
             }
         },
         "anymatch": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-            "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+            "version": "3.1.3",
+            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+            "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
             "dev": true,
             "requires": {
                 "normalize-path": "^3.0.0",
@@ -20227,21 +20270,28 @@
             }
         },
         "axios-ntlm": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.0.tgz",
-            "integrity": "sha512-NPNsIMO1SGX5scs3ZWJqsV7iRLvET+DlRl94aZ7Sx14zA8RTQh9EDxsJmxB9cKjardKfp2Vge444uYYLfvWC0Q==",
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.1.tgz",
+            "integrity": "sha512-YhjZj6UUzFzGirh7SiKbyvoXCWiZFMjjx2WJ8ouUUGNrqw/QgTc4H3M+7a6CTGENfLgXi2OiEhVeHmqoCffdYQ==",
             "requires": {
-                "axios": "^0.21.3",
+                "axios": "^1.2.0",
                 "dev-null": "^0.1.1"
             },
             "dependencies": {
                 "axios": {
-                    "version": "0.21.4",
-                    "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
-                    "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+                    "version": "1.2.0",
+                    "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz",
+                    "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==",
                     "requires": {
-                        "follow-redirects": "^1.14.0"
+                        "follow-redirects": "^1.15.0",
+                        "form-data": "^4.0.0",
+                        "proxy-from-env": "^1.1.0"
                     }
+                },
+                "proxy-from-env": {
+                    "version": "1.1.0",
+                    "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+                    "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
                 }
             }
         },
@@ -20741,9 +20791,9 @@
             }
         },
         "caniuse-lite": {
-            "version": "1.0.30001425",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz",
-            "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==",
+            "version": "1.0.30001434",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
+            "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==",
             "dev": true
         },
         "caseless": {
@@ -20870,9 +20920,9 @@
             "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
         },
         "ci-info": {
-            "version": "3.5.0",
-            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz",
-            "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==",
+            "version": "3.7.0",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz",
+            "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==",
             "dev": true
         },
         "cjs-module-lexer": {
@@ -21094,9 +21144,9 @@
             }
         },
         "concurrently": {
-            "version": "7.5.0",
-            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.5.0.tgz",
-            "integrity": "sha512-5E3mwiS+i2JYBzr5BpXkFxOnleZTMsG+WnE/dCG4/P+oiVXrbmrBwJ2ozn4SxwB2EZDrKR568X+puVohxz3/Mg==",
+            "version": "7.6.0",
+            "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz",
+            "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==",
             "dev": true,
             "requires": {
                 "chalk": "^4.1.0",
@@ -21182,9 +21232,9 @@
                     }
                 },
                 "yargs": {
-                    "version": "17.6.0",
-                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz",
-                    "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==",
+                    "version": "17.6.2",
+                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
+                    "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==",
                     "dev": true,
                     "requires": {
                         "cliui": "^8.0.1",
@@ -21193,7 +21243,7 @@
                         "require-directory": "^2.1.1",
                         "string-width": "^4.2.3",
                         "y18n": "^5.0.5",
-                        "yargs-parser": "^21.0.0"
+                        "yargs-parser": "^21.1.1"
                     }
                 },
                 "yargs-parser": {
@@ -21252,9 +21302,9 @@
             "dev": true
         },
         "core-js-compat": {
-            "version": "3.26.0",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz",
-            "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==",
+            "version": "3.26.1",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz",
+            "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==",
             "dev": true,
             "requires": {
                 "browserslist": "^4.21.4"
@@ -21276,9 +21326,9 @@
             }
         },
         "cosmiconfig": {
-            "version": "7.0.1",
-            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
-            "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+            "version": "7.1.0",
+            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+            "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
             "dev": true,
             "requires": {
                 "@types/parse-json": "^4.0.0",
@@ -21289,9 +21339,9 @@
             }
         },
         "cron-validate": {
-            "version": "1.4.4",
-            "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.4.tgz",
-            "integrity": "sha512-QvVpGR32350w3BWVB4zT84UhA5kq/oWDmSfbbTFLJanq63KS8rsunV+0PKAQIeIJ+gHhysVF4sJ8gsq8+3gfAw==",
+            "version": "1.4.5",
+            "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.5.tgz",
+            "integrity": "sha512-nKlOJEnYKudMn/aNyNH8xxWczlfpaazfWV32Pcx/2St51r2bxWbGhZD7uwzMcRhunA/ZNL+Htm/i0792Z59UMQ==",
             "requires": {
                 "yup": "0.32.9"
             }
@@ -21457,9 +21507,9 @@
             },
             "dependencies": {
                 "@types/node": {
-                    "version": "14.18.32",
-                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz",
-                    "integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==",
+                    "version": "14.18.33",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
+                    "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==",
                     "dev": true
                 },
                 "ansi-styles": {
@@ -21586,9 +21636,9 @@
             "dev": true
         },
         "decamelize-keys": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
-            "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+            "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
             "dev": true,
             "requires": {
                 "decamelize": "^1.1.0",
@@ -21851,9 +21901,9 @@
             }
         },
         "engine.io": {
-            "version": "6.2.0",
-            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz",
-            "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==",
+            "version": "6.2.1",
+            "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
+            "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
             "requires": {
                 "@types/cookie": "^0.4.1",
                 "@types/cors": "^2.8.12",
@@ -21959,16 +22009,16 @@
             }
         },
         "es-aggregate-error": {
-            "version": "1.0.8",
-            "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.8.tgz",
-            "integrity": "sha512-AKUb5MKLWMozPlFRHOKqWD7yta5uaEhH21qwtnf6FlKjNjTJOoqFi0/G14+FfSkIQhhu6X68Af4xgRC6y8qG4A==",
+            "version": "1.0.9",
+            "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.9.tgz",
+            "integrity": "sha512-fvnX40sb538wdU6r4s35cq4EY6Lr09Upj40BEVem4LEsuW8XgQep9yD5Q1U2KftokNp1rWODFJ2qwZSsAjFpbg==",
             "requires": {
                 "define-properties": "^1.1.4",
-                "es-abstract": "^1.19.5",
+                "es-abstract": "^1.20.4",
                 "function-bind": "^1.1.1",
                 "functions-have-names": "^1.2.3",
-                "get-intrinsic": "^1.1.1",
-                "globalthis": "^1.0.2",
+                "get-intrinsic": "^1.1.3",
+                "globalthis": "^1.0.3",
                 "has-property-descriptors": "^1.0.0"
             }
         },
@@ -21983,172 +22033,172 @@
             }
         },
         "esbuild": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz",
-            "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
+            "integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==",
             "dev": true,
             "requires": {
-                "@esbuild/android-arm": "0.15.12",
-                "@esbuild/linux-loong64": "0.15.12",
-                "esbuild-android-64": "0.15.12",
-                "esbuild-android-arm64": "0.15.12",
-                "esbuild-darwin-64": "0.15.12",
-                "esbuild-darwin-arm64": "0.15.12",
-                "esbuild-freebsd-64": "0.15.12",
-                "esbuild-freebsd-arm64": "0.15.12",
-                "esbuild-linux-32": "0.15.12",
-                "esbuild-linux-64": "0.15.12",
-                "esbuild-linux-arm": "0.15.12",
-                "esbuild-linux-arm64": "0.15.12",
-                "esbuild-linux-mips64le": "0.15.12",
-                "esbuild-linux-ppc64le": "0.15.12",
-                "esbuild-linux-riscv64": "0.15.12",
-                "esbuild-linux-s390x": "0.15.12",
-                "esbuild-netbsd-64": "0.15.12",
-                "esbuild-openbsd-64": "0.15.12",
-                "esbuild-sunos-64": "0.15.12",
-                "esbuild-windows-32": "0.15.12",
-                "esbuild-windows-64": "0.15.12",
-                "esbuild-windows-arm64": "0.15.12"
+                "@esbuild/android-arm": "0.15.15",
+                "@esbuild/linux-loong64": "0.15.15",
+                "esbuild-android-64": "0.15.15",
+                "esbuild-android-arm64": "0.15.15",
+                "esbuild-darwin-64": "0.15.15",
+                "esbuild-darwin-arm64": "0.15.15",
+                "esbuild-freebsd-64": "0.15.15",
+                "esbuild-freebsd-arm64": "0.15.15",
+                "esbuild-linux-32": "0.15.15",
+                "esbuild-linux-64": "0.15.15",
+                "esbuild-linux-arm": "0.15.15",
+                "esbuild-linux-arm64": "0.15.15",
+                "esbuild-linux-mips64le": "0.15.15",
+                "esbuild-linux-ppc64le": "0.15.15",
+                "esbuild-linux-riscv64": "0.15.15",
+                "esbuild-linux-s390x": "0.15.15",
+                "esbuild-netbsd-64": "0.15.15",
+                "esbuild-openbsd-64": "0.15.15",
+                "esbuild-sunos-64": "0.15.15",
+                "esbuild-windows-32": "0.15.15",
+                "esbuild-windows-64": "0.15.15",
+                "esbuild-windows-arm64": "0.15.15"
             }
         },
         "esbuild-android-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz",
-            "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz",
+            "integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==",
             "dev": true,
             "optional": true
         },
         "esbuild-android-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz",
-            "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz",
+            "integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-darwin-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz",
-            "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz",
+            "integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-darwin-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz",
-            "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz",
+            "integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==",
             "dev": true,
             "optional": true
         },
         "esbuild-freebsd-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz",
-            "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz",
+            "integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==",
             "dev": true,
             "optional": true
         },
         "esbuild-freebsd-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz",
-            "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz",
+            "integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-32": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz",
-            "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz",
+            "integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz",
-            "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz",
+            "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-arm": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz",
-            "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz",
+            "integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz",
-            "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz",
+            "integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-mips64le": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz",
-            "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz",
+            "integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-ppc64le": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz",
-            "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz",
+            "integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-riscv64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz",
-            "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz",
+            "integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-s390x": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz",
-            "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz",
+            "integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-netbsd-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz",
-            "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz",
+            "integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==",
             "dev": true,
             "optional": true
         },
         "esbuild-openbsd-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz",
-            "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz",
+            "integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-sunos-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz",
-            "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz",
+            "integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-32": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz",
-            "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz",
+            "integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz",
-            "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz",
+            "integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-arm64": {
-            "version": "0.15.12",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz",
-            "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==",
+            "version": "0.15.15",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz",
+            "integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==",
             "dev": true,
             "optional": true
         },
@@ -22334,9 +22384,9 @@
                     "dev": true
                 },
                 "globals": {
-                    "version": "13.17.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
-                    "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+                    "version": "13.18.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
+                    "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -22421,9 +22471,9 @@
             "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="
         },
         "espree": {
-            "version": "9.4.0",
-            "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
-            "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
+            "version": "9.4.1",
+            "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+            "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
             "dev": true,
             "requires": {
                 "acorn": "^8.8.0",
@@ -23103,9 +23153,9 @@
             }
         },
         "global-dirs": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
-            "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+            "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
             "dev": true,
             "requires": {
                 "ini": "2.0.0"
@@ -23323,9 +23373,9 @@
             }
         },
         "http-graceful-shutdown": {
-            "version": "3.1.9",
-            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.9.tgz",
-            "integrity": "sha512-+ciDBK4LyVfCwGBX/bCF4jbkori9X7x9Wt+1Rdj/IJupLozxk7jf5iXAPcPbJXkSE8WZtsQKKjT/UGsvGRWuVA==",
+            "version": "3.1.11",
+            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.11.tgz",
+            "integrity": "sha512-tfOwKDZA8kJqDNBK2ur+o55HbhDHoflvDCDgjbmm5eAn0RhqhdlUjVygj8e258B5nn5kNsEFOl7DbXLskKrgGA==",
             "requires": {
                 "debug": "^4.3.4"
             }
@@ -24553,9 +24603,9 @@
             }
         },
         "jest-pnp-resolver": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-            "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+            "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
             "dev": true
         },
         "jest-regex-util": {
@@ -26061,9 +26111,9 @@
             },
             "dependencies": {
                 "commander": {
-                    "version": "9.4.0",
-                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
-                    "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw=="
+                    "version": "9.4.1",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
+                    "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw=="
                 }
             }
         },
@@ -26619,9 +26669,9 @@
             }
         },
         "parse5": {
-            "version": "7.1.1",
-            "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz",
-            "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==",
+            "version": "7.1.2",
+            "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+            "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
             "requires": {
                 "entities": "^4.4.0"
             }
@@ -26796,9 +26846,9 @@
             "dev": true
         },
         "postcss": {
-            "version": "8.4.18",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
-            "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
+            "version": "8.4.19",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz",
+            "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==",
             "dev": true,
             "requires": {
                 "nanoid": "^3.3.4",
@@ -26860,9 +26910,9 @@
             "dev": true
         },
         "postcss-selector-parser": {
-            "version": "6.0.10",
-            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
-            "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+            "version": "6.0.11",
+            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
+            "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
             "dev": true,
             "requires": {
                 "cssesc": "^3.0.0",
@@ -27006,9 +27056,9 @@
             },
             "dependencies": {
                 "long": {
-                    "version": "5.2.0",
-                    "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz",
-                    "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w=="
+                    "version": "5.2.1",
+                    "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
+                    "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
                 }
             }
         },
@@ -27022,9 +27072,9 @@
             }
         },
         "proxy-from-env": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+            "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
             "dev": true
         },
         "pseudomap": {
@@ -27323,9 +27373,9 @@
             },
             "dependencies": {
                 "@types/node": {
-                    "version": "14.18.32",
-                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz",
-                    "integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow=="
+                    "version": "14.18.33",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
+                    "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg=="
                 }
             }
         },
@@ -27355,14 +27405,14 @@
             }
         },
         "regenerator-runtime": {
-            "version": "0.13.10",
-            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz",
-            "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw=="
+            "version": "0.13.11",
+            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+            "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
         },
         "regenerator-transform": {
-            "version": "0.15.0",
-            "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
-            "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
+            "version": "0.15.1",
+            "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+            "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
             "dev": true,
             "requires": {
                 "@babel/runtime": "^7.8.4"
@@ -27385,9 +27435,9 @@
             "dev": true
         },
         "regexpu-core": {
-            "version": "5.2.1",
-            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz",
-            "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==",
+            "version": "5.2.2",
+            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz",
+            "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==",
             "dev": true,
             "requires": {
                 "regenerate": "^1.4.2",
@@ -27395,7 +27445,7 @@
                 "regjsgen": "^0.7.1",
                 "regjsparser": "^0.9.1",
                 "unicode-match-property-ecmascript": "^2.0.0",
-                "unicode-match-property-value-ecmascript": "^2.0.0"
+                "unicode-match-property-value-ecmascript": "^2.1.0"
             }
         },
         "regjsgen": {
@@ -27640,9 +27690,9 @@
                     "dev": true
                 },
                 "yargs": {
-                    "version": "17.6.0",
-                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz",
-                    "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==",
+                    "version": "17.6.2",
+                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
+                    "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==",
                     "dev": true,
                     "requires": {
                         "cliui": "^8.0.1",
@@ -27651,7 +27701,7 @@
                         "require-directory": "^2.1.1",
                         "string-width": "^4.2.3",
                         "y18n": "^5.0.5",
-                        "yargs-parser": "^21.0.0"
+                        "yargs-parser": "^21.1.1"
                     }
                 },
                 "yargs-parser": {
@@ -27933,16 +27983,16 @@
             "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
         },
         "socket.io": {
-            "version": "4.5.3",
-            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz",
-            "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==",
+            "version": "4.5.4",
+            "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
+            "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
             "requires": {
                 "accepts": "~1.3.4",
                 "base64id": "~2.0.0",
                 "debug": "~4.3.2",
-                "engine.io": "~6.2.0",
+                "engine.io": "~6.2.1",
                 "socket.io-adapter": "~2.4.0",
-                "socket.io-parser": "~4.2.0"
+                "socket.io-parser": "~4.2.1"
             }
         },
         "socket.io-adapter": {
@@ -27951,14 +28001,14 @@
             "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
         },
         "socket.io-client": {
-            "version": "4.5.3",
-            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz",
-            "integrity": "sha512-I/hqDYpQ6JKwtJOf5ikM+Qz+YujZPMEl6qBLhxiP0nX+TfXKhW4KZZG8lamrD6Y5ngjmYHreESVasVCgi5Kl3A==",
+            "version": "4.5.4",
+            "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz",
+            "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==",
             "requires": {
                 "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.2",
                 "engine.io-client": "~6.2.3",
-                "socket.io-parser": "~4.2.0"
+                "socket.io-parser": "~4.2.1"
             }
         },
         "socket.io-parser": {
@@ -28103,9 +28153,9 @@
             }
         },
         "stack-utils": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
-            "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+            "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
             "dev": true,
             "requires": {
                 "escape-string-regexp": "^2.0.0"
@@ -28170,23 +28220,23 @@
             }
         },
         "string.prototype.trimend": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
-            "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+            "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
             "requires": {
                 "call-bind": "^1.0.2",
                 "define-properties": "^1.1.4",
-                "es-abstract": "^1.19.5"
+                "es-abstract": "^1.20.4"
             }
         },
         "string.prototype.trimstart": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
-            "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+            "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
             "requires": {
                 "call-bind": "^1.0.2",
                 "define-properties": "^1.1.4",
-                "es-abstract": "^1.19.5"
+                "es-abstract": "^1.20.4"
             }
         },
         "strip-ansi": {
@@ -28378,9 +28428,9 @@
             "dev": true
         },
         "table": {
-            "version": "6.8.0",
-            "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
-            "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
+            "version": "6.8.1",
+            "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
+            "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
             "dev": true,
             "requires": {
                 "ajv": "^8.0.1",
@@ -28391,9 +28441,9 @@
             },
             "dependencies": {
                 "ajv": {
-                    "version": "8.11.0",
-                    "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
-                    "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
+                    "version": "8.11.2",
+                    "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz",
+                    "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==",
                     "dev": true,
                     "requires": {
                         "fast-deep-equal": "^3.1.1",
@@ -28446,9 +28496,9 @@
             }
         },
         "tar": {
-            "version": "6.1.11",
-            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-            "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
+            "version": "6.1.12",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz",
+            "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==",
             "requires": {
                 "chownr": "^2.0.0",
                 "fs-minipass": "^2.0.0",
@@ -28678,9 +28728,9 @@
             "dev": true
         },
         "tslib": {
-            "version": "2.4.0",
-            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
-            "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+            "version": "2.4.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
+            "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
         },
         "tunnel": {
             "version": "0.0.6",
@@ -28781,9 +28831,9 @@
             }
         },
         "unicode-match-property-value-ecmascript": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
-            "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+            "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
             "dev": true
         },
         "unicode-property-aliases-ecmascript": {
@@ -29307,9 +29357,9 @@
                     }
                 },
                 "joi": {
-                    "version": "17.6.4",
-                    "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.4.tgz",
-                    "integrity": "sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw==",
+                    "version": "17.7.0",
+                    "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz",
+                    "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==",
                     "dev": true,
                     "requires": {
                         "@hapi/hoek": "^9.0.0",
diff --git a/package.json b/package.json
index 76c87d61..d525d6bf 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,6 @@
         "start": "npm run start-server",
         "start-server": "node server/server.js",
         "start-server-dev": "cross-env NODE_ENV=development node server/server.js",
-        "start-server-watch-dev": "cross-env NODE_ENV=development node  --watch server/server.js",
         "build": "vite build --config ./config/vite.config.js",
         "test": "node test/prepare-test-server.js && npm run jest-backend",
         "test-with-build": "npm run build && npm test",
@@ -64,7 +63,7 @@
         "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\""
     },
     "dependencies": {
-        "@grpc/grpc-js": "^1.7.0",
+        "@grpc/grpc-js": "~1.7.3",
         "@louislam/sqlite3": "15.1.2",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",
@@ -95,7 +94,7 @@
         "limiter": "~2.1.0",
         "mqtt": "~4.3.7",
         "mssql": "~8.1.4",
-        "mysql2": "^2.3.3",
+        "mysql2": "~2.3.3",
         "node-cloudflared-tunnel": "~1.0.9",
         "node-radius-client": "~1.0.0",
         "nodemailer": "~6.6.5",

From 370d522920e797637e058df936a3a22b5e6ecf36 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 25 Nov 2022 14:00:33 +0800
Subject: [PATCH 288/803] Pin dependency of axios-ntlm to 1.3.0. As 1.3.1
 causes error

---
 package-lock.json | 48 +++++++++++++++++------------------------------
 package.json      |  2 +-
 2 files changed, 18 insertions(+), 32 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 42dab68b..65e4ffbd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,7 +13,7 @@
                 "@louislam/sqlite3": "15.1.2",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
-                "axios-ntlm": "~1.3.0",
+                "axios-ntlm": "1.3.0",
                 "badge-maker": "~3.3.1",
                 "bcryptjs": "~2.4.3",
                 "bree": "~7.1.5",
@@ -4398,29 +4398,22 @@
             }
         },
         "node_modules/axios-ntlm": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.1.tgz",
-            "integrity": "sha512-YhjZj6UUzFzGirh7SiKbyvoXCWiZFMjjx2WJ8ouUUGNrqw/QgTc4H3M+7a6CTGENfLgXi2OiEhVeHmqoCffdYQ==",
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.0.tgz",
+            "integrity": "sha512-NPNsIMO1SGX5scs3ZWJqsV7iRLvET+DlRl94aZ7Sx14zA8RTQh9EDxsJmxB9cKjardKfp2Vge444uYYLfvWC0Q==",
             "dependencies": {
-                "axios": "^1.2.0",
+                "axios": "^0.21.3",
                 "dev-null": "^0.1.1"
             }
         },
         "node_modules/axios-ntlm/node_modules/axios": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz",
-            "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==",
+            "version": "0.21.4",
+            "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+            "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
             "dependencies": {
-                "follow-redirects": "^1.15.0",
-                "form-data": "^4.0.0",
-                "proxy-from-env": "^1.1.0"
+                "follow-redirects": "^1.14.0"
             }
         },
-        "node_modules/axios-ntlm/node_modules/proxy-from-env": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
-        },
         "node_modules/babel-jest": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
@@ -20270,28 +20263,21 @@
             }
         },
         "axios-ntlm": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.1.tgz",
-            "integrity": "sha512-YhjZj6UUzFzGirh7SiKbyvoXCWiZFMjjx2WJ8ouUUGNrqw/QgTc4H3M+7a6CTGENfLgXi2OiEhVeHmqoCffdYQ==",
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/axios-ntlm/-/axios-ntlm-1.3.0.tgz",
+            "integrity": "sha512-NPNsIMO1SGX5scs3ZWJqsV7iRLvET+DlRl94aZ7Sx14zA8RTQh9EDxsJmxB9cKjardKfp2Vge444uYYLfvWC0Q==",
             "requires": {
-                "axios": "^1.2.0",
+                "axios": "^0.21.3",
                 "dev-null": "^0.1.1"
             },
             "dependencies": {
                 "axios": {
-                    "version": "1.2.0",
-                    "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz",
-                    "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==",
+                    "version": "0.21.4",
+                    "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+                    "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
                     "requires": {
-                        "follow-redirects": "^1.15.0",
-                        "form-data": "^4.0.0",
-                        "proxy-from-env": "^1.1.0"
+                        "follow-redirects": "^1.14.0"
                     }
-                },
-                "proxy-from-env": {
-                    "version": "1.1.0",
-                    "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-                    "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
                 }
             }
         },
diff --git a/package.json b/package.json
index d525d6bf..a4b92f65 100644
--- a/package.json
+++ b/package.json
@@ -67,7 +67,7 @@
         "@louislam/sqlite3": "15.1.2",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",
-        "axios-ntlm": "~1.3.0",
+        "axios-ntlm": "1.3.0",
         "badge-maker": "~3.3.1",
         "bcryptjs": "~2.4.3",
         "bree": "~7.1.5",

From cf3e03ab40a6a389092fd647dd6c68a068114551 Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Fri, 25 Nov 2022 21:56:00 +0200
Subject: [PATCH 289/803] Update bg-BG.js

- Added new  fields
- Translated new fields
- Fixed some typos
---
 src/languages/bg-BG.js | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 994d0d7f..ee726295 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -623,12 +623,25 @@ export default {
     lastDay4: "4-ти последен ден на месеца",
     "No Maintenance": "Няма поддръжка",
     pauseMaintenanceMsg: "Сигурни ли сте, че желаете да направите пауза?",
-    "maintenanceStatus-under-maintenance": "В режим подръжка",
-    "maintenanceStatus-inactive": "Неактивен",
-    "maintenanceStatus-scheduled": "Планиран",
-    "maintenanceStatus-ended": "Прилючена",
-    "maintenanceStatus-unknown": "Неизвестен",
+    "maintenanceStatus-under-maintenance": "В режим поддръжка",
+    "maintenanceStatus-inactive": "Неактивна",
+    "maintenanceStatus-scheduled": "Планирана",
+    "maintenanceStatus-ended": "Приключена",
+    "maintenanceStatus-unknown": "Неизвестна",
     "Display Timezone": "Покажи часова зона",
     "Server Timezone": "Часова зона на сървъра",
     statusPageMaintenanceEndDate: "Край",
+    enableGRPCTls: "Разреши изпращане на gRPC заявка с TLS връзка",
+    grpcMethodDescription: "Името на метода се форматира в \"cammelCase\", например sayHello, check, и т.н.",
+    smseagle: "SMSEagle",
+    smseagleTo: "Тел. номер(а)",
+    smseagleGroup: "Име(на) на група от тел. указател",
+    smseagleContact: "Име(на) от тел. указател",
+    smseagleRecipientType: "Получател тип",
+    smseagleRecipient: "Получател(и) (при повече от един разделете със запетая)",
+    smseagleToken: "API токен за достъп",
+    smseagleUrl: "Вашият SMSEagle URL на устройството",
+    smseagleEncoding: "Изпрати като Unicode",
+    smseaglePriority: "Приоритет на съобщението (0-9, по подразбиране = 0)",
+    IconUrl: "URL на иконата",
 };

From 14a062804e275ec721dee54459d891c6bac117b1 Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Fri, 25 Nov 2022 22:00:52 +0200
Subject: [PATCH 290/803] Update bg-BG.js

- Translation fixes
---
 src/languages/bg-BG.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index ee726295..84b07813 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -635,7 +635,7 @@ export default {
     grpcMethodDescription: "Името на метода се форматира в \"cammelCase\", например sayHello, check, и т.н.",
     smseagle: "SMSEagle",
     smseagleTo: "Тел. номер(а)",
-    smseagleGroup: "Име(на) на група от тел. указател",
+    smseagleGroup: "Име на група/и от тел. указател",
     smseagleContact: "Име(на) от тел. указател",
     smseagleRecipientType: "Получател тип",
     smseagleRecipient: "Получател(и) (при повече от един разделете със запетая)",
@@ -643,5 +643,5 @@ export default {
     smseagleUrl: "Вашият SMSEagle URL на устройството",
     smseagleEncoding: "Изпрати като Unicode",
     smseaglePriority: "Приоритет на съобщението (0-9, по подразбиране = 0)",
-    IconUrl: "URL на иконата",
+    IconUrl: "Икона URL адрес",
 };

From da16796ec45a3ecb12f16a1855bca0813beb2571 Mon Sep 17 00:00:00 2001
From: Nikita Lutsenko <git@nlutsenko.me>
Date: Sat, 19 Nov 2022 16:10:30 -0800
Subject: [PATCH 291/803] Add ability to send Telegram notifications silently.

---
 server/notification-providers/telegram.js | 1 +
 src/components/notifications/Telegram.vue | 9 +++++++++
 src/languages/en.js                       | 2 ++
 3 files changed, 12 insertions(+)

diff --git a/server/notification-providers/telegram.js b/server/notification-providers/telegram.js
index 2b057622..88923e66 100644
--- a/server/notification-providers/telegram.js
+++ b/server/notification-providers/telegram.js
@@ -13,6 +13,7 @@ class Telegram extends NotificationProvider {
                 params: {
                     chat_id: notification.telegramChatID,
                     text: msg,
+                    disable_notification: notification.telegramSendSilently,
                 },
             });
             return okMsg;
diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 9daf31ac..4eb014ff 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -28,6 +28,15 @@
                 <a :href="telegramGetUpdatesURL('withToken')" target="_blank" style="word-break: break-word;">{{ telegramGetUpdatesURL("masked") }}</a>
             </p>
         </div>
+
+        <div class="form-check form-switch">
+            <input v-model="$parentnotification.telegramSendSilently" class="form-check-input" type="checkbox">
+            <label class="form-check-label">{{ $t("Send Silently") }}</label>
+        </div>
+
+        <div class="form-text">
+            {{ $t("telegramSendSilentlyDescription") }}
+        </div>
     </div>
 </template>
 
diff --git a/src/languages/en.js b/src/languages/en.js
index 86abb791..492689e5 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -214,6 +214,8 @@ export default {
     "Chat ID": "Chat ID",
     supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
     wayToGetTelegramChatID: "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
+    "Send Silently": "Send Silently",
+    telegramSendSilentlyDescription: "Sends the message silently. Users will receive a notification with no sound.",
     "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
     chatIDNotFound: "Chat ID is not found; please send a message to this bot first",
     webhook: "Webhook",

From 8cdbe37f6febe8b0bdf7c97bed44c01b96b3bb9d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 4 Dec 2022 21:41:08 +0800
Subject: [PATCH 292/803] Update core-js

---
 package-lock.json | 34 +++++++---------------------------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 28 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 65e4ffbd..1683ecad 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -79,7 +79,7 @@
                 "chart.js": "~3.6.2",
                 "chartjs-adapter-dayjs": "~1.0.0",
                 "concurrently": "^7.1.0",
-                "core-js": "~3.18.3",
+                "core-js": "~3.26.1",
                 "cross-env": "~7.0.3",
                 "cypress": "^10.1.0",
                 "delay": "^5.0.0",
@@ -3777,17 +3777,6 @@
                 "vite": "^3.0.0"
             }
         },
-        "node_modules/@vitejs/plugin-legacy/node_modules/core-js": {
-            "version": "3.26.1",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz",
-            "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==",
-            "dev": true,
-            "hasInstallScript": true,
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/core-js"
-            }
-        },
         "node_modules/@vitejs/plugin-vue": {
             "version": "3.1.2",
             "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.1.2.tgz",
@@ -5740,10 +5729,9 @@
             "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
         },
         "node_modules/core-js": {
-            "version": "3.18.3",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz",
-            "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==",
-            "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+            "version": "3.26.1",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz",
+            "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==",
             "dev": true,
             "hasInstallScript": true,
             "funding": {
@@ -19736,14 +19724,6 @@
                 "magic-string": "^0.26.2",
                 "regenerator-runtime": "^0.13.9",
                 "systemjs": "^6.12.4"
-            },
-            "dependencies": {
-                "core-js": {
-                    "version": "3.26.1",
-                    "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz",
-                    "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==",
-                    "dev": true
-                }
             }
         },
         "@vitejs/plugin-vue": {
@@ -21282,9 +21262,9 @@
             "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
         },
         "core-js": {
-            "version": "3.18.3",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz",
-            "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==",
+            "version": "3.26.1",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz",
+            "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==",
             "dev": true
         },
         "core-js-compat": {
diff --git a/package.json b/package.json
index a4b92f65..a47cb1f6 100644
--- a/package.json
+++ b/package.json
@@ -133,7 +133,7 @@
         "chart.js": "~3.6.2",
         "chartjs-adapter-dayjs": "~1.0.0",
         "concurrently": "^7.1.0",
-        "core-js": "~3.18.3",
+        "core-js": "~3.26.1",
         "cross-env": "~7.0.3",
         "cypress": "^10.1.0",
         "delay": "^5.0.0",

From 0ab82e6de331a5432b5933eb71dc38e3d255cf9e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 4 Dec 2022 22:44:50 +0800
Subject: [PATCH 293/803] Generate random nightly version

---
 extra/mark-as-nightly.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/extra/mark-as-nightly.js b/extra/mark-as-nightly.js
index a55fd98f..ebc67da3 100644
--- a/extra/mark-as-nightly.js
+++ b/extra/mark-as-nightly.js
@@ -5,7 +5,7 @@ const util = require("../src/util");
 util.polyfill();
 
 const oldVersion = pkg.version;
-const newVersion = oldVersion + "-nightly";
+const newVersion = oldVersion + "-nightly-" + util.genSecret(8);
 
 console.log("Old Version: " + oldVersion);
 console.log("New Version: " + newVersion);

From 3e68cf2a1cfab8cb8cc7969c915fba5535c7d827 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 4 Dec 2022 22:55:05 +0800
Subject: [PATCH 294/803] Specify `Accept-Encoding` for axios request (Fix
 #2253)

---
 server/model/monitor.js | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 6b59a6b2..b6123382 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -267,17 +267,22 @@ class Monitor extends BeanModel {
 
                     log.debug("monitor", `[${this.name}] Prepare Options for axios`);
 
+                    // Axios Options
                     const options = {
                         url: this.url,
                         method: (this.method || "get").toLowerCase(),
                         ...(this.body ? { data: JSON.parse(this.body) } : {}),
                         timeout: this.interval * 1000 * 0.8,
                         headers: {
+                            // Fix #2253
+                            // Read more: https://stackoverflow.com/questions/1759956/curl-error-18-transfer-closed-with-outstanding-read-data-remaining
+                            "Accept-Encoding": "gzip, deflate",
                             "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
                             "User-Agent": "Uptime-Kuma/" + version,
                             ...(this.headers ? JSON.parse(this.headers) : {}),
                             ...(basicAuthHeader),
                         },
+                        decompress: true,
                         maxRedirects: this.maxredirects,
                         validateStatus: (status) => {
                             return checkStatusCode(status, this.getAcceptedStatuscodes());

From e886df47882acef66640faa8d83b9be5006b8458 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 5 Dec 2022 17:55:45 +0800
Subject: [PATCH 295/803] Fix typo

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

diff --git a/server/notification-providers/webhook.js b/server/notification-providers/webhook.js
index 347b6ec9..649746b8 100644
--- a/server/notification-providers/webhook.js
+++ b/server/notification-providers/webhook.js
@@ -35,7 +35,7 @@ class Webhook extends NotificationProvider {
                         ...JSON.parse(notification.webhookAdditionalHeaders)
                     };
                 } catch (err) {
-                    throw "Addional Headers is not a valid JSON";
+                    throw "Additional Headers is not a valid JSON";
                 }
             }
 

From ee1a56caae1d3eff5a70886ccb6b1a53c407d3dd Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 5 Dec 2022 18:18:19 +0800
Subject: [PATCH 296/803] Update /test-webhook and reevaluate sensitive fields

---
 server/model/monitor.js | 18 +++++++++---------
 server/server.js        |  1 +
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index b6123382..00eb87db 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -89,32 +89,23 @@ class Monitor extends BeanModel {
             dns_resolve_type: this.dns_resolve_type,
             dns_resolve_server: this.dns_resolve_server,
             dns_last_result: this.dns_last_result,
-            pushToken: this.pushToken,
             docker_container: this.docker_container,
             docker_host: this.docker_host,
             proxyId: this.proxy_id,
             notificationIDList,
             tags: tags,
             maintenance: await Monitor.isUnderMaintenance(this.id),
-            mqttUsername: this.mqttUsername,
-            mqttPassword: this.mqttPassword,
             mqttTopic: this.mqttTopic,
             mqttSuccessMessage: this.mqttSuccessMessage,
-            databaseConnectionString: this.databaseConnectionString,
             databaseQuery: this.databaseQuery,
             authMethod: this.authMethod,
-            authWorkstation: this.authWorkstation,
-            authDomain: this.authDomain,
             grpcUrl: this.grpcUrl,
             grpcProtobuf: this.grpcProtobuf,
             grpcMethod: this.grpcMethod,
             grpcServiceName: this.grpcServiceName,
             grpcEnableTls: this.getGrpcEnableTls(),
-            radiusUsername: this.radiusUsername,
-            radiusPassword: this.radiusPassword,
             radiusCalledStationId: this.radiusCalledStationId,
             radiusCallingStationId: this.radiusCallingStationId,
-            radiusSecret: this.radiusSecret,
         };
 
         if (includeSensitiveData) {
@@ -127,9 +118,18 @@ class Monitor extends BeanModel {
                 basic_auth_user: this.basic_auth_user,
                 basic_auth_pass: this.basic_auth_pass,
                 pushToken: this.pushToken,
+                databaseConnectionString: this.databaseConnectionString,
+                radiusUsername: this.radiusUsername,
+                radiusPassword: this.radiusPassword,
+                radiusSecret: this.radiusSecret,
+                mqttUsername: this.mqttUsername,
+                mqttPassword: this.mqttPassword,
+                authWorkstation: this.authWorkstation,
+                authDomain: this.authDomain,
             };
         }
 
+        data.includeSensitiveData = includeSensitiveData;
         return data;
     }
 
diff --git a/server/server.js b/server/server.js
index 4d9cdb18..033b85b2 100644
--- a/server/server.js
+++ b/server/server.js
@@ -203,6 +203,7 @@ let needSetup = false;
 
     if (isDev) {
         app.post("/test-webhook", async (request, response) => {
+            log.debug("test", request.headers);
             log.debug("test", request.body);
             response.send("OK");
         });

From 8aa97635ece781654ca7fbf5b9cc08e9f8f2905f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 5 Dec 2022 18:21:16 +0800
Subject: [PATCH 297/803] Improve the clear filter button

---
 src/components/MonitorList.vue | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index 1c0e3b35..7b821e13 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -206,6 +206,16 @@ export default {
 .search-icon {
     padding: 10px;
     color: #c0c0c0;
+
+    // Clear filter button (X)
+    svg[data-icon="times"] {
+        cursor: pointer;
+        transition: all ease-in-out 0.1s;
+
+        &:hover {
+            color: white;
+        }
+    }
 }
 
 .search-input {

From eadf2c810a70816c06ead1d0d4dba7776d4d61b6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 5 Dec 2022 19:17:24 +0800
Subject: [PATCH 298/803] Fix check version

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

diff --git a/server/check-version.js b/server/check-version.js
index 00b47a26..e0ea908b 100644
--- a/server/check-version.js
+++ b/server/check-version.js
@@ -25,7 +25,7 @@ exports.startInterval = () => {
             let checkBeta = await setting("checkBeta");
 
             if (checkBeta && res.data.beta) {
-                if (compareVersions.compare(res.data.beta, res.data.beta, ">")) {
+                if (compareVersions.compare(res.data.beta, res.data.slow, ">")) {
                     exports.latestVersion = res.data.beta;
                     return;
                 }

From b1170211b71808f48a96576f8df796c32f78e1e6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 5 Dec 2022 19:24:04 +0800
Subject: [PATCH 299/803] Update to 1.19.0-beta.1

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

diff --git a/package.json b/package.json
index a47cb1f6..f43c21d4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.0-beta.0",
+    "version": "1.19.0-beta.1",
     "license": "MIT",
     "repository": {
         "type": "git",

From 2c3abdc146cd76f1b6ef65f9b2fd0717ad661017 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 5 Dec 2022 20:11:28 +0800
Subject: [PATCH 300/803] [stale-bot] Do not close pr

---
 .github/workflows/stale-bot.yml | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml
index ae9177af..5b4568e1 100644
--- a/.github/workflows/stale-bot.yml
+++ b/.github/workflows/stale-bot.yml
@@ -12,13 +12,11 @@ jobs:
       - uses: actions/stale@v5
         with:
           stale-issue-message: 'We are clearing up our old issues and your ticket has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 2 days.'
-          stale-pr-message: 'We are clearing up our old Pull Requests and yours has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 2 days.'
           close-issue-message: 'This issue was closed because it has been stalled for 2 days with no activity.'
-          close-pr-message: 'This PR was closed because it has been stalled for 2 days with no activity.'
           days-before-stale: 90
           days-before-close: 2
+          days-before-pr-stale: 999999999
+          days-before-pr-close: 1
           exempt-issue-labels: 'News,Medium,High,discussion,bug,doc,feature-request'
-          exempt-pr-labels: 'awaiting-approval,work-in-progress,enhancement,feature-request'
           exempt-issue-assignees: 'louislam'
-          exempt-pr-assignees: 'louislam'
           operations-per-run: 200

From 92caec95fe6c8a19376dac3758fccedca6ad7c93 Mon Sep 17 00:00:00 2001
From: Silvio Wangler <71073+saw303@users.noreply.github.com>
Date: Tue, 6 Dec 2022 13:43:29 +0100
Subject: [PATCH 301/803] Added new language German (Switzerland)

---
 package-lock.json      |   4 +-
 src/i18n.js            |   1 +
 src/languages/de-CH.js | 634 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 637 insertions(+), 2 deletions(-)
 create mode 100644 src/languages/de-CH.js

diff --git a/package-lock.json b/package-lock.json
index 1683ecad..194962f8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.0-beta.0",
+    "version": "1.19.0-beta.1",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.0-beta.0",
+            "version": "1.19.0-beta.1",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
diff --git a/src/i18n.js b/src/i18n.js
index 902177cf..aff60c75 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -6,6 +6,7 @@ const languageList = {
     "zh-HK": "繁體中文 (香港)",
     "bg-BG": "Български",
     "de-DE": "Deutsch (Deutschland)",
+    "de-CH": "Deutsch (Schweiz)",
     "nl-NL": "Nederlands",
     "nb-NO": "Norsk",
     "es-ES": "Español",
diff --git a/src/languages/de-CH.js b/src/languages/de-CH.js
new file mode 100644
index 00000000..7cf81e7b
--- /dev/null
+++ b/src/languages/de-CH.js
@@ -0,0 +1,634 @@
+export default {
+    languageName: "Deutsch (Schweiz)",
+    Settings: "Einstellungen",
+    Dashboard: "Dashboard",
+    "New Update": "Update verfügbar",
+    Language: "Sprache",
+    Appearance: "Erscheinungsbild",
+    Theme: "Erscheinungsbild",
+    General: "Allgemein",
+    Version: "Version",
+    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
+    List: "Liste",
+    Add: "Hinzufügen",
+    "Add New Monitor": "Neuen Monitor hinzufügen",
+    "Quick Stats": "Übersicht",
+    Up: "Aktiv",
+    Down: "Inaktiv",
+    Pending: "Ausstehend",
+    Unknown: "Unbekannt",
+    Pause: "Pausieren",
+    pauseDashboardHome: "Pausiert",
+    Name: "Name",
+    Status: "Status",
+    DateTime: "Datum / Uhrzeit",
+    Message: "Nachricht",
+    "No important events": "Keine wichtigen Ereignisse",
+    Resume: "Fortsetzen",
+    Edit: "Bearbeiten",
+    Delete: "Löschen",
+    Current: "Aktuell",
+    Uptime: "Verfügbarkeit",
+    "Cert Exp.": "Zertifikatsablauf",
+    day: "Tag | Tage",
+    "-day": "-Tage",
+    hour: "Stunde",
+    "-hour": "-Stunden",
+    checkEverySecond: "Überprüfe alle {0} Sekunden",
+    Response: "Antwortzeit",
+    Ping: "Ping",
+    "Monitor Type": "Monitor-Typ",
+    Keyword: "Suchwort",
+    "Friendly Name": "Anzeigename",
+    URL: "URL",
+    Hostname: "Hostname",
+    Port: "Port",
+    "Heartbeat Interval": "Prüfintervall",
+    Retries: "Wiederholungen",
+    retriesDescription: "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
+    Advanced: "Erweitert",
+    ignoreTLSError: "Ignoriere TLS-/SSL-Fehler von Webseiten",
+    "Upside Down Mode": "Umgekehrter Modus",
+    upsideDownModeDescription: "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
+    "Max. Redirects": "Max. Weiterleitungen",
+    maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
+    "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
+    acceptedStatusCodesDescription: "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
+    Save: "Speichern",
+    Notifications: "Benachrichtigungen",
+    "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
+    "Setup Notification": "Benachrichtigung einrichten",
+    Light: "Hell",
+    Dark: "Dunkel",
+    Auto: "Auto",
+    "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
+    Normal: "Normal",
+    Bottom: "Unten",
+    None: "Keine",
+    Timezone: "Zeitzone",
+    "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
+    "Allow indexing": "Indizierung zulassen",
+    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
+    "Change Password": "Passwort ändern",
+    "Current Password": "Aktuelles Passwort",
+    "New Password": "Neues Passwort",
+    "Repeat New Password": "Neues Passwort wiederholen",
+    passwordNotMatchMsg: "Passwörter stimmen nicht überein.",
+    "Update Password": "Passwort aktualisieren",
+    "Disable Auth": "Authentifizierung deaktivieren",
+    "Enable Auth": "Authentifizierung aktivieren",
+    "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
+    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
+    "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
+    Logout: "Ausloggen",
+    notificationDescription: "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
+    Leave: "Verlassen",
+    "I understand, please disable": "Ich verstehe, bitte deaktivieren",
+    Confirm: "Bestätigen",
+    Yes: "Ja",
+    No: "Nein",
+    Username: "Benutzername",
+    Password: "Passwort",
+    "Remember me": "Angemeldet bleiben",
+    Login: "Einloggen",
+    "No Monitors, please": "Keine Monitore, bitte",
+    "add one": "hinzufügen",
+    "Notification Type": "Benachrichtigungsdienst",
+    Email: "E-Mail",
+    Test: "Test",
+    "Certificate Info": "Zertifikatsinfo",
+    keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Gross-/Kleinschreibung unterschieden.",
+    deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
+    deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
+    resolverserverDescription: "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
+    "Resolver Server": "Auflösungsserver",
+    rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
+    "Last Result": "Letztes Ergebnis",
+    pauseMonitorMsg: "Bist du sicher, dass du den Monitor pausieren möchtest?",
+    clearEventsMsg: "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
+    clearHeartbeatsMsg: "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
+    "Clear Data": "Lösche Daten",
+    Events: "Ereignisse",
+    Heartbeats: "Statistiken",
+    confirmClearStatisticsMsg: "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
+    "Create your admin account": "Erstelle dein Admin-Konto",
+    "Repeat Password": "Passwort erneut eingeben",
+    "Resource Record Type": "Ressourcen Record Typ",
+    Export: "Export",
+    Import: "Import",
+    respTime: "Antw.-Zeit (ms)",
+    notAvailableShort: "N/A",
+    "Default enabled": "Standardmässig aktiviert",
+    "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
+    enableDefaultNotificationDescription: "Für jeden neuen Monitor wird diese Benachrichtigung standardmässig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.",
+    Create: "Erstellen",
+    "Auto Get": "Auto Get",
+    backupDescription: "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
+    backupDescription2: "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
+    backupDescription3: "Sensible Daten wie Benachrichtigungstoken sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
+    alertNoFile: "Bitte wähle eine Datei zum Importieren aus.",
+    alertWrongFileType: "Bitte wähle eine JSON-Datei aus.",
+    "Clear all statistics": "Lösche alle Statistiken",
+    importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
+    "Skip existing": "Vorhandene überspringen",
+    Overwrite: "Überschreiben",
+    Options: "Optionen",
+    confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
+    "Keep both": "Beide behalten",
+    twoFAVerifyLabel: "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
+    "Verify Token": "Token verifizieren",
+    "Setup 2FA": "2FA einrichten",
+    "Enable 2FA": "2FA aktivieren",
+    "Disable 2FA": "2FA deaktivieren",
+    "2FA Settings": "2FA-Einstellungen",
+    confirmEnableTwoFAMsg: "Bist du sicher, dass du 2FA aktivieren möchtest?",
+    confirmDisableTwoFAMsg: "Bist du sicher, dass du 2FA deaktivieren möchtest?",
+    tokenValidSettingsMsg: "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
+    "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
+    Active: "Aktiv",
+    Inactive: "Inaktiv",
+    Token: "Token",
+    "Show URI": "URI anzeigen",
+    Tags: "Tags",
+    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
+    "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
+    "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
+    color: "Farbe",
+    "value (optional)": "Wert (optional)",
+    Gray: "Grau",
+    Red: "Rot",
+    Orange: "Orange",
+    Green: "Grün",
+    Blue: "Blau",
+    Indigo: "Indigo",
+    Purple: "Lila",
+    Pink: "Pink",
+    "Search...": "Suchen...",
+    "Heartbeat Retry Interval": "Überprüfungsintervall",
+    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
+    retryCheckEverySecond: "Alle {0} Sekunden neu versuchen",
+    resendEveryXTimes: "Erneut versenden alle {0} mal",
+    resendDisabled: "Erneut versenden deaktiviert",
+    "Import Backup": "Backup importieren",
+    "Export Backup": "Backup exportieren",
+    "Avg. Ping": "Durchschn. Ping",
+    "Avg. Response": "Durchschn. Antwort",
+    "Entry Page": "Einstiegsseite",
+    statusPageNothing: "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
+    "No Services": "Keine Dienste",
+    "All Systems Operational": "Alle Systeme betriebsbereit",
+    "Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
+    "Degraded Service": "Eingeschränkter Dienst",
+    "Add Group": "Gruppe hinzufügen",
+    "Add a monitor": "Monitor hinzufügen",
+    "Edit Status Page": "Bearbeite Status-Seite",
+    "Go to Dashboard": "Gehe zum Dashboard",
+    "Status Page": "Status-Seite",
+    "Status Pages": "Status-Seiten",
+    telegram: "Telegram",
+    webhook: "Webhook",
+    smtp: "E-Mail (SMTP)",
+    discord: "Discord",
+    teams: "Microsoft Teams",
+    signal: "Signal",
+    gotify: "Gotify",
+    slack: "Slack",
+    "rocket.chat": "Rocket.chat",
+    pushover: "Pushover",
+    pushy: "Pushy",
+    octopush: "Octopush",
+    promosms: "PromoSMS",
+    lunasea: "LunaSea",
+    apprise: "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
+    GoogleChat: "Google Chat (nur Google Workspace)",
+    pushbullet: "Pushbullet",
+    line: "Line Messenger",
+    mattermost: "Mattermost",
+    "Primary Base URL": "Primär URL",
+    "Push URL": "Push URL",
+    needPushEvery: "Du solltest diese URL alle {0} Sekunden aufrufen",
+    pushOptionalParams: "Optionale Parameter: {0}",
+    defaultNotificationName: "Mein {notification} Alarm ({number})",
+    here: "hier",
+    Required: "Erforderlich",
+    "Bot Token": "Bot Token",
+    wayToGetTelegramToken: "Hier kannst du einen Token erhalten {0}.",
+    "Chat ID": "Chat ID",
+    supportTelegramChatID: "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
+    wayToGetTelegramChatID: "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
+    "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
+    chatIDNotFound: "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    webhookJsonDesc: "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
+    webhookFormDataDesc: "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
+    secureOptionNone: "Keine / STARTTLS (25, 587)",
+    secureOptionTLS: "TLS (465)",
+    "Ignore TLS Error": "TLS-Fehler ignorieren",
+    "From Email": "Absender E-Mail",
+    emailCustomSubject: "Benutzerdefinierter Betreff",
+    "To Email": "Empfänger E-Mail",
+    smtpCC: "CC",
+    smtpBCC: "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    wayToGetDiscordURL: "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
+    "Bot Display Name": "Bot-Anzeigename",
+    "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
+    "Hello @everyone is...": "Hallo {'@'}everyone ist...",
+    "Webhook URL": "Webhook URL",
+    wayToGetTeamsURL: "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
+    Number: "Nummer",
+    Recipients: "Empfänger",
+    needSignalAPI: "Es wird ein Signal Client mit REST-API benötigt.",
+    wayToCheckSignalURL: "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
+    signalImportant: "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
+    "Application Token": "Anwendungs Token",
+    "Server URL": "Server URL",
+    Priority: "Priorität",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Kanalname",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    aboutWebhooks: "Weitere Informationen zu Webhooks auf: {0}",
+    aboutChannelName: "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
+    aboutKumaURL: "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmässig die GitHub Projekt Seite verwendet.",
+    emojiCheatSheet: "Emoji Cheat Sheet: {0}",
+    "User Key": "Benutzerschlüssel",
+    Device: "Gerät",
+    "Message Title": "Nachrichtentitel",
+    "Notification Sound": "Benachrichtigungston",
+    "More info on:": "Mehr Infos auf: {0}",
+    pushoverDesc1: "Notfallpriorität (2) hat standardmässig 30 Sekunden Auszeit zwischen den Versuchen und läuft nach 1 Stunde ab.",
+    pushoverDesc2: "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
+    "SMS Type": "SMS Typ",
+    octopushTypePremium: "Premium (Schnell - zur Benachrichtigung empfohlen)",
+    octopushTypeLowCost: "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
+    checkPrice: "Prüfe {0} Preise:",
+    octopushLegacyHint: "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
+    "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
+    octopushPhoneNumber: "Telefonnummer (Internationales Format, z.B : +49612345678) ",
+    octopushSMSSender: "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Geräte ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Beispiel: {0}",
+    "Read more:": "Weiterlesen: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Weiterlesen",
+    appriseInstalled: "Apprise ist installiert.",
+    appriseNotInstalled: "Apprise ist nicht installiert. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Line Developers Console",
+    lineDevConsoleTo: "Line Developers Console - {0}",
+    "Basic Settings": "Basic Settings",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    wayToGetLineChannelToken: "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
+    "Icon URL": "Icon URL",
+    aboutIconURL: "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
+    aboutMattermostChannelName: "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
+    matrix: "Matrix",
+    promosmsTypeEco: "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
+    promosmsTypeFlash: "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
+    promosmsTypeFull: "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.",
+    promosmsTypeSpeed: "SMS SPEED - Höchste Priorität im System. Sehr schnell und zuverlässig, aber teuer (Ungefähr das doppelte von SMS FULL).",
+    promosmsPhoneNumber: "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
+    promosmsSMSSender: "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu Webhook URL",
+    matrixHomeserverURL: "Heimserver URL (mit http(s):// und optionalen Ports)",
+    "Internal Room Id": "Interne Raum-ID",
+    matrixDesc1: "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
+    matrixDesc2: "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
+    Method: "Method",
+    Body: "Body",
+    Headers: "Headers",
+    PushUrl: "Push URL",
+    HeadersInvalidFormat: "Der Header ist kein gültiges JSON: ",
+    BodyInvalidFormat: "Der Body ist kein gültiges JSON: ",
+    "Monitor History": "Monitor Verlauf",
+    clearDataOlderThan: "Bewahre die Monitor-Verlaufsdaten für {0} Tage auf.",
+    PasswordsDoNotMatch: "Passwörter stimmen nicht überein.",
+    records: "Einträge",
+    "One record": "Ein Eintrag",
+    steamApiKeyDescription: "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
+    "Current User": "Aktueller Benutzer",
+    recent: "Letzte",
+    Done: "Fertig",
+    Info: "Info",
+    Security: "Sicherheit",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Datenbank verkleinern",
+    "Pick a RR-Type...": "Wähle ein RR-Typ aus...",
+    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
+    Default: "Standard",
+    "HTTP Options": "HTTP Optionen",
+    "Create Incident": "Vorfall erstellen",
+    Title: "Titel",
+    Content: "Inhalt",
+    Style: "Stil",
+    info: "info",
+    warning: "warnung",
+    danger: "gefahr",
+    primary: "primär",
+    light: "hell",
+    dark: "dunkel",
+    Post: "Eintrag",
+    "Please input title and content": "Bitte Titel und Inhalt eingeben",
+    Created: "Erstellt",
+    "Last Updated": "Zuletzt aktualisiert",
+    Unpin: "Loslösen",
+    "Switch to Light Theme": "Zu hellem Thema wechseln",
+    "Switch to Dark Theme": "Zum dunklen Thema wechseln",
+    "Show Tags": "Tags anzeigen",
+    "Hide Tags": "Tags ausblenden",
+    Description: "Beschreibung",
+    "No monitors available.": "Keine Monitore verfügbar.",
+    "Add one": "Hinzufügen",
+    "No Monitors": "Keine Monitore",
+    "Untitled Group": "Gruppe ohne Titel",
+    Services: "Dienste",
+    Discard: "Verwerfen",
+    Cancel: "Abbrechen",
+    "Powered by": "Powered by",
+    shrinkDatabaseDescription: "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
+    serwersms: "SerwerSMS.pl",
+    serwersmsAPIUser: "API Benutzername (inkl. webapi_ prefix)",
+    serwersmsAPIPassword: "API Passwort",
+    serwersmsPhoneNumber: "Telefonnummer",
+    serwersmsSenderName: "Name des SMS-Absenders (über Kundenportal registriert)",
+    stackfield: "Stackfield",
+    clicksendsms: "ClickSend SMS",
+    apiCredentials: "API Zugangsdaten",
+    smtpDkimSettings: "DKIM Einstellungen",
+    smtpDkimDesc: "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
+    documentation: "Dokumentation",
+    smtpDkimDomain: "Domain Name",
+    smtpDkimKeySelector: "Schlüssel Auswahl",
+    smtpDkimPrivateKey: "Privater Schlüssel",
+    smtpDkimHashAlgo: "Hash-Algorithmus (Optional)",
+    smtpDkimheaderFieldNames: "Zu validierende Header-Schlüssel (optional)",
+    smtpDkimskipFields: "Zu ignorierende Header Schlüssel (optional)",
+    PushByTechulus: "Push by Techulus",
+    gorush: "Gorush",
+    alerta: "Alerta",
+    alertaApiEndpoint: "API Endpunkt",
+    alertaEnvironment: "Umgebung",
+    alertaApiKey: "API Schlüssel",
+    alertaAlertState: "Alarmstatus",
+    alertaRecoverState: "Wiederherstellungsstatus",
+    deleteStatusPageMsg: "Bist du sicher, dass du diese Status-Seite löschen willst?",
+    Proxies: "Proxies",
+    default: "Standard",
+    enabled: "Aktiviert",
+    setAsDefault: "Als Standard setzen",
+    deleteProxyMsg: "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
+    proxyDescription: "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
+    enableProxyDescription: "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
+    setAsDefaultProxyDescription: "Dieser Proxy wird standardmässig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immernoch für jeden Monitor einzeln deaktivieren.",
+    "Certificate Chain": "Zertifikatskette",
+    Valid: "Gültig",
+    Invalid: "Ungültig",
+    AccessKeyId: "AccessKey ID",
+    SecretAccessKey: "AccessKey Secret",
+    PhoneNumbers: "Telefonnummern",
+    TemplateCode: "Vorlagencode",
+    SignName: "Signaturname",
+    "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
+    "Bark Endpoint": "Bark Endpunkt",
+    WebHookUrl: "Webhook URL",
+    SecretKey: "Geheimer Schlüssel",
+    "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
+    "Device Token": "Gerätetoken",
+    Platform: "Platform",
+    iOS: "iOS",
+    Android: "Android",
+    Huawei: "Huawei",
+    High: "Hoch",
+    Retry: "Wiederholungen",
+    Topic: "Thema",
+    "WeCom Bot Key": "WeCom Bot Schlüssel",
+    "Setup Proxy": "Proxy einrichten",
+    "Proxy Protocol": "Proxy Protokoll",
+    "Proxy Server": "Proxy-Server",
+    "Proxy server has authentication": "Proxy-Server hat Authentifizierung",
+    User: "Benutzer",
+    Installed: "Installiert",
+    "Not installed": "Nicht installiert",
+    Running: "Läuft",
+    "Not running": "Gestoppt",
+    "Remove Token": "Token entfernen",
+    Start: "Start",
+    Stop: "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Neue Status-Seite hinzufügen",
+    Slug: "Slug",
+    "Accept characters:": "Akzeptierte Zeichen:",
+    startOrEndWithOnly: "Nur mit {0} anfangen und enden",
+    "No consecutive dashes": "Keine aufeinanderfolgenden Bindestriche",
+    Next: "Weiter",
+    "The slug is already taken. Please choose another slug.": "Der Slug ist bereits in Verwendung. Bitte wähle einen anderen.",
+    "No Proxy": "Kein Proxy",
+    Authentication: "Authentifizierung",
+    "HTTP Basic Auth": "HTTP Basisauthentifizierung",
+    "New Status Page": "Neue Status-Seite",
+    "Page Not Found": "Seite nicht gefunden",
+    "Reverse Proxy": "Reverse Proxy",
+    Backup: "Sicherung",
+    About: "Über",
+    wayToGetCloudflaredURL: "(Lade cloudflared von {0} herunter)",
+    cloudflareWebsite: "Cloudflare Website",
+    "Message:": "Nachricht:",
+    "Don't know how to get the token? Please read the guide:": "Du weisst nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Die aktuelle Verbindung kann unterbrochen werden, wenn du aktuell über Cloudflare Tunnel verbunden bist. Bist du sicher, dass du es stoppen willst? Gib zur Bestätigung dein aktuelles Passwort ein.",
+    "Other Software": "Andere Software",
+    "For example: nginx, Apache and Traefik.": "Zum Beispiel: nginx, Apache und Traefik.",
+    "Please read": "Bitte lesen",
+    "Subject:": "Betreff:",
+    "Valid To:": "Gültig bis:",
+    "Days Remaining:": "Tage verbleibend:",
+    "Issuer:": "Aussteller:",
+    "Fingerprint:": "Fingerabdruck:",
+    "No status pages": "Keine Status-Seiten",
+    "Domain Name Expiry Notification": "Benachrichtigung bei Ablauf des Domainnamens",
+    Customize: "Anpassen",
+    "Custom Footer": "Eigener Footer",
+    "Custom CSS": "Eigenes CSS",
+    "Footer Text": "Fusszeile",
+    "Show Powered By": "Zeige 'Powered By'",
+    "Date Created": "Erstellt am",
+    "Domain Names": "Domainnamen",
+    signedInDisp: "Angemeldet als {0}",
+    signedInDispDisabled: "Authentifizierung deaktiviert.",
+    dnsPortDescription: "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
+    topic: "Thema",
+    topicExplanation: "MQTT Thema für den monitor",
+    successMessage: "Erfolgsnachricht",
+    successMessageExplanation: "MQTT Nachricht, die als Erfolg angesehen wird",
+    error: "Fehler",
+    critical: "kritisch",
+    wayToGetPagerDutyKey: "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
+    "Integration Key": "Schlüssel der Integration",
+    "Integration URL": "URL der Integration",
+    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
+    "do nothing": "nichts tun",
+    "auto acknowledged": "automatisch bestätigen",
+    "auto resolve": "automatisch lösen",
+    "Bark Group": "Bark Gruppe",
+    "Bark Sound": "Bark Klang",
+    "HTTP Headers": "HTTP Kopfzeilen",
+    "Trust Proxy": "Vertrauenswürdiger Proxy",
+    Proxy: "Proxy",
+    HomeAssistant: "Home Assistant",
+    onebotHttpAddress: "OneBot HTTP Adresse",
+    onebotMessageType: "OneBot Nachrichtentyp",
+    onebotGroupMessage: "Gruppe",
+    onebotPrivateMessage: "Privat",
+    onebotUserOrGroupId: "Gruppe/Nutzer ID",
+    onebotSafetyTips: "Zur Sicherheit ein access token setzen",
+    "PushDeer Key": "PushDeer Schlüssel",
+    RadiusSecret: "Radius Geheimnis",
+    RadiusSecretDescription: "Geteiltes Geheimnis zwischen Client und Server",
+    RadiusCalledStationId: "ID der angesprochenen Station",
+    RadiusCalledStationIdDescription: "Identifikation des angesprochenen Geräts",
+    RadiusCallingStationId: "ID der ansprechenden Station",
+    RadiusCallingStationIdDescription: "Identifikation des ansprechenden Geräts",
+    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
+    "API Username": "API Nutzername",
+    "API Key": "API Schlüssel",
+    "Recipient Number": "Empfängernummer",
+    "From Name/Number": "Von Name/Nummer",
+    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Sendernummer zu nutzen.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "Endpunkt",
+    octopushAPIKey: "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
+    octopushLogin: "\"Login\" der HTTP API Zugangsdaten im control panel",
+    promosmsLogin: "API Login Name",
+    promosmsPassword: "API Password",
+    "pushoversounds pushover": "Pushover (Standard)",
+    "pushoversounds bike": "Fahrrad",
+    "pushoversounds bugle": "Signalhorn",
+    "pushoversounds cashregister": "Kasse",
+    "pushoversounds classical": "Klassisch",
+    "pushoversounds cosmic": "Kosmisch",
+    "pushoversounds falling": "Abfallend",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Eingang",
+    "pushoversounds intermission": "Pause",
+    "pushoversounds magic": "Magisch",
+    "pushoversounds mechanical": "Mechanisch",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Sirene",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Schlepper Horn",
+    "pushoversounds alien": "Ausserirdisch (lang)",
+    "pushoversounds climb": "Ansteigende (lang)",
+    "pushoversounds persistent": "Hartnäckig (lang)",
+    "pushoversounds echo": "Pushover Echo (lang)",
+    "pushoversounds updown": "Auf und Ab (lang)",
+    "pushoversounds vibrate": "Nur vibrieren",
+    "pushoversounds none": "Nichts (Stille)",
+    pushyAPIKey: "Geheimer API Schlüssel",
+    pushyToken: "Gerätetoken",
+    "Show update if available": "Verfügbare Updates anzeigen",
+    "Also check beta release": "Auch nach beta Versionen schauen",
+    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
+    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Wahrscheinliche Ursachen:",
+    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
+    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
+    "What you can try:": "Was du versuchen kannst:",
+    "Retype the address.": "Schreibe die Adresse erneut.",
+    "Go back to the previous page.": "Gehe zur vorigen Seite.",
+    "Coming Soon": "Kommt bald",
+    wayToGetClickSendSMSToken: "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
+    "Connection String": "Verbindungstext",
+    Query: "Abfrage",
+    settingsCertificateExpiry: "TLS Zertifikatsablauf",
+    certificationExpiryDescription: "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
+    "Setup Docker Host": "Docker Host einrichten",
+    "Connection Type": "Verbindungstyp",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "Bist du sicher diesen docker host für alle Monitore zu löschen?",
+    socket: "Socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Thema",
+    Domain: "Domain",
+    Workstation: "Workstation",
+    disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
+    trustProxyDescription: "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
+    wayToGetLineNotifyToken: "Du kannst hier ein Token erhalten: {0}",
+    Examples: "Beispiele",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Lange gültiges Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
+    "Notification Service": "Benachrichtigungsdienst",
+    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdiesnte kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
+    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
+    "Trigger type:": "Auslösertyp:",
+    "Event type:": "Ereignistyp:",
+    "Event data:": "Ereignis daten:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
+    "Frontend Version": "Frontend Version",
+    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
+    Maintenance: "Wartung",
+    statusMaintenance: "Wartung",
+    "Schedule maintenance": "Geplante Wartung",
+    "Affected Monitors": "Betroffene Monitore",
+    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
+    "Start of maintenance": "Beginn der Wartung",
+    "All Status Pages": "Alle Status Seiten",
+    "Select status pages...": "Wähle Status Seiten...",
+    recurringIntervalMessage: "einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
+    affectedMonitorsDescription: "Wähle alle Monitore die von der Wartung betroffen sind",
+    affectedStatusPages: "Zeige diese Nachricht auf ausgewählten Status Seiten",
+    atLeastOneMonitor: "Wähle mindestens einen Monitor",
+    deleteMaintenanceMsg: "Möchtest du diese Wartung löschen?",
+    "Base URL": "Basis URL",
+    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaft Planung, automaitsche Esklaltion und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt! {0}",
+    goAlertIntegrationKeyInfo: "Bekomm einenen gernerischen API Schlüssel in folgeden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise der Wert des Token aus der URL.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingspielt werden.",
+    backupRecommend: "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
+    Optional: "Optional",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "SMSManager API Dokumente",
+    "Gateway Type": "Gateway Type",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "Du kannst Zahlen teilen mit",
+    or: "oder",
+    recurringInterval: "Intervall",
+    Recurring: "Wiederkehrend",
+    strategyManual: "Active/Inactive Manually",
+    warningTimezone: "Es wird die Zeitzone des Servers genutzt",
+    weekdayShortMon: "Mo",
+    weekdayShortTue: "Di",
+    weekdayShortWed: "Mi",
+    weekdayShortThu: "Do",
+    weekdayShortFri: "Fr",
+    weekdayShortSat: "Sa",
+    weekdayShortSun: "So",
+    dayOfWeek: "Tag der Woche",
+    dayOfMonth: "Tag im Monat",
+    lastDay: "Letzter Tag",
+    lastDay1: "Letzter Tag im Monat",
+    lastDay2: "Vorletzer Tag im Monat",
+    lastDay3: "3. letzter Tag im Monat",
+    lastDay4: "4. letzter Tag im Monat",
+    "No Maintenance": "Keine Wartung",
+    pauseMaintenanceMsg: "Möchtest du wirklich pausieren?",
+    "maintenanceStatus-under-maintenance": "Unter Wartung",
+    "maintenanceStatus-inactive": "Inaktiv",
+    "maintenanceStatus-scheduled": "Geplant",
+    "maintenanceStatus-ended": "Ende",
+    "maintenanceStatus-unknown": "Unbekannt",
+    "Display Timezone": "Zeitzone anzeigen",
+    "Server Timezone": "Server Zeitzone",
+    statusPageMaintenanceEndDate: "Ende",
+};

From f3660a0cece42f1d76f23dfed082a96297d5c096 Mon Sep 17 00:00:00 2001
From: Joppe Koers <joppe@joppekoers.nl>
Date: Tue, 6 Dec 2022 18:43:28 +0100
Subject: [PATCH 302/803] Fix spelling in README

---
 README.md | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/README.md b/README.md
index 55a6ec50..90c8ad75 100644
--- a/README.md
+++ b/README.md
@@ -22,17 +22,17 @@ It is a temporary live demo, all data will be deleted after 10 minutes. Use the
 
 ## ⭐ Features
 
-* Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / Ping / DNS Record / Push / Steam Game Server / Docker Containers.
-* Fancy, Reactive, Fast UI/UX.
-* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [90+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications).
-* 20 second intervals.
+* Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / Ping / DNS Record / Push / Steam Game Server / Docker Containers
+* Fancy, Reactive, Fast UI/UX
+* Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [90+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications)
+* 20 second intervals
 * [Multi Languages](https://github.com/louislam/uptime-kuma/tree/master/src/languages)
-* Multiple Status Pages
-* Map Status Page to Domain
-* Ping Chart
-* Certificate Info
-* Proxy Support
-* 2FA available
+* Multiple status pages
+* Map status pages to specific domains
+* Ping chart
+* Certificate info
+* Proxy support
+* 2FA support
 
 ## 🔧 How to Install
 
@@ -44,14 +44,14 @@ docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name upti
 
 ⚠️ Please use a **local volume** only. Other types such as NFS are not supported.
 
-Browse to http://localhost:3001 after starting.
+Kuma is now running on http://localhost:3001
 
 ### 💪🏻 Non-Docker
 
 Required Tools: 
 - [Node.js](https://nodejs.org/en/download/) >= 14
 - [Git](https://git-scm.com/downloads) 
-- [pm2](https://pm2.keymetrics.io/) - For run in background
+- [pm2](https://pm2.keymetrics.io/) - For running kuma in the background
 
 ```bash
 # Update your npm to the latest version
@@ -73,7 +73,7 @@ pm2 start server/server.js --name uptime-kuma
 
 
 ```
-Browse to http://localhost:3001 after starting.
+Kuma is now running on http://localhost:3001
 
 More useful PM2 Commands
 

From f8c7da7995528c453335a8f6814e81bdea8e17ac Mon Sep 17 00:00:00 2001
From: Joppe Koers <joppe@joppekoers.nl>
Date: Tue, 6 Dec 2022 18:44:16 +0100
Subject: [PATCH 303/803] Add docker-compose to README

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

diff --git a/README.md b/README.md
index 90c8ad75..6d10cf2a 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,20 @@ It is a temporary live demo, all data will be deleted after 10 minutes. Use the
 docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1
 ```
 
+### 🐳 Docker Compose
+```yaml
+version: "3"
+
+services:
+  uptime-kuma:
+    image: louislam/uptime-kuma:1
+    restart: always
+    ports:
+      - "3001:3001"
+    volumes:
+      - uptime-kuma:/app/data
+```
+
 ⚠️ Please use a **local volume** only. Other types such as NFS are not supported.
 
 Kuma is now running on http://localhost:3001

From aa27d976c232ef67c4b554106f356e749d2c8922 Mon Sep 17 00:00:00 2001
From: Silvio Wangler <71073+saw303@users.noreply.github.com>
Date: Wed, 7 Dec 2022 09:10:05 +0100
Subject: [PATCH 304/803] =?UTF-8?q?Fixed=20some=20typos=20in=20the=20Germa?=
 =?UTF-8?q?n=20translations=20=F0=9F=87=A9=F0=9F=87=AA=F0=9F=87=A8?=
 =?UTF-8?q?=F0=9F=87=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/languages/de-CH.js | 28 ++++++++++++++--------------
 src/languages/de-DE.js | 16 ++++++++--------
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/src/languages/de-CH.js b/src/languages/de-CH.js
index 7cf81e7b..922657d0 100644
--- a/src/languages/de-CH.js
+++ b/src/languages/de-CH.js
@@ -96,7 +96,7 @@ export default {
     "Notification Type": "Benachrichtigungsdienst",
     Email: "E-Mail",
     Test: "Test",
-    "Certificate Info": "Zertifikatsinfo",
+    "Certificate Info": "Zertifikatsinformation",
     keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Gross-/Kleinschreibung unterschieden.",
     deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
     deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
@@ -125,7 +125,7 @@ export default {
     "Auto Get": "Auto Get",
     backupDescription: "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
     backupDescription2: "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
-    backupDescription3: "Sensible Daten wie Benachrichtigungstoken sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
+    backupDescription3: "Sensible Daten wie Benachrichtigungs-Token sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
     alertNoFile: "Bitte wähle eine Datei zum Importieren aus.",
     alertWrongFileType: "Bitte wähle eine JSON-Datei aus.",
     "Clear all statistics": "Lösche alle Statistiken",
@@ -171,8 +171,8 @@ export default {
     resendDisabled: "Erneut versenden deaktiviert",
     "Import Backup": "Backup importieren",
     "Export Backup": "Backup exportieren",
-    "Avg. Ping": "Durchschn. Ping",
-    "Avg. Response": "Durchschn. Antwort",
+    "Avg. Ping": "Ping ø",
+    "Avg. Response": "Antwortzeit ø",
     "Entry Page": "Einstiegsseite",
     statusPageNothing: "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
     "No Services": "Keine Dienste",
@@ -242,7 +242,7 @@ export default {
     needSignalAPI: "Es wird ein Signal Client mit REST-API benötigt.",
     wayToCheckSignalURL: "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
     signalImportant: "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
-    "Application Token": "Anwendungs Token",
+    "Application Token": "Anwendungstoken",
     "Server URL": "Server URL",
     Priority: "Priorität",
     "Icon Emoji": "Icon Emoji",
@@ -305,7 +305,7 @@ export default {
     HeadersInvalidFormat: "Der Header ist kein gültiges JSON: ",
     BodyInvalidFormat: "Der Body ist kein gültiges JSON: ",
     "Monitor History": "Monitor Verlauf",
-    clearDataOlderThan: "Bewahre die Monitor-Verlaufsdaten für {0} Tage auf.",
+    clearDataOlderThan: "Bewahre die Aufzeichnungsdaten für {0} Tage auf.",
     PasswordsDoNotMatch: "Passwörter stimmen nicht überein.",
     records: "Einträge",
     "One record": "Ein Eintrag",
@@ -383,7 +383,7 @@ export default {
     deleteProxyMsg: "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
     proxyDescription: "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
     enableProxyDescription: "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
-    setAsDefaultProxyDescription: "Dieser Proxy wird standardmässig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immernoch für jeden Monitor einzeln deaktivieren.",
+    setAsDefaultProxyDescription: "Dieser Proxy wird standardmässig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
     "Certificate Chain": "Zertifikatskette",
     Valid: "Gültig",
     Invalid: "Ungültig",
@@ -434,7 +434,7 @@ export default {
     "Reverse Proxy": "Reverse Proxy",
     Backup: "Sicherung",
     About: "Über",
-    wayToGetCloudflaredURL: "(Lade cloudflared von {0} herunter)",
+    wayToGetCloudflaredURL: "(Lade Cloudflare von {0} herunter)",
     cloudflareWebsite: "Cloudflare Website",
     "Message:": "Nachricht:",
     "Don't know how to get the token? Please read the guide:": "Du weisst nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
@@ -496,7 +496,7 @@ export default {
     "API Key": "API Schlüssel",
     "Recipient Number": "Empfängernummer",
     "From Name/Number": "Von Name/Nummer",
-    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Sendernummer zu nutzen.",
+    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
     "Octopush API Version": "Octopush API Version",
     "Legacy Octopush-DM": "Legacy Octopush-DM",
     endpoint: "Endpunkt",
@@ -568,9 +568,9 @@ export default {
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
     "Notification Service": "Benachrichtigungsdienst",
     "default: notify all devices": "standard: Alle Geräte benachrichtigen",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdiesnte kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
     "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
-    "Trigger type:": "Auslösertyp:",
+    "Trigger type:": "Auslöser:",
     "Event type:": "Ereignistyp:",
     "Event data:": "Ereignis daten:",
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
@@ -590,10 +590,10 @@ export default {
     atLeastOneMonitor: "Wähle mindestens einen Monitor",
     deleteMaintenanceMsg: "Möchtest du diese Wartung löschen?",
     "Base URL": "Basis URL",
-    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaft Planung, automaitsche Esklaltion und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt! {0}",
-    goAlertIntegrationKeyInfo: "Bekomm einenen gernerischen API Schlüssel in folgeden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise der Wert des Token aus der URL.",
+    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
+    goAlertIntegrationKeyInfo: "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
     goAlert: "GoAlert",
-    backupOutdatedWarning: "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingspielt werden.",
+    backupOutdatedWarning: "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
     backupRecommend: "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
     Optional: "Optional",
     squadcast: "Squadcast",
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index 78e96a29..0e59566c 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -96,7 +96,7 @@ export default {
     "Notification Type": "Benachrichtigungsdienst",
     Email: "E-Mail",
     Test: "Test",
-    "Certificate Info": "Zertifikatsinfo",
+    "Certificate Info": "Zertifikatsinformation",
     keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.",
     deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
     deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
@@ -383,7 +383,7 @@ export default {
     deleteProxyMsg: "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
     proxyDescription: "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
     enableProxyDescription: "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
-    setAsDefaultProxyDescription: "Dieser Proxy wird standardmäßig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immernoch für jeden Monitor einzeln deaktivieren.",
+    setAsDefaultProxyDescription: "Dieser Proxy wird standardmäßig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
     "Certificate Chain": "Zertifikatskette",
     Valid: "Gültig",
     Invalid: "Ungültig",
@@ -496,7 +496,7 @@ export default {
     "API Key": "API Schlüssel",
     "Recipient Number": "Empfängernummer",
     "From Name/Number": "Von Name/Nummer",
-    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Sendernummer zu nutzen.",
+    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
     "Octopush API Version": "Octopush API Version",
     "Legacy Octopush-DM": "Legacy Octopush-DM",
     endpoint: "Endpunkt",
@@ -568,9 +568,9 @@ export default {
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
     "Notification Service": "Benachrichtigungsdienst",
     "default: notify all devices": "standard: Alle Geräte benachrichtigen",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdiesnte kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
     "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
-    "Trigger type:": "Auslösertyp:",
+    "Trigger type:": "Auslöser:",
     "Event type:": "Ereignistyp:",
     "Event data:": "Ereignis daten:",
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
@@ -590,10 +590,10 @@ export default {
     atLeastOneMonitor: "Wähle mindestens einen Monitor",
     deleteMaintenanceMsg: "Möchtest du diese Wartung löschen?",
     "Base URL": "Basis URL",
-    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaft Planung, automaitsche Esklaltion und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt! {0}",
-    goAlertIntegrationKeyInfo: "Bekomm einenen gernerischen API Schlüssel in folgeden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise der Wert des Token aus der URL.",
+    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
+    goAlertIntegrationKeyInfo: "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
     goAlert: "GoAlert",
-    backupOutdatedWarning: "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingspielt werden.",
+    backupOutdatedWarning: "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
     backupRecommend: "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
     Optional: "Optional",
     squadcast: "Squadcast",

From cc68ebca39544a2f3787dc90106024b780006c6d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 7 Dec 2022 16:15:00 +0800
Subject: [PATCH 305/803] Convert healthcheck.js into go-lang

---
 .gitignore           |  3 ++
 extra/healthcheck.go | 77 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+)
 create mode 100644 extra/healthcheck.go

diff --git a/.gitignore b/.gitignore
index 8eb05867..78e1a965 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,6 @@ dist-ssr
 
 cypress/videos
 cypress/screenshots
+
+/extra/healthcheck.exe
+/extra/healthcheck
diff --git a/extra/healthcheck.go b/extra/healthcheck.go
new file mode 100644
index 00000000..9d277549
--- /dev/null
+++ b/extra/healthcheck.go
@@ -0,0 +1,77 @@
+package main
+
+import (
+	"crypto/tls"
+	"io/ioutil"
+	"log"
+	"net/http"
+	"os"
+	"runtime"
+	"time"
+)
+
+func main() {
+	isFreeBSD := runtime.GOOS == "freebsd"
+
+	// process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
+	http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{
+		InsecureSkipVerify: true,
+	}
+
+	client := http.Client{
+		Timeout: 28 * time.Second,
+	}
+
+	sslKey := os.Getenv("UPTIME_KUMA_SSL_KEY")
+	if len(sslKey) == 0 {
+		sslKey = os.Getenv("SSL_KEY")
+	}
+
+	sslCert := os.Getenv("UPTIME_KUMA_SSL_CERT")
+	if len(sslCert) == 0 {
+		sslCert = os.Getenv("SSL_CERT")
+	}
+
+	hostname := os.Getenv("UPTIME_KUMA_HOST")
+	if len(hostname) == 0 && !isFreeBSD {
+		hostname = os.Getenv("HOST")
+	}
+	if len(hostname) == 0 {
+		hostname = "127.0.0.1"
+	}
+
+	port := os.Getenv("UPTIME_KUMA_PORT")
+	if len(port) == 0 {
+		port = os.Getenv("PORT")
+	}
+	if len(port) == 0 {
+		port = "3001"
+	}
+
+	protocol := ""
+	if len(sslKey) != 0 && len(sslCert) == 0 {
+		protocol = "https"
+	} else {
+		protocol = "http"
+	}
+
+	url := protocol + "://" + hostname + ":" + port
+
+	log.Println("Checking " + url)
+	resp, err := client.Get(url)
+
+	if err != nil {
+		log.Fatalln(err)
+	}
+
+	defer resp.Body.Close()
+
+	_, err = ioutil.ReadAll(resp.Body)
+
+	if err != nil {
+		log.Fatalln(err)
+	}
+
+	log.Printf("Health Check OK [Res Code: %d]\n", resp.StatusCode)
+
+}

From ad5e1957b1cba658062a68dd91058c0aef8057f9 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 7 Dec 2022 16:22:36 +0800
Subject: [PATCH 306/803] Deprecate healthcheck.js

---
 extra/healthcheck.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/extra/healthcheck.js b/extra/healthcheck.js
index 7c3a7eb4..9b95cf26 100644
--- a/extra/healthcheck.js
+++ b/extra/healthcheck.js
@@ -1,4 +1,5 @@
 /*
+ * ⚠️ Deprecated: Changed to healthcheck.go, it will be deleted in the future.
  * This script should be run after a period of time (180s), because the server may need some time to prepare.
  */
 const { FBSD } = require("../server/util-server");

From 9bfa43100be7dfcb48898eabaa361a30d80a5cf6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 7 Dec 2022 16:47:08 +0800
Subject: [PATCH 307/803] Compile healthcheck.go

---
 docker/dockerfile | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/docker/dockerfile b/docker/dockerfile
index eea6ba33..f2713135 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -1,13 +1,22 @@
+# Build need Golang
+FROM golang:1.19-buster AS build_healthcheck
+WORKDIR /app
+
+COPY . .
+
+# Compile healthcheck.go
+RUN go build -o ./extra/healthcheck ./extra/healthcheck.go
+
+# Build need Node.js
 FROM louislam/uptime-kuma:base-debian AS build
 WORKDIR /app
 
 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
 
-COPY . .
+COPY --from=build_healthcheck /app /app
 RUN npm ci --production && \
     chmod +x /app/extra/entrypoint.sh
 
-
 FROM louislam/uptime-kuma:base-debian AS release
 WORKDIR /app
 
@@ -16,7 +25,7 @@ COPY --from=build /app /app
 
 EXPOSE 3001
 VOLUME ["/app/data"]
-HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
+HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD extra/healthcheck
 ENTRYPOINT ["/usr/bin/dumb-init", "--", "extra/entrypoint.sh"]
 CMD ["node", "server/server.js"]
 

From 2dff7dd380b5402d3800994cff407c7594bd5898 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 8 Dec 2022 18:28:17 +0800
Subject: [PATCH 308/803] Make dockerfile slightly clear and improve the build
 flow

---
 docker/dockerfile | 31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/docker/dockerfile b/docker/dockerfile
index f2713135..6657e681 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -1,27 +1,37 @@
-# Build need Golang
-FROM golang:1.19-buster AS build_healthcheck
+############################################
+# Build in Golang
+# Super slow for armv7 (compile time = 1200 seconds, but other platforms within 5 seconds).
+# Do not change everything here, so it should always use the cache.
+############################################
+FROM golang:1.19.4-buster AS build_healthcheck
 WORKDIR /app
 
-COPY . .
+COPY ./extra/healthcheck.go ./extra/healthcheck.go
 
 # Compile healthcheck.go
-RUN go build -o ./extra/healthcheck ./extra/healthcheck.go
+RUN go build -x -o ./extra/healthcheck ./extra/healthcheck.go
 
-# Build need Node.js
+############################################
+# Build in Node.js
+############################################
 FROM louislam/uptime-kuma:base-debian AS build
 WORKDIR /app
 
 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
 
-COPY --from=build_healthcheck /app /app
+COPY . .
 RUN npm ci --production && \
     chmod +x /app/extra/entrypoint.sh
 
+############################################
+# ⭐ Main Image
+############################################
 FROM louislam/uptime-kuma:base-debian AS release
 WORKDIR /app
 
 # Copy app files from build layer
 COPY --from=build /app /app
+COPY --from=build_healthcheck /app/extra/healthcheck /app/extra/healthcheck
 
 EXPOSE 3001
 VOLUME ["/app/data"]
@@ -29,11 +39,15 @@ HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD ext
 ENTRYPOINT ["/usr/bin/dumb-init", "--", "extra/entrypoint.sh"]
 CMD ["node", "server/server.js"]
 
-
+############################################
+# Mark as Nightly
+############################################
 FROM release AS nightly
 RUN npm run mark-as-nightly
 
+############################################
 # Build an image for testing pr
+############################################
 FROM louislam/uptime-kuma:base-debian AS pr-test
 
 WORKDIR /app
@@ -63,8 +77,9 @@ VOLUME ["/app/data"]
 HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
 CMD ["npm", "run", "start-pr-test"]
 
-
+############################################
 # Upload the artifact to Github
+############################################
 FROM louislam/uptime-kuma:base-debian AS upload-artifact
 WORKDIR /
 RUN apt update && \

From e478084ff99071017f1d0dbbd8d29de689ce3f14 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 8 Dec 2022 19:13:47 +0800
Subject: [PATCH 309/803] Fix Uptime Kuma cannot be stopped

---
 server/server.js                                     | 1 +
 server/settings.js                                   | 7 +++++++
 server/socket-handlers/cloudflared-socket-handler.js | 3 ++-
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/server/server.js b/server/server.js
index 033b85b2..78f98910 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1740,6 +1740,7 @@ async function shutdownFunction(signal) {
 
     stopBackgroundJobs();
     await cloudflaredStop();
+    Settings.stopCacheCleaner();
 }
 
 /** Final function called before application exits */
diff --git a/server/settings.js b/server/settings.js
index 512c20e6..285b626b 100644
--- a/server/settings.js
+++ b/server/settings.js
@@ -158,6 +158,13 @@ class Settings {
             delete Settings.cacheList[key];
         }
     }
+
+    static stopCacheCleaner() {
+        if (Settings.cacheCleaner) {
+            clearInterval(Settings.cacheCleaner);
+            Settings.cacheCleaner = null;
+        }
+    }
 }
 
 module.exports = {
diff --git a/server/socket-handlers/cloudflared-socket-handler.js b/server/socket-handlers/cloudflared-socket-handler.js
index efb1f065..ee58e1ad 100644
--- a/server/socket-handlers/cloudflared-socket-handler.js
+++ b/server/socket-handlers/cloudflared-socket-handler.js
@@ -1,6 +1,7 @@
 const { checkLogin, setSetting, setting, doubleCheckPassword } = require("../util-server");
 const { CloudflaredTunnel } = require("node-cloudflared-tunnel");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
+const { log } = require("../../src/util");
 const io = UptimeKumaServer.getInstance().io;
 
 const prefix = "cloudflared_";
@@ -107,7 +108,7 @@ module.exports.autoStart = async (token) => {
 
 /** Stop cloudflared */
 module.exports.stop = async () => {
-    console.log("Stop cloudflared");
+    log.info("cloudflared", "Stop cloudflared");
     if (cloudflared) {
         cloudflared.stop();
     }

From 73bfdb9ef9d3d970338086c8f339c84389e09a99 Mon Sep 17 00:00:00 2001
From: panos <panos@netmechanics.gr>
Date: Thu, 8 Dec 2022 13:32:10 +0200
Subject: [PATCH 310/803] zoho cliq notification provider

---
 server/notification-providers/zoho-cliq.js | 119 +++++++++++++++++++++
 server/notification.js                     |   2 +
 src/components/notifications/ZohoCliq.vue  |  18 ++++
 src/components/notifications/index.js      |   2 +
 src/languages/el-GR.js                     |   2 +
 src/languages/en.js                        |   2 +
 src/languages/eu.js                        |   2 +
 7 files changed, 147 insertions(+)
 create mode 100644 server/notification-providers/zoho-cliq.js
 create mode 100644 src/components/notifications/ZohoCliq.vue

diff --git a/server/notification-providers/zoho-cliq.js b/server/notification-providers/zoho-cliq.js
new file mode 100644
index 00000000..d944089d
--- /dev/null
+++ b/server/notification-providers/zoho-cliq.js
@@ -0,0 +1,119 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const {DOWN, UP} = require("../../src/util");
+
+class ZohoCliq extends NotificationProvider {
+
+    name = "ZohoCliq";
+
+    /**
+     * Generate the message to send
+     * @param {const} status The status constant
+     * @param {string} monitorName Name of monitor
+     * @returns {string}
+     */
+    _statusMessageFactory = (status, monitorName) => {
+        if (status === DOWN) {
+            return `🔴 Application [${monitorName}] went down\n`;
+        } else if (status === UP) {
+            return `✅ Application [${monitorName}] is back online\n`;
+        }
+        return "Notification\n";
+    };
+
+    /**
+     * Send the notification
+     * @param {string} webhookUrl URL to send the request to
+     * @param {Array} payload Payload generated by _notificationPayloadFactory
+     */
+    _sendNotification = async(webhookUrl, payload) => {
+        await axios.post(webhookUrl, {text: payload.join("\n")});
+    };
+
+    /**
+     * Generate payload for notification
+     * @param {const} status The status of the monitor
+     * @param {string} monitorMessage Message to send
+     * @param {string} monitorName Name of monitor affected
+     * @param {string} monitorUrl URL of monitor affected
+     * @returns {Array}
+     */
+    _notificationPayloadFactory = ({
+       status,
+       monitorMessage,
+       monitorName,
+       monitorUrl,
+   }) => {
+
+        const payload = ["### Uptime Kuma\n"];
+        payload.push(this._statusMessageFactory(status, monitorName));
+        payload.push(`*Description:* ${monitorMessage}`);
+
+        if (monitorName) {
+            payload.push(`*Monitor:* ${monitorName}`);
+        }
+
+        if (monitorUrl && monitorUrl !== "https://") {
+            payload.push(`*URL:* [${monitorUrl}](${monitorUrl})`);
+        }
+
+        return payload;
+    };
+
+    /**
+     * Send a general notification
+     * @param {string} webhookUrl URL to send request to
+     * @param {string} msg Message to send
+     * @returns {Promise<void>}
+     */
+    _handleGeneralNotification = (webhookUrl, msg) => {
+        const payload = this._notificationPayloadFactory({
+            monitorMessage: msg
+        });
+
+        return this._sendNotification(webhookUrl, payload);
+    };
+
+    _monitorUrlFactory = (monitorJSON) => {
+        let url;
+        switch(monitorJSON["type"]) {
+            case "http":
+            case "keywork":
+                url = monitorJSON["url"];
+                break;
+            case "docker":
+                url = monitorJSON["docker_host"];
+                break;
+            default:
+                url = monitorJSON["hostname"];
+                break;
+        }
+        return url;
+    };
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+
+        try {
+            if (heartbeatJSON == null) {
+                await this._handleGeneralNotification(notification.webhookUrl, msg);
+                return okMsg;
+            }
+
+            const payload = this._notificationPayloadFactory({
+                monitorMessage: heartbeatJSON.msg,
+                monitorName: monitorJSON.name,
+                monitorUrl: this._monitorUrlFactory(monitorJSON),
+                status: heartbeatJSON.status,
+            });
+
+            await this._sendNotification(notification.webhookUrl, payload);
+            return okMsg;
+
+        } catch(error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+}
+
+module.exports = ZohoCliq;
diff --git a/server/notification.js b/server/notification.js
index 9069601b..275f07b9 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -44,6 +44,7 @@ const WeCom = require("./notification-providers/wecom");
 const GoAlert = require("./notification-providers/goalert");
 const SMSManager = require("./notification-providers/smsmanager");
 const ServerChan = require("./notification-providers/serverchan");
+const ZohoCliq = require("./notification-providers/zoho-cliq");
 
 class Notification {
 
@@ -100,6 +101,7 @@ class Notification {
             new Webhook(),
             new WeCom(),
             new GoAlert(),
+            new ZohoCliq()
         ];
 
         for (let item of list) {
diff --git a/src/components/notifications/ZohoCliq.vue b/src/components/notifications/ZohoCliq.vue
new file mode 100644
index 00000000..9a9cd736
--- /dev/null
+++ b/src/components/notifications/ZohoCliq.vue
@@ -0,0 +1,18 @@
+<template>
+    <div class="mb-3">
+        <label for="zcliq-webhookurl" class="form-label">{{ $t("Webhook URL") }}</label>
+        <input
+            id="zcliq-webhookurl"
+            v-model="$parent.notification.webhookUrl"
+            type="text"
+            class="form-control"
+            required
+        />
+        <i18n-t tag="div" keypath="wayToGetZohoCliqURL" class="form-text">
+            <a
+                href="https://www.zoho.com/cliq/help/platform/webhook-tokens.html"
+                target="_blank"
+            >{{ $t("here") }}</a>
+        </i18n-t>
+    </div>
+</template>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 0c220b71..86dad13e 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -42,6 +42,7 @@ import Telegram from "./Telegram.vue";
 import Webhook from "./Webhook.vue";
 import WeCom from "./WeCom.vue";
 import GoAlert from "./GoAlert.vue";
+import ZohoCliq from "./ZohoCliq.vue";
 
 /**
  * Manage all notification form.
@@ -93,6 +94,7 @@ const NotificationFormList = {
     "WeCom": WeCom,
     "GoAlert": GoAlert,
     "ServerChan": ServerChan,
+    "ZohoCliq": ZohoCliq
 };
 
 export default NotificationFormList;
diff --git a/src/languages/el-GR.js b/src/languages/el-GR.js
index c520a607..9b7c4cfb 100644
--- a/src/languages/el-GR.js
+++ b/src/languages/el-GR.js
@@ -194,6 +194,7 @@ export default {
     here: "εδώ",
     Required: "Απαιτείται",
     telegram: "Telegram",
+    "ZohoCliq": "ZohoCliq",
     "Bot Token": "Διακριτικό Bot",
     wayToGetTelegramToken: "Μπορείτε να πάρετε ένα διακριτικό από {0}.",
     "Chat ID": "Chat ID",
@@ -224,6 +225,7 @@ export default {
     teams: "Microsoft Teams",
     "Webhook URL": "Webhook URL",
     wayToGetTeamsURL: "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
+    wayToGetZohoCliqURL: "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
     signal: "Signal",
     Number: "Αριθμός",
     Recipients: "Αποδέκτες",
diff --git a/src/languages/en.js b/src/languages/en.js
index e7de9648..106edf0e 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -209,6 +209,7 @@ export default {
     here: "here",
     Required: "Required",
     telegram: "Telegram",
+    "ZohoCliq": "ZohoCliq",
     "Bot Token": "Bot Token",
     wayToGetTelegramToken: "You can get a token from {0}.",
     "Chat ID": "Chat ID",
@@ -241,6 +242,7 @@ export default {
     teams: "Microsoft Teams",
     "Webhook URL": "Webhook URL",
     wayToGetTeamsURL: "You can learn how to create a webhook URL {0}.",
+    wayToGetZohoCliqURL: "You can learn how to create a webhook URL {0}.",
     signal: "Signal",
     Number: "Number",
     Recipients: "Recipients",
diff --git a/src/languages/eu.js b/src/languages/eu.js
index c99f1eb7..a491c872 100644
--- a/src/languages/eu.js
+++ b/src/languages/eu.js
@@ -191,6 +191,7 @@ export default {
     here: "Hemen",
     Required: "Beharrezkoa",
     telegram: "Telegram",
+    "ZohoCliq": "ZohoCliq",
     "Bot Token": "Bot Tokena",
     wayToGetTelegramToken: "You can get a token from {0}.",
     "Chat ID": "Txat IDa",
@@ -221,6 +222,7 @@ export default {
     teams: "Microsoft Teams",
     "Webhook URL": "Webhook URL",
     wayToGetTeamsURL: "You can learn how to create a webhook URL {0}.",
+    wayToGetZohoCliqURL: "You can learn how to create a webhook URL {0}.",
     signal: "Signal",
     Number: "Zenbakia",
     Recipients: "Recipients",

From 68bc7ac421baf0234ccf51059108dfb3d88cd943 Mon Sep 17 00:00:00 2001
From: panos <panos@netmechanics.gr>
Date: Thu, 8 Dec 2022 13:41:05 +0200
Subject: [PATCH 311/803] zoho cliq code style

---
 server/notification-providers/zoho-cliq.js | 36 ++++++++++------------
 1 file changed, 16 insertions(+), 20 deletions(-)

diff --git a/server/notification-providers/zoho-cliq.js b/server/notification-providers/zoho-cliq.js
index d944089d..61fc68be 100644
--- a/server/notification-providers/zoho-cliq.js
+++ b/server/notification-providers/zoho-cliq.js
@@ -43,8 +43,7 @@ class ZohoCliq extends NotificationProvider {
        monitorMessage,
        monitorName,
        monitorUrl,
-   }) => {
-
+    }) => {
         const payload = ["### Uptime Kuma\n"];
         payload.push(this._statusMessageFactory(status, monitorName));
         payload.push(`*Description:* ${monitorMessage}`);
@@ -74,23 +73,6 @@ class ZohoCliq extends NotificationProvider {
         return this._sendNotification(webhookUrl, payload);
     };
 
-    _monitorUrlFactory = (monitorJSON) => {
-        let url;
-        switch(monitorJSON["type"]) {
-            case "http":
-            case "keywork":
-                url = monitorJSON["url"];
-                break;
-            case "docker":
-                url = monitorJSON["docker_host"];
-                break;
-            default:
-                url = monitorJSON["hostname"];
-                break;
-        }
-        return url;
-    };
-
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
 
@@ -100,10 +82,24 @@ class ZohoCliq extends NotificationProvider {
                 return okMsg;
             }
 
+            let url;
+            switch(monitorJSON["type"]) {
+                case "http":
+                case "keywork":
+                    url = monitorJSON["url"];
+                    break;
+                case "docker":
+                    url = monitorJSON["docker_host"];
+                    break;
+                default:
+                    url = monitorJSON["hostname"];
+                    break;
+            }
+
             const payload = this._notificationPayloadFactory({
                 monitorMessage: heartbeatJSON.msg,
                 monitorName: monitorJSON.name,
-                monitorUrl: this._monitorUrlFactory(monitorJSON),
+                monitorUrl: url,
                 status: heartbeatJSON.status,
             });
 

From 851a04b08215020c1c2d21418189f17c80b5ce44 Mon Sep 17 00:00:00 2001
From: panos <panos@netmechanics.gr>
Date: Thu, 8 Dec 2022 13:53:02 +0200
Subject: [PATCH 312/803] zoho cliq code style

---
 server/notification-providers/zoho-cliq.js | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/server/notification-providers/zoho-cliq.js b/server/notification-providers/zoho-cliq.js
index 61fc68be..b7885be4 100644
--- a/server/notification-providers/zoho-cliq.js
+++ b/server/notification-providers/zoho-cliq.js
@@ -1,6 +1,6 @@
 const NotificationProvider = require("./notification-provider");
 const axios = require("axios");
-const {DOWN, UP} = require("../../src/util");
+const { DOWN, UP } = require("../../src/util");
 
 class ZohoCliq extends NotificationProvider {
 
@@ -44,7 +44,8 @@ class ZohoCliq extends NotificationProvider {
        monitorName,
        monitorUrl,
     }) => {
-        const payload = ["### Uptime Kuma\n"];
+        const payload = [];
+        payload.push("### Uptime Kuma\n");
         payload.push(this._statusMessageFactory(status, monitorName));
         payload.push(`*Description:* ${monitorMessage}`);
 
@@ -83,7 +84,7 @@ class ZohoCliq extends NotificationProvider {
             }
 
             let url;
-            switch(monitorJSON["type"]) {
+            switch (monitorJSON["type"]) {
                 case "http":
                 case "keywork":
                     url = monitorJSON["url"];
@@ -100,7 +101,7 @@ class ZohoCliq extends NotificationProvider {
                 monitorMessage: heartbeatJSON.msg,
                 monitorName: monitorJSON.name,
                 monitorUrl: url,
-                status: heartbeatJSON.status,
+                status: heartbeatJSON.status
             });
 
             await this._sendNotification(notification.webhookUrl, payload);

From 9da28fbbc75b16b0d90dd013057666b20be641c9 Mon Sep 17 00:00:00 2001
From: panos <panos@netmechanics.gr>
Date: Thu, 8 Dec 2022 13:56:02 +0200
Subject: [PATCH 313/803] zoho cliq code style

---
 server/notification-providers/zoho-cliq.js | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/server/notification-providers/zoho-cliq.js b/server/notification-providers/zoho-cliq.js
index b7885be4..749647d0 100644
--- a/server/notification-providers/zoho-cliq.js
+++ b/server/notification-providers/zoho-cliq.js
@@ -26,8 +26,8 @@ class ZohoCliq extends NotificationProvider {
      * @param {string} webhookUrl URL to send the request to
      * @param {Array} payload Payload generated by _notificationPayloadFactory
      */
-    _sendNotification = async(webhookUrl, payload) => {
-        await axios.post(webhookUrl, {text: payload.join("\n")});
+    _sendNotification = async (webhookUrl, payload) => {
+        await axios.post(webhookUrl, { text: payload.join("\n") });
     };
 
     /**
@@ -39,10 +39,10 @@ class ZohoCliq extends NotificationProvider {
      * @returns {Array}
      */
     _notificationPayloadFactory = ({
-       status,
-       monitorMessage,
-       monitorName,
-       monitorUrl,
+        status,
+        monitorMessage,
+        monitorName,
+        monitorUrl,
     }) => {
         const payload = [];
         payload.push("### Uptime Kuma\n");
@@ -107,7 +107,7 @@ class ZohoCliq extends NotificationProvider {
             await this._sendNotification(notification.webhookUrl, payload);
             return okMsg;
 
-        } catch(error) {
+        } catch (error) {
             this.throwGeneralAxiosError(error);
         }
     }

From 4cd5b5563f9fac1d039e3172dd6f3963d5dce5f1 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 8 Dec 2022 23:21:55 +0800
Subject: [PATCH 314/803] Fix #1145

---
 server/model/monitor.js   | 11 ++++++++++-
 server/server.js          |  5 +++++
 src/pages/EditMonitor.vue |  8 +++++---
 src/util.js               |  4 +++-
 src/util.ts               |  3 +++
 5 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 00eb87db..bd059785 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -2,7 +2,7 @@ const https = require("https");
 const dayjs = require("dayjs");
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
-const { log, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger } = require("../../src/util");
+const { log, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND } = require("../../src/util");
 const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery } = require("../util-server");
 const { R } = require("redbean-node");
 const { BeanModel } = require("redbean-node/dist/bean-model");
@@ -1189,6 +1189,15 @@ class Monitor extends BeanModel {
             LIMIT 1`, [ monitorID ]);
         return maintenance.count !== 0;
     }
+
+    validate() {
+        if (this.interval > MAX_INTERVAL_SECOND) {
+            throw new Error(`Interval cannot be more than ${MAX_INTERVAL_SECOND} seconds`);
+        }
+        if (this.interval < MIN_INTERVAL_SECOND) {
+            throw new Error(`Interval cannot be less than ${MIN_INTERVAL_SECOND} seconds`);
+        }
+    }
 }
 
 module.exports = Monitor;
diff --git a/server/server.js b/server/server.js
index 78f98910..0bb894f8 100644
--- a/server/server.js
+++ b/server/server.js
@@ -632,6 +632,9 @@ let needSetup = false;
 
                 bean.import(monitor);
                 bean.user_id = socket.userID;
+
+                bean.validate();
+
                 await R.store(bean);
 
                 await updateMonitorNotification(bean.id, notificationIDList);
@@ -719,6 +722,8 @@ let needSetup = false;
                 bean.radiusCallingStationId = monitor.radiusCallingStationId;
                 bean.radiusSecret = monitor.radiusSecret;
 
+                bean.validate();
+
                 await R.store(bean);
 
                 await updateMonitorNotification(bean.id, monitor.notificationIDList);
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 5a821508..bce74644 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -271,7 +271,7 @@
                             <!-- Interval -->
                             <div class="my-3">
                                 <label for="interval" class="form-label">{{ $t("Heartbeat Interval") }} ({{ $t("checkEverySecond", [ monitor.interval ]) }})</label>
-                                <input id="interval" v-model="monitor.interval" type="number" class="form-control" required min="20" step="1">
+                                <input id="interval" v-model="monitor.interval" type="number" class="form-control" required :min="minInterval" step="1" :max="maxInterval">
                             </div>
 
                             <div class="my-3">
@@ -287,7 +287,7 @@
                                     {{ $t("Heartbeat Retry Interval") }}
                                     <span>({{ $t("retryCheckEverySecond", [ monitor.retryInterval ]) }})</span>
                                 </label>
-                                <input id="retry-interval" v-model="monitor.retryInterval" type="number" class="form-control" required min="20" step="1">
+                                <input id="retry-interval" v-model="monitor.retryInterval" type="number" class="form-control" required :min="minInterval" step="1">
                             </div>
 
                             <div class="my-3">
@@ -575,7 +575,7 @@ import NotificationDialog from "../components/NotificationDialog.vue";
 import DockerHostDialog from "../components/DockerHostDialog.vue";
 import ProxyDialog from "../components/ProxyDialog.vue";
 import TagsManager from "../components/TagsManager.vue";
-import { genSecret, isDev } from "../util.ts";
+import { genSecret, isDev, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND } from "../util.ts";
 
 const toast = useToast();
 
@@ -591,6 +591,8 @@ export default {
 
     data() {
         return {
+            minInterval: MIN_INTERVAL_SECOND,
+            maxInterval: MAX_INTERVAL_SECOND,
             processing: false,
             monitor: {
                 notificationIDList: {},
diff --git a/src/util.js b/src/util.js
index 9cdecc17..2c01120b 100644
--- a/src/util.js
+++ b/src/util.js
@@ -7,7 +7,7 @@
 // Backend uses the compiled file util.js
 // Frontend uses util.ts
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.localToUTC = exports.utcToLocal = exports.utcToISODateTime = exports.isoToUTCDateTime = exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.SQL_DATETIME_FORMAT_WITHOUT_SECOND = exports.SQL_DATETIME_FORMAT = exports.SQL_DATE_FORMAT = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
+exports.localToUTC = exports.utcToLocal = exports.utcToISODateTime = exports.isoToUTCDateTime = exports.parseTimeFromTimeObject = exports.parseTimeObject = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.MIN_INTERVAL_SECOND = exports.MAX_INTERVAL_SECOND = exports.SQL_DATETIME_FORMAT_WITHOUT_SECOND = exports.SQL_DATETIME_FORMAT = exports.SQL_DATE_FORMAT = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
 const dayjs = require("dayjs");
 exports.isDev = process.env.NODE_ENV === "development";
 exports.appName = "Uptime Kuma";
@@ -22,6 +22,8 @@ exports.STATUS_PAGE_MAINTENANCE = 3;
 exports.SQL_DATE_FORMAT = "YYYY-MM-DD";
 exports.SQL_DATETIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
 exports.SQL_DATETIME_FORMAT_WITHOUT_SECOND = "YYYY-MM-DD HH:mm";
+exports.MAX_INTERVAL_SECOND = 2073600; // 24 days
+exports.MIN_INTERVAL_SECOND = 20; // 20 seconds
 /** Flip the status of s */
 function flipStatus(s) {
     if (s === exports.UP) {
diff --git a/src/util.ts b/src/util.ts
index fd2b466b..726a7da3 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -26,6 +26,9 @@ export const SQL_DATE_FORMAT = "YYYY-MM-DD";
 export const SQL_DATETIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
 export const SQL_DATETIME_FORMAT_WITHOUT_SECOND = "YYYY-MM-DD HH:mm";
 
+export const MAX_INTERVAL_SECOND = 2073600; // 24 days
+export const MIN_INTERVAL_SECOND = 20; // 20 seconds
+
 /** Flip the status of s */
 export function flipStatus(s: number) {
     if (s === UP) {

From 02b5cae577ea94816cd393dac8ccbe15260b0f66 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 9 Dec 2022 21:03:12 +0800
Subject: [PATCH 315/803] Fix #2371 by left join maintenance_timeslot

---
 server/model/maintenance.js | 24 +++++++++++++-----------
 server/model/status_page.js | 12 +++++++-----
 2 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index 35030801..d9be3427 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -188,13 +188,13 @@ class Maintenance extends BeanModel {
      */
     static getActiveMaintenanceSQLCondition() {
         return `
-
-            (maintenance_timeslot.start_date <= DATETIME('now')
-            AND maintenance_timeslot.end_date >= DATETIME('now')
-            AND maintenance.active = 1)
-            OR
-            (maintenance.strategy = 'manual' AND active = 1)
-
+            (
+                (maintenance_timeslot.start_date <= DATETIME('now')
+                AND maintenance_timeslot.end_date >= DATETIME('now')
+                AND maintenance.active = 1)
+                OR
+                (maintenance.strategy = 'manual' AND active = 1)
+            )
         `;
     }
 
@@ -204,10 +204,12 @@ class Maintenance extends BeanModel {
      */
     static getActiveAndFutureMaintenanceSQLCondition() {
         return `
-            ((maintenance_timeslot.end_date >= DATETIME('now')
-            AND maintenance.active = 1)
-            OR
-            (maintenance.strategy = 'manual' AND active = 1))
+            (
+                ((maintenance_timeslot.end_date >= DATETIME('now')
+                AND maintenance.active = 1)
+                OR
+                (maintenance.strategy = 'manual' AND active = 1))
+            )
         `;
     }
 }
diff --git a/server/model/status_page.js b/server/model/status_page.js
index fbbff391..80b57699 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -282,11 +282,13 @@ class StatusPage extends BeanModel {
             let activeCondition = Maintenance.getActiveMaintenanceSQLCondition();
             let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
                 SELECT maintenance.*
-                FROM maintenance, maintenance_status_page msp, maintenance_timeslot
-                WHERE msp.maintenance_id = maintenance.id
-                    AND maintenance_timeslot.maintenance_id = maintenance.id
-                    AND msp.status_page_id = ?
-                    AND ${activeCondition}
+                FROM maintenance
+                JOIN maintenance_status_page
+                    ON maintenance_status_page.maintenance_id = maintenance.id
+                    AND maintenance_status_page.status_page_id = ?
+                LEFT JOIN maintenance_timeslot
+                    ON maintenance_timeslot.maintenance_id = maintenance.id
+                WHERE ${activeCondition}
                 ORDER BY maintenance.end_date
             `, [ statusPageId ]));
 

From 5176fd02c13c5cc2f4a76f7422dac3af0f338f7f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 10 Dec 2022 23:30:32 +0800
Subject: [PATCH 316/803] Fix healthcheck do not check https

---
 .editorconfig        | 3 +++
 extra/healthcheck.go | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/.editorconfig b/.editorconfig
index 3b272193..47bf4768 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -19,3 +19,6 @@ indent_size = 2
 
 [*.vue]
 trim_trailing_whitespace = false
+
+[*.go]
+indent_style = tab
diff --git a/extra/healthcheck.go b/extra/healthcheck.go
index 9d277549..779b1583 100644
--- a/extra/healthcheck.go
+++ b/extra/healthcheck.go
@@ -49,7 +49,7 @@ func main() {
 	}
 
 	protocol := ""
-	if len(sslKey) != 0 && len(sslCert) == 0 {
+	if len(sslKey) != 0 && len(sslCert) != 0 {
 		protocol = "https"
 	} else {
 		protocol = "http"

From ab5f6dc82c6c3f98bc85be619f822e8776150c9b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 11 Dec 2022 18:52:24 +0800
Subject: [PATCH 317/803] Fix css

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

diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index 7b821e13..115660a5 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -213,7 +213,7 @@ export default {
         transition: all ease-in-out 0.1s;
 
         &:hover {
-            color: white;
+            opacity: 0.5;
         }
     }
 }

From bc86f8bb5fe32a65af2123fe19b559069637578b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 11 Dec 2022 20:25:15 +0800
Subject: [PATCH 318/803] Reset busy_timeout to default

---
 server/database.js | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/server/database.js b/server/database.js
index 8bcce24f..2544f197 100644
--- a/server/database.js
+++ b/server/database.js
@@ -152,9 +152,6 @@ class Database {
         await R.exec("PRAGMA cache_size = -12000");
         await R.exec("PRAGMA auto_vacuum = FULL");
 
-        // Avoid error "SQLITE_BUSY: database is locked" by allowing SQLITE to wait up to 5 seconds to do a write
-        await R.exec("PRAGMA busy_timeout = 5000");
-
         // This ensures that an operating system crash or power failure will not corrupt the database.
         // FULL synchronous is very safe, but it is also slower.
         // Read more: https://sqlite.org/pragma.html#pragma_synchronous

From 3b58fd3b3c9dc1cc3b6a3f0a37779174a898cf2b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 11 Dec 2022 21:33:26 +0800
Subject: [PATCH 319/803] Cache uptime

---
 server/model/monitor.js     | 15 +++++++++++++-
 server/uptime-cache-list.js | 39 +++++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 server/uptime-cache-list.js

diff --git a/server/model/monitor.js b/server/model/monitor.js
index bd059785..6c6ccbcc 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -15,6 +15,7 @@ const { UptimeKumaServer } = require("../uptime-kuma-server");
 const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
 const { DockerHost } = require("../docker");
 const Maintenance = require("./maintenance");
+const { UptimeCacheList } = require("../uptime-cache-list");
 
 /**
  * status:
@@ -714,6 +715,7 @@ class Monitor extends BeanModel {
             }
 
             log.debug("monitor", `[${this.name}] Send to socket`);
+            UptimeCacheList.clearCache(this.id);
             io.to(this.user_id).emit("heartbeat", bean.toJSON());
             Monitor.sendStats(io, this.id, this.user_id);
 
@@ -898,7 +900,15 @@ class Monitor extends BeanModel {
      * @param {number} duration Hours
      * @param {number} monitorID ID of monitor to calculate
      */
-    static async calcUptime(duration, monitorID) {
+    static async calcUptime(duration, monitorID, forceNoCache = false) {
+
+        if (!forceNoCache) {
+            let cachedUptime = UptimeCacheList.getUptime(monitorID, duration);
+            if (cachedUptime != null) {
+                return cachedUptime;
+            }
+        }
+
         const timeLogger = new TimeLogger();
 
         const startTime = R.isoDateTime(dayjs.utc().subtract(duration, "hour"));
@@ -957,6 +967,9 @@ class Monitor extends BeanModel {
             }
         }
 
+        // Cache
+        UptimeCacheList.addUptime(monitorID, duration, uptime);
+
         return uptime;
     }
 
diff --git a/server/uptime-cache-list.js b/server/uptime-cache-list.js
new file mode 100644
index 00000000..1347968f
--- /dev/null
+++ b/server/uptime-cache-list.js
@@ -0,0 +1,39 @@
+const { log } = require("../src/util");
+class UptimeCacheList {
+    /**
+     * list[monitorID][duration]
+     */
+    static list = {};
+
+    /**
+     *
+     * @param monitorID
+     * @param duration
+     * @return number
+     */
+    static getUptime(monitorID, duration) {
+        if (UptimeCacheList.list[monitorID] && UptimeCacheList.list[monitorID][duration]) {
+            log.debug("UptimeCacheList", "getUptime: " + monitorID + " " + duration);
+            return UptimeCacheList.list[monitorID][duration];
+        } else {
+            return null;
+        }
+    }
+
+    static addUptime(monitorID, duration, uptime) {
+        log.debug("UptimeCacheList", "addUptime: " + monitorID + " " + duration);
+        if (!UptimeCacheList.list[monitorID]) {
+            UptimeCacheList.list[monitorID] = {};
+        }
+        UptimeCacheList.list[monitorID][duration] = uptime;
+    }
+
+    static clearCache(monitorID) {
+        log.debug("UptimeCacheList", "clearCache: " + monitorID);
+        delete UptimeCacheList.list[monitorID];
+    }
+}
+
+module.exports = {
+    UptimeCacheList,
+};

From 3040bd41d9eb72da25fd89030fa9a7a0765ebc35 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 12 Dec 2022 15:42:00 +0800
Subject: [PATCH 320/803] Speed up armv7 build time of healthcheck by using go
 compiler cross-build feature in the host

---
 .dockerignore              |  3 +++
 .gitignore                 |  1 +
 docker/dockerfile          | 18 +++++++++++-------
 extra/build-healthcheck.js | 27 +++++++++++++++++++++++++++
 package.json               |  3 ++-
 5 files changed, 44 insertions(+), 8 deletions(-)
 create mode 100644 extra/build-healthcheck.js

diff --git a/.dockerignore b/.dockerignore
index babc429a..47e82a10 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -31,6 +31,9 @@ tsconfig.json
 /tmp
 /babel.config.js
 /ecosystem.config.js
+/extra/healthcheck.exe
+/extra/healthcheck
+
 
 ### .gitignore content (commented rules are duplicated)
 
diff --git a/.gitignore b/.gitignore
index 78e1a965..06dca04b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,4 @@ cypress/screenshots
 
 /extra/healthcheck.exe
 /extra/healthcheck
+/extra/healthcheck-armv7
diff --git a/docker/dockerfile b/docker/dockerfile
index 6657e681..e084d649 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -1,15 +1,19 @@
 ############################################
 # Build in Golang
-# Super slow for armv7 (compile time = 1200 seconds, but other platforms within 5 seconds).
-# Do not change everything here, so it should always use the cache.
+# Run npm run build-healthcheck-armv7 in the host first, another it will be super slow where it is building the armv7 healthcheck
 ############################################
 FROM golang:1.19.4-buster AS build_healthcheck
 WORKDIR /app
-
-COPY ./extra/healthcheck.go ./extra/healthcheck.go
+ARG TARGETPLATFORM
+COPY ./extra/ ./extra/
 
 # Compile healthcheck.go
-RUN go build -x -o ./extra/healthcheck ./extra/healthcheck.go
+RUN apt update
+RUN apt --yes --no-install-recommends install curl
+RUN curl -sL https://deb.nodesource.com/setup_18.x | bash
+RUN apt --yes --no-install-recommends install nodejs
+RUN node -v
+RUN node ./extra/build-healthcheck.js $TARGETPLATFORM
 
 ############################################
 # Build in Node.js
@@ -18,8 +22,8 @@ FROM louislam/uptime-kuma:base-debian AS build
 WORKDIR /app
 
 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
-
 COPY . .
+COPY --from=build_healthcheck /app/extra/healthcheck /app/extra/healthcheck
 RUN npm ci --production && \
     chmod +x /app/extra/entrypoint.sh
 
@@ -31,7 +35,7 @@ WORKDIR /app
 
 # Copy app files from build layer
 COPY --from=build /app /app
-COPY --from=build_healthcheck /app/extra/healthcheck /app/extra/healthcheck
+
 
 EXPOSE 3001
 VOLUME ["/app/data"]
diff --git a/extra/build-healthcheck.js b/extra/build-healthcheck.js
new file mode 100644
index 00000000..e4c8026a
--- /dev/null
+++ b/extra/build-healthcheck.js
@@ -0,0 +1,27 @@
+const childProcess = require("child_process");
+const fs = require("fs");
+const platform = process.argv[2];
+
+if (!platform) {
+    console.error("No platform??");
+    process.exit(1);
+}
+
+if (platform === "linux/arm/v7") {
+    console.log("Arch: armv7");
+    if (fs.existsSync("./extra/healthcheck-armv7")) {
+        fs.renameSync("./extra/healthcheck-armv7", "./extra/healthcheck");
+        console.log("Already built in the host, skip.");
+        process.exit(0);
+    } else {
+        console.log("prebuilt not found, it will be slow! You should execute `npm run build-healthcheck-armv7` before build.");
+    }
+} else {
+    if (fs.existsSync("./extra/healthcheck-armv7")) {
+        fs.rmSync("./extra/healthcheck-armv7");
+    }
+}
+
+const output = childProcess.execSync("go build -x -o ./extra/healthcheck ./extra/healthcheck.go").toString("utf8");
+console.log(output);
+
diff --git a/package.json b/package.json
index f43c21d4..0a0a7aed 100644
--- a/package.json
+++ b/package.json
@@ -60,7 +60,8 @@
         "start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev",
         "cy:test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --e2e",
         "cy:run": "npx cypress run --browser chrome --headless --config-file ./config/cypress.config.js",
-        "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\""
+        "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\"",
+        "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go"
     },
     "dependencies": {
         "@grpc/grpc-js": "~1.7.3",

From 5c5a339a36032f5cd287de6f8b1f11afec00b44f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 12 Dec 2022 15:54:46 +0800
Subject: [PATCH 321/803] Add links for status pages and maintenance for mobile
 (Fix #2257)

---
 src/layouts/Layout.vue |  2 +-
 src/pages/Settings.vue | 13 +++++++++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index d13e8a8d..d8e96aa8 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -93,7 +93,7 @@
         <nav v-if="$root.isMobile && $root.loggedIn" class="bottom-nav">
             <router-link to="/dashboard" class="nav-link">
                 <div><font-awesome-icon icon="tachometer-alt" /></div>
-                {{ $t("Dashboard") }}
+                {{ $t("Home") }}
             </router-link>
 
             <router-link to="/list" class="nav-link">
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index efd26ce3..bd5a9552 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -1,10 +1,19 @@
 <template>
     <div>
+        <div v-if="$root.isMobile" class="shadow-box mb-3">
+            <router-link to="/manage-status-page" class="nav-link">
+                <font-awesome-icon icon="stream" /> {{ $t("Status Pages") }}
+            </router-link>
+            <router-link to="/maintenance" class="nav-link">
+                <font-awesome-icon icon="wrench" /> {{ $t("Maintenance") }}
+            </router-link>
+        </div>
+
         <h1 v-show="show" class="mb-3">
             {{ $t("Settings") }}
         </h1>
 
-        <div class="shadow-box">
+        <div class="shadow-box shadow-box-settings">
             <div class="row">
                 <div v-if="showSubMenu" class="settings-menu col-lg-3 col-md-5">
                     <router-link
@@ -192,7 +201,7 @@ export default {
 <style lang="scss" scoped>
 @import "../assets/vars.scss";
 
-.shadow-box {
+.shadow-box-settings {
     padding: 20px;
     min-height: calc(100vh - 155px);
 }

From e6dc0a029376128e36d7f61c8e6a324f0bb71139 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 12 Dec 2022 16:06:17 +0800
Subject: [PATCH 322/803] Slightly improve maintenance page's css on mobile

---
 src/pages/ManageMaintenance.vue | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index 9ded0459..dd36c950 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -185,6 +185,14 @@ export default {
 <style lang="scss" scoped>
     @import "../assets/vars.scss";
 
+    .mobile {
+        .item {
+            flex-direction: column;
+            align-items: flex-start;
+            margin-bottom: 20px;
+        }
+    }
+
     .item {
         display: flex;
         align-items: center;
@@ -267,6 +275,11 @@ export default {
         .buttons {
             display: flex;
             gap: 8px;
+            flex-direction: row-reverse;
+
+            .btn-group {
+                width: 310px;
+            }
         }
     }
 

From 3b87209e2690abc84bebf140abbcf7b371aed479 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 12 Dec 2022 17:19:22 +0800
Subject: [PATCH 323/803] Add configurable dns cache

---
 server/cacheable-dns-http-agent.js  | 36 +++++++++++++++++++++++---
 server/server.js                    |  3 +++
 server/uptime-kuma-server.js        |  4 +--
 src/components/settings/General.vue | 40 +++++++++++++++++++++++++++++
 src/languages/en.js                 |  4 +++
 src/languages/zh-HK.js              |  3 +++
 src/pages/Settings.vue              |  4 +++
 src/util.js                         |  2 +-
 src/util.ts                         |  2 +-
 9 files changed, 90 insertions(+), 8 deletions(-)

diff --git a/server/cacheable-dns-http-agent.js b/server/cacheable-dns-http-agent.js
index 56e8430e..30136791 100644
--- a/server/cacheable-dns-http-agent.js
+++ b/server/cacheable-dns-http-agent.js
@@ -1,6 +1,8 @@
 const https = require("https");
 const http = require("http");
 const CacheableLookup = require("cacheable-lookup");
+const { Settings } = require("./settings");
+const { log } = require("../src/util");
 
 class CacheableDnsHttpAgent {
 
@@ -9,12 +11,30 @@ class CacheableDnsHttpAgent {
     static httpAgentList = {};
     static httpsAgentList = {};
 
+    static enable = false;
+
     /**
-     * Register cacheable to global agents
+     * Register/Disable cacheable to global agents
      */
-    static registerGlobalAgent() {
-        this.cacheable.install(http.globalAgent);
-        this.cacheable.install(https.globalAgent);
+    static async update() {
+        log.debug("CacheableDnsHttpAgent", "update");
+        let isEnable = await Settings.get("dnsCache");
+
+        if (isEnable !== this.enable) {
+            log.debug("CacheableDnsHttpAgent", "value changed");
+
+            if (isEnable) {
+                log.debug("CacheableDnsHttpAgent", "enable");
+                this.cacheable.install(http.globalAgent);
+                this.cacheable.install(https.globalAgent);
+            } else {
+                log.debug("CacheableDnsHttpAgent", "disable");
+                this.cacheable.uninstall(http.globalAgent);
+                this.cacheable.uninstall(https.globalAgent);
+            }
+        }
+
+        this.enable = isEnable;
     }
 
     static install(agent) {
@@ -26,6 +46,10 @@ class CacheableDnsHttpAgent {
      * @return {https.Agent}
      */
     static getHttpsAgent(agentOptions) {
+        if (!this.enable) {
+            return new https.Agent(agentOptions);
+        }
+
         let key = JSON.stringify(agentOptions);
         if (!(key in this.httpsAgentList)) {
             this.httpsAgentList[key] = new https.Agent(agentOptions);
@@ -39,6 +63,10 @@ class CacheableDnsHttpAgent {
      * @return {https.Agents}
      */
     static getHttpAgent(agentOptions) {
+        if (!this.enable) {
+            return new http.Agent(agentOptions);
+        }
+
         let key = JSON.stringify(agentOptions);
         if (!(key in this.httpAgentList)) {
             this.httpAgentList[key] = new http.Agent(agentOptions);
diff --git a/server/server.js b/server/server.js
index 0bb894f8..cdfe18de 100644
--- a/server/server.js
+++ b/server/server.js
@@ -136,6 +136,7 @@ const { proxySocketHandler } = require("./socket-handlers/proxy-socket-handler")
 const { dockerSocketHandler } = require("./socket-handlers/docker-socket-handler");
 const { maintenanceSocketHandler } = require("./socket-handlers/maintenance-socket-handler");
 const { Settings } = require("./settings");
+const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
 
 app.use(express.json());
 
@@ -1114,6 +1115,8 @@ let needSetup = false;
                 await setSettings("general", data);
                 server.entryPage = data.entryPage;
 
+                await CacheableDnsHttpAgent.update();
+
                 // Also need to apply timezone globally
                 if (data.serverTimezone) {
                     await server.setTimezone(data.serverTimezone);
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 078cc31d..06237562 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -83,12 +83,12 @@ class UptimeKumaServer {
             }
         }
 
-        CacheableDnsHttpAgent.registerGlobalAgent();
-
         this.io = new Server(this.httpServer);
     }
 
     async initAfterDatabaseReady() {
+        await CacheableDnsHttpAgent.update();
+
         process.env.TZ = await this.getTimezone();
         dayjs.tz.setDefault(process.env.TZ);
         log.debug("DEBUG", "Timezone: " + process.env.TZ);
diff --git a/src/components/settings/General.vue b/src/components/settings/General.vue
index 612ed802..8a734ab2 100644
--- a/src/components/settings/General.vue
+++ b/src/components/settings/General.vue
@@ -150,6 +150,46 @@
                 </div>
             </div>
 
+            <!-- Search Engine -->
+            <div class="mb-4">
+                <label class="form-label">
+                    {{ $t("Enable DNS Cache") }}
+                    <div class="form-text">
+                        ⚠️ {{ $t("dnsCacheDescription") }}
+                    </div>
+                </label>
+
+                <div class="form-check">
+                    <input
+                        id="dnsCacheEnable"
+                        v-model="settings.dnsCache"
+                        class="form-check-input"
+                        type="radio"
+                        name="flexRadioDefault"
+                        :value="true"
+                        required
+                    />
+                    <label class="form-check-label" for="dnsCacheEnable">
+                        {{ $t("Enable") }}
+                    </label>
+                </div>
+
+                <div class="form-check">
+                    <input
+                        id="dnsCacheDisable"
+                        v-model="settings.dnsCache"
+                        class="form-check-input"
+                        type="radio"
+                        name="flexRadioDefault"
+                        :value="false"
+                        required
+                    />
+                    <label class="form-check-label" for="dnsCacheDisable">
+                        {{ $t("Disable") }}
+                    </label>
+                </div>
+            </div>
+
             <!-- Save Button -->
             <div>
                 <button class="btn btn-primary" type="submit">
diff --git a/src/languages/en.js b/src/languages/en.js
index e7de9648..def764bf 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -646,4 +646,8 @@ export default {
     "Server Timezone": "Server Timezone",
     statusPageMaintenanceEndDate: "End",
     IconUrl: "Icon URL",
+    "Enable DNS Cache": "Enable DNS Cache",
+    "Enable": "Enable",
+    "Disable": "Disable",
+    dnsCacheDescription: "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
 };
diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js
index cd82be84..6a57b459 100644
--- a/src/languages/zh-HK.js
+++ b/src/languages/zh-HK.js
@@ -382,4 +382,7 @@ export default {
     setAsDefaultProxyDescription: "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
     Maintenance: "維護",
     statusMaintenance: "維護中",
+    "Enable DNS Cache": "啟用 DNS 快取",
+    "Enable": "啟用",
+    "Disable": "停用",
 };
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index bd5a9552..87404968 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -157,6 +157,10 @@ export default {
                     this.settings.entryPage = "dashboard";
                 }
 
+                if (this.settings.dnsCache === undefined) {
+                    this.settings.dnsCache = false;
+                }
+
                 if (this.settings.keepDataPeriodDays === undefined) {
                     this.settings.keepDataPeriodDays = 180;
                 }
diff --git a/src/util.js b/src/util.js
index 2c01120b..f157e9e9 100644
--- a/src/util.js
+++ b/src/util.js
@@ -101,7 +101,7 @@ class Logger {
      * @param level Log level. One of INFO, WARN, ERROR, DEBUG or can be customized.
      */
     log(module, msg, level) {
-        if (this.hideLog[level] && this.hideLog[level].includes(module)) {
+        if (this.hideLog[level] && this.hideLog[level].includes(module.toLowerCase())) {
             return;
         }
         module = module.toUpperCase();
diff --git a/src/util.ts b/src/util.ts
index 726a7da3..6d3aabeb 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -115,7 +115,7 @@ class Logger {
      * @param level Log level. One of INFO, WARN, ERROR, DEBUG or can be customized.
      */
     log(module: string, msg: any, level: string) {
-        if (this.hideLog[level] && this.hideLog[level].includes(module)) {
+        if (this.hideLog[level] && this.hideLog[level].includes(module.toLowerCase())) {
             return;
         }
 

From 39987ba9acecf787a1e627eca63008e85c5ea876 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 12 Dec 2022 22:57:57 +0800
Subject: [PATCH 324/803] Init server timezone

---
 server/server.js                               |  9 +++++++++
 .../socket-handlers/general-socket-handler.js  | 18 ++++++++++++++++++
 src/mixins/socket.js                           |  5 +++++
 3 files changed, 32 insertions(+)
 create mode 100644 server/socket-handlers/general-socket-handler.js

diff --git a/server/server.js b/server/server.js
index cdfe18de..5e4ff2b9 100644
--- a/server/server.js
+++ b/server/server.js
@@ -135,6 +135,7 @@ const { cloudflaredSocketHandler, autoStart: cloudflaredAutoStart, stop: cloudfl
 const { proxySocketHandler } = require("./socket-handlers/proxy-socket-handler");
 const { dockerSocketHandler } = require("./socket-handlers/docker-socket-handler");
 const { maintenanceSocketHandler } = require("./socket-handlers/maintenance-socket-handler");
+const { generalSocketHandler } = require("./socket-handlers/general-socket-handler");
 const { Settings } = require("./settings");
 const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
 
@@ -1488,6 +1489,7 @@ let needSetup = false;
         proxySocketHandler(socket);
         dockerSocketHandler(socket);
         maintenanceSocketHandler(socket);
+        generalSocketHandler(socket, server);
 
         log.debug("server", "added all socket handlers");
 
@@ -1610,6 +1612,13 @@ async function afterLogin(socket, user) {
     for (let monitorID in monitorList) {
         await Monitor.sendStats(io, monitorID, user.id);
     }
+
+    // Set server timezone from client browser if not set
+    // It should be run once only
+    if (! await Settings.get("initServerTimezone")) {
+        log.debug("server", "emit initServerTimezone");
+        socket.emit("initServerTimezone");
+    }
 }
 
 /**
diff --git a/server/socket-handlers/general-socket-handler.js b/server/socket-handlers/general-socket-handler.js
new file mode 100644
index 00000000..a0239733
--- /dev/null
+++ b/server/socket-handlers/general-socket-handler.js
@@ -0,0 +1,18 @@
+const { log } = require("../../src/util");
+const { Settings } = require("../settings");
+const { sendInfo } = require("../client");
+
+module.exports.generalSocketHandler = (socket, server) => {
+
+    socket.on("initServerTimezone", async (timezone) => {
+        try {
+            log.debug("generalSocketHandler", "Timezone: " + timezone);
+            await Settings.set("initServerTimezone", true);
+            await server.setTimezone(timezone);
+            await sendInfo(socket);
+        } catch (e) {
+
+        }
+    });
+
+};
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index ef18a6e9..7e3be52c 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -2,6 +2,7 @@ import { io } from "socket.io-client";
 import { useToast } from "vue-toastification";
 import jwtDecode from "jwt-decode";
 import Favico from "favico.js";
+import dayjs from "dayjs";
 const toast = useToast();
 
 let socket;
@@ -271,6 +272,10 @@ export default {
             socket.on("cloudflared_message", (res) => this.cloudflared.message = res);
             socket.on("cloudflared_errorMessage", (res) => this.cloudflared.errorMessage = res);
             socket.on("cloudflared_token", (res) => this.cloudflared.cloudflareTunnelToken = res);
+
+            socket.on("initServerTimezone", () => {
+                socket.emit("initServerTimezone", dayjs.tz.guess());
+            });
         },
 
         /**

From f32441e2f65827b9263a13f5692fdf247d9a9f61 Mon Sep 17 00:00:00 2001
From: zImPatrick <23613354+zImPatrick@users.noreply.github.com>
Date: Mon, 12 Dec 2022 17:58:11 +0100
Subject: [PATCH 325/803] fix discord notification not sending when docker
 container is down

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

diff --git a/server/notification-providers/discord.js b/server/notification-providers/discord.js
index 28ead7b7..ac5c8ae8 100644
--- a/server/notification-providers/discord.js
+++ b/server/notification-providers/discord.js
@@ -64,7 +64,7 @@ class Discord extends NotificationProvider {
                             },
                             {
                                 name: "Error",
-                                value: heartbeatJSON["msg"],
+                                value: heartbeatJSON["msg"] == null ? "N/A" : heartbeatJSON["msg"],
                             },
                         ],
                     }],

From 466b403a96917b4363f82fa9bf8244ff0a079ff2 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 13 Dec 2022 02:21:12 +0800
Subject: [PATCH 326/803] Handle unexpected error of checkCertificate

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

diff --git a/server/util-server.js b/server/util-server.js
index c1bae84f..0bf69133 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -470,6 +470,10 @@ const parseCertificateInfo = function (info) {
  * @returns {Object} Object containing certificate information
  */
 exports.checkCertificate = function (res) {
+    if (!res.request.res.socket) {
+        throw new Error("No socket found");
+    }
+
     const info = res.request.res.socket.getPeerCertificate(true);
     const valid = res.request.res.socket.authorized || false;
 

From aa784fb3b2cde8d9d706ca781c82df4340ca089f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 13 Dec 2022 16:48:23 +0800
Subject: [PATCH 327/803] Fix #2394

---
 src/components/settings/General.vue | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/components/settings/General.vue b/src/components/settings/General.vue
index 8a734ab2..1f696415 100644
--- a/src/components/settings/General.vue
+++ b/src/components/settings/General.vue
@@ -49,7 +49,7 @@
                         v-model="settings.searchEngineIndex"
                         class="form-check-input"
                         type="radio"
-                        name="flexRadioDefault"
+                        name="searchEngineIndex"
                         :value="true"
                         required
                     />
@@ -63,7 +63,7 @@
                         v-model="settings.searchEngineIndex"
                         class="form-check-input"
                         type="radio"
-                        name="flexRadioDefault"
+                        name="searchEngineIndex"
                         :value="false"
                         required
                     />
@@ -150,7 +150,7 @@
                 </div>
             </div>
 
-            <!-- Search Engine -->
+            <!-- DNS Cache -->
             <div class="mb-4">
                 <label class="form-label">
                     {{ $t("Enable DNS Cache") }}
@@ -165,7 +165,7 @@
                         v-model="settings.dnsCache"
                         class="form-check-input"
                         type="radio"
-                        name="flexRadioDefault"
+                        name="dnsCache"
                         :value="true"
                         required
                     />
@@ -180,7 +180,7 @@
                         v-model="settings.dnsCache"
                         class="form-check-input"
                         type="radio"
-                        name="flexRadioDefault"
+                        name="dnsCache"
                         :value="false"
                         required
                     />

From 4862bec965ea3ac61665a749d784007471055bde Mon Sep 17 00:00:00 2001
From: Cyril59310 <70776486+cyril59310@users.noreply.github.com>
Date: Tue, 13 Dec 2022 15:00:54 +0100
Subject: [PATCH 328/803] Update Fr language + added variable for missing
 translation (#2395)

* Update FR language
---
 src/components/notifications/SMSManager.vue |  8 ++--
 src/languages/fr-FR.js                      | 41 +++++++++++++++++++--
 src/pages/EditMonitor.vue                   |  6 +--
 3 files changed, 44 insertions(+), 11 deletions(-)

diff --git a/src/components/notifications/SMSManager.vue b/src/components/notifications/SMSManager.vue
index 1be952ae..00be2fa7 100644
--- a/src/components/notifications/SMSManager.vue
+++ b/src/components/notifications/SMSManager.vue
@@ -1,6 +1,6 @@
 <template>
     <div class="mb-3">
-        <label for="smsmanager-key" class="form-label">API Key</label>
+        <label for="smsmanager-key" class="form-label">{{ $t("API Key") }}</label>
         <div class="form-text">
             {{ $t("SMSManager API Docs") }}
             <a href="https://smsmanager.cz/api/http#send" target="_blank">{{ $t("here") }}</a>
@@ -17,9 +17,9 @@
     <div class="mb-3">
         <label for="smsmanager-messageType" class="form-label">{{ $t("Gateway Type") }}</label>
         <select id="smsmanager-messageType" v-model="$parent.notification.messageType" class="form-select">
-            <option value="economy">Economy</option>
-            <option value="lowcost">Lowcost</option>
-            <option value="high" selected>High</option>
+            <option value="economy">{{ $t("Economy") }}</option>
+            <option value="lowcost">{{ $t("Lowcost") }}</option>
+            <option value="high" selected>{{ $t("High") }}</option>
         </select>
     </div>
     <div class="mb-3">
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 034a69ba..e3c2d133 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -334,10 +334,10 @@ export default {
     Security: "Sécurité",
     "Steam API Key": "Clé API Steam",
     "Shrink Database": "Réduire la base de données",
-    "Pick a RR-Type...": "Pick a RR-Type...",
-    "Pick Accepted Status Codes...": "Pick Accepted Status Codes...",
+    "Pick a RR-Type...": "Choisissez un type d'enregistrement...",
+    "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés...",
     Default: "Défaut",
-    "HTTP Options": "HTTP Options",
+    "HTTP Options": "Options HTTP ",
     "Create Incident": "Créer un incident",
     Title: "Titre",
     Content: "Contenu",
@@ -503,7 +503,7 @@ export default {
     RadiusCallingStationIdDescription: "Identifiant de l'appareil appelant",
     "Certificate Expiry Notification": "Notification d'expiration du certificat",
     "API Username": "Nom d'utilisateur de l'API",
-    "API Key": "clé API",
+    "API Key": "Clé API",
     "Recipient Number": "Numéro du destinataire",
     "From Name/Number": "De Nom/Numéro",
     "Leave blank to use a shared sender number.": "Laisser vide pour utiliser un numéro d'expéditeur partagé.",
@@ -570,6 +570,7 @@ export default {
     lastDay3: "3ème dernier jour du mois",
     lastDay4: "4ème dernier jour du mois",
     "No Maintenance": "Aucune Maintenance",
+    "Schedule Maintenance": "Crée une Maintenance",
     pauseMaintenanceMsg: "Voulez-vous vraiment mettre en pause ?",
     "maintenanceStatus-under-maintenance": "En maintenance",
     "maintenanceStatus-inactive": "Inactif",
@@ -584,4 +585,36 @@ export default {
     statusPageMaintenanceEndDate: "Fin",
     "Free Mobile User Identifier": "Identifiant d'utilisateur Free Mobile",
     "Free Mobile API Key": "Clé API Free Mobile",
+    enableGRPCTls: "Autoriser l'envoi d'une requête gRPC avec une connexion TLS",
+    grpcMethodDescription: "Le nom de la méthode est converti au format cammelCase tel que sayHello, check, etc.",
+    smseagleTo: "Numéro(s) de téléphone",
+    smseagleGroup: "Nom(s) de groupe(s) de répertoire",
+    smseagleContact: "Nom(s) de contact du répertoire",
+    smseagleRecipientType: "Type de destinataire",
+    smseagleRecipient: "Destinataire(s) (les multiples doivent être séparés par une virgule)",
+    smseagleToken: "Jeton d'accès à l'API",
+    smseagleUrl: "L'URL de votre appareil SMSEagle",
+    smseagleEncoding: "Envoyer en Unicode",
+    smseaglePriority: "Priorité des messages (0-9, par défaut = 0)",
+    "Proxy Server": "Serveur proxy",
+    promosmsLogin: "Nom de connexion API",
+    promosmsPassword: "Mot de passe API",
+    "SMSManager API Docs": "Documentations d'API SMSManager ",
+    "Gateway Type": "Type de passerelle",
+    webhookAdditionalHeadersTitle: "En-têtes supplémentaires",
+    webhookAdditionalHeadersDesc: "Définit des en-têtes supplémentaires envoyés avec le webhook.",
+    "Enable TLS": "Activer le TLS",
+    "Proto Service Name": "Nom du service proto",
+    "Proto Method": "Méthode Proto",
+    "Proto Content": "Contenu proto",
+    "Enable DNS Cache": "Activer le cache DNS",
+    dnsCacheDescription: "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
+    Enable: "Activer",
+    Disable: "Désactiver",
+    "Economy": "économique",
+    "Lowcost": "Faible coût",
+    "high": "Haute",
+    "General Monitor Type": "Type de moniteur général",
+    "Passive Monitor Type": "Type de moniteur passif",
+    "Specific Monitor Type": "Type de moniteur spécifique",
 };
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index bce74644..c9d5ad2f 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -11,7 +11,7 @@
                             <div class="my-3">
                                 <label for="type" class="form-label">{{ $t("Monitor Type") }}</label>
                                 <select id="type" v-model="monitor.type" class="form-select">
-                                    <optgroup label="General Monitor Type">
+                                    <optgroup :label="$t('General Monitor Type')">
                                         <option value="http">
                                             HTTP(s)
                                         </option>
@@ -35,13 +35,13 @@
                                         </option>
                                     </optgroup>
 
-                                    <optgroup label="Passive Monitor Type">
+                                    <optgroup :label="$t('Passive Monitor Type')">
                                         <option value="push">
                                             Push
                                         </option>
                                     </optgroup>
 
-                                    <optgroup label="Specific Monitor Type">
+                                    <optgroup :label="$t('Specific Monitor Type')">
                                         <option value="steam">
                                             {{ $t("Steam Game Server") }}
                                         </option>

From 2ac87fcea77eecc9cc2ea60257a0cacce65d75d4 Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Wed, 14 Dec 2022 09:26:43 +0200
Subject: [PATCH 329/803] Update bg-BG.js

Fixed Typos
---
 src/languages/bg-BG.js | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 84b07813..e2e3ef01 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -2,8 +2,8 @@ export default {
     languageName: "Български",
     checkEverySecond: "Ще се извършва на всеки {0} секунди",
     retryCheckEverySecond: "Ще се извършва на всеки {0} секунди",
-    retriesDescription: "Максимакен брой опити преди маркиране на услугата като недостъпна и изпращане на известие",
-    ignoreTLSError: "Игнорирай TLS/SSL грешки за HTTPS уебсайтове",
+    retriesDescription: "Максимален брой опити преди маркиране на услугата като недостъпна и изпращане на известие",
+    ignoreTLSError: "Игнорирай TLS/SSL грешки за HTTPS уеб сайтове",
     upsideDownModeDescription: "Обръща статуса от достъпен на недостъпен. Ако услугата е достъпна, ще се вижда като НЕДОСТЪПНА.",
     maxRedirectDescription: "Максимален брой пренасочвания, които да бъдат следвани. Въведете 0 за да изключите пренасочване.",
     acceptedStatusCodesDescription: "Изберете статус кодове, които да се считат за успешен отговор.",
@@ -194,7 +194,7 @@ export default {
     octopush: "Octopush",
     promosms: "PromoSMS",
     lunasea: "LunaSea",
-    apprise: "Apprise (Поддържа 50+ услуги за инвестяване)",
+    apprise: "Apprise (Поддържа 50+ услуги за известяване)",
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
@@ -281,19 +281,19 @@ export default {
     wayToGetLineChannelToken: "Необходимо е първо да посетите {0}, за да създадете (Messaging API) за доставчик и канал, след което може да вземете токен кода за канал и потребителско ID от споменатите по-горе елементи на менюто.",
     "Icon URL": "URL адрес за иконка",
     aboutIconURL: "Може да предоставите линк към картинка в поле \"URL Адрес за иконка\" за да отмените картинката на профила по подразбиране. Няма да се използва, ако вече сте настроили емотикон.",
-    aboutMattermostChannelName: "Може да замените канала по подразбиране, към който публикува уеб куката, като въведете името на канала в полето \"Канал име\". Tрябва да бъде активирано в настройките за уеб кука на Mattermost. Например: #other-channel",
+    aboutMattermostChannelName: "Може да замените канала по подразбиране, към който публикува уеб куката, като въведете името на канала в полето \"Канал име\". Трябва да бъде активирано в настройките за уеб кука на Mattermost. Например: #other-channel",
     matrix: "Matrix",
     promosmsTypeEco: "SMS ECO - евтин, но бавен. Често е претоварен. Само за получатели от Полша.",
     promosmsTypeFlash: "SMS FLASH - Съобщението автоматично се показва на устройството на получателя. Само за получатели от Полша.",
     promosmsTypeFull: "SMS FULL - Високо ниво на SMS услуга. Може да използвате Вашето име като подател (Необходимо е първо да регистрирате името). Надежден метод за съобщения тип тревога.",
-    promosmsTypeSpeed: "SMS SPEED - Най-висок приоритет в системата. Много бърза и надеждна, но същвременно скъпа услуга. (Около два пъти по-висока цена в сравнение с SMS FULL).",
+    promosmsTypeSpeed: "SMS SPEED - Най-висок приоритет в системата. Много бърза и надеждна, но същевременно скъпа услуга. (Около два пъти по-висока цена в сравнение с SMS FULL).",
     promosmsPhoneNumber: "Телефонен номер (за получатели от Полша, може да пропуснете въвеждането на код за населено място)",
     promosmsSMSSender: "SMS Подател име: Предварително регистрирано име или някое от имената по подразбиране: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
     "Feishu WebHookUrl": "Feishu URL адрес за уеб кука",
     matrixHomeserverURL: "Сървър URL адрес (започва с http(s):// и порт по желание)",
     "Internal Room Id": "ID на вътрешна стая",
     matrixDesc1: "Може да намерите \"ID на вътрешна стая\" в разширените настройки на стаята във вашия Matrix клиент. Примерен изглед: !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Силно препоръчваме да създадете НОВ потребител и да НЕ използвате токен кодът на вашия личен Matrix потребирел, т.к. той позволява пълен достъп до вашия акаунт и всички стаи към които сте се присъединили. Вместо това създайте нов потребител и го поканете само в стаята, където желаете да получавате известията. Токен код за достъп ще получите изпълнявайки {0}",
+    matrixDesc2: "Силно препоръчваме да създадете НОВ потребител и да НЕ използвате токен кодът на вашия личен Matrix потребител, т.к. той позволява пълен достъп до вашия акаунт и всички стаи към които сте се присъединили. Вместо това създайте нов потребител и го поканете само в стаята, където желаете да получавате известията. Токен код за достъп ще получите изпълнявайки {0}",
     Method: "Метод",
     Body: "Съобщение",
     Headers: "Хедъри",
@@ -316,7 +316,7 @@ export default {
     Security: "Сигурност",
     "Steam API Key": "Steam API ключ",
     "Shrink Database": "Редуцирай базата данни",
-    "Pick a RR-Type...": "Изберете вида на ресурсния запис за мониторитане...",
+    "Pick a RR-Type...": "Изберете вида на ресурсния запис за мониториране...",
     "Pick Accepted Status Codes...": "Изберете статус кодове, които да се считат за успешен отговор...",
     Default: "По подразбиране",
     "HTTP Options": "HTTP Опции",
@@ -432,7 +432,7 @@ export default {
     Backup: "Архивиране",
     About: "Относно",
     wayToGetCloudflaredURL: "(Свалете \"cloudflared\" от {0})",
-    cloudflareWebsite: "Cloudflare уебсайт",
+    cloudflareWebsite: "Cloudflare уеб сайт",
     "Message:": "Съобщение:",
     "Don't know how to get the token? Please read the guide:": "Не знаете как да вземете токен? Моля, прочетете ръководството:",
     "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Текущата връзка може да прекъсне ако в момента сте свързани чрез \"Cloudflare Tunnel\". Сигурни ли сте, че желаете да го спрете? Въведете Вашата текуща парола за да потвърдите.",
@@ -644,4 +644,10 @@ export default {
     smseagleEncoding: "Изпрати като Unicode",
     smseaglePriority: "Приоритет на съобщението (0-9, по подразбиране = 0)",
     IconUrl: "Икона URL адрес",
+    webhookAdditionalHeadersTitle: "Additional Headers",
+    webhookAdditionalHeadersDesc: "Sets additional headers sent with the webhook.",
+    "Enable DNS Cache": "Enable DNS Cache",
+    Enable: "Enable",
+    Disable: "Disable",
+    dnsCacheDescription: "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
 };

From 345b0c1829b2e7c664650af9b8cd9f2d4648738f Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Wed, 14 Dec 2022 09:49:31 +0200
Subject: [PATCH 330/803] Update bg-BG.js

Fixed Style
---
 src/languages/bg-BG.js | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index e2e3ef01..79ed345e 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -95,7 +95,7 @@ export default {
     "Repeat New Password": "Повторете новата парола",
     "Update Password": "Актуализирай паролата",
     "Disable Auth": "Изключи удостоверяване",
-    "Enable Auth": "Включи удостоверяване",
+    "Enable Auth": "Активирай удостоверяване",
     "disableauth.message1": "Сигурни ли сте, че желаете да <strong>изключите удостоверяването</strong>?",
     "disableauth.message2": "Използва се в случаите, когато <strong>има настроен алтернативен метод за удостоверяване</strong> преди Uptime Kuma, например Cloudflare Access, Authelia или друг механизъм за удостоверяване.",
     "Please use this option carefully!": "Моля, използвайте с повишено внимание.",
@@ -126,7 +126,7 @@ export default {
     Import: "Импорт",
     respTime: "Време за отговор (ms)",
     notAvailableShort: "Няма",
-    "Default enabled": "Включен по подразбиране",
+    "Default enabled": "Активирано по подразбиране",
     "Apply on all existing monitors": "Приложи върху всички съществуващи монитори",
     Create: "Създай",
     "Clear Data": "Изтрий данни",
@@ -145,8 +145,8 @@ export default {
     "Keep both": "Запази двете",
     "Verify Token": "Провери токен код",
     "Setup 2FA": "Настройка 2FA",
-    "Enable 2FA": "Включи 2FA",
-    "Disable 2FA": "Изключи 2FA",
+    "Enable 2FA": "Активирай 2FA",
+    "Disable 2FA": "Деактивирай 2FA",
     "2FA Settings": "Настройка за 2FA",
     "Two Factor Authentication": "Двуфакторно удостоверяване",
     Active: "Активно",
@@ -375,12 +375,12 @@ export default {
     deleteStatusPageMsg: "Сигурни ли сте, че желаете да изтриете тази статус страница?",
     Proxies: "Прокси",
     default: "По подразбиране",
-    enabled: "Включено",
+    enabled: "Активирано",
     setAsDefault: "Зададен по подразбиране",
     deleteProxyMsg: "Сигурни ли сте, че желаете да изтриете това прокси за всички монитори?",
     proxyDescription: "За да функционират трябва да бъдат зададени към монитор.",
     enableProxyDescription: "Това прокси няма да има ефект върху заявките за мониторинг, докато не бъде активирано. Може да контролирате временното деактивиране на проксито от всички монитори чрез статуса на активиране.",
-    setAsDefaultProxyDescription: "Това прокси ще бъде включено по подразбиране за новите монитори. Може да го изключите по отделно за всеки един монитор.",
+    setAsDefaultProxyDescription: "Това прокси ще бъде активно по подразбиране за новите монитори. Може да го изключите по отделно за всеки един монитор.",
     "Certificate Chain": "Верига на сертификата",
     Valid: "Валиден",
     Invalid: "Невалиден",

From 86ab97ef561b005db0924a5e1682a3251ee9b1f7 Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Wed, 14 Dec 2022 09:56:28 +0200
Subject: [PATCH 331/803] Update bg-BG.js

Translation Update
---
 src/languages/bg-BG.js | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 79ed345e..15ba19de 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -644,10 +644,10 @@ export default {
     smseagleEncoding: "Изпрати като Unicode",
     smseaglePriority: "Приоритет на съобщението (0-9, по подразбиране = 0)",
     IconUrl: "Икона URL адрес",
-    webhookAdditionalHeadersTitle: "Additional Headers",
-    webhookAdditionalHeadersDesc: "Sets additional headers sent with the webhook.",
-    "Enable DNS Cache": "Enable DNS Cache",
-    Enable: "Enable",
-    Disable: "Disable",
-    dnsCacheDescription: "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
+    webhookAdditionalHeadersTitle: "Допълнителни хедъри",
+    webhookAdditionalHeadersDesc: "Задава допълнителни хедъри, изпратени с уеб куката.",
+    "Enable DNS Cache": "Активирай DNS кеширане",
+    Enable: "Активирай",
+    Disable: "Деактивирай",
+    dnsCacheDescription: "Възможно е да не работи в IPv6 среда - деактивирайте, ако срещнете проблеми.",
 };

From da4bdab4f6bd6d8f9bba90bfa71cc995668735a2 Mon Sep 17 00:00:00 2001
From: Justman10000 <justmegaliga10000@gmail.com>
Date: Wed, 14 Dec 2022 13:16:32 +0000
Subject: [PATCH 332/803] Updated german

---
 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 0e59566c..f74ecca2 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -204,7 +204,7 @@ export default {
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
-    "Primary Base URL": "Primär URL",
+    "Primary Base URL": "Primäre Basis-URL",
     "Push URL": "Push URL",
     needPushEvery: "Du solltest diese URL alle {0} Sekunden aufrufen",
     pushOptionalParams: "Optionale Parameter: {0}",
@@ -530,7 +530,7 @@ export default {
     pushyAPIKey: "Geheimer API Schlüssel",
     pushyToken: "Gerätetoken",
     "Show update if available": "Verfügbare Updates anzeigen",
-    "Also check beta release": "Auch nach beta Versionen schauen",
+    "Also check beta release": "Auch nach Beta Versionen schauen",
     "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
     "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
     "Steam Game Server": "Steam Game Server",
@@ -593,8 +593,8 @@ export default {
     goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
     goAlertIntegrationKeyInfo: "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
     goAlert: "GoAlert",
-    backupOutdatedWarning: "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
-    backupRecommend: "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
+    backupOutdatedWarning: "Veraltet: Da viele Funktionen hinzugefügt wurden und diese Sicherungsfunktion nicht mehr gepflegt wird, kann sie keine vollständige Sicherung erstellen oder wiederherstellen.",
+    backupRecommend: "Bitte sichere stattdessen das Volume oder den Datenordner (./data/) direkt.",
     Optional: "Optional",
     squadcast: "Squadcast",
     SendKey: "SendKey",

From 1da00d19fdd9d2e01114f5b2e463025f0d78dc47 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 14 Dec 2022 21:34:00 +0800
Subject: [PATCH 333/803] Try to fix `incorrect header check`

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 6c6ccbcc..ba0b3e83 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -16,6 +16,7 @@ const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
 const { DockerHost } = require("../docker");
 const Maintenance = require("./maintenance");
 const { UptimeCacheList } = require("../uptime-cache-list");
+const zlib = require("zlib");
 
 /**
  * status:
@@ -283,7 +284,6 @@ class Monitor extends BeanModel {
                             ...(this.headers ? JSON.parse(this.headers) : {}),
                             ...(basicAuthHeader),
                         },
-                        decompress: true,
                         maxRedirects: this.maxredirects,
                         validateStatus: (status) => {
                             return checkStatusCode(status, this.getAcceptedStatuscodes());

From 2532becf61f066d8c3baf6d29a5bfaf511329b51 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 14 Dec 2022 23:37:00 +0800
Subject: [PATCH 334/803] Update to 1.19.0-beta.2

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

diff --git a/package.json b/package.json
index 0a0a7aed..fc1d4a58 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.0-beta.1",
+    "version": "1.19.0-beta.2",
     "license": "MIT",
     "repository": {
         "type": "git",

From 9dc2cc1f0d0d5d3e90bfbae122499c68f3b5e465 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 15 Dec 2022 13:05:04 +0800
Subject: [PATCH 335/803] Copy timezone.js from dayjs

---
 server/modules/dayjs/plugins/timezone.d.ts |  20 ++++
 server/modules/dayjs/plugins/timezone.js   | 111 +++++++++++++++++++++
 2 files changed, 131 insertions(+)
 create mode 100644 server/modules/dayjs/plugins/timezone.d.ts
 create mode 100644 server/modules/dayjs/plugins/timezone.js

diff --git a/server/modules/dayjs/plugins/timezone.d.ts b/server/modules/dayjs/plugins/timezone.d.ts
new file mode 100644
index 00000000..d504f692
--- /dev/null
+++ b/server/modules/dayjs/plugins/timezone.d.ts
@@ -0,0 +1,20 @@
+import { PluginFunc, ConfigType } from 'dayjs'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs' {
+  interface Dayjs {
+    tz(timezone?: string, keepLocalTime?: boolean): Dayjs
+    offsetName(type?: 'short' | 'long'): string | undefined
+  }
+
+  interface DayjsTimezone {
+    (date: ConfigType, timezone?: string): Dayjs
+    (date: ConfigType, format: string, timezone?: string): Dayjs
+    guess(): string
+    setDefault(timezone?: string): void
+  }
+
+  const tz: DayjsTimezone
+}
diff --git a/server/modules/dayjs/plugins/timezone.js b/server/modules/dayjs/plugins/timezone.js
new file mode 100644
index 00000000..73cdf58a
--- /dev/null
+++ b/server/modules/dayjs/plugins/timezone.js
@@ -0,0 +1,111 @@
+/**
+ * Copy from node_modules/dayjs/plugin/timezone.js
+ * Try to fix https://github.com/louislam/uptime-kuma/issues/2318
+ * Source: https://github.com/iamkun/dayjs/tree/dev/src/plugin/utc
+ * License: MIT
+ */
+!function (t, e) {
+    typeof exports == "object" && typeof module != "undefined" ? module.exports = e() : typeof define == "function" && define.amd ? define(e) : (t = typeof globalThis != "undefined" ? globalThis : t || self).dayjs_plugin_timezone = e();
+}(this, (function () {
+    "use strict";
+    let t = {
+        year: 0,
+        month: 1,
+        day: 2,
+        hour: 3,
+        minute: 4,
+        second: 5
+    };
+    let e = {};
+    return function (n, i, o) {
+        let r;
+        let a = function (t, n, i) {
+            void 0 === i && (i = {});
+            let o = new Date(t);
+            let r = function (t, n) {
+                void 0 === n && (n = {});
+                let i = n.timeZoneName || "short";
+                let o = t + "|" + i;
+                let r = e[o];
+                return r || (r = new Intl.DateTimeFormat("en-US", {
+                    hour12: !1,
+                    timeZone: t,
+                    year: "numeric",
+                    month: "2-digit",
+                    day: "2-digit",
+                    hour: "2-digit",
+                    minute: "2-digit",
+                    second: "2-digit",
+                    timeZoneName: i
+                }), e[o] = r), r;
+            }(n, i);
+            return r.formatToParts(o);
+        };
+        let u = function (e, n) {
+            for (var i = a(e, n), r = [], u = 0; u < i.length; u += 1) {
+                let f = i[u];
+                let s = f.type;
+                let m = f.value;
+                let c = t[s];
+                c >= 0 && (r[c] = parseInt(m, 10));
+            }
+            let d = r[3];
+            let l = d === 24 ? 0 : d;
+            let v = r[0] + "-" + r[1] + "-" + r[2] + " " + l + ":" + r[4] + ":" + r[5] + ":000";
+            let h = +e;
+            return (o.utc(v).valueOf() - (h -= h % 1e3)) / 6e4;
+        };
+        let f = i.prototype;
+        f.tz = function (t, e) {
+            void 0 === t && (t = r);
+            let n = this.utcOffset();
+            let i = this.toDate();
+            let a = i.toLocaleString("en-US", { timeZone: t });
+            let u = Math.round((i - new Date(a)) / 1e3 / 60);
+            let f = o(a).$set("millisecond", this.$ms).utcOffset(15 * -Math.round(i.getTimezoneOffset() / 15) - u, !0);
+            if (e) {
+                let s = f.utcOffset();
+                f = f.add(n - s, "minute");
+            }
+            return f.$x.$timezone = t, f;
+        }, f.offsetName = function (t) {
+            let e = this.$x.$timezone || o.tz.guess();
+            let n = a(this.valueOf(), e, { timeZoneName: t }).find((function (t) {
+                return t.type.toLowerCase() === "timezonename";
+            }));
+            return n && n.value;
+        };
+        let s = f.startOf;
+        f.startOf = function (t, e) {
+            if (!this.$x || !this.$x.$timezone) {
+                return s.call(this, t, e);
+            }
+            let n = o(this.format("YYYY-MM-DD HH:mm:ss:SSS"));
+            return s.call(n, t, e).tz(this.$x.$timezone, !0);
+        }, o.tz = function (t, e, n) {
+            let i = n && e;
+            let a = n || e || r;
+            let f = u(+o(), a);
+            if (typeof t != "string") {
+                return o(t).tz(a);
+            }
+            let s = function (t, e, n) {
+                let i = t - 60 * e * 1e3;
+                let o = u(i, n);
+                if (e === o) {
+                    return [ i, e ];
+                }
+                let r = u(i -= 60 * (o - e) * 1e3, n);
+                return o === r ? [ i, o ] : [ t - 60 * Math.min(o, r) * 1e3, Math.max(o, r) ];
+            }(o.utc(t, i).valueOf(), f, a);
+            let m = s[0];
+            let c = s[1];
+            let d = o(m).utcOffset(c);
+            return d.$x.$timezone = a, d;
+        }, o.tz.guess = function () {
+            return Intl.DateTimeFormat().resolvedOptions().timeZone;
+        }, o.tz.setDefault = function (t) {
+            r = t;
+        };
+    };
+}));

From 765d8e1297a85bd18a3ecaa1532ab1ec3db35da8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 15 Dec 2022 13:39:48 +0800
Subject: [PATCH 336/803] Fix #2318

---
 .../dayjs/{plugins => plugin}/timezone.d.ts   |   0
 .../dayjs/{plugins => plugin}/timezone.js     |   2 +-
 server/server.js                              |   2 +-
 src/main.js                                   |   2 +-
 src/modules/dayjs/constant.js                 |  25 +++
 src/modules/dayjs/plugin/timezone/index.d.ts  |  20 ++
 src/modules/dayjs/plugin/timezone/index.js    | 188 ++++++++++++++++++
 7 files changed, 236 insertions(+), 3 deletions(-)
 rename server/modules/dayjs/{plugins => plugin}/timezone.d.ts (100%)
 rename server/modules/dayjs/{plugins => plugin}/timezone.js (97%)
 create mode 100644 src/modules/dayjs/constant.js
 create mode 100644 src/modules/dayjs/plugin/timezone/index.d.ts
 create mode 100644 src/modules/dayjs/plugin/timezone/index.js

diff --git a/server/modules/dayjs/plugins/timezone.d.ts b/server/modules/dayjs/plugin/timezone.d.ts
similarity index 100%
rename from server/modules/dayjs/plugins/timezone.d.ts
rename to server/modules/dayjs/plugin/timezone.d.ts
diff --git a/server/modules/dayjs/plugins/timezone.js b/server/modules/dayjs/plugin/timezone.js
similarity index 97%
rename from server/modules/dayjs/plugins/timezone.js
rename to server/modules/dayjs/plugin/timezone.js
index 73cdf58a..894a5957 100644
--- a/server/modules/dayjs/plugins/timezone.js
+++ b/server/modules/dayjs/plugin/timezone.js
@@ -60,7 +60,7 @@
             void 0 === t && (t = r);
             let n = this.utcOffset();
             let i = this.toDate();
-            let a = i.toLocaleString("en-US", { timeZone: t });
+            let a = i.toLocaleString("en-US", { timeZone: t }).replace("\u202f", " ");
             let u = Math.round((i - new Date(a)) / 1e3 / 60);
             let f = o(a).$set("millisecond", this.$ms).utcOffset(15 * -Math.round(i.getTimezoneOffset() / 15) - u, !0);
             if (e) {
diff --git a/server/server.js b/server/server.js
index 5e4ff2b9..594c29b3 100644
--- a/server/server.js
+++ b/server/server.js
@@ -8,7 +8,7 @@ console.log("Welcome to Uptime Kuma");
 // As the log function need to use dayjs, it should be very top
 const dayjs = require("dayjs");
 dayjs.extend(require("dayjs/plugin/utc"));
-dayjs.extend(require("dayjs/plugin/timezone"));
+dayjs.extend(require("./modules/dayjs/plugin/timezone"));
 dayjs.extend(require("dayjs/plugin/customParseFormat"));
 
 // Check Node.js Version
diff --git a/src/main.js b/src/main.js
index 5567023f..53314164 100644
--- a/src/main.js
+++ b/src/main.js
@@ -17,7 +17,7 @@ import lang from "./mixins/lang";
 import { router } from "./router";
 import { appName } from "./util.ts";
 import dayjs from "dayjs";
-import timezone from "dayjs/plugin/timezone";
+import timezone from "./modules/dayjs/plugin/timezone";
 import utc from "dayjs/plugin/utc";
 import relativeTime from "dayjs/plugin/relativeTime";
 dayjs.extend(utc);
diff --git a/src/modules/dayjs/constant.js b/src/modules/dayjs/constant.js
new file mode 100644
index 00000000..02ffe1bc
--- /dev/null
+++ b/src/modules/dayjs/constant.js
@@ -0,0 +1,25 @@
+export var SECONDS_A_MINUTE = 60;
+export var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;
+export var SECONDS_A_DAY = SECONDS_A_HOUR * 24;
+export var SECONDS_A_WEEK = SECONDS_A_DAY * 7;
+export var MILLISECONDS_A_SECOND = 1e3;
+export var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;
+export var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;
+export var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;
+export var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales
+
+export var MS = 'millisecond';
+export var S = 'second';
+export var MIN = 'minute';
+export var H = 'hour';
+export var D = 'day';
+export var W = 'week';
+export var M = 'month';
+export var Q = 'quarter';
+export var Y = 'year';
+export var DATE = 'date';
+export var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';
+export var INVALID_DATE_STRING = 'Invalid Date'; // regex
+
+export var REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
+export var REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
\ No newline at end of file
diff --git a/src/modules/dayjs/plugin/timezone/index.d.ts b/src/modules/dayjs/plugin/timezone/index.d.ts
new file mode 100644
index 00000000..8d903590
--- /dev/null
+++ b/src/modules/dayjs/plugin/timezone/index.d.ts
@@ -0,0 +1,20 @@
+import { PluginFunc, ConfigType } from 'dayjs/esm'
+
+declare const plugin: PluginFunc
+export = plugin
+
+declare module 'dayjs/esm' {
+  interface Dayjs {
+    tz(timezone?: string, keepLocalTime?: boolean): Dayjs
+    offsetName(type?: 'short' | 'long'): string | undefined
+  }
+
+  interface DayjsTimezone {
+    (date: ConfigType, timezone?: string): Dayjs
+    (date: ConfigType, format: string, timezone?: string): Dayjs
+    guess(): string
+    setDefault(timezone?: string): void
+  }
+
+  const tz: DayjsTimezone
+}
diff --git a/src/modules/dayjs/plugin/timezone/index.js b/src/modules/dayjs/plugin/timezone/index.js
new file mode 100644
index 00000000..a7bd673e
--- /dev/null
+++ b/src/modules/dayjs/plugin/timezone/index.js
@@ -0,0 +1,188 @@
+/**
+ * Copy from node_modules/dayjs/plugin/timezone.js
+ * Try to fix https://github.com/louislam/uptime-kuma/issues/2318
+ * Source: https://github.com/iamkun/dayjs/tree/dev/src/plugin/utc
+ * License: MIT
+ */
+import { MIN, MS } from "../../constant";
+let typeToPos = {
+    year: 0,
+    month: 1,
+    day: 2,
+    hour: 3,
+    minute: 4,
+    second: 5
+}; // Cache time-zone lookups from Intl.DateTimeFormat,
+// as it is a *very* slow method.
+
+let dtfCache = {};
+
+let getDateTimeFormat = function getDateTimeFormat(timezone, options) {
+    if (options === void 0) {
+        options = {};
+    }
+
+    let timeZoneName = options.timeZoneName || "short";
+    let key = timezone + "|" + timeZoneName;
+    let dtf = dtfCache[key];
+
+    if (!dtf) {
+        dtf = new Intl.DateTimeFormat("en-US", {
+            hour12: false,
+            timeZone: timezone,
+            year: "numeric",
+            month: "2-digit",
+            day: "2-digit",
+            hour: "2-digit",
+            minute: "2-digit",
+            second: "2-digit",
+            timeZoneName: timeZoneName
+        });
+        dtfCache[key] = dtf;
+    }
+
+    return dtf;
+};
+
+export default (function (o, c, d) {
+    let defaultTimezone;
+
+    let makeFormatParts = function makeFormatParts(timestamp, timezone, options) {
+        if (options === void 0) {
+            options = {};
+        }
+
+        let date = new Date(timestamp);
+        let dtf = getDateTimeFormat(timezone, options);
+        return dtf.formatToParts(date);
+    };
+
+    let tzOffset = function tzOffset(timestamp, timezone) {
+        let formatResult = makeFormatParts(timestamp, timezone);
+        let filled = [];
+
+        for (let i = 0; i < formatResult.length; i += 1) {
+            let _formatResult$i = formatResult[i];
+            let type = _formatResult$i.type;
+            let value = _formatResult$i.value;
+            let pos = typeToPos[type];
+
+            if (pos >= 0) {
+                filled[pos] = parseInt(value, 10);
+            }
+        }
+
+        let hour = filled[3]; // Workaround for the same behavior in different node version
+        // https://github.com/nodejs/node/issues/33027
+
+        /* istanbul ignore next */
+
+        let fixedHour = hour === 24 ? 0 : hour;
+        let utcString = filled[0] + "-" + filled[1] + "-" + filled[2] + " " + fixedHour + ":" + filled[4] + ":" + filled[5] + ":000";
+        let utcTs = d.utc(utcString).valueOf();
+        let asTS = +timestamp;
+        let over = asTS % 1000;
+        asTS -= over;
+        return (utcTs - asTS) / (60 * 1000);
+    }; // find the right offset a given local time. The o input is our guess, which determines which
+    // offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)
+    // https://github.com/moment/luxon/blob/master/src/datetime.js#L76
+
+    let fixOffset = function fixOffset(localTS, o0, tz) {
+    // Our UTC time is just a guess because our offset is just a guess
+        let utcGuess = localTS - o0 * 60 * 1000; // Test whether the zone matches the offset for this ts
+
+        let o2 = tzOffset(utcGuess, tz); // If so, offset didn't change and we're done
+
+        if (o0 === o2) {
+            return [ utcGuess, o0 ];
+        } // If not, change the ts by the difference in the offset
+
+        utcGuess -= (o2 - o0) * 60 * 1000; // If that gives us the local time we want, we're done
+
+        let o3 = tzOffset(utcGuess, tz);
+
+        if (o2 === o3) {
+            return [ utcGuess, o2 ];
+        } // If it's different, we're in a hole time.
+        // The offset has changed, but the we don't adjust the time
+
+        return [ localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3) ];
+    };
+
+    let proto = c.prototype;
+
+    proto.tz = function (timezone, keepLocalTime) {
+        if (timezone === void 0) {
+            timezone = defaultTimezone;
+        }
+
+        let oldOffset = this.utcOffset();
+        let date = this.toDate();
+        let target = date.toLocaleString("en-US", {
+            timeZone: timezone
+        }).replace("\u202f", " ");
+        let diff = Math.round((date - new Date(target)) / 1000 / 60);
+        let ins = d(target).$set(MS, this.$ms).utcOffset(-Math.round(date.getTimezoneOffset() / 15) * 15 - diff, true);
+
+        if (keepLocalTime) {
+            let newOffset = ins.utcOffset();
+            ins = ins.add(oldOffset - newOffset, MIN);
+        }
+
+        ins.$x.$timezone = timezone;
+        return ins;
+    };
+
+    proto.offsetName = function (type) {
+    // type: short(default) / long
+        let zone = this.$x.$timezone || d.tz.guess();
+        let result = makeFormatParts(this.valueOf(), zone, {
+            timeZoneName: type
+        }).find(function (m) {
+            return m.type.toLowerCase() === "timezonename";
+        });
+        return result && result.value;
+    };
+
+    let oldStartOf = proto.startOf;
+
+    proto.startOf = function (units, startOf) {
+        if (!this.$x || !this.$x.$timezone) {
+            return oldStartOf.call(this, units, startOf);
+        }
+
+        let withoutTz = d(this.format("YYYY-MM-DD HH:mm:ss:SSS"));
+        let startOfWithoutTz = oldStartOf.call(withoutTz, units, startOf);
+        return startOfWithoutTz.tz(this.$x.$timezone, true);
+    };
+
+    d.tz = function (input, arg1, arg2) {
+        let parseFormat = arg2 && arg1;
+        let timezone = arg2 || arg1 || defaultTimezone;
+        let previousOffset = tzOffset(+d(), timezone);
+
+        if (typeof input !== "string") {
+            // timestamp number || js Date || Day.js
+            return d(input).tz(timezone);
+        }
+
+        let localTs = d.utc(input, parseFormat).valueOf();
+
+        let _fixOffset = fixOffset(localTs, previousOffset, timezone);
+        let targetTs = _fixOffset[0];
+        let targetOffset = _fixOffset[1];
+
+        let ins = d(targetTs).utcOffset(targetOffset);
+        ins.$x.$timezone = timezone;
+        return ins;
+    };
+
+    d.tz.guess = function () {
+        return Intl.DateTimeFormat().resolvedOptions().timeZone;
+    };
+
+    d.tz.setDefault = function (timezone) {
+        defaultTimezone = timezone;
+    };
+});

From b75db276581bc9c22590e60e290ff71e65941336 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 15 Dec 2022 13:57:28 +0800
Subject: [PATCH 337/803] Fix lint

---
 server/model/monitor.js                 |  1 -
 server/modules/dayjs/plugin/timezone.js |  6 +++-
 src/modules/dayjs/constant.js           | 46 ++++++++++++-------------
 3 files changed, 28 insertions(+), 25 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index ba0b3e83..1cb56241 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -16,7 +16,6 @@ const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
 const { DockerHost } = require("../docker");
 const Maintenance = require("./maintenance");
 const { UptimeCacheList } = require("../uptime-cache-list");
-const zlib = require("zlib");
 
 /**
  * status:
diff --git a/server/modules/dayjs/plugin/timezone.js b/server/modules/dayjs/plugin/timezone.js
index 894a5957..de709ae4 100644
--- a/server/modules/dayjs/plugin/timezone.js
+++ b/server/modules/dayjs/plugin/timezone.js
@@ -5,6 +5,7 @@
  * License: MIT
  */
 !function (t, e) {
+    // eslint-disable-next-line no-undef
     typeof exports == "object" && typeof module != "undefined" ? module.exports = e() : typeof define == "function" && define.amd ? define(e) : (t = typeof globalThis != "undefined" ? globalThis : t || self).dayjs_plugin_timezone = e();
 }(this, (function () {
     "use strict";
@@ -42,7 +43,10 @@
             return r.formatToParts(o);
         };
         let u = function (e, n) {
-            for (var i = a(e, n), r = [], u = 0; u < i.length; u += 1) {
+            let i = a(e, n);
+            let r = [];
+            let u = 0;
+            for (; u < i.length; u += 1) {
                 let f = i[u];
                 let s = f.type;
                 let m = f.value;
diff --git a/src/modules/dayjs/constant.js b/src/modules/dayjs/constant.js
index 02ffe1bc..741a623b 100644
--- a/src/modules/dayjs/constant.js
+++ b/src/modules/dayjs/constant.js
@@ -1,25 +1,25 @@
-export var SECONDS_A_MINUTE = 60;
-export var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;
-export var SECONDS_A_DAY = SECONDS_A_HOUR * 24;
-export var SECONDS_A_WEEK = SECONDS_A_DAY * 7;
-export var MILLISECONDS_A_SECOND = 1e3;
-export var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;
-export var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;
-export var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;
-export var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales
+export let SECONDS_A_MINUTE = 60;
+export let SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;
+export let SECONDS_A_DAY = SECONDS_A_HOUR * 24;
+export let SECONDS_A_WEEK = SECONDS_A_DAY * 7;
+export let MILLISECONDS_A_SECOND = 1e3;
+export let MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;
+export let MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;
+export let MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;
+export let MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales
 
-export var MS = 'millisecond';
-export var S = 'second';
-export var MIN = 'minute';
-export var H = 'hour';
-export var D = 'day';
-export var W = 'week';
-export var M = 'month';
-export var Q = 'quarter';
-export var Y = 'year';
-export var DATE = 'date';
-export var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';
-export var INVALID_DATE_STRING = 'Invalid Date'; // regex
+export let MS = "millisecond";
+export let S = "second";
+export let MIN = "minute";
+export let H = "hour";
+export let D = "day";
+export let W = "week";
+export let M = "month";
+export let Q = "quarter";
+export let Y = "year";
+export let DATE = "date";
+export let FORMAT_DEFAULT = "YYYY-MM-DDTHH:mm:ssZ";
+export let INVALID_DATE_STRING = "Invalid Date"; // regex
 
-export var REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
-export var REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
\ No newline at end of file
+export let REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
+export let REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;

From 20c37a70f76cfccda660ea9d98a1fca073f916e8 Mon Sep 17 00:00:00 2001
From: JohnoCZ <55092714+Johno95CZ@users.noreply.github.com>
Date: Thu, 15 Dec 2022 14:35:59 +0100
Subject: [PATCH 338/803] Update cs-CZ.js

---
 src/languages/cs-CZ.js | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
index e9cdb992..99ae9ef0 100644
--- a/src/languages/cs-CZ.js
+++ b/src/languages/cs-CZ.js
@@ -582,4 +582,45 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "Zastaralé: V poslední době byla funkčnost aplikace značně rozšířena, nicméně součást pro zálohování nepokrývá všechny možnosti. Z tohoto důvodu není možné vygenerovat úplnou zálohu a zajistit obnovení všech dat.",
     backupRecommend: "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
+    "Optional": "Volitelný",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "SMSManager API Docs ",
+    "Gateway Type": "Gateway Typ",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "Čísla můžete dělit pomocí",
+    "or": "nebo",
+    recurringInterval: "Interval",
+    "Recurring": "Recurring",
+    strategyManual: "Aktivní/Neaktivní Ručně",
+    warningTimezone: "Používá se časové pásmo serveru",
+    weekdayShortMon: "Po",
+    weekdayShortTue: "Út",
+    weekdayShortWed: "St",
+    weekdayShortThu: "Čt",
+    weekdayShortFri: "Pá",
+    weekdayShortSat: "So",
+    weekdayShortSun: "Ne",
+    dayOfWeek: "Den v týdnu",
+    dayOfMonth: "Den v měsíci",
+    lastDay: "Poslední den",
+    lastDay1: "1. poslední den v měsíci",
+    lastDay2: "2. poslední den v měsíci",
+    lastDay3: "3. poslední den v měsíci",
+    lastDay4: "4. poslední den v měsíci",
+    "No Maintenance": "Žádna údržba",
+    pauseMaintenanceMsg: "Jsi si jistý, že chceš pozastavit údržbu?",
+    "maintenanceStatus-under-maintenance": "Údržba",
+    "maintenanceStatus-inactive": "Neaktivní",
+    "maintenanceStatus-scheduled": "Naplánováno",
+    "maintenanceStatus-ended": "Ukončeno",
+    "maintenanceStatus-unknown": "Neznámý",
+    "Display Timezone": "Zobrazit časové pásmo",
+    "Server Timezone": "Časové pásmo serveru",
+    statusPageMaintenanceEndDate: "Konec",
+    IconUrl: "Adresa URL ikony",
+    "Enable DNS Cache": "Povolit DNS Cache",
+    "Enable": "Povolit",
+    "Disable": "Zakázat",
+    dnsCacheDescription: "V některých prostředích IPv6 nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej.",
 };

From 3ea67110538a60ed0cd316a38e4ec9bf5efa93ae Mon Sep 17 00:00:00 2001
From: Joppe Koers <joppe@joppekoers.nl>
Date: Thu, 15 Dec 2022 23:03:06 +0100
Subject: [PATCH 339/803] Remove docker compose again

---
 README.md | 14 --------------
 1 file changed, 14 deletions(-)

diff --git a/README.md b/README.md
index 6d10cf2a..90c8ad75 100644
--- a/README.md
+++ b/README.md
@@ -42,20 +42,6 @@ It is a temporary live demo, all data will be deleted after 10 minutes. Use the
 docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1
 ```
 
-### 🐳 Docker Compose
-```yaml
-version: "3"
-
-services:
-  uptime-kuma:
-    image: louislam/uptime-kuma:1
-    restart: always
-    ports:
-      - "3001:3001"
-    volumes:
-      - uptime-kuma:/app/data
-```
-
 ⚠️ Please use a **local volume** only. Other types such as NFS are not supported.
 
 Kuma is now running on http://localhost:3001

From df21f7da7618848158afb0a833cd83a91a89847e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 16 Dec 2022 12:56:40 +0800
Subject: [PATCH 340/803] Check login for initServerTimezone

---
 server/socket-handlers/general-socket-handler.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/server/socket-handlers/general-socket-handler.js b/server/socket-handlers/general-socket-handler.js
index a0239733..700b4a38 100644
--- a/server/socket-handlers/general-socket-handler.js
+++ b/server/socket-handlers/general-socket-handler.js
@@ -1,17 +1,19 @@
 const { log } = require("../../src/util");
 const { Settings } = require("../settings");
 const { sendInfo } = require("../client");
+const { checkLogin } = require("../util-server");
 
 module.exports.generalSocketHandler = (socket, server) => {
 
     socket.on("initServerTimezone", async (timezone) => {
         try {
+            checkLogin(socket);
             log.debug("generalSocketHandler", "Timezone: " + timezone);
             await Settings.set("initServerTimezone", true);
             await server.setTimezone(timezone);
             await sendInfo(socket);
         } catch (e) {
-
+            log.warn("initServerTimezone", e.message);
         }
     });
 

From 890b8f83337f62c2a8a19f0d5b0f5a5e671c46a7 Mon Sep 17 00:00:00 2001
From: Justman10000 <justmegaliga10000@gmail.com>
Date: Fri, 16 Dec 2022 10:42:41 +0000
Subject: [PATCH 341/803] Updated German

---
 src/languages/de-DE.js | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index f74ecca2..6d4bf05f 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -181,7 +181,7 @@ export default {
     "Degraded Service": "Eingeschränkter Dienst",
     "Add Group": "Gruppe hinzufügen",
     "Add a monitor": "Monitor hinzufügen",
-    "Edit Status Page": "Bearbeite Status-Seite",
+    "Edit Status Page": "Statusseite bearbeiten",
     "Go to Dashboard": "Gehe zum Dashboard",
     "Status Page": "Status-Seite",
     "Status Pages": "Status-Seiten",
@@ -583,10 +583,10 @@ export default {
     "Pick Affected Monitors...": "Wähle betroffene Monitore...",
     "Start of maintenance": "Beginn der Wartung",
     "All Status Pages": "Alle Status Seiten",
-    "Select status pages...": "Wähle Status Seiten...",
-    recurringIntervalMessage: "einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
-    affectedMonitorsDescription: "Wähle alle Monitore die von der Wartung betroffen sind",
-    affectedStatusPages: "Zeige diese Nachricht auf ausgewählten Status Seiten",
+    "Select status pages...": "Statusseiten auswählen...",
+    recurringIntervalMessage: "Einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
+    affectedMonitorsDescription: "Wähle Monitore aus, die von der aktuellen Wartung betroffen sind",
+    affectedStatusPages: "Diese Wartungsmeldung auf ausgewählten Statusseiten anzeigen",
     atLeastOneMonitor: "Wähle mindestens einen Monitor",
     deleteMaintenanceMsg: "Möchtest du diese Wartung löschen?",
     "Base URL": "Basis URL",
@@ -605,8 +605,11 @@ export default {
     or: "oder",
     recurringInterval: "Intervall",
     Recurring: "Wiederkehrend",
-    strategyManual: "Active/Inactive Manually",
-    warningTimezone: "Es wird die Zeitzone des Servers genutzt",
+    "Single Maintenance Window": "Einzigartiges Wartungsfenster",
+    "Maintenance Time Window of a Day": "Zeitfenster für die Wartung",
+    "Effective Date Range": "Bereich der Wirksamkeitsdaten",
+    strategyManual: "Aktiv/Inaktiv Manuell",
+    warningTimezone: "Es wird die Zeitzone des Servers verwendet",
     weekdayShortMon: "Mo",
     weekdayShortTue: "Di",
     weekdayShortWed: "Mi",
@@ -622,6 +625,7 @@ export default {
     lastDay3: "3. letzter Tag im Monat",
     lastDay4: "4. letzter Tag im Monat",
     "No Maintenance": "Keine Wartung",
+    "Schedule Maintenance": "Wartung planen",
     pauseMaintenanceMsg: "Möchtest du wirklich pausieren?",
     "maintenanceStatus-under-maintenance": "Unter Wartung",
     "maintenanceStatus-inactive": "Inaktiv",
@@ -630,5 +634,8 @@ export default {
     "maintenanceStatus-unknown": "Unbekannt",
     "Display Timezone": "Zeitzone anzeigen",
     "Server Timezone": "Server Zeitzone",
+    "Date and Time": "Datum und Zeit",
+    "DateTime Range": "Datums- und Zeitbereich",
+    Strategy: "Strategie",
     statusPageMaintenanceEndDate: "Ende",
 };

From 06e570c52d6ac4c89ec2b8ba5d9e80f24e3c6186 Mon Sep 17 00:00:00 2001
From: Rachatat Bunpat <82020386+rbunpat@users.noreply.github.com>
Date: Fri, 16 Dec 2022 19:15:14 +0700
Subject: [PATCH 342/803] Update th-TH.js

---
 src/languages/th-TH.js | 38 +++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
index 012693e4..99b64752 100644
--- a/src/languages/th-TH.js
+++ b/src/languages/th-TH.js
@@ -5,7 +5,7 @@ export default {
     retriesDescription: "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
     ignoreTLSError: "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
     upsideDownModeDescription: "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
-    maxRedirectDescription: "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั่งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
+    maxRedirectDescription: "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั้งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
     acceptedStatusCodesDescription: "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
     passwordNotMatchMsg: "รหัสผ่านไม่ตรงกัน",
     notificationDescription: "การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้",
@@ -16,7 +16,7 @@ export default {
     resolverserverDescription: "Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา",
     rrtypeDescription: "เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์",
     pauseMonitorMsg: "คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?",
-    enableDefaultNotificationDescription: "การแจ้งเตือนนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
+    enableDefaultNotificationDescription: "การแจ้งเตือนนี้จะถูกเปิดโดยค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
     clearEventsMsg: "คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?",
     clearHeartbeatsMsg: "คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?",
     confirmClearStatisticsMsg: "คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?",
@@ -49,12 +49,12 @@ export default {
     Status: "สถานะ",
     DateTime: "วันที่และเวลา",
     Message: "ข้อความ",
-    "No important events": "ไม่มีกิจกรรมที่สำคัญ",
+    "No important events": "ไม่มีเหตการณ์ที่สำคัญ",
     Resume: "ดำเนินการต่อ",
     Edit: "แก้ไข",
     Delete: "ลบ",
     Current: "ปัจจุบัน",
-    Uptime: "เวลาที่ใช้งาน",
+    Uptime: "เวลาที่ใช้งานได้",
     "Cert Exp.": "วันหมดอายุใบรับรอง",
     days: "วัน",
     day: "วัน",
@@ -69,7 +69,7 @@ export default {
     URL: "URL",
     Hostname: "ชื่อโฮสต์",
     Port: "พอร์ต",
-    "Heartbeat Interval": "ระยะห่างระหว่างการทดสอบ",
+    "Heartbeat Interval": "ระยะเวลาระหว่างการทดสอบ",
     Retries: "จำนวนครั้งที่จะลองใหม่",
     "Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
     Advanced: "ขั้นสูง",
@@ -112,7 +112,7 @@ export default {
     No: "ไม่",
     Username: "ชื่อผู้ใช้",
     Password: "รหัสผ่าน",
-    "Remember me": "คงอยู่ในระบบ",
+    "Remember me": "จดจำฉันไว้",
     Login: "เข้าสู่ระบบ",
     "No Monitors, please": "ไม่มีมอนิเตอร์, กรุณา",
     "add one": "สร้าง",
@@ -120,7 +120,7 @@ export default {
     Email: "อีเมล",
     Test: "ทดสอบ",
     "Certificate Info": "ข้อมูลใบรับรอง",
-    "Resolver Server": "เซิร์ฟเวอร์ทีค้นหา",
+    "Resolver Server": "เซิร์ฟเวอร์ที่ค้นหา",
     "Resource Record Type": "ประเภท DNS Record",
     "Last Result": "ผลล่าสุด",
     "Create your admin account": "สร้างบัญชีผู้ดูแลระบบ",
@@ -138,8 +138,8 @@ export default {
     Events: "เหตุการณ์",
     Heartbeats: "ประวัติการตรวจสอบ",
     "Auto Get": "ดึงอัตโนมัติ",
-    backupDescription: "คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดได้ในไฟล์ JSON",
-    backupDescription2: "หมายเหตุ : ประวัติและข้อมูลกิจกรรมจะไม่ถูกสำรอง",
+    backupDescription: "คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดไว้ได้ในไฟล์ JSON",
+    backupDescription2: "หมายเหตุ : ประวัติและข้อมูลเหตการณ์จะไม่ถูกสำรอง",
     backupDescription3: "ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย",
     alertNoFile: "กรุณาเลือกไฟล์ที่จะใช้งาน",
     alertWrongFileType: "กรุณาเลือกไฟล์ที่เป็น JSON",
@@ -153,7 +153,7 @@ export default {
     "Enable 2FA": "เปิดใช้งาน 2FA",
     "Disable 2FA": "ปิดใช้งาน 2FA",
     "2FA Settings": "ตั้งค่า 2FA",
-    "Two Factor Authentication": "การตรวจสอบสิทธิ์สองปัจจัย",
+    "Two Factor Authentication": "การยืนยันตัวตนแบบสองขั้นตอน",
     Active: "ใช้งาน",
     Inactive: "ไม่ใช้งาน",
     Token: "กุญแจ",
@@ -189,7 +189,7 @@ export default {
     "Status Pages": "หน้าสถานะ",
     defaultNotificationName: "การแจ้งเตือน {notification} ของฉัน ({number})",
     here: "ที่นี่",
-    Required: "ต้องการ",
+    Required: "จำเป็น",
     telegram: "Telegram",
     "Bot Token": "กุญแจของบอท",
     wayToGetTelegramToken: "คุณสามารถรับกุญแจได้จาก {0}.",
@@ -224,7 +224,7 @@ export default {
     signal: "Signal",
     Number: "หมายเลข",
     Recipients: "ผู้รับ",
-    needSignalAPI: "คุณต้องมี Signal Client ที่มี Rest APIl",
+    needSignalAPI: "คุณต้องมี Signal Client ที่มี Rest API",
     wayToCheckSignalURL: "คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :",
     signalImportant: "สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!",
     gotify: "Gotify",
@@ -274,8 +274,8 @@ export default {
     "Read more:": "อ่านเพิ่มเติม : {0}",
     "Status:": "สถานะ : {0}",
     "Read more": "อ่านเพิ่มเติม",
-    appriseInstalled: "Apprise ถูกติดตั่งแล้ว",
-    appriseNotInstalled: "Apprise ยังไม่ถูกติดตั่ง {0}",
+    appriseInstalled: "Apprise ถูกติดตั้งแล้ว",
+    appriseNotInstalled: "Apprise ยังไม่ถูกติดตั้ง {0}",
     "Access Token": "กุญแจการเข้าถึง",
     "Channel access token": "กุญแจการเข้าถึงของช่อง",
     "Line Developers Console": "Line Developers Console",
@@ -288,8 +288,8 @@ export default {
     aboutIconURL: "คุณสามารถระบุลิงก์ไปยังรูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
     aboutMattermostChannelName: "คุณลบล้างช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
     matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับโปแลนด์",
-    promosmsTypeFlash: "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับโปแลนด์",
+    promosmsTypeEco: "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับในโปแลนด์",
+    promosmsTypeFlash: "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับในโปแลนด์",
     promosmsTypeFull: "SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน",
     promosmsTypeSpeed: "SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)",
     promosmsPhoneNumber: "หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)",
@@ -366,7 +366,7 @@ export default {
     "Custom CSS": "CSS ที่กำหนดเอง",
     smtpDkimSettings: "ตั้งค่า DKIM",
     smtpDkimDesc: "โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน",
-    documentation: "เอกสาร",
+    documentation: "คู่มือการใช้งาน",
     smtpDkimDomain: "ชื่อโดเมน",
     smtpDkimKeySelector: "Key Selector",
     smtpDkimPrivateKey: "Private Key",
@@ -384,7 +384,7 @@ export default {
     Proxies: "พร็อกซี",
     default: "ค่าเริ่มต้น",
     enabled: "เปิดใช้งาน",
-    setAsDefault: "ตั่งเป็นค่าเริ่มต้น",
+    setAsDefault: "ตั้งเป็นค่าเริ่มต้น",
     deleteProxyMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?",
     proxyDescription: "พร็อกซีจะต้องตั้งค่าให้มอนิเตอร์เพื่อให้ใช้งานได้",
     enableProxyDescription: "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้โดยสถานะการเปิดใช้งาน",
@@ -430,7 +430,7 @@ export default {
     startOrEndWithOnly: "เริ่มหรือจบด้วย {0} เท่านั้น",
     "No consecutive dashes": "ไม่มีขีดกลางติดต่อกัน",
     Next: "ต่อไป",
-    "The slug is already taken. Please choose another slug.": "ชื่อนี้ถูกใช้งานไปแล้ว กรุณาใช้ชื่ออื่น",
+    "The slug is already taken. Please choose another slug.": "ชื่อนี้ถูกใช้งานแล้ว กรุณาใช้ชื่ออื่น",
     "No Proxy": "ไม่มีพร็อกซี่",
     "HTTP Basic Auth": "HTTP Basic Auth",
     "New Status Page": "หน้าสถานะใหม่",

From fc6b040a4eebf31b676860a6f4f4af13824836af Mon Sep 17 00:00:00 2001
From: Rachatat Bunpat <82020386+rbunpat@users.noreply.github.com>
Date: Sat, 17 Dec 2022 17:34:03 +0700
Subject: [PATCH 343/803] Update th-TH.js

---
 src/languages/th-TH.js | 76 +++++++++++++++++++++---------------------
 1 file changed, 38 insertions(+), 38 deletions(-)

diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
index 99b64752..3d847038 100644
--- a/src/languages/th-TH.js
+++ b/src/languages/th-TH.js
@@ -202,7 +202,7 @@ export default {
     "Post URL": "URL โพสต์",
     "Content Type": "ประเภทเนื้อหา",
     webhookJsonDesc: "{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js",
-    webhookFormDataDesc: "{multipart} ดีสำหรับ PHP, JSON จะต้องถูกประมวลผลด้วย {decodeFunction}",
+    webhookFormDataDesc: "{multipart} ดีสำหรับ PHP, ข้อมูล JSON จะต้องถูกประมวลผลด้วย {decodeFunction}",
     smtp: "Email (SMTP)",
     secureOptionNone: "None / STARTTLS (25, 587)",
     secureOptionTLS: "TLS (465)",
@@ -236,7 +236,7 @@ export default {
     "Channel Name": "ชื่อห้อง",
     "Uptime Kuma URL": "Uptime Kuma URL",
     aboutWebhooks: "ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}",
-    aboutChannelName: "ใส่ชื่อห้องบน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ",
+    aboutChannelName: "ใส่ชื่อห้องใน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ",
     aboutKumaURL: "ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github",
     emojiCheatSheet: "ตาราง Emoji : {0}",
     "rocket.chat": "Rocket.Chat",
@@ -248,7 +248,7 @@ export default {
     clicksendsms: "ClickSend SMS",
     lunasea: "LunaSea",
     apprise: "Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)",
-    GoogleChat: "Google Chat (Google Workspace only)",
+    GoogleChat: "Google Chat (สำหรับ Google Workspace เท่านั้น)",
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
@@ -257,8 +257,8 @@ export default {
     "Message Title": "หัวข้อข้อความ",
     "Notification Sound": "เสียงแจ้งเตือน",
     "More info on:": "ข้อมูลเพิ่มเติม : {0}",
-    pushoverDesc1: "ลำดับความสำตคญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง",
-    pushoverDesc2: "ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่น ๆ สามารถกำหนดได้ที่ช่องอุปกรณ์",
+    pushoverDesc1: "ลำดับความสำคัญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างการลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง",
+    pushoverDesc2: "ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่นๆ สามารถกำหนดได้ที่ช่องอุปกรณ์",
     "SMS Type": "ประเภท SMS",
     octopushTypePremium: "พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)",
     octopushTypeLowCost: "ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)",
@@ -285,8 +285,8 @@ export default {
     "Messaging API": "Messaging API",
     wayToGetLineChannelToken: "ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น",
     "Icon URL": "Icon URL",
-    aboutIconURL: "คุณสามารถระบุลิงก์ไปยังรูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
-    aboutMattermostChannelName: "คุณลบล้างช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
+    aboutIconURL: "คุณสามารถระบุลิงก์รูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
+    aboutMattermostChannelName: "คุณลบช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
     matrix: "Matrix",
     promosmsTypeEco: "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับในโปแลนด์",
     promosmsTypeFlash: "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับในโปแลนด์",
@@ -298,7 +298,7 @@ export default {
     matrixHomeserverURL: "URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)",
     "Internal Room Id": "รหัสห้องภายใน",
     matrixDesc1: "คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.",
-    matrixDesc2: "ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วมได้อย่างเต็มที่ ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}",
+    matrixDesc2: "ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วม ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}",
     Method: "วิธี",
     Body: "เนื้อหา",
     Headers: "ส่วนหัว",
@@ -310,12 +310,12 @@ export default {
     PasswordsDoNotMatch: "รหัสผ่านไม่ตรงกัน",
     records: "บันทึก",
     "One record": "หนึ่งบันทึก",
-    steamApiKeyDescription: "สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถรสมัครได้จากที่นี่ : ",
+    steamApiKeyDescription: "สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถสมัครได้จากที่นี่ : ",
     "Current User": "ผู้ใช้ปัจจุบัน",
     topic: "หัวข้อ",
-    topicExplanation: "MQTT หัวข้อที่จะมอนิเตอร์",
+    topicExplanation: "หัวข้อ MQTT ที่จะมอนิเตอร์",
     successMessage: "ข้อความที่จะถือว่าประสบความสำเร็จ",
-    successMessageExplanation: "MQTT ข้อความที่จะถือว่าประสบความสำเร็จ",
+    successMessageExplanation: "ข้อความ MQTT ที่จะถือว่าประสบความสำเร็จ",
     recent: "ล่าสุด",
     Done: "สำเร็จ",
     Info: "ข้อมูล",
@@ -354,7 +354,7 @@ export default {
     Discard: "ทิ้ง",
     Cancel: "ยกเลิก",
     "Powered by": "ขับเคลื่อนโดย",
-    shrinkDatabaseDescription: "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจาก 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
+    shrinkDatabaseDescription: "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจากเวอร์ชั่น 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
     serwersms: "SerwerSMS.pl",
     serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
     serwersmsAPIPassword: "API Password",
@@ -364,14 +364,14 @@ export default {
     Customize: "ปรับแต่ง",
     "Custom Footer": "ส่วนท้ายที่กำหนดเอง",
     "Custom CSS": "CSS ที่กำหนดเอง",
-    smtpDkimSettings: "ตั้งค่า DKIM",
+    smtpDkimSettings: "การตั้งค่า DKIM",
     smtpDkimDesc: "โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน",
     documentation: "คู่มือการใช้งาน",
     smtpDkimDomain: "ชื่อโดเมน",
     smtpDkimKeySelector: "Key Selector",
     smtpDkimPrivateKey: "Private Key",
     smtpDkimHashAlgo: "อัลกอริทึมแฮช (ไม่บังคับ)",
-    smtpDkimheaderFieldNames: "คีย์ส่วนหัวเพื่อลงชื่อ (ไม่บังคับ)",
+    smtpDkimheaderFieldNames: "คีย์ส่วนหัวสำหรับลงชื่อ (ไม่บังคับ)",
     smtpDkimskipFields: "Header Keys ไม่ต้องเซ็น (ไม่บังคับ)",
     gorush: "Gorush",
     alerta: "Alerta",
@@ -383,11 +383,11 @@ export default {
     deleteStatusPageMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้",
     Proxies: "พร็อกซี",
     default: "ค่าเริ่มต้น",
-    enabled: "เปิดใช้งาน",
+    enabled: "เปิดใช้งานแล้ว",
     setAsDefault: "ตั้งเป็นค่าเริ่มต้น",
     deleteProxyMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?",
-    proxyDescription: "พร็อกซีจะต้องตั้งค่าให้มอนิเตอร์เพื่อให้ใช้งานได้",
-    enableProxyDescription: "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้โดยสถานะการเปิดใช้งาน",
+    proxyDescription: "ต้องตั้งค่ามอนิเตอร์ให้ใช้พร็อกซีเพื่อให้ใช้งานได้",
+    enableProxyDescription: "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้ที่ส่วนสถานะการเปิดใช้งาน",
     setAsDefaultProxyDescription: "พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
     "Certificate Chain": "ห่วงโซ่ใบรับรอง",
     Valid: "ถูกต้อง",
@@ -413,7 +413,7 @@ export default {
     "WeCom Bot Key": "WeCom Bot Key",
     "Setup Proxy": "ติดตั้งพร็อกซี่",
     "Proxy Protocol": "โปรโตคอลพร็อกซี่",
-    "Proxy Server": "พร็อกซีเซิร์ฟ",
+    "Proxy Server": "เซิร์ฟเวอร์พร็อกซี",
     "Proxy server has authentication": "พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์",
     User: "ผู้ใช้",
     Installed: "ติดตั้งแล้ว",
@@ -436,23 +436,23 @@ export default {
     "New Status Page": "หน้าสถานะใหม่",
     "Page Not Found": "ไม่พบหน้านี้",
     "Reverse Proxy": "พร็อกซีย้อนกลับ",
-    Backup: "สำรอง",
+    Backup: "สำรองข้อมูล",
     About: "เกี่ยวกับ",
     wayToGetCloudflaredURL: "(ดาวโหลด cloudflared จาก {0})",
     cloudflareWebsite: "เว็บไซต์ Cloudflare",
     "Message:": "ข้อความ :",
     "Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ",
     "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน",
-    "Other Software": "ซอฟต์แวร์อื่น ๆ ",
+    "Other Software": "ซอฟต์แวร์อื่นๆ ",
     "For example: nginx, Apache and Traefik.": "เช่น: nginx, Apache และ Traefik",
     "Please read": "กรุณาอ่าน",
     "Subject:": "เรื่อง :",
-    "Valid To:": "ถูกต้องถึง :",
+    "Valid To:": "ใช้ได้ถึง :",
     "Days Remaining:": "จำนวนวันที่เหลือ :",
     "Issuer:": "ผู้ออก :",
     "Fingerprint:": "ลายนิ้วมือ :",
     "No status pages": "ไม่มีหน้าสถานะ",
-    "Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุโดเมน",
+    "Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุของโดเมน",
     Proxy: "Proxy",
     "Date Created": "วันที่สร้าง",
     onebotHttpAddress: "ที่อยู่ HTTP OneBot ",
@@ -466,8 +466,8 @@ export default {
     "Show Powered By": "แสดงข้อความ \"ขับเคลื่อนโดย\"",
     "Domain Names": "Domain Names",
     signedInDisp: "เข้าใช้งานในฐานะ {0}",
-    signedInDispDisabled: "ปิดการตรวจสอบสิทธิ์",
-    "Certificate Expiry Notification": "แจ้งเตือนการรับรองหมดอายุ",
+    signedInDispDisabled: "ปิดการยืนยันตัวตน",
+    "Certificate Expiry Notification": "แจ้งเตือนใบรับรองหมดอายุ",
     "API Username": "API Username",
     "API Key": "API Key",
     "Recipient Number": "หมายเลขผู้รับ",
@@ -476,8 +476,8 @@ export default {
     "Octopush API Version": "Octopush API Version",
     "Legacy Octopush-DM": "Legacy Octopush-DM",
     endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" จากข้อมูลรับรอง HTTP API ในแผงควบคุม",
-    octopushLogin: "\"Login\" จากข้อมูลรับรอง HTTP API ในแผงควบคุม",
+    octopushAPIKey: "\"API key\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
+    octopushLogin: "\"Login\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
     promosmsLogin: "API Login Name",
     promosmsPassword: "API Password",
     "pushoversounds pushover": "Pushover (default)",
@@ -507,16 +507,16 @@ export default {
     pushyToken: "Device token",
     "Show update if available": "แสดงการอัปเดตถ้ามี",
     "Also check beta release": "ตรวจสอบรุ่นเบต้า",
-    "Using a Reverse Proxy?": "ใช้ Reverse Proxy?",
+    "Using a Reverse Proxy?": "ใช้ Reverse Proxy อยู่ใช่มั้ย?",
     "Check how to config it for WebSocket": "ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket",
     "Steam Game Server": "Steam Game Server",
     "Most likely causes:": "สาเหตุที่เป็นไปได้มากที่สุด :",
     "The resource is no longer available.": "ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป",
     "There might be a typing error in the address.": "อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่",
-    "What you can try:": "สิ่งที่คุณสามารถลอง :",
+    "What you can try:": "สิ่งที่คุณสามารถลองทำ :",
     "Retype the address.": "พิมพ์ที่อยู่อีกครั้ง",
-    "Go back to the previous page.": "กลับไปที่หน้าก่อนหน้า",
-    "Coming Soon": "เร็ว ๆ นี้",
+    "Go back to the previous page.": "กลับไปหน้าที่แล้ว",
+    "Coming Soon": "เร็วๆ นี้",
     wayToGetClickSendSMSToken: "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
     wayToGetLineNotifyToken: "คุณสามารถรับ access token ได้จาก {0}",
     resendEveryXTimes: "ส่งซ้ำทุก {0} ครั้ง",
@@ -525,7 +525,7 @@ export default {
     "Resend Notification if Down X times consequently": "ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง",
     error: "เกิดข้อผิดพลาด",
     critical: "วิกฤต",
-    wayToGetPagerDutyKey: "คุณสามารถรับได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา \"Events API V2\", สำหรับข้อมูลเพิ่มเติม {0}",
+    wayToGetPagerDutyKey: "คุณสามารถรับคีย์ได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา \"Events API V2\", สำหรับข้อมูลเพิ่มเติม {0}",
     "Integration Key": "Integration Key",
     "Integration URL": "Integration URL",
     "Auto resolve or acknowledged": "แก้ไขอัตโนมัติหรือยอมรับ",
@@ -539,16 +539,16 @@ export default {
     "Trust Proxy": "Trust Proxy",
     HomeAssistant: "Home Assistant",
     RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "แบ่งปันข้อมูลลับระหว่างผู้ใช้งานและเซิร์ฟเวอร์",
+    RadiusSecretDescription: "แบ่งปันคีย์ลับระหว่างผู้ใช้งานและเซิร์ฟเวอร์",
     RadiusCalledStationId: "Called Station Id",
     RadiusCalledStationIdDescription: "Identifier of the called device",
     RadiusCallingStationId: "Calling Station Id",
     RadiusCallingStationIdDescription: "Identifier of the calling device",
     "Connection String": "Connection String",
     Query: "Query",
-    settingsCertificateExpiry: "วันหมดอายุใบรับรอง TLS",
-    certificationExpiryDescription: "การตรวจสอบ HTTPS แจ้งเตือนใบอนุญาติ TLS จะหมดอายุใน:",
-    "Setup Docker Host": "Setup Docker Host",
+    settingsCertificateExpiry: "วันหมดอายุของใบรับรอง TLS",
+    certificationExpiryDescription: "การตรวจสอบ HTTPS จะแจ้งเตือนถ้าใบอนุญาติ TLS จะหมดอายุใน:",
+    "Setup Docker Host": "ติดตั้ง Docker Host",
     "Connection Type": "ประเภทการเชื่อมต่อ",
     "Docker Daemon": "Docker Daemon",
     deleteDockerHostMsg: "คุณแน่ใจหรือไม่ที่จะลบ Docker host นี้สำหรับการมอนิเตอร์ทั้งหมด?",
@@ -565,14 +565,14 @@ export default {
     trustProxyDescription: "เชื่อ Header 'X-Forwarded-*' ถ้าคุณต้องการไอพีที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache, คุณควรเปิดใช้งาน",
     Examples: "ตัวอย่าง",
     "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Access Token แบบมีอายุ",
+    "Long-Lived Access Token": "Access Token แบบมีอายุนาน",
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก \"Create Token\"",
     "Notification Service": "บริการแจ้งเตือน",
     "default: notify all devices": "ค่าเริ่มต้น: แจ้งเตือนทุกอุปกรณ์",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู \"Developer Tools > Services\" ค้นหา \"notification\" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู \"Developer Tools > Services\" แล้วค้นหา \"notification\" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์",
     "Automations can optionally be triggered in Home Assistant:": "สามารถเลือกสั่งงานระบบอัตโนมัติได้ใน Home Assistant:",
     "Trigger type:": "ชนิดสิ่งกระตุ้น:",
-    "Event type:": "ชนิดกิจกรรม:",
+    "Event type:": "ชนิดเหตการณ์:",
     "Event data:": "ข้อมูลกิจกรรม:",
     "Then choose an action, for example switch the scene to where an RGB light is red.": "จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง",
     "Frontend Version": "เวอร์ชั่น Frontend",

From df4f91c20d066c81136f1d29eaeac47f419eea65 Mon Sep 17 00:00:00 2001
From: Cyril59310 <70776486+cyril59310@users.noreply.github.com>
Date: Sun, 18 Dec 2022 08:39:54 +0100
Subject: [PATCH 344/803] Update EN language (#2429)

* Update EN language
---
 src/languages/en.js | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/src/languages/en.js b/src/languages/en.js
index def764bf..e760f92e 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -609,16 +609,16 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
     backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
-    "Optional": "Optional",
+    Optional: "Optional",
     squadcast: "Squadcast",
     SendKey: "SendKey",
     "SMSManager API Docs": "SMSManager API Docs ",
     "Gateway Type": "Gateway Type",
     SMSManager: "SMSManager",
     "You can divide numbers with": "You can divide numbers with",
-    "or": "or",
+    or: "or",
     recurringInterval: "Interval",
-    "Recurring": "Recurring",
+    Recurring: "Recurring",
     strategyManual: "Active/Inactive Manually",
     warningTimezone: "It is using the server's timezone",
     weekdayShortMon: "Mon",
@@ -647,7 +647,26 @@ export default {
     statusPageMaintenanceEndDate: "End",
     IconUrl: "Icon URL",
     "Enable DNS Cache": "Enable DNS Cache",
-    "Enable": "Enable",
-    "Disable": "Disable",
+    Enable: "Enable",
+    Disable: "Disable",
     dnsCacheDescription: "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
+    "Single Maintenance Window": "Single Maintenance Window",
+    "Maintenance Time Window of a Day": "Maintenance Time Window of a Day",
+    "Effective Date Range": "Effective Date Range",
+    "Schedule Maintenance": "Schedule Maintenance",
+    "Date and Time": "Date and Time",
+    "DateTime Range": "DateTime Range",
+    Strategy: "Strategy",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "Enable TLS",
+    "Proto Service Name": "Proto Service Name",
+    "Proto Method": "Proto Method",
+    "Proto Content": "Proto Content",
+    Economy: "Economy",
+    Lowcost: "Lowcost",
+    high: "high",
+    "General Monitor Type": "General Monitor Type",
+    "Passive Monitor Type": "Passive Monitor Type",
+    "Specific Monitor Type": "Specific Monitor Type",
 };

From c79b2913a2a36f24c9069294661b5bc4f31b6c0d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mathias=20Haugsb=C3=B8?= <mathiash98@gmail.com>
Date: Sun, 18 Dec 2022 17:16:19 +0100
Subject: [PATCH 345/803] Auth: Case insensitive login check on username

Allows users to add users with capital letters and then login with just lowercase letters.

We accidentally capitalized the first letter of our username so the other people using it frequently thinks they wrote the wrong password.
---
 server/auth.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/auth.js b/server/auth.js
index 3ce1a604..9bb9dd01 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -15,7 +15,7 @@ exports.login = async function (username, password) {
         return null;
     }
 
-    let user = await R.findOne("user", " username = ? AND active = 1 ", [
+    let user = await R.findOne("user", " username LIKE ? AND active = 1 ", [
         username,
     ]);
 

From b3ac7c3d433568cd9737e1cb563efd9d19a073d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mathias=20Haugsb=C3=B8?= <mathiash98@gmail.com>
Date: Mon, 19 Dec 2022 12:18:33 +0100
Subject: [PATCH 346/803] Username case insensitive, patch db instead of using
 LIKE

---
 db/patch-user-username-case-insensitive.sql | 47 +++++++++++++++++++++
 server/auth.js                              |  2 +-
 server/database.js                          |  1 +
 3 files changed, 49 insertions(+), 1 deletion(-)
 create mode 100644 db/patch-user-username-case-insensitive.sql

diff --git a/db/patch-user-username-case-insensitive.sql b/db/patch-user-username-case-insensitive.sql
new file mode 100644
index 00000000..90b7f1cb
--- /dev/null
+++ b/db/patch-user-username-case-insensitive.sql
@@ -0,0 +1,47 @@
+CREATE TABLE [temp_user](
+  [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+  [username] VARCHAR(255) NOT NULL UNIQUE COLLATE NOCASE,
+  [password] VARCHAR(255),
+  [active] BOOLEAN NOT NULL DEFAULT 1,
+  [timezone] VARCHAR(150),
+  twofa_secret VARCHAR(64),
+  twofa_status BOOLEAN default 0 NOT NULL,
+  twofa_last_token VARCHAR(6)
+);
+
+INSERT INTO [temp_user] SELECT
+[id],
+[username],
+[password],
+[active],
+[timezone],
+twofa_secret,
+twofa_status,
+twofa_last_token
+ FROM user;
+
+DROP TABLE user;
+
+CREATE TABLE [user](
+  [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+  [username] VARCHAR(255) NOT NULL UNIQUE COLLATE NOCASE,
+  [password] VARCHAR(255),
+  [active] BOOLEAN NOT NULL DEFAULT 1,
+  [timezone] VARCHAR(150),
+  twofa_secret VARCHAR(64),
+  twofa_status BOOLEAN default 0 NOT NULL,
+  twofa_last_token VARCHAR(6)
+);
+
+INSERT INTO [user] SELECT
+[id],
+[username],
+[password],
+[active],
+[timezone],
+twofa_secret,
+twofa_status,
+twofa_last_token
+ FROM [temp_user];
+
+DROP TABLE [temp_user];
diff --git a/server/auth.js b/server/auth.js
index 9bb9dd01..b4eeee41 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -15,7 +15,7 @@ exports.login = async function (username, password) {
         return null;
     }
 
-    let user = await R.findOne("user", " username LIKE ? AND active = 1 ", [
+    let user = await R.findOne("user", " username = ? AND active = 1", [
         username,
     ]);
 
diff --git a/server/database.js b/server/database.js
index 2544f197..7764df3f 100644
--- a/server/database.js
+++ b/server/database.js
@@ -66,6 +66,7 @@ class Database {
         "patch-add-radius-monitor.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
         "patch-maintenance-table2.sql": true,
+        "patch-user-username-case-insensitive.sql": { parents: [ "patch-2fa-invalidate-used-token.sql", "patch-2fa.sql" ] }
     };
 
     /**

From a89be0e6d4ee642323f641836c773701abb91643 Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Mon, 19 Dec 2022 13:37:42 +0200
Subject: [PATCH 347/803] Update bg-BG.js

Translation Update
---
 src/languages/bg-BG.js | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index 15ba19de..dfd11c67 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -650,4 +650,23 @@ export default {
     Enable: "Активирай",
     Disable: "Деактивирай",
     dnsCacheDescription: "Възможно е да не работи в IPv6 среда - деактивирайте, ако срещнете проблеми.",
+    "Single Maintenance Window": "Единичен времеви интервал за поддръжка",
+    "Maintenance Time Window of a Day": "Времеви интервал от деня за поддръжка",
+    "Effective Date Range": "Интервал от дни на влизане в сила",
+    "Schedule Maintenance": "Планирай поддръжка",
+    "Date and Time": "Дата и час",
+    "DateTime Range": "Изтрий времеви интервал",
+    Strategy: "Стратегия",
+    "Free Mobile User Identifier": "Free Mobile потребителски идентификатор",
+    "Free Mobile API Key": "Free Mobile API ключ",
+    "Enable TLS": "Активирай TLS",
+    "Proto Service Name": "Proto име на услугата",
+    "Proto Method": "Proto метод",
+    "Proto Content": "Proto съдържание",
+    Economy: "Икономичен",
+    Lowcost: "Евтин",
+    high: "висок",
+    "General Monitor Type": "Общ тип монитор",
+    "Passive Monitor Type": "Пасивет тип монитор",
+    "Specific Monitor Type": "Специфичен тип монитор",
 };

From 6962e056ce9677c19f4e02bd2ec3bc726dbad41f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 23 Dec 2022 22:44:49 +0800
Subject: [PATCH 348/803] Update to 1.19.0

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

diff --git a/package.json b/package.json
index fc1d4a58..98ec7cc4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.0-beta.2",
+    "version": "1.19.0",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -38,7 +38,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.18.5 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.19.0 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 14fffcf06bbcbf095a71fcdeaca5d3584b0c8173 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 24 Dec 2022 14:23:50 +0800
Subject: [PATCH 349/803] Globally fix if heartbeatJSON["msg"] is undefined

---
 server/model/monitor.js | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 6c6ccbcc..cb60156c 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1069,7 +1069,13 @@ class Monitor extends BeanModel {
 
             for (let notification of notificationList) {
                 try {
-                    await Notification.send(JSON.parse(notification.config), msg, await monitor.toJSON(false), bean.toJSON());
+                    // Prevent if the msg is undefined, notifications such as Discord cannot send out.
+                    const heartbeatJSON = bean.toJSON();
+                    if (!heartbeatJSON["msg"]) {
+                        heartbeatJSON["msg"] = "";
+                    }
+
+                    await Notification.send(JSON.parse(notification.config), msg, await monitor.toJSON(false), heartbeatJSON);
                 } catch (e) {
                     log.error("monitor", "Cannot send notification to " + notification.name);
                     log.error("monitor", e);

From 9e9c5cd1d2183e9bdf644285454dfdf8ca193e3b Mon Sep 17 00:00:00 2001
From: Augustin <me.git@augustin64.fr>
Date: Sat, 24 Dec 2022 19:41:55 +0100
Subject: [PATCH 350/803] (fr) Fix typo

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

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index e3c2d133..ab7a0ca6 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -186,7 +186,7 @@ export default {
     startOrEndWithOnly: "Commence uniquement par {0}",
     "No consecutive dashes": "Pas de double tirets",
     Next: "Continuer",
-    "Setup Proxy": "Configuer Proxy",
+    "Setup Proxy": "Configurer Proxy",
     defaultNotificationName: "Ma notification {notification} numéro ({number})",
     here: "ici",
     Required: "Requis",

From 1b6c587cc9eb34ec9638b81da7d9d29f9f1a4e9b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 26 Dec 2022 14:46:12 +0800
Subject: [PATCH 351/803] Fix #2472

---
 src/util.js | 8 +++++++-
 src/util.ts | 7 ++++++-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/util.js b/src/util.js
index f157e9e9..09e6d0ee 100644
--- a/src/util.js
+++ b/src/util.js
@@ -106,7 +106,13 @@ class Logger {
         }
         module = module.toUpperCase();
         level = level.toUpperCase();
-        const now = dayjs.tz(new Date()).format();
+        let now;
+        if (dayjs.tz) {
+            now = dayjs.tz(new Date()).format();
+        }
+        else {
+            now = dayjs().format();
+        }
         const formattedMessage = (typeof msg === "string") ? `${now} [${module}] ${level}: ${msg}` : msg;
         if (level === "INFO") {
             console.info(formattedMessage);
diff --git a/src/util.ts b/src/util.ts
index 6d3aabeb..99038c8d 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -122,7 +122,12 @@ class Logger {
         module = module.toUpperCase();
         level = level.toUpperCase();
 
-        const now = dayjs.tz(new Date()).format();
+        let now;
+        if (dayjs.tz) {
+            now = dayjs.tz(new Date()).format();
+        } else {
+            now = dayjs().format();
+        }
         const formattedMessage = (typeof msg === "string") ? `${now} [${module}] ${level}: ${msg}` : msg;
 
         if (level === "INFO") {

From e12225e59548bc60827b39d1da01516ffbdaa057 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 26 Dec 2022 21:00:46 +0800
Subject: [PATCH 352/803] Fix #2475 #2468 #2455, add Accept-Encoding only if
 encountered the abort error

---
 server/model/monitor.js | 53 ++++++++++++++++++++++++++++-------------
 1 file changed, 36 insertions(+), 17 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 81052777..186962b0 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -275,9 +275,6 @@ class Monitor extends BeanModel {
                         ...(this.body ? { data: JSON.parse(this.body) } : {}),
                         timeout: this.interval * 1000 * 0.8,
                         headers: {
-                            // Fix #2253
-                            // Read more: https://stackoverflow.com/questions/1759956/curl-error-18-transfer-closed-with-outstanding-read-data-remaining
-                            "Accept-Encoding": "gzip, deflate",
                             "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
                             "User-Agent": "Uptime-Kuma/" + version,
                             ...(this.headers ? JSON.parse(this.headers) : {}),
@@ -310,20 +307,8 @@ class Monitor extends BeanModel {
                     log.debug("monitor", `[${this.name}] Axios Options: ${JSON.stringify(options)}`);
                     log.debug("monitor", `[${this.name}] Axios Request`);
 
-                    let res;
-                    if (this.auth_method === "ntlm") {
-                        options.httpsAgent.keepAlive = true;
-
-                        res = await httpNtlm(options, {
-                            username: this.basic_auth_user,
-                            password: this.basic_auth_pass,
-                            domain: this.authDomain,
-                            workstation: this.authWorkstation ? this.authWorkstation : undefined
-                        });
-
-                    } else {
-                        res = await axios.request(options);
-                    }
+                    // Make Request
+                    let res = await this.makeAxiosRequest(options);
 
                     bean.msg = `${res.status} - ${res.statusText}`;
                     bean.ping = dayjs().valueOf() - startTime;
@@ -761,6 +746,40 @@ class Monitor extends BeanModel {
         }
     }
 
+    async makeAxiosRequest(options, finalCall = false) {
+        try {
+            let res;
+            if (this.auth_method === "ntlm") {
+                options.httpsAgent.keepAlive = true;
+
+                res = await httpNtlm(options, {
+                    username: this.basic_auth_user,
+                    password: this.basic_auth_pass,
+                    domain: this.authDomain,
+                    workstation: this.authWorkstation ? this.authWorkstation : undefined
+                });
+
+            } else {
+                res = await axios.request(options);
+            }
+
+            return res;
+        } catch (e) {
+            // Fix #2253
+            // Read more: https://stackoverflow.com/questions/1759956/curl-error-18-transfer-closed-with-outstanding-read-data-remaining
+            if (!finalCall && typeof e.message === "string" && e.message.includes("maxContentLength size of -1 exceeded")) {
+                log.debug("monitor", "makeAxiosRequest with gzip");
+                options.headers["Accept-Encoding"] = "gzip, deflate";
+                return this.makeAxiosRequest(options, true);
+            } else {
+                if (typeof e.message === "string" && e.message.includes("maxContentLength size of -1 exceeded")) {
+                    e.message = "response timeout: incomplete response within a interval";
+                }
+                throw e;
+            }
+        }
+    }
+
     /** Stop monitor */
     stop() {
         clearTimeout(this.heartbeatInterval);

From 056d957c1ee929cbf5716e6cfd796cf041942a62 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 26 Dec 2022 23:49:20 +0800
Subject: [PATCH 353/803] Update to 1.19.1

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

diff --git a/package.json b/package.json
index 98ec7cc4..fbc7e2a2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.0",
+    "version": "1.19.1",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -38,7 +38,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.19.0 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.19.1 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 06852bbf0dc024bad7bccac7b665e0fa2e9bb037 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 27 Dec 2022 00:22:09 +0800
Subject: [PATCH 354/803] Fix the UI broken after removed a monitor

---
 src/mixins/socket.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 7e3be52c..378af06a 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -590,7 +590,7 @@ export default {
             for (let monitorID in this.lastHeartbeatList) {
                 let lastHeartBeat = this.lastHeartbeatList[monitorID];
 
-                if (this.monitorList[monitorID].maintenance) {
+                if (this.monitorList[monitorID] && this.monitorList[monitorID].maintenance) {
                     result[monitorID] = {
                         text: this.$t("statusMaintenance"),
                         color: "maintenance",

From aec80b53d53454a103490f91ef469e975062a24c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 27 Dec 2022 00:22:52 +0800
Subject: [PATCH 355/803] Update to 1.19.2

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

diff --git a/package.json b/package.json
index fbc7e2a2..18ae4770 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.1",
+    "version": "1.19.2",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -38,7 +38,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.19.1 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.19.2 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 625fd7c2aabc7be7b2082720eb9127fdc8498c26 Mon Sep 17 00:00:00 2001
From: DimitriDR <dimitridroeck@gmail.com>
Date: Tue, 27 Dec 2022 01:02:43 +0100
Subject: [PATCH 356/803] Huge improvement for French localization.

---
 src/languages/fr-FR.js | 614 ++++++++++++++++++++++-------------------
 1 file changed, 333 insertions(+), 281 deletions(-)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index ab7a0ca6..5ad04bfe 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -1,31 +1,49 @@
 export default {
     languageName: "Français",
     checkEverySecond: "Vérifier toutes les {0} secondes",
-    retryCheckEverySecond: "Réessayer toutes les {0} secondes.",
-    retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.",
+    retryCheckEverySecond: "Réessayer toutes les {0} secondes",
+    resendEveryXTimes: "Renvoyez toutes les {0} fois",
+    resendDisabled: "Renvoi désactivé",
+    retriesDescription: "Nombre d'essais avant que le service ne soit déclaré hors ligne et qu'une notification soit envoyée.",
     ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS",
-    upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors-ligne et vice-versa.",
-    maxRedirectDescription: "Nombre maximal de redirections avant que le service soit noté hors-ligne.",
-    acceptedStatusCodesDescription: "Codes HTTP considérés comme en ligne",
+    upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors ligne et vice-versa.",
+    maxRedirectDescription: "Nombre maximal de redirections avant que le service ne soit marqué comme hors ligne.",
+    enableGRPCTls: "Autoriser l'envoi d'une requête gRPC avec une connexion TLS",
+    grpcMethodDescription: "Le nom de la méthode est converti au format CamelCase tel que sayHello, check, etc.",
+    acceptedStatusCodesDescription: "Codes HTTP qui considèrent le service comme étant disponible.",
+    Maintenance: "Maintenance",
+    statusMaintenance: "Maintenance",
+    "Schedule maintenance": "Planifier la maintenance",
+    "Affected Monitors": "Sondes concernées",
+    "Pick Affected Monitors...": "Sélectionner les sondes concernées...",
+    "Start of maintenance": "Début de la maintenance",
+    "All Status Pages": "Toutes les pages d'état",
+    "Select status pages...": "Sélectionner les pages d'état...",
+    recurringIntervalMessage: "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
+    affectedMonitorsDescription: "Sélectionnez les sondes concernées par la maintenance en cours",
+    affectedStatusPages: "Afficher ce message de maintenance sur les pages d'état sélectionnées",
+    atLeastOneMonitor: "Sélectionnez au moins une sonde concernée",
     passwordNotMatchMsg: "Les mots de passe ne correspondent pas",
     notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
     keywordDescription: "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
     pauseDashboardHome: "En pause",
-    deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
+    deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
+    deleteMaintenanceMsg: "Voulez-vous vraiment supprimer cette maintenance ?",
     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.",
+    dnsPortDescription: "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
     resolverserverDescription: "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
     rrtypeDescription: "Veuillez sélectionner un type d'enregistrement DNS",
-    pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
+    pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
     enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
-    clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
-    clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
+    clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
+    clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
     confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
-    importHandleDescription: "Choisissez 'Ignorer l'existant' si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option 'Écraser' supprime toutes les sondes et notifications existantes.",
+    importHandleDescription: "Choisissez « Ignorer l'existant » si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option « Écraser » supprime toutes les sondes et notifications existantes.",
     confirmImportMsg: "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
     twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
-    tokenValidSettingsMsg: "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres 2FA.",
-    confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer le 2FA ?",
-    confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver le 2FA ?",
+    tokenValidSettingsMsg: "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres de double authentification (2FA).",
+    confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer la double authentification (2FA) ?",
+    confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver la double authentification (2FA) ?",
     Settings: "Paramètres",
     Dashboard: "Tableau de bord",
     "New Update": "Mise à jour disponible",
@@ -33,8 +51,9 @@ export default {
     Appearance: "Apparence",
     Theme: "Thème",
     General: "Général",
+    "Primary Base URL": "URL principale",
     Version: "Version",
-    "Check Update On GitHub": "Consulter les mises à jour sur Github",
+    "Check Update On GitHub": "Consulter les mises à jour sur GitHub",
     List: "Lister",
     Add: "Ajouter",
     "Add New Monitor": "Ajouter une nouvelle sonde",
@@ -43,25 +62,25 @@ export default {
     Down: "Hors ligne",
     Pending: "En attente",
     Unknown: "Inconnu",
-    Pause: "En Pause",
+    Pause: "En pause",
     Name: "Nom",
     Status: "État",
     DateTime: "Heure",
     Message: "Messages",
-    "No important events": "Pas d'évènements important",
+    "No important events": "Aucun évènement important",
     Resume: "Reprendre",
     Edit: "Modifier",
     Delete: "Supprimer",
     Current: "Actuellement",
-    Uptime: "Uptime",
+    Uptime: "Disponibilité",
     "Cert Exp.": "Expiration SSL",
     day: "jour | jours",
-    "-day": "-jours",
-    hour: "-heure",
-    "-hour": "-heures",
+    "-day": " jours",
+    hour: "heure",
+    "-hour": " heure",
     Response: "Temps de réponse",
     Ping: "Ping",
-    "Monitor Type": "Type de Sonde",
+    "Monitor Type": "Type de sonde",
     Keyword: "Mot-clé",
     "Friendly Name": "Nom d'affichage",
     URL: "URL",
@@ -70,25 +89,29 @@ export default {
     "Heartbeat Interval": "Intervalle de vérification",
     Retries: "Essais",
     "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
+    "Resend Notification if Down X times consequently": "Renvoyer une notification si hors ligne X fois",
     Advanced: "Avancé",
     "Upside Down Mode": "Mode inversé",
     "Max. Redirects": "Nombre maximum de redirections",
     "Accepted Status Codes": "Codes HTTP acceptés",
+    "Push URL": "Push URL",
+    needPushEvery: "Vous devez appeler cette URL toutes les {0} secondes.",
+    pushOptionalParams: "Paramètres facultatifs : {0}",
     Save: "Sauvegarder",
     Notifications: "Notifications",
-    "Not available, please setup.": "Pas de système de notification disponible, merci de le configurer",
+    "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 surveillés",
+    "Theme - Heartbeat Bar": "Thème - barres d'état",
     Normal: "Normal",
     Bottom: "En dessous",
     None: "Aucun",
-    Timezone: "Fuseau Horaire",
+    Timezone: "Fuseau horaire",
     "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": "Refuser l'indexation par des moteurs de recherche",
+    "Allow indexing": "Autoriser l'indexation",
+    "Discourage search engines from indexing site": "Refuser l'indexation",
     "Change Password": "Changer le mot de passe",
     "Current Password": "Mot de passe actuel",
     "New Password": "Nouveau mot de passe",
@@ -96,26 +119,29 @@ export default {
     "Update Password": "Mettre à jour le mot de passe",
     "Disable Auth": "Désactiver l'authentification",
     "Enable Auth": "Activer l'authentification",
-    Logout: "Se déconnecter",
+    "disableauth.message1": "Voulez-vous vraiment <strong>désactiver l'authentification</strong> ?",
+    "disableauth.message2": "Cette fonctionnalité est conçue pour les scénarios <strong>où vous avez l'intention d'implémenter une authentification tierce</strong> devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
+    "Please use this option carefully!": "Veuillez utiliser cette option avec précaution !",
+    Logout: "Déconnexion",
     Leave: "Quitter",
-    "I understand, please disable": "Je comprends, désactivez-le",
+    "I understand, please disable": "Je comprends, désactivez-la",
     Confirm: "Confirmer",
     Yes: "Oui",
     No: "Non",
     Username: "Nom d'utilisateur",
     Password: "Mot de passe",
     "Remember me": "Se souvenir de moi",
-    Login: "Se connecter",
+    Login: "Connexion",
     "No Monitors, please": "Pas de sondes, veuillez",
     "add one": "en ajouter une",
     "Notification Type": "Type de notification",
-    Email: "Email",
+    Email: "Courriel",
     Test: "Tester",
     "Certificate Info": "Informations sur le certificat SSL",
     "Resolver Server": "Serveur DNS utilisé",
     "Resource Record Type": "Type d'enregistrement DNS recherché",
     "Last Result": "Dernier résultat",
-    "Create your admin account": "Créez votre compte administrateur",
+    "Create your admin account": "Créer votre compte administrateur",
     "Repeat Password": "Répéter le mot de passe",
     "Import Backup": "Importation de la sauvegarde",
     "Export Backup": "Exportation de la sauvegarde",
@@ -127,9 +153,9 @@ export default {
     "Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
     Create: "Créer",
     "Clear Data": "Effacer les données",
-    Events: "Evénements",
+    Events: "Événements",
     Heartbeats: "Vérifications",
-    "Auto Get": "Récuperer automatiquement",
+    "Auto Get": "Récupérer automatiquement",
     backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
     backupDescription2: "PS : Les données relatives à l'historique et aux événements ne sont pas incluses.",
     backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
@@ -137,15 +163,15 @@ export default {
     alertWrongFileType: "Veuillez sélectionner un fichier JSON à importer.",
     "Clear all statistics": "Effacer toutes les statistiques",
     "Skip existing": "Sauter l'existant",
-    Overwrite: "Ecraser",
+    Overwrite: "Écraser",
     Options: "Options",
     "Keep both": "Garder les deux",
     "Verify Token": "Vérifier le jeton",
-    "Setup 2FA": "Configurer 2FA",
-    "Enable 2FA": "Activer 2FA",
-    "Disable 2FA": "Désactiver 2FA",
-    "2FA Settings": "Paramètres 2FA",
-    "Two Factor Authentication": "Authentification à deux facteurs",
+    "Setup 2FA": "Configurer la double authentification (2FA)",
+    "Enable 2FA": "Activer la double authentification (2FA)",
+    "Disable 2FA": "Désactiver la double authentification (2FA)",
+    "2FA Settings": "Paramètres de la la double authentification (2FA)",
+    "Two Factor Authentication": "Double authentification",
     Active: "Actif",
     Inactive: "Inactif",
     Token: "Jeton",
@@ -179,52 +205,47 @@ export default {
     "Go to Dashboard": "Accéder au tableau de bord",
     "Status Page": "Page de statut",
     "Status Pages": "Pages de statut",
-    "New Status Page": "Ajouter page de statut",
-    "Add New Status Page": "Ajouter une page de statut",
-    "No status pages": "Aucune page de statut.",
-    "Accept characters:": "Caractères acceptés:",
-    startOrEndWithOnly: "Commence uniquement par {0}",
-    "No consecutive dashes": "Pas de double tirets",
-    Next: "Continuer",
-    "Setup Proxy": "Configurer Proxy",
     defaultNotificationName: "Ma notification {notification} numéro ({number})",
     here: "ici",
     Required: "Requis",
     telegram: "Telegram",
-    "Bot Token": "Bot Token",
+    "Bot Token": "Jeton du robot",
     wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.",
     "Chat ID": "Chat ID",
-    supportTelegramChatID: "Supporte les messages privés / en groupe / l'ID du salon",
-    wayToGetTelegramChatID: "Vous pouvez obtenir l'ID du chat en envoyant un message avec le bot puis en récupérant l'URL pour voir l'ID du salon :",
-    "YOUR BOT TOKEN HERE": "VOTRE TOKEN BOT ICI",
-    chatIDNotFound: "ID du salon introuvable, envoyez un message via le bot avant",
+    supportTelegramChatID: "Prend en charge les messages privés / messages de groupe / l'ID d'un salon",
+    wayToGetTelegramChatID: "Vous pouvez obtenir le Chat ID en envoyant un message avec le robot puis en récupérant l'URL pour voir l'ID du salon :",
+    "YOUR BOT TOKEN HERE": "VOTRE JETON ROBOT ICI",
+    chatIDNotFound: "ID du salon introuvable, envoyez un message via le robot avant",
     webhook: "Webhook",
     "Post URL": "Post URL",
     "Content Type": "Type de contenu",
-    webhookJsonDesc: "{0} est bien/bon pour tous les serveurs HTTP modernes comme express.js",
-    webhookFormDataDesc: "{multipart} est bien/bon pour du PHP, vous avez juste besoin de mettre le json via/depuis {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "Aucun/STARTTLS (25, 587)",
+    webhookJsonDesc: "{0} est bien pour tous les serveurs HTTP modernes comme Express.js",
+    webhookFormDataDesc: "{multipart} est bien pour du PHP. Le JSON aura besoin d'être parsé avec {decodeFunction}",
+    webhookAdditionalHeadersTitle: "En-têtes supplémentaires",
+    webhookAdditionalHeadersDesc: "Définit des en-têtes supplémentaires envoyés avec le webhook.",
+    smtp: "Courriel (SMTP)",
+    secureOptionNone: "Aucun / STARTTLS (25, 587)",
     secureOptionTLS: "TLS (465)",
     "Ignore TLS Error": "Ignorer les erreurs TLS",
-    "From Email": "Depuis l'Email",
-    "To Email": "Vers l'Email",
+    "From Email": "Depuis l'adresse",
+    emailCustomSubject: "Objet personnalisé",
+    "To Email": "Vers l'adresse",
     smtpCC: "CC",
-    smtpBCC: "BCC",
+    smtpBCC: "CCI",
     discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans 'Paramètres du Serveur' -> 'Intégrations' -> 'Créer un Webhook'",
-    "Bot Display Name": "Nom du bot (affiché)",
-    "Prefix Custom Message": "Prefixe du message personnalisé",
+    "Discord Webhook URL": "URL vers le webhook Discord",
+    wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Créer un Webhook »",
+    "Bot Display Name": "Nom du robot (affiché)",
+    "Prefix Custom Message": "Préfixe du message personnalisé",
     "Hello @everyone is...": "Bonjour {'@'}everyone il...",
     teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
+    "Webhook URL": "URL vers le webhook",
     wayToGetTeamsURL: "Vous pouvez apprendre comment créer un Webhook {0}.",
     signal: "Signal",
     Number: "Numéro",
     Recipients: "Destinataires",
     needSignalAPI: "Vous avez besoin d'un client Signal avec l'API REST.",
-    wayToCheckSignalURL: "Vous pouvez regarder l'URL sur comment le mettre en place :",
+    wayToCheckSignalURL: "Vous pouvez regarder l'URL suivante pour savoir comment la mettre en place :",
     signalImportant: "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
     gotify: "Gotify",
     "Application Token": "Jeton d'application",
@@ -233,18 +254,21 @@ export default {
     slack: "Slack",
     "Icon Emoji": "Icon Emoji",
     "Channel Name": "Nom du salon",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Plus d'informations sur les Webhooks ici : {0}",
-    aboutChannelName: "Mettez le nom du salon dans {0} dans 'Channel Name' si vous voulez bypass le salon Webhook. Ex : #autre-salon",
+    "Uptime Kuma URL": "URL vers Uptime Kuma",
+    aboutWebhooks: "Plus d'informations sur les webhooks ici : {0}",
+    aboutChannelName: "Mettez le nom du salon dans {0} dans « Nom du salon » si vous voulez contourner le salon webhook. Ex. : #autre-salon",
     aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
-    emojiCheatSheet: "Aide emoji : {0}",
+    emojiCheatSheet: "Aide sur les émojis : {0}",
     "rocket.chat": "Rocket.chat",
     pushover: "Pushover",
     pushy: "Pushy",
+    PushByTechulus: "Push by Techulus",
     octopush: "Octopush",
     promosms: "PromoSMS",
+    clicksendsms: "ClickSend SMS",
     lunasea: "LunaSea",
-    apprise: "Apprise (Prend en charge plus de 50 services de notification)",
+    apprise: "Apprise (prend en charge plus de 50 services de notification)",
+    GoogleChat: "Google Chat (Google Workspace uniquement)",
     pushbullet: "Pushbullet",
     line: "Line Messenger",
     mattermost: "Mattermost",
@@ -253,91 +277,75 @@ export default {
     "Message Title": "Titre du message",
     "Notification Sound": "Son de notification",
     "More info on:": "Plus d'informations sur : {0}",
-    pushoverDesc1: "Priorité d'urgence (2) a par défaut 30 secondes de délai dépassé entre les tentatives et expierera après 1 heure.",
-    pushoverDesc2: "Si vous voulez envoyer des notifications sur différents Appareils, remplissez le champ 'Device'.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Rapide - recommandé pour les alertes)",
-    octopushTypeLowCost: "À bas prix (Lent, bloqué de temps en temps par l'opérateur)",
-    "Check octopush prices": "Vérifier les prix d'octopush {0}.",
-    octopushPhoneNumber: "Numéro de téléphone (format int., ex : +33612345678) ",
-    octopushSMSSender: "Nom de l'envoyer : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Exemple : {0}",
+    pushoverDesc1: "Priorité d'urgence (2) a un délai par défaut de 30 secondes entre les tentatives et expire après une heure.",
+    pushoverDesc2: "Si vous voulez envoyer des notifications sur différents appareils, remplissez le champ « Appareil ».",
+    "SMS Type": "Type de SMS",
+    octopushTypePremium: "Premium (rapide - recommandé pour les alertes)",
+    octopushTypeLowCost: "Économique (lent, bloqué de temps en temps par l'opérateur)",
+    checkPrice: "Vérification {0} tarifs :",
+    apiCredentials: "Identifiants de l'API",
+    octopushLegacyHint: "Voulez-vous utiliser l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
+    "Check octopush prices": "Vérifier les prix d'Octopush {0}.",
+    octopushPhoneNumber: "Numéro de téléphone (format international, ex. : +33612345678)",
+    octopushSMSSender: "Nom de l'expéditeur : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
+    "LunaSea Device ID": "Identifiant d'appareil LunaSea",
+    "Apprise URL": "URL d'Apprise",
+    "Example:": "Exemple : {0}",
     "Read more:": "En savoir plus : {0}",
-    "Status:": "Status : {0}",
+    "Status:": "État : {0}",
     "Read more": "En savoir plus",
     appriseInstalled: "Apprise est installé.",
     appriseNotInstalled: "Apprise n'est pas installé. {0}",
-    "Access Token": "Token d'accès",
-    "Channel access token": "Token d'accès au canal",
-    "Line Developers Console": "Ligne console de développeurs",
-    lineDevConsoleTo: "Ligne console de développeurs - {0}",
+    "Access Token": "Jeton d'accès",
+    "Channel access token": "Jeton d'accès au canal",
+    "Line Developers Console": "Console développeurs Line",
+    lineDevConsoleTo: "Console développeurs Line - {0}",
     "Basic Settings": "Paramètres de base",
     "User ID": "Identifiant utilisateur",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Premièrement accéder à {0}, créez un Provider et un Salon (Messaging API), puis vous pourrez avoir le Token d'accès du salon ainsi que l'Identifiant utilisateur depuis le même menu.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Vous pouvez mettre un lien vers l'image dans \"Icon URL\" pour remplacer l'image de profil par défaut. Ne sera pas utilisé si Icon Emoji est défini.",
-    aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le Webhook utilise en mettant le nom du salon dans le champ \"Channel Name\". Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex : #autre-salon",
+    "Messaging API": "Messaging API", // Ne pas traduire, il s'agit du type de salon affiché sur la console développeurs Line
+    wayToGetLineChannelToken: "Premièrement accédez à {0}, créez un <i>provider</i> et définissez un type de salon à « Messaging API ». Vous pourrez alors avoir  puis vous pourrez avoir le jeton d'accès du salon et l'identifiant utilisateur demandés.",
+    "Icon URL": "URL vers l'icône",
+    aboutIconURL: "Vous pouvez mettre un lien vers une image dans « URL vers l'icône » pour remplacer l'image de profil par défaut. Elle ne sera utilisé que si « Icône émoji » n'est pas défini.",
+    aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le webhook utilise en mettant le nom du salon dans le champ « Nom du salon ». Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex. : #autre-salon",
     matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - Pas cher mais lent et souvent surchargé. Limité uniquement aux déstinataires Polonais.",
-    promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux déstinataires Polonais.",
-    promosmsTypeFull: "SMS FULL - Version Premium des SMS, Vous pouvez mettre le nom de l'expéditeur (Vous devez vous enregistrer avant). Fiable pour les alertes.",
-    promosmsTypeSpeed: "SMS SPEED - La plus haute des priorités dans le système. Très rapide et fiable mais cher (environ le double du prix d'un SMS FULL).",
-    promosmsPhoneNumber: "Numéro de téléphone (Poiur les déstinataires Polonais, vous pouvez enlever les codes interna.)",
-    promosmsSMSSender: "SMS Expéditeur : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Primary Base URL": "URL principale",
-    emailCustomSubject: "Sujet personalisé",
-    clicksendsms: "ClickSend SMS",
-    checkPrice: "Vérification {0} tarifs :",
-    apiCredentials: "Crédentials de l'API",
-    octopushLegacyHint: "Vous utilisez l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
+    promosmsTypeEco: "SMS ECO - Bon marché mais lent et souvent surchargé. Limité uniquement aux destinataires polonais.",
+    promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux destinataires Polonais.",
+    promosmsTypeFull: "SMS FULL - Version premium des SMS. Vous pouvez mettre le nom de l'expéditeur (vous devez l'enregistrer au préalable). Fiable pour les alertes.",
+    promosmsTypeSpeed: "SMS SPEED - Priorité élevée pour le système. Très rapide et fiable mais coûteux (environ le double du prix d'un SMS FULL).",
+    promosmsPhoneNumber: "Numéro de téléphone (pour les destinataires polonais, vous pouvez ignorer l'indicatif international)",
+    promosmsSMSSender: "Nom de l'expéditeur du SMS : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
     "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultatif)",
+    matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultative)",
     "Internal Room Id": "ID de la salle interne",
     matrixDesc1: "Vous pouvez trouver l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est censé ressembler à !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Au lieu de cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
+    matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Pour cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
     Method: "Méthode",
-    Body: "Le corps",
+    Body: "Corps",
     Headers: "En-têtes",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Les en-têtes de la requête ne sont pas dans un format JSON valide: ",
-    BodyInvalidFormat: "Le corps de la requête n'est pas dans un format JSON valide: ",
+    PushUrl: "URL Push",
+    HeadersInvalidFormat: "Les en-têtes de la requête ne sont pas dans un format JSON valide : ",
+    BodyInvalidFormat: "Le corps de la requête n'est pas dans un format JSON valide : ",
     "Monitor History": "Historique de la sonde",
-    clearDataOlderThan: "Garder l'historique des données de la sonde durant {0} jours.",
+    clearDataOlderThan: "Conserver l'historique des données de la sonde durant {0} jours.",
     PasswordsDoNotMatch: "Les mots de passe ne correspondent pas.",
-    records: "Enregistrements",
+    records: "enregistrements",
     "One record": "Un enregistrement",
-    steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin  d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
+    steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
     "Current User": "Utilisateur actuel",
+    topic: "Topic",
+    topicExplanation: "Topic MQTT à surveiller",
+    successMessage: "Message de réussite",
+    successMessageExplanation: "Message MQTT qui sera considéré comme un succès",
     recent: "Récent",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environement",
-    alertaApiKey: "Clé de l'API",
-    alertaAlertState: "État de l'Alerte",
-    alertaRecoverState: "État de récupération",
-    resendEveryXTimes: "Renvoyez toutes les {0} fois",
-    resendDisabled: "Renvoi désactivé",
-    dnsPortDescription: "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
-    "Resend Notification if Down X times consequently": "Renvoyer la notification a partir d'un certain temps",
-    "Push URL": "Push URL",
-    needPushEvery: "Vous devez appeler cette URL toutes les {0} secondes.",
-    pushOptionalParams: "parametres optionnels: {0}",
-    "disableauth.message1": "Voulez-vous vraiment <strong>désactiver l'authentification</strong>?",
-    "disableauth.message2": "Il est conçu pour les scénarios <strong>où vous avez l'intention d'implémenter une authentification tierce</strong> devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
-    "Please use this option carefully!": "Veuillez utiliser cette option avec précaution !",
-    PushByTechulus: "Pousser par Techulus",
-    GoogleChat: "Google Chat (Google Workspace uniquement)",
     Done: "Fait",
     Info: "Info",
     Security: "Sécurité",
-    "Steam API Key": "Clé API Steam",
+    "Steam API Key": "Clé d'API Steam",
     "Shrink Database": "Réduire la base de données",
     "Pick a RR-Type...": "Choisissez un type d'enregistrement...",
     "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés...",
     Default: "Défaut",
-    "HTTP Options": "Options HTTP ",
+    "HTTP Options": "Options HTTP",
     "Create Incident": "Créer un incident",
     Title: "Titre",
     Content: "Contenu",
@@ -351,151 +359,160 @@ export default {
     light: "Blanc",
     dark: "Noir",
     Post: "Post",
-    "Please input title and content": "Veuillez entrer le titre et le contenu",
-    Created: "Created",
+    "Please input title and content": "Veuillez saisir le titre et le contenu",
+    Created: "Créé",
     "Last Updated": "Dernière mise à jour",
-    Unpin: "Détacher",
+    Unpin: "Retirer",
     "Switch to Light Theme": "Passer au thème clair",
     "Switch to Dark Theme": "Passer au thème sombre",
-    "Show Tags": "Voir les étiquettes",
+    "Show Tags": "Afficher les étiquettes",
     "Hide Tags": "Masquer les étiquettes",
     Description: "Description",
-    "No monitors available.": "Aucun moniteur disponible.",
-    "Add one": "En rajouter un",
-    "No Monitors": "Aucun moniteur",
+    "No monitors available.": "Aucune sonde disponible.",
+    "Add one": "En rajouter une",
+    "No Monitors": "Aucune sonde",
     "Untitled Group": "Groupe sans titre",
     Services: "Services",
-    Discard: "Annuler",
+    Discard: "Abandonner",
     Cancel: "Annuler",
-    shrinkDatabaseDescription: "Déclencher la base de données VACUUM pour SQLite. Si votre base de données est créée après 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
+    "Powered by": "Propulsé par",
+    shrinkDatabaseDescription: "Déclenche la commande VACUUM pour SQLite. Si votre base de données a été créée après la version 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
+    serwersms: "SerwerSMS.pl",
     serwersmsAPIUser: "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
     serwersmsAPIPassword: "Mot de passe API",
     serwersmsPhoneNumber: "Numéro de téléphone",
     serwersmsSenderName: "Nom de l'expéditeur du SMS (enregistré via le portail client)",
+    smseagle: "SMSEagle",
+    smseagleTo: "Numéro(s) de téléphone",
+    smseagleGroup: "Nom(s) de groupe(s) de répertoire",
+    smseagleContact: "Nom(s) de contact du répertoire",
+    smseagleRecipientType: "Type de destinataire",
+    smseagleRecipient: "Destinataire(s) (les multiples doivent être séparés par une virgule)",
+    smseagleToken: "Jeton d'accès à l'API",
+    smseagleUrl: "L'URL de votre appareil SMSEagle",
+    smseagleEncoding: "Envoyer en Unicode",
+    smseaglePriority: "Priorité des messages (0-9, par défaut = 0)",
+    stackfield: "Stackfield",
     Customize: "Personnaliser",
     "Custom Footer": "Pied de page personnalisé",
     "Custom CSS": "CSS personnalisé",
-    deleteStatusPageMsg: "Voulez-vous vraiment supprimer cette page d'état ?",
-    Proxies: "Proxies",
-    default: "Défaut",
-    enabled: "Activé",
-    setAsDefault: "Définir par défaut",
-    deleteProxyMsg: "Voulez-vous vraiment supprimer ce proxy pour tous les moniteurs ?",
-    proxyDescription: "Les proxys doivent être affectés à un moniteur pour fonctionner.",
-    enableProxyDescription: "Ce proxy n'aura pas d'effet sur les demandes de moniteur tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de tous les moniteurs en fonction de l'état d'activation.",
-    setAsDefaultProxyDescription: "Ce proxy sera activé par défaut pour les nouveaux moniteurs. Vous pouvez toujours désactiver le proxy séparément pour chaque moniteur.",
-    Valid: "Valide",
-    Invalid: "Non valide",
-    User: "Utilisateur",
-    Installed: "Installé",
-    "Not installed": "Pas installé",
-    "Remove Token": "Supprimer le jeton",
-    Slug: "Chemin",
-    "The slug is already taken. Please choose another slug.": "Le chemin est déjà pris. Veuillez choisir un autre chemin.",
-    Authentication: "Authentication",
-    "Page Not Found": "Page non trouvée",
-    Backup: "Sauvegarde",
-    About: "À propos de",
-    "Footer Text": "Texte de pied de page",
-    "Domain Names": "Noms de domaine",
-    signedInDisp: "Connecté en tant que {0}",
-    signedInDispDisabled: "Authentification désactivée.",
-    "Show update if available": "Afficher la mise à jour si disponible",
-    "Also check beta release": "Vérifiez également la version bêta",
-    "Steam Game Server": "Serveur de jeu Steam",
-    "Most likely causes:": "Causes les plus probables:",
-    "The resource is no longer available.": "La ressource n'est plus disponible.",
-    "There might be a typing error in the address.": "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
-    "What you can try:": "Ce que vous pouvez essayer:",
-    "Retype the address.": "Retapez l'adresse.",
-    "Go back to the previous page.": "Retournez à la page précédente.",
-    "Coming Soon": "À venir",
-    settingsCertificateExpiry: "Expiration du certificat TLS",
-    certificationExpiryDescription: "Les moniteurs HTTPS déclenchent une notification lorsque le certificat TLS expire dans:",
-    "Setup Docker Host": "Configurer l'hôte Docker",
-    "Connection Type": "Type de connexion",
-    deleteDockerHostMsg: "Voulez-vous vraiment supprimer cet hôte Docker pour tous les moniteurs ?",
-    "Container Name / ID": "Nom / ID du conteneur",
-    "Docker Host": "Hôte Docker",
-    "Docker Hosts": "Hôtes Docker",
-    Domain: "Domaine",
-    trustProxyDescription: "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma est en retard, comme Nginx ou Apache, vous devez l'activer.",
-    wayToGetLineNotifyToken: "Vous pouvez obtenir un jeton d'accès auprès de {0}",
-    Examples: "Exemples",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
-    "Notification Service": "Service de notifications",
-    "default: notify all devices": "par défaut: notifier tous les appareils",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
-    "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant:",
-    "Trigger type:": "Type de déclencheur:",
-    "Event type:": "Type d'événement:",
-    "Event data:": "Données d'événement:",
-    topic: "Topic",
-    topicExplanation: "MQTT sujet à surveiller",
-    successMessage: "Message de réussite",
-    successMessageExplanation: "MQTT message qui sera considéré comme un succès",
-    "Powered by": "Propulsé par",
-    serwersms: "SerwerSMS.pl",
-    stackfield: "Stackfield",
     smtpDkimSettings: "Paramètres DKIM",
     smtpDkimDesc: "Veuillez vous référer au Nodemailer DKIM {0} pour l'utilisation.",
-    documentation: "Documentation",
+    documentation: "documentation",
     smtpDkimDomain: "Nom de domaine",
     smtpDkimKeySelector: "Sélecteur de clé",
     smtpDkimPrivateKey: "Clé privée",
     smtpDkimHashAlgo: "Algorithme de hachage (facultatif)",
     smtpDkimheaderFieldNames: "Clés d'en-tête à signer (facultatif)",
     smtpDkimskipFields: "Clés d'en-tête à ne pas signer (facultatif)",
-    wayToGetPagerDutyKey: "Vous pouvez l'obtenir en allant dans Service -> Annuaire des services -> (Sélectionner un service) -> Intégrations -> Ajouter une intégration. Ici, vous pouvez rechercher \"Events API V2\". Plus d'infos {0}",
+    wayToGetPagerDutyKey: "Vous pouvez l'obtenir en allant dans Service -> Annuaire des services -> (sélectionner un service) -> Intégrations -> Ajouter une intégration. Ici, vous pouvez rechercher \"Events API V2\". Plus d'infos {0}",
     "Integration Key": "Clé d'intégration",
     "Integration URL": "URL d'intégration",
     "Auto resolve or acknowledged": "Résolution automatique ou accusé de réception",
     "do nothing": "ne fais rien",
     "auto acknowledged": "accusé de réception automatique",
     "auto resolve": "résolution automatique",
+    gorush: "Gorush",
+    alerta: "Alerta",
+    alertaApiEndpoint: "API Endpoint",
+    alertaEnvironment: "Environnement",
+    alertaApiKey: "Clé de l'API",
+    alertaAlertState: "État de l'alerte",
+    alertaRecoverState: "État de récupération",
+    deleteStatusPageMsg: "Voulez-vous vraiment supprimer cette page d'état ?",
+    Proxies: "Proxies",
+    default: "Défaut",
+    enabled: "Activé",
+    setAsDefault: "Définir par défaut",
+    deleteProxyMsg: "Voulez-vous vraiment supprimer ce proxy pour toutes les sondes ?",
+    proxyDescription: "Les proxies doivent être affectés à une sonde pour fonctionner.",
+    enableProxyDescription: "Ce proxy n'aura pas d'effet sur les demandes de sonde tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de toutes les sondes en fonction de l'état d'activation.",
+    setAsDefaultProxyDescription: "Ce proxy sera activé par défaut pour les nouvelles sondes. Vous pouvez toujours désactiver le proxy séparément pour chaque sonde.",
+    "Certificate Chain": "Chaîne de certificats",
+    Valid: "Valide",
+    Invalid: "Non valide",
     AccessKeyId: "ID de clé d'accès",
     SecretAccessKey: "Clé secrète d'accès",
-    PhoneNumbers: "Les numéros de téléphone",
+    PhoneNumbers: "Numéros de téléphone",
+    TemplateCode: "Modèle de code",
     SignName: "Signature",
-    "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
+    "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
+    "Bark Endpoint": "Endpoint Bark",
+    "Bark Group": "Groupe Bark",
+    "Bark Sound": "Son Bark",
+    WebHookUrl: "WebHookUrl",
     SecretKey: "Clé secrète",
-    "For safety, must use secret key": "Pour la sécurité, doit utiliser la clé secrète",
+    "For safety, must use secret key": "Par sécurité, utilisation obligatoire de la clé secrète",
     "Device Token": "Jeton d'appareil",
     Platform: "Plateforme",
+    iOS: "iOS",
+    Android: "Android",
+    Huawei: "Huawei",
+    High: "Haute",
     Retry: "Recommencez",
     Topic: "Topic",
-    "Proxy server has authentication": "Le serveur proxy a une authentification",
+    "WeCom Bot Key": "Clé de robot WeCom",
+    "Setup Proxy": "Configurer le proxy",
+    "Proxy Protocol": "Protocole proxy",
+    "Proxy Server": "Serveur proxy",
+    "Proxy server has authentication": "Une authentification est nécessaire pour le serveur proxy",
+    User: "Utilisateur",
+    Installed: "Installé",
+    "Not installed": "Non installé",
     Running: "Fonctionne",
     "Not running": "Ne fonctionne pas",
-    Start: "Start",
-    Stop: "Stop",
+    "Remove Token": "Supprimer le jeton",
+    Start: "Démarrer",
+    Stop: "Arrêter",
     "Uptime Kuma": "Uptime Kuma",
-    "No Proxy": "Pas de Proxy",
+    "Add New Status Page": "Ajouter une page de statut",
+    Slug: "Chemin",
+    "Accept characters:": "Caractères acceptés : ",
+    startOrEndWithOnly: "Commence uniquement par {0}",
+    "No consecutive dashes": "Pas de double tirets",
+    Next: "Continuer",
+    "The slug is already taken. Please choose another slug.": "Un chemin existe déjà. Veuillez en choisir un autre.",
+    "No Proxy": "Pas de proxy",
+    Authentication: "Authentification",
     "HTTP Basic Auth": "Authentification de base HTTP",
+    "New Status Page": "Nouvelle page de statut",
+    "Page Not Found": "Page non trouvée",
     "Reverse Proxy": "Proxy inverse",
-    wayToGetCloudflaredURL: "(Télécharger cloudflared depuis {0})",
-    cloudflareWebsite: "le site Cloudflare ",
-    "Message:": "Message:",
-    "Don't know how to get the token? Please read the guide:": "Vous ne savez pas comment obtenir le jeton ? Veuillez lire le guide:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexion actuelle peut être perdue si vous vous connectez actuellement via Cloudflare Tunnel. Êtes-vous sûr de vouloir l'arrêter ? Tapez votre mot de passe actuel pour le confirmer.",
+    Backup: "Sauvegarde",
+    About: "À propos",
+    wayToGetCloudflaredURL: "(télécharger cloudflared depuis {0})",
+    cloudflareWebsite: "Site web de Cloudflare",
+    "Message:": "Message : ",
+    "Don't know how to get the token? Please read the guide:": "Vous ne savez pas comment obtenir le jeton ? Lisez le guide :",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexion actuelle peut être perdue si vous vous connectez actuellement via un tunnel Cloudflare. Êtes-vous sûr de vouloir l'arrêter ? Tapez votre mot de passe actuel pour le confirmer.",
     "HTTP Headers": "En-têtes HTTP",
     "Trust Proxy": "Proxy de confiance",
     "Other Software": "Autres logiciels",
-    "For example: nginx, Apache and Traefik.": "Par exemple : nginx, Apache et Traefik.",
-    "Please read": "S'il vous plaît Lisez",
-    "Valid To:": "Valable pour:",
-    "Days Remaining:": "Jours restant:",
-    "Domain Name Expiry Notification": "Notification d'expiration de nom de domaine",
+    "For example: nginx, Apache and Traefik.": "Par exemple : nginx, Apache et Traefik.",
+    "Please read": "Veuillez lire",
+    "Subject:": "Objet : ",
+    "Valid To:": "Valable jusqu'au : ",
+    "Days Remaining:": "Jours restants : ",
+    "Issuer:": "Émetteur : ",
+    "Fingerprint:": "Empreinte : ",
+    "No status pages": "Aucune page de statut.",
+    "Domain Name Expiry Notification": "Notification d'expiration du nom de domaine",
+    Proxy: "Proxy",
     "Date Created": "Date de création",
     HomeAssistant: "Home Assistant",
     onebotHttpAddress: "Adresse HTTP OneBot",
     onebotMessageType: "Type de message OneBot",
     onebotGroupMessage: "Groupe",
+    onebotPrivateMessage: "Privé",
     onebotUserOrGroupId: "ID de groupe/utilisateur",
     onebotSafetyTips: "Pour des raisons de sécurité, vous devez définir un jeton d'accès",
     "PushDeer Key": "Clé PushDeer",
-    "Show Powered By": "Afficher \"Propulsé par\"",
+    "Footer Text": "Texte de pied de page",
+    "Show Powered By": "Afficher « Propulsé par »",
+    "Domain Names": "Noms de domaine",
+    signedInDisp: "Connecté en tant que {0}",
+    signedInDispDisabled: "Authentification désactivée.",
+    RadiusSecret: "Radius Secret",
     RadiusSecretDescription: "Secret partagé entre le client et le serveur",
     RadiusCalledStationId: "Identifiant de la station appelée",
     RadiusCalledStationIdDescription: "Identifiant de l'appareil appelé",
@@ -505,56 +522,105 @@ export default {
     "API Username": "Nom d'utilisateur de l'API",
     "API Key": "Clé API",
     "Recipient Number": "Numéro du destinataire",
-    "From Name/Number": "De Nom/Numéro",
+    "From Name/Number": "De nom/numéro",
     "Leave blank to use a shared sender number.": "Laisser vide pour utiliser un numéro d'expéditeur partagé.",
     "Octopush API Version": "Version de l'API Octopush",
+    "Legacy Octopush-DM": "Ancien Octopush-DM",
+    endpoint: "endpoint",
     octopushAPIKey: "\"Clé API\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
-    octopushLogin: "\"Connexion\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+    octopushLogin: "\"Identifiant\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+    promosmsLogin: "Nom de connexion API",
+    promosmsPassword: "Mot de passe API",
+    "pushoversounds pushover": "Pushover (par défaut)",
+    "pushoversounds bike": "Vélo",
+    "pushoversounds bugle": "Clairon",
+    "pushoversounds cashregister": "Caisse enregistreuse",
+    "pushoversounds classical": "Classique",
+    "pushoversounds cosmic": "Cosmique",
+    "pushoversounds falling": "Chute",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Arrivée",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magique",
+    "pushoversounds mechanical": "Mécanique",
+    "pushoversounds pianobar": "Piano-bar",
+    "pushoversounds siren": "Sirène",
+    "pushoversounds spacealarm": "Alarme spatiale",
+    "pushoversounds tugboat": "Remorqueur",
+    "pushoversounds alien": "Alarme alienne (version longue)",
+    "pushoversounds climb": "Escalade (version longue)",
+    "pushoversounds persistent": "Persistent (version longue)",
+    "pushoversounds echo": "Pushover Echo (version longue)",
+    "pushoversounds updown": "Up Down (version longue)",
+    "pushoversounds vibrate": "Vibration seulement",
+    "pushoversounds none": "Aucun (silencieux)",
+    pushyAPIKey: "Clé API secrète",
+    pushyToken: "Jeton d'appareil",
+    "Show update if available": "Afficher la mise à jour si disponible",
+    "Also check beta release": "Vérifiez également la version bêta",
     "Using a Reverse Proxy?": "Utiliser un proxy inverse ?",
-    "Check how to config it for WebSocket": "Vérifiez comment le configurer pour WebSocket",
+    "Check how to config it for WebSocket": "Vérifier comment le configurer pour WebSocket",
+    "Steam Game Server": "Serveur de jeu Steam",
+    "Most likely causes:": "Causes les plus probables : ",
+    "The resource is no longer available.": "La ressource n'est plus disponible.",
+    "There might be a typing error in the address.": "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
+    "What you can try:": "Ce que vous pouvez essayer :",
+    "Retype the address.": "Retaper l'adresse.",
+    "Go back to the previous page.": "Retourner à la page précédente.",
+    "Coming Soon": "Prochainement",
     wayToGetClickSendSMSToken: "Vous pouvez obtenir le nom d'utilisateur API et la clé API à partir de {0} .",
     "Connection String": "Chaîne de connexion",
     Query: "Requête",
+    settingsCertificateExpiry: "Expiration du certificat TLS",
+    certificationExpiryDescription: "Les sondes HTTPS émettent une notification lorsque le certificat TLS expire dans :",
+    "Setup Docker Host": "Configurer l'hôte Docker",
+    "Connection Type": "Type de connexion",
+    "Docker Daemon": "Deamon Docker",
+    deleteDockerHostMsg: "Voulez-vous vraiment supprimer cet hôte Docker pour toutes les sondes ?",
+    socket: "Socket",
     tcp: "TCP / HTTP",
     "Docker Container": "Conteneur Docker",
+    "Container Name / ID": "Nom / ID du conteneur",
+    "Docker Host": "Hôte Docker",
+    "Docker Hosts": "Hôtes Docker",
+    "ntfy Topic": "Topic ntfy",
+    Domain: "Domaine",
     Workstation: "Poste de travail",
     disableCloudflaredNoAuthMsg: "Vous êtes en mode No Auth, un mot de passe n'est pas nécessaire.",
+    trustProxyDescription: "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière (nginx ou Apache) vous devez l'activer.",
+    wayToGetLineNotifyToken: "Vous pouvez obtenir un jeton d'accès auprès de {0}",
+    Examples: "Exemples",
+    "Home Assistant URL": "URL vers Home Assistant",
     "Long-Lived Access Token": "Jeton d'accès de longue durée",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
+    "Notification Service": "Service de notifications",
+    "default: notify all devices": "par défaut: notifier tous les appareils",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
+    "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant : ",
+    "Trigger type:": "Type de déclencheur : ",
+    "Event type:": "Type d'événement : ",
+    "Event data:": "Données d'événement : ",
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Ensuite, choisissez une action, par exemple basculer la scène là où une lumière RVB est rouge.",
-    "Frontend Version": "Frontend Version",
-    "Frontend Version do not match backend version!": "La version frontale ne correspond pas à la version principale !",
+    "Frontend Version": "Version frontend",
+    "Frontend Version do not match backend version!": "La version frontend ne correspond pas à la version backend !",
     "Base URL": "URL de base",
-    goAlertInfo: "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Engagez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
+    goAlertInfo: "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Impliquez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
     goAlertIntegrationKeyInfo: "Obtenez la clé d'intégration d'API générique pour le service dans ce format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" généralement la valeur du paramètre de jeton de l'URL copiée.",
     goAlert: "GoAlert",
-    backupOutdatedWarning: "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est un peu non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
+    backupOutdatedWarning: "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
     backupRecommend: "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
     Optional: "Optionnel",
     squadcast: "Squadcast",
-    Maintenance: "Maintenance",
-    statusMaintenance: "Maintenance",
-    "Schedule maintenance": "Planifier la maintenance",
-    "Affected Monitors": "Moniteurs concernés",
-    "Pick Affected Monitors...": "Sélectionnez les moniteurs concernés...",
-    "Start of maintenance": "Début de la maintenance",
-    "All Status Pages": "Toutes les pages d'état",
-    "Select status pages...": "Sélectionnez les pages d'état...",
-    recurringIntervalMessage: "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
-    affectedMonitorsDescription: "Sélectionnez les moniteurs concernés par la maintenance en cours",
-    affectedStatusPages: "Afficher ce message de maintenance sur les pages d'état sélectionnées",
-    atLeastOneMonitor: "Sélectionnez au moins un moniteur concerné",
-    deleteMaintenanceMsg: "Voulez-vous vraiment supprimer cette maintenance ?",
-    pushyAPIKey: "Clé API secrète",
-    pushyToken: "Jeton d'appareil",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "Documentations de l'API SMSManager ",
+    "Gateway Type": "Type de passerelle",
+    SMSManager: "SMSManager",
     "You can divide numbers with": "Vous pouvez diviser des nombres avec",
     or: "ou",
     recurringInterval: "Intervalle",
     Recurring: "Récurrent",
-    "Single Maintenance Window": "Fenêtre de maintenance unique",
-    "Maintenance Time Window of a Day": "Fenêtre de temps de maintenance",
-    "Effective Date Range": "Plage de dates d'effet",
-    strategyManual: "activer/desactiver manuellement",
-    warningTimezone: "Il utilise le fuseau horaire du serveur",
+    strategyManual: "Activer/désactiver manuellement",
+    warningTimezone: "Utilisation du fuseau horaire du serveur",
     weekdayShortMon: "Lun",
     weekdayShortTue: "Mar",
     weekdayShortWed: "Mer",
@@ -566,11 +632,10 @@ export default {
     dayOfMonth: "Jour du mois",
     lastDay: "Dernier jour",
     lastDay1: "Dernier jour du mois",
-    lastDay2: "2ème dernier jour du mois",
+    lastDay2: "Avant-dernier jour du mois",
     lastDay3: "3ème dernier jour du mois",
     lastDay4: "4ème dernier jour du mois",
-    "No Maintenance": "Aucune Maintenance",
-    "Schedule Maintenance": "Crée une Maintenance",
+    "No Maintenance": "Aucune maintenance",
     pauseMaintenanceMsg: "Voulez-vous vraiment mettre en pause ?",
     "maintenanceStatus-under-maintenance": "En maintenance",
     "maintenanceStatus-inactive": "Inactif",
@@ -579,42 +644,29 @@ export default {
     "maintenanceStatus-unknown": "Inconnue",
     "Display Timezone": "Afficher le fuseau horaire",
     "Server Timezone": "Fuseau horaire du serveur",
+    statusPageMaintenanceEndDate: "Fin",
+    IconUrl: "URL vers l'icône",
+    "Enable DNS Cache": "Activer le cache DNS",
+    Enable: "Activer",
+    Disable: "Désactiver",
+    dnsCacheDescription: "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
+    "Single Maintenance Window": "Créneau de maintenance unique",
+    "Maintenance Time Window of a Day": "Créneau de la maintenance",
+    "Effective Date Range": "Plage de dates d'effet",
+    "Schedule Maintenance": "Créer une maintenance",
     "Date and Time": "Date et heure",
     "DateTime Range": "Plage de dates et d'heures",
     Strategy: "Stratégie",
-    statusPageMaintenanceEndDate: "Fin",
     "Free Mobile User Identifier": "Identifiant d'utilisateur Free Mobile",
-    "Free Mobile API Key": "Clé API Free Mobile",
-    enableGRPCTls: "Autoriser l'envoi d'une requête gRPC avec une connexion TLS",
-    grpcMethodDescription: "Le nom de la méthode est converti au format cammelCase tel que sayHello, check, etc.",
-    smseagleTo: "Numéro(s) de téléphone",
-    smseagleGroup: "Nom(s) de groupe(s) de répertoire",
-    smseagleContact: "Nom(s) de contact du répertoire",
-    smseagleRecipientType: "Type de destinataire",
-    smseagleRecipient: "Destinataire(s) (les multiples doivent être séparés par une virgule)",
-    smseagleToken: "Jeton d'accès à l'API",
-    smseagleUrl: "L'URL de votre appareil SMSEagle",
-    smseagleEncoding: "Envoyer en Unicode",
-    smseaglePriority: "Priorité des messages (0-9, par défaut = 0)",
-    "Proxy Server": "Serveur proxy",
-    promosmsLogin: "Nom de connexion API",
-    promosmsPassword: "Mot de passe API",
-    "SMSManager API Docs": "Documentations d'API SMSManager ",
-    "Gateway Type": "Type de passerelle",
-    webhookAdditionalHeadersTitle: "En-têtes supplémentaires",
-    webhookAdditionalHeadersDesc: "Définit des en-têtes supplémentaires envoyés avec le webhook.",
+    "Free Mobile API Key": "Clé d'API Free Mobile",
     "Enable TLS": "Activer le TLS",
     "Proto Service Name": "Nom du service proto",
     "Proto Method": "Méthode Proto",
     "Proto Content": "Contenu proto",
-    "Enable DNS Cache": "Activer le cache DNS",
-    dnsCacheDescription: "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
-    Enable: "Activer",
-    Disable: "Désactiver",
-    "Economy": "économique",
+    "Economy": "Économique",
     "Lowcost": "Faible coût",
     "high": "Haute",
-    "General Monitor Type": "Type de moniteur général",
-    "Passive Monitor Type": "Type de moniteur passif",
-    "Specific Monitor Type": "Type de moniteur spécifique",
+    "General Monitor Type": "Type de sonde générale",
+    "Passive Monitor Type": "Type de sonde passive",
+    "Specific Monitor Type": "Type de sonde spécifique",
 };

From f6ea1fe9a57bac4e3c7b55a3200753ee54899592 Mon Sep 17 00:00:00 2001
From: thefourCraft <me@thefourcraft.com>
Date: Tue, 27 Dec 2022 08:04:53 +0200
Subject: [PATCH 357/803] he-IL (#2460)

---
 package-lock.json      |   4 +-
 src/languages/he-IL.js | 672 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 674 insertions(+), 2 deletions(-)
 create mode 100644 src/languages/he-IL.js

diff --git a/package-lock.json b/package-lock.json
index 194962f8..d8b67781 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.0-beta.1",
+    "version": "1.19.0",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.0-beta.1",
+            "version": "1.19.0",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
diff --git a/src/languages/he-IL.js b/src/languages/he-IL.js
new file mode 100644
index 00000000..d98b063d
--- /dev/null
+++ b/src/languages/he-IL.js
@@ -0,0 +1,672 @@
+export default {
+    languageName: "עברית",
+    checkEverySecond: "בדוק כל {0} שניות",
+    retryCheckEverySecond: "נסה שוב כל {0} שניות",
+    resendEveryXTimes: "התראה שוב כל {0} פעמים",
+    resendDisabled: "השליחה מחדש מושבתת",
+    retriesDescription: "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ונשלחת התראה",
+    ignoreTLSError: "התעלם משגיאת TLS/SSL עבור אתרי HTTPS",
+    upsideDownModeDescription: "הפוך את הסטטוס על הפוך. אם ניתן להגיע לשירות, הוא לא פעיל.",
+    maxRedirectDescription: "המספר המרבי של הפניות מחדש לעקוב. הגדר ל-0 כדי להשבית הפניות מחדש.",
+    enableGRPCTls: "אפשר לשלוח בקשת gRPC עם חיבור TLS",
+    grpcMethodDescription: "שם השיטה מומר לפורמט cammelCase כגון sayHello, check וכו.",
+    acceptedStatusCodesDescription: "בחר קודי סטטוס שנחשבים לתגובה מוצלחת.",
+    Maintenance: "תחזוקה",
+    statusMaintenance: "תחזוקה",
+    "Schedule maintenance": "תחזוקה מתוכננת",
+    "Affected Monitors": "מוניטורים מושפעים",
+    "Pick Affected Monitors...": "בחר המוניטרים מושפעים...",
+    "Start of maintenance": "תחילת תחזוקה",
+    "All Status Pages": "כל דפי הסטטוס",
+    "Select status pages...": "בחר דפי סטטוס...",
+    recurringIntervalMessage: "רוץ פעם ביום | הפעל אחת ל-{0} ימים",
+    affectedMonitorsDescription: "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית",
+    affectedStatusPages: "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו",
+    atLeastOneMonitor: "בחר לפחות מוניטור אחד מושפע",
+    passwordNotMatchMsg: "הסיסמאות לא תואמות",
+    notificationDescription: "יש להקצות התראות למוניטור כדי שהן יעבדו.",
+    keywordDescription: "חפש מילת מפתח בתגובת HTML או JSON רגילה. החיפוש תלוי רישיות.",
+    pauseDashboardHome: "עצור",
+    deleteMonitorMsg: "האם אתה בטוח שברצונך למחוק את המוניטור הזה?",
+    deleteMaintenanceMsg: "האם אתה בטוח שברצונך למחוק את התחזוקה הזו?",
+    deleteNotificationMsg: "האם אתה בטוח שברצונך למחוק את ההודעה הזו עבור כל מוניטרים?",
+    dnsPortDescription: "יציאת שרת DNS. ברירת המחדל היא 53. אתה יכול לשנות את היציאה בכל עת.",
+    resolverserverDescription: "Cloudflare הוא שרת ברירת המחדל. אתה יכול לשנות את שרת הפותר בכל עת.",
+    rrtypeDescription: "בחר את סוג ה-RR שברצונך לפקח עליו",
+    pauseMonitorMsg: "האם אתה בטוח רוצה להשהות?",
+    enableDefaultNotificationDescription: "הודעה זו תופעל כברירת מחדל עבור מוניטרים חדשים. אתה עדיין יכול להשבית את ההודעה בנפרד עבור כל מוניטור.",
+    clearEventsMsg: "האם אתה בטוח שברצונך למחוק את כל האירועים עבור המוניטור הזה?",
+    clearHeartbeatsMsg: "האם אתה בטוח שברצונך למחוק את כל פעימות הלב עבור המוניטור הזה?",
+    confirmClearStatisticsMsg: "האם אתה בטוח שברצונך למחוק את כל הנתונים הסטטיסטיים?",
+    importHandleDescription: "בחר 'דלג על קיים' אם ברצונך לדלג על כל מוניטור או התראה באותו שם. 'החלף' ימחק כל מוניטור והתראה קיימים.",
+    confirmImportMsg: "האם אתה בטוח שברצונך לייבא את הגיבוי? אנא ודא שבחרת באפשרות הייבוא הנכונה.",
+    twoFAVerifyLabel: "אנא הזן את האסימון שלך כדי לאמת מערכת אדוש:",
+    tokenValidSettingsMsg: "האסימון תקף! כעת אתה יכול לשמור את הגדרות האדוש.",
+    confirmEnableTwoFAMsg: "האם אתה בטוח שברצונך להפעיל את מערכת אדוש?",
+    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
+    Settings: "הגדרות",
+    Dashboard: "פאנל ניהול",
+    "New Update": "עדכון חדש",
+    Language: "שפה",
+    Appearance: "נראות",
+    Theme: "ערכת נושא",
+    General: "כללי",
+    "Primary Base URL": "כתובת האתר הראשית של הבסיס",
+    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.": "Cert Exp.",
+    day: "יום | ימים",
+    "-day": "-יום",
+    hour: "שעה",
+    "-hour": "-שעה",
+    Response: "תגובה",
+    Ping: "פינג",
+    "Monitor Type": "סוג מוניטור",
+    Keyword: "מילת מפתח",
+    "Friendly Name": "שם ידידותי",
+    URL: "כתובת אתר",
+    Hostname: "שם המארח",
+    Port: "פורט",
+    "Heartbeat Interval": "מרווח פעימות",
+    Retries: "נסיונות חוזרים",
+    "Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות",
+    "Resend Notification if Down X times consequently": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך",
+    Advanced: "מתקדם",
+    "Upside Down Mode": "מצב הפוך",
+    "Max. Redirects": "מקסימום הפניות מחדש",
+    "Accepted Status Codes": "קודי סטטוס מקובלים",
+    "Push URL": "דחף כתובת URL",
+    needPushEvery: "עליך להתקשר לכתובת האתר הזו כל {0} שניות.",
+    pushOptionalParams: "פרמטרים אופציונליים: {0}",
+    Save: "שמירה",
+    Notifications: "התראות",
+    "Not available, please setup.": "לא זמין, אנא הגדר.",
+    "Setup Notification": "הודעת הגדרה",
+    Light: "בהיר",
+    Dark: "חושך",
+    Auto: "אוטומטי",
+    "Theme - Heartbeat Bar": "ערכת נושא - 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": "הפעלת אבטחה",
+    "disableauth.message1": "האם אתה בטוח שברצונך <strong>להשבית את האבטחה</strong>?",
+    "disableauth.message2": "הוא מיועד לתרחישים <strong>שבהם אתה מתכוון ליישם אימות של צד שלישי</strong> מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.",
+    "Please use this option carefully!": "אנא השתמש באפשרות זו בזהירות!",
+    Logout: "התנתקות",
+    Leave: "יציאה",
+    "I understand, please disable": "אני מבין, אני רוצה להשבית",
+    Confirm: "אישור",
+    Yes: "כן",
+    No: "לא",
+    Username: "שם משתמש",
+    Password: "סיסמה",
+    "Remember me": "זכור אותי",
+    Login: "התחברות",
+    "No Monitors, please": "בלי מוניטורים, בבקשה",
+    "add one": "להוסיף אחד",
+    "Notification Type": "סוג התראה",
+    Email: "אימייל",
+    Test: "Test",
+    "Certificate Info": "פרטי תעודת אבטחה",
+    "Resolver Server": "שרת פותר",
+    "Resource Record Type": "סוג רשומת משאבים",
+    "Last Result": "תוצאה אחרונה",
+    "Create your admin account": "צור את חשבון הניהול שלך",
+    "Repeat Password": "חזור על הסיסמה",
+    "Import Backup": "ייבוא גיבוי",
+    "Export Backup": "ייצוא גיבוי",
+    Export: "ייצוא",
+    Import: "ייבוא",
+    respTime: "רפ. זמן (ms)",
+    notAvailableShort: "N/A",
+    "Default enabled": "ברירת המחדל מופעלת",
+    "Apply on all existing monitors": "החל על כל המסכים הקיימים",
+    Create: "ליצור",
+    "Clear Data": "נקה נתונים",
+    Events: "אירועים",
+    Heartbeats: "פעימות לב",
+    "Auto Get": "קבל אוטומטי",
+    backupDescription: "אתה יכול לגבות את כל המסכים וההתראות לקובץ JSON.",
+    backupDescription2: "הערה: היסטוריה ונתוני אירועים אינם כלולים.",
+    backupDescription3: "נתונים רגישים כגון אסימוני הודעה כלולים בקובץ הייצוא; נא לאחסן יצוא בצורה מאובטחת.",
+    alertNoFile: "אנא בחר קובץ לייבוא.",
+    alertWrongFileType: "אנא בחר קובץ JSON.",
+    "Clear all statistics": "נקה את כל הנתונים הסטטיסטיים",
+    "Skip existing": "דילוג על הקיים",
+    Overwrite: "החלף",
+    Options: "אפשרויות",
+    "Keep both": "שמור את שניהם",
+    "Verify Token": "אמת את האסימון",
+    "Setup 2FA": "הגדרת מערכת אדוש",
+    "Enable 2FA": "הפעלת אדוש",
+    "Disable 2FA": "כיבוי אדוש",
+    "2FA Settings": "הגדרות אדוש",
+    "Two Factor Authentication": "אימות דו-שלבי (מערכת אדוש)",
+    Active: "מופעל",
+    Inactive: "קבוי",
+    Token: "אסימון",
+    "Show URI": "הצג URI",
+    Tags: "תגים",
+    "Add New below or Select...": "הוסף חדש למטה או בחר...",
+    "Tag with this name already exist.": "תג בשם זה כבר קיים.",
+    "Tag with this value already exist.": "תג עם ערך זה כבר קיים.",
+    color: "צבע",
+    "value (optional)": "ערך (אופציונלי)",
+    Gray: "אפור",
+    Red: "אדום",
+    Orange: "כתום",
+    Green: "ירוק",
+    Blue: "כחול",
+    Indigo: "כחול כהה",
+    Purple: "סגול",
+    Pink: "כתום",
+    "Search...": "לחפש...",
+    "Avg. Ping": "פינג ממוצע",
+    "Avg. Response": "ממוצע תגובה",
+    "Entry Page": "דף כניסה",
+    statusPageNothing: "אין כאן שום דבר, בבקשה הוסף קבוצה או מוניטור.",
+    "No Services": "אין שירותים",
+    "All Systems Operational": "כל המערכות עובדות",
+    "Partially Degraded Service": "שירות פגום חלקית",
+    "Degraded Service": "שירות פגום",
+    "Add Group": "הוסף קבוצה",
+    "Add a monitor": "הוסף מוניטור",
+    "Edit Status Page": "ערוך דף סטטוס",
+    "Go to Dashboard": "מעבר לפאנל",
+    "Status Page": "דף סטטוס",
+    "Status Pages": "דפי סטטוס",
+    defaultNotificationName: "התראת {notification} שלי ({number})",
+    here: "פה",
+    Required: "נדרש",
+    telegram: "טלגרם",
+    "Bot Token": "אסימון בוט",
+    wayToGetTelegramToken: "אתה יכול לקבל אסימון מ-{0}.",
+    "Chat ID": "מזהה צ'אט",
+    supportTelegramChatID: "תמיכה בצ'אט ישיר / קבוצה / מזהה הצ'אט של הערוץ",
+    wayToGetTelegramChatID: "אתה יכול לקבל את מזהה הצ'אט שלך על ידי שליחת הודעה לבוט ומעבר לכתובת האתר הזו כדי להציג את ה-chat_id:",
+    "YOUR BOT TOKEN HERE": "אסימון הבוט שלך כאן",
+    chatIDNotFound: "מזהה צ'אט לא נמצא; אנא שלח הודעה לבוט זה תחילה",
+    webhook: "Webhook",
+    "Post URL": "כתובת אתר של פוסט",
+    "Content Type": "סוג התוכן",
+    webhookJsonDesc: "{0} מתאים לכל שרתי HTTP מודרניים כגון Express.js",
+    webhookFormDataDesc: "{multipart} טוב ל-PHP. יהיה צורך לנתח את ה-JSON באמצעות {decodeFunction}",
+    webhookAdditionalHeadersTitle: "כותרות נוספות",
+    webhookAdditionalHeadersDesc: "מגדיר כותרות נוספות שנשלחות עם ה-webhook.",
+    smtp: "אימייל (SMTP)",
+    secureOptionNone: "None / STARTTLS (25, 587)",
+    secureOptionTLS: "TLS (465)",
+    "Ignore TLS Error": "התעלם משגיאת TLS",
+    "From Email": "אמייל שולח",
+    emailCustomSubject: "נושא מותאם אישית",
+    "To Email": "למייל",
+    smtpCC: "עותק",
+    smtpBCC: "עותק מוסתר",
+    discord: "דיסקורד",
+    "Discord Webhook URL": "כתובת אתר של Discord Webhook",
+    wayToGetDiscordURL: "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> צור Webhook",
+    "Bot Display Name": "שם תצוגה של בוט",
+    "Prefix Custom Message": "קידומת הודעה מותאמת אישית",
+    "Hello @everyone is...": "שלום {'@'}כולם...",
+    teams: "Microsoft Teams",
+    "Webhook URL": "כתובת האתר של Webhook",
+    wayToGetTeamsURL: "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
+    signal: "אוֹת",
+    Number: "מספר",
+    Recipients: "נמענים",
+    needSignalAPI: "אתה צריך שיהיה לך לקוח איתות עם REST API.",
+    wayToCheckSignalURL: "אתה יכול לבדוק את כתובת האתר הזו כדי לראות כיצד להגדיר אחת:",
+    signalImportant: "חשוב: לא ניתן לערבב קבוצות ומספרים בנמענים!",
+    gotify: "Gotify",
+    "Application Token": "אסימון אפליקציה",
+    "Server URL": "כתובת האתר של השרת",
+    Priority: "עדיפות",
+    slack: "Slack",
+    "Icon Emoji": "אייקון אימוג'י",
+    "Channel Name": "שם הערוץ",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    aboutWebhooks: "מידע נוסף על Webhooks ב: {0}",
+    aboutChannelName: "הזן את שם הערוץ בשדה {0} שם ערוץ אם ברצונך לעקוף את ערוץ Webhook. לדוגמה: #ערוץ אחר",
+    aboutKumaURL: "אם תשאיר את השדה Uptime Kuma URL ריק, הוא יעבור כברירת מחדל לעמוד Project GitHub.",
+    emojiCheatSheet: "גיליון הונאה של אמוג'י: {0}",
+    "rocket.chat": "Rocket.Chat",
+    pushover: "Pushover",
+    pushy: "Pushy",
+    PushByTechulus: "Push by Techulus",
+    octopush: "Octopush",
+    promosms: "PromoSMS",
+    clicksendsms: "ClickSend SMS",
+    lunasea: "LunaSea",
+    apprise: "Apprise (תומך ב-50+ שירותי התראות)",
+    GoogleChat: "Google Chat (Google Workspace בלבד)",
+    pushbullet: "Pushbullet",
+    line: "Line Messenger",
+    mattermost: "Mattermost",
+    "User Key": "מפתח משתמש",
+    Device: "התקן",
+    "Message Title": "כותרת ההודעה",
+    "Notification Sound": "צליל התראה",
+    "More info on:": "מידע נוסף על: {0}",
+    pushoverDesc1: "לעדיפות חירום (2) יש פסק זמן של 30 שניות ברירת מחדל בין ניסיונות חוזרים, והיא תפוג לאחר שעה.",
+    pushoverDesc2: "אם ברצונך לשלוח התראות למכשירים שונים, מלא את שדה התקן.",
+    "SMS Type": "סוג SMS",
+    octopushTypePremium: "פרימיום (מהיר - מומלץ להתראה)",
+    octopushTypeLowCost: "עלות נמוכה (איטית - לפעמים חסומה על ידי המפעיל)",
+    checkPrice: "בדוק מחירים של {0}:",
+    apiCredentials: "אישורי API",
+    octopushLegacyHint: "האם אתה משתמש בגרסה הישנה של Octopush (2011-2020) או בגרסה החדשה?",
+    "Check octopush prices": "בדוק מחירי תמנון {0}.",
+    octopushPhoneNumber: "מספר טלפון (פורמט אינטלי, למשל: +33612345678)",
+    octopushSMSSender: "שם שולח SMS: 3-11 תווים אלפאנומריים ורווח (a-zA-Z0-9)",
+    "LunaSea Device ID": "מזהה מכשיר LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "דוגמה: {0}",
+    "Read more:": "קרא עוד: {0}",
+    "Status:": "סטטוס: {0}",
+    "Read more": "קרא עוד",
+    appriseInstalled: "Apprise מותקן.",
+    appriseNotInstalled: "Apprise אינו מותקן. {0}",
+    "Access Token": "אסימון גישה",
+    "Channel access token": "אסימון גישה לערוץ",
+    "Line Developers Console": "קונסולת מפתחים",
+    lineDevConsoleTo: "קו מפתחי קונסולת - {0}",
+    "Basic Settings": "הגדרות בסיסיות",
+    "User ID": "תעודת זהות של משתמש",
+    "Messaging API": "Messaging API",
+    wayToGetLineChannelToken: "תחילה גש ל-{0}, צור ספק וערוץ (Messaging API), לאחר מכן תוכל לקבל את אסימון הגישה לערוץ ומזהה המשתמש מפריטי התפריט שהוזכרו לעיל.",
+    "Icon URL": "כתובת אתר של סמל",
+    aboutIconURL: "אתה יכול לספק קישור לתמונה ב\"כתובת URL של סמל\" כדי לעקוף את תמונת הפרופיל המוגדרת כברירת מחדל. לא ישמש אם Icon Emoji מוגדר.",
+    aboutMattermostChannelName: "אתה יכול לעקוף את ערוץ ברירת המחדל שאליו ה-Webhook מפרסם על ידי הזנת שם הערוץ בשדה \"שם ערוץ\". זה צריך להיות מופעל בהגדרות Mattermos Webhook. לדוגמה: #ערוץ אחר",
+    matrix: "Matrix",
+    promosmsTypeEco: "SMS ECO - זול אך איטי ולעיתים עמוס מדי. מוגבל רק לנמענים פולנים.",
+    promosmsTypeFlash: "SMS FLASH - ההודעה תוצג אוטומטית במכשיר הנמען. מוגבל לנמענים פולנים בלבד.",
+    promosmsTypeFull: "SMS FULL - שכבת פרימיום של SMS, אתה יכול להשתמש בשם השולח שלך (עליך לרשום את השם תחילה). אמין להתראות.",
+    promosmsTypeSpeed: "SMS SPEED - העדיפות הגבוהה ביותר במערכת. מאוד מהיר ואמין אבל יקר (בערך פי שניים ממחיר מלא של SMS).",
+    promosmsPhoneNumber: "מספר טלפון (לנמען פולני ניתן לדלג על אזורי חיוג)",
+    promosmsSMSSender: "שם שולח SMS: שם רשום מראש או אחת מברירות המחדל: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    matrixHomeserverURL: "כתובת האתר של שרת הבית (עם http(s):// ויציאה אופציונלית)",
+    "Internal Room Id": "מזהה חדר פנימי",
+    matrixDesc1: "אתה יכול למצוא את מזהה החדר הפנימי על ידי עיון בחלק המתקדם של לקוח Matrix שלך בהגדרות החדר. זה צריך להיראות כמו !QMdRCpUIfLwsfjxye6:home.server.",
+    matrixDesc2: "מומלץ מאוד ליצור משתמש חדש ולא להשתמש באסימון הגישה של משתמש מטריקס משלך שכן הוא יאפשר גישה מלאה לחשבון שלך ולכל החדרים שהצטרפת אליהם. במקום זאת, צור משתמש חדש והזמן אותו רק לחדר שבו תרצה לקבל את ההתראה. תוכל לקבל את אסימון הגישה על ידי הפעלת {0}",
+    Method: "Method",
+    Body: "Body",
+    Headers: "Headers",
+    PushUrl: "Push URL",
+    HeadersInvalidFormat: "כותרות הבקשה אינן JSON חוקיות:",
+    BodyInvalidFormat: "גוף הבקשה אינו JSON חוקי:",
+    "Monitor History": "מעקב אחר היסטוריה",
+    clearDataOlderThan: "שמור את נתוני היסטוריית הצג למשך {0} ימים.",
+    PasswordsDoNotMatch: "סיסמאות לא תואמות.",
+    records: "רשומות",
+    "One record": "שיא אחד",
+    steamApiKeyDescription: "לניטור שרת משחקי Steam אתה צריך מפתח Steam Web-API. אתה יכול לרשום את מפתח ה-API שלך כאן:",
+    "Current User": "משתמש נוכחי",
+    topic: "נושא",
+    topicExplanation: "נושא MQTT למעקב",
+    successMessage: "הודעת הצלחה",
+    successMessageExplanation: "הודעת MQTT שתיחשב כהצלחה",
+    recent: "לאחרונה",
+    Done: "בוצע",
+    Info: "מידע",
+    Security: "אבטחה",
+    "Steam API Key": "מפתח API Steam",
+    "Shrink Database": "מסד נתונים מכווץ",
+    "Pick a RR-Type...": "בחר סוג RR ...",
+    "Pick Accepted Status Codes...": "בחר קודי סטטוס מקובלים ...",
+    Default: "בְּרִירַת מֶחדָל",
+    "HTTP Options": "אפשרויות HTTP",
+    "Create Incident": "ליצור אירוע",
+    Title: "כותרת",
+    Content: "תוֹכֶן",
+    Style: "Style",
+    info: "מידע",
+    warning: "אַזהָרָה",
+    danger: "סַכָּנָה",
+    error: "שְׁגִיאָה",
+    critical: "קריטי",
+    primary: "יְסוֹדִי",
+    light: "אוֹר",
+    dark: "אפל",
+    Post: "הודעה",
+    "Please input title and content": "אנא הזן כותרת ותוכן",
+    Created: "נוצר",
+    "Last Updated": "עודכן לאחרונה",
+    Unpin: "ענן חוף",
+    "Switch to Light Theme": "לעבור לנושא האור",
+    "Switch to Dark Theme": "לעבור לנושא אפל",
+    "Show Tags": "Show Tags",
+    "Hide Tags": "הסתר תגיות",
+    Description: "תיאור",
+    "No monitors available.": "אין צגים זמינים.",
+    "Add one": "הוסף אחד",
+    "No Monitors": "אין צגים",
+    "Untitled Group": "קבוצה ללא כותרת",
+    Services: "שירותים",
+    Discard: "להשליך",
+    Cancel: "לְבַטֵל",
+    "Powered by": "פועל על",
+    shrinkDatabaseDescription: "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.",
+    serwersms: "SerwerSMS.pl",
+    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
+    serwersmsAPIPassword: "סיסמת API",
+    serwersmsPhoneNumber: "מספר טלפון",
+    serwersmsSenderName: "שם שולח SMS (רשום באמצעות פורטל לקוחות)",
+    smseagle: "SMSEagle",
+    smseagleTo: "מספרי טלפון)",
+    smseagleGroup: "שם קבוצת ספר טלפונים",
+    smseagleContact: "שם איש קשר בספר הטלפונים",
+    smseagleRecipientType: "Rסוג הנמען",
+    smseagleRecipient: "נמענים (ים) (יש להפריד בין מרובים לפסיק)",
+    smseagleToken: "API Access Token",
+    smseagleUrl: "כתובת האתר של מכשיר ה- SMSeagege שלך",
+    smseagleEncoding: "שלח כ- Unicode",
+    smseaglePriority: "עדיפות הודעה (0-9, ברירת מחדל = 0)",
+    stackfield: "סטאקפילד",
+    Customize: "התאמה אישית",
+    "Custom Footer": "כותרת תחתונה מותאמת אישית",
+    "Custom CSS": "CSS מותאם אישית",
+    smtpDkimSettings: "הגדרות DKIM",
+    smtpDkimDesc: "אנא עיין ב- NodeMailer DKIM {0} לשימוש.",
+    documentation: "ווקיפדיית מדריכים",
+    smtpDkimDomain: "שם דומיין",
+    smtpDkimKeySelector: "בורר מפתח",
+    smtpDkimPrivateKey: "טוראי של פרטיy",
+    smtpDkimHashAlgo: "אלגוריתם hash (אופציונלי)",
+    smtpDkimheaderFieldNames: "מפתחות כותרת לחתום (אופציונלי)",
+    smtpDkimskipFields: "מפתחות כותרת לא לחתום (אופציונלי)",
+    wayToGetPagerDutyKey: "אתה יכול להשיג זאת על ידי מעבר לשירות -> ספריית שירות -> (בחר שירות) -> אינטגרציות -> הוסף אינטגרציה.כאן תוכלו לחפש \"אירועים API v2 \".מידע נוסף {0}",
+    "Integration Key": "מפתח אינטגרציה",
+    "Integration URL": "URL אינטגרציה",
+    "Auto resolve or acknowledged": "פיתרון אוטומטי או הודה",
+    "do nothing": "לעשות כלום",
+    "auto acknowledged": "Auto הודה",
+    "auto resolve": "פתרון אוטומטי",
+    gorush: "Gorush",
+    alerta: "Alerta",
+    alertaApiEndpoint: "נקודת קצה של API",
+    alertaEnvironment: "סביבה",
+    alertaApiKey: "מפתח API",
+    alertaAlertState: "מצב התראה",
+    alertaRecoverState: "לשחזר מדינה",
+    deleteStatusPageMsg: "האם אתה בטוח רוצה למחוק את דף הסטטוס הזה?",
+    Proxies: "Proxies",
+    default: "בְּרִירַת מֶחדָל",
+    enabled: "מופעל",
+    setAsDefault: "נקבע כברירת מחדל",
+    deleteProxyMsg: "האם אתה בטוח רוצה למחוק את הפרוקסי הזה לכל המסכים?",
+    proxyDescription: "Proxies must be assigned to a monitor to function.",
+    enableProxyDescription: "פרוקסי זה לא ישפיע על בקשות צג עד שהוא יופעל.אתה יכול לשלוט באופן זמני להשבית את ה- Proxy מכל המסכים לפי מצב ההפעלה.",
+    setAsDefaultProxyDescription: "פרוקסי זה יופעל כברירת מחדל עבור צגים חדשים.אתה עדיין יכול להשבית את ה- Proxy בנפרד עבור כל צג.",
+    "Certificate Chain": "שרשרת אישורים",
+    Valid: "תָקֵף",
+    Invalid: "לא חוקי",
+    AccessKeyId: "מזהה AccessKey",
+    SecretAccessKey: "גישהלמפתחסוד",
+    PhoneNumbers: "מספר טלפוןs",
+    TemplateCode: "TemplateCode",
+    SignName: "שם שם",
+    "Sms template must contain parameters: ": "תבנית SMS חייבת להכיל פרמטרים: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    WebHookUrl: "WebHookUrl",
+    SecretKey: "מפתח סודי",
+    "For safety, must use secret key": "לבטיחות, חייב להשתמש במפתח סודיy",
+    "Device Token": "אסימון מכשיר",
+    Platform: "פּלַטפוֹרמָה",
+    iOS: "iOS",
+    Android: "דְמוּי אָדָם",
+    Huawei: "huawei",
+    High: "High",
+    Retry: "נסה שוב",
+    Topic: "נוֹשֵׂא",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "הגדרת פרוקסי",
+    "Proxy Protocol": "פרוטוקול פרוקסי",
+    "Proxy Server": "שרת פרוקסי",
+    "Proxy server has authentication": "לשרת ה- Proxy יש אימות",
+    User: "מִשׁתַמֵשׁ",
+    Installed: "מוּתקָן",
+    "Not installed": "לא מותקן",
+    Running: "רץ",
+    "Not running": "לא רץ",
+    "Remove Token": "הסר אסימון",
+    Start: "הַתחָלָה",
+    Stop: "תפסיק",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "הוסף דף סטטוס חדש",
+    Slug: "Slug",
+    "Accept characters:": "קבל תווים:",
+    startOrEndWithOnly: "התחל או סוף עם {0} בלבד",
+    "No consecutive dashes": "אין מקפים רצופים",
+    Next: "הַבָּא",
+    "The slug is already taken. Please choose another slug.": "השבלול כבר נלקח.אנא בחר שבלול נוסף.",
+    "No Proxy": "אין פרוקסי",
+    Authentication: "אבטחה",
+    "HTTP Basic Auth": "HTTP בסיסי Auth",
+    "New Status Page": "דף סטטוס חדש",
+    "Page Not Found": "הדף לא נמצא",
+    "Reverse Proxy": "פרוקסי הפוך",
+    Backup: "גיבוי",
+    About: "אודות",
+    wayToGetCloudflaredURL: "(הורד את CloudFlared מ- {0})",
+    cloudflareWebsite: "אתר CloudFlare",
+    "Message:": "הוֹדָעָה:",
+    "Don't know how to get the token? Please read the guide:": "לא יודע איך להשיג את האסימון?אנא קרא את המדריך:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "החיבור הנוכחי עשוי ללכת לאיבוד אם אתה מתחבר כרגע באמצעות מנהרת CloudFlare.האם אתה בטוח רוצה לעצור את זה?הקלד את הסיסמה הנוכחית שלך כדי לאשר אותה.",
+    "HTTP Headers": "כותרות HTTP",
+    "Trust Proxy": "אמון בפרוקסי",
+    "Other Software": "תוכנה אחרת",
+    "For example: nginx, Apache and Traefik.": "למשל: Nginx, Apache ו- Traefik.",
+    "Please read": "בבקשה תקרא",
+    "Subject:": "נושא:",
+    "Valid To:": "תקף ל:",
+    "Days Remaining:": "ימים שנותרו:",
+    "Issuer:": "המנפיק:",
+    "Fingerprint:": "טביעת אצבע:",
+    "No status pages": "אין דפי סטטוס",
+    "Domain Name Expiry Notification": "הודעה על תום שם תחום",
+    Proxy: "פרוקסי",
+    "Date Created": "תאריך יצירה",
+    HomeAssistant: "Home Assistant",
+    onebotHttpAddress: "כתובת HTTP של OneBot ",
+    onebotMessageType: "סוג ההודעה OneBot",
+    onebotGroupMessage: "קְבוּצָה",
+    onebotPrivateMessage: "פְּרָטִי",
+    onebotUserOrGroupId: "מזהה קבוצה/משתמש ",
+    onebotSafetyTips: "לבטיחות, חייב לקבוע אסימון גישה ",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "טקסט כותרת תחתונה ",
+    "Show Powered By": "הצג מופעל על ידי ",
+    "Domain Names": "שמות דומיין ",
+    signedInDisp: "חתום כ- {0} ",
+    signedInDispDisabled: "Auth מושבת.",
+    RadiusSecret: "רדיוס סוד",
+    RadiusSecretDescription: "סוד משותף בין לקוח לשרת",
+    RadiusCalledStationId: "נקרא מזהה תחנה",
+    RadiusCalledStationIdDescription: "מזהה של המכשיר הנקרא ",
+    RadiusCallingStationId: "מזהה תחנת שיחה ",
+    RadiusCallingStationIdDescription: "מזהה של מכשיר השיחה ",
+    "Certificate Expiry Notification": "הודעת תפוגה של אישור",
+    "API Username": "שם משתמש API",
+    "API Key": "מפתח API",
+    "Recipient Number": "מספר הנמען",
+    "From Name/Number": "משם/מספר",
+    "Leave blank to use a shared sender number.": "השאר ריק כדי להשתמש במספר שולח משותף.",
+    "Octopush API Version": "גרסת API של תמנון",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "נקודת קצה",
+    octopushAPIKey: "\"מפתח API \" מתוך תעודות API של HTTP בלוח הבקרה",
+    octopushLogin: "\"כניסה \" מתעודות API של HTTP בלוח הבקרה",
+    promosmsLogin: "שם כניסה של API",
+    promosmsPassword: "סיסמת API",
+    "pushoversounds pushover": "Pushover (ברירת מחדל)",
+    "pushoversounds bike": "אופניים",
+    "pushoversounds bugle": "חֲצוֹצְרָה",
+    "pushoversounds cashregister": "קופה רושמת",
+    "pushoversounds classical": "קלַאסִי",
+    "pushoversounds cosmic": "קוֹסמִי",
+    "pushoversounds falling": "נופל",
+    "pushoversounds gamelan": "gamelan",
+    "pushoversounds incoming": "נִכנָס",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "קֶסֶם",
+    "pushoversounds mechanical": "מֵכָנִי",
+    "pushoversounds pianobar": "בר פסנתר",
+    "pushoversounds siren": "סִירֶנָה",
+    "pushoversounds spacealarm": "אזעקת חלל",
+    "pushoversounds tugboat": "סירת משיכה",
+    "pushoversounds alien": "אזעקת חייזרים (ארוכה)",
+    "pushoversounds climb": "לטפס (ארוך)",
+    "pushoversounds persistent": "מתמיד (ארוך)",
+    "pushoversounds echo": "הד Pushover (ארוך)",
+    "pushoversounds updown": "למעלה (ארוך)",
+    "pushoversounds vibrate": "לרטוט בלבד",
+    "pushoversounds none": "אף אחד (שקט)",
+    pushyAPIKey: "מפתח API סודי",
+    pushyToken: "אסימון מכשיר",
+    "Show update if available": "הצג עדכון אם זמין",
+    "Also check beta release": "בדוק גם את שחרור הבטא",
+    "Using a Reverse Proxy?": "באמצעות פרוקסי הפוך?",
+    "Check how to config it for WebSocket": "בדוק כיצד להגדיר אותו ל- WebSocket",
+    "Steam Game Server": "שרת משחק קיטור",
+    "Most likely causes:": "ככל הנראה גורם:",
+    "The resource is no longer available.": "המשאב כבר לא זמין.",
+    "There might be a typing error in the address.": "יתכן שיש שגיאת הקלדה בכתובת.",
+    "What you can try:": "מה שאתה יכול לנסות:",
+    "Retype the address.": "הקלד מחדש את הכתובת.",
+    "Go back to the previous page.": "חזור לדף הקודם.",
+    "Coming Soon": "בקרוב",
+    wayToGetClickSendSMSToken: "אתה יכול לקבל שם משתמש API ומפתח API מ- {0}.",
+    "Connection String": "מחרוזת חיבור",
+    Query: "שאילתא",
+    settingsCertificateExpiry: "תפוגת תעודת TLS",
+    certificationExpiryDescription: "HTTPS עוקב אחר התראה על התראה כאשר תעודת TLS פגה ב:",
+    "Setup Docker Host": "הגדרת מארח Docker",
+    "Connection Type": "סוג חיבור",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "האם אתה בטוח רוצה למחוק את המארח של Docker לכל המוניטורים?",
+    socket: "Socket",
+    tcp: "TCP / HTTP",
+    "Docker Container": "מיכל Docker",
+    "Container Name / ID": "שם מכולה / מזהה",
+    "Docker Host": "מארח דוקר",
+    "Docker Hosts": "מארחי Docker",
+    "ntfy Topic": "ntfy Topic",
+    Domain: "תְחוּם",
+    Workstation: "עמדת עבודה",
+    disableCloudflaredNoAuthMsg: "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.",
+    trustProxyDescription: "סמוך על כותרות 'x-forwarded-*'.אם אתה רוצה להשיג את ה- IP של הלקוח הנכון וה- Uptime Kuma שלך מאחור כמו Nginx או Apache, עליך לאפשר זאת.",
+    wayToGetLineNotifyToken: "אתה יכול לקבל אסימון גישה מ- {0}",
+    Examples: "דוגמאות",
+    "Home Assistant URL": "כתובת URL עוזרת ביתית",
+    "Long-Lived Access Token": "אסימון גישה ארוכת שנים",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "ניתן ליצור אסימון גישה לאורך זמן על ידי לחיצה על שם הפרופיל שלך (שמאל למטה) וגלילה לתחתית ואז לחץ על צור אסימון. ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "default: notify all devices",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "רשימה של שירותי הודעה ניתן למצוא בעוזר הבית תחת \"כלי מפתחים> שירותים \" חפש \"הודעה \" כדי למצוא את שם המכשיר/טלפון שלך.",
+    "Automations can optionally be triggered in Home Assistant:": "אוטומציות יכולות להיות מופעלות באופן אופציונלי לעוזר הבית:",
+    "Trigger type:": "סוג ההדק:",
+    "Event type:": "סוג אירוע:",
+    "Event data:": "נתוני אירועים:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "ואז בחר פעולה, למשל העבר את הסצינה למקום בו אור RGB הוא אדום.",
+    "Frontend Version": "גרסת Frontend",
+    "Frontend Version do not match backend version!": "גרסת Frontend לא תואמת את גרסת Backend!",
+    "Base URL": "Base URL",
+    goAlertInfo: "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}",
+    goAlertIntegrationKeyInfo: "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.",
+    goAlert: "GoAlert",
+    backupOutdatedWarning: "מיושם: מכיוון שהרבה תכונות שנוספו ותכונת הגיבוי הזו מעט לא מצומצמת, היא לא יכולה לייצר או לשחזר גיבוי שלם.",
+    backupRecommend: "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.",
+    Optional: "אופציונאלי",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "מסמכי API של SmsManager ",
+    "Gateway Type": "סוג שער",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "אתה יכול לחלק מספרים עם",
+    or: "אוֹ",
+    recurringInterval: "הפסקה",
+    Recurring: "מחזורי",
+    strategyManual: "פעיל/לא פעיל באופן ידני",
+    warningTimezone: "זה משתמש באזור הזמן של השרת",
+    weekdayShortMon: "שני",
+    weekdayShortTue: "שלישי",
+    weekdayShortWed: "רביעי",
+    weekdayShortThu: "חמישי",
+    weekdayShortFri: "שישי",
+    weekdayShortSat: "שבת",
+    weekdayShortSun: "ראשון",
+    dayOfWeek: "יום בשבוע",
+    dayOfMonth: "יום בחודש",
+    lastDay: "Last Day",
+    lastDay1: "היום האחרון של החודש",
+    lastDay2: "יום שני האחרון של החודש",
+    lastDay3: "יום 3 האחרון של החודש",
+    lastDay4: "היום הרביעי האחרון בחודש",
+    "No Maintenance": "אין תחזוקה",
+    pauseMaintenanceMsg: "האם אתה בטוח רוצה להשהות?",
+    "maintenanceStatus-under-maintenance": "מתבצעות עבודות תחזוקה",
+    "maintenanceStatus-inactive": "לא פעיל",
+    "maintenanceStatus-scheduled": "מתוזמן",
+    "maintenanceStatus-ended": "הסתיים",
+    "maintenanceStatus-unknown": "לא ידוע",
+    "Display Timezone": "הצג אזור זמן",
+    "Server Timezone": "אזור זמן של שרת",
+    statusPageMaintenanceEndDate: "סוך",
+    IconUrl: "קישור לתמונת אייקון",
+    "Enable DNS Cache": "הפעל מטמון DNS",
+    Enable: "הפעל",
+    Disable: "השבת",
+    dnsCacheDescription: "ייתכן שהוא לא עובד בסביבות IPv6 מסוימות, השבת אותו אם אתה נתקל בבעיות כלשהן.",
+    "Single Maintenance Window": "חלון תחזוקה בודד",
+    "Maintenance Time Window of a Day": "חלון זמן תחזוקה ביום",
+    "Effective Date Range": "טווח תאריכים אפקטיבי",
+    "Schedule Maintenance": "לוח זמנים לתחזוקה",
+    "Date and Time": "תאריך ושעה",
+    "DateTime Range": "טווח תאריכים וזמן",
+    Strategy: "אסטרטגיה",
+    "Free Mobile User Identifier": "מזהה משתמש נייד בחינם",
+    "Free Mobile API Key": "מפתח API חינם לנייד",
+    "Enable TLS": "אפשר TLS",
+    "Proto Service Name": "שם שירות פרוטו",
+    "Proto Method": "שיטת פרוטו",
+    "Proto Content": "תוכן פרוטו",
+    Economy: "חיסכון",
+    Lowcost: "זול",
+    high: "גבוהה",
+    "General Monitor Type": "מוניטור כללי",
+    "Passive Monitor Type": "מוניטור פסיבי",
+    "Specific Monitor Type": "סוג מוניטור ספציפי",
+};

From c60b741406d45c7678e16a53500f1359678bd95c Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Tue, 27 Dec 2022 14:05:45 +0800
Subject: [PATCH 358/803] Add kook notification provider

---
 server/notification-providers/kook.js | 31 +++++++++++++++++++++++
 server/notification.js                |  2 ++
 src/components/notifications/Kook.vue | 36 +++++++++++++++++++++++++++
 src/components/notifications/index.js |  2 ++
 src/languages/en.js                   |  4 +++
 src/languages/zh-CN.js                |  4 +++
 6 files changed, 79 insertions(+)
 create mode 100644 server/notification-providers/kook.js
 create mode 100644 src/components/notifications/Kook.vue

diff --git a/server/notification-providers/kook.js b/server/notification-providers/kook.js
new file mode 100644
index 00000000..b37b75ab
--- /dev/null
+++ b/server/notification-providers/kook.js
@@ -0,0 +1,31 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+
+class Kook extends NotificationProvider {
+
+    name = "Kook";
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+        let url = "https://www.kookapp.cn/api/v3/message/create";
+        let data = {
+            target_id: notification.kookGuildID,
+            content: msg,
+        };
+        let config = {
+            headers: {
+                "Authorization": "Bot " + notification.kookBotToken,
+                "Content-Type": "application/json",
+            },
+        };
+        try {
+            await axios.post(url, data, config);
+            return okMsg;
+
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+}
+
+module.exports = Kook;
diff --git a/server/notification.js b/server/notification.js
index 9069601b..6ff42e01 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -14,6 +14,7 @@ const GoogleChat = require("./notification-providers/google-chat");
 const Gorush = require("./notification-providers/gorush");
 const Gotify = require("./notification-providers/gotify");
 const HomeAssistant = require("./notification-providers/home-assistant");
+const Kook = require("./notification-providers/kook");
 const Line = require("./notification-providers/line");
 const LineNotify = require("./notification-providers/linenotify");
 const LunaSea = require("./notification-providers/lunasea");
@@ -70,6 +71,7 @@ class Notification {
             new Gorush(),
             new Gotify(),
             new HomeAssistant(),
+            new Kook(),
             new Line(),
             new LineNotify(),
             new LunaSea(),
diff --git a/src/components/notifications/Kook.vue b/src/components/notifications/Kook.vue
new file mode 100644
index 00000000..d618750b
--- /dev/null
+++ b/src/components/notifications/Kook.vue
@@ -0,0 +1,36 @@
+<template>
+    <div class="mb-3">
+        <label for="kook-bot-token" class="form-label">{{ $t("Bot Token") }}</label>
+        <HiddenInput id="kook-bot-token" v-model="$parent.notification.kookBotToken" :required="true" autocomplete="new-password"></HiddenInput>
+        <i18n-t tag="div" keypath="wayToGetKookBotToken" class="form-text">
+            <a href="https://developer.kookapp.cn/bot" target="_blank">https://developer.kookapp.cn/bot</a>
+        </i18n-t>
+    </div>
+
+    <div class="mb-3">
+        <label for="kook-guild-id" class="form-label">{{ $t("Guild ID") }}</label>
+
+        <div class="input-group mb-3">
+            <input id="kook-guild-id" v-model="$parent.notification.kookGuildID" type="text" class="form-control" required>
+        </div>
+
+        <div class="form-text">
+            <p style="margin-top: 8px;">
+                {{ $t("wayToGetKookGuildID") }}
+            </p>
+        </div>
+    </div>
+
+    <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
+        <a href="https://developer.kookapp.cn" target="_blank">https://developer.kookapp.cn</a>
+    </i18n-t>
+</template>
+
+<script>
+import HiddenInput from "../HiddenInput.vue";
+export default {
+    components: {
+        HiddenInput,
+    }
+}
+</script>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 0c220b71..a2ba485f 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -12,6 +12,7 @@ import GoogleChat from "./GoogleChat.vue";
 import Gorush from "./Gorush.vue";
 import Gotify from "./Gotify.vue";
 import HomeAssistant from "./HomeAssistant.vue";
+import Kook from "./Kook.vue";
 import Line from "./Line.vue";
 import LineNotify from "./LineNotify.vue";
 import LunaSea from "./LunaSea.vue";
@@ -63,6 +64,7 @@ const NotificationFormList = {
     "gorush": Gorush,
     "gotify": Gotify,
     "HomeAssistant": HomeAssistant,
+    "Kook": Kook,
     "line": Line,
     "LineNotify": LineNotify,
     "lunasea": LunaSea,
diff --git a/src/languages/en.js b/src/languages/en.js
index e760f92e..786185f3 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -270,6 +270,10 @@ export default {
     apprise: "Apprise (Support 50+ Notification services)",
     GoogleChat: "Google Chat (Google Workspace only)",
     pushbullet: "Pushbullet",
+    Kook: "Kook",
+    wayToGetKookBotToken: "Create application and get your bot token at {0}",
+    wayToGetKookGuildID: "Switch on 'Developer Mode' in Kook setting, and right click the guild to get its ID",
+    "Guild ID": "Guild ID",
     line: "Line Messenger",
     mattermost: "Mattermost",
     "User Key": "User Key",
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index ff11c7e9..5878758c 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -250,6 +250,10 @@ export default {
     apprise: "Apprise (支持 50+ 种通知服务)",
     GoogleChat: "Google Chat(仅 Google Workspace)",
     pushbullet: "Pushbullet",
+    Kook: "Kook",
+    wayToGetKookBotToken: "在 {0} 创建应用并获取机器人 Token",
+    wayToGetKookGuildID: "在Kook设置中打开 ‘开发者模式’,然后右键频道可获取其 ID",
+    "Guild ID": "频道 ID",
     line: "Line Messenger",
     mattermost: "Mattermost",
     "User Key": "User Key",

From 50b84f5f453d92052aac37a5060b4429a0ae5c57 Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Tue, 27 Dec 2022 14:10:19 +0800
Subject: [PATCH 359/803] fix code style: add missing semicolon

---
 src/components/notifications/Kook.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/notifications/Kook.vue b/src/components/notifications/Kook.vue
index d618750b..7027b5e1 100644
--- a/src/components/notifications/Kook.vue
+++ b/src/components/notifications/Kook.vue
@@ -32,5 +32,5 @@ export default {
     components: {
         HiddenInput,
     }
-}
+};
 </script>

From 608e3f5582604e6a7079859bcf722d7c645a4245 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mathias=20Haugsb=C3=B8?= <mathiash98@gmail.com>
Date: Tue, 27 Dec 2022 23:26:05 +0100
Subject: [PATCH 360/803] Feature: Clone existing monitor

Closes #565
Closes #2319

Adds the feature of cloning existing monitor, I have briefly tested it with ping and https and ensured that all properties was cloned including notifications.
---
 src/languages/en.js       |  2 ++
 src/pages/Details.vue     |  3 +++
 src/pages/EditMonitor.vue | 27 ++++++++++++++++++++++++---
 src/router.js             |  4 ++++
 4 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/src/languages/en.js b/src/languages/en.js
index e760f92e..59ea0570 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -57,6 +57,7 @@ export default {
     List: "List",
     Add: "Add",
     "Add New Monitor": "Add New Monitor",
+    "Clone Monitor": "Clone Monitor",
     "Quick Stats": "Quick Stats",
     Up: "Up",
     Down: "Down",
@@ -70,6 +71,7 @@ export default {
     "No important events": "No important events",
     Resume: "Resume",
     Edit: "Edit",
+    Clone: "Clone",
     Delete: "Delete",
     Current: "Current",
     Uptime: "Uptime",
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 6d6a8dd9..40ed0358 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -30,6 +30,9 @@
                     <router-link :to=" '/edit/' + monitor.id " class="btn btn-normal">
                         <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
                     </router-link>
+                    <router-link :to=" '/clone/' + monitor.id " class="btn btn-normal">
+                        <font-awesome-icon icon="plus" /> {{ $t("Clone") }}
+                    </router-link>
                     <button class="btn btn-danger" @click="deleteDialog">
                         <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
                     </button>
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index c9d5ad2f..f0c99b5b 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -620,13 +620,23 @@ export default {
         },
 
         pageName() {
-            return this.$t((this.isAdd) ? "Add New Monitor" : "Edit");
+            let name = "Add New Monitor";
+            if (this.isClone) {
+                name = "Clone Monitor";
+            } else if (this.isEdit) {
+                name = "Edit";
+            }
+            return this.$t(name);
         },
 
         isAdd() {
             return this.$route.path === "/add";
         },
 
+        isClone() {
+            return this.$route.path.startsWith("/clone");
+        },
+
         isEdit() {
             return this.$route.path.startsWith("/edit");
         },
@@ -804,11 +814,22 @@ message HealthCheckResponse {
                         this.monitor.notificationIDList[this.$root.notificationList[i].id] = true;
                     }
                 }
-            } else if (this.isEdit) {
+            } else if (this.isEdit || this.isClone) {
                 this.$root.getSocket().emit("getMonitor", this.$route.params.id, (res) => {
                     if (res.ok) {
                         this.monitor = res.monitor;
 
+                        if (this.isClone) {
+                            /**
+                             * Cloning a monitor will include properties that can not be posted to backend
+                             * as they are not valid columns in the SQLite table.
+                             */
+                            this.monitor.id = undefined; // Remove id when cloning as we want a new id
+                            this.monitor.includeSensitiveData = undefined;
+                            this.monitor.maintenance = undefined;
+                            this.monitor.tags = undefined; // FIXME: Cloning tags does not work yet
+                        }
+
                         // Handling for monitors that are created before 1.7.0
                         if (this.monitor.retryInterval === 0) {
                             this.monitor.retryInterval = this.monitor.interval;
@@ -866,7 +887,7 @@ message HealthCheckResponse {
                 this.monitor.headers = JSON.stringify(JSON.parse(this.monitor.headers), null, 4);
             }
 
-            if (this.isAdd) {
+            if (this.isAdd || this.isClone) {
                 this.$root.add(this.monitor, async (res) => {
 
                     if (res.ok) {
diff --git a/src/router.js b/src/router.js
index 38048826..a5938c22 100644
--- a/src/router.js
+++ b/src/router.js
@@ -63,6 +63,10 @@ const routes = [
                                         path: "/edit/:id",
                                         component: EditMonitor,
                                     },
+                                    {
+                                        path: "/clone/:id",
+                                        component: EditMonitor,
+                                    },
                                 ],
                             },
                             {

From 4d0bdae6bf4ead2617f9b9f71e97e5edf0466d7c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mathias=20Haugsb=C3=B8?= <mathiash98@gmail.com>
Date: Tue, 27 Dec 2022 23:27:23 +0100
Subject: [PATCH 361/803] Add jsdoc for Tag type

Does not work properly but is still useful
---
 src/components/Tag.vue         | 10 ++++++++--
 src/components/TagsManager.vue | 20 +++++++++++++++++++-
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/components/Tag.vue b/src/components/Tag.vue
index 0325d990..705408b2 100644
--- a/src/components/Tag.vue
+++ b/src/components/Tag.vue
@@ -18,9 +18,15 @@
 </template>
 
 <script>
+/**
+* @typedef {import('./TagsManager.vue').Tag} Tag
+*/
+
 export default {
     props: {
-        /** Object representing tag */
+        /** Object representing tag
+         * @type {Tag}
+         */
         item: {
             type: Object,
             required: true,
@@ -32,7 +38,7 @@ export default {
         },
         /**
          * Size of tag
-         * @values normal, small
+         * @type {"normal" | "small"}
          */
         size: {
             type: String,
diff --git a/src/components/TagsManager.vue b/src/components/TagsManager.vue
index 2958babe..9de3208f 100644
--- a/src/components/TagsManager.vue
+++ b/src/components/TagsManager.vue
@@ -133,13 +133,27 @@ import { useToast } from "vue-toastification";
 import Tag from "../components/Tag.vue";
 const toast = useToast();
 
+/**
+ * @typedef Tag
+ * @type {object}
+ * @property {number | undefined} id
+ * @property {number | undefined} monitor_id
+ * @property {number | undefined} tag_id
+ * @property {string} value
+ * @property {string} name
+ * @property {string} color
+ * @property {boolean | undefined} new
+ */
+
 export default {
     components: {
         Tag,
         VueMultiselect,
     },
     props: {
-        /** Array of tags to be pre-selected */
+        /** Array of tags to be pre-selected
+         * @type {Tag[]}
+         */
         preSelectedTags: {
             type: Array,
             default: () => [],
@@ -147,10 +161,14 @@ export default {
     },
     data() {
         return {
+            /** @type {Modal | null} */
             modal: null,
+            /** @type {Tag[]} */
             existingTags: [],
             processing: false,
+            /** @type {Tag[]} */
             newTags: [],
+            /** @type {Tag[]} */
             deleteTags: [],
             newDraftTag: {
                 name: null,

From 7f394d06307313b9f66176f79036769d71d5ab02 Mon Sep 17 00:00:00 2001
From: 5idereal <nelson22768384@gmail.com>
Date: Wed, 28 Dec 2022 17:29:46 +0800
Subject: [PATCH 362/803] update zh-TW.js

---
 src/languages/zh-TW.js | 52 ++++++++++++++++++++++++++++++++++++------
 1 file changed, 45 insertions(+), 7 deletions(-)

diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
index 5f7bfb6e..668e4c23 100644
--- a/src/languages/zh-TW.js
+++ b/src/languages/zh-TW.js
@@ -8,6 +8,8 @@ export default {
     ignoreTLSError: "忽略 HTTPS 網站的 TLS/SSL 錯誤",
     upsideDownModeDescription: "反轉顯示狀態。若服務可以連線,將顯示離線。",
     maxRedirectDescription: "最大重新導向跟隨次數。設為 0 將停用重新導向。",
+    enableGRPCTls: "允許以 TLS 連線傳送 gRPC 要求",
+    grpcMethodDescription: "方法名稱將轉換至駝峰式命名,如 sayHello、check 等。",
     acceptedStatusCodesDescription: "選擇視為成功回應的狀態碼。",
     Maintenance: "維護",
     statusMaintenance: "維護",
@@ -219,13 +221,15 @@ export default {
     "Content Type": "內容類型",
     webhookJsonDesc: "{0} 適合任何現代的 HTTP 伺服器,如 Express.js",
     webhookFormDataDesc: "{multipart} 適合 PHP。 JSON 必須先經由 {decodeFunction} 剖析。",
+    webhookAdditionalHeadersTitle: "額外標頭",
+    webhookAdditionalHeadersDesc: "設定與 webhook 一同傳送的額外標頭。",
     smtp: "Email (SMTP)",
     secureOptionNone: "無 / STARTTLS (25, 587)",
     secureOptionTLS: "TLS (465)",
     "Ignore TLS Error": "忽略 TLS 錯誤",
     "From Email": "寄件人",
     emailCustomSubject: "自訂主旨",
-    "To Email": "收件人",
+    "To Email": "收件者",
     smtpCC: "CC",
     smtpBCC: "BCC",
     discord: "Discord",
@@ -239,10 +243,10 @@ export default {
     wayToGetTeamsURL: "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
     signal: "Signal",
     Number: "號碼",
-    Recipients: "收件人",
+    Recipients: "收件者",
     needSignalAPI: "您需要有 REST API 的 Signal 客戶端。",
     wayToCheckSignalURL: "您可以前往下列網址以了解如何設定:",
-    signalImportant: "注意: 不得混合收件人的群組和號碼!",
+    signalImportant: "注意: 不得混合收件者的群組和號碼!",
     gotify: "Gotify",
     "Application Token": "應用程式權杖",
     "Server URL": "伺服器網址",
@@ -304,11 +308,11 @@ export default {
     aboutIconURL: "您可以在 \"圖示網址\" 中提供圖片網址以覆蓋預設個人檔案圖片。若已設定 Emoji 圖示,將忽略此設定。",
     aboutMattermostChannelName: "您可以在 \"頻道名稱\" 欄位中填寫頻道名稱以覆蓋 Webhook 的預設頻道。必須在 Mattermost 的 Webhook 設定中啟用。例如:#其他頻道",
     matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件人。",
-    promosmsTypeFlash: "SMS FLASH - 訊息會自動在收件人的裝置上顯示。僅限位於波蘭的收件人。",
+    promosmsTypeEco: "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件者。",
+    promosmsTypeFlash: "SMS FLASH - 訊息會自動在收件者的裝置上顯示。僅限位於波蘭的收件者。",
     promosmsTypeFull: "SMS FULL - 高級版,您可以使用您的寄件人名稱 (必須先註冊名稱。對於警報來說十分可靠。",
     promosmsTypeSpeed: "SMS SPEED - 系統中的最高優先度。快速、可靠,但昂貴 (約 SMS FULL 的兩倍價格)。",
-    promosmsPhoneNumber: "電話號碼 (若收件人位於波蘭則無需輸入區域代碼)",
+    promosmsPhoneNumber: "電話號碼 (若收件者位於波蘭則無需輸入區域代碼)",
     promosmsSMSSender: "簡訊寄件人名稱:預先註冊的名稱或以下的預設名稱:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
     "Feishu WebHookUrl": "飛書 WebHook 網址",
     matrixHomeserverURL: "Homeserver 網址 (開頭為 http(s)://,結尾可能帶連接埠)",
@@ -320,7 +324,7 @@ export default {
     Headers: "標頭",
     PushUrl: "Push 網址",
     HeadersInvalidFormat: "要求標頭不是有效的 JSON:",
-    BodyInvalidFormat: "請求主體不是有效的 JSON:",
+    BodyInvalidFormat: "要求主體不是有效的 JSON:",
     "Monitor History": "監測器歷史紀錄",
     clearDataOlderThan: "保留 {0} 天內的監測器歷史紀錄。",
     PasswordsDoNotMatch: "密碼不相符。",
@@ -378,6 +382,16 @@ export default {
     serwersmsAPIPassword: "API 密碼",
     serwersmsPhoneNumber: "電話號碼",
     serwersmsSenderName: "SMS 寄件人名稱 (由客戶入口網站註冊)",
+    smseagle: "SMSEagle",
+    smseagleTo: "電話號碼",
+    smseagleGroup: "電話簿群組名稱",
+    smseagleContact: "電話簿聯絡人名稱",
+    smseagleRecipientType: "收件者類型",
+    smseagleRecipient: "收件者 (用逗號分隔)",
+    smseagleToken: "API 存取權杖",
+    smseagleUrl: "您的 SMSEagle 裝置網址",
+    smseagleEncoding: "以 Unicode 傳送",
+    smseaglePriority: "訊息優先度 (0-9,預設 = 0)",
     stackfield: "Stackfield",
     Customize: "自訂",
     "Custom Footer": "自訂頁尾",
@@ -631,4 +645,28 @@ export default {
     "Display Timezone": "顯示時區",
     "Server Timezone": "伺服器時區",
     statusPageMaintenanceEndDate: "結束",
+    IconUrl: "圖示網址",
+    "Enable DNS Cache": "啟用 DNS 快取",
+    Enable: "啟用",
+    Disable: "停用",
+    dnsCacheDescription: "在某些 IPv6 環境可能會無法運作,如果您遇到任何問題,請停用。",
+    "Single Maintenance Window": "單一維護時段",
+    "Maintenance Time Window of a Day": "每日的維護時段",
+    "Effective Date Range": "有效的日期範圍",
+    "Schedule Maintenance": "排程維護",
+    "Date and Time": "時間和日期",
+    "DateTime Range": "DateTime 範圍",
+    Strategy: "策略",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API 金鑰",
+    "Enable TLS": "啟用 TLS",
+    "Proto Service Name": "Proto 服務名稱",
+    "Proto Method": "Proto 方式",
+    "Proto Content": "Proto 內容",
+    Economy: "節約",
+    Lowcost: "低費率",
+    high: "高",
+    "General Monitor Type": "一般監測器類型",
+    "Passive Monitor Type": "被動監測器類型",
+    "Specific Monitor Type": "指定監測器類型",
 };

From 8c684e92936b5860139b09e50917d55c0b041891 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 28 Dec 2022 19:59:33 +0800
Subject: [PATCH 363/803] Update SECURITY.md

---
 SECURITY.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/SECURITY.md b/SECURITY.md
index d5941a97..657aa3eb 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,9 +2,9 @@
 
 ## Reporting a Vulnerability
 
-Please report security issues to uptime@kuma.pet.
+Please report security issues to https://github.com/louislam/uptime-kuma/security/advisories/new.
 
-Do not use the issue tracker or discuss it in the public as it will cause more damage.
+Do not use the public issue tracker or discuss it in the public as it will cause more damage.
 
 ## Supported Versions
 

From 4147a4c4040512670be065f9ad29b94d511b7248 Mon Sep 17 00:00:00 2001
From: minhhoang <minhhn3@vng.com.vn>
Date: Wed, 28 Dec 2022 22:31:33 +0700
Subject: [PATCH 364/803] fix: #2480

---
 server/model/monitor.js | 2 +-
 server/server.js        | 1 +
 server/util-server.js   | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 186962b0..b6e95032 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -548,7 +548,7 @@ class Monitor extends BeanModel {
                     log.debug("monitor:", `gRPC response: ${JSON.stringify(response)}`);
                     let responseData = response.data;
                     if (responseData.length > 50) {
-                        responseData = response.substring(0, 47) + "...";
+                        responseData = responseData.toString().substring(0, 47) + "...";
                     }
                     if (response.code !== 1) {
                         bean.status = DOWN;
diff --git a/server/server.js b/server/server.js
index 594c29b3..5473cecd 100644
--- a/server/server.js
+++ b/server/server.js
@@ -714,6 +714,7 @@ let needSetup = false;
                 bean.authDomain = monitor.authDomain;
                 bean.grpcUrl = monitor.grpcUrl;
                 bean.grpcProtobuf = monitor.grpcProtobuf;
+                bean.grpcServiceName = monitor.grpcServiceName;
                 bean.grpcMethod = monitor.grpcMethod;
                 bean.grpcBody = monitor.grpcBody;
                 bean.grpcMetadata = monitor.grpcMetadata;
diff --git a/server/util-server.js b/server/util-server.js
index 0bf69133..ffc3b3d9 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -787,7 +787,7 @@ module.exports.grpcQuery = async (options) => {
                     data: ""
                 });
             } else {
-                log.debug("monitor:", `gRPC response: ${response}`);
+                log.debug("monitor:", `gRPC response: ${JSON.stringify(response)}`);
                 return resolve({
                     code: 1,
                     errorMessage: "",

From d111db0321fdd19886d107052c85b46ae77a1b9e Mon Sep 17 00:00:00 2001
From: minhhoang <minhhn3@vng.com.vn>
Date: Thu, 29 Dec 2022 08:10:58 +0700
Subject: [PATCH 365/803] fix: add accurate error message when user input
 invalid service name or method name

---
 server/util-server.js | 43 ++++++++++++++++++++++++++-----------------
 1 file changed, 26 insertions(+), 17 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index ffc3b3d9..2ce6de3e 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -778,22 +778,31 @@ module.exports.grpcQuery = async (options) => {
             cb);
     }, false, false);
     return new Promise((resolve, _) => {
-        return grpcService[`${grpcMethod}`](JSON.parse(grpcBody), function (err, response) {
-            const responseData = JSON.stringify(response);
-            if (err) {
-                return resolve({
-                    code: err.code,
-                    errorMessage: err.details,
-                    data: ""
-                });
-            } else {
-                log.debug("monitor:", `gRPC response: ${JSON.stringify(response)}`);
-                return resolve({
-                    code: 1,
-                    errorMessage: "",
-                    data: responseData
-                });
-            }
-        });
+        try {
+            return grpcService[`${grpcMethod}`](JSON.parse(grpcBody), function (err, response) {
+                const responseData = JSON.stringify(response);
+                if (err) {
+                    return resolve({
+                        code: err.code,
+                        errorMessage: err.details,
+                        data: ""
+                    });
+                } else {
+                    log.debug("monitor:", `gRPC response: ${JSON.stringify(response)}`);
+                    return resolve({
+                        code: 1,
+                        errorMessage: "",
+                        data: responseData
+                    });
+                }
+            });
+        } catch (err) {
+            return resolve({
+                code: -1,
+                errorMessage: `Error ${err}. Please review your gRPC configuration option. The service name must not include package name value, and the method name must follow camelCase format`,
+                data: ""
+            });
+        }
+
     });
 };

From 1006fbd873002e862d44ea801419031390a8ffed Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 30 Dec 2022 13:46:34 +0800
Subject: [PATCH 366/803] A possible fix for #2447

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 186962b0..54899a0a 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1090,7 +1090,7 @@ class Monitor extends BeanModel {
                     // Prevent if the msg is undefined, notifications such as Discord cannot send out.
                     const heartbeatJSON = bean.toJSON();
                     if (!heartbeatJSON["msg"]) {
-                        heartbeatJSON["msg"] = "";
+                        heartbeatJSON["msg"] = "N/A";
                     }
 
                     await Notification.send(JSON.parse(notification.config), msg, await monitor.toJSON(false), heartbeatJSON);

From e88e10cc8e640af3d80674a9c624cac685874ba0 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 1 Jan 2023 21:43:39 +0800
Subject: [PATCH 367/803] Fix #2494

---
 server/socket-handlers/maintenance-socket-handler.js | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/server/socket-handlers/maintenance-socket-handler.js b/server/socket-handlers/maintenance-socket-handler.js
index 5294050c..929150cd 100644
--- a/server/socket-handlers/maintenance-socket-handler.js
+++ b/server/socket-handlers/maintenance-socket-handler.js
@@ -244,6 +244,8 @@ module.exports.maintenanceSocketHandler = (socket) => {
                 socket.userID,
             ]);
 
+            apicache.clear();
+
             callback({
                 ok: true,
                 msg: "Deleted Successfully.",
@@ -269,6 +271,8 @@ module.exports.maintenanceSocketHandler = (socket) => {
                 maintenanceID,
             ]);
 
+            apicache.clear();
+
             callback({
                 ok: true,
                 msg: "Paused Successfully.",
@@ -294,6 +298,8 @@ module.exports.maintenanceSocketHandler = (socket) => {
                 maintenanceID,
             ]);
 
+            apicache.clear();
+
             callback({
                 ok: true,
                 msg: "Resume Successfully",

From 50711391d1ddd8a597aba578609fabaade82e8c4 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 1 Jan 2023 22:19:00 +0800
Subject: [PATCH 368/803] Revert "Auth: Case insensitive login check on
 username"

---
 db/patch-user-username-case-insensitive.sql | 47 ---------------------
 server/auth.js                              |  2 +-
 server/database.js                          |  1 -
 3 files changed, 1 insertion(+), 49 deletions(-)
 delete mode 100644 db/patch-user-username-case-insensitive.sql

diff --git a/db/patch-user-username-case-insensitive.sql b/db/patch-user-username-case-insensitive.sql
deleted file mode 100644
index 90b7f1cb..00000000
--- a/db/patch-user-username-case-insensitive.sql
+++ /dev/null
@@ -1,47 +0,0 @@
-CREATE TABLE [temp_user](
-  [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
-  [username] VARCHAR(255) NOT NULL UNIQUE COLLATE NOCASE,
-  [password] VARCHAR(255),
-  [active] BOOLEAN NOT NULL DEFAULT 1,
-  [timezone] VARCHAR(150),
-  twofa_secret VARCHAR(64),
-  twofa_status BOOLEAN default 0 NOT NULL,
-  twofa_last_token VARCHAR(6)
-);
-
-INSERT INTO [temp_user] SELECT
-[id],
-[username],
-[password],
-[active],
-[timezone],
-twofa_secret,
-twofa_status,
-twofa_last_token
- FROM user;
-
-DROP TABLE user;
-
-CREATE TABLE [user](
-  [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
-  [username] VARCHAR(255) NOT NULL UNIQUE COLLATE NOCASE,
-  [password] VARCHAR(255),
-  [active] BOOLEAN NOT NULL DEFAULT 1,
-  [timezone] VARCHAR(150),
-  twofa_secret VARCHAR(64),
-  twofa_status BOOLEAN default 0 NOT NULL,
-  twofa_last_token VARCHAR(6)
-);
-
-INSERT INTO [user] SELECT
-[id],
-[username],
-[password],
-[active],
-[timezone],
-twofa_secret,
-twofa_status,
-twofa_last_token
- FROM [temp_user];
-
-DROP TABLE [temp_user];
diff --git a/server/auth.js b/server/auth.js
index b4eeee41..3ce1a604 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -15,7 +15,7 @@ exports.login = async function (username, password) {
         return null;
     }
 
-    let user = await R.findOne("user", " username = ? AND active = 1", [
+    let user = await R.findOne("user", " username = ? AND active = 1 ", [
         username,
     ]);
 
diff --git a/server/database.js b/server/database.js
index 7764df3f..2544f197 100644
--- a/server/database.js
+++ b/server/database.js
@@ -66,7 +66,6 @@ class Database {
         "patch-add-radius-monitor.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
         "patch-maintenance-table2.sql": true,
-        "patch-user-username-case-insensitive.sql": { parents: [ "patch-2fa-invalidate-used-token.sql", "patch-2fa.sql" ] }
     };
 
     /**

From 39ac9b887e0fbf98b0c53d1c37b75383d6458ecf Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 1 Jan 2023 22:27:14 +0800
Subject: [PATCH 369/803] Fix #2504

---
 server/util-server.js | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index 2ce6de3e..ffd171b4 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -248,19 +248,19 @@ exports.dnsResolve = function (hostname, resolverServer, resolverPort, rrtype) {
  * @param {string} query The query to validate the database with
  * @returns {Promise<(string[]|Object[]|Object)>}
  */
-exports.mssqlQuery = function (connectionString, query) {
-    return new Promise((resolve, reject) => {
-        mssql.connect(connectionString).then(pool => {
-            return pool.request()
-                .query(query);
-        }).then(result => {
-            resolve(result);
-        }).catch(err => {
-            reject(err);
-        }).finally(() => {
-            mssql.close();
-        });
-    });
+exports.mssqlQuery = async function (connectionString, query) {
+    let pool;
+    try {
+        pool = new mssql.ConnectionPool(connectionString);
+        await pool.connect();
+        await pool.request().query(query);
+        pool.close();
+    } catch (e) {
+        if (pool) {
+            pool.close();
+        }
+        throw e;
+    }
 };
 
 /**

From a8af2a418e433752570ed124fb3db75534efa070 Mon Sep 17 00:00:00 2001
From: Arniwatt Chonkiattipoom <73098755+pruekk@users.noreply.github.com>
Date: Mon, 2 Jan 2023 14:01:50 +0700
Subject: [PATCH 370/803] Slack notification block not working (#1958)

* [empty commit] pull request for slack notification

* Add attachments block for slack notification

* chore: update action button in new attachment block

* chore: loop in attachments to push blocks

* chore: missing semicolon

Co-authored-by: pruekanw <arniwatt.c@linecorp.com>
---
 server/notification-providers/slack.js | 67 +++++++++++++++-----------
 1 file changed, 38 insertions(+), 29 deletions(-)

diff --git a/server/notification-providers/slack.js b/server/notification-providers/slack.js
index da1d6e66..5a5d40cb 100644
--- a/server/notification-providers/slack.js
+++ b/server/notification-providers/slack.js
@@ -1,7 +1,7 @@
 const NotificationProvider = require("./notification-provider");
 const axios = require("axios");
 const { setSettings, setting } = require("../util-server");
-const { getMonitorRelativeURL } = require("../../src/util");
+const { getMonitorRelativeURL, UP } = require("../../src/util");
 
 class Slack extends NotificationProvider {
 
@@ -46,24 +46,31 @@ class Slack extends NotificationProvider {
                 "channel": notification.slackchannel,
                 "username": notification.slackusername,
                 "icon_emoji": notification.slackiconemo,
-                "blocks": [{
-                    "type": "header",
-                    "text": {
-                        "type": "plain_text",
-                        "text": "Uptime Kuma Alert",
-                    },
-                },
-                {
-                    "type": "section",
-                    "fields": [{
-                        "type": "mrkdwn",
-                        "text": "*Message*\n" + msg,
-                    },
+                "attachments": [
                     {
-                        "type": "mrkdwn",
-                        "text": "*Time (UTC)*\n" + time,
-                    }],
-                }],
+                        "color": (heartbeatJSON["status"] === UP) ? "#2eb886" : "#e01e5a",
+                        "blocks": [
+                            {
+                                "type": "header",
+                                "text": {
+                                    "type": "plain_text",
+                                    "text": "Uptime Kuma Alert",
+                                },
+                            },
+                            {
+                                "type": "section",
+                                "fields": [{
+                                    "type": "mrkdwn",
+                                    "text": "*Message*\n" + msg,
+                                },
+                                {
+                                    "type": "mrkdwn",
+                                    "text": "*Time (UTC)*\n" + time,
+                                }],
+                            }
+                        ],
+                    }
+                ]
             };
 
             if (notification.slackbutton) {
@@ -74,17 +81,19 @@ class Slack extends NotificationProvider {
 
             // Button
             if (baseURL) {
-                data.blocks.push({
-                    "type": "actions",
-                    "elements": [{
-                        "type": "button",
-                        "text": {
-                            "type": "plain_text",
-                            "text": "Visit Uptime Kuma",
-                        },
-                        "value": "Uptime-Kuma",
-                        "url": baseURL + getMonitorRelativeURL(monitorJSON.id),
-                    }],
+                data.attachments.forEach(element => {
+                    element.blocks.push({
+                        "type": "actions",
+                        "elements": [{
+                            "type": "button",
+                            "text": {
+                                "type": "plain_text",
+                                "text": "Visit Uptime Kuma",
+                            },
+                            "value": "Uptime-Kuma",
+                            "url": baseURL + getMonitorRelativeURL(monitorJSON.id),
+                        }],
+                    });
                 });
             }
 

From cd7e362b81b50eb17cd302957ca48058005b99d1 Mon Sep 17 00:00:00 2001
From: lionep <penaud.lionel@gmail.com>
Date: Mon, 2 Jan 2023 08:46:42 +0100
Subject: [PATCH 371/803] Improve french translation

Set "Not available, please setup" translation more accurate, because it's in use in notifications and proxies page.
---
 src/languages/fr-FR.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 5ad04bfe..aeb84731 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -99,7 +99,7 @@ export default {
     pushOptionalParams: "Paramètres facultatifs : {0}",
     Save: "Sauvegarder",
     Notifications: "Notifications",
-    "Not available, please setup.": "Pas de système de notification disponible, merci de le configurer.",
+    "Not available, please setup.": "Non disponible, merci de le configurer.",
     "Setup Notification": "Créer une notification",
     Light: "Clair",
     Dark: "Sombre",

From 239910a27c77b77a67d111abe19ecc7fa5f06591 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mathias=20Haugsb=C3=B8?= <mathiash98@gmail.com>
Date: Mon, 2 Jan 2023 13:17:38 +0100
Subject: [PATCH 372/803] Change clone icon from plus to clone

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
---
 src/pages/Details.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 40ed0358..fce3fde5 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -31,7 +31,7 @@
                         <font-awesome-icon icon="edit" /> {{ $t("Edit") }}
                     </router-link>
                     <router-link :to=" '/clone/' + monitor.id " class="btn btn-normal">
-                        <font-awesome-icon icon="plus" /> {{ $t("Clone") }}
+                        <font-awesome-icon icon="clone" /> {{ $t("Clone") }}
                     </router-link>
                     <button class="btn btn-danger" @click="deleteDialog">
                         <font-awesome-icon icon="trash" /> {{ $t("Delete") }}

From 0cead837053e139e9046e58761804324ec331e7f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 3 Jan 2023 14:50:29 +0800
Subject: [PATCH 373/803] Fix #2516

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

diff --git a/server/model/status_page.js b/server/model/status_page.js
index 80b57699..0dabf5ab 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -281,7 +281,7 @@ class StatusPage extends BeanModel {
 
             let activeCondition = Maintenance.getActiveMaintenanceSQLCondition();
             let maintenanceBeanList = R.convertToBeans("maintenance", await R.getAll(`
-                SELECT maintenance.*
+                SELECT DISTINCT maintenance.*
                 FROM maintenance
                 JOIN maintenance_status_page
                     ON maintenance_status_page.maintenance_id = maintenance.id

From b8e8c1b9dbb1cd74f6a5ba02c49367ead506370c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 3 Jan 2023 18:05:19 +0800
Subject: [PATCH 374/803] Update to 1.19.3

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

diff --git a/package.json b/package.json
index 18ae4770..c41b1701 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.2",
+    "version": "1.19.3",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -38,7 +38,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.19.2 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.19.3 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 942b55ca031b4a487d299c7e189052634fdb9c17 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Tue, 3 Jan 2023 21:45:55 +0800
Subject: [PATCH 375/803] Fix: Add support for maintenance in badges

---
 server/config.js             |  1 +
 server/routers/api-router.js | 36 +++++++++++++++++++++++++++++++++---
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/server/config.js b/server/config.js
index d46f24b7..398ddbb1 100644
--- a/server/config.js
+++ b/server/config.js
@@ -5,6 +5,7 @@ const badgeConstants = {
     naColor: "#999",
     defaultUpColor: "#66c20a",
     defaultDownColor: "#c2290a",
+    defaultMaintenanceColor: "#1747f5",
     defaultPingColor: "blue",  // as defined by badge-maker / shields.io
     defaultStyle: "flat",
     defaultPingValueSuffix: "ms",
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index bbecbced..45236d20 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -111,8 +111,10 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
         label,
         upLabel = "Up",
         downLabel = "Down",
+        maintenanceLabel = "Maintenance",
         upColor = badgeConstants.defaultUpColor,
         downColor = badgeConstants.defaultDownColor,
+        maintenanceColor = badgeConstants.defaultMaintenanceColor,
         style = badgeConstants.defaultStyle,
         value, // for demo purpose only
     } = request.query;
@@ -139,11 +141,39 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
             badgeValues.color = badgeConstants.naColor;
         } else {
             const heartbeat = await Monitor.getPreviousHeartbeat(requestedMonitorId);
-            const state = overrideValue !== undefined ? overrideValue : heartbeat.status === 1;
+            const state = overrideValue !== undefined ? overrideValue : heartbeat.status;
 
             badgeValues.label = label ? label : "";
-            badgeValues.color = state ? upColor : downColor;
-            badgeValues.message = label ?? state ? upLabel : downLabel;
+            switch (state) {
+                case 1:
+                    badgeValues.color = upColor;
+                    break;
+                case 3:
+                    badgeValues.color = maintenanceColor;
+                    break;
+                case 0:
+                    badgeValues.color = downColor;
+                    break;
+                default:
+                    badgeValues.color = badgeConstants.naColor;
+            }
+            if (label !== undefined) {
+                badgeValues.message = label;
+            } else {
+                switch (state) {
+                    case 1:
+                        badgeValues.message = upLabel;
+                        break;
+                    case 3:
+                        badgeValues.message = maintenanceLabel;
+                        break;
+                    case 0:
+                        badgeValues.message = downLabel;
+                        break;
+                    default:
+                        badgeValues.message = "N/A";
+                }
+            }
         }
 
         // build the svg based on given values

From 204792dd2d0b40f343d1fc04811d05556f032eb7 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Tue, 3 Jan 2023 22:07:14 +0800
Subject: [PATCH 376/803] Fix: Fix incorrect handling for container down

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 2c260e96..9f8c8300 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -514,7 +514,9 @@ class Monitor extends BeanModel {
                     let res = await axios.request(options);
                     if (res.data.State.Running) {
                         bean.status = UP;
-                        bean.msg = "";
+                        bean.msg = res.data.State.Status;
+                    } else {
+                        throw Error("Container State is " + res.data.State.Status);
                     }
                 } else if (this.type === "mqtt") {
                     bean.msg = await mqttAsync(this.hostname, this.mqttTopic, this.mqttSuccessMessage, {

From edd8fe2e226896aa1b0e978f512aacc17d50d3de Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Tue, 3 Jan 2023 22:18:45 +0800
Subject: [PATCH 377/803] Fix: Fix incorrect tag form validation

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

diff --git a/src/components/TagsManager.vue b/src/components/TagsManager.vue
index 2958babe..8481fdfe 100644
--- a/src/components/TagsManager.vue
+++ b/src/components/TagsManager.vue
@@ -204,7 +204,7 @@ export default {
                 nameInvalid = false;
                 valueInvalid = false;
                 invalid = false;
-            } else if (this.existingTags.filter(tag => tag.name === this.newDraftTag.name).length > 0) {
+            } else if (this.existingTags.filter(tag => tag.name === this.newDraftTag.name).length > 0 && this.newDraftTag.select == null) {
                 // Try to create new tag with existing name
                 nameInvalid = true;
                 invalid = true;

From 2d3fd738e4691dfc03d06be3cffae9e2f55aa00f Mon Sep 17 00:00:00 2001
From: Joppe Koers <joppe@joppekoers.nl>
Date: Tue, 3 Jan 2023 15:37:32 +0100
Subject: [PATCH 378/803] Fix small spelling mistake

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

diff --git a/README.md b/README.md
index 90c8ad75..9b810015 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ Kuma is now running on http://localhost:3001
 Required Tools: 
 - [Node.js](https://nodejs.org/en/download/) >= 14
 - [Git](https://git-scm.com/downloads) 
-- [pm2](https://pm2.keymetrics.io/) - For running kuma in the background
+- [pm2](https://pm2.keymetrics.io/) - For running Uptime Kuma in the background
 
 ```bash
 # Update your npm to the latest version

From 73835f3328224b498f231ef46f462ac538e22d3d Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Tue, 3 Jan 2023 20:03:36 +0000
Subject: [PATCH 379/803] Changed  from ping-lite to ping module

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>

#Fixes 2126
---
 package-lock.json     |  50 ++++++++++-
 package.json          |   1 +
 server/ping-lite.js   | 199 ------------------------------------------
 server/util-server.js |  31 +++----
 4 files changed, 62 insertions(+), 219 deletions(-)
 delete mode 100644 server/ping-lite.js

diff --git a/package-lock.json b/package-lock.json
index d8b67781..0e99be12 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.0",
+    "version": "1.19.3",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.0",
+            "version": "1.19.3",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
@@ -48,6 +48,7 @@
                 "password-hash": "~1.2.2",
                 "pg": "~8.8.0",
                 "pg-connection-string": "~2.5.0",
+                "ping": "^0.4.2",
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
                 "protobufjs": "~7.1.1",
@@ -13241,6 +13242,18 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/ping": {
+            "version": "0.4.2",
+            "resolved": "https://registry.npmjs.org/ping/-/ping-0.4.2.tgz",
+            "integrity": "sha512-1uAw0bzHtrPbPo2s6no06oZAzY6KqKclEJR1JRZKIHKXKlPdrz9N0/1MPPB+BbrvMjN3Mk0pcod3bfLNZFRo9w==",
+            "dependencies": {
+                "q": "1.x",
+                "underscore": "^1.12.0"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
         "node_modules/pirates": {
             "version": "4.0.5",
             "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
@@ -13631,6 +13644,15 @@
                 "node": ">=6"
             }
         },
+        "node_modules/q": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+            "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+            "engines": {
+                "node": ">=0.6.0",
+                "teleport": ">=0.2.0"
+            }
+        },
         "node_modules/qlobber": {
             "version": "5.0.3",
             "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
@@ -15854,6 +15876,11 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/underscore": {
+            "version": "1.13.6",
+            "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+            "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
+        },
         "node_modules/unicode-canonical-property-names-ecmascript": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -26785,6 +26812,15 @@
             "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
             "dev": true
         },
+        "ping": {
+            "version": "0.4.2",
+            "resolved": "https://registry.npmjs.org/ping/-/ping-0.4.2.tgz",
+            "integrity": "sha512-1uAw0bzHtrPbPo2s6no06oZAzY6KqKclEJR1JRZKIHKXKlPdrz9N0/1MPPB+BbrvMjN3Mk0pcod3bfLNZFRo9w==",
+            "requires": {
+                "q": "1.x",
+                "underscore": "^1.12.0"
+            }
+        },
         "pirates": {
             "version": "4.0.5",
             "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
@@ -27068,6 +27104,11 @@
             "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
             "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
         },
+        "q": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+            "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="
+        },
         "qlobber": {
             "version": "5.0.3",
             "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
@@ -28780,6 +28821,11 @@
                 "which-boxed-primitive": "^1.0.2"
             }
         },
+        "underscore": {
+            "version": "1.13.6",
+            "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+            "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
+        },
         "unicode-canonical-property-names-ecmascript": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
diff --git a/package.json b/package.json
index c41b1701..f7ed288f 100644
--- a/package.json
+++ b/package.json
@@ -103,6 +103,7 @@
         "password-hash": "~1.2.2",
         "pg": "~8.8.0",
         "pg-connection-string": "~2.5.0",
+        "ping": "^0.4.2",
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
         "protobufjs": "~7.1.1",
diff --git a/server/ping-lite.js b/server/ping-lite.js
deleted file mode 100644
index 05dff31d..00000000
--- a/server/ping-lite.js
+++ /dev/null
@@ -1,199 +0,0 @@
-// https://github.com/ben-bradley/ping-lite/blob/master/ping-lite.js
-// Fixed on Windows
-const net = require("net");
-const spawn = require("child_process").spawn;
-const events = require("events");
-const fs = require("fs");
-const util = require("./util-server");
-
-module.exports = Ping;
-
-/**
- * Constructor for ping class
- * @param {string} host Host to ping
- * @param {object} [options] Options for the ping command
- * @param {array|string} [options.args] - Arguments to pass to the ping command
- */
-function Ping(host, options) {
-    if (!host) {
-        throw new Error("You must specify a host to ping!");
-    }
-
-    this._host = host;
-    this._options = options = (options || {});
-
-    events.EventEmitter.call(this);
-
-    const timeout = 10;
-
-    if (util.WIN) {
-        this._bin = "c:/windows/system32/ping.exe";
-        this._args = (options.args) ? options.args : [ "-n", "1", "-w", timeout * 1000, host ];
-        this._regmatch = /[><=]([0-9.]+?)ms/;
-
-    } else if (util.LIN) {
-        this._bin = "/bin/ping";
-
-        const defaultArgs = [ "-n", "-w", timeout, "-c", "1", host ];
-
-        if (net.isIPv6(host) || options.ipv6) {
-            defaultArgs.unshift("-6");
-        }
-
-        this._args = (options.args) ? options.args : defaultArgs;
-        this._regmatch = /=([0-9.]+?) ms/;
-
-    } else if (util.MAC) {
-
-        if (net.isIPv6(host) || options.ipv6) {
-            this._bin = "/sbin/ping6";
-        } else {
-            this._bin = "/sbin/ping";
-        }
-
-        this._args = (options.args) ? options.args : [ "-n", "-t", timeout, "-c", "1", host ];
-        this._regmatch = /=([0-9.]+?) ms/;
-
-    } else if (util.BSD) {
-        this._bin = "/sbin/ping";
-
-        const defaultArgs = [ "-n", "-t", timeout, "-c", "1", host ];
-
-        if (net.isIPv6(host) || options.ipv6) {
-            defaultArgs.unshift("-6");
-        }
-
-        this._args = (options.args) ? options.args : defaultArgs;
-        this._regmatch = /=([0-9.]+?) ms/;
-
-    } else {
-        throw new Error("Could not detect your ping binary.");
-    }
-
-    if (!fs.existsSync(this._bin)) {
-        throw new Error("Could not detect " + this._bin + " on your system");
-    }
-
-    this._i = 0;
-
-    return this;
-}
-
-Ping.prototype.__proto__ = events.EventEmitter.prototype;
-
-/**
- * Callback for send
- * @callback pingCB
- * @param {any} err Any error encountered
- * @param {number} ms Ping time in ms
- */
-
-/**
- * Send a ping
- * @param {pingCB} callback Callback to call with results
- */
-Ping.prototype.send = function (callback) {
-    let self = this;
-    callback = callback || function (err, ms) {
-        if (err) {
-            return self.emit("error", err);
-        }
-        return self.emit("result", ms);
-    };
-
-    let _ended;
-    let _exited;
-    let _errored;
-
-    this._ping = spawn(this._bin, this._args, { windowsHide: true }); // spawn the binary
-
-    this._ping.on("error", function (err) { // handle binary errors
-        _errored = true;
-        callback(err);
-    });
-
-    this._ping.stdout.on("data", function (data) { // log stdout
-        if (util.WIN) {
-            data = convertOutput(data);
-        }
-        this._stdout = (this._stdout || "") + data;
-    });
-
-    this._ping.stdout.on("end", function () {
-        _ended = true;
-        if (_exited && !_errored) {
-            onEnd.call(self._ping);
-        }
-    });
-
-    this._ping.stderr.on("data", function (data) { // log stderr
-        if (util.WIN) {
-            data = convertOutput(data);
-        }
-        this._stderr = (this._stderr || "") + data;
-    });
-
-    this._ping.on("exit", function (code) { // handle complete
-        _exited = true;
-        if (_ended && !_errored) {
-            onEnd.call(self._ping);
-        }
-    });
-
-    /**
-     * @param {Function} callback
-     *
-     * Generated by Trelent
-     */
-    function onEnd() {
-        let stdout = this.stdout._stdout;
-        let stderr = this.stderr._stderr;
-        let ms;
-
-        if (stderr) {
-            return callback(new Error(stderr));
-        }
-
-        if (!stdout) {
-            return callback(new Error("No stdout detected"));
-        }
-
-        ms = stdout.match(self._regmatch); // parse out the ##ms response
-        ms = (ms && ms[1]) ? Number(ms[1]) : ms;
-
-        callback(null, ms, stdout);
-    }
-};
-
-/**
- * Ping every interval
- * @param {pingCB} callback Callback to call with results
- */
-Ping.prototype.start = function (callback) {
-    let self = this;
-    this._i = setInterval(function () {
-        self.send(callback);
-    }, (self._options.interval || 5000));
-    self.send(callback);
-};
-
-/** Stop sending pings */
-Ping.prototype.stop = function () {
-    clearInterval(this._i);
-};
-
-/**
- * Try to convert to UTF-8 for Windows, as the ping's output on Windows is not UTF-8 and could be in other languages
- * Thank @pemassi
- * https://github.com/louislam/uptime-kuma/issues/570#issuecomment-941984094
- * @param {any} data
- * @returns {string}
- */
-function convertOutput(data) {
-    if (util.WIN) {
-        if (data) {
-            return util.convertToUTF8(data);
-        }
-    }
-    return data;
-}
diff --git a/server/util-server.js b/server/util-server.js
index ffd171b4..72662136 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -1,5 +1,5 @@
 const tcpp = require("tcp-ping");
-const Ping = require("./ping-lite");
+const ping = require("ping");
 const { R } = require("redbean-node");
 const { log, genSecret } = require("../src/util");
 const passwordHash = require("./password-hash");
@@ -26,13 +26,6 @@ const {
 } = require("node-radius-utils");
 const dayjs = require("dayjs");
 
-// From ping-lite
-exports.WIN = /^win/.test(process.platform);
-exports.LIN = /^linux/.test(process.platform);
-exports.MAC = /^darwin/.test(process.platform);
-exports.FBSD = /^freebsd/.test(process.platform);
-exports.BSD = /bsd$/.test(process.platform);
-
 /**
  * Init or reset JWT secret
  * @returns {Promise<Bean>}
@@ -105,18 +98,20 @@ exports.ping = async (hostname) => {
  */
 exports.pingAsync = function (hostname, ipv6 = false) {
     return new Promise((resolve, reject) => {
-        const ping = new Ping(hostname, {
-            ipv6
-        });
-
-        ping.send(function (err, ms, stdout) {
-            if (err) {
-                reject(err);
-            } else if (ms === null) {
-                reject(new Error(stdout));
+        ping.promise.probe(hostname, {
+            v6: ipv6,
+            min_reply: 3
+        }).then((res) => {
+            // If ping failed, it will set field to unknown
+            if (res.host === "unknown") {
+                reject(new Error("Name or service not known"));
+            } else if (res.time === "unknown") {
+                reject(new Error(res.output));
             } else {
-                resolve(Math.round(ms));
+                resolve(res.time);
             }
+        }).catch((err) => {
+            reject(err);
         });
     });
 };

From f99a64da67f98e063604f70eedd0fed060896d88 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 4 Jan 2023 15:48:09 +0800
Subject: [PATCH 380/803] Run `npm update`

---
 package-lock.json | 2079 +++++++++++++++++++++++++++------------------
 1 file changed, 1265 insertions(+), 814 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d8b67781..b4a7b755 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.0",
+    "version": "1.19.3",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.0",
+            "version": "1.19.3",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
@@ -366,20 +366,20 @@
             }
         },
         "node_modules/@azure/msal-browser": {
-            "version": "2.32.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.0.tgz",
-            "integrity": "sha512-uDP0vNmIefM6+RjILGKu+zOiN+VGnEvxRfUIV5hOWOWLLkG7kcDPYG/v/EJMoG+R5DYW9jXA5nvZT76t5HdEAQ==",
+            "version": "2.32.1",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.1.tgz",
+            "integrity": "sha512-2G3B12ZEIpiimi6/Yqq7KLk4ud1zZWoHvVd2kJ2VthN1HjMsZjdMUxeHkwMWaQ6RzO6mv9rZiuKmRX64xkXW9g==",
             "dependencies": {
-                "@azure/msal-common": "^9.0.0"
+                "@azure/msal-common": "^9.0.1"
             },
             "engines": {
                 "node": ">=0.8.0"
             }
         },
         "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": {
-            "version": "9.0.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
-            "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg==",
+            "version": "9.0.1",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.1.tgz",
+            "integrity": "sha512-eNNHIW/cwPTZDWs9KtYgb1X6gtQ+cC+FGX2YN+t4AUVsBdUbqlMTnUs6/c/VBxC2AAGIhgLREuNnO3F66AN2zQ==",
             "engines": {
                 "node": ">=0.8.0"
             }
@@ -393,11 +393,11 @@
             }
         },
         "node_modules/@azure/msal-node": {
-            "version": "1.14.4",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.4.tgz",
-            "integrity": "sha512-j9GzZu5mTLWtuJ+cYN6e67UNymIS5OysblrOzH8lakt9XxH0GCPYjuqbOEKTP84r+Rbj3io+TuW1KS+0Xxuj/g==",
+            "version": "1.14.5",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.5.tgz",
+            "integrity": "sha512-NcVdMfn8Z3ogN+9RjOSF7uwf2Gki5DEJl0BdDSL83KUAgVAobtkZi5W8EqxbJLrTO/ET0jv5DregrcR5qg2pEA==",
             "dependencies": {
-                "@azure/msal-common": "^9.0.0",
+                "@azure/msal-common": "^9.0.1",
                 "jsonwebtoken": "^8.5.1",
                 "uuid": "^8.3.0"
             },
@@ -406,9 +406,9 @@
             }
         },
         "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
-            "version": "9.0.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
-            "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg==",
+            "version": "9.0.1",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.1.tgz",
+            "integrity": "sha512-eNNHIW/cwPTZDWs9KtYgb1X6gtQ+cC+FGX2YN+t4AUVsBdUbqlMTnUs6/c/VBxC2AAGIhgLREuNnO3F66AN2zQ==",
             "engines": {
                 "node": ">=0.8.0"
             }
@@ -426,30 +426,30 @@
             }
         },
         "node_modules/@babel/compat-data": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
-            "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
+            "version": "7.20.10",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz",
+            "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/core": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz",
-            "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz",
+            "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==",
             "dev": true,
             "dependencies": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.20.2",
-                "@babel/helper-compilation-targets": "^7.20.0",
-                "@babel/helper-module-transforms": "^7.20.2",
-                "@babel/helpers": "^7.20.1",
-                "@babel/parser": "^7.20.2",
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.2",
+                "@babel/generator": "^7.20.7",
+                "@babel/helper-compilation-targets": "^7.20.7",
+                "@babel/helper-module-transforms": "^7.20.7",
+                "@babel/helpers": "^7.20.7",
+                "@babel/parser": "^7.20.7",
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.7",
+                "@babel/types": "^7.20.7",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -483,12 +483,12 @@
             }
         },
         "node_modules/@babel/generator": {
-            "version": "7.20.4",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz",
-            "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
+            "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.20.2",
+                "@babel/types": "^7.20.7",
                 "@jridgewell/gen-mapping": "^0.3.2",
                 "jsesc": "^2.5.1"
             },
@@ -534,14 +534,15 @@
             }
         },
         "node_modules/@babel/helper-compilation-targets": {
-            "version": "7.20.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
-            "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+            "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.20.0",
+                "@babel/compat-data": "^7.20.5",
                 "@babel/helper-validator-option": "^7.18.6",
                 "browserslist": "^4.21.3",
+                "lru-cache": "^5.1.1",
                 "semver": "^6.3.0"
             },
             "engines": {
@@ -552,17 +553,17 @@
             }
         },
         "node_modules/@babel/helper-create-class-features-plugin": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz",
-            "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz",
+            "integrity": "sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
-                "@babel/helper-member-expression-to-functions": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.19.1",
+                "@babel/helper-replace-supers": "^7.20.7",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             },
             "engines": {
@@ -573,13 +574,13 @@
             }
         },
         "node_modules/@babel/helper-create-regexp-features-plugin": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz",
-            "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz",
+            "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "regexpu-core": "^5.1.0"
+                "regexpu-core": "^5.2.1"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -652,12 +653,12 @@
             }
         },
         "node_modules/@babel/helper-member-expression-to-functions": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
-            "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz",
+            "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.18.9"
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -676,9 +677,9 @@
             }
         },
         "node_modules/@babel/helper-module-transforms": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
-            "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+            "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-environment-visitor": "^7.18.9",
@@ -686,9 +687,9 @@
                 "@babel/helper-simple-access": "^7.20.2",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "@babel/helper-validator-identifier": "^7.19.1",
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.2"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.10",
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -734,16 +735,17 @@
             }
         },
         "node_modules/@babel/helper-replace-supers": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz",
-            "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz",
+            "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-environment-visitor": "^7.18.9",
-                "@babel/helper-member-expression-to-functions": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/traverse": "^7.19.1",
-                "@babel/types": "^7.19.0"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.7",
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -813,29 +815,29 @@
             }
         },
         "node_modules/@babel/helper-wrap-function": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz",
-            "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+            "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.0",
-                "@babel/types": "^7.19.0"
+                "@babel/traverse": "^7.20.5",
+                "@babel/types": "^7.20.5"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helpers": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
-            "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
+            "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
             "dev": true,
             "dependencies": {
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.0"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.7",
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -856,9 +858,9 @@
             }
         },
         "node_modules/@babel/parser": {
-            "version": "7.20.3",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
-            "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
+            "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
             "dev": true,
             "bin": {
                 "parser": "bin/babel-parser.js"
@@ -883,14 +885,14 @@
             }
         },
         "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz",
-            "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz",
+            "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.9",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+                "@babel/plugin-proposal-optional-chaining": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -900,13 +902,13 @@
             }
         },
         "node_modules/@babel/plugin-proposal-async-generator-functions": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz",
-            "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
+            "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-environment-visitor": "^7.18.9",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-remap-async-to-generator": "^7.18.9",
                 "@babel/plugin-syntax-async-generators": "^7.8.4"
             },
@@ -934,13 +936,13 @@
             }
         },
         "node_modules/@babel/plugin-proposal-class-static-block": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz",
-            "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz",
+            "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-create-class-features-plugin": "^7.20.7",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-class-static-block": "^7.14.5"
             },
             "engines": {
@@ -999,12 +1001,12 @@
             }
         },
         "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
-            "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
+            "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
             },
             "engines": {
@@ -1047,16 +1049,16 @@
             }
         },
         "node_modules/@babel/plugin-proposal-object-rest-spread": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz",
-            "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+            "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
             "dev": true,
             "dependencies": {
-                "@babel/compat-data": "^7.20.1",
-                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/compat-data": "^7.20.5",
+                "@babel/helper-compilation-targets": "^7.20.7",
                 "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.20.1"
+                "@babel/plugin-transform-parameters": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1082,13 +1084,13 @@
             }
         },
         "node_modules/@babel/plugin-proposal-optional-chaining": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
-            "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz",
+            "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.9",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
                 "@babel/plugin-syntax-optional-chaining": "^7.8.3"
             },
             "engines": {
@@ -1115,14 +1117,14 @@
             }
         },
         "node_modules/@babel/plugin-proposal-private-property-in-object": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz",
-            "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz",
+            "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-create-class-features-plugin": "^7.20.5",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
             },
             "engines": {
@@ -1380,12 +1382,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-arrow-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz",
-            "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz",
+            "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1395,14 +1397,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-async-to-generator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
-            "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
+            "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-module-imports": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-remap-async-to-generator": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-remap-async-to-generator": "^7.18.9"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1427,9 +1429,9 @@
             }
         },
         "node_modules/@babel/plugin-transform-block-scoping": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz",
-            "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz",
+            "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -1442,18 +1444,18 @@
             }
         },
         "node_modules/@babel/plugin-transform-classes": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz",
-            "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz",
+            "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-compilation-targets": "^7.20.7",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
                 "@babel/helper-plugin-utils": "^7.20.2",
-                "@babel/helper-replace-supers": "^7.19.1",
+                "@babel/helper-replace-supers": "^7.20.7",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "globals": "^11.1.0"
             },
@@ -1465,12 +1467,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-computed-properties": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
-            "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz",
+            "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/template": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1480,9 +1483,9 @@
             }
         },
         "node_modules/@babel/plugin-transform-destructuring": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz",
-            "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz",
+            "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -1604,13 +1607,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-amd": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz",
-            "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+            "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1620,14 +1623,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-commonjs": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz",
-            "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz",
+            "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-simple-access": "^7.19.4"
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-simple-access": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1637,14 +1640,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-systemjs": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz",
-            "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz",
+            "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-hoist-variables": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-validator-identifier": "^7.19.1"
             },
             "engines": {
@@ -1671,13 +1674,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz",
-            "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz",
+            "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.19.0",
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-create-regexp-features-plugin": "^7.20.5",
+                "@babel/helper-plugin-utils": "^7.20.2"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1718,9 +1721,9 @@
             }
         },
         "node_modules/@babel/plugin-transform-parameters": {
-            "version": "7.20.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz",
-            "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz",
+            "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -1748,13 +1751,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-regenerator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz",
-            "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz",
+            "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "regenerator-transform": "^0.15.0"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "regenerator-transform": "^0.15.1"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1794,13 +1797,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-spread": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz",
-            "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+            "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1991,53 +1994,53 @@
             }
         },
         "node_modules/@babel/runtime": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz",
-            "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
+            "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
             "dependencies": {
-                "regenerator-runtime": "^0.13.10"
+                "regenerator-runtime": "^0.13.11"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/standalone": {
-            "version": "7.20.4",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.4.tgz",
-            "integrity": "sha512-27bv4h47jbaFZ7+e7gT1VEo9PNL1ynxqUX6/BERLz1qxm/5gzpbcHX+47VnSeYHyEyGZkRznpSOd8zPBhiz6tw==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.11.tgz",
+            "integrity": "sha512-WUPlwwXFk3iViGE7QFVVp423eVtT+eoXu1940Xu4QJgqgHBF6WWtlwO1Ip5rIWQnp7OHrGdwrwKLtLhUVfOZbA==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/template": {
-            "version": "7.18.10",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
-            "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+            "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/parser": "^7.18.10",
-                "@babel/types": "^7.18.10"
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/traverse": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
-            "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
+            "version": "7.20.10",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz",
+            "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.20.1",
+                "@babel/generator": "^7.20.7",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.20.1",
-                "@babel/types": "^7.20.0",
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             },
@@ -2046,9 +2049,9 @@
             }
         },
         "node_modules/@babel/types": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
-            "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
+            "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-string-parser": "^7.19.4",
@@ -2146,9 +2149,9 @@
             }
         },
         "node_modules/@esbuild/android-arm": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz",
-            "integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
+            "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
             "cpu": [
                 "arm"
             ],
@@ -2162,9 +2165,9 @@
             }
         },
         "node_modules/@esbuild/linux-loong64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz",
-            "integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
+            "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
             "cpu": [
                 "loong64"
             ],
@@ -2178,15 +2181,15 @@
             }
         },
         "node_modules/@eslint/eslintrc": {
-            "version": "1.3.3",
-            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
-            "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+            "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
             "dev": true,
             "dependencies": {
                 "ajv": "^6.12.4",
                 "debug": "^4.3.2",
                 "espree": "^9.4.0",
-                "globals": "^13.15.0",
+                "globals": "^13.19.0",
                 "ignore": "^5.2.0",
                 "import-fresh": "^3.2.1",
                 "js-yaml": "^4.1.0",
@@ -2201,9 +2204,9 @@
             }
         },
         "node_modules/@eslint/eslintrc/node_modules/globals": {
-            "version": "13.18.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
-            "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
+            "version": "13.19.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
+            "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -2299,9 +2302,9 @@
             }
         },
         "node_modules/@grpc/proto-loader": {
-            "version": "0.7.3",
-            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz",
-            "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==",
+            "version": "0.7.4",
+            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.4.tgz",
+            "integrity": "sha512-MnWjkGwqQ3W8fx94/c1CwqLsNmHHv2t0CFn+9++6+cDphC1lolpg9M2OU0iebIjK//pBNX9e94ho+gjx6vz39w==",
             "dependencies": {
                 "@types/long": "^4.0.1",
                 "lodash.camelcase": "^4.3.0",
@@ -3124,9 +3127,9 @@
             }
         },
         "node_modules/@js-joda/core": {
-            "version": "5.4.2",
-            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.4.2.tgz",
-            "integrity": "sha512-QIDIZ9a0NfDStgD47VaTgwiPjlw1p4QPLwjOB/9+/DqIztoQopPNNAd+HdtQMHgE+ibP3dJacd8/TVL/A1RaaA=="
+            "version": "5.5.1",
+            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.1.tgz",
+            "integrity": "sha512-oTFmkyv5MhgkHdZhoe5lwRoKW0t4njPvK3g7ODvK/prkoC5bwylKcyQJMsmjvgHBXoy4u5iLnB5yQ7AljouHAA=="
         },
         "node_modules/@louislam/sqlite3": {
             "version": "15.1.2",
@@ -3169,6 +3172,17 @@
                 "node-pre-gyp": "bin/node-pre-gyp"
             }
         },
+        "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -3183,6 +3197,11 @@
                 "node": ">=10"
             }
         },
+        "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/@nodelib/fs.scandir": {
             "version": "2.1.5",
             "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -3403,9 +3422,9 @@
             }
         },
         "node_modules/@sideway/formula": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
-            "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+            "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
             "dev": true
         },
         "node_modules/@sideway/pinpoint": {
@@ -3415,9 +3434,9 @@
             "dev": true
         },
         "node_modules/@sinonjs/commons": {
-            "version": "1.8.5",
-            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz",
-            "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==",
+            "version": "1.8.6",
+            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+            "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
             "dev": true,
             "dependencies": {
                 "type-detect": "4.0.8"
@@ -3491,9 +3510,9 @@
             }
         },
         "node_modules/@types/babel__traverse": {
-            "version": "7.18.2",
-            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
-            "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
+            "version": "7.18.3",
+            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
+            "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
             "dev": true,
             "dependencies": {
                 "@babel/types": "^7.3.0"
@@ -3547,9 +3566,12 @@
             }
         },
         "node_modules/@types/cors": {
-            "version": "2.8.12",
-            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
-            "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
+            "version": "2.8.13",
+            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
+            "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
+            "dependencies": {
+                "@types/node": "*"
+            }
         },
         "node_modules/@types/es-aggregate-error": {
             "version": "1.0.2",
@@ -3560,20 +3582,20 @@
             }
         },
         "node_modules/@types/express": {
-            "version": "4.17.14",
-            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz",
-            "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==",
+            "version": "4.17.15",
+            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz",
+            "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==",
             "dependencies": {
                 "@types/body-parser": "*",
-                "@types/express-serve-static-core": "^4.17.18",
+                "@types/express-serve-static-core": "^4.17.31",
                 "@types/qs": "*",
                 "@types/serve-static": "*"
             }
         },
         "node_modules/@types/express-serve-static-core": {
-            "version": "4.17.31",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz",
-            "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==",
+            "version": "4.17.32",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz",
+            "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==",
             "dependencies": {
                 "@types/node": "*",
                 "@types/qs": "*",
@@ -3652,9 +3674,9 @@
             }
         },
         "node_modules/@types/lodash": {
-            "version": "4.14.190",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz",
-            "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw=="
+            "version": "4.14.191",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+            "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
         },
         "node_modules/@types/long": {
             "version": "4.0.2",
@@ -3673,9 +3695,9 @@
             "dev": true
         },
         "node_modules/@types/node": {
-            "version": "18.11.9",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz",
-            "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg=="
+            "version": "18.11.18",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
+            "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
         },
         "node_modules/@types/normalize-package-data": {
             "version": "2.4.1",
@@ -3690,9 +3712,9 @@
             "dev": true
         },
         "node_modules/@types/prettier": {
-            "version": "2.7.1",
-            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
-            "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
+            "version": "2.7.2",
+            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
+            "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
             "dev": true
         },
         "node_modules/@types/qs": {
@@ -3733,9 +3755,9 @@
             "dev": true
         },
         "node_modules/@types/yargs": {
-            "version": "16.0.4",
-            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
-            "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+            "version": "16.0.5",
+            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz",
+            "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==",
             "dev": true,
             "dependencies": {
                 "@types/yargs-parser": "*"
@@ -5064,9 +5086,9 @@
             }
         },
         "node_modules/caniuse-lite": {
-            "version": "1.0.30001434",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
-            "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==",
+            "version": "1.0.30001441",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
+            "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==",
             "dev": true,
             "funding": [
                 {
@@ -5240,10 +5262,16 @@
             "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
         },
         "node_modules/ci-info": {
-            "version": "3.7.0",
-            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz",
-            "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==",
+            "version": "3.7.1",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz",
+            "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==",
             "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/sibiraj-s"
+                }
+            ],
             "engines": {
                 "node": ">=8"
             }
@@ -5740,9 +5768,9 @@
             }
         },
         "node_modules/core-js-compat": {
-            "version": "3.26.1",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz",
-            "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==",
+            "version": "3.27.1",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz",
+            "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==",
             "dev": true,
             "dependencies": {
                 "browserslist": "^4.21.4"
@@ -5991,9 +6019,9 @@
             }
         },
         "node_modules/cypress/node_modules/@types/node": {
-            "version": "14.18.33",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
-            "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==",
+            "version": "14.18.36",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz",
+            "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==",
             "dev": true
         },
         "node_modules/cypress/node_modules/ansi-styles": {
@@ -6066,6 +6094,18 @@
                 "node": ">=8"
             }
         },
+        "node_modules/cypress/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/cypress/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -6096,6 +6136,12 @@
                 "url": "https://github.com/chalk/supports-color?sponsor=1"
             }
         },
+        "node_modules/cypress/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/dashdash": {
             "version": "1.14.1",
             "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -6136,9 +6182,9 @@
             }
         },
         "node_modules/dayjs": {
-            "version": "1.11.6",
-            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz",
-            "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ=="
+            "version": "1.11.7",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+            "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
         },
         "node_modules/debug": {
             "version": "4.3.4",
@@ -6196,9 +6242,9 @@
             }
         },
         "node_modules/decimal.js": {
-            "version": "10.4.2",
-            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz",
-            "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==",
+            "version": "10.4.3",
+            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+            "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
             "dev": true
         },
         "node_modules/dedent": {
@@ -6637,9 +6683,9 @@
             }
         },
         "node_modules/es-abstract": {
-            "version": "1.20.4",
-            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
-            "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
+            "version": "1.20.5",
+            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
+            "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
             "dependencies": {
                 "call-bind": "^1.0.2",
                 "es-to-primitive": "^1.2.1",
@@ -6647,6 +6693,7 @@
                 "function.prototype.name": "^1.1.5",
                 "get-intrinsic": "^1.1.3",
                 "get-symbol-description": "^1.0.0",
+                "gopd": "^1.0.1",
                 "has": "^1.0.3",
                 "has-property-descriptors": "^1.0.0",
                 "has-symbols": "^1.0.3",
@@ -6662,8 +6709,8 @@
                 "object.assign": "^4.1.4",
                 "regexp.prototype.flags": "^1.4.3",
                 "safe-regex-test": "^1.0.0",
-                "string.prototype.trimend": "^1.0.5",
-                "string.prototype.trimstart": "^1.0.5",
+                "string.prototype.trimend": "^1.0.6",
+                "string.prototype.trimstart": "^1.0.6",
                 "unbox-primitive": "^1.0.2"
             },
             "engines": {
@@ -6710,9 +6757,9 @@
             }
         },
         "node_modules/esbuild": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
-            "integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+            "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
             "dev": true,
             "hasInstallScript": true,
             "bin": {
@@ -6722,34 +6769,34 @@
                 "node": ">=12"
             },
             "optionalDependencies": {
-                "@esbuild/android-arm": "0.15.15",
-                "@esbuild/linux-loong64": "0.15.15",
-                "esbuild-android-64": "0.15.15",
-                "esbuild-android-arm64": "0.15.15",
-                "esbuild-darwin-64": "0.15.15",
-                "esbuild-darwin-arm64": "0.15.15",
-                "esbuild-freebsd-64": "0.15.15",
-                "esbuild-freebsd-arm64": "0.15.15",
-                "esbuild-linux-32": "0.15.15",
-                "esbuild-linux-64": "0.15.15",
-                "esbuild-linux-arm": "0.15.15",
-                "esbuild-linux-arm64": "0.15.15",
-                "esbuild-linux-mips64le": "0.15.15",
-                "esbuild-linux-ppc64le": "0.15.15",
-                "esbuild-linux-riscv64": "0.15.15",
-                "esbuild-linux-s390x": "0.15.15",
-                "esbuild-netbsd-64": "0.15.15",
-                "esbuild-openbsd-64": "0.15.15",
-                "esbuild-sunos-64": "0.15.15",
-                "esbuild-windows-32": "0.15.15",
-                "esbuild-windows-64": "0.15.15",
-                "esbuild-windows-arm64": "0.15.15"
+                "@esbuild/android-arm": "0.15.18",
+                "@esbuild/linux-loong64": "0.15.18",
+                "esbuild-android-64": "0.15.18",
+                "esbuild-android-arm64": "0.15.18",
+                "esbuild-darwin-64": "0.15.18",
+                "esbuild-darwin-arm64": "0.15.18",
+                "esbuild-freebsd-64": "0.15.18",
+                "esbuild-freebsd-arm64": "0.15.18",
+                "esbuild-linux-32": "0.15.18",
+                "esbuild-linux-64": "0.15.18",
+                "esbuild-linux-arm": "0.15.18",
+                "esbuild-linux-arm64": "0.15.18",
+                "esbuild-linux-mips64le": "0.15.18",
+                "esbuild-linux-ppc64le": "0.15.18",
+                "esbuild-linux-riscv64": "0.15.18",
+                "esbuild-linux-s390x": "0.15.18",
+                "esbuild-netbsd-64": "0.15.18",
+                "esbuild-openbsd-64": "0.15.18",
+                "esbuild-sunos-64": "0.15.18",
+                "esbuild-windows-32": "0.15.18",
+                "esbuild-windows-64": "0.15.18",
+                "esbuild-windows-arm64": "0.15.18"
             }
         },
         "node_modules/esbuild-android-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz",
-            "integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
+            "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
             "cpu": [
                 "x64"
             ],
@@ -6763,9 +6810,9 @@
             }
         },
         "node_modules/esbuild-android-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz",
-            "integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
+            "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
             "cpu": [
                 "arm64"
             ],
@@ -6779,9 +6826,9 @@
             }
         },
         "node_modules/esbuild-darwin-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz",
-            "integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
+            "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
             "cpu": [
                 "x64"
             ],
@@ -6795,9 +6842,9 @@
             }
         },
         "node_modules/esbuild-darwin-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz",
-            "integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
+            "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
             "cpu": [
                 "arm64"
             ],
@@ -6811,9 +6858,9 @@
             }
         },
         "node_modules/esbuild-freebsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz",
-            "integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
+            "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
             "cpu": [
                 "x64"
             ],
@@ -6827,9 +6874,9 @@
             }
         },
         "node_modules/esbuild-freebsd-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz",
-            "integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
+            "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
             "cpu": [
                 "arm64"
             ],
@@ -6843,9 +6890,9 @@
             }
         },
         "node_modules/esbuild-linux-32": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz",
-            "integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
+            "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
             "cpu": [
                 "ia32"
             ],
@@ -6859,9 +6906,9 @@
             }
         },
         "node_modules/esbuild-linux-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz",
-            "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
+            "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
             "cpu": [
                 "x64"
             ],
@@ -6875,9 +6922,9 @@
             }
         },
         "node_modules/esbuild-linux-arm": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz",
-            "integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
+            "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
             "cpu": [
                 "arm"
             ],
@@ -6891,9 +6938,9 @@
             }
         },
         "node_modules/esbuild-linux-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz",
-            "integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
+            "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
             "cpu": [
                 "arm64"
             ],
@@ -6907,9 +6954,9 @@
             }
         },
         "node_modules/esbuild-linux-mips64le": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz",
-            "integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
+            "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
             "cpu": [
                 "mips64el"
             ],
@@ -6923,9 +6970,9 @@
             }
         },
         "node_modules/esbuild-linux-ppc64le": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz",
-            "integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
+            "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
             "cpu": [
                 "ppc64"
             ],
@@ -6939,9 +6986,9 @@
             }
         },
         "node_modules/esbuild-linux-riscv64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz",
-            "integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
+            "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
             "cpu": [
                 "riscv64"
             ],
@@ -6955,9 +7002,9 @@
             }
         },
         "node_modules/esbuild-linux-s390x": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz",
-            "integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
+            "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
             "cpu": [
                 "s390x"
             ],
@@ -6971,9 +7018,9 @@
             }
         },
         "node_modules/esbuild-netbsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz",
-            "integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
+            "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
             "cpu": [
                 "x64"
             ],
@@ -6987,9 +7034,9 @@
             }
         },
         "node_modules/esbuild-openbsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz",
-            "integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
+            "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
             "cpu": [
                 "x64"
             ],
@@ -7003,9 +7050,9 @@
             }
         },
         "node_modules/esbuild-sunos-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz",
-            "integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
+            "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
             "cpu": [
                 "x64"
             ],
@@ -7019,9 +7066,9 @@
             }
         },
         "node_modules/esbuild-windows-32": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz",
-            "integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
+            "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
             "cpu": [
                 "ia32"
             ],
@@ -7035,9 +7082,9 @@
             }
         },
         "node_modules/esbuild-windows-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz",
-            "integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+            "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
             "cpu": [
                 "x64"
             ],
@@ -7051,9 +7098,9 @@
             }
         },
         "node_modules/esbuild-windows-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz",
-            "integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
+            "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
             "cpu": [
                 "arm64"
             ],
@@ -7242,6 +7289,18 @@
                 "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
             }
         },
+        "node_modules/eslint-plugin-vue/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/eslint-plugin-vue/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -7257,6 +7316,12 @@
                 "node": ">=10"
             }
         },
+        "node_modules/eslint-plugin-vue/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/eslint-scope": {
             "version": "5.1.1",
             "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -7390,9 +7455,9 @@
             }
         },
         "node_modules/eslint/node_modules/globals": {
-            "version": "13.18.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
-            "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
+            "version": "13.19.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
+            "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -7855,9 +7920,9 @@
             }
         },
         "node_modules/fastq": {
-            "version": "1.13.0",
-            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-            "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+            "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
             "dev": true,
             "dependencies": {
                 "reusify": "^1.0.4"
@@ -8111,6 +8176,22 @@
                 "node": ">= 8"
             }
         },
+        "node_modules/fs-minipass/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/fs-minipass/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/fs.realpath": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -8436,6 +8517,17 @@
             "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
             "dev": true
         },
+        "node_modules/gopd": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+            "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+            "dependencies": {
+                "get-intrinsic": "^1.1.3"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -8570,6 +8662,24 @@
                 "node": ">=10"
             }
         },
+        "node_modules/hosted-git-info/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/hosted-git-info/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/html-encoding-sniffer": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
@@ -8634,9 +8744,9 @@
             }
         },
         "node_modules/http-graceful-shutdown": {
-            "version": "3.1.11",
-            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.11.tgz",
-            "integrity": "sha512-tfOwKDZA8kJqDNBK2ur+o55HbhDHoflvDCDgjbmm5eAn0RhqhdlUjVygj8e258B5nn5kNsEFOl7DbXLskKrgGA==",
+            "version": "3.1.12",
+            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.12.tgz",
+            "integrity": "sha512-z3mH1HUwRESrauPjvjH5QuH2Ce4uLlWonPFgZnwAyxIFYROxIMcNNWwNltN+s8fHF/aGlsfQDOICHLXsabK43w==",
             "dependencies": {
                 "debug": "^4.3.4"
             },
@@ -8741,9 +8851,9 @@
             ]
         },
         "node_modules/ignore": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-            "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+            "version": "5.2.4",
+            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+            "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
             "dev": true,
             "engines": {
                 "node": ">= 4"
@@ -8835,11 +8945,11 @@
             }
         },
         "node_modules/internal-slot": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-            "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
+            "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
             "dependencies": {
-                "get-intrinsic": "^1.1.0",
+                "get-intrinsic": "^1.1.3",
                 "has": "^1.0.3",
                 "side-channel": "^1.0.4"
             },
@@ -10824,6 +10934,18 @@
                 "node": ">=8"
             }
         },
+        "node_modules/jest-snapshot/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/jest-snapshot/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -10851,6 +10973,12 @@
                 "node": ">=8"
             }
         },
+        "node_modules/jest-snapshot/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/jest-util": {
             "version": "27.5.1",
             "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
@@ -11368,9 +11496,9 @@
             "devOptional": true
         },
         "node_modules/json5": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-            "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+            "version": "2.2.3",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+            "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
             "dev": true,
             "bin": {
                 "json5": "lib/cli.js"
@@ -11956,14 +12084,12 @@
             "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
         },
         "node_modules/lru-cache": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+            "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+            "dev": true,
             "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=10"
+                "yallist": "^3.0.2"
             }
         },
         "node_modules/magic-string": {
@@ -12198,9 +12324,9 @@
             }
         },
         "node_modules/minipass": {
-            "version": "3.3.4",
-            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
-            "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz",
+            "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==",
             "dependencies": {
                 "yallist": "^4.0.0"
             },
@@ -12208,6 +12334,11 @@
                 "node": ">=8"
             }
         },
+        "node_modules/minipass/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/minizlib": {
             "version": "2.1.2",
             "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
@@ -12220,6 +12351,22 @@
                 "node": ">= 8"
             }
         },
+        "node_modules/minizlib/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minizlib/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/mkdirp": {
             "version": "1.0.4",
             "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -12287,6 +12434,17 @@
                 "process-nextick-args": "^2.0.1"
             }
         },
+        "node_modules/mqtt/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/mqtt/node_modules/mqtt-packet": {
             "version": "6.10.0",
             "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz",
@@ -12297,6 +12455,11 @@
                 "process-nextick-args": "^2.0.1"
             }
         },
+        "node_modules/mqtt/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/ms": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -12347,6 +12510,22 @@
                 "node": ">= 8.0"
             }
         },
+        "node_modules/mysql2/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/mysql2/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/named-placeholders": {
             "version": "1.1.2",
             "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
@@ -12541,6 +12720,18 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/node-gyp/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "optional": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/node-gyp/node_modules/npmlog": {
             "version": "4.1.2",
             "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
@@ -12618,6 +12809,12 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/node-gyp/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "optional": true
+        },
         "node_modules/node-int64": {
             "version": "0.4.0",
             "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -12640,9 +12837,9 @@
             "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
         },
         "node_modules/node-releases": {
-            "version": "2.0.6",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
-            "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+            "version": "2.0.8",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz",
+            "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==",
             "dev": true
         },
         "node_modules/nodemailer": {
@@ -12682,6 +12879,18 @@
                 "node": ">=10"
             }
         },
+        "node_modules/normalize-package-data/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/normalize-package-data/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -12697,6 +12906,12 @@
                 "node": ">=10"
             }
         },
+        "node_modules/normalize-package-data/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/normalize-path": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -13280,9 +13495,9 @@
             }
         },
         "node_modules/postcss": {
-            "version": "8.4.19",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz",
-            "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==",
+            "version": "8.4.20",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
+            "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
             "dev": true,
             "funding": [
                 {
@@ -13368,9 +13583,9 @@
             }
         },
         "node_modules/postcss-scss": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.5.tgz",
-            "integrity": "sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==",
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz",
+            "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==",
             "dev": true,
             "funding": [
                 {
@@ -13386,7 +13601,7 @@
                 "node": ">=12.0"
             },
             "peerDependencies": {
-                "postcss": "^8.3.3"
+                "postcss": "^8.4.19"
             }
         },
         "node_modules/postcss-selector-parser": {
@@ -13983,9 +14198,9 @@
             }
         },
         "node_modules/redbean-node/node_modules/@types/node": {
-            "version": "14.18.33",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
-            "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg=="
+            "version": "14.18.36",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz",
+            "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ=="
         },
         "node_modules/redent": {
             "version": "3.0.0",
@@ -14352,12 +14567,13 @@
             }
         },
         "node_modules/rollup-plugin-visualizer": {
-            "version": "5.8.3",
-            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.3.tgz",
-            "integrity": "sha512-QGJk4Bqe4AOat5AjipOh8esZH1nck5X2KFpf4VytUdSUuuuSwvIQZjMGgjcxe/zXexltqaXp5Vx1V3LmnQH15Q==",
+            "version": "5.9.0",
+            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz",
+            "integrity": "sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==",
             "dev": true,
             "dependencies": {
                 "open": "^8.4.0",
+                "picomatch": "^2.3.1",
                 "source-map": "^0.7.4",
                 "yargs": "^17.5.1"
             },
@@ -14526,9 +14742,9 @@
             }
         },
         "node_modules/rxjs": {
-            "version": "7.5.7",
-            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
-            "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+            "version": "7.8.0",
+            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
+            "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
             "dev": true,
             "dependencies": {
                 "tslib": "^2.1.0"
@@ -14892,6 +15108,7 @@
             "version": "1.4.8",
             "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
             "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+            "deprecated": "Please use @jridgewell/sourcemap-codec instead",
             "dev": true
         },
         "node_modules/spawn-command": {
@@ -15368,9 +15585,9 @@
             }
         },
         "node_modules/table/node_modules/ajv": {
-            "version": "8.11.2",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz",
-            "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==",
+            "version": "8.12.0",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+            "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
             "dev": true,
             "dependencies": {
                 "fast-deep-equal": "^3.1.1",
@@ -15440,13 +15657,13 @@
             }
         },
         "node_modules/tar": {
-            "version": "6.1.12",
-            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz",
-            "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==",
+            "version": "6.1.13",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
+            "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
             "dependencies": {
                 "chownr": "^2.0.0",
                 "fs-minipass": "^2.0.0",
-                "minipass": "^3.0.0",
+                "minipass": "^4.0.0",
                 "minizlib": "^2.1.1",
                 "mkdirp": "^1.0.3",
                 "yallist": "^4.0.0"
@@ -15455,6 +15672,11 @@
                 "node": ">=10"
             }
         },
+        "node_modules/tar/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/tarn": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
@@ -15601,9 +15823,9 @@
             }
         },
         "node_modules/throat": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
-            "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+            "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
             "dev": true
         },
         "node_modules/throttleit": {
@@ -16356,6 +16578,18 @@
                 "node": ">=4.0"
             }
         },
+        "node_modules/vue-eslint-parser/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/vue-eslint-parser/node_modules/semver": {
             "version": "7.3.8",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -16371,6 +16605,12 @@
                 "node": ">=10"
             }
         },
+        "node_modules/vue-eslint-parser/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
         "node_modules/vue-i18n": {
             "version": "9.2.2",
             "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz",
@@ -16849,9 +17089,10 @@
             }
         },
         "node_modules/yallist": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+            "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+            "dev": true
         },
         "node_modules/yaml": {
             "version": "1.10.2",
@@ -17135,17 +17376,17 @@
             }
         },
         "@azure/msal-browser": {
-            "version": "2.32.0",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.0.tgz",
-            "integrity": "sha512-uDP0vNmIefM6+RjILGKu+zOiN+VGnEvxRfUIV5hOWOWLLkG7kcDPYG/v/EJMoG+R5DYW9jXA5nvZT76t5HdEAQ==",
+            "version": "2.32.1",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.1.tgz",
+            "integrity": "sha512-2G3B12ZEIpiimi6/Yqq7KLk4ud1zZWoHvVd2kJ2VthN1HjMsZjdMUxeHkwMWaQ6RzO6mv9rZiuKmRX64xkXW9g==",
             "requires": {
-                "@azure/msal-common": "^9.0.0"
+                "@azure/msal-common": "^9.0.1"
             },
             "dependencies": {
                 "@azure/msal-common": {
-                    "version": "9.0.0",
-                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
-                    "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg=="
+                    "version": "9.0.1",
+                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.1.tgz",
+                    "integrity": "sha512-eNNHIW/cwPTZDWs9KtYgb1X6gtQ+cC+FGX2YN+t4AUVsBdUbqlMTnUs6/c/VBxC2AAGIhgLREuNnO3F66AN2zQ=="
                 }
             }
         },
@@ -17155,19 +17396,19 @@
             "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q=="
         },
         "@azure/msal-node": {
-            "version": "1.14.4",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.4.tgz",
-            "integrity": "sha512-j9GzZu5mTLWtuJ+cYN6e67UNymIS5OysblrOzH8lakt9XxH0GCPYjuqbOEKTP84r+Rbj3io+TuW1KS+0Xxuj/g==",
+            "version": "1.14.5",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.5.tgz",
+            "integrity": "sha512-NcVdMfn8Z3ogN+9RjOSF7uwf2Gki5DEJl0BdDSL83KUAgVAobtkZi5W8EqxbJLrTO/ET0jv5DregrcR5qg2pEA==",
             "requires": {
-                "@azure/msal-common": "^9.0.0",
+                "@azure/msal-common": "^9.0.1",
                 "jsonwebtoken": "^8.5.1",
                 "uuid": "^8.3.0"
             },
             "dependencies": {
                 "@azure/msal-common": {
-                    "version": "9.0.0",
-                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.0.tgz",
-                    "integrity": "sha512-uiFiFKVNTsRpmKio5bcObTuHcaHHZB2GEsjJJN8rbJNmzoYuZzNioOoK+J0QK0jEasRBgAoR5A8hSty2iKRzIg=="
+                    "version": "9.0.1",
+                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.1.tgz",
+                    "integrity": "sha512-eNNHIW/cwPTZDWs9KtYgb1X6gtQ+cC+FGX2YN+t4AUVsBdUbqlMTnUs6/c/VBxC2AAGIhgLREuNnO3F66AN2zQ=="
                 }
             }
         },
@@ -17181,27 +17422,27 @@
             }
         },
         "@babel/compat-data": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
-            "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
+            "version": "7.20.10",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz",
+            "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==",
             "dev": true
         },
         "@babel/core": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz",
-            "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz",
+            "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==",
             "dev": true,
             "requires": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.20.2",
-                "@babel/helper-compilation-targets": "^7.20.0",
-                "@babel/helper-module-transforms": "^7.20.2",
-                "@babel/helpers": "^7.20.1",
-                "@babel/parser": "^7.20.2",
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.2",
+                "@babel/generator": "^7.20.7",
+                "@babel/helper-compilation-targets": "^7.20.7",
+                "@babel/helper-module-transforms": "^7.20.7",
+                "@babel/helpers": "^7.20.7",
+                "@babel/parser": "^7.20.7",
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.7",
+                "@babel/types": "^7.20.7",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -17221,12 +17462,12 @@
             }
         },
         "@babel/generator": {
-            "version": "7.20.4",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz",
-            "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
+            "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.20.2",
+                "@babel/types": "^7.20.7",
                 "@jridgewell/gen-mapping": "^0.3.2",
                 "jsesc": "^2.5.1"
             },
@@ -17259,40 +17500,41 @@
             }
         },
         "@babel/helper-compilation-targets": {
-            "version": "7.20.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
-            "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+            "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.20.0",
+                "@babel/compat-data": "^7.20.5",
                 "@babel/helper-validator-option": "^7.18.6",
                 "browserslist": "^4.21.3",
+                "lru-cache": "^5.1.1",
                 "semver": "^6.3.0"
             }
         },
         "@babel/helper-create-class-features-plugin": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz",
-            "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz",
+            "integrity": "sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
-                "@babel/helper-member-expression-to-functions": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/helper-replace-supers": "^7.19.1",
+                "@babel/helper-replace-supers": "^7.20.7",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             }
         },
         "@babel/helper-create-regexp-features-plugin": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz",
-            "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz",
+            "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "regexpu-core": "^5.1.0"
+                "regexpu-core": "^5.2.1"
             }
         },
         "@babel/helper-define-polyfill-provider": {
@@ -17344,12 +17586,12 @@
             }
         },
         "@babel/helper-member-expression-to-functions": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz",
-            "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz",
+            "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.18.9"
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/helper-module-imports": {
@@ -17362,9 +17604,9 @@
             }
         },
         "@babel/helper-module-transforms": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
-            "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+            "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
             "dev": true,
             "requires": {
                 "@babel/helper-environment-visitor": "^7.18.9",
@@ -17372,9 +17614,9 @@
                 "@babel/helper-simple-access": "^7.20.2",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "@babel/helper-validator-identifier": "^7.19.1",
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.2"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.10",
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/helper-optimise-call-expression": {
@@ -17405,16 +17647,17 @@
             }
         },
         "@babel/helper-replace-supers": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz",
-            "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz",
+            "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==",
             "dev": true,
             "requires": {
                 "@babel/helper-environment-visitor": "^7.18.9",
-                "@babel/helper-member-expression-to-functions": "^7.18.9",
+                "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
-                "@babel/traverse": "^7.19.1",
-                "@babel/types": "^7.19.0"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.7",
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/helper-simple-access": {
@@ -17463,26 +17706,26 @@
             "dev": true
         },
         "@babel/helper-wrap-function": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz",
-            "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+            "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
             "dev": true,
             "requires": {
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.19.0",
-                "@babel/types": "^7.19.0"
+                "@babel/traverse": "^7.20.5",
+                "@babel/types": "^7.20.5"
             }
         },
         "@babel/helpers": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
-            "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
+            "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
             "dev": true,
             "requires": {
-                "@babel/template": "^7.18.10",
-                "@babel/traverse": "^7.20.1",
-                "@babel/types": "^7.20.0"
+                "@babel/template": "^7.20.7",
+                "@babel/traverse": "^7.20.7",
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/highlight": {
@@ -17497,9 +17740,9 @@
             }
         },
         "@babel/parser": {
-            "version": "7.20.3",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
-            "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
+            "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
             "dev": true
         },
         "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
@@ -17512,24 +17755,24 @@
             }
         },
         "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz",
-            "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz",
+            "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.9",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
-                "@babel/plugin-proposal-optional-chaining": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+                "@babel/plugin-proposal-optional-chaining": "^7.20.7"
             }
         },
         "@babel/plugin-proposal-async-generator-functions": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz",
-            "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
+            "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
             "dev": true,
             "requires": {
                 "@babel/helper-environment-visitor": "^7.18.9",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-remap-async-to-generator": "^7.18.9",
                 "@babel/plugin-syntax-async-generators": "^7.8.4"
             }
@@ -17545,13 +17788,13 @@
             }
         },
         "@babel/plugin-proposal-class-static-block": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz",
-            "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz",
+            "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-create-class-features-plugin": "^7.20.7",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-class-static-block": "^7.14.5"
             }
         },
@@ -17586,12 +17829,12 @@
             }
         },
         "@babel/plugin-proposal-logical-assignment-operators": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz",
-            "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
+            "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
             }
         },
@@ -17616,16 +17859,16 @@
             }
         },
         "@babel/plugin-proposal-object-rest-spread": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz",
-            "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+            "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
             "dev": true,
             "requires": {
-                "@babel/compat-data": "^7.20.1",
-                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/compat-data": "^7.20.5",
+                "@babel/helper-compilation-targets": "^7.20.7",
                 "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.20.1"
+                "@babel/plugin-transform-parameters": "^7.20.7"
             }
         },
         "@babel/plugin-proposal-optional-catch-binding": {
@@ -17639,13 +17882,13 @@
             }
         },
         "@babel/plugin-proposal-optional-chaining": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz",
-            "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz",
+            "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.9",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
                 "@babel/plugin-syntax-optional-chaining": "^7.8.3"
             }
         },
@@ -17660,14 +17903,14 @@
             }
         },
         "@babel/plugin-proposal-private-property-in-object": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz",
-            "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz",
+            "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-create-class-features-plugin": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
+                "@babel/helper-create-class-features-plugin": "^7.20.5",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
             }
         },
@@ -17844,23 +18087,23 @@
             }
         },
         "@babel/plugin-transform-arrow-functions": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz",
-            "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz",
+            "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-async-to-generator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz",
-            "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
+            "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
             "dev": true,
             "requires": {
                 "@babel/helper-module-imports": "^7.18.6",
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "@babel/helper-remap-async-to-generator": "^7.18.6"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-remap-async-to-generator": "^7.18.9"
             }
         },
         "@babel/plugin-transform-block-scoped-functions": {
@@ -17873,44 +18116,45 @@
             }
         },
         "@babel/plugin-transform-block-scoping": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz",
-            "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz",
+            "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==",
             "dev": true,
             "requires": {
                 "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-classes": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz",
-            "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz",
+            "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
-                "@babel/helper-compilation-targets": "^7.20.0",
+                "@babel/helper-compilation-targets": "^7.20.7",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
                 "@babel/helper-plugin-utils": "^7.20.2",
-                "@babel/helper-replace-supers": "^7.19.1",
+                "@babel/helper-replace-supers": "^7.20.7",
                 "@babel/helper-split-export-declaration": "^7.18.6",
                 "globals": "^11.1.0"
             }
         },
         "@babel/plugin-transform-computed-properties": {
-            "version": "7.18.9",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz",
-            "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz",
+            "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/template": "^7.20.7"
             }
         },
         "@babel/plugin-transform-destructuring": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz",
-            "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz",
+            "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==",
             "dev": true,
             "requires": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -17984,35 +18228,35 @@
             }
         },
         "@babel/plugin-transform-modules-amd": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz",
-            "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+            "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
             "dev": true,
             "requires": {
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-modules-commonjs": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz",
-            "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz",
+            "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==",
             "dev": true,
             "requires": {
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-simple-access": "^7.19.4"
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-simple-access": "^7.20.2"
             }
         },
         "@babel/plugin-transform-modules-systemjs": {
-            "version": "7.19.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz",
-            "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz",
+            "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==",
             "dev": true,
             "requires": {
                 "@babel/helper-hoist-variables": "^7.18.6",
-                "@babel/helper-module-transforms": "^7.19.6",
-                "@babel/helper-plugin-utils": "^7.19.0",
+                "@babel/helper-module-transforms": "^7.20.11",
+                "@babel/helper-plugin-utils": "^7.20.2",
                 "@babel/helper-validator-identifier": "^7.19.1"
             }
         },
@@ -18027,13 +18271,13 @@
             }
         },
         "@babel/plugin-transform-named-capturing-groups-regex": {
-            "version": "7.19.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz",
-            "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz",
+            "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==",
             "dev": true,
             "requires": {
-                "@babel/helper-create-regexp-features-plugin": "^7.19.0",
-                "@babel/helper-plugin-utils": "^7.19.0"
+                "@babel/helper-create-regexp-features-plugin": "^7.20.5",
+                "@babel/helper-plugin-utils": "^7.20.2"
             }
         },
         "@babel/plugin-transform-new-target": {
@@ -18056,9 +18300,9 @@
             }
         },
         "@babel/plugin-transform-parameters": {
-            "version": "7.20.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz",
-            "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz",
+            "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==",
             "dev": true,
             "requires": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -18074,13 +18318,13 @@
             }
         },
         "@babel/plugin-transform-regenerator": {
-            "version": "7.18.6",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz",
-            "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==",
+            "version": "7.20.5",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz",
+            "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.18.6",
-                "regenerator-transform": "^0.15.0"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "regenerator-transform": "^0.15.1"
             }
         },
         "@babel/plugin-transform-reserved-words": {
@@ -18102,13 +18346,13 @@
             }
         },
         "@babel/plugin-transform-spread": {
-            "version": "7.19.0",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz",
-            "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+            "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
             "dev": true,
             "requires": {
-                "@babel/helper-plugin-utils": "^7.19.0",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9"
+                "@babel/helper-plugin-utils": "^7.20.2",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
             }
         },
         "@babel/plugin-transform-sticky-regex": {
@@ -18254,52 +18498,52 @@
             }
         },
         "@babel/runtime": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz",
-            "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
+            "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
             "requires": {
-                "regenerator-runtime": "^0.13.10"
+                "regenerator-runtime": "^0.13.11"
             }
         },
         "@babel/standalone": {
-            "version": "7.20.4",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.4.tgz",
-            "integrity": "sha512-27bv4h47jbaFZ7+e7gT1VEo9PNL1ynxqUX6/BERLz1qxm/5gzpbcHX+47VnSeYHyEyGZkRznpSOd8zPBhiz6tw==",
+            "version": "7.20.11",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.11.tgz",
+            "integrity": "sha512-WUPlwwXFk3iViGE7QFVVp423eVtT+eoXu1940Xu4QJgqgHBF6WWtlwO1Ip5rIWQnp7OHrGdwrwKLtLhUVfOZbA==",
             "dev": true
         },
         "@babel/template": {
-            "version": "7.18.10",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
-            "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+            "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/parser": "^7.18.10",
-                "@babel/types": "^7.18.10"
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7"
             }
         },
         "@babel/traverse": {
-            "version": "7.20.1",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
-            "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
+            "version": "7.20.10",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz",
+            "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.18.6",
-                "@babel/generator": "^7.20.1",
+                "@babel/generator": "^7.20.7",
                 "@babel/helper-environment-visitor": "^7.18.9",
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.20.1",
-                "@babel/types": "^7.20.0",
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             }
         },
         "@babel/types": {
-            "version": "7.20.2",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
-            "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
+            "version": "7.20.7",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
+            "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
             "dev": true,
             "requires": {
                 "@babel/helper-string-parser": "^7.19.4",
@@ -18386,29 +18630,29 @@
             }
         },
         "@esbuild/android-arm": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz",
-            "integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
+            "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
             "dev": true,
             "optional": true
         },
         "@esbuild/linux-loong64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz",
-            "integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
+            "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
             "dev": true,
             "optional": true
         },
         "@eslint/eslintrc": {
-            "version": "1.3.3",
-            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
-            "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+            "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
             "dev": true,
             "requires": {
                 "ajv": "^6.12.4",
                 "debug": "^4.3.2",
                 "espree": "^9.4.0",
-                "globals": "^13.15.0",
+                "globals": "^13.19.0",
                 "ignore": "^5.2.0",
                 "import-fresh": "^3.2.1",
                 "js-yaml": "^4.1.0",
@@ -18417,9 +18661,9 @@
             },
             "dependencies": {
                 "globals": {
-                    "version": "13.18.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
-                    "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
+                    "version": "13.19.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
+                    "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -18482,9 +18726,9 @@
             }
         },
         "@grpc/proto-loader": {
-            "version": "0.7.3",
-            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz",
-            "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==",
+            "version": "0.7.4",
+            "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.4.tgz",
+            "integrity": "sha512-MnWjkGwqQ3W8fx94/c1CwqLsNmHHv2t0CFn+9++6+cDphC1lolpg9M2OU0iebIjK//pBNX9e94ho+gjx6vz39w==",
             "requires": {
                 "@types/long": "^4.0.1",
                 "lodash.camelcase": "^4.3.0",
@@ -19120,9 +19364,9 @@
             }
         },
         "@js-joda/core": {
-            "version": "5.4.2",
-            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.4.2.tgz",
-            "integrity": "sha512-QIDIZ9a0NfDStgD47VaTgwiPjlw1p4QPLwjOB/9+/DqIztoQopPNNAd+HdtQMHgE+ibP3dJacd8/TVL/A1RaaA=="
+            "version": "5.5.1",
+            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.1.tgz",
+            "integrity": "sha512-oTFmkyv5MhgkHdZhoe5lwRoKW0t4njPvK3g7ODvK/prkoC5bwylKcyQJMsmjvgHBXoy4u5iLnB5yQ7AljouHAA=="
         },
         "@louislam/sqlite3": {
             "version": "15.1.2",
@@ -19151,6 +19395,14 @@
                 "tar": "^6.1.11"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -19158,6 +19410,11 @@
                     "requires": {
                         "lru-cache": "^6.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
                 }
             }
         },
@@ -19362,9 +19619,9 @@
             }
         },
         "@sideway/formula": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
-            "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+            "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
             "dev": true
         },
         "@sideway/pinpoint": {
@@ -19374,9 +19631,9 @@
             "dev": true
         },
         "@sinonjs/commons": {
-            "version": "1.8.5",
-            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz",
-            "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==",
+            "version": "1.8.6",
+            "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+            "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
             "dev": true,
             "requires": {
                 "type-detect": "4.0.8"
@@ -19447,9 +19704,9 @@
             }
         },
         "@types/babel__traverse": {
-            "version": "7.18.2",
-            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
-            "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
+            "version": "7.18.3",
+            "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
+            "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
             "dev": true,
             "requires": {
                 "@babel/types": "^7.3.0"
@@ -19503,9 +19760,12 @@
             }
         },
         "@types/cors": {
-            "version": "2.8.12",
-            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
-            "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
+            "version": "2.8.13",
+            "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
+            "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
+            "requires": {
+                "@types/node": "*"
+            }
         },
         "@types/es-aggregate-error": {
             "version": "1.0.2",
@@ -19516,20 +19776,20 @@
             }
         },
         "@types/express": {
-            "version": "4.17.14",
-            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz",
-            "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==",
+            "version": "4.17.15",
+            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz",
+            "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==",
             "requires": {
                 "@types/body-parser": "*",
-                "@types/express-serve-static-core": "^4.17.18",
+                "@types/express-serve-static-core": "^4.17.31",
                 "@types/qs": "*",
                 "@types/serve-static": "*"
             }
         },
         "@types/express-serve-static-core": {
-            "version": "4.17.31",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz",
-            "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==",
+            "version": "4.17.32",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz",
+            "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==",
             "requires": {
                 "@types/node": "*",
                 "@types/qs": "*",
@@ -19608,9 +19868,9 @@
             }
         },
         "@types/lodash": {
-            "version": "4.14.190",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz",
-            "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw=="
+            "version": "4.14.191",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+            "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
         },
         "@types/long": {
             "version": "4.0.2",
@@ -19629,9 +19889,9 @@
             "dev": true
         },
         "@types/node": {
-            "version": "18.11.9",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz",
-            "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg=="
+            "version": "18.11.18",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
+            "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
         },
         "@types/normalize-package-data": {
             "version": "2.4.1",
@@ -19646,9 +19906,9 @@
             "dev": true
         },
         "@types/prettier": {
-            "version": "2.7.1",
-            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
-            "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
+            "version": "2.7.2",
+            "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
+            "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
             "dev": true
         },
         "@types/qs": {
@@ -19689,9 +19949,9 @@
             "dev": true
         },
         "@types/yargs": {
-            "version": "16.0.4",
-            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
-            "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+            "version": "16.0.5",
+            "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz",
+            "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==",
             "dev": true,
             "requires": {
                 "@types/yargs-parser": "*"
@@ -20757,9 +21017,9 @@
             }
         },
         "caniuse-lite": {
-            "version": "1.0.30001434",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
-            "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==",
+            "version": "1.0.30001441",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
+            "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==",
             "dev": true
         },
         "caseless": {
@@ -20886,9 +21146,9 @@
             "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
         },
         "ci-info": {
-            "version": "3.7.0",
-            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz",
-            "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==",
+            "version": "3.7.1",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz",
+            "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==",
             "dev": true
         },
         "cjs-module-lexer": {
@@ -21268,9 +21528,9 @@
             "dev": true
         },
         "core-js-compat": {
-            "version": "3.26.1",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz",
-            "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==",
+            "version": "3.27.1",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz",
+            "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==",
             "dev": true,
             "requires": {
                 "browserslist": "^4.21.4"
@@ -21473,9 +21733,9 @@
             },
             "dependencies": {
                 "@types/node": {
-                    "version": "14.18.33",
-                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
-                    "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==",
+                    "version": "14.18.36",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz",
+                    "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==",
                     "dev": true
                 },
                 "ansi-styles": {
@@ -21529,6 +21789,15 @@
                     "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
                     "dev": true
                 },
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -21546,6 +21815,12 @@
                     "requires": {
                         "has-flag": "^4.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -21576,9 +21851,9 @@
             "dev": true
         },
         "dayjs": {
-            "version": "1.11.6",
-            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz",
-            "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ=="
+            "version": "1.11.7",
+            "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+            "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
         },
         "debug": {
             "version": "4.3.4",
@@ -21620,9 +21895,9 @@
             }
         },
         "decimal.js": {
-            "version": "10.4.2",
-            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz",
-            "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==",
+            "version": "10.4.3",
+            "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+            "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
             "dev": true
         },
         "dedent": {
@@ -21944,9 +22219,9 @@
             }
         },
         "es-abstract": {
-            "version": "1.20.4",
-            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
-            "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
+            "version": "1.20.5",
+            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
+            "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
             "requires": {
                 "call-bind": "^1.0.2",
                 "es-to-primitive": "^1.2.1",
@@ -21954,6 +22229,7 @@
                 "function.prototype.name": "^1.1.5",
                 "get-intrinsic": "^1.1.3",
                 "get-symbol-description": "^1.0.0",
+                "gopd": "^1.0.1",
                 "has": "^1.0.3",
                 "has-property-descriptors": "^1.0.0",
                 "has-symbols": "^1.0.3",
@@ -21969,8 +22245,8 @@
                 "object.assign": "^4.1.4",
                 "regexp.prototype.flags": "^1.4.3",
                 "safe-regex-test": "^1.0.0",
-                "string.prototype.trimend": "^1.0.5",
-                "string.prototype.trimstart": "^1.0.5",
+                "string.prototype.trimend": "^1.0.6",
+                "string.prototype.trimstart": "^1.0.6",
                 "unbox-primitive": "^1.0.2"
             }
         },
@@ -21999,172 +22275,172 @@
             }
         },
         "esbuild": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
-            "integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+            "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
             "dev": true,
             "requires": {
-                "@esbuild/android-arm": "0.15.15",
-                "@esbuild/linux-loong64": "0.15.15",
-                "esbuild-android-64": "0.15.15",
-                "esbuild-android-arm64": "0.15.15",
-                "esbuild-darwin-64": "0.15.15",
-                "esbuild-darwin-arm64": "0.15.15",
-                "esbuild-freebsd-64": "0.15.15",
-                "esbuild-freebsd-arm64": "0.15.15",
-                "esbuild-linux-32": "0.15.15",
-                "esbuild-linux-64": "0.15.15",
-                "esbuild-linux-arm": "0.15.15",
-                "esbuild-linux-arm64": "0.15.15",
-                "esbuild-linux-mips64le": "0.15.15",
-                "esbuild-linux-ppc64le": "0.15.15",
-                "esbuild-linux-riscv64": "0.15.15",
-                "esbuild-linux-s390x": "0.15.15",
-                "esbuild-netbsd-64": "0.15.15",
-                "esbuild-openbsd-64": "0.15.15",
-                "esbuild-sunos-64": "0.15.15",
-                "esbuild-windows-32": "0.15.15",
-                "esbuild-windows-64": "0.15.15",
-                "esbuild-windows-arm64": "0.15.15"
+                "@esbuild/android-arm": "0.15.18",
+                "@esbuild/linux-loong64": "0.15.18",
+                "esbuild-android-64": "0.15.18",
+                "esbuild-android-arm64": "0.15.18",
+                "esbuild-darwin-64": "0.15.18",
+                "esbuild-darwin-arm64": "0.15.18",
+                "esbuild-freebsd-64": "0.15.18",
+                "esbuild-freebsd-arm64": "0.15.18",
+                "esbuild-linux-32": "0.15.18",
+                "esbuild-linux-64": "0.15.18",
+                "esbuild-linux-arm": "0.15.18",
+                "esbuild-linux-arm64": "0.15.18",
+                "esbuild-linux-mips64le": "0.15.18",
+                "esbuild-linux-ppc64le": "0.15.18",
+                "esbuild-linux-riscv64": "0.15.18",
+                "esbuild-linux-s390x": "0.15.18",
+                "esbuild-netbsd-64": "0.15.18",
+                "esbuild-openbsd-64": "0.15.18",
+                "esbuild-sunos-64": "0.15.18",
+                "esbuild-windows-32": "0.15.18",
+                "esbuild-windows-64": "0.15.18",
+                "esbuild-windows-arm64": "0.15.18"
             }
         },
         "esbuild-android-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz",
-            "integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
+            "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
             "dev": true,
             "optional": true
         },
         "esbuild-android-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz",
-            "integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
+            "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-darwin-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz",
-            "integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
+            "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
             "dev": true,
             "optional": true
         },
         "esbuild-darwin-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz",
-            "integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
+            "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
             "dev": true,
             "optional": true
         },
         "esbuild-freebsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz",
-            "integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
+            "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
             "dev": true,
             "optional": true
         },
         "esbuild-freebsd-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz",
-            "integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
+            "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-32": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz",
-            "integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
+            "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz",
-            "integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
+            "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-arm": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz",
-            "integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
+            "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz",
-            "integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
+            "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-mips64le": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz",
-            "integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
+            "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-ppc64le": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz",
-            "integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
+            "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-riscv64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz",
-            "integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
+            "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
             "dev": true,
             "optional": true
         },
         "esbuild-linux-s390x": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz",
-            "integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
+            "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-netbsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz",
-            "integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
+            "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
             "dev": true,
             "optional": true
         },
         "esbuild-openbsd-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz",
-            "integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
+            "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-sunos-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz",
-            "integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
+            "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-32": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz",
-            "integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
+            "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz",
-            "integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+            "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
             "dev": true,
             "optional": true
         },
         "esbuild-windows-arm64": {
-            "version": "0.15.15",
-            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz",
-            "integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==",
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
+            "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
             "dev": true,
             "optional": true
         },
@@ -22350,9 +22626,9 @@
                     "dev": true
                 },
                 "globals": {
-                    "version": "13.18.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
-                    "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
+                    "version": "13.19.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
+                    "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -22395,6 +22671,15 @@
                 "vue-eslint-parser": "^8.0.1"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -22403,6 +22688,12 @@
                     "requires": {
                         "lru-cache": "^6.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -22752,9 +23043,9 @@
             }
         },
         "fastq": {
-            "version": "1.13.0",
-            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-            "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+            "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
             "dev": true,
             "requires": {
                 "reusify": "^1.0.4"
@@ -22957,6 +23248,21 @@
             "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
             "requires": {
                 "minipass": "^3.0.0"
+            },
+            "dependencies": {
+                "minipass": {
+                    "version": "3.3.6",
+                    "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                    "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
             }
         },
         "fs.realpath": {
@@ -23198,6 +23504,14 @@
             "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
             "dev": true
         },
+        "gopd": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+            "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+            "requires": {
+                "get-intrinsic": "^1.1.3"
+            }
+        },
         "graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -23292,6 +23606,23 @@
             "dev": true,
             "requires": {
                 "lru-cache": "^6.0.0"
+            },
+            "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
+                }
             }
         },
         "html-encoding-sniffer": {
@@ -23339,9 +23670,9 @@
             }
         },
         "http-graceful-shutdown": {
-            "version": "3.1.11",
-            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.11.tgz",
-            "integrity": "sha512-tfOwKDZA8kJqDNBK2ur+o55HbhDHoflvDCDgjbmm5eAn0RhqhdlUjVygj8e258B5nn5kNsEFOl7DbXLskKrgGA==",
+            "version": "3.1.12",
+            "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.12.tgz",
+            "integrity": "sha512-z3mH1HUwRESrauPjvjH5QuH2Ce4uLlWonPFgZnwAyxIFYROxIMcNNWwNltN+s8fHF/aGlsfQDOICHLXsabK43w==",
             "requires": {
                 "debug": "^4.3.4"
             }
@@ -23414,9 +23745,9 @@
             "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
         },
         "ignore": {
-            "version": "5.2.0",
-            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-            "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+            "version": "5.2.4",
+            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+            "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
             "dev": true
         },
         "import-fresh": {
@@ -23478,11 +23809,11 @@
             "dev": true
         },
         "internal-slot": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
-            "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
+            "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
             "requires": {
-                "get-intrinsic": "^1.1.0",
+                "get-intrinsic": "^1.1.3",
                 "has": "^1.0.3",
                 "side-channel": "^1.0.4"
             }
@@ -24930,6 +25261,15 @@
                     "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
                     "dev": true
                 },
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -24947,6 +25287,12 @@
                     "requires": {
                         "has-flag": "^4.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -25351,9 +25697,9 @@
             "devOptional": true
         },
         "json5": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-            "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+            "version": "2.2.3",
+            "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+            "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
             "dev": true
         },
         "jsonfile": {
@@ -25809,11 +26155,12 @@
             "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
         },
         "lru-cache": {
-            "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+            "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+            "dev": true,
             "requires": {
-                "yallist": "^4.0.0"
+                "yallist": "^3.0.2"
             }
         },
         "magic-string": {
@@ -25980,11 +26327,18 @@
             }
         },
         "minipass": {
-            "version": "3.3.4",
-            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
-            "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz",
+            "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==",
             "requires": {
                 "yallist": "^4.0.0"
+            },
+            "dependencies": {
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
             }
         },
         "minizlib": {
@@ -25994,6 +26348,21 @@
             "requires": {
                 "minipass": "^3.0.0",
                 "yallist": "^4.0.0"
+            },
+            "dependencies": {
+                "minipass": {
+                    "version": "3.3.6",
+                    "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                    "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
             }
         },
         "mkdirp": {
@@ -26035,6 +26404,14 @@
                 "xtend": "^4.0.2"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "mqtt-packet": {
                     "version": "6.10.0",
                     "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz",
@@ -26044,6 +26421,11 @@
                         "debug": "^4.1.1",
                         "process-nextick-args": "^2.0.1"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
                 }
             }
         },
@@ -26096,6 +26478,21 @@
                 "named-placeholders": "^1.1.2",
                 "seq-queue": "^0.0.5",
                 "sqlstring": "^2.3.2"
+            },
+            "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
             }
         },
         "named-placeholders": {
@@ -26261,6 +26658,15 @@
                         "number-is-nan": "^1.0.0"
                     }
                 },
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "optional": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "npmlog": {
                     "version": "4.1.2",
                     "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
@@ -26325,6 +26731,12 @@
                     "requires": {
                         "ansi-regex": "^2.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "optional": true
                 }
             }
         },
@@ -26350,9 +26762,9 @@
             "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
         },
         "node-releases": {
-            "version": "2.0.6",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
-            "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+            "version": "2.0.8",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz",
+            "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==",
             "dev": true
         },
         "nodemailer": {
@@ -26380,6 +26792,15 @@
                 "validate-npm-package-license": "^3.0.1"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -26388,6 +26809,12 @@
                     "requires": {
                         "lru-cache": "^6.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -26812,9 +27239,9 @@
             "dev": true
         },
         "postcss": {
-            "version": "8.4.19",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz",
-            "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==",
+            "version": "8.4.20",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
+            "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
             "dev": true,
             "requires": {
                 "nanoid": "^3.3.4",
@@ -26870,9 +27297,9 @@
             "dev": true
         },
         "postcss-scss": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.5.tgz",
-            "integrity": "sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==",
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz",
+            "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==",
             "dev": true
         },
         "postcss-selector-parser": {
@@ -27339,9 +27766,9 @@
             },
             "dependencies": {
                 "@types/node": {
-                    "version": "14.18.33",
-                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
-                    "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg=="
+                    "version": "14.18.36",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz",
+                    "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ=="
                 }
             }
         },
@@ -27628,12 +28055,13 @@
             }
         },
         "rollup-plugin-visualizer": {
-            "version": "5.8.3",
-            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.3.tgz",
-            "integrity": "sha512-QGJk4Bqe4AOat5AjipOh8esZH1nck5X2KFpf4VytUdSUuuuSwvIQZjMGgjcxe/zXexltqaXp5Vx1V3LmnQH15Q==",
+            "version": "5.9.0",
+            "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz",
+            "integrity": "sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==",
             "dev": true,
             "requires": {
                 "open": "^8.4.0",
+                "picomatch": "^2.3.1",
                 "source-map": "^0.7.4",
                 "yargs": "^17.5.1"
             },
@@ -27739,9 +28167,9 @@
             }
         },
         "rxjs": {
-            "version": "7.5.7",
-            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
-            "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
+            "version": "7.8.0",
+            "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
+            "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
             "dev": true,
             "requires": {
                 "tslib": "^2.1.0"
@@ -28407,9 +28835,9 @@
             },
             "dependencies": {
                 "ajv": {
-                    "version": "8.11.2",
-                    "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz",
-                    "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==",
+                    "version": "8.12.0",
+                    "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+                    "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
                     "dev": true,
                     "requires": {
                         "fast-deep-equal": "^3.1.1",
@@ -28462,16 +28890,23 @@
             }
         },
         "tar": {
-            "version": "6.1.12",
-            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz",
-            "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==",
+            "version": "6.1.13",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
+            "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
             "requires": {
                 "chownr": "^2.0.0",
                 "fs-minipass": "^2.0.0",
-                "minipass": "^3.0.0",
+                "minipass": "^4.0.0",
                 "minizlib": "^2.1.1",
                 "mkdirp": "^1.0.3",
                 "yallist": "^4.0.0"
+            },
+            "dependencies": {
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
             }
         },
         "tarn": {
@@ -28586,9 +29021,9 @@
             "integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA=="
         },
         "throat": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz",
-            "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==",
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+            "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
             "dev": true
         },
         "throttleit": {
@@ -29204,6 +29639,15 @@
                     "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
                     "dev": true
                 },
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "dev": true,
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
                     "version": "7.3.8",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -29212,6 +29656,12 @@
                     "requires": {
                         "lru-cache": "^6.0.0"
                     }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                    "dev": true
                 }
             }
         },
@@ -29513,9 +29963,10 @@
             "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
         },
         "yallist": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+            "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+            "dev": true
         },
         "yaml": {
             "version": "1.10.2",

From 4bf23fdd1a93d1796bdb8e3e4ca07f0693b1e511 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 4 Jan 2023 15:55:36 +0800
Subject: [PATCH 381/803] Update jsonwebtoken from ~8 to ~9

---
 package-lock.json | 141 +++++++++++++++++++++++++++++++++++-----------
 package.json      |   2 +-
 2 files changed, 110 insertions(+), 33 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b4a7b755..1caf5095 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -35,7 +35,7 @@
                 "https-proxy-agent": "~5.0.1",
                 "iconv-lite": "~0.6.3",
                 "jsesc": "~3.0.2",
-                "jsonwebtoken": "~8.5.1",
+                "jsonwebtoken": "~9.0.0",
                 "jwt-decode": "~3.1.2",
                 "limiter": "~2.1.0",
                 "mqtt": "~4.3.7",
@@ -413,6 +413,35 @@
                 "node": ">=0.8.0"
             }
         },
+        "node_modules/@azure/msal-node/node_modules/jsonwebtoken": {
+            "version": "8.5.1",
+            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+            "dependencies": {
+                "jws": "^3.2.2",
+                "lodash.includes": "^4.3.0",
+                "lodash.isboolean": "^3.0.3",
+                "lodash.isinteger": "^4.0.4",
+                "lodash.isnumber": "^3.0.3",
+                "lodash.isplainobject": "^4.0.6",
+                "lodash.isstring": "^4.0.1",
+                "lodash.once": "^4.0.0",
+                "ms": "^2.1.1",
+                "semver": "^5.6.0"
+            },
+            "engines": {
+                "node": ">=4",
+                "npm": ">=1.4.28"
+            }
+        },
+        "node_modules/@azure/msal-node/node_modules/semver": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
         "node_modules/@babel/code-frame": {
             "version": "7.18.6",
             "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -11520,34 +11549,50 @@
             }
         },
         "node_modules/jsonwebtoken": {
-            "version": "8.5.1",
-            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
-            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+            "version": "9.0.0",
+            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+            "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
             "dependencies": {
                 "jws": "^3.2.2",
-                "lodash.includes": "^4.3.0",
-                "lodash.isboolean": "^3.0.3",
-                "lodash.isinteger": "^4.0.4",
-                "lodash.isnumber": "^3.0.3",
-                "lodash.isplainobject": "^4.0.6",
-                "lodash.isstring": "^4.0.1",
-                "lodash.once": "^4.0.0",
+                "lodash": "^4.17.21",
                 "ms": "^2.1.1",
-                "semver": "^5.6.0"
+                "semver": "^7.3.8"
             },
             "engines": {
-                "node": ">=4",
-                "npm": ">=1.4.28"
+                "node": ">=12",
+                "npm": ">=6"
+            }
+        },
+        "node_modules/jsonwebtoken/node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
             }
         },
         "node_modules/jsonwebtoken/node_modules/semver": {
-            "version": "5.7.1",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "version": "7.3.8",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+            "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
             "bin": {
-                "semver": "bin/semver"
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
             }
         },
+        "node_modules/jsonwebtoken/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/jsprim": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
@@ -17409,6 +17454,28 @@
                     "version": "9.0.1",
                     "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.1.tgz",
                     "integrity": "sha512-eNNHIW/cwPTZDWs9KtYgb1X6gtQ+cC+FGX2YN+t4AUVsBdUbqlMTnUs6/c/VBxC2AAGIhgLREuNnO3F66AN2zQ=="
+                },
+                "jsonwebtoken": {
+                    "version": "8.5.1",
+                    "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+                    "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+                    "requires": {
+                        "jws": "^3.2.2",
+                        "lodash.includes": "^4.3.0",
+                        "lodash.isboolean": "^3.0.3",
+                        "lodash.isinteger": "^4.0.4",
+                        "lodash.isnumber": "^3.0.3",
+                        "lodash.isplainobject": "^4.0.6",
+                        "lodash.isstring": "^4.0.1",
+                        "lodash.once": "^4.0.0",
+                        "ms": "^2.1.1",
+                        "semver": "^5.6.0"
+                    }
+                },
+                "semver": {
+                    "version": "5.7.1",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
                 }
             }
         },
@@ -25713,26 +25780,36 @@
             }
         },
         "jsonwebtoken": {
-            "version": "8.5.1",
-            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
-            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+            "version": "9.0.0",
+            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+            "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
             "requires": {
                 "jws": "^3.2.2",
-                "lodash.includes": "^4.3.0",
-                "lodash.isboolean": "^3.0.3",
-                "lodash.isinteger": "^4.0.4",
-                "lodash.isnumber": "^3.0.3",
-                "lodash.isplainobject": "^4.0.6",
-                "lodash.isstring": "^4.0.1",
-                "lodash.once": "^4.0.0",
+                "lodash": "^4.17.21",
                 "ms": "^2.1.1",
-                "semver": "^5.6.0"
+                "semver": "^7.3.8"
             },
             "dependencies": {
+                "lru-cache": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                    "requires": {
+                        "yallist": "^4.0.0"
+                    }
+                },
                 "semver": {
-                    "version": "5.7.1",
-                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+                    "version": "7.3.8",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+                    "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+                    "requires": {
+                        "lru-cache": "^6.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
                 }
             }
         },
diff --git a/package.json b/package.json
index c41b1701..702fda53 100644
--- a/package.json
+++ b/package.json
@@ -90,7 +90,7 @@
         "https-proxy-agent": "~5.0.1",
         "iconv-lite": "~0.6.3",
         "jsesc": "~3.0.2",
-        "jsonwebtoken": "~8.5.1",
+        "jsonwebtoken": "~9.0.0",
         "jwt-decode": "~3.1.2",
         "limiter": "~2.1.0",
         "mqtt": "~4.3.7",

From e591647b606cca8aa4360e40ed697c35860ec806 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Furkan=20I=CC=87pek?= <developer@furkanipek.com.tr>
Date: Wed, 4 Jan 2023 16:35:48 +0300
Subject: [PATCH 382/803] Update tr-TR.js

---
 src/languages/tr-TR.js | 93 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 93 insertions(+)

diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index 1bf94993..791fa68a 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -582,4 +582,97 @@ export default {
     goAlert: "GoAlert",
     backupOutdatedWarning: "Kullanımdan Kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan, tam bir yedekleme oluşturamaz veya geri yükleyemez.",
     backupRecommend: "Lütfen bunun yerine birimi veya veri klasörünü (./data/) doğrudan yedekleyin.",
+    enableGRPCTls: "TLS bağlantısıyla gRPC isteği göndermeye izin ver",
+    grpcMethodDescription: "Yöntem adı, sayHello, check, vb. gibi cammelCase biçimine dönüştürülür.",
+    Maintenance: "Bakım",
+    statusMaintenance: "Bakım",
+    "Schedule maintenance": "Bakım Planla",
+    "Affected Monitors": "Etkilenen Monitörler",
+    "Pick Affected Monitors...": "Etkilenen Monitörleri Seçin...",
+    "Start of maintenance": "Bakım başlangıcı",
+    "All Status Pages": "Tüm Durum Sayfaları",
+    "Select status pages...": "Durum sayfalarını seçin...",
+    recurringIntervalMessage: "Her gün bir kez çalıştırın | {0} günde bir çalıştırın",
+    affectedMonitorsDescription: "Geçerli bakımdan etkilenen monitörleri seçin",
+    affectedStatusPages: "Bu bakım mesajını seçili durum sayfalarında göster",
+    atLeastOneMonitor: "Etkilenen en az bir monitör seçin",
+    deleteMaintenanceMsg: "Bu bakımı silmek istediğinizden emin misiniz?",
+    ZohoCliq: "ZohoCliq",
+    webhookAdditionalHeadersTitle: "Ek Başlıklar",
+    webhookAdditionalHeadersDesc: "Webhook ile gönderilen ek başlıkları ayarlar.",
+    wayToGetZohoCliqURL: "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
+    Kook: "Kook",
+    wayToGetKookBotToken: "Uygulama oluşturun ve {0} adresinde bot tokenı alın",
+    wayToGetKookGuildID: "Kook ayarında \"Geliştirici Modu\"nu açın ve kimliğini almak için guild'e sağ tıklayın",
+    "Guild ID": "Guild ID",
+    smseagle: "SMSEagle",
+    smseagleTo: "Telefon numara(ları)",
+    smseagleGroup: "Telefon defteri grubu ad(lar)ı",
+    smseagleContact: "Telefon rehberi kişi ad(lar)ı",
+    smseagleRecipientType: "Alıcı Türü",
+    smseagleRecipient: "Alıcı(lar) (birden çok olanlar virgülle ayrılmalıdır)",
+    smseagleToken: "API Erişim Tokenı",
+    smseagleUrl: "SMSEagle cihaz URL\"niz",
+    smseagleEncoding: "Unicode olarak gönder",
+    smseaglePriority: "Mesaj önceliği (0-9, varsayılan = 0)",
+    Optional: "İsteğe bağlı",
+    squadcast: "Squadcast",
+    SendKey: "SendKey",
+    "SMSManager API Docs": "SMSManager API Dökümanları ",
+    "Gateway Type": "Ağ Geçidi Türü",
+    SMSManager: "SMSManager",
+    "You can divide numbers with": "Sayıları aşağıdakilerle bölebilirsiniz",
+    or: "veya",
+    recurringInterval: "Sıklık",
+    Recurring: "Yineleme",
+    strategyManual: "Manuel olarak Aktif/Pasif",
+    warningTimezone: "Sunucunun kullandığı saat dilimi",
+    weekdayShortMon: "Pzt",
+    weekdayShortTue: "Sal",
+    weekdayShortWed: "Çar",
+    weekdayShortThu: "Per",
+    weekdayShortFri: "Cum",
+    weekdayShortSat: "Cmt",
+    weekdayShortSun: "Paz",
+    dayOfWeek: "Haftanın Günleri",
+    dayOfMonth: "Ayın Günleri",
+    lastDay: "Son Gün",
+    lastDay1: "Ayın Son Günü",
+    lastDay2: "Ayın 2. Son Günü",
+    lastDay3: "Ayın 3. Son Günü",
+    lastDay4: "Ayın 4. Son Günü",
+    "No Maintenance": "Bakım Yok",
+    pauseMaintenanceMsg: "Duraklatmak istediğinizden emin misiniz?",
+    "maintenanceStatus-under-maintenance": "Bakımda",
+    "maintenanceStatus-inactive": "Etkin Değil",
+    "maintenanceStatus-scheduled": "Planlanmış",
+    "maintenanceStatus-ended": "Bitti",
+    "maintenanceStatus-unknown": "Bilinmiyor",
+    "Display Timezone": "Saat dilimini göster",
+    "Server Timezone": "Sunucu Saat Dilimi",
+    statusPageMaintenanceEndDate: "Bitiş Zamanı",
+    IconUrl: "Icon URL",
+    "Enable DNS Cache": "DNS Önbelleğini Etkinleştir",
+    Enable: "Etkin",
+    Disable: "Devre Dışı",
+    dnsCacheDescription: "Bazı IPv6 ortamlarında çalışmıyor olabilir, herhangi bir sorunla karşılaşırsanız devre dışı bırakın.",
+    "Single Maintenance Window": "Tek Seferlik Bakım",
+    "Maintenance Time Window of a Day": "Bür Günlük Bakım",
+    "Effective Date Range": "Bakim Tarih Aralığı",
+    "Schedule Maintenance": "Bakım Planla",
+    "Date and Time": "Tarih ve Saat",
+    "DateTime Range": "Tarih ve Saat Aralığı",
+    Strategy: "Strateji",
+    "Free Mobile User Identifier": "Ücretsiz Mobil Kullanıcı ID",
+    "Free Mobile API Key": "Ücretsiz Mobil API Anahtarı",
+    "Enable TLS": "TLS\'yi Etkinleştir",
+    "Proto Service Name": "Proto Service İsmi",
+    "Proto Method": "Proto Method",
+    "Proto Content": "Proto İçeriği",
+    Economy: "Ekonomik",
+    Lowcost: "Düşük maliyetli",
+    high: "Yüksek",
+    "General Monitor Type": "Genel Monitör Tipi",
+    "Passive Monitor Type": "Pasif Monitör Tipi",
+    "Specific Monitor Type": "Özel Monitör Tipi'
 };

From 610b6248aa9f57eeb2500776bae71eef90555f75 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Furkan=20I=CC=87pek?= <developer@furkanipek.com.tr>
Date: Wed, 4 Jan 2023 16:41:00 +0300
Subject: [PATCH 383/803] Update tr-TR.js

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

diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
index 791fa68a..c84fa1f2 100644
--- a/src/languages/tr-TR.js
+++ b/src/languages/tr-TR.js
@@ -665,7 +665,7 @@ export default {
     Strategy: "Strateji",
     "Free Mobile User Identifier": "Ücretsiz Mobil Kullanıcı ID",
     "Free Mobile API Key": "Ücretsiz Mobil API Anahtarı",
-    "Enable TLS": "TLS\'yi Etkinleştir",
+    "Enable TLS": "TLS'yi Etkinleştir",
     "Proto Service Name": "Proto Service İsmi",
     "Proto Method": "Proto Method",
     "Proto Content": "Proto İçeriği",
@@ -674,5 +674,5 @@ export default {
     high: "Yüksek",
     "General Monitor Type": "Genel Monitör Tipi",
     "Passive Monitor Type": "Pasif Monitör Tipi",
-    "Specific Monitor Type": "Özel Monitör Tipi'
+    "Specific Monitor Type": "Özel Monitör Tipi",
 };

From 69e1880cd30507143cfa4ec704d32eff3da4cb60 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 4 Jan 2023 16:46:36 +0000
Subject: [PATCH 384/803] Added not active condition to prevent false error

Added a check to see if the host is alive. This prevents failiures when
the user specifies a hostname of `unknown`.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/util-server.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/util-server.js b/server/util-server.js
index 72662136..3549de80 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -103,7 +103,7 @@ exports.pingAsync = function (hostname, ipv6 = false) {
             min_reply: 3
         }).then((res) => {
             // If ping failed, it will set field to unknown
-            if (res.host === "unknown") {
+            if (!res.alive && res.host === "unknown") {
                 reject(new Error("Name or service not known"));
             } else if (res.time === "unknown") {
                 reject(new Error(res.output));

From 49b5de7d40bc4ca062afdbeac72e7cd40e05bece Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 5 Jan 2023 00:48:49 +0800
Subject: [PATCH 385/803] Update Apprise to 1.2.1

---
 docker/alpine-base.dockerfile | 2 +-
 docker/debian-base.dockerfile | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/docker/alpine-base.dockerfile b/docker/alpine-base.dockerfile
index 1b8034f4..82bc7bb0 100644
--- a/docker/alpine-base.dockerfile
+++ b/docker/alpine-base.dockerfile
@@ -4,5 +4,5 @@ WORKDIR /app
 
 # Install apprise, iputils for non-root ping, setpriv
 RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
-    pip3 --no-cache-dir install apprise==1.2.0 && \
+    pip3 --no-cache-dir install apprise==1.2.1 && \
     rm -rf /root/.cache
diff --git a/docker/debian-base.dockerfile b/docker/debian-base.dockerfile
index 5ca4a7ed..d94b4c7f 100644
--- a/docker/debian-base.dockerfile
+++ b/docker/debian-base.dockerfile
@@ -11,7 +11,7 @@ WORKDIR /app
 RUN apt update && \
     apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
         sqlite3 iputils-ping util-linux dumb-init && \
-    pip3 --no-cache-dir install apprise==1.2.0 && \
+    pip3 --no-cache-dir install apprise==1.2.1 && \
     rm -rf /var/lib/apt/lists/* && \
     apt --yes autoremove
 

From 90a26682720a7a3fcc831d4fbce7deb69b5b24f2 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 4 Jan 2023 17:32:27 +0000
Subject: [PATCH 386/803] Restructured condition + ensure data is UTF-8

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/util-server.js | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index 3549de80..3f55b3d7 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -103,12 +103,10 @@ exports.pingAsync = function (hostname, ipv6 = false) {
             min_reply: 3
         }).then((res) => {
             // If ping failed, it will set field to unknown
-            if (!res.alive && res.host === "unknown") {
-                reject(new Error("Name or service not known"));
-            } else if (res.time === "unknown") {
-                reject(new Error(res.output));
-            } else {
+            if (res.alive) {
                 resolve(res.time);
+            } else {
+                reject(new Error(exports.convertToUTF8(res.output)));
             }
         }).catch((err) => {
             reject(err);

From 554402b4847940b559320e17fcaa2cbf03f1dc0d Mon Sep 17 00:00:00 2001
From: DX <deluxghost@gmail.com>
Date: Thu, 5 Jan 2023 15:38:51 +0800
Subject: [PATCH 387/803] Updated zh-CN.js

---
 src/languages/zh-CN.js | 219 ++++++++++++++++++++++++++++-------------
 1 file changed, 150 insertions(+), 69 deletions(-)

diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index 5878758c..ba2a78ac 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -2,17 +2,35 @@ export default {
     languageName: "简体中文",
     checkEverySecond: "检测频率 {0} 秒",
     retryCheckEverySecond: "重试间隔 {0} 秒",
+    resendEveryXTimes: "每 {0} 次失败则重复发送一次",
+    resendDisabled: "为 0 时禁用重复发送",
     retriesDescription: "服务被标记为故障并发送通知之前的最大重试次数",
     ignoreTLSError: "忽略 HTTPS 站点的 TLS/SSL 错误",
     upsideDownModeDescription: "反转状态监控,如果服务可访问,则认为是故障。",
     maxRedirectDescription: "允许的最大重定向次数。设置为 0 禁用重定向。",
+    enableGRPCTls: "允许通过 TLS 连接发送 gRPC 请求",
+    grpcMethodDescription: "方法名会转换为小驼峰格式,例如 sayHello、check 等等",
     acceptedStatusCodesDescription: "选择被视为成功响应的状态码。",
+    Maintenance: "维护",
+    statusMaintenance: "维护",
+    "Schedule maintenance": "计划维护",
+    "Affected Monitors": "受影响的监控项",
+    "Pick Affected Monitors...": "选择受影响的监控项…",
+    "Start of maintenance": "维护开始",
+    "All Status Pages": "所有状态页面",
+    "Select status pages...": "选择状态页面…",
+    recurringIntervalMessage: "每天一次 | 每 {0} 天一次",
+    affectedMonitorsDescription: "选择受当前维护影响的监控项",
+    affectedStatusPages: "在所选状态页面上显示此维护消息",
+    atLeastOneMonitor: "至少选择一个受影响的监控项",
     passwordNotMatchMsg: "两次输入的密码不一致。",
     notificationDescription: "通知必须被分配给监控项才能正常工作。",
     keywordDescription: "在纯 HTML 或 JSON 响应中搜索关键字,区分大小写。",
     pauseDashboardHome: "暂停",
     deleteMonitorMsg: "确定要删除此监控项吗?",
+    deleteMaintenanceMsg: "确定要删除此维护吗?",
     deleteNotificationMsg: "确定要为所有监控项删除此通知吗?",
+    dnsPortDescription: "DNS 服务器端口,默认为 53,您可以在任何时候更改此端口.",
     resolverserverDescription: "默认服务器是 Cloudflare。您随时可以修改解析服务器。",
     rrtypeDescription: "选择要监控的资源记录类型",
     pauseMonitorMsg: "确定要暂停吗?",
@@ -34,7 +52,6 @@ export default {
     Theme: "主题",
     General: "常规",
     "Primary Base URL": "站点主 URL",
-    About: "关于",
     Version: "版本",
     "Check Update On GitHub": "检查 GitHub 上的更新",
     List: "列表",
@@ -72,6 +89,7 @@ export default {
     "Heartbeat Interval": "心跳间隔",
     Retries: "重试次数",
     "Heartbeat Retry Interval": "心跳重试间隔",
+    "Resend Notification if Down X times consequently": "连续失败时重复发送通知的间隔次数",
     Advanced: "高级",
     "Upside Down Mode": "反转监控",
     "Max. Redirects": "最大重定向次数",
@@ -125,7 +143,6 @@ export default {
     "Last Result": "上次结果",
     "Create your admin account": "创建管理员账户",
     "Repeat Password": "重复密码",
-    Backup: "备份",
     "Import Backup": "导入备份",
     "Export Backup": "导出备份",
     Export: "导出",
@@ -160,7 +177,7 @@ export default {
     Token: "令牌",
     "Show URI": "显示 URI",
     Tags: "标签",
-    "Add New below or Select...": "在下面添加或选择...",
+    "Add New below or Select...": "在下面添加或选择…",
     "Tag with this name already exist.": "相同名称的标签已存在。",
     "Tag with this value already exist.": "相同内容的标签已存在。",
     color: "颜色",
@@ -173,7 +190,7 @@ export default {
     Indigo: "靛蓝",
     Purple: "紫色",
     Pink: "粉色",
-    "Search...": "搜索...",
+    "Search...": "搜索…",
     "Avg. Ping": "平均 Ping",
     "Avg. Response": "平均响应",
     "Entry Page": "入口页面",
@@ -192,6 +209,7 @@ export default {
     here: "这里",
     Required: "必填",
     telegram: "Telegram",
+    "ZohoCliq": "ZohoCliq",
     "Bot Token": "Bot Token",
     wayToGetTelegramToken: "您可以从 {0} 获取 Token。",
     "Chat ID": "Chat ID",
@@ -204,6 +222,8 @@ export default {
     "Content Type": "Content Type",
     webhookJsonDesc: "{0} 适合现代的 HTTP 服务器,例如 Express.js",
     webhookFormDataDesc: "{multipart} 适合 PHP,其中 JSON 需要使用 {decodeFunction} 解码",
+    webhookAdditionalHeadersTitle: "额外 Header",
+    webhookAdditionalHeadersDesc: "设置通过此 Webhook 发送的额外 Header。",
     smtp: "电子邮件(SMTP)",
     secureOptionNone: "无 / STARTTLS(常用端口 25、587)",
     secureOptionTLS: "TLS(常用端口 465)",
@@ -221,7 +241,8 @@ export default {
     "Hello @everyone is...": "{'@'}everyone,……",
     teams: "Microsoft Teams",
     "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "您可以在 {0} 了解如何获取 Webhook URL。",
+    wayToGetTeamsURL: "您可以在{0}了解如何获取 Webhook URL。",
+    wayToGetZohoCliqURL: "您可以在{0}了解如何创建 Webhook URL。",
     signal: "Signal",
     Number: "号码",
     Recipients: "收件人",
@@ -243,6 +264,7 @@ export default {
     "rocket.chat": "Rocket.Chat",
     pushover: "Pushover",
     pushy: "Pushy",
+    PushByTechulus: "Push by Techulus",
     octopush: "Octopush",
     promosms: "PromoSMS",
     clicksendsms: "ClickSend SMS",
@@ -250,9 +272,10 @@ export default {
     apprise: "Apprise (支持 50+ 种通知服务)",
     GoogleChat: "Google Chat(仅 Google Workspace)",
     pushbullet: "Pushbullet",
+    AliyunSMS: "阿里云短信服务",
     Kook: "Kook",
     wayToGetKookBotToken: "在 {0} 创建应用并获取机器人 Token",
-    wayToGetKookGuildID: "在Kook设置中打开 ‘开发者模式’,然后右键频道可获取其 ID",
+    wayToGetKookGuildID: "在 Kook 设置中打开“开发者模式”,然后右键点击频道可获取其 ID",
     "Guild ID": "频道 ID",
     line: "Line Messenger",
     mattermost: "Mattermost",
@@ -298,6 +321,7 @@ export default {
     promosmsTypeSpeed: "SMS SPEED - 最高优先级。非常快速可靠,但更贵(大约两倍 SMS FULL 的价格)。",
     promosmsPhoneNumber: "电话号码(波兰地区收信人可以不填区号)",
     promosmsSMSSender: "短信发信人名称:已注册的名称或以下默认值之一:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
+    Feishu: "飞书",
     "Feishu WebHookUrl": "飞书 WebHook URL",
     matrixHomeserverURL: "服务器 URL(包含 http(s):// 和可选的端口号)",
     "Internal Room Id": "内部房间 ID",
@@ -316,14 +340,18 @@ export default {
     "One record": "一条记录",
     steamApiKeyDescription: "要监控 Steam 游戏服务器,您需要 Steam Web-API 密钥。您可以在这里注册您的 API 密钥: ",
     "Current User": "当前用户",
+    topic: "Topic",
+    topicExplanation: "要监控的 MQTT Topic",
+    successMessage: "成功消息",
+    successMessageExplanation: "视为成功的 MQTT 消息",
     recent: "最近",
     Done: "完成",
     Info: "信息",
     Security: "安全性",
     "Steam API Key": "Steam API 密钥",
     "Shrink Database": "压缩数据库",
-    "Pick a RR-Type...": "选择资源记录类型...",
-    "Pick Accepted Status Codes...": "选择有效的状态码...",
+    "Pick a RR-Type...": "选择资源记录类型…",
+    "Pick Accepted Status Codes...": "选择有效的状态码…",
     Default: "默认",
     "HTTP Options": "HTTP 选项",
     "Create Incident": "创建事件",
@@ -333,6 +361,8 @@ export default {
     info: "信息",
     warning: "警告",
     danger: "危险",
+    error: "错误",
+    critical: "关键",
     primary: "主要",
     light: "明亮",
     dark: "黑暗",
@@ -360,7 +390,20 @@ export default {
     serwersmsAPIPassword: "API 密码",
     serwersmsPhoneNumber: "电话号码",
     serwersmsSenderName: "SMS 发信人名称(需要在客户中心注册)",
+    smseagle: "SMSEagle",
+    smseagleTo: "电话号码",
+    smseagleGroup: "通讯录群组名",
+    smseagleContact: "通讯录联系人",
+    smseagleRecipientType: "收信人类型",
+    smseagleRecipient: "收信人(多个需用半角逗号分隔)",
+    smseagleToken: "API Access token",
+    smseagleUrl: "您的 SMSEagle 设备 URL",
+    smseagleEncoding: "以 Unicode 发送",
+    smseaglePriority: "消息优先级(0-9,默认为 0)",
     stackfield: "Stackfield",
+    Customize: "自定义",
+    "Custom Footer": "自定义底部",
+    "Custom CSS": "自定义 CSS",
     smtpDkimSettings: "DKIM 设置",
     smtpDkimDesc: "请访问 Nodemailer DKIM {0} 了解配置方法。",
     documentation: "文档",
@@ -370,16 +413,13 @@ export default {
     smtpDkimHashAlgo: "哈希算法(可选)",
     smtpDkimheaderFieldNames: "包含在哈希计算对象内的 Header 列表(可选)",
     smtpDkimskipFields: "不包含在哈希计算对象内的 Header 列表(可选)",
-    Feishu: "飞书",
-    AliyunSMS: "阿里云短信服务",
-    "Sms template must contain parameters: ": "短信模板必须包含以下变量:",
-    DingDing: "钉钉自定义机器人",
-    WebHookUrl: "钉钉自定义机器人 Webhook 地址",
-    SecretKey: "钉钉自定义机器人加签密钥",
-    "For safety, must use secret key": "出于安全考虑,必须使用加签密钥",
-    WeCom: "企业微信群机器人",
-    "WeCom Bot Key": "企业微信群机器人 Key",
-    PushByTechulus: "Push by Techulus",
+    wayToGetPagerDutyKey: "您可以在 Service -> Service Directory -> (选择一个 Service) -> Integrations -> Add integration 页面中搜索“Events API V2”以获取此 Integration Key,更多信息请看{0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "自动标记为已解决或已读",
+    "do nothing": "不做任何操作",
+    "auto acknowledged": "自动标记为已读",
+    "auto resolve": "自动标记为已解决",
     gorush: "Gorush",
     alerta: "Alerta",
     alertaApiEndpoint: "API 接入点",
@@ -396,9 +436,6 @@ export default {
     proxyDescription: "代理必须配置到至少一个监控项后才会工作。",
     enableProxyDescription: "此代理必须启用才能对监控项的网络请求起作用。您可以通过修改激活状态,临时在所有监控项中禁用此代理。",
     setAsDefaultProxyDescription: "此代理会对新创建的监控项默认激活,您仍可以在监控项配置中单独禁用此代理。",
-    "Proxy Protocol": "代理协议",
-    "Proxy Server": "代理服务器",
-    "Server Address": "服务器地址",
     "Certificate Chain": "证书链",
     Valid: "有效",
     Invalid: "无效",
@@ -407,9 +444,14 @@ export default {
     PhoneNumbers: "PhoneNumbers",
     TemplateCode: "TemplateCode",
     SignName: "SignName",
+    "Sms template must contain parameters: ": "短信模板必须包含以下变量:",
     "Bark Endpoint": "Bark 接入点",
     "Bark Group": "Bark 群组",
     "Bark Sound": "Bark 铃声",
+    DingDing: "钉钉自定义机器人",
+    WebHookUrl: "钉钉自定义机器人 Webhook 地址",
+    SecretKey: "钉钉自定义机器人加签密钥",
+    "For safety, must use secret key": "出于安全考虑,必须使用加签密钥",
     "Device Token": "Apple Device Token",
     Platform: "平台",
     iOS: "iOS",
@@ -418,21 +460,18 @@ export default {
     High: "高",
     Retry: "重试次数",
     Topic: "Gorush Topic",
+    WeCom: "企业微信群机器人",
+    "WeCom Bot Key": "企业微信群机器人 Key",
     "Setup Proxy": "设置代理",
+    "Proxy Protocol": "代理协议",
+    "Proxy Server": "代理服务器",
+    "Server Address": "服务器地址",
     "Proxy server has authentication": "代理服务器启用了身份验证功能",
     User: "用户名",
     Installed: "已安装",
     "Not installed": "未安装",
     Running: "运行中",
     "Not running": "未运行",
-    "Message:": "信息:",
-    wayToGetCloudflaredURL: "(可从 {0} 下载 cloudflared)",
-    cloudflareWebsite: "Cloudflare 网站",
-    "Don't know how to get the token? Please read the guide:": "不知道如何获取 Token?请阅读指南:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您正在通过 Cloudflare Tunnel 访问网站,则停止可能会导致当前连接断开。您确定要停止吗?请输入密码以确认。",
-    "Other Software": "其他软件",
-    "For example: nginx, Apache and Traefik.": "例如:nginx、Apache 和 Traefik。",
-    "Please read": "请阅读",
     "Remove Token": "移除 Token",
     Start: "启动",
     Stop: "停止",
@@ -450,6 +489,18 @@ export default {
     "New Status Page": "新的状态页",
     "Page Not Found": "未找到该页面",
     "Reverse Proxy": "反向代理",
+    Backup: "备份",
+    About: "关于",
+    wayToGetCloudflaredURL: "(可从 {0} 下载 cloudflared)",
+    cloudflareWebsite: "Cloudflare 网站",
+    "Message:": "信息:",
+    "Don't know how to get the token? Please read the guide:": "不知道如何获取 Token?请阅读指南:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您正在通过 Cloudflare Tunnel 访问网站,则停止可能会导致当前连接断开。您确定要停止吗?请输入密码以确认。",
+    "HTTP Headers": "HTTP 头",
+    "Trust Proxy": "可信的代理类字段",
+    "Other Software": "其他软件",
+    "For example: nginx, Apache and Traefik.": "例如:nginx、Apache 和 Traefik。",
+    "Please read": "请阅读",
     "Subject:": "颁发给:",
     "Valid To:": "有效期至:",
     "Days Remaining:": "剩余有效天数:",
@@ -459,26 +510,28 @@ export default {
     "Domain Name Expiry Notification": "域名到期时通知",
     Proxy: "代理",
     "Date Created": "创建于",
+    HomeAssistant: "Home Assistant",
     onebotHttpAddress: "OneBot HTTP 地址",
     onebotMessageType: "OneBot 消息类型",
     onebotGroupMessage: "群聊",
     onebotPrivateMessage: "私聊",
-    onebotUserOrGroupId: "群组/用户ID",
+    onebotUserOrGroupId: "群组/用户 ID",
     onebotSafetyTips: "出于安全原因,请务必设置 AccessToken",
-    topic: "Topic",
-    topicExplanation: "MQTT 传递给监控的 Topic",
-    successMessage: "成功时消息",
-    successMessageExplanation: "MQTT 成功时所传递的消息",
-    Customize: "自定义",
-    "Custom Footer": "自定义底部",
-    "Custom CSS": "自定义 CSS",
     "PushDeer Key": "PushDeer Key",
     "Footer Text": "底部自定义文本",
     "Show Powered By": "显示 Powered By",
     "Domain Names": "域名",
+    signedInDisp: "当前用户: {0}",
+    signedInDispDisabled: "已禁用身份验证",
+    RadiusSecret: "Radius 共享机密",
+    RadiusSecretDescription: "客户端和服务器之间共享的密钥",
+    RadiusCalledStationId: "NAS 网络访问服务器号码(Called Station Id)",
+    RadiusCalledStationIdDescription: "所访问的服务器的标识",
+    RadiusCallingStationId: "呼叫方号码(Calling Station Id)",
+    RadiusCallingStationIdDescription: "发出请求的设备的标识",
     "Certificate Expiry Notification": "证书到期时通知",
-    "API Username": "API 凭证 Username",
-    "API Key": "API 凭证 Key",
+    "API Username": "API Username",
+    "API Key": "API Key",
     "Recipient Number": "收件人手机号码",
     "From Name/Number": "发件人名称/手机号码",
     "Leave blank to use a shared sender number.": "留空以使用平台共享的发件人手机号码",
@@ -526,38 +579,11 @@ export default {
     "Retype the address.": "重新输入地址;",
     "Go back to the previous page.": "返回到上一页面。",
     "Coming Soon": "即将推出",
-    wayToGetClickSendSMSToken: "您可以从 {0} 获取 API 凭证 Username 和 凭证 Key。",
-    signedInDisp: "当前用户: {0}",
-    signedInDispDisabled: "已禁用身份验证",
-    dnsPortDescription: "DNS 服务器端口,默认为 53,你可以在任何时候更改此端口.",
-    error: "错误",
-    critical: "关键",
-    wayToGetPagerDutyKey: "你可以在 Service -> Service Directory -> (选择一个 Service) -> Integrations -> Add integration 页面中搜索 \"Events API V2\" 以获取此 Integration Key,更多信息请参见 {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "自动标记为已解决或已读",
-    "do nothing": "不做任何操作",
-    "auto acknowledged": "自动标记为已读",
-    "auto resolve": "自动标记为已解决",
+    wayToGetClickSendSMSToken: "您可以在{0}获取 API Username 和 API Key。",
     "Connection String": "连接字符串",
     Query: "查询语句",
     settingsCertificateExpiry: "TLS 证书过期通知",
     certificationExpiryDescription: "HTTPS 监控项发现被监控目标的 TLS 证书剩余有效期少于以下天数时将发出通知:",
-    "ntfy Topic": "ntfy 主题",
-    Domain: "域名",
-    Workstation: "工作站",
-    resendEveryXTimes: "每 {0} 次失败则重复发送一次",
-    resendDisabled: "为 0 时禁用重复发送",
-    "Resend Notification if Down X times consequently": "连续失败时重复发送通知的间隔次数",
-    "HTTP Headers": "HTTP 头",
-    "Trust Proxy": "可信的代理类字段",
-    HomeAssistant: "Home Assistant",
-    RadiusSecret: "Radius 共享机密",
-    RadiusSecretDescription: "客户端和服务器之间共享的密钥",
-    RadiusCalledStationId: "NAS 网络访问服务器号码(Called Station Id)",
-    RadiusCalledStationIdDescription: "所访问的服务器的标识",
-    RadiusCallingStationId: "呼叫方号码(Calling Station Id)",
-    RadiusCallingStationIdDescription: "发出请求的设备的标识",
     "Setup Docker Host": "配置 Docker 宿主信息",
     "Connection Type": "连接方式",
     "Docker Daemon": "Docker 守护进程",
@@ -568,6 +594,9 @@ export default {
     "Container Name / ID": "容器名称 / ID",
     "Docker Host": "Docker 宿主",
     "Docker Hosts": "Docker 宿主",
+    "ntfy Topic": "ntfy Topic",
+    Domain: "域名",
+    Workstation: "工作站",
     disableCloudflaredNoAuthMsg: "您现在正处于 No Auth 模式,无需输入密码",
     trustProxyDescription: "信任 'X-Forwarded-*' 头。如果您的 Uptime Kuma 是通过 Nginx 或 Apache 等反代服务对外提供访问的话,则您应当启用本功能以获取正确的客户端 IP。",
     wayToGetLineNotifyToken: "您可以在 {0} 获取 Access token",
@@ -584,7 +613,7 @@ export default {
     "Event data:": "事件数据:",
     "Then choose an action, for example switch the scene to where an RGB light is red.": "然后您可以选择关联操作,例如切换到 RGB 灯发出红光的场景",
     "Frontend Version": "前端版本",
-    "Frontend Version do not match backend version!": "前端版本与后端版本不符!",
+    "Frontend Version do not match backend version!": "前端版本与后端版本不匹配!",
     "Base URL": "API 基础地址",
     goAlertInfo: "GoAlert 是一个用于呼叫调度、自动汇报和通知(如 SMS 或语音呼叫)的开源应用程序。在正确的时间以正确的方式自动让正确的人参与!{0}",
     goAlertIntegrationKeyInfo: "使用形如 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 的通用 API 集成密钥,通常是复制来的链接中的 token 参数值。",
@@ -598,5 +627,57 @@ export default {
     "Gateway Type": "网关类型",
     SMSManager: "SMSManager",
     "You can divide numbers with": "可用的分隔符:",
-    "or": "或",
+    or: "或",
+    recurringInterval: "时间间隔",
+    Recurring: "重复",
+    strategyManual: "手动启用/禁用",
+    warningTimezone: "使用服务器时区",
+    weekdayShortMon: "周一",
+    weekdayShortTue: "周二",
+    weekdayShortWed: "周三",
+    weekdayShortThu: "周四",
+    weekdayShortFri: "周五",
+    weekdayShortSat: "周六",
+    weekdayShortSun: "周日",
+    dayOfWeek: "每周计划",
+    dayOfMonth: "每月计划",
+    lastDay: "结束日",
+    lastDay1: "每月最后一天",
+    lastDay2: "每月倒数第二天",
+    lastDay3: "每月倒数第三天",
+    lastDay4: "每月倒数第四天",
+    "No Maintenance": "无维护计划",
+    pauseMaintenanceMsg: "确定要暂停吗?",
+    "maintenanceStatus-under-maintenance": "正在维护",
+    "maintenanceStatus-inactive": "未启用",
+    "maintenanceStatus-scheduled": "已计划",
+    "maintenanceStatus-ended": "已结束",
+    "maintenanceStatus-unknown": "未知",
+    "Display Timezone": "显示时区",
+    "Server Timezone": "服务器时区",
+    statusPageMaintenanceEndDate: "结束时间",
+    IconUrl: "图标 URL",
+    "Enable DNS Cache": "启用 DNS 缓存",
+    Enable: "启用",
+    Disable: "禁用",
+    dnsCacheDescription: "可能无法在某些 IPv6 环境工作,如果遇到问题请禁用。",
+    "Single Maintenance Window": "单一时间窗口",
+    "Maintenance Time Window of a Day": "每日维护时间窗口",
+    "Effective Date Range": "生效日期范围",
+    "Schedule Maintenance": "计划维护",
+    "Date and Time": "日期时间",
+    "DateTime Range": "日期时间范围",
+    Strategy: "策略",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "启用 TLS",
+    "Proto Service Name": "Proto 服务名称",
+    "Proto Method": "Proto 方法",
+    "Proto Content": "Proto 内容",
+    Economy: "经济",
+    Lowcost: "低价",
+    high: "高价",
+    "General Monitor Type": "常规监控类型",
+    "Passive Monitor Type": "被动监控类型",
+    "Specific Monitor Type": "针对监控类型",
 };

From c196c34840f39bb97ba094dc8f642d6f77ce84e1 Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Thu, 5 Jan 2023 08:57:48 +0100
Subject: [PATCH 388/803] Add mqtt, mqtts, ws and wss protocols to the mqtt
 monitor

---
 server/util-server.js     | 9 +++++----
 src/pages/EditMonitor.vue | 3 ++-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index ffd171b4..fb96abe7 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -135,7 +135,7 @@ exports.mqttAsync = function (hostname, topic, okMessage, options = {}) {
         const { port, username, password, interval = 20 } = options;
 
         // Adds MQTT protocol to the hostname if not already present
-        if (!/^(?:http|mqtt)s?:\/\//.test(hostname)) {
+        if (!/^(?:http|mqtt|ws)s?:\/\//.test(hostname)) {
             hostname = "mqtt://" + hostname;
         }
 
@@ -145,10 +145,11 @@ exports.mqttAsync = function (hostname, topic, okMessage, options = {}) {
             reject(new Error("Timeout"));
         }, interval * 1000 * 0.8);
 
-        log.debug("mqtt", "MQTT connecting");
+        const mqttUrl = `${hostname}:${port}`
+        
+        log.debug("mqtt", `MQTT connecting to ${mqttUrl}`);
 
-        let client = mqtt.connect(hostname, {
-            port,
+        let client = mqtt.connect(mqttUrl, {
             username,
             password
         });
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index c9d5ad2f..315d1e6c 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -604,7 +604,8 @@ export default {
             // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
             ipRegexPattern: "((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))",
             // Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
-            hostnameRegexPattern: "^(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$"
+            // Modified to accept http, https, mqtt, mqtts, ws and wss protocols accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
+            hostnameRegexPattern: "^((http|mqtt|ws)s?:\/\/)?([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$"
         };
     },
 

From 4239cf4255b52b47c8788eba8ad1b20c61085e1d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 5 Jan 2023 17:11:37 +0800
Subject: [PATCH 389/803] Pin dependency of `ping`

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

diff --git a/package-lock.json b/package-lock.json
index 0e99be12..6c09c89a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -48,7 +48,7 @@
                 "password-hash": "~1.2.2",
                 "pg": "~8.8.0",
                 "pg-connection-string": "~2.5.0",
-                "ping": "^0.4.2",
+                "ping": "~0.4.2",
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
                 "protobufjs": "~7.1.1",
diff --git a/package.json b/package.json
index f7ed288f..7d48a929 100644
--- a/package.json
+++ b/package.json
@@ -103,7 +103,7 @@
         "password-hash": "~1.2.2",
         "pg": "~8.8.0",
         "pg-connection-string": "~2.5.0",
-        "ping": "^0.4.2",
+        "ping": "~0.4.2",
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
         "protobufjs": "~7.1.1",

From fc1914bccd802783a24a46ffb99b5004baf967f2 Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Thu, 5 Jan 2023 11:42:19 +0100
Subject: [PATCH 390/803] Fix lint

---
 server/util-server.js     | 4 ++--
 src/pages/EditMonitor.vue | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index fb96abe7..3a48b5ed 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -145,8 +145,8 @@ exports.mqttAsync = function (hostname, topic, okMessage, options = {}) {
             reject(new Error("Timeout"));
         }, interval * 1000 * 0.8);
 
-        const mqttUrl = `${hostname}:${port}`
-        
+        const mqttUrl = `${hostname}:${port}`;
+
         log.debug("mqtt", `MQTT connecting to ${mqttUrl}`);
 
         let client = mqtt.connect(mqttUrl, {
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 315d1e6c..ab477a7e 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -605,7 +605,7 @@ export default {
             ipRegexPattern: "((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))",
             // Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
             // Modified to accept http, https, mqtt, mqtts, ws and wss protocols accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
-            hostnameRegexPattern: "^((http|mqtt|ws)s?:\/\/)?([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$"
+            hostnameRegexPattern: "^((http|mqtt|ws)s?:\\/\\/)?([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$"
         };
     },
 

From 494c53971c449a125bbd1f2cbfbad25b5035b024 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 5 Jan 2023 19:22:15 +0800
Subject: [PATCH 391/803] Convert to UTF8 on Windows only

---
 server/util-server.js | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/server/util-server.js b/server/util-server.js
index 3f55b3d7..99c9c932 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -26,6 +26,8 @@ const {
 } = require("node-radius-utils");
 const dayjs = require("dayjs");
 
+const isWindows = process.platform === /^win/.test(process.platform);
+
 /**
  * Init or reset JWT secret
  * @returns {Promise<Bean>}
@@ -106,7 +108,11 @@ exports.pingAsync = function (hostname, ipv6 = false) {
             if (res.alive) {
                 resolve(res.time);
             } else {
-                reject(new Error(exports.convertToUTF8(res.output)));
+                if (isWindows) {
+                    reject(new Error(exports.convertToUTF8(res.output)));
+                } else {
+                    reject(new Error(res.output));
+                }
             }
         }).catch((err) => {
             reject(err);

From 7d9235156872c290c309bc3c07cc8ee21df455fc Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 5 Jan 2023 19:30:55 +0800
Subject: [PATCH 392/803] Match previous settings

---
 server/util-server.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/server/util-server.js b/server/util-server.js
index 99c9c932..6b9ed339 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -102,7 +102,8 @@ exports.pingAsync = function (hostname, ipv6 = false) {
     return new Promise((resolve, reject) => {
         ping.promise.probe(hostname, {
             v6: ipv6,
-            min_reply: 3
+            min_reply: 1,
+            timeout: 10000,
         }).then((res) => {
             // If ping failed, it will set field to unknown
             if (res.alive) {

From 4c5e2ea237fa485cfbcdee8d49a9d47a29bb500b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 5 Jan 2023 20:03:28 +0800
Subject: [PATCH 393/803] Update CONTRIBUTING.md

---
 CONTRIBUTING.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 12fd6ed4..a1a4a982 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -48,6 +48,7 @@ Here are some references:
 - UI/UX is not close to Uptime Kuma 
 - Existing logic is completely modified or deleted for no reason
 - A function that is completely out of scope
+- Convert existing code into other programming languages
 - Unnecessary large code changes (Hard to review, causes code conflicts to other pull requests)
 
 I will mark your pull request in the [milestones](https://github.com/louislam/uptime-kuma/milestones), if I am plan to review and merge it.

From 0b959514f880f8e9dc6953375961d05a86b8fe36 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 5 Jan 2023 20:38:37 +0800
Subject: [PATCH 394/803] Fix timeout

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

diff --git a/server/util-server.js b/server/util-server.js
index 6b9ed339..4a30017a 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -103,7 +103,7 @@ exports.pingAsync = function (hostname, ipv6 = false) {
         ping.promise.probe(hostname, {
             v6: ipv6,
             min_reply: 1,
-            timeout: 10000,
+            timeout: 10,
         }).then((res) => {
             // If ping failed, it will set field to unknown
             if (res.alive) {

From 4ebf5a5f0736f648b87db0bf0c2fcfe250258671 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 5 Jan 2023 21:03:28 +0800
Subject: [PATCH 395/803] Update README.md

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

diff --git a/README.md b/README.md
index 9b810015..1f26da8b 100644
--- a/README.md
+++ b/README.md
@@ -44,7 +44,7 @@ docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name upti
 
 ⚠️ Please use a **local volume** only. Other types such as NFS are not supported.
 
-Kuma is now running on http://localhost:3001
+Uptime Kuma is now running on http://localhost:3001
 
 ### 💪🏻 Non-Docker
 
@@ -73,7 +73,7 @@ pm2 start server/server.js --name uptime-kuma
 
 
 ```
-Kuma is now running on http://localhost:3001
+Uptime Kuma is now running on http://localhost:3001
 
 More useful PM2 Commands
 

From 5362aab0e5648a942314fcf468c3e9f127e958fd Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Thu, 5 Jan 2023 14:06:13 +0100
Subject: [PATCH 396/803] specify scheme for mqtt monitor type only

---
 src/pages/EditMonitor.vue           |  19 ++++++++++++-------
 test/cypress/videos/setup.cy.js.mp4 | Bin 0 -> 64989 bytes
 2 files changed, 12 insertions(+), 7 deletions(-)
 create mode 100644 test/cypress/videos/setup.cy.js.mp4

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index ab477a7e..302ec6fd 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -105,7 +105,7 @@
                             <!-- TCP Port / Ping / DNS / Steam / MQTT / Radius only -->
                             <div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' || monitor.type === 'steam' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
                                 <label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
-                                <input id="hostname" v-model="monitor.hostname" type="text" class="form-control" :pattern="`${ipRegexPattern}|${hostnameRegexPattern}`" required>
+                                <input id="hostname" v-model="monitor.hostname" type="text" class="form-control" :pattern="`${monitor.type === 'mqtt' ? mqttIpOrHostnameRegexPattern : ipOrHostnameRegexPattern}`" required>
                             </div>
 
                             <!-- Port -->
@@ -590,6 +590,15 @@ export default {
     },
 
     data() {
+        const mqttSchemePartialRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
+        // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
+        const ipRegexPattern = "((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))";
+        const hostnameRegexPattern = "^([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$";
+
+        // Modified to accept mqtt, mqtts, ws and wss protocols accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
+        const mqttIpRegexPattern = `((^\\s*${mqttSchemePartialRegexPattern}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))`;
+        const mqttHostNameRegexPattern = `^${mqttSchemePartialRegexPattern}([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$`;
+
         return {
             minInterval: MIN_INTERVAL_SECOND,
             maxInterval: MAX_INTERVAL_SECOND,
@@ -600,12 +609,8 @@ export default {
             },
             acceptedStatusCodeOptions: [],
             dnsresolvetypeOptions: [],
-
-            // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
-            ipRegexPattern: "((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))",
-            // Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
-            // Modified to accept http, https, mqtt, mqtts, ws and wss protocols accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
-            hostnameRegexPattern: "^((http|mqtt|ws)s?:\\/\\/)?([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$"
+            ipOrHostnameRegexPattern: `${ipRegexPattern}|${hostnameRegexPattern}`,
+            mqttIpOrHostnameRegexPattern: `${mqttIpRegexPattern}|${mqttHostNameRegexPattern}`
         };
     },
 
diff --git a/test/cypress/videos/setup.cy.js.mp4 b/test/cypress/videos/setup.cy.js.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..59fb3971a2a2764c11552877131bc4019218211e
GIT binary patch
literal 64989
zcmZU)19)UnvnblJZQC{`wrxzDOl&(7+sVY4*vZ7UZF?rRo!c}2Iq#f%-}iOzU8}UJ
zYN5Mo?F|3`h|OI*9W0&gZ2<sKz~4LY%WC9i!eZ;d&H?}cpv|4k%m9G9R$Ege7l5Rz
zvzZgIiIE+#iIbU;iy5&Iv7MPav5|?1y{nxIvArF!vzd#l1F?gVg&Fbx%lp4Lfr{bH
z>`Y7n01zMuS_293`B||ce%yJmD%G4yze2o9c5&&!%E?a5Kx|^~WJb)w!A0!E%EQJ%
z%)!oKYQ|~~BuFs=8JOgi#3dQniG?*pft;phCP0Fyy@RKXnYjxwD>E}211mENHxT*F
z#l?Y_iOJpFozczG)Xd(-$d1w8$%5%`FO1(@Y;Ax%_6{zV_IA#^Ko5<LO!!%doy^Sn
zS&2=}jBV^qtod1ZnR%IsjqHqUJe|$>nLXHenLSuo*obY-_`jKX5IegX10hag2WL;9
zDDZ0FWXjLN$P5$$UWjciJ<LoE{%T|aN*Fj9*;$zJvv3ldd~>q5H8KE-vJksCnc3J_
zIs+kY4{lQv7a(BbXv@zGG{MN!%ihk6pOuB4g@xGM$l1lf!P(l<;V;L36gWB<*qfUJ
z<Im5)O6>9tI6kI8MXba&_V(6B-+(QH|3<PBJKI>A0FC)?1T(Rn)4xtkENy|K3e;(7
z=VIn$V+3RZ;*D)wos2vUOzdqPj9h?i6JU&7oQy2(fGU8DPDX!u%$<yE&7Aq!h>Z;#
zJb|#KDKK)z21cev4u9P+HZZm{a{k+irIXn|$K1^<Exx%J18MdSW_AV^_6|Vme~^E@
zvNrPs>gH$VVE!-Az}C_Z*d%r~F|#u>adqKmXZ~xZlhNOpI+;0t1ByGD82o?k^0WPI
z^P4!C6WbaC1N+x4V1u8Hm64g)@vk%d%#55s(BZG*e|IAfeoh`B!r8^lfuEh&(g8S1
zz!?D?L||V=j=%}<cQ^q7000uPS$Hs@yAAy%ag88JMgt5Xa#ZRMQ&D|D(8$k|;7fu?
z000d50l7y->dcRPz3N%TjycG^+)BOz07zV>KgLUv4DO0-($yb+*D}lFBJQEL(dg5X
zidV46Dq`qS{>bloCOC4Bkc}?n--NTu;82Hgmi10yB|betY6!JfG>^r2X9mQ+E`!+I
z2fg)<u0eRaWPC0PUr#95F1Ln-A%}^nFo+r(b!xwTv3ZJnWICFic$%|^E3}|a(1n-v
zH9L8<_nWn*u0-IV*sy~~Fj%8uID>%kkYQVj+K#g}9G0<$0xu3Lx?`)?s|U9r7v)NE
z@`MfpvDXkFCi=KdlLHxq3rFu^1kn&Cg&QbK@!WVm>sP5@7O$_*J-5>F)`$W5q(5S5
z4wzEeGSl<Kky*|b*j-4W_xRNVX6PK4IyqEE>iwFWo^n}Xj|A7i<p#Y<qgaU~EqE9~
zd`D2jeqNjDGi(~fOQ`eCy)7o`)9rRs8iG-0Yad!I6Lz2+)Pen$w`1Xg!y;#vS%}NQ
zGJ-p#bP@}UEf|2?Ef{k4CEo_O*}3<LkKB0UPK=<Ksmpx*co(IiFuuue-{6RDba<<Q
za8d`rupw+5(_t|i)87<-YSW+F_f`x`uyRGg$lHC~N;049&bUrwEmVI%$j(1(c{R{(
z`)AK$a@&SOsQyZWcqe_L&g0|!bMf`(@J~{(g#)}RG`Vj13Ff;<apXry@sIR7`Ieh4
zg2))Ch)~hA<ap&@2EMu;xs@Gtyq26dn<Z-O3@WLgvq_NqsI%##@o(dhLS)ZXm5aly
zbcy8nR_!?5?>z{kK^$A+(~$*TthnB1KdUDW(Sj(wy(;|~oqGiow%nL*wk??_yme3>
z0L0btWI5rzF`kU2A7T%ElJP~WN>`&8h-kjNFh{W&l%~6B4uf)E#J&zxBo-rK)F>#x
z;+So@O1^eoEaYT6TtV<o*4EQ*oq1W+ol3+MsB4G&%Bai2GuxIfK*841eJnYMrnZVG
z6d241yHaMV^wkrK<OYL2YTp~y19r)OGE=yj8F8<9jU9!1Ay)W`A<!tq?n<ueKDN=}
zb@hVR{DFx;l$Wq*dbeg>F>!N+pi?*8t0m<~+jh*?ci#1*Lq51WWFi3}mOQI?e5}$A
zuBo`Bw^$!Hq{2v`=L)r%OZf!BT){18;-r~h+-mFmrC@nm`@<^q9AfF3DVKsw{&1P9
zl=QqF#-)?@3QNnficX2OwdLdN24D090=aOEaI0pf_uX6So5W-s1p4IX=N*Lq^E_VA
z&lPM135Jeb){q=x3j5eRS`A|QVE(u_4<gV+e&huwN_u4~W6S{?leX+^I7+!KZJbdL
zPcaI;M0;VRj4}~4kOo-Eq|)(Ylbjv}R<F6uR_Oq8U*F7`n#k@Y?=KyS#)P?{M)0Yq
zJq`dw-OW<w)=+*VG*VAp#8E?j4?5ZXrP<{P!Nx<ISix?L>6z*^`gQE6iOQAyB+=V)
zcDLAHx};$(KRd*Q0ayCPtGm3n3&czmxjdq1J9hQ2M|uh!riVtmZ)LD5#)PbktxYgu
zGA;P4iv><8PRocHVl7)avSERJX_(dJU!l{6mq5<v*RO<i>g1utjuaY#+ITL6NA{)S
zcGoexqBMTH=qP0OOLOajVPZ#{>5MeVeEGYeU`Rn>q($Tq!&+-6=4=^T<lV&#C&Ivy
z7Y(5g<&BzhLRdSev#*IssKD(T*3K3JWb#qRV((XzNOI3!$U=K*c3h+qgDP*Ade_T&
zZ5;`G$}0#Lzabe({H`Xx^4}m<h`~A^)lkov^t9EF93z1y9F2}yeif|<y<fQ(WxAlx
z+bU479XPrX5i48Xr@<zcT^s+pxnuCh6#t-fj>Ms+L{b_n0e139P-2Kb69hHT%_9{~
z?`@00kd_mT2VJRXTm2wyQkUfX26<!k)6*VQ9@SzdE)eZafY16djCy^*$}c6JKyN#Z
z!%w5nk1d=z!4jI#GUcn$xqIu)NXC4u*XkEAn_cYK$?+FXAJjKEXKx6I>3I}k^1wZG
zNo$8&RJ*T)@QbzgrJ_idPE9&?QTZOFE+VZ1tFVE`wngzFp&%t}ry>_Oi}u(_()34&
zY;rIp6|DiEAV)5bHTJ@?nCoKb<z2OUVOV;WOI?eDOz<BxWsIXC1O^OC?RtS2k*AT4
z^*A=T<M7vW7TRNi+#pzc-_iA!<V0(|d98Hk#`+Jp9xC<8e6Nh2aqny@%io!cE&N%f
zKUZowU&86hx*iuzW-h{|h}DJ5x8P?r%P^!T*p}j%hzVTAR_0j;?@8mLTm4&HH0d7q
z%^SASOB<OlD2?grQNs^n)%{#p^jgP-0M<d$WizCT5D(7k#`3dQ$yxxYP_GO&wR{IS
zBm)O@QK^~+hI4pq06^=;?j+UFN3X-?1OZ@P;0^Jdg!mPrnmy;9-#eSF>q8v&TlpXw
zrpc7{J7N>n=>A=Lla}NttlByLTO&bOD0uA?75oJp)gl<`e&7r|`F*#dal9}<)qZrV
zpHajL1a0+FVQ?P5?HEL;S64l5UfR6JS8YW}yaxG>e3d)&>;6X2cgXH4?_Eb9*Vk74
zY66QP>UiRNPl6V)*Kd$;8d}C1<;NJ-Kg)Don43%td&bn2gZMIoM?j=@Q;b;ePG08u
z;}9BY_Ho4v<B3FI8o_>u=5C%eIc`tc$Nw?Tbw+vjD*uXJT)5s3u_#8k6^YR5Pf+L6
zdF13H<MS+DOl{Lq`d~dyXy465o;0^dqGAXD*gtlg3*HLdQ<zF}5jM?hMDg4Un(E{3
z?3-d@M=*JKljwJlX@!*WL+_Yl!7>^d_YkU8**iqcPYn4ALQ%tij@xJxaZp3x^S&br
zZSp?ML$*v?*fV2sQ1BV7a6lt8yAf`*aAZ$0@%z?xvfPVb_+>r@k(rA>_Tb7`z4ERe
z|0zDWeINh;7&Lb=sf-ed|NSvZ(h|tO`sDwWHD&MoL78Qp?a=wD*8?y&;p@<tiFVij
z``4urIx-pn>u3nA&7lO4aEAH-kUdlbU^xu(!Y)!&0D$aR)hD>!*Tq%qb1%%1?VtL2
zy+g@jxVd5xt$93Esgo5urh9>}sqA9={5e8dwHjU@Y#}{+E*)1vtb%5v+l1r8;lVY+
zH2lwbbgzr#6_uM)M{XW2yYJX+pc6z!-)IlKa>)a@7dPYtUjPTa(&XI{oW<<Fc78FH
zkaA|x<k@+aah3eQ31jZh^rQZYBPA=f>uw#Pki9Jp+8J=2@@yj-Wsq9j!uCZt_@-)$
z@&5OjV66q2i{v{Pnv4SgjB)S=)<pLP>31p1Wtk0N4OuKdTFUC91}9Movj&kk4vTYv
z3~@Fl1)YzgU#?n^QV)dk#?--!={GoA4|JX?!`{#bnrWmjm;djj?7EFfx>9U55w0@B
zWHaKJ8}phE`}Ap-!54g)>(X7ppxTa~N(U}|jK+5E$z9Od$uB>r&&9z{r*HJ=w64N;
zlo!?^96mQWi=V!|YlSvYAGmO}3CgCJ?U8KvODRhpSiIf~v&9`#aDbd1io<thdaoPW
zbV6Y%btY2txu!l-KTOn-WpVrpu~OQ^0aazTfRS$b5)%NXr7i?ueU}VUoI!wEI^V;o
zBi5oKnB)S0Qvm0HNUjk8no<K(oq9&P_8Nh#_L@C$Ob$ZZVmSMtd+h8xT0>qH(su8+
zNy5VMWD#7r{@w8RKpZ&Pg|<3W!WE`32ywBmxY6OERt*HYj7jTva97lNk1&D4suPdO
zag9n;oK+jYgJ|k6XXmvg<i}>q)y}R_ery&yN2-*1+qb2s1vPf{>UKx?^(5>j&sm3n
zwNol8;N^a>ip%~`vm&I0?hT`o{7udF<y2Q9>AP!}?Hh+rJJ(GVUrua-fY8o<^w=e6
zY&9qa`5q!gnF8chvLC*>K?+#?X20Y+8iKGaCv^k-W{fJ{P;5oH-|-W6sV@LKV65Jq
zr$oJf2ueUJ$L13$^P%-qklGxj|C^auAm~yoUCX{&;p#I(pP94q*g+UUiRq%eZ;(Zj
z7Ho9}s!wxND+YjTJeKk;df*3dA`+p7k8ID=+mCw<Ji;bC++{pnmMS=DiKCw^F7G-j
z7%{$#h5oa(KX$MDY&9@xXxe6#CVu$}fzevDOp56f;;F1=f0B`Lsz7dK<M9g|rAZ%>
z0Jtpj03b0dZ3>MpY**EDrtGsn_=7m!ygVh={%A86(ZyeP>=W`Tk{~;9oKbsW#)dcb
zx<bazAv*63*}D=adxB)1nK|7&ddMrZCpcJV8>uXXi=&0$W!P4wqPHMRK~UR_=9AXr
zka>Y#3`Pw19i)4N%-UsQjdK~kb!bB$E7u>XsduNTx4)0hxn}e|d#F)Q5fo@?mHPRa
zxiy%CgT|Wb#W1jT_Ku~GM+RrW2BA?vzq}nQ7os0RRuT&>JSt`kx5}Ow&zBX?pZ{Km
zID}vv1$Fq|wai4F-_{|<{IMPj0&P9e&D<bvkagpSmAbBjCm20CTP3BnQxch8Gc~L=
z{?r5M9otk@LQ-hGbozaV`h}dUc!G8TV-<~hhy?Y`6vW+omM9GZjdq~i%5Vz<)GY@P
zGIJPc{-u%;e`2`{H*+8giDp;wH}e)*Wcbm8Y<5ZwGW%0A#WOU=)o<$vnD{`E2CtB?
z+0a4(LW4;30Km|pJIttty|DRu9-xV4f%BSb`IX001&aaSi_N{#JORgn_Wi|zR8xlN
z?GX*2Np~DFpuq(GMcYWGu|au~S2&e>xL7m5)$n*NqA$px5B}s5sXzoUp+uC8@6aIK
zwYBo}qm+a-vQ+lb(lYw!c(z1~&Or#g!7$nl834b7a=ZhA-a?Dy?t!9Tp#&oY`U8T)
zt_KW%bcFyr4`g9xO+W5b48Z8HqHBHzAlZa_<pUfr=hvO=Q2|)S@cS47&<y2>2hzb*
zM6Rt2FcJZ0w|(wUYkFcD`QeCun&SZs0l-4bCO=P?oQT}mH?L#!f15uT;LOkzv7|q@
z(cqhHCCQj*&p$M+HUI#QBLsl^B;eo-0D#0j0RXGa0EkinZ!{qQV3r;LDChw|NwW60
z0H6jSv09d6?=JT`;1M3V@Ntue1HeBPBhvB&qKh;m0rtB90Ki2!gWN{;6O_p~?_US@
z;S->)Womd&C#3)(JM3#50Us5VL3dxLranY(LmCE998yf``!_LG(yOQ2V4oQe3vk%v
z%b(?`pAFFdJUw<XI|PvETpfl8Dgwd9QN@&jbOxA<tUUmqmV4uZTvPg`kthaGV81NF
zIU*jxf`$MPlKvI;|8n_XIt~C3f^v8T{6oQ1x|OB=gJ7kBLR=s@MlK>mhJOIm53i6h
z$p4qv(m)%*e?<wH)r0@Ywo?BO9W)UrN(z!=B1ZCQ_<xD~C;d0-{EGy&0CF)1XMAHX
z>}3J~@O;8s&wKtiH%Py?9AEk(JWJ27FWKFT@d9x`0b=2tP;nG`&Hv5#zhH3Sk2HW7
zB&P^y_5VWutvUbz_}Wr`@6fG49wLyO5}<kiKc4?^LXZQeNSkm*<v-iFjT3pw;!T}i
zJph`;pP)sY+3nlqnT~#SD#m2ukZDXBnjZTn=7M%6r^#<mYu=j3`M6iIKASLf$nC7N
z=FRvhy#U&?6Tu#+l&ToWwb&v?(=QP-rzRzlm{PZxFkY1pDOVRnJEqel1s8~hzgs^B
zwxulHf4ESWzm^DRyGRV(5>6D@Q@m1?|F(_-+)HI5w{>%8UHC=6SZ0S2t&?Pz6pvd>
z%dsRqoXi(;PI)P(B}^v<xhgie-MB$R?*T|u2^+1SehbmHMC~jG8aIo~U$mR<j7S-P
zJhUd@T#v1AMAcBblb)mgkzG^`*Wj`<(DA@mU!Jpn_Ri)imi>xGdniu?dCsI<5Z1!1
ze4rs^y%MyXB(d9yMOH2*lc?r1tb<eJU;_T!hfKLUfh=~#*=84hkUm$rhQ~)s+S#3x
z8r44`@3}2Y;q*kp{<_}1PRipK+cBv(3|a`9p)%z`%LS!h=?Z~jg;0y**0`tJ6^{3-
zh;J&;j<kryJZ>1=)cIn2h?-n5-QYG8-%d%u)yHXj>qOSIJimcae-UBp<78^bi7t(@
z2#qmz-jco*(tHxT&0AAq0Y%Wvm`jj7#NhT3+fRzaZGpuAZZ?ZT4Ww=doV4*JIls%b
z<2j(gb-Vq~ufblfe%Wh9Er+bWXySq=DFjzd$T#b1|4PuJa0D>ZtRJwl5K<ki=oP;W
ztUP?Za({hkwXAktwLIZSzNhp)^$gcg*TCHg{sW+T<o|V{NoX_Ln=*{iu(yf8egJyE
zCHRr^*~!Z)VK>+j9uam<NGo8RSI8>W@E%mbC7_iT$In%1(!81)=WYVN`5tM*a$YGK
zDDfzGF`%yshgD7v%3|_~_Gb%wQ5O0{rt!ATCf^n=hjT%~taxPwc7_inh6CqO%U<-}
zy#3ZpaxWR*t5I@ga)@VRp$UIBiT&`iQ|pU-BE5h1xA97;AT~`NUYHj&itu0K<_m0?
z$Bwi``)8CaIdr%azm;;-;B*LvqE*wC<&-uVB_S8o(nOfmovk~gsRq$E1FKJuh&mYl
zgu?zNDHIIsoVePOKBa>9x)~g_pe{>^l+Rvw{VigCscd_Rct$xLz)5h9jmq!tL{A9C
zSG<D}$Nt@5Xc;!3Lv>J0UwU!QxyeJSH=yUMc12C*;o%Gb6tv|uBb{*sdZ9Zzx1trb
zqphiQ@(cEtl4X7Kjzp&5ndP7r87^cv3-RvNaEFi!@1H6=xK9rAMzoI51~J!_VXViQ
z`uSN-QJQM4Yp~{Eq*0=ZL3S=zCtp}C<C37UIEzS5bec({+WxrCvxu7c(<vm*|Lz%Y
zqS*4X5R4H<&qwaipD(TvR0-zpV=Q3%KI<8f&ik<8z_q-Q66X9Hfag!ArX@hie#mT`
zs8<|&r+Ahe3w_LD<tzLO;winTt^$8e!iiB$=dxzKJULiAE8|9?@0X<g5H?Qtv|$7p
z{;sjm^!h;-l5DdMBINU08p4s++V#corKdgVC0~*)ebkCn#F^?mfUwj2fe}pb^<dEb
zrlcTR;v2f&*P;$uvPDmUtU~t<dw341kD$fayzITK{SV7}02>-}gCx77W&!3m5uajm
z82*DIVM|}x)dTXeLfiYainhZD?NiUS^XsAxs~Eo9x;tx3-?>p5YZ$&8xi@y-=H`R!
zWV8xPAJw!a>JSe*G^7a+a31{Rq!h9NtGci1>pw%z;OL>s(ja$#_z*S<gJ;1tPNhkz
zpP>pp1l-9a7$^EaUdJ)9%oo}{=)}{a19yKb6x-{VJzX@i&^5r8M?3;=Ax54XO+p?A
zF9%gG^Iq1MDEq<Ht?dwZQjwM^&94h0@dwqtl(otE#~wK|L_s|z(DHkq^V`7)y?Ple
z*D{21AZ*o@7uHEF-gtH-lL>ns)F*S(Voo;?O@$_W&hy=-f&!{1j!?;MBLnTHvE;|Q
zxM3d_6#isBSOHK&p<j`2Stlyr=AzrOQB2`5Z@agIjTX?|s~j`$1;1Q5Zww!Q%t>6e
zW$oe?4<u+lCJuS2u<(dV`QMtTyH)C>C&sh1>ptqH6kahMeW(*85UOY4%5N#QFEtNm
zLYMT)dXwuc;z^NMnzI=G`NFQYE7W<d!B7%_z%$m>yn@l*@G^lo{w8losIKS`zepJT
zW@Bg&g~Ej`irbE|vk^-9rZH$4B|*jNer(tH_%Mv)xm#pPJLy-;4p%4e8A{T@koBEj
zhct3@^YU`fvSoE+eRfOwP1f0V$LWw)@h4w`+>0>|ai@0&ME3Xa+M+K>1uxsH%GLcv
zfCwUpc(l56Mc=_XD)X#t-ZyFNBl?_rtxOCh*5(z~^WR=r>+_DEIXo&$G*5}%3yV&(
zYLCG=U<9?i-Z>x<N`Y^3D|c<fgb)4$6dC~G%+aL%p(e)5r0mh^h$jq2pGjfiNNMEH
z5aRDKYTYz-lE;Zn?Ko-sO8LL)W|~K$pqSc+U5qK~n)3+(dxB$n%ulQCdcw=R1Oppz
zA1{GY)C%{!vTK$&n{DVH(?jyQzl;ccIFr7=<w)@C*6n#+JkWQpCA{r#mn&J1h*P+C
z+MG$_S2jJ+>O48R64k3hPRD{w3jDzI!jv1{6gL}eH=2$?89yb_?j?KZ{#r7^%c;7X
z_+{D@y$S=RMa5v=;$Vu3;yLh(7SAaXE4eFD>ye)?^7eJaaDYqw&Y*co>a5u1(1ChN
zyI^a2uR2Jz%!Z;%EOg1+&xH3kxy@p>Kwtb$a}>l6Yy%^Li`$Imqi0U=nm|%zmXv87
za$`+l<!cIFDR*L=KwK0T+)63AuZdm8s6Pm23{uWA-mR-<-(MIMcdK*jrYC&XP%O_&
zsW%<Gi=a~3m8`S`i)pxu=8!G}?h72ui`_@k@&>mzbSwwWLfSzwX?1lU)~CbNVbNcY
zc0iS`$aPttRia1miAIW|_KI$Fe5Zy@LLQwDsJ9*z${|QA6KIYmn)T0vY^AjJkwyrh
zDcxyYbpa5?hKFHn&SpNHm;=a?X<t7=-kHu3+%8>T2U|z|nIO=hv|9_IAG#3p$@e}b
z$=7BrIFi<R8^lyiw*xUJ;pXklpf`y;4pD4(@EfdN8Tk_N83yBHd`YwLFz~0T*dqch
zW`&Hm^?r&onOvf6BN`Y8)9ySB*gfSb^EW{MWKld3Kp4E+w@f3G^=;6chpn)``qUrd
zNOS#(PIb5UE98ERJTj~E<MYTz)Ug{wH6U%2feH@J8$F))4eumd$0xz~lK~^mN;6|O
zmZWnQ(c*)dpuVF2&Nt%p$IAfxpDX`xW=m-fW?}M8YSL2(*(yID&Nn>D5(m$AjIqt_
z4?OiR-#J52s7whntbgIqo~O#9-u)o$<(@f`oh@6fCr5t2Uh>P*URd^8QVN6kqcNyu
zYS=`NwY{PH9WpAi>X7c5(;ZtUp7CnLy=c`mwN|Deg$ZtvUP9+9LlGhM{_Ad_kgBG=
z?^|;dJh`*KV>p3?m|STh3<(tWeOb8({tTaxr7fJb?>4i-5}~jPw!t+^8m5qzbCUV?
z_i`;tNC2Y8N}m>8$xM#xHKy4I)+IkukAI>_kYZ*FZHc=ygcH);*a*RmV+?tW)xk)s
zr3$|RX20(!ER8eErmP$o&E91?t#_6`g3lukysHmgW(A>56FjJn+-g6D2Tm2_KEg%H
zYMp!iCti@>$f$h)U!0uT78|X1n})*jB6aHPE9cr;1s1G}D!qW%qwfNZ8OixOg08#m
z!S;-S`RYS60$krRElgP4O=vHu=~kk}To|fJ0_p;HQMJ9dx+K@((SH7H5^@FFmVr>N
zlD+$g%Y&E>IxgAfuF=MW<fSjgjVFE;)r^M45q1l_H$)(pjXFFY{Y)e(_o+jyC13wp
zgjEM4ODQ@F<Fs@OGyh4}QlTZAGYM62erx@mvYL6P8GIwxH6-WgYpc+dQkZC{+o63q
z>192cWwtPgr@$E?1>Cxyx%N}l<5%pgeX`{nrzgdBuh7j4yS@9lhH~ZmcMInyT)9XH
z@u{DC8O}Ph{HTjXV(VTHIX#!Tj6*E@S;2&e!S>9F7Cyyr;``^@=U3~a+lD(kk02an
zBGl2YBsu;)pO&P%(=)s@dLpf2`;HY4e5Ns`e&d+rwYwRtKW}YWM2{bIbW27);*xA-
z!R*y8W@70ABXl#&yHQGqXwH?j2UD|5-W%I~N@-t>P!xH<F$u3a$B`WyDUFgzSM9iu
zjg#jg%mxGCW0X3137I50+A%h#TAL(Zys!)?9;;rsg&*hA!37PK$jYJxRKIYWw&tYN
zYJw#P5-q#@cM<~|XPo>G2BtLtap9aXaSVD3%@F2wm#kbbZV;4q%wHipz#I+^c^Vov
zzwPx}D@-t#CxBvX2*wr}(n}Wl=)X1nCkp}tTLvluCUVDrbHMwt@c)PWUriJTAeRJ4
z&gtKD&wLUh==V2e$D%+*HCXeW&H&J9)ZqHvKrHKY9^CkFebxJdKUIcRmVXi|iyJ9n
z(*G}&;C#S5(n~nw>TlWwN=2;^@Q)1H0f2L!lnc5~dCb?Ch&89L1*;jXfEA1roy(?=
zH3*5AIhc3QIh&^K*J1MuC7e3s9whGzaisICh`Kf~`HI)Z!JI=o&}|CekPd!^sha;#
z)x=a1Or|o11TUH)+jsGV?M?T{$ht~G{IFe6W!QO+mJ832mdnT)li+Kp<%1(2AIkQa
zSf)Pk;n*{+IV--1w9wWf?}c4EhX?4nrK&rtb?BQv8a;~jr4V{|lWK)!R$bPZIY<`w
z(UBmkMBhWu?h>d;j$?0W|8BzNK00NMl6m({M|0Z`+p$}wE~Sr6-SaA}d-9mFBL*V@
z+bt?O7v5i5fH{3+&6LF?BTG;t@xI0$oA$=^-s?P~pi+y%YoJ#?uZbykdt)Vg_-(x-
z*dE7(D|;+W1Lpg&r+Z&jn8j6%708zTOXls#F(j0|Z|{$K?y?)|9hUlEoD~eD*col5
z3Gg*GWEcu$&Pg~yMopabi16qy3-No#O-_eyi>$p~I^{J)S4AdjDQi}u$7eLwbj{_u
zmm=JcQn_89)Gp`GwwcaY!m+jEV&Al`6CjVCpQBUjiyYr1;WA6iFmASuiRwIr51=d7
zR6mk8^4Y#&m{n#(gHNK0pQZS#c0sal^bwfBlTsTqzaCIUkHXrbaMH1__kzxV5|tQi
z$iS#L$L1qx+!dE2kdz%bPs%rNu9Qxl*8F@EmebkIC!8J4uu(&eP7AA6uw`r4XmZ;S
zLs(V{p@V4Fz>vDl!BT~8`guiju4AFhSFA?T$9(^&TI8M2fKwuejw(9uRsiL{0gX-Y
zo?5d`hGw@eUY4Ip@W7!T%Ad8`3L4q)&6xt1h2wYrsmIE%sX&hLwB@B6(o{5p%EXGG
zasurKE80ahsCfYURz-d2Y5|P|WG(N4kiY<wpAf^n5YMdNeE3ig)Jn&f*Re(_aa5jJ
zYZwY8m9@ZONjCa19lw&*CwbPUp6OnkA*~$wAYF=J3S@WI3Q`Tp1Em23eq6jy<q8aE
zo3$CYe0{Q8@<GO6`QMouMAmWep<?m$A6Ap_-(@$SN=s-<83`ZASmrNZTU5N=y?BJh
zGxy)4_M|m*gYP1jPtqMeDH#nC2v=?q>lPktebVxt#^<fm3A!lQp8_U{i88v>PA=Wc
zLW~~k8oqkHhAH|60M{{a;lpMoyHS?@1wq4DN)qkS6eSxur;YlrTmT@-G>%Mx-AX#!
z$vHp<kjEcnuAv>tmayB-V2m1<0D!05wjBV>sP~jT`~nSS>kwFLpAvihoOwQanGuFg
zz2#s700hW<qgT=q8rQS}0Jy4)JJa2^iXcw;GQeWmzEV5@)v!(h0QOyMCjgLBJx2_n
zs$A;<z?{xc06@KZpn%90$Q}SyjS4paVFcR&0RAA51ORC{XAb}*apL6xxCo(V0H_v8
z(E!N(dvu`8)%-H^=`7V#UM$wrIu4`xidTr+dZPi!da^|@h9a94J3{CJ^FPN46M*}e
zx^OPyziqSJJ9|_H0MZmJa+9cy9KXICy*2Zfjg7cLGfhGZOhrzNf3+ltQ5T0*ZxP)P
zOI}sae+9RZMIW*?e<cBJ)E68UCSbkiuL#`Vf>Q)YE(35IHL{@{fm56Q8@=z+%ChEx
zy^$b{eJ+Oa&QEujwW@x1cn~8Sz>;!FOATo30DuZw@ves|zc*I|5v!CFV1`>6xmK(N
zXL;?xn$~wY<)yZq63s+<8Wp)_2R7}xX1hCJ@UsN3W9<1l=caYdL96JW%@n0Tp?^Mt
z0h$7V#@K`8G68pMqux(IymOu`!BaTelT0V%pU)~dr2EO#I7cI6$Mk1^NJ7y<3LpCJ
z^uZhzWA}O{8APae^}2>PR0qJwz5q}s_#16KM2~P(RO*I;S!$!kBbZ~1&|A0=a28oN
zmZ|+$mkfCT0G6n5Ci}l_otBhI;J*mK*nofK?SWk1PBsP%u)iz0s8(Y1lkIB}WXOo|
zfBS^OG%XrtU(9E~BQn+ovE6Ix>A?%B*f?m!2Ot`PL)QQR2LdL40LDY#Nmc-WWUeV{
zQO9gOUC_7P6KlzceOr-Yu_=geyo7A_T$Y`hHk)=+=~owvBa<5$y&fD*0L*cE%M0GB
z>)oB(dY<f;JbWb_QaW8@gFj3KU8^tg%=?lr##8R7Af$C;T)I#LOB}c%G4+0onzb-c
zAO|U?1_8dWzpDr|R=$Cgx|Ix|YXsv>+(>pERHy+ss`lsj($sLee^lOI?vga7DyH-{
z-1Z{ZpUdVWXO(;?L3e+DbK!DH3|$aa@J{pieW&sG<8x=(_hPMB*U7ajDruH(yX5}8
zr^<bWe?pwC3OQl`vN`sbQ)nYCo&(0Uq|JqCJ_zVDi;{uJWr(vasiNmjiQLylGv<bS
z4ZR;h>=Dmp_>Bn)-lyIEmh;v#nBIIGl9xy?F)Xr+l|kum3oyprgfeAjg<REz*YnP}
zIq1Ivs#};&2=Scq?T2pnPIz(H3cJ^AXmEB#FMfU7$hJB3hQqNy#97@4y&EIkwl)Z9
zzC!fWIrAU4`#Q+&M0LWV5cjs7l;|3x1`&i@YHq9+1g0Xuhi975vq4G2-y-NZwAa2J
z&Gl-H{814Q!<(2E&cH%n3Z8jPeHeUmI6;D+aQsEvpc)~cQzKz;4m^)*8+)Sm>Q$;*
z7PjX$%wQ;jTpds$rh{nZ1i}$Ee2@ZSfunZY9urg-LrJrRMNevx>2CrrMw(74soV|~
zAXF^_zqa&Pehq#cZI-x^rcn&VHmA9J0XLSQnx%g?j@ZW_%KB%A%AG9kGzWP!s?u&Z
z@f~Slokm;Byum~)v94d;rty@UBeAtnDQ4-Qd8u#WtZ3_Q5ZhzG-@|rgcM0~XYL=hq
z*d@g0J4whyb>&LwvU%c(EyPwwl_Z6Yx>J0>59aB}7Gc~g%dbC|roK!-pk2$ZuTwtG
zK8(N<L?q+JQ5$0O^0QKp;_nmogR@vUi*3ZpO9sO|<&y7F`PXdy4C$XA-@QRqZPD!L
zBtquAO!#o<tXP3Cb~w}M+PMh-a2oZ02-Xh{HRV9NNtH18Hr9o#nD_eudUZe`Iq3<*
z1t#+Xb6V72j8QBKgug@RoI!sbz=hjxr)acK$i=EEM&_Msqpe~LV>&^|Yz~-&j$bda
z+ctlN95J!(wdb2tX6A$3Z`NL_gRZb>ABTfFzHI!em+vYBSGI*!s6dZEB)>P`5(yXQ
z@TFRDJn~XCndmLN>J*OLzhcUnug1%`y>ERhBeXI@GxTG4a%{NkZa!vk86Po3$M;^{
zbG;qO<;Z?HFl_b6S9*fr;pg{5tmo6K^je_;gfd8bA==n<t*fW&=l6?Lm7(iP0jUcy
zC{5`znEXO#pX+3<?MCS*&c%XjOL?<0L8=`SL;i%ZG!8|9NFxi`1HT&`XbC25=E9Eh
zE60qMH6H{o3DK2wVO($X4f)&qsb)$Fx(krXo-9IwAjES>`=n=Y!9h=8b)peD=>ta1
z_272?5-q(TAxyH=V`Dkh=!Kl|yN3+yRrwvbp2-9go_$>xQPCs|?SjjMva)JdvSIaD
z4>tiCD1iZ~^;>6pY)9maDr+%{A_nB1xn)XB*VUj7GC-E5L(-_AFEAm6o9Z$Pyk*Lq
zdpvo8=Rt6g)ezkayorUm6ws#vakplaiuZAk;w|w~`NL_B4cR2Y-mjyp@0_Cp@-9CD
zvREtG7$MmD<HN(`rvu73n5qB5($gCnp2s^2W5)gOpQ&_U#XRMqWRH!tq6J#SdX@;T
z(yeY>joIavm_#;LiK6tly7%%eTst=7OfKxkUk9K#V3mh(g-VS|MVfzfNevrbj~>;0
z=qvDjTHFISZ7={x{|FIz@HW*<3BEG(`Tm-kQ+5A~!hNwFRwKb}C6>c;BaiUC(ox`}
z+m+EVgEb8CdN3D_7B%D(D3qrGU$<4WzOI_mH>QbUadwQ`2MwvQ?i_?6wkJ7P$r<98
z3Q(Wo{w|FV@W&{qM`7&d;66pcN_Zqx<2|f9Yz2-xweir-0XxTj1-cF_`ZyTAF|-hC
z+!0q%i-00kEy#+KX6hrWm6M!M8a9x?89hqsKaADBA*hC~Co<~Qry5m-%x<<?u^4nv
zazxi#O0>M{?OT#MbdG$F?4@W3l=Br<S9-$I;Qsrd&+~4`Vom<Mnd6qwVNclfG_Qt%
z3+v72<Od+gSl&EErJsb{6`aW&vT0DWuczx-;45ox8-!Hf*J4ou#M17Ewj5Eo)j+mE
zwwD6f$VFdq(V*!E&vDB`m8iZB4QAo^G)y8R+vqddL3!_iwoBV-Hrfl0_6;(|`*W>k
zy=OFG7V%eFav;K<iae8A1o#M`pOF1fIr!{Mti9$~=(oLmVM|XRhPPvudPi|DZWaYK
zwm_P1JtK{oXD;!Ygk)Zj)!2%r3|i&3QR}!%ysZ}ncnNo^ny%O&gKaNlT;t;gN+@@l
zsX9)XdoVzLi}jrI&%l`we7$w6LY>ctagB_Xx}hAw>#VU|>Vl5qf3d9-<X0cdZ~5dS
zIr5}$4SOuKPJkG8jn*zF{blL2muRFQb_vneUQ#cArOim}QTaCG&)m`ZzWF<R55f!q
zZVPOv;YpUq@C}1E6Q6KJ6k@ZCwI~1YR04GhElgn=*3DS|ZRtI^EIGUBF*^RqeVR<%
zw_aQ@QVA;Bu|Fj@moRxW=#uiBSyDH!gb`mPxy38@qU+85MTw7twERhKlFdd@_&`dF
z0RD_Q<uar0UJ6>?by=xMqHe45@FHFJHjX_MGQr}_z{3!%$NKc;mrATs;<dhL30j?9
zu>|<;#siaQFt%BrZh4T&cks!ux<Ypb$NVj@eBqqW_nokN-E`{)(KTLk9P^<=j@3dM
z?z8WwfaytkKlVey4^XL%ZfBF64aX5TX?sLk$nFiWnp?Q;;*JuZg%`B;(=+f6r)6U!
z6lJ?VS+l7stz-ImegOsr8g^!b72DPL#~7<7vS)~~C3-Ua0ThRsSC(fH8`avw%lEYO
zDn*ADk|JBdUH8vpy2%JQ2ZcXmhY907<V^=&B7CokIXL9SS~fUUWV}u)386d|UaAxW
zF)2TkA0ZH;#ZR4n9({(s$CJ?SA8+Eaq#n2Hz9Uj!RI|A!*FtdcB~r_ijr%IbQFiuR
z>{CU7pjE5A-YakYh#3C#J9qR?0ozs2>Q0_D8y8Q2(JQAKI6H{OoAtEM--W>Vwo$g>
zh;)s&f1K%x*yLUBbwy9hv}NNVQ#~=)Z=v<cjGyA8>lJ+po$h)*a<P{j#622IO!%5R
zMAHv-?(cl0G%I&??U;9OGUJ%gK^UyDyN3Brk{julbAt?u31Xh$6@?rv;3-hx7@u7!
zW3@|I+eS%CJVe5gQ5zeKGg*Sja#CsbkjnJ<=YYeaU9idYor9nOI;1o2liRGq58gw;
z;7H6>Wo%S5`wy=jc-N6ZO`jJ6)<n+^Yt2NSJtaa8;#26Ou+x`DzS5=4IXne}+Q<XZ
z>4qI%`OoeIw;eyrhEZq!r?X}-FY3-TmH<2tX1u|Uzy~g-AEY%OOPrAkA%TCa8jRfw
ze1b}<+-5`03{Z_(SEY<CTOds@m5ZhYD9D~$c-8_$D%q$`lP@WU^&2t&xXTNlKfmR|
zOgt;0(qx#010FlxUXwQC0nigYN#YqQtrPs6`B(d+Hm}Q&YrJ!e60U-q6kmLxPn@Lw
z<SUEQG~5qzO2O05jKMK<Dk!G18BLV#hcxdjdI(_j<y$Oj_E{BJa2eI?pJcY>^7h*J
zw7VKW;|9QEON~*#LBJ&~X{U+t33`0jR}T=-<IseHnnnKRo2&!zc`D+BCW1SV$X>ca
zXr4&TP-mNoG8F$@t!G$X;+^eX#r=cz*U6cAFN41^Sul4z2u9Ct3*UHTxJcdtECmRR
z7Gm#(z8hb@6yR(AWFee--MDSc+4teb;S~>$lP@zT1()frEjb!zcb0mFG&-72nQ8;`
zqdlgv?5;#ewb-jpQ*?GF7sCK$!+yymI=%BDf)WjuxG&UIT){y!V``sxUZ#lD#J20r
z;tXMg!OTS0Sd(87&lzFq!Cnek@QCgLQwpz{^KD(*k9~P0`n7WtV<QPPU}kkgWh`DP
z3teZWLVZE6v9RE9JWe*8PY#I;6Z5L9qdhyEf@loEfUl<XJPfWRs8N>8_IdHVD_=(H
zmPq^<8>pR3|H-GGZ`0+~?$yIa&sETuI<O}1lCN}W2ZE;&61iVoeQb$N_f6Q>w|Tk{
zcPdBhPz1gaOqt-(fPvu&mVtZTj%a%`xaCaz;;cO}#UJ+kcostXmV(hmnCRxmv_Q=g
z-ln%Ysi}Yr8t+4w>Y9Cc7$2gt{v{t?$lEU|M)f|nqtTJ>hPht`j&QmvL#X`W_h8sX
zV{t?mqzDi;-&r`IaI}t57c!ia`$NdBdCL3{GPu58>1qBt1(6x#qx0PnRH=rmR5$5b
zp81_x@Zef(mOR4YWNVRhVd~QTd+>KFcARJY9{_p49|e2Ys7qLZS`sCpj}q)$d@YEz
zA-#U7nv2O}Jr}+85mD}0{i60c0(@TkkUJ`Hl=csooMSYJ<%e*~HDUWpYF3BbYTe8q
z$bi{`&86I;-14-hM-?9!#vBKSpX+F(LFPd{ex%)1_}^1DScI|fE4YLZXsLes!}S-0
z86C%rXIDEqehRZTsV%sZmQbvI-z^0J`^ly%a%U_bMU?GS_Nu$)lF7X>G0SH3M-lW+
z=<er1ME+z<wpC7?O|+rVgCBa=8@km)ZNRrv#ifO^5(t9n&L3L_^&mgOD~efe4fU%O
z3HbJGA~%I*e4JwDm!A9iZ~|s-b`KtRKUgJ|P_)HGJZsj_Oy^%UzEhkyHj0x)M#cZ0
z1~D|3HK0EEFoYF3+<@~$a5?Za52c^0_4978pu7#1-ky+K(rK{dw%A9rsc_RUT7aSx
zGOOWVX(sEIqO;X-LsTsU1wO-9KI1B?^MfKcm0Dj#nz`myQ)Um727&K-bN*L=Yogxo
z_@$R0*E$RA593Q}XChdk6NE4i)%XH$`UTtEzh<?m9rEotpnSbA-a!7O<D$06>1^p<
zep$EE%0Q}lkxD^5wfGfE>^6$>b65PZ>=B|YYeO=+(b;8JuYxgCiS*^g3nfvqrh++?
z!c}#UQ^P3wT{WT&v8B?X=bTTOrvCJa2ggh`g}+TdN~);y)1`VO13U3J%4y&B_6Uoo
zbA5oi5JROdSE%<H>`UY~ubjcrU%DO}XN~lsez&y#`>|)02@3Q3J%c@!X4;|y!u}bu
z^TWT;H~sJIt{b)fyz7y}!@8U4AO7gtpO9K|SywSbA6;;%+GpVQ*h;v}ip~yeNgfF?
zNlnrQ|Jf%IHYxh;`J=j7-(cNqBKY%xc$_-G=S>ab4Jxr^9v|+<dx)^?c(EO+e>q-M
zl5KtcN6Vm&fnTgx#un2yH)Py6peKS-+yGy9JQWY`n6q5Ta=B@ug%?YNAe#6~^4Qmx
zO&5AT-JyQWl{ERO-*ueA70pxeNN<54(2JESyysDt#PD~C>aI`?P*CpU???I%c;bi1
z7a!e?^clx3=$GKKcw@dw1OAA(xdn(0I?F3{m2n2t3z8JLs)`VasC`}5#HU4>iDO}A
zD@R7nHomsa!IkifM^j9zn)M6=$tuJ`U%%Pct4Ij5x|7IR5a_-xs>)8%{wl?GfbjN(
z9==)X>C3=sNvSg;|Kw`!)fPFPX0L#JbBPq(JXDR6Jpx7k+IU*RTObai3t3wR^>SLw
zg*~IisBb?@6MV0iMge|~J-veTCka|CsEOWtIN~E;bi+tCDTcorA&{DLh>Fi5bqsP-
zi=LYqm<agb58hhb>2!)u{(8X-S!N8)?8U1wx8rK{^psme*<>JGekGGS!1{yeFF-Fm
zelXSozCKn%bJxO{E>v%UZOSI65aPyoPBnVKOs*lX#&Z**g)5HRedyJH!uuo)^FX&Z
z=#MqjO)x%{V`Yk_+iK*P4wWRB$5eO=p5eU&;0Da=3;H#;^t#+I=SC456f!&+l=v^#
zh||-8XQ$<#8(;?wK-VAT2ko{zK!>F-X(KUd!01Ze^v^2A_nzVT$Kzt%iR9*qlfaMB
zj}s%C+YTJSKmCxC*4^sZX(=1g2hZz!<Uyc201*PCRxS39MLZXJ-`-uxQ+~olHMB*!
zt3SLdeGuSV6@HSfKIEbkorofg_BYobQLOrCvp>^`uat$<^hx?oQJ+()US_}098L5#
zm-v&Muh8(1+|Rjo1Qf*eP?;ktZKuT^<JQKau(m_$gJGVF;96kCOVXk=3w}rLl+U+u
z3p#>8jwdLzk==FBd$FP(YoPAt;I^6fJvvgiQ=FEN;LuMUN{M;qfF^N$3@)x;d&BPT
zzN~&i6LM9%pRysI#w?lLSJosvH1vtyr1wv|&hzY`1^-jL^&+-~iRv(g7>}DT(F;ZA
zPHannp`ty)N}kVD<U@|I1Gx1ok9f?uC5j{h=75kosqx^oJAYU{u|!)Hr~44`#qSAG
zH<?}iumu}9g|8Ch<mKT$_*aX0fxan+yLeC?lvtcl9607g`%du(W0^RZ02b;4li8dA
z1I0uulI$g-?HKr~TRu0_vIQs+)IDtr739*#t9r7Zp8bl}Uk!z!j9kft3mV?5|3DzD
z9Hf;}+U2P{yFy&=Kti8?T0nV<9Sjk5$fG-<b$s@N$)iT@3s@9bhBlIKF@O^mGC|iV
z?0}UGl#t#lA#iMwlX||7V4--`JOmqs9G`i#G=*uq_Qd;*5i*G(F%bTu498`G*`3lY
zw?>~fmNzJmQ1bRMiO~|l>|uCZ(yoyzj&Gh)GU^FiUTtl8D7l%mky%e%A*LF^5UEHg
zEMUvCV<+f!2mT=S1?Hgpi6L0A>`i8EL%*H1Y%}zR_`<?p-+BmsPm$weVj=wnZZ`B9
zIu}&!^NQmFOQ_`}QmTnlN`85Z+FXYC;$aY9#YiK;E%b9B_mJ~N@cWlZlig@$yGXR^
zDsUYCGj+GrJdh6D{TGSY!5qHl&g^9o`Y<7jf;h!BWkUp4qTXEFJl-cNWor$_qStkc
z2DZ{zOwO)QnJ!RdCU!3!{DNq!Lz2)<TMFC0HknHIHc2<`O21UnCo|)NvuE+7A%yha
zbTlsxW(RrrUQn!72iKPHD|=c#0h_V*!9EDs-ZJg1Sa$EX-g=(Xeg4L-y9TXe3%MvY
z&KmV#`&kC(;pM%1TtdNuWl`e-z9MVwni|B@LrTNA=QScaa>9$@^`N$48V(kwrVULI
z7~n~@nEGny^{)AZpI8Wk|2s@r$igCLT!)L)uQ~Y+FU@@Sh!%a;dw8tW-32?^98YR-
z)U)FqEyFHN>@UqlQmp0ZvUlHbrA>+hO#k#zV3ZOjmVKj762oV8zFH$g^&j4`zwZck
zI6K23Vhm3kLsNbClHR&IDa0~?4QlL%ABicu`S=~q+~Ft8fhm{y^PviC?k4<YM)BkL
z#Azj&DUhXfAMS?PHk5JJ<DyPfMLmd(P!hJu_K=OI-({MHUmAx>f59SY`kFTv>6}MX
zO$hO($+N|4zD%B{;Odc;Hz${b*554+O@*jk9OhU9)~Z`2TgS}*d&kyf3I(3}{l=C{
zp)MMyYIob3#$EFXjujIdB{B-0ldNh$v1o;gg)Qyy3oTj%Oq?cnaAj;K8e+3<D0a_~
zW=-9*c+U_GpkxNLE=wDwQPNI03$PV~BV&bokPfalog1fOO|#eBzOui^t}Dr%!yT6o
zjRcxgPMZi(AiZ0HyZ}i>46(3OdeOr$N^X!(W`3jnZQ#wd<=+u6VLY&M-!7c1^6z|N
zb|5bk(;wIT<Ry_E7g_hX)bRkWizoLx(vXKC0D!jpDxn47-=m|Rp9-+8?dYVa5jlJ-
zYEc@kNcg!$&$IWSFz^NdF*_1j<yiIUg)l^h{eyF1G%By=I!`U^a5lFCsFYY0N9Nr0
ze7?;sxus;KC`DgG<Zn*-NTBsG{6&zZ)qJ?~m_jh+Dh8v+eD7Mm<L9jOK;7DoE(!;`
zu&i4$2CCdTq36Qi^WU}pu)hZnk|4Q`e@{Uwho>Np%NW_vHpMLcR<V|MeSd;spY?(`
z4IqwL6M9WQ<Evp@)Cw7}I7-wxeg#c5rArU^Z$-eW6z~CJKoCf-^WQU!@m|!^J7wm7
zRG0==xmo~}Z*d-aWz;w`65~GEIS2p(+at(@;{zEWbf_~|;bL;=W{+s9-uLx)&M#Yo
z(3<VDY)DRgvkZlZu)}a^>j8%Ict@<}fuRhgk(IMkY(jm*aCKaP1CJ${iijn=|FHrz
z2mk<i6wdVccdWtuX9CXje~5?|mh8mSZD+CW3`A;o7jlzWDkX*UX&lWtIvEX`4^0MP
z3wjQLTrvj_gm`5<;|A1ov<1uI&?TOV-!ru|f6R_apUcJ@f`DZ3fX6~Hjl*{rXS^b8
z3z7%+Yzk@jb?l5=TC<7UN1&L!1mX_v3b60CWuq##Gitk+9U~#%cw3@uLPv;z=nRR5
z`E_=i1RGLmmrpLU1Cv&E0V*tnp*p~<Gp(3PtrVkz0!B5*W2nhbKQVk>J>dJDu+L84
zFx9B^=htX<sG6S}x)XO}7XvhbulcomC125H4OHuVLP33ebKbHXNB$^uxp85s3$SoI
zx*~}eky4A>nx0ktWb$@FVRehf%l{7JMzwlTuFnqjrE5CB=B#Xo(&>EeYndU;9BAZJ
zx|*FjZp?5J=~Cyg4Kyq#9?{D^!Ad_3ADH+B9R;2Ah6DSVxreju2-x=50VQ_1cMuVo
z>K0^4uhUm1mG#*X;jPp42a25^gkOl1)lT~G2xuaYV*tNRQrboE&DLuP?z`h=qAFn6
z>C`=!vy&9~(8To-`!R>$X+0&eN%CQWaX~CEHuqIY0w^JF(ZG-r-xkCQ1SU=^6==k{
z7wobH%)XAnwyDFB%2?_K;|RS7inIw(DH+6Lzv&4BC!m>dZtB0Kh)QDrb_bx~41bU|
zkj$txlo}BfR1feBAZvx0Py$=JB8xSbxRVF-YeLEyW5vav>UsLW=|S|-n_h5mF6+Mv
zxzRWTYiK>l_I0lmCSp%`bpD@dq$dRINDw5q@$aGm^#g$1|E2vOuHG>?v#4nozGK_A
zZ95Y?nb>wRv2EL&*tTuk#>6&Gp67i}o%+72{i}Da)w^nU_0?L}A}ek5ALw~81TaJb
z?K?z_>4@W$-q%UapqrTGN3joJg*3zdzb$|nezxER%5C}2ct+bdr(50wYAv$9AfnSo
zoZVun?O&0D7kdEx_y*dB9Ct4tuTTereF@?JTd&#&0Dy-JWp@78%&BPJasTHX2%?z5
z+v1Y_u-JVj?Ok1_z?F$bEVC!<X7_juybrvOU=Xr7oa_6q8iVhA(*^0$3XVZLhxEb=
zmCqxrSz>;JYe#GIB)<xg^wEj=s%_0?(eI|+*~IGQ6M5w<`mHt}Q@5cP8b(~0vouN+
zgA#c^0DeH7L$+VplVX$1x$CY!czjx4Y2&)xbQ{g#^X8v*`ZFjao}6-4<$FY%ZN<dC
z{I_X9VbObW@{MO#mAp7CbJJT~A573*T<9=?{tRq|VJWzZ+utxy8|&+A&IQ7}eeea?
z3lr_`?p7zQLLJQyFKm*Vi1-Fy8|YtZ8_#~5$~Y2ndu0m0Ap<5EdPdgP;GUIx?G)!k
zR|Re6Y9mEjF;@jaf10e#S~ojNI;u_fVOk0x)s3&O1qB>5eDjYCO)hSKsISC}A3_-8
zrYcaszTczAVsaE2ATV^j@uEz=n$&uh9R}n6+$k69B<1MGHn~#YKXc(8wWw}ZT4$*{
zus?@&U;XfpbR_;wlEaR0m)S240KQ-YW;)&;1g-F5Y*-#Heq;hN0!!yVTs{a;TRfKQ
z<PmGQGYl#T5qHd40~K#L^JxPhx+iD+>CccO1x4!Aq8*j-yg6?+883U0y+@MNqrTJh
zZM!f=%1!Plwk-~Jk}`T7@0=wR@5NfEGeanRGSF|;9x)5_Ta(30Jdr7AuodK$eIh9R
zV@FWSwG|W+A#0zvNeFXMVrXOmW_jPsb0rSMZ4z(_iJj!DI7>tgNoqq*1k|N{=26;?
z45EBY2l|~gzw<~=ayK<a>iD>ccV5a79&Y%I60+v9mUqXl`1!hXnAP*UsUc6Hx%UPl
zc#Q(-sY7gCxkRx+9PR2_@S?TA*F=^0Lvv(dt2+~Y$!E||$!cb}3rk&#fC=MwMQ7|f
z9%@n=_Hwy*Vm}!Ape=8_p4nWB{uy2JhSO7apD~Dbv}%3i{N<pE|B8UWW@}8*y_hF-
zVR}Un;cCXsV1OV1wR1#Fk}O+DJNLkcjkK_6J@yR>7CK&{lf*XEP0a0PzZt{>+LfIy
z*|Y2{uoa9AS8;i!=nTiWtwDqX0ulAC=PZY}j8G-s2OrX_U%$Y@8rw#<IXo#GtP7_t
z_ir!m-^P11MBTf(Qa-Ym*~NE`Iz|Eq5MjNhw<a&PyuR|qk8Mq<7Oxs@WYV}j{DbQB
zkC8FFVa07QEY7CV+j;DJyGV%6vIpM}yTvw69Cc$EjGPBS_i~N8ric!XSXaj6jRCpI
z6yU^v2~8OC(W~#G3ON^kZGuF$XvBDdx5DE)O)%q)pJ}F>566ngBH@sE<<9Qe*m-D6
z_!Dj9b1qWhxg%Y0N`rsnW}x#4F}qV5u$b?M#^1f1JCu;tmk`Us03`GBN(^9G=KaPp
z`AeyCX77$MaeGw^3sowp;#dk%4D2eW)<d-Pabq@8^O`|-M9Lg43e7h1;~vi;KinvP
zZ&@VB4H0mBdN0)`2SkdMO;Eeq&8@PqlQz=jf~kk+wnSx-zG7+eA;XP>PlZJ}l`dwq
zoroIKLtvlm>QfGjxYN}@c$0$k+HE&zE;`iJz%mjd$vt&tNk^HS1|+4i&_0{jLB=C<
z!i+~oq|bS`=&-44TdL>63;yK`Uk=gnlqrkB-mx!=Oad!>1{vHErpA(27Ic!uvf8u)
z4EPB))4=sOg?3xA)#IAkaIH8Q&;2;H5(Dp+<J^~|U!{tgc_nq(+GUsz_(MM%54D{f
zB;o@<|JiC}p~)7kWW_&aI2-q%1rLK0yWS*0Ao3j;Hn@c1L>rb`bLrfyX*orQck>da
zx{&$@!UQb%UwV8Gy(lu5H{Te)yCtd{d3itPdj94fBU(Z@-4bN&G9Bx?aXuUk8bGTk
za{~o(5?{)ZyB0Zo7Z&=;NilkiO5~(yFMth6VikN6=ar7X&7?L-U%S=8E|_5e<WxL5
z>M^;VLcSu%q%L^P!&YE2D4?u3hvIr7Hlf(0EJ^g3jEt?cao2%zaTaR*>TYh`${0lH
zE6|h4oVul**|{BH^E~4RXMqK^({2*P#LmwT$uSyAhsmp|3+n84g%Zd@r{G{8PUqO8
z<!O!-gSG~8#5ACioHx?tb=9~zX<|SO8>!c1x9Zsl6K@s+eaV?a-y_g%3R}PIb*UT8
zN}2Mpk4j=@naHOVsE3Su;p*-4Pz)l!+kM=bG|ajwaI}H+eQvn;@vwk=q1^TV0`I6r
z9;k$tz`Q4Lh+i#GIgF{HGl1#0U7PK3l8c6)iu0`Av{>vgIDhUDuVtLX8s)_1oFtf|
z4PP9hd?OZB*Bb4eXWWHgA*-nRvn4l);G6Dh|L5RwnMa)@{`1f#Ey*u1OHX|Os@FsK
zF<JD^{HVDsJL_hX3?%_Mk2J!3|F`hFHMHHE^@SsJ@ZvDJbnE|uCJ@cfN16lWzWxWa
zb6x-ti*Q|nKu|#NYZw49vT!&;cc9^SA5MtEkvYyCQe;9YU30<t4suGNx+XUT8|p(d
zp#7Q!tsejE8~|Eqn2iNX@`4<LuJqJs&^rws5jYBxkII|h|JC*Nql+CV_x(Si@R;BK
zh);KBdqD{2^4y1QvJL<Q)TSD#e<s48lL2cBOM?Fw*@gdu>o-D~yZ=922M!)Hd0j8*
z+BFEue98mn7>p_WyA70~in8L@{QIZURp`k>>e^5^H({O>7U1_S^;%tUS-F;EUJTw4
zxEb5W$bq&u0qKLz8}UJ-;G4^FYwyd@4t6Z~8LMwszF+HO*eSJ_?dpS`e9VAfFv9`q
z<a6`B^d`M_Vx3IAJ)4_xyC&VaE;j2>J@%{8)-~j|E0}@p8bk0mgy;c95TEQne?S!(
z0nsT5Lxxx6g_K7pa=yP`MDsrp^E^@#d{ms0@3krrMt;zD&&?L}e3Ic7Z3luvs_!sK
z9b7RWA&-9L2p9MG_Vs>i@3og-SL*q|4LufWdpV{hFsD{X?A}#O!46;vV~<jY7%i;T
zC-57B+{6`8r&G!TyS(K16P+AGdfFf6L*9!EfcuLjotA@wxzinzCK5wUKQlR>W<>=Q
zm-WM=fp-T-JZd8lq`YDYT3)MBXI#j=C9O^Gys7|rE8O>&c$i#bnJX=Yn}4&tR5Et#
zFfBG3Ksj#0W!AvBE~C{;m#5<<%-db&CqjI256ZaV(H%>a`bT~0)=-#)4k_Equ~;&^
zMr=z!8+29jxKo{~?YA`GE<NF-h8>de%xb-{PJw&ecYg|IA-%BD0VA?W7}@Ohj5n67
zAb-!(`#>-Q%)af22N64ocT>kEo{Qm?Cx-lft?Q0=PcH6Hrgk9a0xL~jg<i}2;ebi;
z<g`5S2>s^1Q|a=Rw)A%mc{u+TV&lqugvw>$`bL<v67*d;+cPQ$5v3X&*ez+A*p%Tu
zEAo|Ij538@0Bv_8-?rt;8Yz>;=(9ksF09K&uf^*;_u@!xA{qS)0Y7Lm;StKG^am>e
zX%2?2NDB5`jXspQuGGs#jB^(lA;Pxw8`=j}C$%qMQt?1g+b*R9zq~x|PIt3EBhnWB
zDgH=O!rJq@Utp^Yhi8XeuZi`Dk4dCj|2^;O{@06pQInY8QFMSIRz3T4ewOYT+t!xh
zSgr%|c`oidYtoR4Ayccw!`|JiESOw)8qG3~jL%TvYh_SjAdt_#^aev~8S3?edYY)@
zO5Yz%eOd1JXM^4Du6{JJ^h6*)jsZf&M+td=wZz<3LC8k`$$S1E#|X-FlGMBbdrebG
zm^`rsk-09!+r{hiD8}%)>%MB<y5^EWh_MRN&OWZ@{AMyXSdduVr>fdb;oX?^&Jy|F
zUz7KTrdq8*X<1N;ir<=wR-Ag6UzTiWd8Xq|{@g20f(dI|pB&}C>blyIR8yiRF+AT~
zW|F8j(RdQr*wYFJ*~#co;heASw`{DNeeIeXNDfHu5Z%JU_Q9$8S=puG=Cf`=8@jot
zFjGI5v8===`P%z3XiM>pTHAdE8ZBIQPsIAKF6cy<Ttu|bIA0GH4(VE4`H%%O6|k*f
zFG#RmQB)UotK#>VnlOS8<xrm!_%!#o62<T<h7t3=B@>$FWEcXvMswMLWGgl+Y>eCS
zso;t4XSR;TEFJJ<Ku;Yw49eF}*yxGFN=Bq<`y&U)3p<wNAer}!&8qb)%d$J7P@E+8
z<sCOaJTwS3%i<b-Sc+f|2Cn0sW-hu3A3fq#2^AtR2zDc1iIRq4*ilWF6t3_YmyJUr
z>!~^8HAWu)1?q9j4HA6`gy^5KRW34Lw+}mLA(L^fJb*sW`<Vuc!ZJb3I0}kzF|gy?
z<ReMRVxKECg(=Pf=~`N7&pTo)N4JAb#QLCbS^Pn7Q-NTS)}#^a{H0x_9>lt>J_!I|
zeQ6O8>zi(#H*@ltxE?oI<7$AvfaHPqw<>}$w+MnIBtAruUzrqPy;i;=^4nF{3JP*S
zbGduewQ-@NSkQ8?-g;3zr(F0!y~_?th%+55FDGRaiB_>rW<1QB8u*Qp*^Z7&=2=qT
zvz-f>t5*$DVW*24F~X+h;Zjn#M}*qQ0DJ0bn|?Mnf*+&3$WCAFTpe+t*H1bW3G*rl
zvLqx6$6kPUhE2}XDSpK{p@YU=o!uY!SQph|lENJM%|$7$5(P_$a0jWofTF%lf(6>*
zBsA~APP{_MQy3>eDmt~?$0E?j2mT#sl$Y8Rf>OzbU}Ye+5le+?K{Ud~{=++aRt)b;
zA@<cnxJHVQWer+KFY<1=nu%;g&Z$tTtk3T{7P1tYmPB$qQM}T=5s30U6JMw`nE@1U
zGj1x)<UstdgQAAxtqLeYFdIX{a>Ieq@Y6wSB$P}z1$KTh++X%4X;#g3I7ItEsoQ^{
zO0D0-xJ?_n7<HsM%H#6lsDD~_)9LPx;=zwxO)@w7i4fDr?fT`GAps%au#snT9ITXF
zZhZ@am`}P?1B7Q&??depR&b#7^Qsj7C_~J|P>OsHeCCbe2lD_fLOJ;V4Ij(}!GdN1
z0HMYMbD)Uw9yfDs7G?uHKPfNJmR+QaKyordoVJ8H*#{mfEg(lmLvlTM6<%^_m38Rj
zsC#R4ReifG_U7xsb@7pC{~Rm~^x(>IjGER6$IGE5VTcda;{esuPNFBGsQ&^kl-rMH
zCZHU?|HK3(dH<D>t#@DojIk*KQq5od0QTe^7~~ZCnO^=b{}-Y`wSN{V0p$q%fV)ob
zf2GKmHj@Bm*wf|L#V{oU$}Iqhm7w{3t1Oeddu9Pi#=1W!PiY>$E1e${O)5&ee~~a%
zKh>6~L`g*0q*8VJf49Jy`>9)n{Lm2me}Nx#vDvE8MtNl<pp_xS&<8u-ZXUxvIk-H=
zdn2O##%$m0JqtG7lGx@2O5B^@gMRIwfdCX{a8#Jv6kKw+Z!6AmaZ<%w!If7>2QmsD
zQXNBAeH?Rl$8%(7`XFbHB;Cw?lL2!f01|_1OahSlr~uZ0{}t2ROJrE8Y|CUdr&^>u
z$*+ITzxD3Aimtn-@YkbGxm;KJ_zuA)%nsgBBrOzZ&1)-Rpqc_Wts7^Ia#iNsufST2
zC%v>h>e%%Ne2W^x?(vxb?)O>-w2^)LLpu21pEk3fY~*<W@NN5<le5%6yb$``e%SLp
zKXK8A%MVmaj`9=iy-+j_&E#r$hPf-~3A6%l5}%#JeTo)|M~%d_V9bb?<{ife`eE5*
zBY0^p1AAeORA?1?f^Y}h0BuA{X_U-mh>b-D;nelMx;I=mH2-meIaOfQFS0r{JOu+#
z1;op-Ph}XRUF5Q>BEnVp?`UJNbEo-jWgyiSC7q2kq1&^c6Ey(EA7Y08m?HqNH*<Ri
z%q0k5#i~{T3^}0PdR82I^z{85t<eg70v)WG?W~^reoG;q@y$aGH|-igUSXPsBbtx3
zHeD|0$AJ3-`QP8G|DW0v&;JlN06^zWf26iIUoSwSTGuvwGL0^thfcISy-;5%>A43{
zpcF)#q|OhQQ9@_`Yjom2b_QVkAMyqO=xQ#d1o88a@7w&3*};)UW#hsT!bR7BvG?vk
zRXfURi&%93??Qziy`Zu}8D{@6D*$Lr*-~Es{`(!s2uI(<m}UEJWe$zjRn6UA{o^l7
z<D-AZAq{YUoK|GlvJ-E@jQtm8Xg3$}C{YRX7#xZwbX1Rpd{VlD?YT0l?Q|u>!j_At
zmbc)5=5BZrffKfKUXFBjKxc?($bnQlJ@><mAdY#BXQju`@OS0^ok(fJED$SLFiNiL
zgRR#=LMUI#XdT*Uh7qiJ>xc-t^W+-I<`VJp-DXs1ul6<}t#qY#au+wz^hiMPv&+_d
z^*-($vOZx(O|dkx9+db3<G|4Ua7z7>@})Pvq9NL#Rze(M^L43gz1=ZWqOgX__^Y~X
z<l}WX;)XDX<3$!VuE9pHvWOWVYs!KjcKmyi4p>|7=H|^zmSzNpH&Tb5Dc~DTRYa<D
zB{3|tWBP!-NFrngSWqLBftBn98C9IV>2Zw{SJ>RHZofe%j0r=PKpeJ0@b}+GXoBa$
zqoKK(s2Nta{%${=yw5wgw(QY;s9OsgG~L@1m}MrFw>`O7gx=N^^Is3FEd4%8orZzj
zv<b6ra^%fk_!pNl`5^RM!k8)<CAJy*-WyT`kLd{p^vSp5dmCniir@AIe2A3h;Z0#M
zg>j}9?Y`-*=R3F#w|!AJfBH^Fp!Q0@$huLooC8o2dVaZg+_MBA{bHTm#xXveIT-ac
zSD#$`Y`sFF`DY?cyW_x?6WN(BMUve0@)ZW;d?0A-a@V8Xyxvt(o#$#L)*x2rag>G4
zq$tq#TC7x#qM4xvZ02Ukss8;3W000xa&GKdv_*V(Z-QOTfoGz{KuYD;aCU)2o-^!?
zkZDfFA|E2q{_pHMR$eY%CCh78W0VmX6<e4m#568MEx2~JJyt<p(4|>s)jtD{T_D}{
zc8HX<5qAL}P(Ucz0+eug#=)~mdRj4jrLB<lpG+FYTD5Jv1_y`b$MxDE@rEcp#HMBD
znYgG&bTc4#;KRCDc=oQW!iErshWRH~<vqP}sAP2NWd?ooUF=@#DfKN!b8eBR|6upc
z?)ml*YHm?H6cBN`wJ-a^ZEI`u3hH46sM(M5J<94Um2uOyI}vA<d3>aVR=YXQG~>`|
z5kYqXe0H}mGL{oo>+oF9NDCPW#7iVHe7{FZ#(Bes^pVP?SpI$5qupp|pw%Fh_QRCv
z1<>^mPO(VHd))e=tTez1!pO7tdlTAyX8vh5<IF5HMz)K2Cx|^L9BnygG7f?k#{ul&
zi+h6(R6LI7NybLvyazHcK)u*_0uy5D*meGuSB@9$-Ngw1I$c!%4P~!XuwGiujU8@Z
zGd?;KVK8-FjwJu+*D!7~7^{k#Jc9+l9K4wy^WE2QJ78z_6$5{fja{1r*dNOB=$&P>
zUYpBx9cIf))D@q9mESpd1F#bxytNhTYr=m7`;^*hsFonpf-c3{h4R>LUyI*Wdvm@#
zlD*ZjNsQX*P*1j?K*I1?{1x;2k53W&4_K!O<plqacZ~WGqRH%q0n%XBzl2OIQPOU?
z_ck*L<UUZb-N#!$4=YfWzlkYSwVCnxQ>K1Xnya@OR4!!-y+rvnZLnz3IKP?10lTQi
zKw&IDEUb?&M|VL_lj)RGubQ`Q-L2)}-34WWcUKg|hp_Ni^oB0bvO4!Xpsubaovj!I
z{DuLpX^<BNU~{_4{5Q)7|Dn41NxO53e~=jfI*7Fk03!cSc8{3*_XkIYlztpL2#5to
z0J4luNsFk-I$t(*pxl2QB}YC00A?$cQN~)>AD;RRAm*px1lsx~0;S{-kf|MLDK8Ny
z;c52T-nTpbL>X6knnkcUXz0QOmM~IBAwRhJ8SI2!hJ<%7+iz!nXbQ<sUqg`21Lw_1
z;5z-DgpKHPekJwvD00u)-hkI%zq)}xdaVEeumCEv=6NHn)x7MjBlmOQ)eLWgg8*n~
zwhWTiBoPxWXEFudNB!B!^@jA53zt@!_+7~P^WVR>2QjpcI1gzCgSdzaPf!K<gbCxc
z{56=cc{%UAhf#Y4bCf;MjWkTWqxBPJi*#)8v?>2JUP3A@%Cv+_74k=}DukXq#7ekq
zd~gUW<tD4>`(o0l#bPEpurdf^V`8(QIMMeKJFZ8Sps;e`xcplA+~#<6J(5u|86L%>
ziY3~IpuQrwdzmvr+$p`9{CBhD(>U%{Z-;K9zei6Z46PeUAgZH^0u7&>%+pKSc!AE*
zbsP5=b^Mw%t9Cc}*&fP|`{~X6y>*)LpSR<zut3L{zlx={ebCrqv$Vjo2E(@aqd$I_
zw@c3R=<OQxC1cWK!p@GY^tG;xGd9j7?;W2gr`f0z8)ThgyT~}vms#he=9B{EwWoxl
zVI=CGV>ba~_}v0OtHY+cv9>Wy8A&U~jRV}9pR?9`bwn3CTk;sXz#{8J-q&;+5<dhy
zEICsd5G2hFx$1OHmEJZBD9&h}Pvo^xKXLtX$%R;=vCGVJi!@eS=Od<v)SoN|xhsUW
zYUNi@xkB4_WF(hjANG?Ak|U}Z=MLX3eo{54&&qm+Yk|^ZRD)=&Tp@uD$sUgM=)AB{
zfQd3?bl*f9q=h6o;-g^C`in9;7ihe@{HX{<E{P_S5v`OUCNLa3B`VUYe)$o+{KYS{
z(w6jL6^`R&k<dEJD#iZdL=-6tyg+U%DSP}fM~aJoimgU_8feqo-T0;kp}gA-_zM~A
zrGGN|JO?X>{Idx)SE=NBdGJ)XwIVZ-Nm=2aQPQfb7U>m?4RFwP>|>HkX0R<%@|L|J
zH2AP*EJgwi{o@%~7A?4x{wn%lBcYCUF(n7N^nM0>@NIVMeP8_!O4VRSZDhYfB7N>s
z4!uC!bvDe6Rc{tspSZjD!f})B%k~&8b>F}?7fOyDXsSaoFo2%unn0sr2#``A{hri}
zjt`;<V1BI$5Esnd`?i4Csd23@MrL|hISOeyw?y#`?;~LF@i6Vo!p)REh$;GAt06Q~
z+Sh>ztf@??*&hLyEmO=F!e1-|6oPX5cf_K&!V<lp{5e-8M)cO(_G`Ug1u;|JDF_E-
zZtC~S`{y=AjNq@Id~zY}-JX<kRC9$*%Gb#w2LE*^v%9d{Na-SeVSC056epFtLv4?K
zVO`tl`aPy49eIA($!04>!T;@|s2-ZK0d!o#Vo9(O!a;T%S2>OBd9+B{B<Y$Z?yb5#
z(yTZxkdip#H@<f{d*m-_EZGvajj}&RG2rhxFYY+qEve<%wayWRK?c|9Ys-;GGqbgr
zi;=a<5=j)Q8pla%ODU^HG_6~xL8+3PWvfQhD|9OE*9a2i>9J(Xl>6Y^AO`hY9vf@F
z4MniQ&}k5pN`4JoLQ6=1(zBSrXWO!IR=$aTFKlytGXYU*WZI+7Sbrf&E+um8qg%lL
z_OlxxB-Rd2_X?9E*QV|zYx;YW)(aL`t)rMHxQQF#Qo9K{{0+IigkF|lZpHFPS_N`Z
za?Lt`?9epYyo?66)4*jFAl!KC5FH?&J~bRPzLP3%PYa{D-LAtD0^^Ys7+7VOP!CaV
zOM^{OxH3Bgim41Q+Fuv5dd5J9j<WQ3ZDn3|322O{=Jq|Cmj7*4Nhq9WQ0y=|M3(1K
z$ZzPZ@;C?pa25RV)pkHRqyO>MKe+Pq{N1FtE@^mxW6Gg-X#izT!6NSek65@C{IRx|
z2`cd$kv-lRh-7j4L%$j!{{W4s$q(3aeR9NGy<{b!OzXG4N7X{zzBajJ+n1xl!5`8L
zq9_DVa-UJe)1bC72|oZvEdYQwEtE0AhXSqP3!pfJ{k=~LS9M`|n`I6GT+yV{!%BYz
zts-PuI){}YA*OdI?Fg1p9CazZ;))^6xAGw}_C=6CQ3_1z@4*#YPP(bx#3sV8TS*<z
zycXDhy%dVAff(zWd`Us($T0K@p_+PVpxa`T=cj0;tDVSDKv=oo;lX%Ed%}UvO-{tb
zx}*@1Sn5}!CLd8gy~hl!MyBk^ken$DMc^fcfF<7O{|I!>#t~tj1CWl3^;($~<Yv2e
z?`Ne^DZ=AZ5_9UWR?VH&=dN65!Szj+o@EI}F|d_z=Cn4?Aq$d$2=$-fHa8R(ckWF@
z|D4svo`sJSK_bTM*@}S7bs7e4MjlwX1yv`1u9;>n5f1=#5sGhzAUt;EwdVav_?OPR
z+P%m%*YC*eyRzN|4jz9No%m2c_8<$?qXsTdCL%0@W9kHfnAWd-L_xjBp)$6-J5^Gc
zomk?RuT5$VXXIoKVmZ^)M(SOVAqJ`U_0hyE70T3;M1V?`^O<)xUu%65ek&fX2dB4Y
z6jt1{6dHr)^|HohT>h_qroe)+F+#mp2Vjp6iu-K1qlDsqx?YuJ)5cM`WpJ=K=r)*q
z@-vZ4covMu5SpspBEJ6tm$kPW!4|X97)xmNq|!RD#q==(jG_o_Fj{0O{I=l^*|Oul
zk$@Bjs(~2@XEMJ{!yf#pj)FOUd;XVT5?g7Y)72wKgtNv7Ni39^JXB*y42jn~8x0}M
zbyZA-w0nROM!ziXj!s55Vr=|Ey9vwdm!Pqip-sBZI`B9^;oHSIUFbA{3B>X%HkH+9
zK$gNMH{WwU28AVmMBo8((*G`R+>)Qg{q1%qwSxLy=A!#?w>bry=&K#}o=x}iq*qGz
zF}u)^a9U?<r%gn_KX+-oE4)~hhHg|4Hm4Lm&A~0@>7P#R{)_EL)Wg{8OKOLXYYurI
zX<~WX@k)td>5#PzUu*P<Phd6uHx;89J6<_7B=Z+r3X&32CjooXO&^weRf3%4`I)*N
zj!x+aUnL$R6ogF9JMHg6^<ehrVQ1cS`W}xh`!a2{(XcqnaVpO(e$1*7?oL@Ek=LLz
z$-pf^68N^N-JG}6kfOkL+;>R!m5E+fing<hv?&d}ovLpBjl4+^MIpVDhR7wf>=>?m
zPEM>3wy{xd>7TKBJU<>-E7MNz4cbj4c1$RXfKl}awmn{DYPQ%zafQgp;BrOAUyK6a
zmp#z-xuAbAG{5kK^9|&YD^+G*Vvw6grJ<}Nha@*d8`(h4molP`N!)nQTDKCdgSR7W
zg|YC8v2|@ZjIcLW&d{p$gN#RhC4Acc<AjzH!th0kEGnb^t-6>ow+>wgA8EPnPv28@
zPPYy}_ODW)>-L~A3lW-yycX||`9G-#$B*q@nGUtb^!lZ>HGx42?e%~pMWqHSaMTC}
zskpGHF87AP>$&sfmEgE;NIV6uC;!;aazB^~OF`~-6-o;xpNzG7uhub#&5_wA#7k4S
z;XpU&wLtsaxN$1wGffvq)&t?CO+G1423p#-xKcqn{gZnxrH)NsvB)r_P#|m_ehrp7
zW<L{-w_CjYg<^))Oj;k}$FwngN&e+UNXn_zEgP;H=BI-Anr(Tncu0n58;8RWOW&3E
z7zfJfoEk1g@O`+12CWW4oFkI6Xy<zCk#V}hQKJHQL!Z18hTeC!yDOrb8s%Z1Iwo66
zO+9G<xlR+B{^TdN2QgfC=Y2kVXMyroN*UM8Wnc8{b!^LxkO^9T$oOGSxM7EN2j3CG
zxQc=P+7#|?8((Qki*I-?=OGkIq5)mdyj(kfEhadHOyq?C?y?Vdl>54Bl>Z?xDXGEf
z^hBsEOn)516aH`A$@n;unZpVf_AU5NkjZ*P7AjmlLOx82Ux=84@^ArHdwCHqi^$r2
zi#XLS?Vf$CTwqqV*{5ceY1(0yZXAI6mGm2&fCY!IN7cvTe;ZIq3hH@DlcN!P^;&P!
zdSWrSbX>$MA^9)Hyo5{~U30*&ZpGmS;6zf8Lh{8#67B<>I;hxX;33=_9#vsLBD-3(
zXo3FG{AR_|0lgn2u2mXTh@X;Nr49Xg<KafeDrL+%=z*4Fw6gL?iV5yH(w=m9-2xoj
zpb191h(NmvTM~V{OW23*IbY?;uH1S(k$I`wR$9B38GALttpis4`cFOrJuGP}0rQi)
zo7W-aQO=pHaOD0jaCSQ0hhjgiT|A@rNJIdP9bF@QMv7jKT(;>ELTxGp%LO#I;NI4k
z9aS{T4MDIe*a5MB7d%U+RB!wF;6|L9eb>-o7k2z*mvO_Ny>(W!Ya~v3$g30s6r%F9
zW+Osk5LCD})afsji4%&&W)L%8TXQw9hfQ&@cM-Bho?_&LNQ|AQS6b{OJcIg05-eB(
zq<=~+C8Lmj!2TvBc?WR4Jbw>Fj0-WYaRzX?nMa1lqRX}H4!r|J#%xXzeH#OY&`Ola
z1^8pad}9CI$RHN?JR`eWj$YHs?QAKnX|$L~AGF^u`+0@SJ2mJRalrSm8>TsQ0}4C=
zo(W+nbYAKczHIJdWR9(GH-;62-z}u^O~E%2z82^k1jmL#{0VA$2MpXSMDZa&6-$g~
zS)GW-Kpq<lR{%As^8LQ@7l{gvP|Y765bY!)Tc4m%JEfHN#qdfFz({CPs4@1bIiq$%
z-l=gmp$Vmk?|=dwQvXSlO%jD=fp~$W>L`ilvorR<OVE+J9MN=U!15>Si9@_Z#qmxd
zEggfUVJ+b-m3u-4v;)u+M0N6Q*$r+hs+3r_>0MZJ=&01^iyWMLaHN}s+3kyWGhIk&
zP>W4LW_C|$vi5Si!CDNMdHWoe<DR4_vgi;mg*kh_01ZcZjOLkkHdC&fTDWC17I*5(
z&OFs)MKbzhX~w~*(9*q#%3bQ&*utK>#lB4rK9d3;Gq;Qc!boew?Y3DdSNZ(vJjC!O
zLrV>(oqX&+BYdR>Kbfcvy{rv`zhI*PByUy#e0Kd{1Q2d!S2MVIu3Rlf&uMifnBv)Z
z;-1cQBPcsFi8wIYvld%<=5*0`<G#^6_sF=k$agr}b{?kg=GuDV^Q2hPfaC&?09WT>
z>j&moS~SwVzk^PO2uM4}xrz2~*vd#u9Cu_Gq?n@BUPg4Xf@%i>Aei4pKxS&jNA3b;
zOyQ0`Rl8{<YmHz_x&pQO3s+PY3}2&qE^CGyZH~}`uB8e*{GjBe`AeM+Jt%MHBTV@*
z(o;#9%VVfViAWq+P9*xjbNi{E`;^!S&tH2u?mvoC3eORau)MyCcY&|6=IK_l+%7Tw
zH5wv?RO{y3GTbR{^*P3roH3G^{+6tM=vL627Djb4Ou%t>7`LIinSJd&H-q{F3U@Pz
z^4}(dLrK5FgXZEM`7PROMnP0f53~=Mtgzy0?MY+ep?`d-ggDC(JIsHSQk^gnfQj~K
z<4l5ATTlqmdt2#O>vxGX64m*{i(VePK6zws$<Rl90Nucd^;0AL<R;o(3k~xY8u5#>
z`S>gCRYQxA{{&xAe38WG;Vk~dgf*E&|9iwYeU8s?$nZkxPM)oO3mNOnBHjl>xtB0f
zaUHA0K6m+x8+8*tjVELi4;aG<-R&7T8*9lksKqxT&-h2AYcWvn(IKyyJ2hp>qWM+Z
z6o;{?o#IlpAeqO816xY)5t;m&F-c*@E%w<Gk%GNr!<7*k)2E2fm>r=}Lt&lgZ@2AG
zPj1UYFL8lq!k$g{%;Hoym5}m9n|%X~rR6KI`opl{$EW9jk9ruZsB-t+n<}WIFK@}F
zwSvNgMZ9O4$qBS;ID{Wu8_S}`p8W^b-{yFGi+@;!r&pO#KN-7dG#(k8MVK7=_F8s5
zXl*j;9ns;Pbr9=S=fxSbqwx5KFQL3)Jv*dlzmGhY39}MIX|DVEf<&=si26a=&$y7J
z;L<xHRs+AmRJtv2q;SLwI28u?1qa9Q1L!uLmJE)!!H7t!ji>2!Z-zKTeI@D0n3WC8
z4j}!gPThn1!VMcL#po=izR7u`Om9kiFtBm?5teDA@<nl1-bG)Oh6L7No1sS@9!TjS
z2AbU4Dw~|}Jj3Lh_vlNBN7no<e&o>pt2H?UolxMEj0TMLF05$x_U{!)%F74sWB6P`
z{V}Fz$B>=}aLgM7ZZ2o~lExe7V|OQ_*bd()FGG$)(ljk4cyvFn8ti1RV>eRqJp~(w
zijTF;UnYO2V2?s-G!JW26)zov=Ao%vy!5`F#8q4c-)F+l%3)F0Xd$rP9lv(e)}?d}
zf)w%Y{Jx~#NfCkGNpv7|!%<`?m`MMiERbIghy22u@2`wYV+BYb>$ZKsIU{$%f(|N=
zP80!v<S`pcN~%c1P=#>kz0JXu(`yc8L@~mB+*WBKM+@|2`8J5d^m)h2Zo;8*(s<p4
z&Wp{J((~B;pW*^bLDhKsClrHYH{(&hf>$b7du_BgO!&w444Al{D~aIsjtBj+{|-#H
zkRysmjZ66fR=6UojOD40UV;Me^B;u4fmX6MZ=A$U_DBD3-X!zCQZ;TKXee>9_-Sl!
z*5i#n0>-J%7>JYwkxMTU*uQd;V}sha)w**7gJWuhyl%!odK!Fs`H5;xi(HUntO!@`
zF!WmwTVS(+dj(71Wew_Wo}rbj--(L|#T?X6B?be91vKU$AG#HLmEue1=jYHe;$u}K
zv^S@|_^`fK<%WaK!oA+SX};=w{^6^6_kx*NP$ylub~6QcDvtS=v6nz8mYuzqc${W;
zI=z=zrcopUZoKsHnA^FWP!WN;Y0!k(BK4K<#|8tTcsNaqu_I*8_?=2{1wbXlla_7f
zMLNIgJu3XO=NyiBqiF<rp|1~AEMDw--(nH&hU-YvcH;ftoZ_LVo*0(Mhm-2RPF|QK
zwr!|yDzJQdiQ@}6tVI^)m6m-Q^dC+HAAyg1D<Q*G#OU7?)Er%e*ks~Q&kSilfl}{G
zP;stt&coxAS6^BEY>Lnl$r~VEk!h!4<oRF(p;WKOH6;MPIztTx1b9AKK%xSMp4>_F
zQ2JtClj%bx^!<C<PlKm}tvcYnmP7uMtR6n@;vxSAUI0zeb*pe0`0J=*e<jPWw3@n#
zPAp49Te!3EMBu_RcaQ9*`3eK)JiUzn>U>ZcQ^W&Jm%BHZnf3}Iq3LlY1@^!dmtvYU
ze~R_E`Q1@BHJxNpM~k?fKlq}@G&K#w0$!A{XMzYuKufU0Y)rEmkjR>l9sAX|@JaZ_
zZg{l3kQylP!beV_KBDdgl(w4a8rAg-w3JaGMA281hm5@Cfgv$GCvczJSl4w{WT!Yg
z8J&F|eW`IIM>)h4;NRrpH9l^>K<080g_9R#eds2-MZn{Z(6Eh;E;haJXeBTZGk(iK
zaG?_S(a$$4Qy}PL>uJ1Re@C#K1oUewlkU>#L(w-(>&eOI^%X((ji6UpNFF$SWTx&8
z&BGKALXh(vD67JPDA&P2iy~?2qGp!xWAT<GIQ*S^zKzN5DBJn&R=@fSgF(tIw<0`+
zr&}HY7WRueY)|CToOyqP(p)i_u0xP1v+^X$>Rz*|iB@Pi9-@d+$CCVByEy~WvCJpx
zX?R>P#&BTOF|En&pJv0<=v%<FBBA=wiva$-K=A2+6n}n2mq6zCp!^bvaIUDp<&BN=
zkx}Qv6XgQ6Ys`zBU$XO_O@biKcT5h#q(=itWdzw0M30*0k!nvfTgA|CJjTlq%>Eg3
zNKc`@6xG_smVUIf<Rx9nhNTOan8xE&k(N^DgZ8>ckT6;p(%eLgqJ7`Q#{1Uj70}>|
zjclFH&rlO;QnjnfQvP~xI^2t8d}<gEh)d0fObr^{vzFshJJkKis*?gH8iF96#q~jH
zbh_hG0xP6wxytWLIR@(ykPc^Ye8e^m5MY4Nu3<7VQ-KgJEJRLe=K<m7&@5)lD|Zn}
zT0)gmdcHQK(=xF+h+IxoT!NXv(iiQS^mV>wf#imp;FpbWITERwVvJ&l6G9>4xj+p}
zO%yDI;F;gYU2ue-F%hxmn8cJUSTC7%jm#lj<OtB6^2bh1tfO55Xn(MTSldbqD|2nz
z>Avqki?We|hIM=OikpPdL`?lleP%F-Zm+++i2A{MAGJWSHi(7oca-z0-Uk%LykSWl
zJsXm`Mvrnie|sagy2iS_e!M^B&B3gE2xOp%P26nqZ&s)p@WBsHI$T?2yds6i1vi?0
z;qra;k1@cClqefFlBg|Ca=uoU2o>EY=_)y#R7bF#2-B12@CEzI@&R4U(w42<kx@=I
zxoNH5D#^q{n0*n@{#2ZH>E92@rd2RJq?&{iKIPBSIYd~#Y4FiN(d!Cq-V&8oB1$d3
zkkPxx&*0ZgzXn%A4+hYc6XdmCu6frZnpvwuA0|J0^({a#s2b6rM@^$}nVGOrDg`ey
z_mq5k7|z^2zwL)e<LQuunEH<S5FcQNF!}PFO-J+tL}3=Z$lk9btnR`7yG(!Iv>HL*
zLXwGeWGaIf^&^g|>O8})aA9z7c(h#=^Mt9Kb-N42>)}q8ts8kM{PYH^>;3YIuA|2u
z{WECkB!S|$!tr@9;R3ujMO~XhXG}<CZ+;?XqJA_SjwLWUq^u7%b0xaYA|I}um9e81
zNrOTvBnFc5u_r!l;`cfVuZk_Zax(pKTLQ0uq5gIaQhbvd^YJ?>PB%OwQP``N`y(V~
z`$=fMSxI7uajP^Tvu%e}ghypnpcJ{9q3_iVFR2fm?wWgGE#IU`d~gR<C73`)+U|Vx
zqXd;Al5Kcy(Qgpo?n8cZPHJWLI2BYc-Cv*i9hV`{J)NAtnBu7M^;cO(ywR=>(kwPc
zt<qBUwB!pIAfjnwiNzeM{$V$e*8btXY|+zIx8GcsIMj4RxPJ(pUDD_oz7%KqZEqII
za`m0ruL<MsojN1c+8RAQ={X*!8||Rg1!As4w)2W>m=A9+8=rF_x+(euRWa^1jX0Xc
ztcx>22QAkcRSk=!i<AL^=fg6~yCb0FbJKqz?&8578jHY%*f!`^`l~lwY$MKBX`=6{
ztEkm}O~(g!tpyu*V9RJ%z?aKHtP}FG1c6LA)}<^X{P?WX%$Y)C<5)#z$3-02up2Q7
zhO3Kt)?R6(8jV&wrr>_R#DTZy+jNDAJYws3=9^m@IJbR6?4fZpODq{jEtG)MR66X~
zg??PAX7Ks+t<Il?VTeqnGcD2rLM_C=0(fO|w5bZaBjYKTdngH8)9pjqmj;OzBz;E_
zgHl6bnc?IogURo4$`XY?VbdI^*G~Mvom~@~gmNq?Lw(F)b9UP^8(_Vh`R!0gb?&u$
z)$(&<47x9sXO{LLnb!@-3F}`j+%KU&KEx4CFMd(xA&pOJuh3_2@Ind^+uxHQ0T(R6
zq5`M1x8#OPP)bj5B>Y|ES`Fk|_4>0et~zEfkP&hQ+TEB!p16M6S{k)H{Sc|f8Ojeg
z^JYWmbsUmPlR75-`|G}iY8WNknW7v85Kd@7MO%iTn<|Kv!<A2tEhuOuQn(pX$dV&Y
zx)4-q+M@E7L$RF-LH*jkN~UhlS_V6;0~VD?>y8$V-?3jk`Fi{eJKet<GC;h2P?Xxe
z>Iwrvp->Av8@Ev!>-W<t?=Pt$w{OqPZ=`U$z{)#)U5+w%N21?>VS0@9yn<~33rn`J
ze;a%cuTE|>$ZFKMmooe5q)e_%!6TCHpRk5S`GI!frdvUlj9+U<NJK{SLi&aIlu8bZ
zalPm%?<%dF-xodG;ucq@FrY<7e6IU>r|FHKEaf-1v@XlP<})~d(HMFgMR0-<ds3^m
z6%CeoSD0#a7JvWo&^Miy{I=$Kn2TQ0I-WUu`=k(6l*;DwKv+fX-6=#ile(|2duX7n
zvHq1%;}fh}vZsonV8`kfpPdp*B9xg_T8tw`yrGM!_y>j5Kr**HkFI)0;1sQwoGg8J
zC23Y7AuLey0OI5xjkM*WGtTmE6CvZTQ%yX#orT26;SyGrX17#$N=;?TvxEkCyG$Gb
zkTJ)(XZ_51Pp*4rXNZKx!{V^SFB^+uAJ&A&S>iH_*~z`sIwxF(B*NsbjSW5*w~W^^
zeC^9*8Mp!n-A?t%n68d~lxh<(1Pr<kPGJXOhdCj1Wl<_})v}Z&a$y|TY9ZPo<`BJ&
zUv`7eU=Y3S8As365>o8$qlX<IJ#(5feLXJdD#alE%Axz@HB6>0A_4MBgbodjElA?m
ztCme;WADfjP0U!(&6b)Cv>zC;^FXbR!tno|j_OPhJ@vN7&}SuY9j)Bb{HAZ}t>7`t
z**FiC8y}u)ACwK*Bw}588%xjh^#QXH=jj_SBmpxkjG&j*uV+5$E8xfIH{qHyk7r}~
zR3UZ*V6g9Xs}<5yw8K{!lPB{}R^Jm8rktg-RuoOpcZ?z}e!lf{+s!-6=>_M%nd_QD
z1SB6E<YyNVYXAjK;B&ws1hjG&Z-}YlbZ0Ipsgd>I4Dm&#0XVoO(MNxMc+Yp*cXF{n
zL)#=r?oo>rZBWr3)yKp1*i}fVJU&#fp=|zQ^-!ZQR%8sVpkDJqPPJj~#P$ubCMx$_
zNw+C{ALXthJj=Cgci_g|AVPo;F~rvpo{!%{9XnD|VzRm{7vW31i-GPU^-o{+v9RKU
zsqYzUw#p&CR<hJJx<4-nU(VbTvPW1U_ebr$irv0ZyZn=Q-Exb@)#kR+9<CdKo)J-F
z{;7Rnq*Lo8voju4wl6%|pCV9&P$k?(sP@L}cp!yZ8o1pivW`k^ay^N|-iUlx@GC;K
z+xJu6lZ}YE2?USiw5?91hDCp57D>GzBf7abUEpCh^JL*cBFAUBSm7E3fiSHU2-wu%
z?TuhHW#atl6O%ggLTTGn;3o0YqZD1#%08Z$q!pmq9EP0F&7<+`w8GGItWL(Za&mKo
z>M$!?PnV49w3R6cHs~~PTI;K~c)6%@WciFC*OoT3h;>%Zg%a`M$wo2s9d|cuZ+fao
zI)apupy;5~po|T4h~ML%CC-gd<fSVPYtY=hq-iA`E|WrrwH1RYH<;d`8E)n(Ph6O~
zB?>2nvBo2GlQe;3CKH=x0cU<Hmj1;(J(g4(rr{#{5cdolW^C@&ZS-f63#8{J>y}#Q
zTAWOy;4d3)(3?=(BMkF&3`AvG!8YJ{I=$0v5!h_YN_MQ?lAXoej)iQi(GLT^D<0my
zk{Vf^X1A9vaGI}saYIpfI0}DjhQhVYQ{zPvaP+-Z%ypM)HD2|F8e)UF>vaqG)DMl8
zvPTcW+WCVCXg`g9`Yx4QN@L-gK4|#0G=C@W5>2d2K2=Rvp^Ak1LstLrQBU3ZQCOl%
z;6U)M^XNi}9zKzYe*yXS>t-0yRbpJ0um3{CqJQq`%9V#&>fm%hk`fam@j7Ym>^No{
z6?I#AgF%X5*hZKE&qf%@7Bh?`Lnr|Q<{<XvpBR#>bWCJmIjJ{{=qBnA$Me+L6d$9n
zSA(%L$R+joGuzB|Vo)HQo;mY)5XqNyId&S6&$NyqNhDh==9n2E2g{Rn9dsD21<`hR
zslMOLllXp-;}Q3t!6aVUfTK`Prj~BSdk~vb-g^Nl*AX1-B8w=k3TPg5`-bh{4nFNh
z1j<)HnplGPZ5GZISWj|h&cU0<`@d-Izcc}Qfb;eR32YbYOEh2oTPMHIeN&3l)+}~j
zm$8(8()7MfD)q(58q7nOz<6*>umA<k5ZYgsZ7zjFt@NDtK_I4mYsQD_pC|@@q7`4K
z9BZ%c%Uy2{?{B%8?%a(mtBEd<IaXesQBhse75!GE`zSf$6yMIVln>Fr%iPXc^QXu;
z-zeNttg5iXAH@~Rw!>LJ&lJQ;NB>5V;`o%vlM-i6?&7j~BVwx!3xBho;!8d4>S(n0
zHO$>S<P{llPjJ$a<4rgWQ);Q)y*tBoGZTQjmG>SVa^iJxtMM~Aw!)8mZ;{Gdw1p@e
zR`sk7SF%cOYpL~UNuqEC*pnJkZ56ysM8JXU$a{aGx12^_7b(q)t<V0-Z!~Z>uLUt4
znjue)F@Mrq+=^LZ2T@Ix>6vn~?H<@sHTTF&5v)HLD1a_;g)f^0ch%{ET9-_E$NwDp
zmRlj+2JSP9Ja$!_zu~)aMs|+>zV(ap)nJS<cXB}>K>!x~<!tKmNn9GzVRDI|7&ene
zgMiY1+T;nFXyGCLLG*Jadm2#A*-sN0Dr$^TN<^I=5IpP=(z-*T43)>p$Zm%aus$MD
zeAtKHz$;72^9RDDd>|8DULAmG@lshhzA>)Y?&dG=jzc-YX8zjfRaCN^rSaSM4r%Y3
z@h;u)&e0FClp40Gm$*;J_1!YY%G_7B%LaKayQY`<vn3_rA}=1KJzJSTvln*rKnB}-
z{bnyjR023?#glmoZZ7K|*zpb87P4ZFywQFYyR}iBeNh7FNb6Ii-*4~M%$WgGtJ}<X
z<B*A?a3f@Q$&;etPo;rb5ZSS6n+Vw%I8_7jH}HVIQ6N~K$c&jJ9HUco-?qMN&3J;X
z<b+iREO#){)?9%T*w0&GUWDUU^$*Ox6+AEW1+?7?SQBTT>m|cZE6$~qVv%bZBr8Gh
z-0#PYcJyK#EeU9-l#q-?z~tuJ+_~9>&5kVROw0!JduGQB_Dz2FNT4Iz0PM*N7<BBL
z6N}MJxaGR)ZX$uu5A|%PToka4MXDQJO2(74HLqXM6ZLeHsJ&ZZX6;auQo?d5B!RDz
zfWoOn?x67}p4Ts~trg~fOc~uKfT7lffw1u!EMFPoz}o%^^1LWK?A^AT>YO8L*<1;u
z0CKM-Pa$@vf?-d=fe$aeCc*bME<8v=fV>Gnf~|#SeC9^6Q9Ca(#F9p$JDz)pUzRuu
zjwHaQGWg^Vcl7w?0UY+G*pzW`9Zsddj_VLGY3Xuxx29$#wsr&67k$+?T~DPUd43!X
z!ep~$j{#cplI?Uo2#=}hmQOX(Dytv2rm{sDXlsX-F2unCaRxU2SqjMNL!mp#2WkuT
z?{k;I=UJpz<^Bq82|+EjcD_A@f%~%IuGR4KC5Il~g1kUZ;^=i5XBgo^*FQUXzY*<e
zg8TlQbNt+3N75veae+zpGvKg0BM!WS;HZFel%=*1K+&fT92;ejYvInzYr%k!{TwOw
zJNXTAvV)z^&jS=GpUS|VR<j)c@c~}JVB+g}Pl*!SK$~|=1QWGR6wx?NQsQC5Wty?o
z5iLJ%k#kIlzR)YFoIM~9?w5Cy(bBx_Fc3N+R7%!HIA)ZkivhTW=Mf_%fX0`eLEyAy
zlb$=z5;2>q)lmZ1trvM-I#R)XqPuV#KHN{V>LojLBDEgUyguYBFwbqd9jw`jDu2h)
zRFUBT&wJ@L_&|5Ek_q!}v5{Tr><d|bUkqjS&u3)B4s?bgusp~6dX6#A4YSLZC3)y2
z2Gt|UMhF+MFyB@$X`jm;dpUB}&-j~2)05SoUm`|A8fD!@x8BJSYbDxB7)5Cc_TW||
zZG=%shop|;Xh0r?vw@aKV{ZaPY7UlYj2$>tC*;saKsTNH?T(h!lD~xr^^Bb-F*&s6
zQ{CW=Mk>Y(RW84U(T=sP+o)UESBB=s&td+`*7Wdexp3Qx>nu}IGLC0h^EesY%>X~E
zRLKK9v=cr-6;`OCkWEb&n57JWDoP!8$@#!t64V~&NDJhVvRR7{6NY0=r5^H^%k8S}
zpDL06Hel}|#A=n={n}X^cLn}@*_UgfWz^S7u*Z(@V3pdOWbVISINzpytGH?@$C6;#
zVm<v(pQBaxFP{z5I9TcG(t)FzzYc@pjHdT2Hot61J<D2ct(52HVaj@lQ-GT0Cz=Uw
z6cehCuSF-oQdZtVv<1l@wLXgb=L}C?+zx*Ms)}hqDQusOHxo$}%f>uS7%%|`%j6e8
zuTl9^%yOmm*Zp&{ofN7bg<p>iMdxC0)a3*o3r*1{b}&I(g)AJO=*jNJ=FVe@-F+VU
z7WHg&pi5>Y0D>`r_gH>$UT_!r>de@@6d|pcE_J&D8hDe0rYIWG){4nHL}wqb65So4
zkDl30E{88lYW-C9V5GevgfZF$VN`U%ND85|eGl#A%QRgPed^oSnu%?Vaw%OVg3+P%
zpj4n(LnpH|;x52DLkY!j^)LUE=Kla@K$*Yz?Pt&XlvobL+3GA~3TfWWo3VH2y;=xe
zyA$5i_H)V}5#=5uNDYphrg?%hj#%8l(57Y^goH~EKypy3j9@d_z|G++`U|xCF$ed=
zNS1n;dEi!{FcnYAK!eI6lwz&ouun=Qjd8tIePDAFpy9|)%aIz?NH>cp-GBSLdvy$X
zJ8p%W6aB)qsi!jLUZoq|8cC!hK*S%#aX$}33pwd@RB8^EwLG%XLRm{2Yzr1y<Iv$m
zRXnmOVuq(#opal*nP7a7%Mh5Qq-wqcXuKwx7urn?sn7mT_vyY3JFe6A^wu1J!aUeJ
zSLf%LE(UBi%6x~S_(eDnZ#{5mRP2dh#)2-ks@QOex}@s*eHWZ;5n+${|BPGR(M19z
z1=>lTqaG;RDSLr)*hlopt9h>8qH3v}apKC7wp<>u?DcM{D36a6gH~UDqNjkMM8u_z
zZ9E^IW^AiDIp6=)cSQ7+9kmj(nCtcHjl&I0{rTchc;j>z5N%ooi-P69k!P#ULqdM>
z7iyBq{-+Tg)qs8npxR;KD5ZPV<+udgmI*u1&uwo%k%iuU-!|8ujuu#uO$eUf<MT=<
z3;w+<#kq%v*bk6Q`1$w<1=Du}!_;USJVo$B2}edFTP6Z1)!iTGN|bafX=OCtHFp&d
z`wq$4kMt2~$llNQ?Zo+6KgS(>32It}Fo2ydws$(}YQ@;o#34?1?(BpR`tfyE?(p-I
z$fJe=+OwInIwVC(z!@0*v}-NTrn*mvi&}v=M74DM?t=&1R9!k?m=Uw-JTj^)LHLg{
zlNYipl#8$&%|u3%=m>>8*ilZ$X5}_)AqAGNc{Eg`4x#mOVI*3UcOxpBZJ-dJB3YzT
z=i{!oX&DrmvhZU1><CDOHlEerd#K`qyB(|5M>0{J)Bo6e){iQo9b&6(OXPWhE%?08
z2192t8UQ!7LGaz`BUh(tS)$Wi#gVHy7UW0O%B+1M1#-V4!ogu2>rx`7cbr5<ih1$*
zKEd0#I{UE}TjtszUlXz;Bu|CjFxSqD)X47*bK_E=hJoBM`~L)v8=~5Zbtp@@HQzl1
z{hxidg<2^NndRG$Ck3VEo8YG7C2jXMwLC2KY;glWZ*)57+!g+0IdK5YWkD<6;)fN*
zwiDIVUbsW*$0@IBW1Sc;w+BVgcvw&KiqpHUFJ!51RRh3TVKa}UepBy-c-bn9c<cz4
z5hpOEr=M)2HMx!sBBT5yUM&w{Ay+`yrTfJZBw-%U*q9bh+uFp~ib10Z_Eb1Mz7eIg
z+cy2U&in4TfixX#{{2d7tB{$bR~~_pk7J&l&byhZ+3J<y5AL^J7#0iQeF+Lg=jJI{
z>8|n@PhO~CT#LII3v%^LSFY4cwt-rM#+>mqGbNI$*)oda5^%uC^{~_(>#oQcTl_F>
z1ySOFKJz`cA?#QCJwOi%tr<&zQ&VW~C6m!WRsN<agHAMqFvI@u_E>-2G4C#9r*f_D
zZbovMHa!Cf{e8#~2b8hCmG{DSpG80n3rTaWWKyl)j{zbhTvi%_Sj4I$sN=d7j-CGa
zt0CAo;O|YeRi#;NHsl)OR^xqEQMRF2;xkz-tT4^#E|apTP8r|Rvj+kIDP?}+wt?Pc
zxIJ79=I%dvw?~y2O1h?FwwyS%D@eW9yBL5&4uy7$9(ePy68<>>um+npa<_TL@b9IW
zoFCJ%PXI(@2t~|v;+<%ohF5&N9hcPC$0Bw_5QH}1JMAc41dG<$7YURPGm<!~ki5nx
zOoI2(s@82TkC#og5K%Y9!EU&9KZlCK_kP8QM(>ORWA(CV<m$Psp1)N{9myU<Vgu*u
zMVL0@s4ykZ({JH=kohw8EqpCz*JN2}15yYICg_`LW<p;a9OUR@2I=yF+x4_%w<O@%
zKsqC-*pr?)xg#^1+ygze<fkj72o>#r;Fm55dn4PHe~I;M<W^Yu;zj1=d4$v5n(Z^f
zSm<zNrzIKnjpU)?d$F?!UF&Fi#aWsQgRzcl4YCnCCv@fEI@&Yb9MkvEaSR_3YRp~}
zo{u#5Byx-#D^|}RF$pn-_ya?;XDcy(nIw9O_Q5(%HRxXvXQ_%Xi)!B!!Ld3}0#=iU
zKg%@yjW0XB|5(tWX3GTQcMM0w0w1(Q3O!iEX>ruebJY;5?vTUYpu!qJaqbn0b{Fiu
zvORe)1i4WB;TYKwg+T^Y$Gi2LUw~Y0m;uBPIx+8wn80ZZqz>Aa!m;+wMr=jC)E+>k
za9=L9OhNR`nPL4ZEhd<Hm7xVRbiAMh0XmM=MT|%2SuU<avz)dE1F{s9BzQ&HHfFkS
z@^gpAb-xLdEQEDA5GZYPDhBJ&b4CQ?u^6!X%Fy=<4gcqLmp6v-!~pi@>24$anGV#1
zE>);F&$64;xw?^#Q05n2jGM1do?VaAUp~1^N)Y?xAMF?5Qn)b5$|?idG1ULr<6X>P
zYIB_ko5T@9)*^7mGm)pt{AFgw0T02QPgRpp3E!b=^b*lVtu}ph)xIZEl8w9cIaAVS
zKK?=+WAXlVN>3t2VtKy_oNXd-Cu?7cUBOOm72E>nct^VQxGXV@;QgN7jkTDxQo&<g
z#f;^HJ{^fo3>r2>q{Hu^MwgIUScApRs1Z*26rmQ;_%OZ1;mdt#S5<&9lYTvRW}t!6
zXvU{*s(B4YjZ`1?*^%9UHNvI2+Ud$j-qZKov0`WzI7Y-G)&Q;)v@Z<d8c1c>!N(YC
z<96hZzY$E?ret)B?1Km9l-&sm|I5AYLFevVdaFrlwsW*sNT?hWVmtZ@^&hSus6%0g
z?m?-=zPP@_P=ykxUwLv)jN-Gz>Ws^k@(?DLzIIZi=z^+%xrQ#w(^;d10hQg7H=QZ4
zwqB}&Saz54MbODTqwS#dvbRGig-pain4G|HlZ2yUXJ0ETBQKANSUEJcJ($AiiMqsb
z6d<P4ovMgDBl7TUY5js09G2mdQZ5zRtFm^nvwEN{hT%_*O(f4lqGe&Xv=|AJ2KtoF
ztFs>b(191GZnmBrLNNq^Am{9NT<`(KSdvd-M&GZ!(u2FouN3d7BwGstO57A;K9TQX
z#XF;;ErW3`R}w?_LN)544h?m_Xh5vJmb3cNX~|-uYaJ9WQ+JNc?otu^!<1*!V(eH_
z+Aaaa<GF)dJC~ji`rUPM)JyF@babA`2JN&OI}BY-hl?sYIC}%o$M|u#yPqcnQ|K{0
zB3((Hg8A5EPId?Q`E4R-q*0j8w!N033VB?79%#*4Z*+@Hl-VzbsL^h0DMqP_%&~-k
z_Zv)vsTf@Qe60m>P_<+_#mfm~9>w4IadZxUn`l}k({CXLJX0keb|1ppAU!w1HFH&O
zYBo~h<!;wvJJq>E`?kImuUgclXbbJR&lnLn2@~g1PWM4HH9YKaHEg}0-V<i-ZB?oY
z58qkQ>>g`q#`afecpDOt)%a$p!7k>k$52P1;YhdK+me?|l3S4kGsC^bjR-ExJMRPl
zjw9kNEFPXQmhY7j56pW0BB<qh)=*j53`H447@s+&^43Zh`d_ueB~p|%=pF8n82LGk
z)i!UEcZPh6juX$3K`a&;f>l}kwi+Q%)5AV!R$n*4%_6NuDST;vB}$k1XS7e%fYSy*
z0t1kceLTDc-WA>+K@rU};5uVOA3+{uSk5n%MMy7#Md>=X*hu}%UH;4mx~;N`#KzfH
zR+K^r`PYJ8#`R1graFV=rNJy^oWK&?OP<LX{~}bxn$JCXv!8Zfe<Y;CAa9H*{5aeL
z@spdA*!rEn^QuJTMVynS?aVV<ja||21`ZA7abQi6{?+8K(Gis7tS*`0pu2z)UYTe%
zsSOz?$M`~5GH|X@ezuNtc}%9jm8HO#PItQBoYnc4RZ;BM1@=DT&4^aW^RIX)!mJcT
zSXv`wPzbD!PqGNxM$J_G7>5W!DS7#UtW|k<3!U|5gIWcNQ)gS6kDzE@Vf);I$-6Pm
zWj#o-o1qGxDxv~cT$T8fh&Epx73iE0?9F{>yRYYdr79$q1VZ_Kms@-H7{|C_6%cM*
zXc_Z7&MP93ENf*_2b^Rl(h<t$8kwZ!r-7-q>h#ZU9~t4+WTsMp(&whz3$k8j%igJ+
z6Z21Y8Fa`#tq3pCx$|udG-e@Yu<>?t`hHdD238I<GJ`H@R5Ay>zj0vJQlGtYG01BY
z6iA<=u}Z}VqGehoqMe|YISN_ts?qH`>73OX(V8Y12N`(CzMgWQQ?D2W4)n;}xrN%g
zISbz`q!#lzKHJI=I6tTl#M(8+6Wdtzlini&ghlkK#grPYa;<vvq1dKDaQK=X1~o*}
z4_R43r*0O?*Uhtw&<mXmYrf*Lh}03*Lm=B5d5l$`>Ow55G0{iI!fgPWd_mb3w#chu
zBMmZs`NV|tV~&u;LQ*#fu;Ns{Wi*PhAEg-NHHs4TWs#V?E+F)57_Tja;Vt@W<IgOH
ztzdz8rQZ(lI8$tlEMDHg0svoSl1^A1m3%jP0A`&<aJN9cZ6>G=ioVZdLxyofPhwT)
za`*35Vz^-U!Dd4B+2dX+4LFFL5?a%{vkt_^bZwmx6itVRRyw%6$umk|c@!g4XaCn!
zk8O=Q3co<wBw5_{Gze#k0LI;IZvp`%XMG!Wpb@+SzuX^6waYVHD2vF75xwD>E>6fa
zz?}XcQ<aCo+Qu6G{3Qu)>9B+v1iIFL51VI}PQ{y6<8`%IAFj5mTW<^3t#OA%=_Ybz
z-`W%8YbXbyF$|xJS?0-P=2ftzy$8^m=cm!=Fna?LcAwuYC5aJN=;kz<bmtmME07q6
z9T8(1S;&rVb)$XrseK|+vAt<>ZXY6KTQ!uh@CMFX&emR@WhlUnqsnh}n?pTN|Btrs
zvYZAE;;E^)>lAGsW}+HYI-C*!C<0Rr^>iMNk{XnS&mCA@HuDwJFybO6>4-mMjyIrg
zOqS%*<w|!^1OOjXhV?5Rt^it6aLbynnyQI{a~2JTUDRP0tdsQs00RIC61tt&eMoh)
zu$rpk8nW}sJlR-D-oII-eY<|7XIwX%VGU<fDd*&RUYR(mP@lw<On3;)SmsxzO8pnw
z64Bzhw=_8V>M0@dQ|ec1#B)f9z47fZEbus4BA?xNOn8}&ZsZ(b6R`0HrH85Q7u`qC
zWcJJUn+j5qj2Sd%H*R0RJ5;z>a{=B*WIx8>ZA=l!kbgEHwigu8!8TL6L~B0cpM(Ag
zvAV#dR$y-MubQb7&6fqgk@?<TZg9~TFSMrh*Ed|4K+QQGog>ONg*}g)5zW%kUPzw3
zXdnY(Yk35JxfF8WqC8)|LEq+0_TDZ{oK@$~LyP6G{c=2KRk8?MwAVU2kNBKHZ!%m8
ztrxBc-*mEzeze<cvb&^&(G#9mXcG|EJMe?CB<smu#c65S*Xe2;LUI+vY!!mDCgOCd
z56JVP+@WaZS>F|b!U)ax4TktBnX5}G>>B!utQ5&O{wQ!BDKj06opoYiW2f+Hg#tJj
zyB$65$Y(8?Ne>=fDQ1ZrOIh1u>yHdzkGkxzFAfQM5~nlLK)Eqjz+7-{xK2sj%~Ig2
znM8F#gVk=Qo)Q680K4BgC}G@gs9~Zv()f`rHs`DCl)lN^$A`C;cgVrf!)J+R$bcE6
zS)^f>{f^VTzkV|6`6;}bQxv2)jmiDT+0Ur>W44GmYW?^*EN(_d%k(D()rg3cOSdMl
zbb}^L|H@~C?G{-v*6WKT8GqHN=Po{a%-g^U8qi!qT27S!>O1=m9C?h1q;Ny2g0q0J
zT~m(K=}lV+Sj^N{K9?V78<Crl8Q_y*N)}kLf4u4JNq;n09J51wAtk!!o~%Y@Ke&o?
zZsw}IAg41}G-k<)Ki-XPJw{CklxZ%l&SV;$qc6>gI~!7KLnC<9+fvv$B*dA;P>tZW
ziqQ#nqKMNWQ>b4a44_gp6Q2TdS6;J97wNb)Xgj0!8G1!RiysNLhd}pN%{Ec4N^oau
z`Kpt$ohd&l63U}6pKXRV%PfZM!0VR00WT2Zdu-8Y!K=k;UI0MBHsL0+PF|tyM<P!Z
zD;!NLlZb$*SZ@A-_rrB%#^+fmLh`#McjL$BE-^izfeS?$Tz<6U<~gZEFwDu4i>Q_q
za8%W$bS<n1hjQqrz-qSYzaGjnV*9jKS)<?!92F0{aE8u|nj5Tm-od8hg@-w8C05BG
z1^g65#D$E}=0hnY1*L?ikBMAqVa^_>;88`oq;jzd#wCG615v5@jR=tg`yws@C<`h!
zLc%grl@Pnbq$wf&=a@Z}ZP^F|AuohU1n>|S?s7vIi!7!@8?-;f7nLY}xOxJM6TN$q
z`xm%Ew?#Yyvy(!f2Lo@RABp1=v;-V>ajw&L4C9b7_s<j9W^PatjCc==MSS(umRgIF
zl+cGUnY^xs0^uy72IO}^#$<oQ5y7lWC5`{baJlP?Qqx1F?bM%Xh%w-({Ek`q<vVih
zHt(saaN$r>XE!QvNveWAd8G)PZQw&=Aspf`Xq)I<>gL@Sn>>=5n_Iws%+WAn@`<c5
zJOCFpDz4RdYAl{y$P*#l?`QN8QZ%YVB1Z1sj4_mU8yM5}$RSm@9|Pdwv?zO9R#}^U
zs#1!1&kSDTB$K<0sk?tHdvBM1C{_WS8Kbanh^nZwqR=2*hcus!ppVw%?Rp2CS=u`x
zY0Dg?gU+jz>9l=bg?f6$6RfWVtK)0>46KsPVxJ%_EkU+w3hxcIcg_hXVO}Gwux*J=
z&WZ#$>O-6+<>LJ5XZy%VvoJ{ciNL=L5mXE9N}l{awik=pmRX>-HIE=hMqjy9qERBE
z8aPKv6BKKTrg<d9_a9Aajq%y@x4ve*!c+zBnJ}u5fm1*3cE)|WUnx6}mS(x1YMnl4
z=H`x5Y`-O`+lYJ&;-ksLTQiiH+di69`Kkt$gkJ=#sk;t_Jto44f-~C18#)>rX9yji
z)0r1d!ZN1@CsMRn)8l-&BTzpTlA;a2lf7XuIO2+}6EEr_zk^OQO}_cGfw5|K0pH=o
zD0Y%=Mi}*iPDVCHjRB7xCK;ol_)NU~zEfe`0ncCEHCB*(1f7pRi)(1zwTc;$%Fhp=
z>v|<Wv3*52p8AlQFSqAnY2rYf-=5D+`->}h%Cz7RQAS>R)tE$8OJ(?XkE?`s?;bj(
ztz|JT;xq~{S2~>nOxkF1Xrt_1Pz3j=K+j2y4DT+M{#vo+f>;qrakHdOu77fWq>~vm
z@=WZ>2vRWxNrvm6nTJ~#Lb(%*u50XcMX<*U6&#(}gx|;I>|g)}@8!eka(ij}jP?-8
zsb>AeQ4Kzz_RwH!GaRcx_YrQOi+8KuA>6lHc#GZw!C`+R{?z?PoBB8A@-X7I&FqA~
z*zu^<#h*fXSwZTaZYZo^u^B8KY7Ib0LGrNEmsBo~bHl$fv^sdZAkc$C=Ae;>WzOi6
zBqw)7O~NDmiS_;ifN8TqqFdH~r?z;}Cz|Yb6Uub2cQ%w+Sj6dZttB)PS+h)2y4LZU
zsdH`RwCnl_;0M2sy0A0gu&zizs^b3mFkGktF@INRCz?#V#~Lk6KN*4f5j7Td;j>=5
zuWJCY|Nh!v6q|hYL7Ao@dgnE@nP2KS(7|CW8Vgt|(!7XD00vpauJT?T6bthW9(1#S
zO|!_^spy*0TlfAwLz@<JE6gv+GCJ$Kv<b89A#6W7|9mEh!;0S<^eR(6w+BG{ppF^+
z%6CQz2r@ranVt-tqXl=n?7;jE6KK~M4)92IN>SCR@lcs$E^M1Tm`oqM1*Xb*2xWwa
z1Q2xu@!T9Q$D%44#7Z`i!myaG@KY!vbS$>2#snEknyno23hBaO@EndoQF`2v`ns>T
zL3sh)%&q-<1pz9mv9fMOC$(@SeM%gJh)nkP4lCQjg>s<WFzBTGv$W`sW9ooX6GASC
zJK-8XkZ5d_g1?uI4Dyij)|!)PuctGSdCs7E!e%yMjHk}qWQdK`n8U~>*!fbu?)oZ-
zm}qN*fi@`R)Mf+9#}e>IpfQ`8S0PTYVh8VHHT<rrGfi^;1sBYI*Ee{qpDEG2roafi
zCiDY9+CBq;70(xmS&ByssU^!MK>bupk|(~T`PmwVC=v2tUfPt`c#mb_7JQY=C;9A+
zbp7nAA^QTxxI;aqUb|qD37$!^*K;R9IebN*o%GE~{cotgjpMrkN^wr^<^3EPQ2cYf
z_Ny-M+<PzJk}0!zJpWwwPJ^Aq)|+8ahg=X~gE1gdIiIb<H=dAzmHYn^smve%2x>!$
zS1|6*t`bG?oOeksD(d%DdT3a+%~anh4&<d?*);C{SgMTlT><h+-xpu5h&pjY-uQX_
zL(gGmXLHefF+x?}W<CAWoZV<6Y7EPs#ID!c`{>awcwdQ5$wtVonhpX$W}<48IiS<|
zRe;~j<Uc3D6xGrT3X??iC(x%@%lzW0SDrOfx7~o$Bqe!-q^aoBA3kRX?c%UgNX;R$
zzdb#@3MP@60M}YQhL*8<R7^)W{C~XF%e6l62tl{C)s5#&J0P~V7tb?En?vOFmrCxE
z6w-pNj%RXpa)t#%npUiU-V);LPCni1rU<cw>Hw}2nb?UZog}42tg0%tkwIp^!C!S0
zJ~p{B(3;VJ&vtbcb<U@T7kqdOh77a7nE|jEMP1Cm?`hoOXE5{_Wy-U_FD(8CBe0VQ
z!fBtc6&0}A;H(FJGde(q2X2NcL>BxUo}gM&@onCHP>S#t1SNcGIju6N3iIZnciVM?
z2WmyDd)+eR9f)polZ)N1c;BAg3?8^~n>7z0FQH~=L$gl|K%Y*6s5-&a_6@fCwX-X3
zV#t9CCz?NECXLyHYxBtkSI9UBCevBcH@ji<csIxi_;x#A><A@O507KzdUA#Z?VCug
zasd?^7@C%os`nyXzIn#WkxAP$aPfp<&w#LYAipg`aKca5L++gR5vd#)WT!BB?As5i
z+hgbmIf+vk9F9L5&P{FZVRKt+n^I8I!u4Z)(7BYZx<Ab^7@EA$iD2*Z8@5B~I7(ti
ztXFo-snhF*oW4J|ho*3fTR|j+IR(+CfbN^qp*sb-o=0H|iK4V6BS)UF*|bX2kS<|p
z&hDBB4#8Cy5tQLq^FT(AK4cvX1m3_7i`t$v^sqWxC*M5?rO9K1I}dU8!N)-Qt7gmF
zuKr8NU1FC`mL=~Kg8t4$ijUA7D+$uc|0E&E>BwwPgD}%C_k4P-oLOjP*0TP@u-Br{
zQ?F$joSCVr`-0VI#r9b=w|lZ*0jffreP16pa)RbmLYH+8zIv`IP9vnHb&=__31z9|
zLFx;6r-?wIJokAz{jq=YV4XhSRr+#{j@TFQQTLzY@{n-T=Zy111}*{iVLggs<ii7e
zRfcmI=XC(FMISHyTK0ex7Ffs|2Yfg1(}$&Lv!y8C52u01S5?SmWN9s#Rhr%O^?O+r
zZF5;$m4&zkr^t%7H%Ij>nay1?P(7`c$r3UkIyEf?UscnM#Ifhc8Y7|M{jC!)vSdpB
zVSzrFKe2?wrHEyp;CGI2VavGl_36>sWIDVg-vB`<QYqiu&>(3m(H;c;O_Yv<wjA7L
zQN2@giW5+@KTF=t;ZcplzYhtTh=$F4+4!9)(@b0>DH()eCpYM+1(qj1dG@9FmTcT8
z?$kjIo5G|@tM0FT!iLnxQ#FTN5(P&rPU3)%u(VMz)F?yTCsZ0l8GhT8cfb14sD-c4
zIfd^QyV`!`PqJ~xUHJP|ppMsd`k`-BPp-iQ@Fd&w{H6o*kV+M)IK=Ab9{@Wi_3rY4
zTgMf?{WnQRgU*8Im?dBS``);QRS19a+_jI#nGCaITxCfR`N#t2&!i4{NHCCO*5i0x
z47ZzKm7mBqTT;JSqaulK^bwZ2P1@CWippQ^`GH)I^vNRO7blbcdac3ln3pC<qMVrW
zXC}LGZ}P}|En*EkUU#7H4Qd)q9}z*b@bTQzbm(nex4@G~*Ioe#K{|aHl0)Oz+`7`P
z|6wA;D_?e!B}Ek8w*WfSzlE$Kfdp+#lqH>SF@%hHXbOLV;Qq#x>n}KF42_BJ_3w1)
zh7bh*9XhW5yrCk&Bt7~C!atxQw%OizKOLvyTiV>Rqc_bZmaf-r1j+%7j_)+G9J6)L
zRwhNrh}#|KV0JDoSD<8QXO<A(`#6`O7uN-u@WX}Fm=6u3IDn2*4L9Bj$BCc~$^={~
zK*-zRS-fqcUkvk?rqkD5`}fXS38@*v2R;C=`)5fira@%RRhXKhSZWCgGb3JM=3$Ap
zpPam~>ndBhg@)(z^n_B0eZ4q6ZV&mb4MwbMp4Y3M734Riu6X~#koQz+^ml@9rk+st
zVp##~xkpnKk%--f*oqb>j894I8rg?%%__$10Q)JvZ=4k<f8hV19q|BLK%yy4@t$gn
zAbg^QTgN9+dMCjg{P_>msBl^#O}s4l?3?=&RY3kn+CaGkXB=8x6uas<Vir`ZcCs0~
zB$+bq&W}q*oj(B;#in6FG1auhweemSF3W1&bJK$R2(9w8hvc%mv?lLY{4kuH3hS|C
z`z*x)HQv5S3H0C`IO!3k^7*@dfk2SYpmt@6$9ehp=}|Vl3`V9XdOyi+{!=%jD!DXj
zNWn7%qV;_D{%9k*Lj}ySJ7@vaYzs9Wf3K8sV$0*HR2CQtzsI=G09~-KA=y(HTKeq^
z59pL-7+wlhA`6)6*D4aWL+C(4<igL+jJXM;<qO=-P&@&nCy2=6)Et=tz_yuOu$j&n
zW=1hCgO(RLFu}FWoIy^&lL*C9i(i6KE$2NCJPUL>@6V*yU6CuM{ntCcVqw_T>yBE1
z3tA^%L}TbZw_e|(Ew;!)yJj8Q`n$RrF>^O-HM3m8G$A!BOlF#x>}@lR`w~?xRn>4u
z6)U@$#wbUv=%dHeu?0k2U(=Ey>Y)zm0(sMsoD1#3CY%1&y!gx4dVm~`8{ePSUU%%y
zkwGi@N5u1F%L0bB5`68|Kn<SH7?_0^dp@=;8(jOM(4jT|HTNEiFty?HD9$GKM6!2H
zJwsAXqZ57o^0b7!Q|&ML5^TbZdc&wm<q$wayd-MG9q0l?;2^LQvWR6mY_jIuB(5{3
zF?~OY9Kv7#00(?Qn-3Tz{{R5vcpJCNU}gn#F7&i`)kr;Z|9rTe0x+lVdX%OkwbXN~
zcTlz3Cbk*dCci$;PMR?GkoOpp$h%YPq$yQXB-HP_Ib#c5&xyr_^k%_SbvnS}u?<fx
zs*@A=eEkxChWPef$wZx=mpo%oo)4LR4+9*dJG_uf`(e~Z9FHo=z<>vtZ9&ip<HU?f
ztTb^w`w+q{4qbXq%&Z7ys{A3&@9iF6O~hCvmVvfc)Oe?d?(po`50reP$dIOw0*yh8
zHZWaHYyE%I5m(sB;xzwjiNxKWV+WgPoA+^ED>X-(6vxP?QNz16a@g^;FkMahu~{Rz
zDI*&0RCvzil@DR~w2;o>E!iSG6yI>P3wm1L_CIsOaChi?gQVsK&V}I%MA>Li6VKhz
zT=5juCsm_=h(0m8@>>%Sfn)19x+ZF3Y^|HOUE;AmtLtCQUV*|A8Z4d;w_HcmO{2my
z3i~|AIAO^jCpSetiP*iRGQ$sO=MJIZhnx1jIN4swG!4FW7m*VIn}w3-TDk}i{fHCZ
zK=5Y0e}UVwBlv;qB|?kFN!RNOE#8|5%W1hSkDqi>peDRydz#`@)K%!oUiV;RV~PqH
zSH4Gjw-YoFP%+BTP@dPL-;~ePH+*mBACwIUc=m5bA!6B?+I0qjcsnTB;`j6{soucK
ze|u9HV1(@kbW(aWB7yMSlvDylAW?z|%{Jo>gWhNPa4I^YuvoPnIP0I6!`WQuW5)yR
zh(+)f?>m*ntX5w_q?UX}p`?^BsCic&br9s-fM(ZOrF%JP5qNUh1X|puyrn3y|A{81
zW3ln_94GW77nccRJ640zVD}UBk6T=Mj+vq{H9aE~z_SD5zn;TeNN`Gw0zPXG8jSOu
zRBee%a@}V+wYLRc;j6@fp!})Gv>AKQSKL^wm9ipOYsqYui{>O$KyQva&Lh`8QIM=9
z;OBFkt04C8TZjTt`Ofg90Bn+4Yv3%_3TQleJ(Y7mgcN?v)6C$dGWyKXEt4-cgptVI
zWWLxicdSaD15e7ltq%+5`I&>C=yireC<|X@@+xAW(8;Tq`*pKEh{8M;#31ghU)^Y~
znzi2Rv&hcQ0(0)`oW3fECgywKL0(~8dg~JE;BTypB@Rr<!#;+04|9chN-2C9JSd3U
zP6H<v4)y++@(Es6*e*&U&`=N*M7&Gb5|x_b2&a;obO6**<oj*>J==N|qCapEjX{~?
z5~b?vSgiraz9gCO8q|;lx197GVkW(B2{<c<-Z+c3eDBb_BZ82<ve1U<;>7wJ$UC8-
z*;V74^B(mk8UN*ZNBoS?B~q)0wba_lPXq-!bx*&5>Ur(KDTpY6ID+>C1ShwCDU2#=
z=|>hM55Sk8XokQAfP-;}Aq8O<B}UM=sdRac?+E9E)WB(4_cKL@IlEIakp@_b7u9sU
z|3D>w1Bcev$3uBCoQ*p5jL_^Q*^lTsjOwplz{0Ng+SgqpF+~U!j;j+4e7G=P@im-;
zy`oTg)t%7iZk#Eh@A;8h_WlLMJF2S-TK!e<4!$|UL@OSb`=AR-RJNZRy)_tAaNYRc
z(_LhtP^^TF<k^wzg7e_tF=_LC{{l{p&wSq4oMo8SgJ}oZ%c3JncE1&yO)EihPdpqg
z5wWr`5rlTkwX~zkZ>wG4SV|2*(<jR&ae)*zY6Q}G;xGA~uhpg(3F4@6D?k?O5lR(&
z)m_(jNsjuAX3~kPCy7<XIMt%_C>&U^DP}$#-SPm!tOHhM!!!AKh>t)P*cl#Kq$t&(
zJM2@)HO$V6x80+{)no+=qdIPr=I33aujVH(E5<Pm!lEmFg^KG9Q&=)@9`&{$-&-eo
zU=BWWzKD~%uI5D3^Ne~Gm9gK*3q{mLy5>Y#{gSKX+l<=c*lAV{PER|Ctoe!cVIJ%7
z4}afyecdipO<ORHRou!d+^u8aOGnpp6i*=)<q*m@w3RYpnO&b(^YoO5RRT{csD8d|
z2euO<7&QfFd{za1oZY?E;4TW7{xvZNj=L{id%>`6Y`D+*7DW2w6lbb}C-q@OgP5jP
ztUKv4stT6Ec(?QD$a*X^BtkKDKd&T3j&%ygcNp$L;!-11S1AKdbMKzo+l`$<jHCwy
z!mRXv9Q;>O^Nx&YJdgd^`kc}O6%`=nSA1Kq$I7r@RNZI@SYP7Bp$mmnTUeYj%J{2?
z-A36x{0)MdzLaVSg_=S|JiQf;_){m_>S=tygz&_D{$fAO-tRRCNDlp>WV(%w{Ve0|
zlQkVoc!OL>)SbY(ySH=oAQ%}-d~mE&BlW+(L2*pkXJJ#9wYViBsBbwVMxurbVx+Z9
zqO;&miO2|JCE=L$8O~pZn&Up$HY7A`{qoU@&AUI2gx9YKg#<yyhvym8;)gtQGS^;M
zGv3)aa!>?z{cvHp3%tbFh{!Lc-(!Ln@^MJUql^MT&-eyP%%O2N=tq0bgTrnQoJxIp
zvG$s*kx@UC>)MSU$1J*hc1HL4@HW`e)zwTrv;5s4p8Y5EXgBTY{I33OA+}zs0?!wV
zfMUS_00BoqpDjfZJZAthcjP1h_p~W4jXH^pjrt`bH{ByC5diJ@ID^%|1|TtTts5*V
zDs;=zfNZR*bmD3j?V>~}dfS+~)B$Wg&`S(M1=jDd3`HLMDq4jcSe&=WvY8&mn5y(p
z+;S(g9W)dLl7z&lZKa^unfiB-4CfZ%<KC+@Pn9T_w|Ta>EmuG!AfOajfV<Y#uJk@q
zd#^8z8RMUF)0ud{QNi(g64vITf&e&kFYUG5AouI3z;ab9FXQ!}4L2R4?J>)>`EY(h
zCArvTNM;NFkVQDMk-H<gOI6^Mlzmt;Bb|R{&Jp;oC(OyjyW|dt-xQt?W-7iL<c2ji
zhzr}kHau#Y!x3mAqRGT2oIIx-8o>#ulxBgp<Ph@;h<Lq?H@Wn7le9;yfWNd+kX_(n
z&n~lZcj9w~(dqzZ2H|;7`(4Xu7!d#f0LTHKPDCO905=tRsDBo@yuV;u@d>}scf=yw
zXd?x~17iVRHp!e{;P64Y5Qt=bpvqCLC7hY~kkTxt)=#rycR;rG^BmU~A`1cWzBS9z
z=@0n?`XaqwHe5%S8GXL3_rSp*MVkZI!X`Rk064)|zBh>>!F!0SZwAlV7aT1@4FFp<
zRZL!cRS@WWt<4i)0dofJP!W1zXk?#bfB*mt;b=QhL;x=dqax8~CZ&)NQjo-WKmhDk
zoy&Vdrqg-ViO?d}000930#5({KFvX!P&A~$F91ezSVQ6;;$cI)Z~X$P{tq_5WMjxW
zV*k_%-_?l|dAq0<4p0YFR!IY-nwLpj6u5L7K8V8TO*E29afV?iKaTaShtz6XQim)F
zIeTkM%I(kRL5Qy8cSJp=`fmj<JcHoK&ydH7J^e=OsH1NQlsCs(7Z`Iw`_o?TejDp?
z4Pb27EkR;A)ib(2jkq}UmDr$2yqV{7tR3XwjhcnIWMV%veqg6!*2%UCl4)#-v*qM{
z-s3M`<IUR6AjN(j0dQZXJJ5sb0yz=RI1ks*2{N?f#n+dEN;wK;3>K|PI6#|sW7n&z
zf&;d_tkt$@X20^)A1!QkG}(tP09esGc7IbVYc0VANZeUgpCsf87ph!p$D;KQO)ACM
zj>${@V5}?C9FrRSiVFF}&Ck>d<34SUx{~03h*GM7!dzYu{bY-F?5b8%A?h}qfmQG!
z@zBLn(qbu9l1nHCEa#RJRU_dyDUy(O8B}D+%dxhqdRz^O;@&X|;{veKbDt}ReWeqc
z`|9r97In3IQ}l8Z&!O>$kv({Uda?P;2f!s>l2JHOI6zUq23*yJz>X^(SL^0eKU;Ls
z0Y*m=fw0nUVJ<%YINeHp<ry``D@ccy{2>#u5E<dP%wa}46>SFVf?p`I`6?)Ibln_Q
z93acwop1{uDH0d$p*R;2SbBKk2EQLTN+2RtZjgEZ|L%D9C16HoN{)f<HeWf73wzys
z2mj!%u`$LXkt<74*73R1$r?fk3sfX;v<UC+cMc*cw)t~Msv@1MP99o#uXVPP)o`bO
zbp205b&4{2ElxlxT(4Jx${$7H`cJEF(rYmeK&LD#@?8pLxl9jjaF#g?zJ7Pb1?ygg
zu(;12V=cxgYs%sBJusmF!V`(lF!1xsGyK5r(6Z-DXmASO_~9{}gii_OG_7;2zxbVY
zi`^7AJFQY4$g}R-v_q+(MnSuZM6f<{JGVzqQlAhN`WD5OclhW7d8&NId=Jh6Cl<}l
z*6n)qlPoaTP9OZE9b^%m1d~noh^|16N5{1ksld<Yk+vO#+D8{fb#rW?s}^PL_s|K&
z7q7e__WNNWoMVhEYdOL4`SsBvw<26AeZmY>=7mq^$6v%L4Enc~8VBa}uq(p2e5qE_
zt+cj4SbjP%jh8PF)eo#OrrwkjxTgan;3X1N65tG(@ES}2Am1v{*>(?9god3=BI=fa
z&xFJuCU_>&i>MTY6(O~OFTGun7;3Zny$P=bzgMh}=&s)fROlF-5#Kh8<ig#6Pw6kO
zs?n2(_j;r41%yYLn5l>Y_2?hc@$aXK#}wsKJ3GZUbvC`Ex}TUt{ihvkQ$@SsS|7$4
zJ$o;!$d0A+L~IaLla5+MW3?%IDsh6}He2{l+PyQeTLKmA0R-H6X|aLgJdG^~026su
z^I;uH%O1N=f`oZt8c7$Y`9GTqshkI$sODu=<$3}s(eor}Nkwj0@{Ieg78((YhQ`nB
zwxlUmb=I7|zdf0GMVN1se`aam6<bD5S`Xv~&EiaNy_;6gd3qnKbyRv3GdogSgIz1j
z0NbBVY<_DcI(VB$Y6hZ5Xd+e$+$<q4<DLw~F>!3G4CycYs-G-~{0z%O2`qDsYRH{U
ze3N5?tP!0|YWlD>lGnYvD-iDsrS7~HMNgxWkHU;88gJj>c*8KWIKWUyAbul-Pw97p
z>rGqJ=Ge<2vlp_V{gt+{PmZ_0@L#a}xGR9QAfaY2edGo|Bm!ABwEXO?@89-Q0vC1T
zYQy(Xu_FmL28K6-V}N3N2=i4y?MKRH7aW*K_`Bct!!DgpuYpIHhSxVVz!SHlCE<r-
z*W&tEIPe4e2P|(QYDOi#y>NSZ#z7ETR9>y%Za39Wl=*xZ;jjasB(S&!9^J^*TL=P0
z_!FzAR)uJ!p3jd;!7l<I%tt;k^y@*l>c70JBL3ZjJ(b+8J_3<#zQj4xnLMK$43jy3
zf?us?7xwG)SiC=^Ch06maB8GmOQ!=#NXe`C_?y3N$r+FxMo!;*gZN><>1jGk$9>w^
zFYyRJi!ae|y_oFRz2`R}5wBj*<$#9j6XVI^V|r?E0yZf21+Ntjg+p9~SDN7F(&EV9
z7k@S6n4&=piVi(j#{k7cC9Y1SjbmbOx~%{Jub<?`@#?$WUy{>QvOmnu7CI4T%u_y6
zgf0^2Qt0oARiBYXRy=b;)KRV0-bTeX{c#ExWZHj3VP+l`SueK7>Ly!mDe9!R*Af}=
zvSc<OMhwp-sGdZao-@pYVKWsM2K#8tAy+}MKRJa;q@0vV&hh}LR9NLO&d2^Yk6X=H
zn(|-wbnEFq6<?Z&_4dZ?-ym2_S%SLe`>?Q0Zls3^M#mMs+PWbMrp-VAFl6op3k*2L
znhehobJJtT>Y_n|B>J|~DE{yM8_M>$zqE)*mO$myU)Ie%;lA92IoPKe-7-S~D&k1Z
zs&K#hAiX+101n}5DY<EQXH;k(bzG*)rw*Vx*mIy$lTH^DE~JfW=6l@I9SWh0^ETmi
zl=|?Y30IP;wB_lEk?cqez<c$zec|LD(&_Ks{aRm3PFr+&@exz4pS>C+Bzg{y<^;?{
zZJ#_;-dJ$oI?hp#=c3U#EV#kHdVg!uU9vgm*#f)ZhgHQfz9Hf~eCSAA5@SXGBNOgD
zaInJ`kYlxGQNCvUz;GhB67xk|%zGA8?4ofS<eaV2GT0O$n-ZMb4zM7S%!Y`!e^9Cx
z&W6M6xDR@iOEnmXf}3Kz*w_cBgT>rsTvG5&dVz<fP<mP**ZIv<1$;?axg<kU^Yw}H
zcd_o$a<L{VZGG#1K~M|D+<ztOH3usiTfTH?)%nAW+ej%q3LsQ8*<VF41-3{od~9S8
zlne6w2nt}%QMKO^1X&4AM2_u|!|r4>*N&v>?cn1|29pD_bl83~4wQw(HKa%VnJt(c
z>qxzct6G?;JF-9W!tw->z*5QaAADPm3tTPPhqiu7#<RB;s6=GmIpk-LvOljseious
zi`c#EKT{M{-_o-g>MOi2+prVh;VroNgo5<zrGx$3oS;P?p%pwxNb~+VB<24?8xW#s
zKuCBMF-NoAl0#bL?-R#Q`{gdN;7XOnmWq421*E-xh$7-GEFRpl(QJ`{-(YFPb9>RX
z!}S~_cTjuF&648FIbFs<G-FQ>V5~&zx3evtMl;xbUX*AOx4mh8so&vF1UOD@P(f>t
ztwR4o6V#KPvk}l@>qA#(hzxH0D}fW<lLL`rx|F5a*;zBQg{?Ee>&{lwvgKbc#k_y|
z&-jKiQiIO$0Q2w;hY`EKcx8nm>~&Dk;moyPIq)h;KY+DcMIwU=939o3(5eqXYLRc@
z6}tC#8lWJ)sNQ3Kn;>xKKHP;NoIIN4(fc%6<^TYIL6!cj!Drto5yTMgcL#ZYxP0+s
z2jUaGYqImsIuvtoSQ3hlhJgv#HBxSK3-3Fs!E=AL6sOZ}`Z~mcM&t_hQ+ih!)zAI?
z_LQ+TqY9_@<RyqV5K!y|CxCVuM<&_)-{0$S;PM-jIOISN!%2e~+m*;6y(nzqAoe<3
zf@&u&ey0!EGYShH3<ARl>g7eeT((?oq8Y^dXExlPioLVmdFmn8mqOoWRgFt@5Pghi
zaJ;eBV&QJ(15HpG<Yn0E4w)R8hb0yC=9dko$c!i@JjLyz#w2(nIfPR72p#3M*op>e
zay2Eq@@!Wb)PU{7LMDmZ;%8$>t@&+nSZu0zxpF}7vvd^S(L^(Y@|E7(Jpe-kGfad%
z=c1wXk=AFuA&uG&sV+NAL^p%LWPVf`&LM*WwGaVOj;+P=ovZMsTAac-1jGe^Bae%l
zbbW49xXhVg$tky(?XKa;VUd?I+Jk)%Uh~89vX*L)EI>g3(gl2G9%Va3*CP3I%46w_
zkPT=HcegI(p%EE*Y{ER}tF*agi~7}cNApvfSEs7%$khWWe4#pX38&fW4|X}To){kx
zYHx6Hr5Py4ORWn9m*`T<Fg$#Onb0i8QuGtBu7amfWVPF}PO}j-v-t<yqmM1E-FN6m
zQ7ev}VRc5T)(G%E6Dvfm8m{HiE$j`wD2N3MOIuES#!ZKLs?HrPJ?r2<A7qe3UgP6D
zb(j~v5_LzgVe#I6wJ8V7_wqXf(LFt5Mt}^tf^CNoBCRNOAQ~-fh{_@!>jivIN&gQm
z6q%*6xe<)e`0iMq|CBrYhxoUiPgQj8QvivF%6k#!TcI4vA3`)ZzVsWl0^^ha1m*Wo
z+kbxH4#Y{iEBo&2Bn=K)`6EkJ8He|w@%{7=w3eDtKD8hY`IrYY?{w5}8rAmE7%$Rk
zP9?7>Meag)OPSQA7+OxGZu3J@)ci7axZ#dc_jH1aW|K_iCPtbo7#_{iMs0`=1k1Fr
zSFcWecS?PLKn2Hsw)m5XtLenq4zWBurj6u}Oz^&L4_%MO2c~@S1{fM-eS?Pan){}c
z&~bOLbY-<W{qH@9H7h@793sO3E~^@rZ}~UF8V!U3x7vfg3Bt~rT?O<Zs7=?d@z=^f
z|0a+d+>6HZ&a6f15@8k+ng7!&LbG%$k}c?~6i!k-4tbF|o4EbceSE;cQ7Mx&d^+y(
zjk1@}icADupDShx)$E51rZg=NRfLzqiho4#K??=*XmjVoU+;tVsYeO$Yn(!|8QhC$
z*T8Y9z24^t?M445cT1|8n_)msu)UA7Y1Z|Z`9<mbNNV}<amRmOBO-gaX+_h<lwB+%
zTb}`#Uvjj^68K140lb%dT)efRnkV5;2k!wL{@b&0#WbIO_4PVc-&+AtsN7cl*q20a
z1Bn`x)m<gNhx4a=CQzSQpPSPEzgEfABi3|2@qfX-Sr4t4%fJ0v4cglT;opET#x|_p
z>0{Q!v2S`Nj~GLUWx1WQB~7-oTFaO!c#=l5Er;167qQs_un$fSbCUKx*z89Z0WMva
zL`v84s_i@>r+hTK)@&6?U6WLeXeM>zN954T30*f#<KKZ5N_}`%aN(F0R={|fu>6?<
zdpd=^AB>mMI*gAY!IH%;lCZFr`2{s9nphHT!`#!V;R_255xkMHt`Z711*hmRk8RH#
zYzZ1LHf$A(CZDPkPVw0IES1-Gm}UzU;p28NNsRddAoVjkn#|U8Ie1y&Sonvm=1H83
z&EoPF73_)i;|&fPm*S9l3xZf+@-?(QkAlPpt#cxlU7!gRO|EDTw}l&X#d^Nc*ZE*5
zdSO%pMa*vOHa;AZ_U3W3^Bj?G^yNdLDm&J2{Hz=X$W$CmM*w@s#LQ6wXF7b?>uoSO
z<Lk>bwi<tp^OG$GaaP#Q65I`d0qH5}t#6dyuD&*1^dJC(eobb)Sg_}qsQ{&?-+d;y
zt+#+cY7>c4*J`D;O}paq#{C1}a3{2rKK5~*2vt3j+V<T8jxPn5karE)mo?nd6ilR|
z6}ypKYNR%z&$H>ug0+Jyh?K}?n@3(D^12HUasj`#+xYe6F4rC<gW90cV%p$*+p9n#
z>^BH67)?{u;+Gzoh}592I%NSz!d}pDRYr>2N@+^>hEbB-Ppjxad;{Ekd>329)u*^y
ziY0Qq9nD#-9F%t|Mk|0weD~0=l<lDxZa23SL?mxU&@dht4dglGvk_cL0<t6&4TNWC
z5U`M+vxj1j2)v?*Cfu`Ls$_Rpg<C(M+4Ul%!?G&QYj53`!*J$8_$-)`P^KV!AMsv(
z86c+ZOp1kS2ul4Qma+84HjW2GzPF=rPlp0#X>8ri8~?45Y0`kcVuCBSUy;shpY@sJ
z4gM7GCnppZxp8hUB(|DSXN8xBY2prX!mJ5p|NO8~Skss=<N1N4E?Ma4F`)*vNu?SH
z;s#p5ppB$8|4BWl;wcjM&m;NM-K&@X-aRuWoyk=K0ZWFhqpj(0kNqC{y`OK*k?sOg
zkc$mfiURzCF3*=s&dFZ%)iC>#yjl4!w*|Fcj+bVA-aF|6uaX9!SC4lAw=m@mQEmcv
z(+y*tI46%0giCWr`xxHR#42NNXlV7Q@^p`0<sCAxpO>|LScO%ex%#OO4`Z_n7_BLp
zwkv`iJByUTc2<B^b+M~9#)ZUEaBdtzx4v8M+N|7ABaidD0;<lTIm=uIYx+tD3@-j0
zE__Fr!^pa@hMCj}*0=RVu9A?!;&x7+ct&eWny(aX(c0G6-s;?d2mQlzO;OI+^ElrZ
zt(Kuj>??XZ^gJ~4@j&Y`Ao5<Lg-b@5H?%BDlTcLi79hBMQFr_p1%V9DM9$-iq})a4
zjq*O=s^?k-?%>I@huo=UITw{~8Ur2}ulLpMqZAQjPFXEFusGcOgF{G9_ONQ{lL!5L
z93=5F;cnkMp)YcR?&knKh`AO6LbHCwBd8Dts!TeLvrr4yGk12Pd%FSjv@#3KpSh+r
z99Yo88EJB`UL|Z<y>ABKw8PL1MAz~&;S>)57;_Jp>ju6}IYKERVkbCLUTg}i*$fo%
zIh4a!<kiEBRBo7(<s7A>h)>^tNku~x-ZUPHdOXj>ciGy5j2r(XNa%?9Gjpl8Vq0QK
zBr=134szX_o33=Y4zzAJt>gIE`*ciAf*^O=<qw*?zIfeAgSn#WJjPVG%a+7`6BFxe
z{iid1^a7fXv1RSo#GA4N%St;qM9$@L+e*8o)K?56G~s4&O$rP)WQ>taszSvDN#Jiu
z)(C&%iL)zC{%W(VE^VclU)uP|oV&NqM2gu<@Py?QZ3$IZwT2TbwDrG<CJx*x8<v4P
z(~idgLyo7aQa+Q2NPlo0-V=nW;6ce=j1g4uUi5D&U9z+j)vy!FY{+q~wd&9r0E_4}
z#MtDxkLG1%ZHU<@dhv;J_L8iyI2YRD>GYSDMyM^t?%M6(JYy>EAsqmivRj|=rBo|O
z|7j*bWY%=*@#Y$3gMzMd<5>>HJ=s-1Tsa2(8U9C-2ZzFQnA-rs<Qwu~;vMCL56>!7
z3;BONXy!bhTylplv+Ctgpu)m8zcHX4_L@D|%LO{YsR-Cc7gO9DKAT4xRf!4cv6`Zo
za{Iy*n|wZ+)?VJ(y69E(_b{c8Xo{*9^-Zk%g>c5#<4GVHl+8H&-`rJc&}`dAnKaWV
zmM*}6cE7^Uv@WZ`Q|!FysLAuE2-G*+zDbL#*Pk4W>o8nbMQjd`dwB^`NAZQ{i|HQt
z=~cnFy~XA9yub`bD(F-f;Kx$w!MM<sxLmbJK?+9J<dJf=GPnm*cX3<|{LvGrkw`=8
z0_v0EL@3LH`W^!tTwz9~G>JOc+$2ujD5wL%%#b(UgAlAP#n1O^gFzmh*q9hD1$cY)
z@Kaq4s^9X&jyc7DxTOMqtmB}KufE9mh#2H5WZ5IXFpc*QS3x%a#22mSf<7DLfp86`
z@V21)>13>j7P~nHyX|X{GzI4`iT1M^krn{_!wG*z-e%xDj9}`MyE8Q>+9G~fPG6Pe
zK$^arh;~n(pL&5-ESbiku1LrK8Gk6GRO@ld`d1)(ZR}CmNI{v*Os!I+a2t-68T+WY
z7+3nw3iUCuYciENc-a7YLoY)?uYT8i<7~=O!R@_uSe?tSFuHJem*Nz6YoW-(DNwAq
zySo;5*P_MUo#O6Z9Ew|!qHQT|-wV6@oPGB9JNLPN-aqcNS;=IQOy0~)=3&W<U(vy`
z2Fg{c@`OTF0^Pj|?7fjTsD#ee1%1w<H2H=4+dv`mV+OxE!8WVDga-bmMt1$Rz<M1#
zw(UxO0@|%$G6BV#B~P*7Z@NopgR>AS@T)8R)k+HUO^`@oB@Qs0$7Te1#r2Z%5B)F{
z+IA^C;!Y`d#tb)=^Ezlq{q5uEg%vSLIrmDar~Fs$xZ!q;lO^C>F)TWrPu8m0CGNq!
z9F6Iv)0TIJAK-W4=2X^mL>?Yf8Z9{!gj-L3Nk5{{IQUtp3+17|5XV#GjA@y@CR_4Z
zl~}1nv?EJ}bUU4gu2FR@>XIO%wqFlrQEdz`Qb5_{84+tR;@&Coz%&nj58cok78xw0
zd^Tt)JZoTS79Yoi65jv#ARkis4%seN=}k93T4&134iMy?yXK1V;pn*?&g5^Q1i0kO
zN+k8~;wy$N`*qYJIG-^CiyXU^dph3ysIo&ip1fY+vz%!3YSY;djERmpLHix8)0Rgy
zDm#{H9X0gfhy6g#`<D)*6vfW1M*}Ek^CJo0OX4-y{Tgii3?S}w-%)m8?wyp&KC-^?
za>s}L9Tw()cB++0hbQC6EXH{THl75#c7^oWYGo5blYU#Kttimw!KqH@-~F~eO-0W)
zSqSlt1s%lh5;IjeD3d1+f!O^+?E_v6|N8?Ta$?;_yD}p*d9F6>cXb;(P&nMB%*!Sz
z!fH$z+SCz3qB8Oew|aQz5ai#WOQd~*L+p`63&R9D@g?v2<V9Jszm|{dRWs{`uRG?k
z^9<1v-&zuAcQE+43t?Y%wM{P&I;_5kzv=S`y*f~jMHOhY{rDczHRJ+6c9W<|jb&Nk
zQ3`z@lld@I0)KFV0qSHk$dlklu+(F>l^>62C-cCfyQS|VOpUTJnoDiI*9VxB+-&SI
zKW}V3Id{ZO&LMZUVcptLTtme3SHRcLgOthQ^f#niQC>p^?xB0Xv%g*zltIiZG`q7d
z>KHG>oq;AmCKKls)KIo2t~#EI(IuRJfv5U|J(O(E5OHpWZ?AmFe$JdxuKowLTYS=Q
zwc5{3b_p%-E>T`zE_>7ZL@&CTu0;v#y-HAO&^%JNRun#2YyL$vqhU}M0I`k8FC~+E
zop1S=7b9a}wZEJNnf?>b*XaANPwy)TOi>w950K4!YSj;vwxYv%=<iMF#2-|z9_fFM
zT#69}lC!fcT<^nOd$?YOw!aq)@Xvw14vW+vn!zOdp-W*hsPRE`8go%Rb=u}|^OPg`
zwWJ-?36()1{7LACUp|C^Avn8rz^@)Mq`n|;z%Lg1=HkOj?mDtX-jKJ!SJ0gP8ou(N
z-9!ebqQWOol%d53A6DXz(+Tg#Jm``WKnJ`s`Z3IbV`t5DdFK~kE>P~JmF2EK&wo`0
zSsiiq+M6p5zs1g2>rGEYnL%it4skSw@)rjBU4=>COnBO=+C`*vX5h|ENL4ST!W_#I
z$c+5(3N-fssvtrwyD^wj*Yx9yN~}<_htDMJ6p{riZtO`4hOE0Q#9tw`i%Pv%)yvG2
zv}FQL;yBq5c<SE%YSp;<7XCZlT!k}3B{Q2c1HbQ9=OqtKPZI^q{^^oiDZy^5%EWi<
zRsAY-?}oD}IB}6J{o0Qh^xFq?_;pv9TVyV>RjPEkgk{YFqzh*p%&l3S`XGXL82+Bh
z*Xc*e!eymmCGm5$@7z+{MADMdJ$L4MIKK+AGla`9mySd8|4RN=!ueAd`Tgs)nynq}
zduQ_xS!djM+cZm;r31pCe(n@o1%#iPOQl(q`EjC<9XLak1=PoIsk!+{iMA?Qc?lqo
za&y!z0l}L}22b3a=%|YWJT+Wq*iO4V4&bt8%Qq91Jsc>3P84`Nj&B7zl}vhbOXjud
zrH*A(lZvoDP>2k8h#?A9>S8grG`ZZns292MPR@UOVQmpam9+?&r_t+u-MsBniiq_4
zaf1yG*l^jSB}W#ze#Qvvw=aE-vi|mI>EN<Uw4b-s(ox87X<m9cLfsuw$$^#_Rb<*?
z$9_5}iov|ra3GA{x?vNh>4utEGWi|wNxQB2i>56w!uV{;Dp?cpR+O5bj>1;8YSgPV
z(vb?6l4@7C!PIKcNx=vwS*LGW%|<J$bzKiK7k8K}hKF6O=5ba0LfXyEDyCowJe=dl
z!WKjW>Y2(ts<QnD65EdV=(RN#Un9m8#ySEnxO($kTBlmR>|b2Lp6}W_A1$IH81-6-
z6e4M+8JE?|3+74molc0}+%&#~oS!}NekgC4XCze6$Q-V`!XFf0Z_PhG!+>}_kX=n^
z6qobG9+meV@--<Y_<gWUvHHwF<Cl=;pEaBOMJ^-P%vc8+@>tTIwAr4W`#OOYnZ_J&
z54GOWTcSGmQCOGBZ`foyY$#y9<|%hI+l^1-hDVW-8$qvsXGX+@mCC;7Uu>2nR61pT
z6A`^S>F&?i2E5_4srDN70=gfgI^z>k>TSA9uyv`#X(}36&(<TLLawp@ooo-=LkCye
z{I$2}SGy_f7+JZy%mj^7IrOj(%AK0guRN8!DMzEC9|!1d-Si0xz8Ng)uxhDukY9G4
zqX5TYb7D-%(_GNa9wd6HZJ`_X-y`JD6^~`JajX|U>`A9vW+-x1hVpw+><IQSdcc`v
z_DBYBd{pRH>o7KmpWcf7{;qf=LH<0xOu#CUIAcOj=+ZC!#axe_DdsthfA5F3RKjGf
zK$OoMXb$7m?z?z!rKn%fDIVUNvTgCH!XgoxD&MMh*ue3uPtqeq*!IpD_FLr?r~6|_
zg<E>lav#)RZeM(?%h+zCWMi7rfH1POIIEzLqHxkR9*~7G-iS`<tHlSe4kJo{X1%fD
zdM;=d-lJO)iSR>miJ0xd_v{z`OhJQV?;20F?o0HMft#w0WKi_wd$7b%q+8t<>Sf?S
z)1Ie1B%}=uTG4$`x9GMhGTw@coX@lspKR(&Tkj?)1m&Lz@2@AsCT=U~N2)lexD+tM
z;3d&XqRM;xO5NdeGnPz)%zKXhm-&#M{w*`s-o5EBGsaX4BvFmHa1nG;Pam8nzkuZq
zecxr@)yy;@&6Lbsh`!diJ<Ht=TK|+k>79a2q=EIoxF8%-`^(~Da_x#WazR_U;aA;R
zrQOHyo|gNj@$b4p2(pP+q047DCdO|zttc#hJCRpSi*WJpZcB2#+U{x%pnS}YN7<as
z+qidc+yV>o*0V%Y7lj6Q>+B=Fb7Q%*)T5t+!;8l;fbhS<&0Se{R~zi$d*3d4+_~Za
zuJzYVp>W2Ny)n?65eXo%NaLO^A%n_RIVMsB4*P+a$&_61Fq>`<{W+rI`%)iGEkIR;
zDL>=zS9rG9+<xI$l`A#9CM)q76c|&>O5Y`8OniT+!YEiAXC)-ohqnhxqZ-3uGxn$#
z-81O0igarEQPj3yJu8GtScK?o16~20K?cg3efw&#rL!5zTtp^bIuQl_?!bZsirm{c
ztiZz8^fGgdqQ#N4p7T)Q@O=Edmc_f~Qgz`g_g%f=R+y{cfxy>J+n4Ujwt<&A{KPc8
zh%@MT=~<^%z7BZz4v7=qU}mOzJG|P*A)Sf2>W}dmt5-?ZSn%sNR>QliA+DrxEVJM`
z%&RR<u8OQ{hcork?5&}@%iP!OX>$rLx5U{AYaBJO4W1?)f!97$niFy<n?YD&q<sf>
z?#}MHUGc_lpQP?QnYI&ueyE)PdMdXa^oqfRAa?yT?L9Hr_*<HlETIfU)mdZ`?c)#g
zL9;a9os+^Nmo$M|XHg2qgLof($H<t&UFEk{L$Mmz8RgRQWs|i(Z`gU4i<jkz)>tML
zLb+<M&+6s_M1uJ}es?1xwV|6Z6q3%1^H4NHF>HQfRm~aYYWd7Z<8Xr_xe>ro2hwxi
zAPhc)ZJ(#OU=K;?*xW3{r1F153_Cie{CFHu60ON<^h>NJCGfWcgD~g!$j*REc_jD;
zIL8i1O5T)IH)W)eUlLX4tFZA(7JZeK4TOBbj}eB}Y9rM@v7`z6RH;IL*=4iy7N-9Y
z+3jnjuw0ayzCTW^?frOO!MNW%)*2&FB+LyNv`kX?;2?RHB`~u6_S$l#XGoW?<EC@D
zdeIqb;6*0ZyQDO#X=)=ogZ!2HGJN9mF27j!*HUu@N3gFhX^?Jp?+k~%BtP(nDXU1H
z8!Z_kIAJGm5au*?zLH@IPn1VY^oee|8Boq~?Jy6dbP?BGZ}-5Ay^0CwJ)e;)ZIW|x
z)+~jxc}?ChEZN;kh96Whut6^c7C%3LN0*lDk$FH<!--wA&==%DS70UrAD6Mb$e=IM
z2!0_a6c?Yr_ij?zT1V}7jXg~Kd%PQ^J4QsQnyowM1@j8JU)k>Nysy9%(W7j#d=@NK
zn#W9Z{PokP(D?&xUAkUfnDq!3hk`-i5mz?*)vh?v>Iqm4`ZqsSd%~l~y5A15$<S<*
zNYR&^brh6!vK&AJ8M{`w-SYMD*op;oGjbQs1+`z@*4RgkGQker9D$DnJ_;sCxotzA
z@X#Ufe_eLEPa*x(iJ8~oJ&0<|z{zFzix~o0gh7=hh|yX4N~m>Ok8)eWV0NeKD<svR
zn4!ry-H9b}m?{Lvr#c9O?^B=vC;lv5iDYMjbu<wTxI}vUc*)8Pwq|u+hRH3fX^@N;
z)t4Bo1<o&@u{Kv)vNMqC+B2!mIWDFj;!^H}4Q+|z_%={r=cY&+m=jyUg1e*fDwhpJ
zv)nEq9&C$vehxESsI2kcEcd0f{jR!D%fty+#`8HLB9Ak!OS4ncN2x&wmTFOng|Q%}
z(<>iS{*nvho6)ljFv|ybQ^G>F#zT~waO_87uO_p4H`}4S1#-EjA5yz~Xl<TCFYKDf
z!}}QFx4s_J3K-LDqDQ^JFpH^ut#iAvYIP&TiM~y3Xy#%q!Yz2Got!q5S=bQyO6LA{
zIPb10VW4NRgMZ7Aw=o#{KzW@5&6IX2YPjort?i~tm&5~KPl|r9Z>3o;X92@X^&=52
z#G70f_R+3EL>;A?4}SfT)XTV>QEagMJ}xpJqgan=F>`kc{8oT7k)-^O9_Qj~`Zv!r
zRc4HFX7^ppq9o<l1=7@Cg)er1OB;m11eGO{QdhkwoAgNP)ZUqiU?-$u`Hi=v6}la7
zPY2+~Hn=@scbf(ZVuI|$?vl?aDJ$Zl?-O<Vg7mpR?yrfe;ct-!DE-Des!Xf7P1jV@
zVr|N-y)fztemJX5FRnp>m1akt<<{_UepAF?<%KsJCLUvVUN5HkNi6g%ED(kp?!?dQ
zq}#UwF0~5BGpyLoZ{>)R5(%FqP6&$1^Ww)($~Y*d;!+QG$*G+Szd%;Y?wX&PeIXsk
z_BR>_osM!rJZMfC(|F9%QWGojoY6ij>NM~nSFsgX$g2*FG5U8bM~_Zlob*M#zW76*
zPD>p5jEuiu#)d_xfO(Pb=po;%Fg~_nvFwyREo6<eR3l6O-iN~X{xf40cOn~?Q3o5M
zn%V7Q9qAo;OY0lPBw4@CF)q}l_mH_;T?-WtCeAz3?ioVKufD$p8K#;ID|`F3B9v;P
zv2KrYvzc`iQ4JlBh!Nar@ueFsR;^lvSvf^~)0qt}Dv1`lKumz&BO8ItsI2hVM6V}j
z`*aW;1M(5$csC7A5xTtN#Q{5aVse)E;Z<%r{%uZ`M7EJ2u3`}SRq1JON9-ad7-_$t
z!R{R%{Lcue3$N{(E-!(f4dE7hL)y6(jF>klvIZ9Hsf7Xl<SDG{ozcNYw}TS7A8~G2
zi~6hC>NKFIa5NO&#tGtQ8GT0yzt6uFn|Py;{Ep;BGJ4DDWVBEt!yA@MhY<2Es<9lU
zEMMO~vk{?#JsG%pIJAp%47Cr^zIoDNQu?E3oDztWCR5csTTY5tS}#`C%iLER(f8a^
zS{(>}j$8T_PwA7#ZylYa77D1{errYTo7fhzZ_{d>jacJUwUb)h#Eg}iBJlR#O!_*R
z{P-$RO@z;Z{A>EqhxVJt?UX9nC8I2l6w*yzQ;M#y%D_G7H#~>niCKpN<1IGjM8<)}
zfwHT-_IvZVkuSHOZxOgqzSHizz(vo<YrM@)rhNLAU*ZQc28;qWat&93pJ$xv*PJKL
zdLi-@3Fe#$#SVu$%%0K;&J?i~%KE=Oz-_OaqcFM{{mD|_?`)lLa}Rlr#q@ad;4{#_
zqbP|~<?JSMI~g3E-;JB1|3#Y=-({Mba>t2_9&{$?(djJ7QNLCqEd=48jS(SKA3Sw|
z9klyp0jKAi)yZzwqzFOD{iSSjuP|TLprZqh8{ua2OqLv>ZS&n}$d5`zvU7)_2VT>Q
z#LABqYPco=0i^}iN79e4zYKT1c_eVn>8PSzvQ#xU%An2Sfw8jp&}FS#v#x}!(R$xc
z?`=U|jE)%@hq-1<i)U^J#ZJB(ZKA~@i^f6)QU94Ptgs&}5m=lsFf2RJQjAk=F7nMw
z<s_<#Od%IT^GBj+KBrfDBgU_KgJMm)1bu=F32hbK&WS!7XMW8ZR<W3y%8al!4G8#n
z=FbGH1gJF5#60?2WSU>v-$kp0jX-F^GmMgAj<V4DiHEi8V<V(2N@4NzF<ckTI&^h>
z9qJ_4Wsp{xiBxbpH&d4W!7Y~shr8D2QAlG&NKZ>Ei?Kd4sZ27WjfCwypILKx^OgOP
zL&5*;IL0kjG$ZbVlr;Z-mxfVz{*Pt-j?!tOilO1eR(U_S;lgX{QxS@Ljwl<7_DKvb
zMUGt}>zyRDfW~8+tJhwP>dS<Mc1nFrD0n7I4D6129JTsa?Nc|UCnN6As2GH&7}$$+
z!JM5D8ZW!)W)#ScEB7GzXI2zri<6<WnD&-O(i}Frw=R32n;)Ph6prA3f=DH4wm2YJ
zOSz=kVK>WAK7-ZvG*@x<>ltMS^)bAv&Dlvpu)n@dMT?`S^Sdl+x6n4#EP{tWgmKJT
zX1C}%HvY`BV*NQMJmKT@cbA8B{jhSgUACdaVJTtwXmxswms%h*&Cdfk3Y2GSsr+Wu
z&IzIrWYbnfz^YFsI5PgS>ZU?mG4*iCg?fdT{!$7!88j@esK;fXPQl(%i54kJiRCu(
zf%1L|ntM$+vbUL+HH2gbZ@BwMnq*3>ebxe^nsETj@h=@B`l5@}@S}w{e!l_})0nB7
zaS)e=hJT<8lj$}?j0ML@OiNwI&w?02g<mcGdbkF2OiRtA>aA_d*a!D-D*0G0iNk6r
zZZF^oMB>;RL}^I|w-rFRA*!ghf2q~-()MZfJ<A$=W5hNzpH&7~?2bXz6@o27M*;n)
zT>yPVS#+5YMs@ftRv<?~t4u>5<_$AzbAeecEsrHO^TI@&sCXhudRkW7)B=UA*;l7d
zL0o1QQu}1hVe7UkYRK2~3S!uDkxOx@#0n-97w<L<=!&A!Q;g1hKt~qNSwkJomP2$!
z7UU5o*8KJ+%e%^!3`L=fNQ@=}xs;GgcAt%v11R$y-->4Q$FtmK?<}|FH6Re~j84?-
zc+u%%aX{=R+~I<n$Y1l}cs3r~e{KGTU%ap1gs<RMrQo;xJB^;qkYMFUa<x}@N0(TY
zJua1<RR;}Ok*XTAnYfRJO2u@cyv}LgLGf16YvdE|W?1FI@+ei1rG3jH0#)`+S)|_R
zm%ZR=Ph4xJp4Eph{I2>sG3_~d+(nja2W91D0bTo5fz0BcHV_R2v7_*Y4Fc4iF0p%(
z{m9;X*`b`?@xPdqJ@FBbYwJT3%n;$o^R;2}=5thb3R^`HOv6?Jj&bd#NAT-Y517oi
zp#H(h0U}058s7@NV$HU#(L7Rs7%A^`8#_yZXCWJXC)RwXf<%s&9|!Ah!&qw=$xUWE
zEs=qnwjeD0Iyc>9BiCRd)Hk~spI3kAbiXe2qiNV@A>DV1-gv2d`Q4wrB5U0h*;(qT
z!CWzdd3I`4IvU5VC+}$t8R~$;Xl8=i2&mJdL%^_@M-I7kuimU89gdD_y@O|nSP8_Y
z`c--rw$*0H7QI&^KQxp*#;%g0SFPvMYj(_{MVzx@7A~xb;Bc-UL7hu3$>edMW+;9j
zw7RQ3stNpHQTdyg7EWv%tu&n0p^=60gzelleoU1`CD^aG<!2d8!;TdSbVF-Y9-}S%
zn({YuBxD{fk*pbS80>Wo4^CdLO#eC}+ua3S$`4zwO0;x%NsdWkS%Y}`2VNA^e#1Mp
zQ4S6>5i}fJ>sPuS$LboCw-Gz08>V*|_t<B$3Y=1nAw+>`i0DKNrbV-yesPnhf6hK`
zVmDddQUu=N-_F4l`b3fF7e0ROcbwhjA#2x>dpkyGO}hX+q^G<JUM1JvidTN)M`+W?
zVagheq(DxMYyT4KyqHTdBV(Nh@d3fH1#dv0jR4fHwK;N8mz#S1=`x$3>Ail<IRje3
zkZ+xBR<ewzAtF<6jnOA}eCf}SBON_BzIPtVnX|LUoyRJ4j+^Q4jNZ)UAB$ZdN$M(`
zmU?iNfZa)>xCf-xw;@H>V7{|e42ARlPzyT1Ke^)`L)tDSIK?|uHk6sj)E863yDZT|
zNmG^jnIb0qs;TOBg(A(G(4j$}$O^+w>g9nkle)^$c1kT(-$UrsMVG6vQT&zQ?+@rB
zM~a#aud!59w(afMTN5p(zS6fB&K5wKgOb-P^T8$!mM^A~2iqF7UYs3&^SJ&NxH+f3
z@8pIQyXELBHFPn%cxR(}*5qfy|3TEly<1vt*m12BDaGK+37egHuVQsyF^p%y?RuS$
zpRDrueDlI2dz{_^+X1RNKPnPl!44b8&}I)toK6Go3wSt8%a=b@22YP0XGK4)5t5`b
zW>LfQTnVb4`@8U=z?iF3ruX=Lm`h3<bowlM-St2`?{v#GZ(#{iqc_aX(kq4INDJ1E
zHNY=^=_=c9GXLtu{ng~n1DE+15Z3WI80#k&EE`;<%TIP5Q`VUTgQO|<2S}=bQ}2D^
z8bVLY+*ymW7wue`;W{6piq3@M>#^Jwcp<LoO{#g*j(#Etl?NlE=UbrM7bYCG{MbD{
z74IJ`eXwrl`9R})4;@%sRpYo(br>mNp>(kz@nbS>?=q?LHp-StR^2&9yku%4IsNDp
znXBobPX+ialNZ$DZ}!nG!j+DQ7j|WUOggYgLcNP$3EWS85ldXeCxCuA+7r?&oo%n&
z0mZOIMoL&|ViXZJD^gENk_7j;;DnIzNc4zObdXRWIbK1<6u0v@T#pZtovr?DC!d2T
z*PI+jp82gE6AW-QHuP)S@Ez^;jo9)0ZAX*rX!K}a*9%w^F+q~<^I&9HqbivYD_VZ(
z6sFrw$O-S9H*v#xNIE3zpAMVMUZ|seB+>l=_ERHWpK!lVz^o2eLtYp*S4<~DD%*)3
zm8f``U#1kaS-4foSfFDq$0?56&sn4jfq#!2D?_B_Z&5zQZjZzoy?YJ?x0eYH$(TSO
zV%Ie~-pnWp|9wu+{HrkGCvXj_hD;OX7!G!>%7#2@k&n1wbk^G;Wbk!J1(O?UI(=Ht
zt;rCp$NQwASW7!4qp^;lk=uYS<L_1!%=8Yv?gnP~MR9n0-K>-75)p7Fb*-4eWKz8d
zm4>`!b(56(<vuSvF{-9_eF?;tr&O7JLTMDkwnC}fSW;cp<MFjcc5pv2pJ1ks=~s?n
z>I<4kC`Fpr^bq=FwK&7a!YcRen61-11n)O~Kciz%lCv>7$r+5oe+RX1_igR|%73yw
z=4(6dSQY)v*P1MWoT995N1M;fC;AQ%U9r5&SeS5~bxQPpb=cfRgl9Z>13J_zhda?P
z=yNsULd+fJo%!j@UD7OarSMOq668b^;nF5V2M}f_s2zq8as+GzE0*y^IHtl=dcM|5
z$}jv*YR?_sWA(x|O}WW(@*-?ub&Z&(jU8iBO4XKnhfQcy!ToY_pVtf4izzn5T++LW
z2>FD~JWHud#Z=8AP0kSZB`rh$MpTstD(BDX3#Ann&9>l2{Zdh9&XQqkMfr|-qrUyO
zmFBY2svbE>H*x{<u<P>=$!bZp8nVz=NCS)XDq*9^^B4Ox;m3A8CddgBkbPeD&X@{e
zy}}04xp`U3UlW21_%7%s4UueaE(zD7*30G><;WOGDLCk2yb1T1(EG-tOMVxB6J8((
zm)KaL{-&7ghUX#p0v~nq`DarzeeDz$1SvGwNp)Zg64ssKb4Q`=%8TjJFAh*@uJ39?
z?nyM-QXjw1!)^=|s1g`%Wjd38Y&Wqei=MuW<IxNoP1*=X$RLRZKI^42K~}mv@6LvW
zIlg;e617}4q1GbzzCDFl7u)Q8N)MO1b!A6pU#mEjY&FS2Cj~aq_>LY#M|diRytFUY
z4LvjD0@YhK>1N3HYlfx`$eskt<JYVXxZ6RMrF?|_<3*2taldcVyjt=C#SJIu;LmAB
zPAd&aMLm_`Z*@Zu%J_9Bv+T-Y>IFRaXbT8sAjRY&?$jB-fAyx@G*2$+rghnXR5%o;
z*Nu)zJ-IIL>^hjk^>(MNI#y!YkTQGOMjxzNl&&tpshil_$ZTN|2DuTmVACkzKf4r{
zQxyXVypQH7Wjay6OSYqHYL|4cl!hE@n6YsEYqjCQAcd4I>hLYC9-$XuRc8gl?TTEW
z9<1u1knYkPWk%b`ExxnF2v^xFM^nNDjqKwl0cX@E)a}TamSiO!D<dk?6E|gTisB2O
zQR!c>B{WQ_8BH2PDwTQPB>jtpd?QI;N)0T76ZnuQ;=Fw|as~S=;<&8r2bR7T@?^%a
z6MxK)R<hslX_|9-WnOiv?X1RqOf0s4P1NaDej80m1@(5(OfQL)JpyGu(C}Ul2Oq9%
zZVVwOMS|$pw<<n{Hn-OOHXq-_&{~Nh(GmsQfYMIA)X4}Tebw0az&A|2k;s#x=2xVm
zBQyH!WTwkVl2PN3l0*b2SFCTMNfjfJw6cKRn0DtJ+jhaqjjiMj^Y6(rq{a+ge%^te
zT-;Y=uC|+c6~<++w|O%{i>duh)oPGU*M7dYWZT~6hTZ+`6~n4;N_QY53Q2?Nz>*#`
z#Z;FUQY4QId4hv>Jr<{VAx3nN@m{+`OTx<2`u>D-gCwcV?8HJOst5K#PBG|$rMUT{
z+{YpYST$57gvR#hWE&yv-=E+z@m4${#<ed}yS(}$@|1&Jgo`J>WgNFyhp4XMvWgSz
z^t~s`Hk_gTJc{|cHp?33^wRz<L%vVeu$i55yk-D_U{w>}%0u_i!oHk!y<(+~4EMUR
zT!dZ6cK`HGs=$lw?h-w=3r2FaWNiNo>bUNV@>{}~I&CRa>h{f`kg%bzy0$`4i-Vr|
znq6JD8ivGSoh;u^47F#RD?JIxrkRRD>!?Wta;VHgpbeADOEYODOZGhFx?Ai_y^dd1
zq?9o7;jSZ*ni-1}B{|JL9KCbq^udl9?@XcZFs?uuG8CH^4`9TF`JtT~xj&p{4l}Xy
zi~a4QYf|qb#DR-QJ}3Kw%3Y$iOt_r!@xz*wH78>s{h)HD)Hogd>1Kb-Ob|gAt5D7A
zx?vv!W`L9jSyE(<bj(My@mueHvHC+TCeymL-+fWAuXlCRZL+Du?@$R)BiY#7^gl=W
z+sXHGE>yww;%aS{i4-2eHhPF`s%TX1Uu2_CM#HxsK>836?WRRE%p%Ag5@O#+y!>Lt
zgG)Sf<M&>WxP=0Ij`R5g>t+zHweBrz5qbScePZg#3xE5}y6D!e!=96Expebryq{lQ
zneL7z2a;WRmU;b7j-6jk#@*rlW}2>0+_uRuM);NB+~V|8f3&fXx+y95p^g0fc8RGh
z8mDqG9j@$m#A3`K!Vh<@l2Fbm{hK3oB2vaB@^4C=bQh7#M7Y3RA8M@4=zisVa90>#
zf?dU+V3FG$leBVpun2?ssNepDM>Sr9O(_?G)N>u;u<yvsh3CT@ne$rh;<+<$p1l{*
z7fjUy)s2UK@?8lUr!@QHGLPM<Xq#L5L}j5F<c8a?`>NiE0wvjNY%g`)Z8HY<gY0`9
z6+?IAT}6c#<0|Oa85~PQ2;N}$9rs}ICU1n)9}2k;6BGV$w&;xZ7{8w{c4j#pu^;+k
z`kKw@f>~J4iIVjIJ7Vt`I@&7n$RMJcxg0^3EbA*shn^}$;_>zAPxjXktqqBWu2I$S
z$a|EBhaAj%cY#4ycGZpBaGQvWh<y{?`?eo`BOEh-2>(92rUG}^!e55iG^na2G<{;W
zM|neRRnI0Q)wyT}wjxb~lR=rxyH)SZ-J?MeKo&T0JTk(Hc$Z?hztHPAd50TQl`p6O
zXDuuAISsh=FSeA|lpxD?jNl9oH~JNq?WeS!qAyD+Z^TaZAkX};GLKX{bJe4?N=aT)
z6ujjtA!JPK%GdKIcrConA<pae)%06CdLhF?m1b#ANam+zx!GY#SW{LEk{VMmMa^rN
z{(AnV*1E&Ptn-;;Ni=57n7H-dlnzGSr$tk{=O-V$Wxo4oWO${%#m5_Jw5;&KThF#L
z_2gsIAt#s$z%6W!<p1~z;c_XX;$}UYEMpH_<A|umPqg?xC)RqL^v(dLy(!TprFF_O
z1Frj$idu#UY!N?fK_EHxvzGVM&0cuHfmf}Uw`hT%K_T)o>#lBm^ve2x6Ep9Yb(+<(
z2iVkX?Mz4o+f_#-5xKtAK`J+fU9Fx$K}up5UweXX=d(ZOc2REpjJuc8QZ|BmdU5X(
z=1%J;8gmAv??L?)GlNDBg^zL&+3{!H)XYK5aIARhwbVk227WgB8<D!d@#_6Y*dZDo
zCO)`ADg9o$R3>3aUQT}$4m0-g=Aff7pcd=yxqVYE@r6hsML_yX8kY=&Ns9gPuU3Ri
z@(2e4S?v=ABzGRt-a6f!+g{V?MRm*!<peON>11C%|L?_;Nw{C=XYLsJ=wH(q^GH@G
z#*kK=78JvhH5%VRdzw{8<n5`}T!F~s-OeD$vg=7BU-hpsA&UsRaht_|8%Wl@Oe#<s
zC}p9|VX5$yao}E3uW^{VvD`p1X55BmQ!+_FW>GTX>sG^Qcn~Q0Nzl&3MiQeohr*$r
zmu$r!w*dW+LWp<5xx=l975FAcQN>Gicb`A(^oa6;#xhUeZV*aJ+KqdwcL;AT-5D41
zV|i^G36ytA`t6XH=Szm{R3U53qz_$a2_r8j2n*t-IQKD~cr1D<bw)lqfa&u(7tmN2
z3I$i4oQpX2F<tlb3Cgjkr-YC@tMA$qtqdKm-drs4wn3kAY^9UIe6xL3u9@q%0CwC_
zz+0yBqAqo_a_nW8+YjemH!N8#Pwl3E0sfhmrGkudYS{Q&&_=SXRKupdR0H^ua(Vn%
z*N{_PN-=&^G7@Jht>?)}jW)DIX08M-YK9iow&tviVzv7SDy&&?&k*?G(@+)d@A|l{
ztl;?GK5A=>Qa{a*An!!#%F9Z7Y&di(XxRIF7+j71J&nlWxCpc{Hw~5AA8Tma0{DT5
z)rvAbG#mYVqsCH01Oi<{EC#=7Qr~@?t$x=Dm-_IsUAycH7MC&$WiuglC9*4qPKPOX
za*WdX**Zjd4G*;P$V^N!JPj+f=u3Kp%XQ7Twrl&EFYKj$(jKO98W5KKMrT^X@ych+
zu01~{%iW=1g`qk)L68tX;JF(1D}<KQXO%ZsUR1Rn9t=5*_RVf#WHZ_<Kb}Xbw|cUx
zW_dBX`h_f=uGJ3<6^we#A;z3Z-PM1qnU2Xrn9VU%kz~<p;JgB_%L)%b+K(5trSrWo
zVir%=?^Rc6di{wRtZpY$B2x;oYM<{ha@tbHc#xmR!zS=zHQs&=M`Dx)#hxfmRbg`T
z68CNI;XwS+Hs#}?;B0)ok}*_EO-i58*tI4UoVXdR-plA^V+lQOOz_U3s1#;oLliEA
z^lS5K5s6P#Xon3)%Q-YK5TP%`4(_K9{Cut4@TFa9KRaDA<fgo3q|Nq#bdF=Z)|DoH
zT!7Cio=4QY2j1|8r~s!q@M9rTXg-1<=q(=y-xIY^`+v46Qetg@t$4IGdjo|m55d=7
zogh#XIA1f!B|Kcg(8a_kk2FwU%x&N$P8)iuf79p)^O!MohmpC|fm=L1jd6%}uZlWE
zGe_WwOH+Z08pMrOG}n|t#BbyygE7-;Butlnb3@js{?-(s&+Meubnq1>4SyXW>I-a3
z29QSQ0Jao=9e?P|smD$2U=wheR?Apy$o!igOvogimQ<_mZqxo2H5N&kyHN?URGtaW
zF3r&Ij3$;`vnZpX-&MO_A;~a&A`f7f1VMguh(Ev020^_=b2sQ=yjg|w@y8<mmD<M1
zO4*W~6HE8W*m#xSR-0CI-*14n7g`WjiIFaSxSz=GKrtI#Si)gd1U8QERm^)=EpqjK
zQ5QnpW^{xQ;-Xkxj!s1MEc>%FdH91~7~(gpiQshW6+x7m3i~Rb9Kwr|I{Lv&MBb7t
zF-wyeJMGHZ!jwImBJ2Bh2R}r{qZbCcogTLg(Q!jxI&PVWBXK%?M)3)`e=)F|`=chc
zh;VoC@@>MdmMg9wXRT{YV#_eYjrE1g8;C&R0;eemKxD-|ou&YMRsrhVEEj?z8$Pu|
z;R-+`l7Hg4_Hzowj=|thw0#VfKWF8xF<_Zgu4l4UdsbNU1BU!9I4udE<=Fzk^8Ugp
zF7iB2&v(Lt?QDePK=vd-?wiaXBo}hE`(+;Es9!W5{C>61vVTYU-qFUBkV(s3dIg0+
zi>>EcAF@zEmzL?*po1Palg0LuV#0YPk~v8>RhqeFnu=;!{#~-XW`Z$C*s*BzGIX7=
z$HK6H>PX0x7#T-^`gI#swR2PVT{Sb)j*9Zx)M&ZgHU6R-W5gO_x+K)$R4xyO&*NCf
zcey=6IZJmH<yQrc%DGgE66Gr4zO>4_5T8M){tsWXkS{ZWh#*3;4|&v?gVKNA|7`UX
zn7oxL=+qP#@(do!SZCIkHR58CO4u!4$>XpKo=K{oSEHr~nPotZT|JG^{G7p~m)ICT
z=l*!E<fxMSzKt1nQy;d#JPU~$4$7<)VidbypT~l%#&N_HWswV&`vC7P<qj(r4f)1E
zU#u@|BrqOa;H=MLIKV+6K=6J2cnV-=qOxH%_DHUfyFit|`4Ye|$-0ld7EHFk8vljU
zB?JN?n87yzigXZJGfu*!&k}&p-~TZuf3ViTh=iKKoco|Zu?g$}VJ3*Ixj&;0pPy41
z2*S0{vz2^m79x?U{-dqtru9TY^#BT9;It*+po-^FhR`7jZ9MI8|1_26)n{g@31&Lo
z^J1<KNCiG$#!1SQc6ic44ZR=oVM2q5!!>?S$(eXy#BZ~?mIZ^zEOG7Yzg>?ytG7Z)
zpQRY%9?9#wuf)&tZspO{UiLEjEwfXyl_}d^t0TA8Rf4yA9Ab(6BH+LqaMqO=2IF&F
z;EJJg6kCM;xCwHEeNE=5vo#F=kn*Yc;+U8JCS6g!T&GhS6D|8m2I4!Q&km7^_a{8?
zp?_-vr*JsF2za@$0TJ70>Tqp7$4|g!jC%9jOu7MRF+gMz{JlE<jwoOe^V2)|T1;PT
zi2%uBr0nNT$TtD;6>usE5GCDb0|cuh46Hx8$XrX#$0v^EX=v68DA|%}Hb5Yp60|O~
zW&a~_31Tvaft{xMkw*On<TZb|{Bjw^)_4%p)$y>sXadC2(*6$4(41>r=odjgw%}Y;
zdVij|-L_7qN>r3E>&1R|0)v6`!E{eNNBrA)sI{!w^aQFSWCd(Q3y;wVLJDpE#bt)!
zker2eOBfkGe34(=v-*2iDkPq}(D~9z<KG|zNMTktY921PDWH#b8gKMnV!DUK%gp4k
zR#m?xOF>)Ck(luda!EBDgcgIC0lz`C;LJB-IDZWSi0JUu-*H6bj*no1NF>0zeda*R
z0<z=~nVNsk#}^(#e~TjZd2&C~@E-snYKTnj{}A8s53vlriLbAo1z+j`g0H}-!a!tc
zo;b{~xmiRZMIatK+30L~Q4k1m?yQ`Lqh9jp3iuH-tt*%5kE7qcsZXNNzzhbx1ZV2~
zm)HLoMNgYNi^?z^-{)Qk;{ZuUh|H|Neg21Fge8+6L~5(#(i@0qAmcr^@NWDi@An_v
z|4;I=z$ri=MsR8{@Dv!&%jn4t`-hkLW|G0rHuIHzAJCRsnMeT3P#|PAK%Nqung5?W
zcQ``$^?Z{92wEEu147;VAKZrcO9Tq!4*pB1|3CQpUqUg!lYywfsY9IkJz;@@e;)I%
zhkbetlRKw<VzTA@Wo+;N(U>m?1b=63YwH3CTUoo983Fho1!^AzLNWtE0Nckuxc{>P
zH2jZ75J>2svi~;?I0@6?<e+Z}G-)|mKKBXm{;T}42K4*y@~?jWQ@=2P4&>ysB9*a`
zlOsS88(TR#{V@etc(M!qx6jy44#vQRsUT!SGkrS%Ljt~0SR0w^12mbn(ZA!t4zNFh
zl=}b#Bxf@tD<FsdRb0%CjQ^&eunJJOmDIN}vNC>>fgZOuw|VLa+r|3X=szEY%IL2)
zVxzyDdD4GsM|O6wBKwPmj&gJ|umb23M<>U>2kA-XlfH`~8-Sn6KW#oUV4gxD36M|l
zRQ@lCzu5nH#eW1QJ%|IaDgt2yB7NKh5t;(Hd{IaqrWN9OXL@>pBKsLYpa%hhH9Oe+
zI8+U&pxfy?K1J}UizmQ$bb5|HKt9){o`VYn0C<3>QF$tVWFaLD|65k#FFr6r&+UkR
z@Za^P>XRNYQ2&2B5C{0DH~_);J07rq;_|=M|BmCo_5SAnTmS#-@&6zG5(9I~@F@U5
z`7^gbz`T2+AzlG(?$0fMy#RcS1%Pw|fC~UV0A2#{w3w*=041;nI{^C0##7r{U?F=0
zSRH^U0DyUn_cUKS0gwhD80ZJsT0!OjhyWl20>M7X6#($GczJ>PZva2}@zkdZARi83
zWdMLo4tfpPR{(H20DvsaQ|18rcrgu(FTkU022P0e1$3VJ8Uy|&m;&e;fEEVuI{*Xv
zASM8wp1}_QApn3~9K-^^1^|ozPy;{*z#9PQ0bu<H0NeI+`;!dq9~xM%hPD9xRGwlQ
z1o#5?uk8Ii*`6i-Ohn*0{?536*nhPDyY`p0f7FHkK?CIflD+@feewhZ;q$*|>ZhIS
zzkFc*XQp;CcKaW`DLETBnLAk-|97&6p!t)mWlaA{*7&9X<JmnSU(nOPKZWtx*0V2v
zvjF_By3k)u|1Xj}sOnFWm;P6h=lh4xPuBm{!*d7!%|kJ9(l-EPo;m+c!vOO+EdOb#
zJSjZEQ;Pn3sXR^1KfM1j4W6b=ud|VpK7ci>jh`_<g2?|FYG8OA^zH1Prv85wCiA~`
zW9kwo+oyT;!btyF`Kc3-jJ}Hr*DGdrPG&aNryleT&Frk6TY$>n7$o8BXzV~{sBc4N
s=wPhxWK5<{W@GG1rf+Cy>ulphW@|&{Xzb){M`ovQYE1TT*?&m>AB4z1P5=M^

literal 0
HcmV?d00001


From 8a372201f1dc323667c52db7eed86fa7553b2e51 Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Thu, 5 Jan 2023 14:23:05 +0100
Subject: [PATCH 397/803] clean up

---
 src/pages/EditMonitor.vue           |   2 +-
 test/cypress/videos/setup.cy.js.mp4 | Bin 64989 -> 0 bytes
 2 files changed, 1 insertion(+), 1 deletion(-)
 delete mode 100644 test/cypress/videos/setup.cy.js.mp4

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 302ec6fd..13e0be54 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -590,12 +590,12 @@ export default {
     },
 
     data() {
-        const mqttSchemePartialRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
         // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
         const ipRegexPattern = "((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))";
         const hostnameRegexPattern = "^([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$";
 
         // Modified to accept mqtt, mqtts, ws and wss protocols accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
+        const mqttSchemePartialRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
         const mqttIpRegexPattern = `((^\\s*${mqttSchemePartialRegexPattern}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))`;
         const mqttHostNameRegexPattern = `^${mqttSchemePartialRegexPattern}([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$`;
 
diff --git a/test/cypress/videos/setup.cy.js.mp4 b/test/cypress/videos/setup.cy.js.mp4
deleted file mode 100644
index 59fb3971a2a2764c11552877131bc4019218211e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 64989
zcmZU)19)UnvnblJZQC{`wrxzDOl&(7+sVY4*vZ7UZF?rRo!c}2Iq#f%-}iOzU8}UJ
zYN5Mo?F|3`h|OI*9W0&gZ2<sKz~4LY%WC9i!eZ;d&H?}cpv|4k%m9G9R$Ege7l5Rz
zvzZgIiIE+#iIbU;iy5&Iv7MPav5|?1y{nxIvArF!vzd#l1F?gVg&Fbx%lp4Lfr{bH
z>`Y7n01zMuS_293`B||ce%yJmD%G4yze2o9c5&&!%E?a5Kx|^~WJb)w!A0!E%EQJ%
z%)!oKYQ|~~BuFs=8JOgi#3dQniG?*pft;phCP0Fyy@RKXnYjxwD>E}211mENHxT*F
z#l?Y_iOJpFozczG)Xd(-$d1w8$%5%`FO1(@Y;Ax%_6{zV_IA#^Ko5<LO!!%doy^Sn
zS&2=}jBV^qtod1ZnR%IsjqHqUJe|$>nLXHenLSuo*obY-_`jKX5IegX10hag2WL;9
zDDZ0FWXjLN$P5$$UWjciJ<LoE{%T|aN*Fj9*;$zJvv3ldd~>q5H8KE-vJksCnc3J_
zIs+kY4{lQv7a(BbXv@zGG{MN!%ihk6pOuB4g@xGM$l1lf!P(l<;V;L36gWB<*qfUJ
z<Im5)O6>9tI6kI8MXba&_V(6B-+(QH|3<PBJKI>A0FC)?1T(Rn)4xtkENy|K3e;(7
z=VIn$V+3RZ;*D)wos2vUOzdqPj9h?i6JU&7oQy2(fGU8DPDX!u%$<yE&7Aq!h>Z;#
zJb|#KDKK)z21cev4u9P+HZZm{a{k+irIXn|$K1^<Exx%J18MdSW_AV^_6|Vme~^E@
zvNrPs>gH$VVE!-Az}C_Z*d%r~F|#u>adqKmXZ~xZlhNOpI+;0t1ByGD82o?k^0WPI
z^P4!C6WbaC1N+x4V1u8Hm64g)@vk%d%#55s(BZG*e|IAfeoh`B!r8^lfuEh&(g8S1
zz!?D?L||V=j=%}<cQ^q7000uPS$Hs@yAAy%ag88JMgt5Xa#ZRMQ&D|D(8$k|;7fu?
z000d50l7y->dcRPz3N%TjycG^+)BOz07zV>KgLUv4DO0-($yb+*D}lFBJQEL(dg5X
zidV46Dq`qS{>bloCOC4Bkc}?n--NTu;82Hgmi10yB|betY6!JfG>^r2X9mQ+E`!+I
z2fg)<u0eRaWPC0PUr#95F1Ln-A%}^nFo+r(b!xwTv3ZJnWICFic$%|^E3}|a(1n-v
zH9L8<_nWn*u0-IV*sy~~Fj%8uID>%kkYQVj+K#g}9G0<$0xu3Lx?`)?s|U9r7v)NE
z@`MfpvDXkFCi=KdlLHxq3rFu^1kn&Cg&QbK@!WVm>sP5@7O$_*J-5>F)`$W5q(5S5
z4wzEeGSl<Kky*|b*j-4W_xRNVX6PK4IyqEE>iwFWo^n}Xj|A7i<p#Y<qgaU~EqE9~
zd`D2jeqNjDGi(~fOQ`eCy)7o`)9rRs8iG-0Yad!I6Lz2+)Pen$w`1Xg!y;#vS%}NQ
zGJ-p#bP@}UEf|2?Ef{k4CEo_O*}3<LkKB0UPK=<Ksmpx*co(IiFuuue-{6RDba<<Q
za8d`rupw+5(_t|i)87<-YSW+F_f`x`uyRGg$lHC~N;049&bUrwEmVI%$j(1(c{R{(
z`)AK$a@&SOsQyZWcqe_L&g0|!bMf`(@J~{(g#)}RG`Vj13Ff;<apXry@sIR7`Ieh4
zg2))Ch)~hA<ap&@2EMu;xs@Gtyq26dn<Z-O3@WLgvq_NqsI%##@o(dhLS)ZXm5aly
zbcy8nR_!?5?>z{kK^$A+(~$*TthnB1KdUDW(Sj(wy(;|~oqGiow%nL*wk??_yme3>
z0L0btWI5rzF`kU2A7T%ElJP~WN>`&8h-kjNFh{W&l%~6B4uf)E#J&zxBo-rK)F>#x
z;+So@O1^eoEaYT6TtV<o*4EQ*oq1W+ol3+MsB4G&%Bai2GuxIfK*841eJnYMrnZVG
z6d241yHaMV^wkrK<OYL2YTp~y19r)OGE=yj8F8<9jU9!1Ay)W`A<!tq?n<ueKDN=}
zb@hVR{DFx;l$Wq*dbeg>F>!N+pi?*8t0m<~+jh*?ci#1*Lq51WWFi3}mOQI?e5}$A
zuBo`Bw^$!Hq{2v`=L)r%OZf!BT){18;-r~h+-mFmrC@nm`@<^q9AfF3DVKsw{&1P9
zl=QqF#-)?@3QNnficX2OwdLdN24D090=aOEaI0pf_uX6So5W-s1p4IX=N*Lq^E_VA
z&lPM135Jeb){q=x3j5eRS`A|QVE(u_4<gV+e&huwN_u4~W6S{?leX+^I7+!KZJbdL
zPcaI;M0;VRj4}~4kOo-Eq|)(Ylbjv}R<F6uR_Oq8U*F7`n#k@Y?=KyS#)P?{M)0Yq
zJq`dw-OW<w)=+*VG*VAp#8E?j4?5ZXrP<{P!Nx<ISix?L>6z*^`gQE6iOQAyB+=V)
zcDLAHx};$(KRd*Q0ayCPtGm3n3&czmxjdq1J9hQ2M|uh!riVtmZ)LD5#)PbktxYgu
zGA;P4iv><8PRocHVl7)avSERJX_(dJU!l{6mq5<v*RO<i>g1utjuaY#+ITL6NA{)S
zcGoexqBMTH=qP0OOLOajVPZ#{>5MeVeEGYeU`Rn>q($Tq!&+-6=4=^T<lV&#C&Ivy
z7Y(5g<&BzhLRdSev#*IssKD(T*3K3JWb#qRV((XzNOI3!$U=K*c3h+qgDP*Ade_T&
zZ5;`G$}0#Lzabe({H`Xx^4}m<h`~A^)lkov^t9EF93z1y9F2}yeif|<y<fQ(WxAlx
z+bU479XPrX5i48Xr@<zcT^s+pxnuCh6#t-fj>Ms+L{b_n0e139P-2Kb69hHT%_9{~
z?`@00kd_mT2VJRXTm2wyQkUfX26<!k)6*VQ9@SzdE)eZafY16djCy^*$}c6JKyN#Z
z!%w5nk1d=z!4jI#GUcn$xqIu)NXC4u*XkEAn_cYK$?+FXAJjKEXKx6I>3I}k^1wZG
zNo$8&RJ*T)@QbzgrJ_idPE9&?QTZOFE+VZ1tFVE`wngzFp&%t}ry>_Oi}u(_()34&
zY;rIp6|DiEAV)5bHTJ@?nCoKb<z2OUVOV;WOI?eDOz<BxWsIXC1O^OC?RtS2k*AT4
z^*A=T<M7vW7TRNi+#pzc-_iA!<V0(|d98Hk#`+Jp9xC<8e6Nh2aqny@%io!cE&N%f
zKUZowU&86hx*iuzW-h{|h}DJ5x8P?r%P^!T*p}j%hzVTAR_0j;?@8mLTm4&HH0d7q
z%^SASOB<OlD2?grQNs^n)%{#p^jgP-0M<d$WizCT5D(7k#`3dQ$yxxYP_GO&wR{IS
zBm)O@QK^~+hI4pq06^=;?j+UFN3X-?1OZ@P;0^Jdg!mPrnmy;9-#eSF>q8v&TlpXw
zrpc7{J7N>n=>A=Lla}NttlByLTO&bOD0uA?75oJp)gl<`e&7r|`F*#dal9}<)qZrV
zpHajL1a0+FVQ?P5?HEL;S64l5UfR6JS8YW}yaxG>e3d)&>;6X2cgXH4?_Eb9*Vk74
zY66QP>UiRNPl6V)*Kd$;8d}C1<;NJ-Kg)Don43%td&bn2gZMIoM?j=@Q;b;ePG08u
z;}9BY_Ho4v<B3FI8o_>u=5C%eIc`tc$Nw?Tbw+vjD*uXJT)5s3u_#8k6^YR5Pf+L6
zdF13H<MS+DOl{Lq`d~dyXy465o;0^dqGAXD*gtlg3*HLdQ<zF}5jM?hMDg4Un(E{3
z?3-d@M=*JKljwJlX@!*WL+_Yl!7>^d_YkU8**iqcPYn4ALQ%tij@xJxaZp3x^S&br
zZSp?ML$*v?*fV2sQ1BV7a6lt8yAf`*aAZ$0@%z?xvfPVb_+>r@k(rA>_Tb7`z4ERe
z|0zDWeINh;7&Lb=sf-ed|NSvZ(h|tO`sDwWHD&MoL78Qp?a=wD*8?y&;p@<tiFVij
z``4urIx-pn>u3nA&7lO4aEAH-kUdlbU^xu(!Y)!&0D$aR)hD>!*Tq%qb1%%1?VtL2
zy+g@jxVd5xt$93Esgo5urh9>}sqA9={5e8dwHjU@Y#}{+E*)1vtb%5v+l1r8;lVY+
zH2lwbbgzr#6_uM)M{XW2yYJX+pc6z!-)IlKa>)a@7dPYtUjPTa(&XI{oW<<Fc78FH
zkaA|x<k@+aah3eQ31jZh^rQZYBPA=f>uw#Pki9Jp+8J=2@@yj-Wsq9j!uCZt_@-)$
z@&5OjV66q2i{v{Pnv4SgjB)S=)<pLP>31p1Wtk0N4OuKdTFUC91}9Movj&kk4vTYv
z3~@Fl1)YzgU#?n^QV)dk#?--!={GoA4|JX?!`{#bnrWmjm;djj?7EFfx>9U55w0@B
zWHaKJ8}phE`}Ap-!54g)>(X7ppxTa~N(U}|jK+5E$z9Od$uB>r&&9z{r*HJ=w64N;
zlo!?^96mQWi=V!|YlSvYAGmO}3CgCJ?U8KvODRhpSiIf~v&9`#aDbd1io<thdaoPW
zbV6Y%btY2txu!l-KTOn-WpVrpu~OQ^0aazTfRS$b5)%NXr7i?ueU}VUoI!wEI^V;o
zBi5oKnB)S0Qvm0HNUjk8no<K(oq9&P_8Nh#_L@C$Ob$ZZVmSMtd+h8xT0>qH(su8+
zNy5VMWD#7r{@w8RKpZ&Pg|<3W!WE`32ywBmxY6OERt*HYj7jTva97lNk1&D4suPdO
zag9n;oK+jYgJ|k6XXmvg<i}>q)y}R_ery&yN2-*1+qb2s1vPf{>UKx?^(5>j&sm3n
zwNol8;N^a>ip%~`vm&I0?hT`o{7udF<y2Q9>AP!}?Hh+rJJ(GVUrua-fY8o<^w=e6
zY&9qa`5q!gnF8chvLC*>K?+#?X20Y+8iKGaCv^k-W{fJ{P;5oH-|-W6sV@LKV65Jq
zr$oJf2ueUJ$L13$^P%-qklGxj|C^auAm~yoUCX{&;p#I(pP94q*g+UUiRq%eZ;(Zj
z7Ho9}s!wxND+YjTJeKk;df*3dA`+p7k8ID=+mCw<Ji;bC++{pnmMS=DiKCw^F7G-j
z7%{$#h5oa(KX$MDY&9@xXxe6#CVu$}fzevDOp56f;;F1=f0B`Lsz7dK<M9g|rAZ%>
z0Jtpj03b0dZ3>MpY**EDrtGsn_=7m!ygVh={%A86(ZyeP>=W`Tk{~;9oKbsW#)dcb
zx<bazAv*63*}D=adxB)1nK|7&ddMrZCpcJV8>uXXi=&0$W!P4wqPHMRK~UR_=9AXr
zka>Y#3`Pw19i)4N%-UsQjdK~kb!bB$E7u>XsduNTx4)0hxn}e|d#F)Q5fo@?mHPRa
zxiy%CgT|Wb#W1jT_Ku~GM+RrW2BA?vzq}nQ7os0RRuT&>JSt`kx5}Ow&zBX?pZ{Km
zID}vv1$Fq|wai4F-_{|<{IMPj0&P9e&D<bvkagpSmAbBjCm20CTP3BnQxch8Gc~L=
z{?r5M9otk@LQ-hGbozaV`h}dUc!G8TV-<~hhy?Y`6vW+omM9GZjdq~i%5Vz<)GY@P
zGIJPc{-u%;e`2`{H*+8giDp;wH}e)*Wcbm8Y<5ZwGW%0A#WOU=)o<$vnD{`E2CtB?
z+0a4(LW4;30Km|pJIttty|DRu9-xV4f%BSb`IX001&aaSi_N{#JORgn_Wi|zR8xlN
z?GX*2Np~DFpuq(GMcYWGu|au~S2&e>xL7m5)$n*NqA$px5B}s5sXzoUp+uC8@6aIK
zwYBo}qm+a-vQ+lb(lYw!c(z1~&Or#g!7$nl834b7a=ZhA-a?Dy?t!9Tp#&oY`U8T)
zt_KW%bcFyr4`g9xO+W5b48Z8HqHBHzAlZa_<pUfr=hvO=Q2|)S@cS47&<y2>2hzb*
zM6Rt2FcJZ0w|(wUYkFcD`QeCun&SZs0l-4bCO=P?oQT}mH?L#!f15uT;LOkzv7|q@
z(cqhHCCQj*&p$M+HUI#QBLsl^B;eo-0D#0j0RXGa0EkinZ!{qQV3r;LDChw|NwW60
z0H6jSv09d6?=JT`;1M3V@Ntue1HeBPBhvB&qKh;m0rtB90Ki2!gWN{;6O_p~?_US@
z;S->)Womd&C#3)(JM3#50Us5VL3dxLranY(LmCE998yf``!_LG(yOQ2V4oQe3vk%v
z%b(?`pAFFdJUw<XI|PvETpfl8Dgwd9QN@&jbOxA<tUUmqmV4uZTvPg`kthaGV81NF
zIU*jxf`$MPlKvI;|8n_XIt~C3f^v8T{6oQ1x|OB=gJ7kBLR=s@MlK>mhJOIm53i6h
z$p4qv(m)%*e?<wH)r0@Ywo?BO9W)UrN(z!=B1ZCQ_<xD~C;d0-{EGy&0CF)1XMAHX
z>}3J~@O;8s&wKtiH%Py?9AEk(JWJ27FWKFT@d9x`0b=2tP;nG`&Hv5#zhH3Sk2HW7
zB&P^y_5VWutvUbz_}Wr`@6fG49wLyO5}<kiKc4?^LXZQeNSkm*<v-iFjT3pw;!T}i
zJph`;pP)sY+3nlqnT~#SD#m2ukZDXBnjZTn=7M%6r^#<mYu=j3`M6iIKASLf$nC7N
z=FRvhy#U&?6Tu#+l&ToWwb&v?(=QP-rzRzlm{PZxFkY1pDOVRnJEqel1s8~hzgs^B
zwxulHf4ESWzm^DRyGRV(5>6D@Q@m1?|F(_-+)HI5w{>%8UHC=6SZ0S2t&?Pz6pvd>
z%dsRqoXi(;PI)P(B}^v<xhgie-MB$R?*T|u2^+1SehbmHMC~jG8aIo~U$mR<j7S-P
zJhUd@T#v1AMAcBblb)mgkzG^`*Wj`<(DA@mU!Jpn_Ri)imi>xGdniu?dCsI<5Z1!1
ze4rs^y%MyXB(d9yMOH2*lc?r1tb<eJU;_T!hfKLUfh=~#*=84hkUm$rhQ~)s+S#3x
z8r44`@3}2Y;q*kp{<_}1PRipK+cBv(3|a`9p)%z`%LS!h=?Z~jg;0y**0`tJ6^{3-
zh;J&;j<kryJZ>1=)cIn2h?-n5-QYG8-%d%u)yHXj>qOSIJimcae-UBp<78^bi7t(@
z2#qmz-jco*(tHxT&0AAq0Y%Wvm`jj7#NhT3+fRzaZGpuAZZ?ZT4Ww=doV4*JIls%b
z<2j(gb-Vq~ufblfe%Wh9Er+bWXySq=DFjzd$T#b1|4PuJa0D>ZtRJwl5K<ki=oP;W
ztUP?Za({hkwXAktwLIZSzNhp)^$gcg*TCHg{sW+T<o|V{NoX_Ln=*{iu(yf8egJyE
zCHRr^*~!Z)VK>+j9uam<NGo8RSI8>W@E%mbC7_iT$In%1(!81)=WYVN`5tM*a$YGK
zDDfzGF`%yshgD7v%3|_~_Gb%wQ5O0{rt!ATCf^n=hjT%~taxPwc7_inh6CqO%U<-}
zy#3ZpaxWR*t5I@ga)@VRp$UIBiT&`iQ|pU-BE5h1xA97;AT~`NUYHj&itu0K<_m0?
z$Bwi``)8CaIdr%azm;;-;B*LvqE*wC<&-uVB_S8o(nOfmovk~gsRq$E1FKJuh&mYl
zgu?zNDHIIsoVePOKBa>9x)~g_pe{>^l+Rvw{VigCscd_Rct$xLz)5h9jmq!tL{A9C
zSG<D}$Nt@5Xc;!3Lv>J0UwU!QxyeJSH=yUMc12C*;o%Gb6tv|uBb{*sdZ9Zzx1trb
zqphiQ@(cEtl4X7Kjzp&5ndP7r87^cv3-RvNaEFi!@1H6=xK9rAMzoI51~J!_VXViQ
z`uSN-QJQM4Yp~{Eq*0=ZL3S=zCtp}C<C37UIEzS5bec({+WxrCvxu7c(<vm*|Lz%Y
zqS*4X5R4H<&qwaipD(TvR0-zpV=Q3%KI<8f&ik<8z_q-Q66X9Hfag!ArX@hie#mT`
zs8<|&r+Ahe3w_LD<tzLO;winTt^$8e!iiB$=dxzKJULiAE8|9?@0X<g5H?Qtv|$7p
z{;sjm^!h;-l5DdMBINU08p4s++V#corKdgVC0~*)ebkCn#F^?mfUwj2fe}pb^<dEb
zrlcTR;v2f&*P;$uvPDmUtU~t<dw341kD$fayzITK{SV7}02>-}gCx77W&!3m5uajm
z82*DIVM|}x)dTXeLfiYainhZD?NiUS^XsAxs~Eo9x;tx3-?>p5YZ$&8xi@y-=H`R!
zWV8xPAJw!a>JSe*G^7a+a31{Rq!h9NtGci1>pw%z;OL>s(ja$#_z*S<gJ;1tPNhkz
zpP>pp1l-9a7$^EaUdJ)9%oo}{=)}{a19yKb6x-{VJzX@i&^5r8M?3;=Ax54XO+p?A
zF9%gG^Iq1MDEq<Ht?dwZQjwM^&94h0@dwqtl(otE#~wK|L_s|z(DHkq^V`7)y?Ple
z*D{21AZ*o@7uHEF-gtH-lL>ns)F*S(Voo;?O@$_W&hy=-f&!{1j!?;MBLnTHvE;|Q
zxM3d_6#isBSOHK&p<j`2Stlyr=AzrOQB2`5Z@agIjTX?|s~j`$1;1Q5Zww!Q%t>6e
zW$oe?4<u+lCJuS2u<(dV`QMtTyH)C>C&sh1>ptqH6kahMeW(*85UOY4%5N#QFEtNm
zLYMT)dXwuc;z^NMnzI=G`NFQYE7W<d!B7%_z%$m>yn@l*@G^lo{w8losIKS`zepJT
zW@Bg&g~Ej`irbE|vk^-9rZH$4B|*jNer(tH_%Mv)xm#pPJLy-;4p%4e8A{T@koBEj
zhct3@^YU`fvSoE+eRfOwP1f0V$LWw)@h4w`+>0>|ai@0&ME3Xa+M+K>1uxsH%GLcv
zfCwUpc(l56Mc=_XD)X#t-ZyFNBl?_rtxOCh*5(z~^WR=r>+_DEIXo&$G*5}%3yV&(
zYLCG=U<9?i-Z>x<N`Y^3D|c<fgb)4$6dC~G%+aL%p(e)5r0mh^h$jq2pGjfiNNMEH
z5aRDKYTYz-lE;Zn?Ko-sO8LL)W|~K$pqSc+U5qK~n)3+(dxB$n%ulQCdcw=R1Oppz
zA1{GY)C%{!vTK$&n{DVH(?jyQzl;ccIFr7=<w)@C*6n#+JkWQpCA{r#mn&J1h*P+C
z+MG$_S2jJ+>O48R64k3hPRD{w3jDzI!jv1{6gL}eH=2$?89yb_?j?KZ{#r7^%c;7X
z_+{D@y$S=RMa5v=;$Vu3;yLh(7SAaXE4eFD>ye)?^7eJaaDYqw&Y*co>a5u1(1ChN
zyI^a2uR2Jz%!Z;%EOg1+&xH3kxy@p>Kwtb$a}>l6Yy%^Li`$Imqi0U=nm|%zmXv87
za$`+l<!cIFDR*L=KwK0T+)63AuZdm8s6Pm23{uWA-mR-<-(MIMcdK*jrYC&XP%O_&
zsW%<Gi=a~3m8`S`i)pxu=8!G}?h72ui`_@k@&>mzbSwwWLfSzwX?1lU)~CbNVbNcY
zc0iS`$aPttRia1miAIW|_KI$Fe5Zy@LLQwDsJ9*z${|QA6KIYmn)T0vY^AjJkwyrh
zDcxyYbpa5?hKFHn&SpNHm;=a?X<t7=-kHu3+%8>T2U|z|nIO=hv|9_IAG#3p$@e}b
z$=7BrIFi<R8^lyiw*xUJ;pXklpf`y;4pD4(@EfdN8Tk_N83yBHd`YwLFz~0T*dqch
zW`&Hm^?r&onOvf6BN`Y8)9ySB*gfSb^EW{MWKld3Kp4E+w@f3G^=;6chpn)``qUrd
zNOS#(PIb5UE98ERJTj~E<MYTz)Ug{wH6U%2feH@J8$F))4eumd$0xz~lK~^mN;6|O
zmZWnQ(c*)dpuVF2&Nt%p$IAfxpDX`xW=m-fW?}M8YSL2(*(yID&Nn>D5(m$AjIqt_
z4?OiR-#J52s7whntbgIqo~O#9-u)o$<(@f`oh@6fCr5t2Uh>P*URd^8QVN6kqcNyu
zYS=`NwY{PH9WpAi>X7c5(;ZtUp7CnLy=c`mwN|Deg$ZtvUP9+9LlGhM{_Ad_kgBG=
z?^|;dJh`*KV>p3?m|STh3<(tWeOb8({tTaxr7fJb?>4i-5}~jPw!t+^8m5qzbCUV?
z_i`;tNC2Y8N}m>8$xM#xHKy4I)+IkukAI>_kYZ*FZHc=ygcH);*a*RmV+?tW)xk)s
zr3$|RX20(!ER8eErmP$o&E91?t#_6`g3lukysHmgW(A>56FjJn+-g6D2Tm2_KEg%H
zYMp!iCti@>$f$h)U!0uT78|X1n})*jB6aHPE9cr;1s1G}D!qW%qwfNZ8OixOg08#m
z!S;-S`RYS60$krRElgP4O=vHu=~kk}To|fJ0_p;HQMJ9dx+K@((SH7H5^@FFmVr>N
zlD+$g%Y&E>IxgAfuF=MW<fSjgjVFE;)r^M45q1l_H$)(pjXFFY{Y)e(_o+jyC13wp
zgjEM4ODQ@F<Fs@OGyh4}QlTZAGYM62erx@mvYL6P8GIwxH6-WgYpc+dQkZC{+o63q
z>192cWwtPgr@$E?1>Cxyx%N}l<5%pgeX`{nrzgdBuh7j4yS@9lhH~ZmcMInyT)9XH
z@u{DC8O}Ph{HTjXV(VTHIX#!Tj6*E@S;2&e!S>9F7Cyyr;``^@=U3~a+lD(kk02an
zBGl2YBsu;)pO&P%(=)s@dLpf2`;HY4e5Ns`e&d+rwYwRtKW}YWM2{bIbW27);*xA-
z!R*y8W@70ABXl#&yHQGqXwH?j2UD|5-W%I~N@-t>P!xH<F$u3a$B`WyDUFgzSM9iu
zjg#jg%mxGCW0X3137I50+A%h#TAL(Zys!)?9;;rsg&*hA!37PK$jYJxRKIYWw&tYN
zYJw#P5-q#@cM<~|XPo>G2BtLtap9aXaSVD3%@F2wm#kbbZV;4q%wHipz#I+^c^Vov
zzwPx}D@-t#CxBvX2*wr}(n}Wl=)X1nCkp}tTLvluCUVDrbHMwt@c)PWUriJTAeRJ4
z&gtKD&wLUh==V2e$D%+*HCXeW&H&J9)ZqHvKrHKY9^CkFebxJdKUIcRmVXi|iyJ9n
z(*G}&;C#S5(n~nw>TlWwN=2;^@Q)1H0f2L!lnc5~dCb?Ch&89L1*;jXfEA1roy(?=
zH3*5AIhc3QIh&^K*J1MuC7e3s9whGzaisICh`Kf~`HI)Z!JI=o&}|CekPd!^sha;#
z)x=a1Or|o11TUH)+jsGV?M?T{$ht~G{IFe6W!QO+mJ832mdnT)li+Kp<%1(2AIkQa
zSf)Pk;n*{+IV--1w9wWf?}c4EhX?4nrK&rtb?BQv8a;~jr4V{|lWK)!R$bPZIY<`w
z(UBmkMBhWu?h>d;j$?0W|8BzNK00NMl6m({M|0Z`+p$}wE~Sr6-SaA}d-9mFBL*V@
z+bt?O7v5i5fH{3+&6LF?BTG;t@xI0$oA$=^-s?P~pi+y%YoJ#?uZbykdt)Vg_-(x-
z*dE7(D|;+W1Lpg&r+Z&jn8j6%708zTOXls#F(j0|Z|{$K?y?)|9hUlEoD~eD*col5
z3Gg*GWEcu$&Pg~yMopabi16qy3-No#O-_eyi>$p~I^{J)S4AdjDQi}u$7eLwbj{_u
zmm=JcQn_89)Gp`GwwcaY!m+jEV&Al`6CjVCpQBUjiyYr1;WA6iFmASuiRwIr51=d7
zR6mk8^4Y#&m{n#(gHNK0pQZS#c0sal^bwfBlTsTqzaCIUkHXrbaMH1__kzxV5|tQi
z$iS#L$L1qx+!dE2kdz%bPs%rNu9Qxl*8F@EmebkIC!8J4uu(&eP7AA6uw`r4XmZ;S
zLs(V{p@V4Fz>vDl!BT~8`guiju4AFhSFA?T$9(^&TI8M2fKwuejw(9uRsiL{0gX-Y
zo?5d`hGw@eUY4Ip@W7!T%Ad8`3L4q)&6xt1h2wYrsmIE%sX&hLwB@B6(o{5p%EXGG
zasurKE80ahsCfYURz-d2Y5|P|WG(N4kiY<wpAf^n5YMdNeE3ig)Jn&f*Re(_aa5jJ
zYZwY8m9@ZONjCa19lw&*CwbPUp6OnkA*~$wAYF=J3S@WI3Q`Tp1Em23eq6jy<q8aE
zo3$CYe0{Q8@<GO6`QMouMAmWep<?m$A6Ap_-(@$SN=s-<83`ZASmrNZTU5N=y?BJh
zGxy)4_M|m*gYP1jPtqMeDH#nC2v=?q>lPktebVxt#^<fm3A!lQp8_U{i88v>PA=Wc
zLW~~k8oqkHhAH|60M{{a;lpMoyHS?@1wq4DN)qkS6eSxur;YlrTmT@-G>%Mx-AX#!
z$vHp<kjEcnuAv>tmayB-V2m1<0D!05wjBV>sP~jT`~nSS>kwFLpAvihoOwQanGuFg
zz2#s700hW<qgT=q8rQS}0Jy4)JJa2^iXcw;GQeWmzEV5@)v!(h0QOyMCjgLBJx2_n
zs$A;<z?{xc06@KZpn%90$Q}SyjS4paVFcR&0RAA51ORC{XAb}*apL6xxCo(V0H_v8
z(E!N(dvu`8)%-H^=`7V#UM$wrIu4`xidTr+dZPi!da^|@h9a94J3{CJ^FPN46M*}e
zx^OPyziqSJJ9|_H0MZmJa+9cy9KXICy*2Zfjg7cLGfhGZOhrzNf3+ltQ5T0*ZxP)P
zOI}sae+9RZMIW*?e<cBJ)E68UCSbkiuL#`Vf>Q)YE(35IHL{@{fm56Q8@=z+%ChEx
zy^$b{eJ+Oa&QEujwW@x1cn~8Sz>;!FOATo30DuZw@ves|zc*I|5v!CFV1`>6xmK(N
zXL;?xn$~wY<)yZq63s+<8Wp)_2R7}xX1hCJ@UsN3W9<1l=caYdL96JW%@n0Tp?^Mt
z0h$7V#@K`8G68pMqux(IymOu`!BaTelT0V%pU)~dr2EO#I7cI6$Mk1^NJ7y<3LpCJ
z^uZhzWA}O{8APae^}2>PR0qJwz5q}s_#16KM2~P(RO*I;S!$!kBbZ~1&|A0=a28oN
zmZ|+$mkfCT0G6n5Ci}l_otBhI;J*mK*nofK?SWk1PBsP%u)iz0s8(Y1lkIB}WXOo|
zfBS^OG%XrtU(9E~BQn+ovE6Ix>A?%B*f?m!2Ot`PL)QQR2LdL40LDY#Nmc-WWUeV{
zQO9gOUC_7P6KlzceOr-Yu_=geyo7A_T$Y`hHk)=+=~owvBa<5$y&fD*0L*cE%M0GB
z>)oB(dY<f;JbWb_QaW8@gFj3KU8^tg%=?lr##8R7Af$C;T)I#LOB}c%G4+0onzb-c
zAO|U?1_8dWzpDr|R=$Cgx|Ix|YXsv>+(>pERHy+ss`lsj($sLee^lOI?vga7DyH-{
z-1Z{ZpUdVWXO(;?L3e+DbK!DH3|$aa@J{pieW&sG<8x=(_hPMB*U7ajDruH(yX5}8
zr^<bWe?pwC3OQl`vN`sbQ)nYCo&(0Uq|JqCJ_zVDi;{uJWr(vasiNmjiQLylGv<bS
z4ZR;h>=Dmp_>Bn)-lyIEmh;v#nBIIGl9xy?F)Xr+l|kum3oyprgfeAjg<REz*YnP}
zIq1Ivs#};&2=Scq?T2pnPIz(H3cJ^AXmEB#FMfU7$hJB3hQqNy#97@4y&EIkwl)Z9
zzC!fWIrAU4`#Q+&M0LWV5cjs7l;|3x1`&i@YHq9+1g0Xuhi975vq4G2-y-NZwAa2J
z&Gl-H{814Q!<(2E&cH%n3Z8jPeHeUmI6;D+aQsEvpc)~cQzKz;4m^)*8+)Sm>Q$;*
z7PjX$%wQ;jTpds$rh{nZ1i}$Ee2@ZSfunZY9urg-LrJrRMNevx>2CrrMw(74soV|~
zAXF^_zqa&Pehq#cZI-x^rcn&VHmA9J0XLSQnx%g?j@ZW_%KB%A%AG9kGzWP!s?u&Z
z@f~Slokm;Byum~)v94d;rty@UBeAtnDQ4-Qd8u#WtZ3_Q5ZhzG-@|rgcM0~XYL=hq
z*d@g0J4whyb>&LwvU%c(EyPwwl_Z6Yx>J0>59aB}7Gc~g%dbC|roK!-pk2$ZuTwtG
zK8(N<L?q+JQ5$0O^0QKp;_nmogR@vUi*3ZpO9sO|<&y7F`PXdy4C$XA-@QRqZPD!L
zBtquAO!#o<tXP3Cb~w}M+PMh-a2oZ02-Xh{HRV9NNtH18Hr9o#nD_eudUZe`Iq3<*
z1t#+Xb6V72j8QBKgug@RoI!sbz=hjxr)acK$i=EEM&_Msqpe~LV>&^|Yz~-&j$bda
z+ctlN95J!(wdb2tX6A$3Z`NL_gRZb>ABTfFzHI!em+vYBSGI*!s6dZEB)>P`5(yXQ
z@TFRDJn~XCndmLN>J*OLzhcUnug1%`y>ERhBeXI@GxTG4a%{NkZa!vk86Po3$M;^{
zbG;qO<;Z?HFl_b6S9*fr;pg{5tmo6K^je_;gfd8bA==n<t*fW&=l6?Lm7(iP0jUcy
zC{5`znEXO#pX+3<?MCS*&c%XjOL?<0L8=`SL;i%ZG!8|9NFxi`1HT&`XbC25=E9Eh
zE60qMH6H{o3DK2wVO($X4f)&qsb)$Fx(krXo-9IwAjES>`=n=Y!9h=8b)peD=>ta1
z_272?5-q(TAxyH=V`Dkh=!Kl|yN3+yRrwvbp2-9go_$>xQPCs|?SjjMva)JdvSIaD
z4>tiCD1iZ~^;>6pY)9maDr+%{A_nB1xn)XB*VUj7GC-E5L(-_AFEAm6o9Z$Pyk*Lq
zdpvo8=Rt6g)ezkayorUm6ws#vakplaiuZAk;w|w~`NL_B4cR2Y-mjyp@0_Cp@-9CD
zvREtG7$MmD<HN(`rvu73n5qB5($gCnp2s^2W5)gOpQ&_U#XRMqWRH!tq6J#SdX@;T
z(yeY>joIavm_#;LiK6tly7%%eTst=7OfKxkUk9K#V3mh(g-VS|MVfzfNevrbj~>;0
z=qvDjTHFISZ7={x{|FIz@HW*<3BEG(`Tm-kQ+5A~!hNwFRwKb}C6>c;BaiUC(ox`}
z+m+EVgEb8CdN3D_7B%D(D3qrGU$<4WzOI_mH>QbUadwQ`2MwvQ?i_?6wkJ7P$r<98
z3Q(Wo{w|FV@W&{qM`7&d;66pcN_Zqx<2|f9Yz2-xweir-0XxTj1-cF_`ZyTAF|-hC
z+!0q%i-00kEy#+KX6hrWm6M!M8a9x?89hqsKaADBA*hC~Co<~Qry5m-%x<<?u^4nv
zazxi#O0>M{?OT#MbdG$F?4@W3l=Br<S9-$I;Qsrd&+~4`Vom<Mnd6qwVNclfG_Qt%
z3+v72<Od+gSl&EErJsb{6`aW&vT0DWuczx-;45ox8-!Hf*J4ou#M17Ewj5Eo)j+mE
zwwD6f$VFdq(V*!E&vDB`m8iZB4QAo^G)y8R+vqddL3!_iwoBV-Hrfl0_6;(|`*W>k
zy=OFG7V%eFav;K<iae8A1o#M`pOF1fIr!{Mti9$~=(oLmVM|XRhPPvudPi|DZWaYK
zwm_P1JtK{oXD;!Ygk)Zj)!2%r3|i&3QR}!%ysZ}ncnNo^ny%O&gKaNlT;t;gN+@@l
zsX9)XdoVzLi}jrI&%l`we7$w6LY>ctagB_Xx}hAw>#VU|>Vl5qf3d9-<X0cdZ~5dS
zIr5}$4SOuKPJkG8jn*zF{blL2muRFQb_vneUQ#cArOim}QTaCG&)m`ZzWF<R55f!q
zZVPOv;YpUq@C}1E6Q6KJ6k@ZCwI~1YR04GhElgn=*3DS|ZRtI^EIGUBF*^RqeVR<%
zw_aQ@QVA;Bu|Fj@moRxW=#uiBSyDH!gb`mPxy38@qU+85MTw7twERhKlFdd@_&`dF
z0RD_Q<uar0UJ6>?by=xMqHe45@FHFJHjX_MGQr}_z{3!%$NKc;mrATs;<dhL30j?9
zu>|<;#siaQFt%BrZh4T&cks!ux<Ypb$NVj@eBqqW_nokN-E`{)(KTLk9P^<=j@3dM
z?z8WwfaytkKlVey4^XL%ZfBF64aX5TX?sLk$nFiWnp?Q;;*JuZg%`B;(=+f6r)6U!
z6lJ?VS+l7stz-ImegOsr8g^!b72DPL#~7<7vS)~~C3-Ua0ThRsSC(fH8`avw%lEYO
zDn*ADk|JBdUH8vpy2%JQ2ZcXmhY907<V^=&B7CokIXL9SS~fUUWV}u)386d|UaAxW
zF)2TkA0ZH;#ZR4n9({(s$CJ?SA8+Eaq#n2Hz9Uj!RI|A!*FtdcB~r_ijr%IbQFiuR
z>{CU7pjE5A-YakYh#3C#J9qR?0ozs2>Q0_D8y8Q2(JQAKI6H{OoAtEM--W>Vwo$g>
zh;)s&f1K%x*yLUBbwy9hv}NNVQ#~=)Z=v<cjGyA8>lJ+po$h)*a<P{j#622IO!%5R
zMAHv-?(cl0G%I&??U;9OGUJ%gK^UyDyN3Brk{julbAt?u31Xh$6@?rv;3-hx7@u7!
zW3@|I+eS%CJVe5gQ5zeKGg*Sja#CsbkjnJ<=YYeaU9idYor9nOI;1o2liRGq58gw;
z;7H6>Wo%S5`wy=jc-N6ZO`jJ6)<n+^Yt2NSJtaa8;#26Ou+x`DzS5=4IXne}+Q<XZ
z>4qI%`OoeIw;eyrhEZq!r?X}-FY3-TmH<2tX1u|Uzy~g-AEY%OOPrAkA%TCa8jRfw
ze1b}<+-5`03{Z_(SEY<CTOds@m5ZhYD9D~$c-8_$D%q$`lP@WU^&2t&xXTNlKfmR|
zOgt;0(qx#010FlxUXwQC0nigYN#YqQtrPs6`B(d+Hm}Q&YrJ!e60U-q6kmLxPn@Lw
z<SUEQG~5qzO2O05jKMK<Dk!G18BLV#hcxdjdI(_j<y$Oj_E{BJa2eI?pJcY>^7h*J
zw7VKW;|9QEON~*#LBJ&~X{U+t33`0jR}T=-<IseHnnnKRo2&!zc`D+BCW1SV$X>ca
zXr4&TP-mNoG8F$@t!G$X;+^eX#r=cz*U6cAFN41^Sul4z2u9Ct3*UHTxJcdtECmRR
z7Gm#(z8hb@6yR(AWFee--MDSc+4teb;S~>$lP@zT1()frEjb!zcb0mFG&-72nQ8;`
zqdlgv?5;#ewb-jpQ*?GF7sCK$!+yymI=%BDf)WjuxG&UIT){y!V``sxUZ#lD#J20r
z;tXMg!OTS0Sd(87&lzFq!Cnek@QCgLQwpz{^KD(*k9~P0`n7WtV<QPPU}kkgWh`DP
z3teZWLVZE6v9RE9JWe*8PY#I;6Z5L9qdhyEf@loEfUl<XJPfWRs8N>8_IdHVD_=(H
zmPq^<8>pR3|H-GGZ`0+~?$yIa&sETuI<O}1lCN}W2ZE;&61iVoeQb$N_f6Q>w|Tk{
zcPdBhPz1gaOqt-(fPvu&mVtZTj%a%`xaCaz;;cO}#UJ+kcostXmV(hmnCRxmv_Q=g
z-ln%Ysi}Yr8t+4w>Y9Cc7$2gt{v{t?$lEU|M)f|nqtTJ>hPht`j&QmvL#X`W_h8sX
zV{t?mqzDi;-&r`IaI}t57c!ia`$NdBdCL3{GPu58>1qBt1(6x#qx0PnRH=rmR5$5b
zp81_x@Zef(mOR4YWNVRhVd~QTd+>KFcARJY9{_p49|e2Ys7qLZS`sCpj}q)$d@YEz
zA-#U7nv2O}Jr}+85mD}0{i60c0(@TkkUJ`Hl=csooMSYJ<%e*~HDUWpYF3BbYTe8q
z$bi{`&86I;-14-hM-?9!#vBKSpX+F(LFPd{ex%)1_}^1DScI|fE4YLZXsLes!}S-0
z86C%rXIDEqehRZTsV%sZmQbvI-z^0J`^ly%a%U_bMU?GS_Nu$)lF7X>G0SH3M-lW+
z=<er1ME+z<wpC7?O|+rVgCBa=8@km)ZNRrv#ifO^5(t9n&L3L_^&mgOD~efe4fU%O
z3HbJGA~%I*e4JwDm!A9iZ~|s-b`KtRKUgJ|P_)HGJZsj_Oy^%UzEhkyHj0x)M#cZ0
z1~D|3HK0EEFoYF3+<@~$a5?Za52c^0_4978pu7#1-ky+K(rK{dw%A9rsc_RUT7aSx
zGOOWVX(sEIqO;X-LsTsU1wO-9KI1B?^MfKcm0Dj#nz`myQ)Um727&K-bN*L=Yogxo
z_@$R0*E$RA593Q}XChdk6NE4i)%XH$`UTtEzh<?m9rEotpnSbA-a!7O<D$06>1^p<
zep$EE%0Q}lkxD^5wfGfE>^6$>b65PZ>=B|YYeO=+(b;8JuYxgCiS*^g3nfvqrh++?
z!c}#UQ^P3wT{WT&v8B?X=bTTOrvCJa2ggh`g}+TdN~);y)1`VO13U3J%4y&B_6Uoo
zbA5oi5JROdSE%<H>`UY~ubjcrU%DO}XN~lsez&y#`>|)02@3Q3J%c@!X4;|y!u}bu
z^TWT;H~sJIt{b)fyz7y}!@8U4AO7gtpO9K|SywSbA6;;%+GpVQ*h;v}ip~yeNgfF?
zNlnrQ|Jf%IHYxh;`J=j7-(cNqBKY%xc$_-G=S>ab4Jxr^9v|+<dx)^?c(EO+e>q-M
zl5KtcN6Vm&fnTgx#un2yH)Py6peKS-+yGy9JQWY`n6q5Ta=B@ug%?YNAe#6~^4Qmx
zO&5AT-JyQWl{ERO-*ueA70pxeNN<54(2JESyysDt#PD~C>aI`?P*CpU???I%c;bi1
z7a!e?^clx3=$GKKcw@dw1OAA(xdn(0I?F3{m2n2t3z8JLs)`VasC`}5#HU4>iDO}A
zD@R7nHomsa!IkifM^j9zn)M6=$tuJ`U%%Pct4Ij5x|7IR5a_-xs>)8%{wl?GfbjN(
z9==)X>C3=sNvSg;|Kw`!)fPFPX0L#JbBPq(JXDR6Jpx7k+IU*RTObai3t3wR^>SLw
zg*~IisBb?@6MV0iMge|~J-veTCka|CsEOWtIN~E;bi+tCDTcorA&{DLh>Fi5bqsP-
zi=LYqm<agb58hhb>2!)u{(8X-S!N8)?8U1wx8rK{^psme*<>JGekGGS!1{yeFF-Fm
zelXSozCKn%bJxO{E>v%UZOSI65aPyoPBnVKOs*lX#&Z**g)5HRedyJH!uuo)^FX&Z
z=#MqjO)x%{V`Yk_+iK*P4wWRB$5eO=p5eU&;0Da=3;H#;^t#+I=SC456f!&+l=v^#
zh||-8XQ$<#8(;?wK-VAT2ko{zK!>F-X(KUd!01Ze^v^2A_nzVT$Kzt%iR9*qlfaMB
zj}s%C+YTJSKmCxC*4^sZX(=1g2hZz!<Uyc201*PCRxS39MLZXJ-`-uxQ+~olHMB*!
zt3SLdeGuSV6@HSfKIEbkorofg_BYobQLOrCvp>^`uat$<^hx?oQJ+()US_}098L5#
zm-v&Muh8(1+|Rjo1Qf*eP?;ktZKuT^<JQKau(m_$gJGVF;96kCOVXk=3w}rLl+U+u
z3p#>8jwdLzk==FBd$FP(YoPAt;I^6fJvvgiQ=FEN;LuMUN{M;qfF^N$3@)x;d&BPT
zzN~&i6LM9%pRysI#w?lLSJosvH1vtyr1wv|&hzY`1^-jL^&+-~iRv(g7>}DT(F;ZA
zPHannp`ty)N}kVD<U@|I1Gx1ok9f?uC5j{h=75kosqx^oJAYU{u|!)Hr~44`#qSAG
zH<?}iumu}9g|8Ch<mKT$_*aX0fxan+yLeC?lvtcl9607g`%du(W0^RZ02b;4li8dA
z1I0uulI$g-?HKr~TRu0_vIQs+)IDtr739*#t9r7Zp8bl}Uk!z!j9kft3mV?5|3DzD
z9Hf;}+U2P{yFy&=Kti8?T0nV<9Sjk5$fG-<b$s@N$)iT@3s@9bhBlIKF@O^mGC|iV
z?0}UGl#t#lA#iMwlX||7V4--`JOmqs9G`i#G=*uq_Qd;*5i*G(F%bTu498`G*`3lY
zw?>~fmNzJmQ1bRMiO~|l>|uCZ(yoyzj&Gh)GU^FiUTtl8D7l%mky%e%A*LF^5UEHg
zEMUvCV<+f!2mT=S1?Hgpi6L0A>`i8EL%*H1Y%}zR_`<?p-+BmsPm$weVj=wnZZ`B9
zIu}&!^NQmFOQ_`}QmTnlN`85Z+FXYC;$aY9#YiK;E%b9B_mJ~N@cWlZlig@$yGXR^
zDsUYCGj+GrJdh6D{TGSY!5qHl&g^9o`Y<7jf;h!BWkUp4qTXEFJl-cNWor$_qStkc
z2DZ{zOwO)QnJ!RdCU!3!{DNq!Lz2)<TMFC0HknHIHc2<`O21UnCo|)NvuE+7A%yha
zbTlsxW(RrrUQn!72iKPHD|=c#0h_V*!9EDs-ZJg1Sa$EX-g=(Xeg4L-y9TXe3%MvY
z&KmV#`&kC(;pM%1TtdNuWl`e-z9MVwni|B@LrTNA=QScaa>9$@^`N$48V(kwrVULI
z7~n~@nEGny^{)AZpI8Wk|2s@r$igCLT!)L)uQ~Y+FU@@Sh!%a;dw8tW-32?^98YR-
z)U)FqEyFHN>@UqlQmp0ZvUlHbrA>+hO#k#zV3ZOjmVKj762oV8zFH$g^&j4`zwZck
zI6K23Vhm3kLsNbClHR&IDa0~?4QlL%ABicu`S=~q+~Ft8fhm{y^PviC?k4<YM)BkL
z#Azj&DUhXfAMS?PHk5JJ<DyPfMLmd(P!hJu_K=OI-({MHUmAx>f59SY`kFTv>6}MX
zO$hO($+N|4zD%B{;Odc;Hz${b*554+O@*jk9OhU9)~Z`2TgS}*d&kyf3I(3}{l=C{
zp)MMyYIob3#$EFXjujIdB{B-0ldNh$v1o;gg)Qyy3oTj%Oq?cnaAj;K8e+3<D0a_~
zW=-9*c+U_GpkxNLE=wDwQPNI03$PV~BV&bokPfalog1fOO|#eBzOui^t}Dr%!yT6o
zjRcxgPMZi(AiZ0HyZ}i>46(3OdeOr$N^X!(W`3jnZQ#wd<=+u6VLY&M-!7c1^6z|N
zb|5bk(;wIT<Ry_E7g_hX)bRkWizoLx(vXKC0D!jpDxn47-=m|Rp9-+8?dYVa5jlJ-
zYEc@kNcg!$&$IWSFz^NdF*_1j<yiIUg)l^h{eyF1G%By=I!`U^a5lFCsFYY0N9Nr0
ze7?;sxus;KC`DgG<Zn*-NTBsG{6&zZ)qJ?~m_jh+Dh8v+eD7Mm<L9jOK;7DoE(!;`
zu&i4$2CCdTq36Qi^WU}pu)hZnk|4Q`e@{Uwho>Np%NW_vHpMLcR<V|MeSd;spY?(`
z4IqwL6M9WQ<Evp@)Cw7}I7-wxeg#c5rArU^Z$-eW6z~CJKoCf-^WQU!@m|!^J7wm7
zRG0==xmo~}Z*d-aWz;w`65~GEIS2p(+at(@;{zEWbf_~|;bL;=W{+s9-uLx)&M#Yo
z(3<VDY)DRgvkZlZu)}a^>j8%Ict@<}fuRhgk(IMkY(jm*aCKaP1CJ${iijn=|FHrz
z2mk<i6wdVccdWtuX9CXje~5?|mh8mSZD+CW3`A;o7jlzWDkX*UX&lWtIvEX`4^0MP
z3wjQLTrvj_gm`5<;|A1ov<1uI&?TOV-!ru|f6R_apUcJ@f`DZ3fX6~Hjl*{rXS^b8
z3z7%+Yzk@jb?l5=TC<7UN1&L!1mX_v3b60CWuq##Gitk+9U~#%cw3@uLPv;z=nRR5
z`E_=i1RGLmmrpLU1Cv&E0V*tnp*p~<Gp(3PtrVkz0!B5*W2nhbKQVk>J>dJDu+L84
zFx9B^=htX<sG6S}x)XO}7XvhbulcomC125H4OHuVLP33ebKbHXNB$^uxp85s3$SoI
zx*~}eky4A>nx0ktWb$@FVRehf%l{7JMzwlTuFnqjrE5CB=B#Xo(&>EeYndU;9BAZJ
zx|*FjZp?5J=~Cyg4Kyq#9?{D^!Ad_3ADH+B9R;2Ah6DSVxreju2-x=50VQ_1cMuVo
z>K0^4uhUm1mG#*X;jPp42a25^gkOl1)lT~G2xuaYV*tNRQrboE&DLuP?z`h=qAFn6
z>C`=!vy&9~(8To-`!R>$X+0&eN%CQWaX~CEHuqIY0w^JF(ZG-r-xkCQ1SU=^6==k{
z7wobH%)XAnwyDFB%2?_K;|RS7inIw(DH+6Lzv&4BC!m>dZtB0Kh)QDrb_bx~41bU|
zkj$txlo}BfR1feBAZvx0Py$=JB8xSbxRVF-YeLEyW5vav>UsLW=|S|-n_h5mF6+Mv
zxzRWTYiK>l_I0lmCSp%`bpD@dq$dRINDw5q@$aGm^#g$1|E2vOuHG>?v#4nozGK_A
zZ95Y?nb>wRv2EL&*tTuk#>6&Gp67i}o%+72{i}Da)w^nU_0?L}A}ek5ALw~81TaJb
z?K?z_>4@W$-q%UapqrTGN3joJg*3zdzb$|nezxER%5C}2ct+bdr(50wYAv$9AfnSo
zoZVun?O&0D7kdEx_y*dB9Ct4tuTTereF@?JTd&#&0Dy-JWp@78%&BPJasTHX2%?z5
z+v1Y_u-JVj?Ok1_z?F$bEVC!<X7_juybrvOU=Xr7oa_6q8iVhA(*^0$3XVZLhxEb=
zmCqxrSz>;JYe#GIB)<xg^wEj=s%_0?(eI|+*~IGQ6M5w<`mHt}Q@5cP8b(~0vouN+
zgA#c^0DeH7L$+VplVX$1x$CY!czjx4Y2&)xbQ{g#^X8v*`ZFjao}6-4<$FY%ZN<dC
z{I_X9VbObW@{MO#mAp7CbJJT~A573*T<9=?{tRq|VJWzZ+utxy8|&+A&IQ7}eeea?
z3lr_`?p7zQLLJQyFKm*Vi1-Fy8|YtZ8_#~5$~Y2ndu0m0Ap<5EdPdgP;GUIx?G)!k
zR|Re6Y9mEjF;@jaf10e#S~ojNI;u_fVOk0x)s3&O1qB>5eDjYCO)hSKsISC}A3_-8
zrYcaszTczAVsaE2ATV^j@uEz=n$&uh9R}n6+$k69B<1MGHn~#YKXc(8wWw}ZT4$*{
zus?@&U;XfpbR_;wlEaR0m)S240KQ-YW;)&;1g-F5Y*-#Heq;hN0!!yVTs{a;TRfKQ
z<PmGQGYl#T5qHd40~K#L^JxPhx+iD+>CccO1x4!Aq8*j-yg6?+883U0y+@MNqrTJh
zZM!f=%1!Plwk-~Jk}`T7@0=wR@5NfEGeanRGSF|;9x)5_Ta(30Jdr7AuodK$eIh9R
zV@FWSwG|W+A#0zvNeFXMVrXOmW_jPsb0rSMZ4z(_iJj!DI7>tgNoqq*1k|N{=26;?
z45EBY2l|~gzw<~=ayK<a>iD>ccV5a79&Y%I60+v9mUqXl`1!hXnAP*UsUc6Hx%UPl
zc#Q(-sY7gCxkRx+9PR2_@S?TA*F=^0Lvv(dt2+~Y$!E||$!cb}3rk&#fC=MwMQ7|f
z9%@n=_Hwy*Vm}!Ape=8_p4nWB{uy2JhSO7apD~Dbv}%3i{N<pE|B8UWW@}8*y_hF-
zVR}Un;cCXsV1OV1wR1#Fk}O+DJNLkcjkK_6J@yR>7CK&{lf*XEP0a0PzZt{>+LfIy
z*|Y2{uoa9AS8;i!=nTiWtwDqX0ulAC=PZY}j8G-s2OrX_U%$Y@8rw#<IXo#GtP7_t
z_ir!m-^P11MBTf(Qa-Ym*~NE`Iz|Eq5MjNhw<a&PyuR|qk8Mq<7Oxs@WYV}j{DbQB
zkC8FFVa07QEY7CV+j;DJyGV%6vIpM}yTvw69Cc$EjGPBS_i~N8ric!XSXaj6jRCpI
z6yU^v2~8OC(W~#G3ON^kZGuF$XvBDdx5DE)O)%q)pJ}F>566ngBH@sE<<9Qe*m-D6
z_!Dj9b1qWhxg%Y0N`rsnW}x#4F}qV5u$b?M#^1f1JCu;tmk`Us03`GBN(^9G=KaPp
z`AeyCX77$MaeGw^3sowp;#dk%4D2eW)<d-Pabq@8^O`|-M9Lg43e7h1;~vi;KinvP
zZ&@VB4H0mBdN0)`2SkdMO;Eeq&8@PqlQz=jf~kk+wnSx-zG7+eA;XP>PlZJ}l`dwq
zoroIKLtvlm>QfGjxYN}@c$0$k+HE&zE;`iJz%mjd$vt&tNk^HS1|+4i&_0{jLB=C<
z!i+~oq|bS`=&-44TdL>63;yK`Uk=gnlqrkB-mx!=Oad!>1{vHErpA(27Ic!uvf8u)
z4EPB))4=sOg?3xA)#IAkaIH8Q&;2;H5(Dp+<J^~|U!{tgc_nq(+GUsz_(MM%54D{f
zB;o@<|JiC}p~)7kWW_&aI2-q%1rLK0yWS*0Ao3j;Hn@c1L>rb`bLrfyX*orQck>da
zx{&$@!UQb%UwV8Gy(lu5H{Te)yCtd{d3itPdj94fBU(Z@-4bN&G9Bx?aXuUk8bGTk
za{~o(5?{)ZyB0Zo7Z&=;NilkiO5~(yFMth6VikN6=ar7X&7?L-U%S=8E|_5e<WxL5
z>M^;VLcSu%q%L^P!&YE2D4?u3hvIr7Hlf(0EJ^g3jEt?cao2%zaTaR*>TYh`${0lH
zE6|h4oVul**|{BH^E~4RXMqK^({2*P#LmwT$uSyAhsmp|3+n84g%Zd@r{G{8PUqO8
z<!O!-gSG~8#5ACioHx?tb=9~zX<|SO8>!c1x9Zsl6K@s+eaV?a-y_g%3R}PIb*UT8
zN}2Mpk4j=@naHOVsE3Su;p*-4Pz)l!+kM=bG|ajwaI}H+eQvn;@vwk=q1^TV0`I6r
z9;k$tz`Q4Lh+i#GIgF{HGl1#0U7PK3l8c6)iu0`Av{>vgIDhUDuVtLX8s)_1oFtf|
z4PP9hd?OZB*Bb4eXWWHgA*-nRvn4l);G6Dh|L5RwnMa)@{`1f#Ey*u1OHX|Os@FsK
zF<JD^{HVDsJL_hX3?%_Mk2J!3|F`hFHMHHE^@SsJ@ZvDJbnE|uCJ@cfN16lWzWxWa
zb6x-ti*Q|nKu|#NYZw49vT!&;cc9^SA5MtEkvYyCQe;9YU30<t4suGNx+XUT8|p(d
zp#7Q!tsejE8~|Eqn2iNX@`4<LuJqJs&^rws5jYBxkII|h|JC*Nql+CV_x(Si@R;BK
zh);KBdqD{2^4y1QvJL<Q)TSD#e<s48lL2cBOM?Fw*@gdu>o-D~yZ=922M!)Hd0j8*
z+BFEue98mn7>p_WyA70~in8L@{QIZURp`k>>e^5^H({O>7U1_S^;%tUS-F;EUJTw4
zxEb5W$bq&u0qKLz8}UJ-;G4^FYwyd@4t6Z~8LMwszF+HO*eSJ_?dpS`e9VAfFv9`q
z<a6`B^d`M_Vx3IAJ)4_xyC&VaE;j2>J@%{8)-~j|E0}@p8bk0mgy;c95TEQne?S!(
z0nsT5Lxxx6g_K7pa=yP`MDsrp^E^@#d{ms0@3krrMt;zD&&?L}e3Ic7Z3luvs_!sK
z9b7RWA&-9L2p9MG_Vs>i@3og-SL*q|4LufWdpV{hFsD{X?A}#O!46;vV~<jY7%i;T
zC-57B+{6`8r&G!TyS(K16P+AGdfFf6L*9!EfcuLjotA@wxzinzCK5wUKQlR>W<>=Q
zm-WM=fp-T-JZd8lq`YDYT3)MBXI#j=C9O^Gys7|rE8O>&c$i#bnJX=Yn}4&tR5Et#
zFfBG3Ksj#0W!AvBE~C{;m#5<<%-db&CqjI256ZaV(H%>a`bT~0)=-#)4k_Equ~;&^
zMr=z!8+29jxKo{~?YA`GE<NF-h8>de%xb-{PJw&ecYg|IA-%BD0VA?W7}@Ohj5n67
zAb-!(`#>-Q%)af22N64ocT>kEo{Qm?Cx-lft?Q0=PcH6Hrgk9a0xL~jg<i}2;ebi;
z<g`5S2>s^1Q|a=Rw)A%mc{u+TV&lqugvw>$`bL<v67*d;+cPQ$5v3X&*ez+A*p%Tu
zEAo|Ij538@0Bv_8-?rt;8Yz>;=(9ksF09K&uf^*;_u@!xA{qS)0Y7Lm;StKG^am>e
zX%2?2NDB5`jXspQuGGs#jB^(lA;Pxw8`=j}C$%qMQt?1g+b*R9zq~x|PIt3EBhnWB
zDgH=O!rJq@Utp^Yhi8XeuZi`Dk4dCj|2^;O{@06pQInY8QFMSIRz3T4ewOYT+t!xh
zSgr%|c`oidYtoR4Ayccw!`|JiESOw)8qG3~jL%TvYh_SjAdt_#^aev~8S3?edYY)@
zO5Yz%eOd1JXM^4Du6{JJ^h6*)jsZf&M+td=wZz<3LC8k`$$S1E#|X-FlGMBbdrebG
zm^`rsk-09!+r{hiD8}%)>%MB<y5^EWh_MRN&OWZ@{AMyXSdduVr>fdb;oX?^&Jy|F
zUz7KTrdq8*X<1N;ir<=wR-Ag6UzTiWd8Xq|{@g20f(dI|pB&}C>blyIR8yiRF+AT~
zW|F8j(RdQr*wYFJ*~#co;heASw`{DNeeIeXNDfHu5Z%JU_Q9$8S=puG=Cf`=8@jot
zFjGI5v8===`P%z3XiM>pTHAdE8ZBIQPsIAKF6cy<Ttu|bIA0GH4(VE4`H%%O6|k*f
zFG#RmQB)UotK#>VnlOS8<xrm!_%!#o62<T<h7t3=B@>$FWEcXvMswMLWGgl+Y>eCS
zso;t4XSR;TEFJJ<Ku;Yw49eF}*yxGFN=Bq<`y&U)3p<wNAer}!&8qb)%d$J7P@E+8
z<sCOaJTwS3%i<b-Sc+f|2Cn0sW-hu3A3fq#2^AtR2zDc1iIRq4*ilWF6t3_YmyJUr
z>!~^8HAWu)1?q9j4HA6`gy^5KRW34Lw+}mLA(L^fJb*sW`<Vuc!ZJb3I0}kzF|gy?
z<ReMRVxKECg(=Pf=~`N7&pTo)N4JAb#QLCbS^Pn7Q-NTS)}#^a{H0x_9>lt>J_!I|
zeQ6O8>zi(#H*@ltxE?oI<7$AvfaHPqw<>}$w+MnIBtAruUzrqPy;i;=^4nF{3JP*S
zbGduewQ-@NSkQ8?-g;3zr(F0!y~_?th%+55FDGRaiB_>rW<1QB8u*Qp*^Z7&=2=qT
zvz-f>t5*$DVW*24F~X+h;Zjn#M}*qQ0DJ0bn|?Mnf*+&3$WCAFTpe+t*H1bW3G*rl
zvLqx6$6kPUhE2}XDSpK{p@YU=o!uY!SQph|lENJM%|$7$5(P_$a0jWofTF%lf(6>*
zBsA~APP{_MQy3>eDmt~?$0E?j2mT#sl$Y8Rf>OzbU}Ye+5le+?K{Ud~{=++aRt)b;
zA@<cnxJHVQWer+KFY<1=nu%;g&Z$tTtk3T{7P1tYmPB$qQM}T=5s30U6JMw`nE@1U
zGj1x)<UstdgQAAxtqLeYFdIX{a>Ieq@Y6wSB$P}z1$KTh++X%4X;#g3I7ItEsoQ^{
zO0D0-xJ?_n7<HsM%H#6lsDD~_)9LPx;=zwxO)@w7i4fDr?fT`GAps%au#snT9ITXF
zZhZ@am`}P?1B7Q&??depR&b#7^Qsj7C_~J|P>OsHeCCbe2lD_fLOJ;V4Ij(}!GdN1
z0HMYMbD)Uw9yfDs7G?uHKPfNJmR+QaKyordoVJ8H*#{mfEg(lmLvlTM6<%^_m38Rj
zsC#R4ReifG_U7xsb@7pC{~Rm~^x(>IjGER6$IGE5VTcda;{esuPNFBGsQ&^kl-rMH
zCZHU?|HK3(dH<D>t#@DojIk*KQq5od0QTe^7~~ZCnO^=b{}-Y`wSN{V0p$q%fV)ob
zf2GKmHj@Bm*wf|L#V{oU$}Iqhm7w{3t1Oeddu9Pi#=1W!PiY>$E1e${O)5&ee~~a%
zKh>6~L`g*0q*8VJf49Jy`>9)n{Lm2me}Nx#vDvE8MtNl<pp_xS&<8u-ZXUxvIk-H=
zdn2O##%$m0JqtG7lGx@2O5B^@gMRIwfdCX{a8#Jv6kKw+Z!6AmaZ<%w!If7>2QmsD
zQXNBAeH?Rl$8%(7`XFbHB;Cw?lL2!f01|_1OahSlr~uZ0{}t2ROJrE8Y|CUdr&^>u
z$*+ITzxD3Aimtn-@YkbGxm;KJ_zuA)%nsgBBrOzZ&1)-Rpqc_Wts7^Ia#iNsufST2
zC%v>h>e%%Ne2W^x?(vxb?)O>-w2^)LLpu21pEk3fY~*<W@NN5<le5%6yb$``e%SLp
zKXK8A%MVmaj`9=iy-+j_&E#r$hPf-~3A6%l5}%#JeTo)|M~%d_V9bb?<{ife`eE5*
zBY0^p1AAeORA?1?f^Y}h0BuA{X_U-mh>b-D;nelMx;I=mH2-meIaOfQFS0r{JOu+#
z1;op-Ph}XRUF5Q>BEnVp?`UJNbEo-jWgyiSC7q2kq1&^c6Ey(EA7Y08m?HqNH*<Ri
z%q0k5#i~{T3^}0PdR82I^z{85t<eg70v)WG?W~^reoG;q@y$aGH|-igUSXPsBbtx3
zHeD|0$AJ3-`QP8G|DW0v&;JlN06^zWf26iIUoSwSTGuvwGL0^thfcISy-;5%>A43{
zpcF)#q|OhQQ9@_`Yjom2b_QVkAMyqO=xQ#d1o88a@7w&3*};)UW#hsT!bR7BvG?vk
zRXfURi&%93??Qziy`Zu}8D{@6D*$Lr*-~Es{`(!s2uI(<m}UEJWe$zjRn6UA{o^l7
z<D-AZAq{YUoK|GlvJ-E@jQtm8Xg3$}C{YRX7#xZwbX1Rpd{VlD?YT0l?Q|u>!j_At
zmbc)5=5BZrffKfKUXFBjKxc?($bnQlJ@><mAdY#BXQju`@OS0^ok(fJED$SLFiNiL
zgRR#=LMUI#XdT*Uh7qiJ>xc-t^W+-I<`VJp-DXs1ul6<}t#qY#au+wz^hiMPv&+_d
z^*-($vOZx(O|dkx9+db3<G|4Ua7z7>@})Pvq9NL#Rze(M^L43gz1=ZWqOgX__^Y~X
z<l}WX;)XDX<3$!VuE9pHvWOWVYs!KjcKmyi4p>|7=H|^zmSzNpH&Tb5Dc~DTRYa<D
zB{3|tWBP!-NFrngSWqLBftBn98C9IV>2Zw{SJ>RHZofe%j0r=PKpeJ0@b}+GXoBa$
zqoKK(s2Nta{%${=yw5wgw(QY;s9OsgG~L@1m}MrFw>`O7gx=N^^Is3FEd4%8orZzj
zv<b6ra^%fk_!pNl`5^RM!k8)<CAJy*-WyT`kLd{p^vSp5dmCniir@AIe2A3h;Z0#M
zg>j}9?Y`-*=R3F#w|!AJfBH^Fp!Q0@$huLooC8o2dVaZg+_MBA{bHTm#xXveIT-ac
zSD#$`Y`sFF`DY?cyW_x?6WN(BMUve0@)ZW;d?0A-a@V8Xyxvt(o#$#L)*x2rag>G4
zq$tq#TC7x#qM4xvZ02Ukss8;3W000xa&GKdv_*V(Z-QOTfoGz{KuYD;aCU)2o-^!?
zkZDfFA|E2q{_pHMR$eY%CCh78W0VmX6<e4m#568MEx2~JJyt<p(4|>s)jtD{T_D}{
zc8HX<5qAL}P(Ucz0+eug#=)~mdRj4jrLB<lpG+FYTD5Jv1_y`b$MxDE@rEcp#HMBD
znYgG&bTc4#;KRCDc=oQW!iErshWRH~<vqP}sAP2NWd?ooUF=@#DfKN!b8eBR|6upc
z?)ml*YHm?H6cBN`wJ-a^ZEI`u3hH46sM(M5J<94Um2uOyI}vA<d3>aVR=YXQG~>`|
z5kYqXe0H}mGL{oo>+oF9NDCPW#7iVHe7{FZ#(Bes^pVP?SpI$5qupp|pw%Fh_QRCv
z1<>^mPO(VHd))e=tTez1!pO7tdlTAyX8vh5<IF5HMz)K2Cx|^L9BnygG7f?k#{ul&
zi+h6(R6LI7NybLvyazHcK)u*_0uy5D*meGuSB@9$-Ngw1I$c!%4P~!XuwGiujU8@Z
zGd?;KVK8-FjwJu+*D!7~7^{k#Jc9+l9K4wy^WE2QJ78z_6$5{fja{1r*dNOB=$&P>
zUYpBx9cIf))D@q9mESpd1F#bxytNhTYr=m7`;^*hsFonpf-c3{h4R>LUyI*Wdvm@#
zlD*ZjNsQX*P*1j?K*I1?{1x;2k53W&4_K!O<plqacZ~WGqRH%q0n%XBzl2OIQPOU?
z_ck*L<UUZb-N#!$4=YfWzlkYSwVCnxQ>K1Xnya@OR4!!-y+rvnZLnz3IKP?10lTQi
zKw&IDEUb?&M|VL_lj)RGubQ`Q-L2)}-34WWcUKg|hp_Ni^oB0bvO4!Xpsubaovj!I
z{DuLpX^<BNU~{_4{5Q)7|Dn41NxO53e~=jfI*7Fk03!cSc8{3*_XkIYlztpL2#5to
z0J4luNsFk-I$t(*pxl2QB}YC00A?$cQN~)>AD;RRAm*px1lsx~0;S{-kf|MLDK8Ny
z;c52T-nTpbL>X6knnkcUXz0QOmM~IBAwRhJ8SI2!hJ<%7+iz!nXbQ<sUqg`21Lw_1
z;5z-DgpKHPekJwvD00u)-hkI%zq)}xdaVEeumCEv=6NHn)x7MjBlmOQ)eLWgg8*n~
zwhWTiBoPxWXEFudNB!B!^@jA53zt@!_+7~P^WVR>2QjpcI1gzCgSdzaPf!K<gbCxc
z{56=cc{%UAhf#Y4bCf;MjWkTWqxBPJi*#)8v?>2JUP3A@%Cv+_74k=}DukXq#7ekq
zd~gUW<tD4>`(o0l#bPEpurdf^V`8(QIMMeKJFZ8Sps;e`xcplA+~#<6J(5u|86L%>
ziY3~IpuQrwdzmvr+$p`9{CBhD(>U%{Z-;K9zei6Z46PeUAgZH^0u7&>%+pKSc!AE*
zbsP5=b^Mw%t9Cc}*&fP|`{~X6y>*)LpSR<zut3L{zlx={ebCrqv$Vjo2E(@aqd$I_
zw@c3R=<OQxC1cWK!p@GY^tG;xGd9j7?;W2gr`f0z8)ThgyT~}vms#he=9B{EwWoxl
zVI=CGV>ba~_}v0OtHY+cv9>Wy8A&U~jRV}9pR?9`bwn3CTk;sXz#{8J-q&;+5<dhy
zEICsd5G2hFx$1OHmEJZBD9&h}Pvo^xKXLtX$%R;=vCGVJi!@eS=Od<v)SoN|xhsUW
zYUNi@xkB4_WF(hjANG?Ak|U}Z=MLX3eo{54&&qm+Yk|^ZRD)=&Tp@uD$sUgM=)AB{
zfQd3?bl*f9q=h6o;-g^C`in9;7ihe@{HX{<E{P_S5v`OUCNLa3B`VUYe)$o+{KYS{
z(w6jL6^`R&k<dEJD#iZdL=-6tyg+U%DSP}fM~aJoimgU_8feqo-T0;kp}gA-_zM~A
zrGGN|JO?X>{Idx)SE=NBdGJ)XwIVZ-Nm=2aQPQfb7U>m?4RFwP>|>HkX0R<%@|L|J
zH2AP*EJgwi{o@%~7A?4x{wn%lBcYCUF(n7N^nM0>@NIVMeP8_!O4VRSZDhYfB7N>s
z4!uC!bvDe6Rc{tspSZjD!f})B%k~&8b>F}?7fOyDXsSaoFo2%unn0sr2#``A{hri}
zjt`;<V1BI$5Esnd`?i4Csd23@MrL|hISOeyw?y#`?;~LF@i6Vo!p)REh$;GAt06Q~
z+Sh>ztf@??*&hLyEmO=F!e1-|6oPX5cf_K&!V<lp{5e-8M)cO(_G`Ug1u;|JDF_E-
zZtC~S`{y=AjNq@Id~zY}-JX<kRC9$*%Gb#w2LE*^v%9d{Na-SeVSC056epFtLv4?K
zVO`tl`aPy49eIA($!04>!T;@|s2-ZK0d!o#Vo9(O!a;T%S2>OBd9+B{B<Y$Z?yb5#
z(yTZxkdip#H@<f{d*m-_EZGvajj}&RG2rhxFYY+qEve<%wayWRK?c|9Ys-;GGqbgr
zi;=a<5=j)Q8pla%ODU^HG_6~xL8+3PWvfQhD|9OE*9a2i>9J(Xl>6Y^AO`hY9vf@F
z4MniQ&}k5pN`4JoLQ6=1(zBSrXWO!IR=$aTFKlytGXYU*WZI+7Sbrf&E+um8qg%lL
z_OlxxB-Rd2_X?9E*QV|zYx;YW)(aL`t)rMHxQQF#Qo9K{{0+IigkF|lZpHFPS_N`Z
za?Lt`?9epYyo?66)4*jFAl!KC5FH?&J~bRPzLP3%PYa{D-LAtD0^^Ys7+7VOP!CaV
zOM^{OxH3Bgim41Q+Fuv5dd5J9j<WQ3ZDn3|322O{=Jq|Cmj7*4Nhq9WQ0y=|M3(1K
z$ZzPZ@;C?pa25RV)pkHRqyO>MKe+Pq{N1FtE@^mxW6Gg-X#izT!6NSek65@C{IRx|
z2`cd$kv-lRh-7j4L%$j!{{W4s$q(3aeR9NGy<{b!OzXG4N7X{zzBajJ+n1xl!5`8L
zq9_DVa-UJe)1bC72|oZvEdYQwEtE0AhXSqP3!pfJ{k=~LS9M`|n`I6GT+yV{!%BYz
zts-PuI){}YA*OdI?Fg1p9CazZ;))^6xAGw}_C=6CQ3_1z@4*#YPP(bx#3sV8TS*<z
zycXDhy%dVAff(zWd`Us($T0K@p_+PVpxa`T=cj0;tDVSDKv=oo;lX%Ed%}UvO-{tb
zx}*@1Sn5}!CLd8gy~hl!MyBk^ken$DMc^fcfF<7O{|I!>#t~tj1CWl3^;($~<Yv2e
z?`Ne^DZ=AZ5_9UWR?VH&=dN65!Szj+o@EI}F|d_z=Cn4?Aq$d$2=$-fHa8R(ckWF@
z|D4svo`sJSK_bTM*@}S7bs7e4MjlwX1yv`1u9;>n5f1=#5sGhzAUt;EwdVav_?OPR
z+P%m%*YC*eyRzN|4jz9No%m2c_8<$?qXsTdCL%0@W9kHfnAWd-L_xjBp)$6-J5^Gc
zomk?RuT5$VXXIoKVmZ^)M(SOVAqJ`U_0hyE70T3;M1V?`^O<)xUu%65ek&fX2dB4Y
z6jt1{6dHr)^|HohT>h_qroe)+F+#mp2Vjp6iu-K1qlDsqx?YuJ)5cM`WpJ=K=r)*q
z@-vZ4covMu5SpspBEJ6tm$kPW!4|X97)xmNq|!RD#q==(jG_o_Fj{0O{I=l^*|Oul
zk$@Bjs(~2@XEMJ{!yf#pj)FOUd;XVT5?g7Y)72wKgtNv7Ni39^JXB*y42jn~8x0}M
zbyZA-w0nROM!ziXj!s55Vr=|Ey9vwdm!Pqip-sBZI`B9^;oHSIUFbA{3B>X%HkH+9
zK$gNMH{WwU28AVmMBo8((*G`R+>)Qg{q1%qwSxLy=A!#?w>bry=&K#}o=x}iq*qGz
zF}u)^a9U?<r%gn_KX+-oE4)~hhHg|4Hm4Lm&A~0@>7P#R{)_EL)Wg{8OKOLXYYurI
zX<~WX@k)td>5#PzUu*P<Phd6uHx;89J6<_7B=Z+r3X&32CjooXO&^weRf3%4`I)*N
zj!x+aUnL$R6ogF9JMHg6^<ehrVQ1cS`W}xh`!a2{(XcqnaVpO(e$1*7?oL@Ek=LLz
z$-pf^68N^N-JG}6kfOkL+;>R!m5E+fing<hv?&d}ovLpBjl4+^MIpVDhR7wf>=>?m
zPEM>3wy{xd>7TKBJU<>-E7MNz4cbj4c1$RXfKl}awmn{DYPQ%zafQgp;BrOAUyK6a
zmp#z-xuAbAG{5kK^9|&YD^+G*Vvw6grJ<}Nha@*d8`(h4molP`N!)nQTDKCdgSR7W
zg|YC8v2|@ZjIcLW&d{p$gN#RhC4Acc<AjzH!th0kEGnb^t-6>ow+>wgA8EPnPv28@
zPPYy}_ODW)>-L~A3lW-yycX||`9G-#$B*q@nGUtb^!lZ>HGx42?e%~pMWqHSaMTC}
zskpGHF87AP>$&sfmEgE;NIV6uC;!;aazB^~OF`~-6-o;xpNzG7uhub#&5_wA#7k4S
z;XpU&wLtsaxN$1wGffvq)&t?CO+G1423p#-xKcqn{gZnxrH)NsvB)r_P#|m_ehrp7
zW<L{-w_CjYg<^))Oj;k}$FwngN&e+UNXn_zEgP;H=BI-Anr(Tncu0n58;8RWOW&3E
z7zfJfoEk1g@O`+12CWW4oFkI6Xy<zCk#V}hQKJHQL!Z18hTeC!yDOrb8s%Z1Iwo66
zO+9G<xlR+B{^TdN2QgfC=Y2kVXMyroN*UM8Wnc8{b!^LxkO^9T$oOGSxM7EN2j3CG
zxQc=P+7#|?8((Qki*I-?=OGkIq5)mdyj(kfEhadHOyq?C?y?Vdl>54Bl>Z?xDXGEf
z^hBsEOn)516aH`A$@n;unZpVf_AU5NkjZ*P7AjmlLOx82Ux=84@^ArHdwCHqi^$r2
zi#XLS?Vf$CTwqqV*{5ceY1(0yZXAI6mGm2&fCY!IN7cvTe;ZIq3hH@DlcN!P^;&P!
zdSWrSbX>$MA^9)Hyo5{~U30*&ZpGmS;6zf8Lh{8#67B<>I;hxX;33=_9#vsLBD-3(
zXo3FG{AR_|0lgn2u2mXTh@X;Nr49Xg<KafeDrL+%=z*4Fw6gL?iV5yH(w=m9-2xoj
zpb191h(NmvTM~V{OW23*IbY?;uH1S(k$I`wR$9B38GALttpis4`cFOrJuGP}0rQi)
zo7W-aQO=pHaOD0jaCSQ0hhjgiT|A@rNJIdP9bF@QMv7jKT(;>ELTxGp%LO#I;NI4k
z9aS{T4MDIe*a5MB7d%U+RB!wF;6|L9eb>-o7k2z*mvO_Ny>(W!Ya~v3$g30s6r%F9
zW+Osk5LCD})afsji4%&&W)L%8TXQw9hfQ&@cM-Bho?_&LNQ|AQS6b{OJcIg05-eB(
zq<=~+C8Lmj!2TvBc?WR4Jbw>Fj0-WYaRzX?nMa1lqRX}H4!r|J#%xXzeH#OY&`Ola
z1^8pad}9CI$RHN?JR`eWj$YHs?QAKnX|$L~AGF^u`+0@SJ2mJRalrSm8>TsQ0}4C=
zo(W+nbYAKczHIJdWR9(GH-;62-z}u^O~E%2z82^k1jmL#{0VA$2MpXSMDZa&6-$g~
zS)GW-Kpq<lR{%As^8LQ@7l{gvP|Y765bY!)Tc4m%JEfHN#qdfFz({CPs4@1bIiq$%
z-l=gmp$Vmk?|=dwQvXSlO%jD=fp~$W>L`ilvorR<OVE+J9MN=U!15>Si9@_Z#qmxd
zEggfUVJ+b-m3u-4v;)u+M0N6Q*$r+hs+3r_>0MZJ=&01^iyWMLaHN}s+3kyWGhIk&
zP>W4LW_C|$vi5Si!CDNMdHWoe<DR4_vgi;mg*kh_01ZcZjOLkkHdC&fTDWC17I*5(
z&OFs)MKbzhX~w~*(9*q#%3bQ&*utK>#lB4rK9d3;Gq;Qc!boew?Y3DdSNZ(vJjC!O
zLrV>(oqX&+BYdR>Kbfcvy{rv`zhI*PByUy#e0Kd{1Q2d!S2MVIu3Rlf&uMifnBv)Z
z;-1cQBPcsFi8wIYvld%<=5*0`<G#^6_sF=k$agr}b{?kg=GuDV^Q2hPfaC&?09WT>
z>j&moS~SwVzk^PO2uM4}xrz2~*vd#u9Cu_Gq?n@BUPg4Xf@%i>Aei4pKxS&jNA3b;
zOyQ0`Rl8{<YmHz_x&pQO3s+PY3}2&qE^CGyZH~}`uB8e*{GjBe`AeM+Jt%MHBTV@*
z(o;#9%VVfViAWq+P9*xjbNi{E`;^!S&tH2u?mvoC3eORau)MyCcY&|6=IK_l+%7Tw
zH5wv?RO{y3GTbR{^*P3roH3G^{+6tM=vL627Djb4Ou%t>7`LIinSJd&H-q{F3U@Pz
z^4}(dLrK5FgXZEM`7PROMnP0f53~=Mtgzy0?MY+ep?`d-ggDC(JIsHSQk^gnfQj~K
z<4l5ATTlqmdt2#O>vxGX64m*{i(VePK6zws$<Rl90Nucd^;0AL<R;o(3k~xY8u5#>
z`S>gCRYQxA{{&xAe38WG;Vk~dgf*E&|9iwYeU8s?$nZkxPM)oO3mNOnBHjl>xtB0f
zaUHA0K6m+x8+8*tjVELi4;aG<-R&7T8*9lksKqxT&-h2AYcWvn(IKyyJ2hp>qWM+Z
z6o;{?o#IlpAeqO816xY)5t;m&F-c*@E%w<Gk%GNr!<7*k)2E2fm>r=}Lt&lgZ@2AG
zPj1UYFL8lq!k$g{%;Hoym5}m9n|%X~rR6KI`opl{$EW9jk9ruZsB-t+n<}WIFK@}F
zwSvNgMZ9O4$qBS;ID{Wu8_S}`p8W^b-{yFGi+@;!r&pO#KN-7dG#(k8MVK7=_F8s5
zXl*j;9ns;Pbr9=S=fxSbqwx5KFQL3)Jv*dlzmGhY39}MIX|DVEf<&=si26a=&$y7J
z;L<xHRs+AmRJtv2q;SLwI28u?1qa9Q1L!uLmJE)!!H7t!ji>2!Z-zKTeI@D0n3WC8
z4j}!gPThn1!VMcL#po=izR7u`Om9kiFtBm?5teDA@<nl1-bG)Oh6L7No1sS@9!TjS
z2AbU4Dw~|}Jj3Lh_vlNBN7no<e&o>pt2H?UolxMEj0TMLF05$x_U{!)%F74sWB6P`
z{V}Fz$B>=}aLgM7ZZ2o~lExe7V|OQ_*bd()FGG$)(ljk4cyvFn8ti1RV>eRqJp~(w
zijTF;UnYO2V2?s-G!JW26)zov=Ao%vy!5`F#8q4c-)F+l%3)F0Xd$rP9lv(e)}?d}
zf)w%Y{Jx~#NfCkGNpv7|!%<`?m`MMiERbIghy22u@2`wYV+BYb>$ZKsIU{$%f(|N=
zP80!v<S`pcN~%c1P=#>kz0JXu(`yc8L@~mB+*WBKM+@|2`8J5d^m)h2Zo;8*(s<p4
z&Wp{J((~B;pW*^bLDhKsClrHYH{(&hf>$b7du_BgO!&w444Al{D~aIsjtBj+{|-#H
zkRysmjZ66fR=6UojOD40UV;Me^B;u4fmX6MZ=A$U_DBD3-X!zCQZ;TKXee>9_-Sl!
z*5i#n0>-J%7>JYwkxMTU*uQd;V}sha)w**7gJWuhyl%!odK!Fs`H5;xi(HUntO!@`
zF!WmwTVS(+dj(71Wew_Wo}rbj--(L|#T?X6B?be91vKU$AG#HLmEue1=jYHe;$u}K
zv^S@|_^`fK<%WaK!oA+SX};=w{^6^6_kx*NP$ylub~6QcDvtS=v6nz8mYuzqc${W;
zI=z=zrcopUZoKsHnA^FWP!WN;Y0!k(BK4K<#|8tTcsNaqu_I*8_?=2{1wbXlla_7f
zMLNIgJu3XO=NyiBqiF<rp|1~AEMDw--(nH&hU-YvcH;ftoZ_LVo*0(Mhm-2RPF|QK
zwr!|yDzJQdiQ@}6tVI^)m6m-Q^dC+HAAyg1D<Q*G#OU7?)Er%e*ks~Q&kSilfl}{G
zP;stt&coxAS6^BEY>Lnl$r~VEk!h!4<oRF(p;WKOH6;MPIztTx1b9AKK%xSMp4>_F
zQ2JtClj%bx^!<C<PlKm}tvcYnmP7uMtR6n@;vxSAUI0zeb*pe0`0J=*e<jPWw3@n#
zPAp49Te!3EMBu_RcaQ9*`3eK)JiUzn>U>ZcQ^W&Jm%BHZnf3}Iq3LlY1@^!dmtvYU
ze~R_E`Q1@BHJxNpM~k?fKlq}@G&K#w0$!A{XMzYuKufU0Y)rEmkjR>l9sAX|@JaZ_
zZg{l3kQylP!beV_KBDdgl(w4a8rAg-w3JaGMA281hm5@Cfgv$GCvczJSl4w{WT!Yg
z8J&F|eW`IIM>)h4;NRrpH9l^>K<080g_9R#eds2-MZn{Z(6Eh;E;haJXeBTZGk(iK
zaG?_S(a$$4Qy}PL>uJ1Re@C#K1oUewlkU>#L(w-(>&eOI^%X((ji6UpNFF$SWTx&8
z&BGKALXh(vD67JPDA&P2iy~?2qGp!xWAT<GIQ*S^zKzN5DBJn&R=@fSgF(tIw<0`+
zr&}HY7WRueY)|CToOyqP(p)i_u0xP1v+^X$>Rz*|iB@Pi9-@d+$CCVByEy~WvCJpx
zX?R>P#&BTOF|En&pJv0<=v%<FBBA=wiva$-K=A2+6n}n2mq6zCp!^bvaIUDp<&BN=
zkx}Qv6XgQ6Ys`zBU$XO_O@biKcT5h#q(=itWdzw0M30*0k!nvfTgA|CJjTlq%>Eg3
zNKc`@6xG_smVUIf<Rx9nhNTOan8xE&k(N^DgZ8>ckT6;p(%eLgqJ7`Q#{1Uj70}>|
zjclFH&rlO;QnjnfQvP~xI^2t8d}<gEh)d0fObr^{vzFshJJkKis*?gH8iF96#q~jH
zbh_hG0xP6wxytWLIR@(ykPc^Ye8e^m5MY4Nu3<7VQ-KgJEJRLe=K<m7&@5)lD|Zn}
zT0)gmdcHQK(=xF+h+IxoT!NXv(iiQS^mV>wf#imp;FpbWITERwVvJ&l6G9>4xj+p}
zO%yDI;F;gYU2ue-F%hxmn8cJUSTC7%jm#lj<OtB6^2bh1tfO55Xn(MTSldbqD|2nz
z>Avqki?We|hIM=OikpPdL`?lleP%F-Zm+++i2A{MAGJWSHi(7oca-z0-Uk%LykSWl
zJsXm`Mvrnie|sagy2iS_e!M^B&B3gE2xOp%P26nqZ&s)p@WBsHI$T?2yds6i1vi?0
z;qra;k1@cClqefFlBg|Ca=uoU2o>EY=_)y#R7bF#2-B12@CEzI@&R4U(w42<kx@=I
zxoNH5D#^q{n0*n@{#2ZH>E92@rd2RJq?&{iKIPBSIYd~#Y4FiN(d!Cq-V&8oB1$d3
zkkPxx&*0ZgzXn%A4+hYc6XdmCu6frZnpvwuA0|J0^({a#s2b6rM@^$}nVGOrDg`ey
z_mq5k7|z^2zwL)e<LQuunEH<S5FcQNF!}PFO-J+tL}3=Z$lk9btnR`7yG(!Iv>HL*
zLXwGeWGaIf^&^g|>O8})aA9z7c(h#=^Mt9Kb-N42>)}q8ts8kM{PYH^>;3YIuA|2u
z{WECkB!S|$!tr@9;R3ujMO~XhXG}<CZ+;?XqJA_SjwLWUq^u7%b0xaYA|I}um9e81
zNrOTvBnFc5u_r!l;`cfVuZk_Zax(pKTLQ0uq5gIaQhbvd^YJ?>PB%OwQP``N`y(V~
z`$=fMSxI7uajP^Tvu%e}ghypnpcJ{9q3_iVFR2fm?wWgGE#IU`d~gR<C73`)+U|Vx
zqXd;Al5Kcy(Qgpo?n8cZPHJWLI2BYc-Cv*i9hV`{J)NAtnBu7M^;cO(ywR=>(kwPc
zt<qBUwB!pIAfjnwiNzeM{$V$e*8btXY|+zIx8GcsIMj4RxPJ(pUDD_oz7%KqZEqII
za`m0ruL<MsojN1c+8RAQ={X*!8||Rg1!As4w)2W>m=A9+8=rF_x+(euRWa^1jX0Xc
ztcx>22QAkcRSk=!i<AL^=fg6~yCb0FbJKqz?&8578jHY%*f!`^`l~lwY$MKBX`=6{
ztEkm}O~(g!tpyu*V9RJ%z?aKHtP}FG1c6LA)}<^X{P?WX%$Y)C<5)#z$3-02up2Q7
zhO3Kt)?R6(8jV&wrr>_R#DTZy+jNDAJYws3=9^m@IJbR6?4fZpODq{jEtG)MR66X~
zg??PAX7Ks+t<Il?VTeqnGcD2rLM_C=0(fO|w5bZaBjYKTdngH8)9pjqmj;OzBz;E_
zgHl6bnc?IogURo4$`XY?VbdI^*G~Mvom~@~gmNq?Lw(F)b9UP^8(_Vh`R!0gb?&u$
z)$(&<47x9sXO{LLnb!@-3F}`j+%KU&KEx4CFMd(xA&pOJuh3_2@Ind^+uxHQ0T(R6
zq5`M1x8#OPP)bj5B>Y|ES`Fk|_4>0et~zEfkP&hQ+TEB!p16M6S{k)H{Sc|f8Ojeg
z^JYWmbsUmPlR75-`|G}iY8WNknW7v85Kd@7MO%iTn<|Kv!<A2tEhuOuQn(pX$dV&Y
zx)4-q+M@E7L$RF-LH*jkN~UhlS_V6;0~VD?>y8$V-?3jk`Fi{eJKet<GC;h2P?Xxe
z>Iwrvp->Av8@Ev!>-W<t?=Pt$w{OqPZ=`U$z{)#)U5+w%N21?>VS0@9yn<~33rn`J
ze;a%cuTE|>$ZFKMmooe5q)e_%!6TCHpRk5S`GI!frdvUlj9+U<NJK{SLi&aIlu8bZ
zalPm%?<%dF-xodG;ucq@FrY<7e6IU>r|FHKEaf-1v@XlP<})~d(HMFgMR0-<ds3^m
z6%CeoSD0#a7JvWo&^Miy{I=$Kn2TQ0I-WUu`=k(6l*;DwKv+fX-6=#ile(|2duX7n
zvHq1%;}fh}vZsonV8`kfpPdp*B9xg_T8tw`yrGM!_y>j5Kr**HkFI)0;1sQwoGg8J
zC23Y7AuLey0OI5xjkM*WGtTmE6CvZTQ%yX#orT26;SyGrX17#$N=;?TvxEkCyG$Gb
zkTJ)(XZ_51Pp*4rXNZKx!{V^SFB^+uAJ&A&S>iH_*~z`sIwxF(B*NsbjSW5*w~W^^
zeC^9*8Mp!n-A?t%n68d~lxh<(1Pr<kPGJXOhdCj1Wl<_})v}Z&a$y|TY9ZPo<`BJ&
zUv`7eU=Y3S8As365>o8$qlX<IJ#(5feLXJdD#alE%Axz@HB6>0A_4MBgbodjElA?m
ztCme;WADfjP0U!(&6b)Cv>zC;^FXbR!tno|j_OPhJ@vN7&}SuY9j)Bb{HAZ}t>7`t
z**FiC8y}u)ACwK*Bw}588%xjh^#QXH=jj_SBmpxkjG&j*uV+5$E8xfIH{qHyk7r}~
zR3UZ*V6g9Xs}<5yw8K{!lPB{}R^Jm8rktg-RuoOpcZ?z}e!lf{+s!-6=>_M%nd_QD
z1SB6E<YyNVYXAjK;B&ws1hjG&Z-}YlbZ0Ipsgd>I4Dm&#0XVoO(MNxMc+Yp*cXF{n
zL)#=r?oo>rZBWr3)yKp1*i}fVJU&#fp=|zQ^-!ZQR%8sVpkDJqPPJj~#P$ubCMx$_
zNw+C{ALXthJj=Cgci_g|AVPo;F~rvpo{!%{9XnD|VzRm{7vW31i-GPU^-o{+v9RKU
zsqYzUw#p&CR<hJJx<4-nU(VbTvPW1U_ebr$irv0ZyZn=Q-Exb@)#kR+9<CdKo)J-F
z{;7Rnq*Lo8voju4wl6%|pCV9&P$k?(sP@L}cp!yZ8o1pivW`k^ay^N|-iUlx@GC;K
z+xJu6lZ}YE2?USiw5?91hDCp57D>GzBf7abUEpCh^JL*cBFAUBSm7E3fiSHU2-wu%
z?TuhHW#atl6O%ggLTTGn;3o0YqZD1#%08Z$q!pmq9EP0F&7<+`w8GGItWL(Za&mKo
z>M$!?PnV49w3R6cHs~~PTI;K~c)6%@WciFC*OoT3h;>%Zg%a`M$wo2s9d|cuZ+fao
zI)apupy;5~po|T4h~ML%CC-gd<fSVPYtY=hq-iA`E|WrrwH1RYH<;d`8E)n(Ph6O~
zB?>2nvBo2GlQe;3CKH=x0cU<Hmj1;(J(g4(rr{#{5cdolW^C@&ZS-f63#8{J>y}#Q
zTAWOy;4d3)(3?=(BMkF&3`AvG!8YJ{I=$0v5!h_YN_MQ?lAXoej)iQi(GLT^D<0my
zk{Vf^X1A9vaGI}saYIpfI0}DjhQhVYQ{zPvaP+-Z%ypM)HD2|F8e)UF>vaqG)DMl8
zvPTcW+WCVCXg`g9`Yx4QN@L-gK4|#0G=C@W5>2d2K2=Rvp^Ak1LstLrQBU3ZQCOl%
z;6U)M^XNi}9zKzYe*yXS>t-0yRbpJ0um3{CqJQq`%9V#&>fm%hk`fam@j7Ym>^No{
z6?I#AgF%X5*hZKE&qf%@7Bh?`Lnr|Q<{<XvpBR#>bWCJmIjJ{{=qBnA$Me+L6d$9n
zSA(%L$R+joGuzB|Vo)HQo;mY)5XqNyId&S6&$NyqNhDh==9n2E2g{Rn9dsD21<`hR
zslMOLllXp-;}Q3t!6aVUfTK`Prj~BSdk~vb-g^Nl*AX1-B8w=k3TPg5`-bh{4nFNh
z1j<)HnplGPZ5GZISWj|h&cU0<`@d-Izcc}Qfb;eR32YbYOEh2oTPMHIeN&3l)+}~j
zm$8(8()7MfD)q(58q7nOz<6*>umA<k5ZYgsZ7zjFt@NDtK_I4mYsQD_pC|@@q7`4K
z9BZ%c%Uy2{?{B%8?%a(mtBEd<IaXesQBhse75!GE`zSf$6yMIVln>Fr%iPXc^QXu;
z-zeNttg5iXAH@~Rw!>LJ&lJQ;NB>5V;`o%vlM-i6?&7j~BVwx!3xBho;!8d4>S(n0
zHO$>S<P{llPjJ$a<4rgWQ);Q)y*tBoGZTQjmG>SVa^iJxtMM~Aw!)8mZ;{Gdw1p@e
zR`sk7SF%cOYpL~UNuqEC*pnJkZ56ysM8JXU$a{aGx12^_7b(q)t<V0-Z!~Z>uLUt4
znjue)F@Mrq+=^LZ2T@Ix>6vn~?H<@sHTTF&5v)HLD1a_;g)f^0ch%{ET9-_E$NwDp
zmRlj+2JSP9Ja$!_zu~)aMs|+>zV(ap)nJS<cXB}>K>!x~<!tKmNn9GzVRDI|7&ene
zgMiY1+T;nFXyGCLLG*Jadm2#A*-sN0Dr$^TN<^I=5IpP=(z-*T43)>p$Zm%aus$MD
zeAtKHz$;72^9RDDd>|8DULAmG@lshhzA>)Y?&dG=jzc-YX8zjfRaCN^rSaSM4r%Y3
z@h;u)&e0FClp40Gm$*;J_1!YY%G_7B%LaKayQY`<vn3_rA}=1KJzJSTvln*rKnB}-
z{bnyjR023?#glmoZZ7K|*zpb87P4ZFywQFYyR}iBeNh7FNb6Ii-*4~M%$WgGtJ}<X
z<B*A?a3f@Q$&;etPo;rb5ZSS6n+Vw%I8_7jH}HVIQ6N~K$c&jJ9HUco-?qMN&3J;X
z<b+iREO#){)?9%T*w0&GUWDUU^$*Ox6+AEW1+?7?SQBTT>m|cZE6$~qVv%bZBr8Gh
z-0#PYcJyK#EeU9-l#q-?z~tuJ+_~9>&5kVROw0!JduGQB_Dz2FNT4Iz0PM*N7<BBL
z6N}MJxaGR)ZX$uu5A|%PToka4MXDQJO2(74HLqXM6ZLeHsJ&ZZX6;auQo?d5B!RDz
zfWoOn?x67}p4Ts~trg~fOc~uKfT7lffw1u!EMFPoz}o%^^1LWK?A^AT>YO8L*<1;u
z0CKM-Pa$@vf?-d=fe$aeCc*bME<8v=fV>Gnf~|#SeC9^6Q9Ca(#F9p$JDz)pUzRuu
zjwHaQGWg^Vcl7w?0UY+G*pzW`9Zsddj_VLGY3Xuxx29$#wsr&67k$+?T~DPUd43!X
z!ep~$j{#cplI?Uo2#=}hmQOX(Dytv2rm{sDXlsX-F2unCaRxU2SqjMNL!mp#2WkuT
z?{k;I=UJpz<^Bq82|+EjcD_A@f%~%IuGR4KC5Il~g1kUZ;^=i5XBgo^*FQUXzY*<e
zg8TlQbNt+3N75veae+zpGvKg0BM!WS;HZFel%=*1K+&fT92;ejYvInzYr%k!{TwOw
zJNXTAvV)z^&jS=GpUS|VR<j)c@c~}JVB+g}Pl*!SK$~|=1QWGR6wx?NQsQC5Wty?o
z5iLJ%k#kIlzR)YFoIM~9?w5Cy(bBx_Fc3N+R7%!HIA)ZkivhTW=Mf_%fX0`eLEyAy
zlb$=z5;2>q)lmZ1trvM-I#R)XqPuV#KHN{V>LojLBDEgUyguYBFwbqd9jw`jDu2h)
zRFUBT&wJ@L_&|5Ek_q!}v5{Tr><d|bUkqjS&u3)B4s?bgusp~6dX6#A4YSLZC3)y2
z2Gt|UMhF+MFyB@$X`jm;dpUB}&-j~2)05SoUm`|A8fD!@x8BJSYbDxB7)5Cc_TW||
zZG=%shop|;Xh0r?vw@aKV{ZaPY7UlYj2$>tC*;saKsTNH?T(h!lD~xr^^Bb-F*&s6
zQ{CW=Mk>Y(RW84U(T=sP+o)UESBB=s&td+`*7Wdexp3Qx>nu}IGLC0h^EesY%>X~E
zRLKK9v=cr-6;`OCkWEb&n57JWDoP!8$@#!t64V~&NDJhVvRR7{6NY0=r5^H^%k8S}
zpDL06Hel}|#A=n={n}X^cLn}@*_UgfWz^S7u*Z(@V3pdOWbVISINzpytGH?@$C6;#
zVm<v(pQBaxFP{z5I9TcG(t)FzzYc@pjHdT2Hot61J<D2ct(52HVaj@lQ-GT0Cz=Uw
z6cehCuSF-oQdZtVv<1l@wLXgb=L}C?+zx*Ms)}hqDQusOHxo$}%f>uS7%%|`%j6e8
zuTl9^%yOmm*Zp&{ofN7bg<p>iMdxC0)a3*o3r*1{b}&I(g)AJO=*jNJ=FVe@-F+VU
z7WHg&pi5>Y0D>`r_gH>$UT_!r>de@@6d|pcE_J&D8hDe0rYIWG){4nHL}wqb65So4
zkDl30E{88lYW-C9V5GevgfZF$VN`U%ND85|eGl#A%QRgPed^oSnu%?Vaw%OVg3+P%
zpj4n(LnpH|;x52DLkY!j^)LUE=Kla@K$*Yz?Pt&XlvobL+3GA~3TfWWo3VH2y;=xe
zyA$5i_H)V}5#=5uNDYphrg?%hj#%8l(57Y^goH~EKypy3j9@d_z|G++`U|xCF$ed=
zNS1n;dEi!{FcnYAK!eI6lwz&ouun=Qjd8tIePDAFpy9|)%aIz?NH>cp-GBSLdvy$X
zJ8p%W6aB)qsi!jLUZoq|8cC!hK*S%#aX$}33pwd@RB8^EwLG%XLRm{2Yzr1y<Iv$m
zRXnmOVuq(#opal*nP7a7%Mh5Qq-wqcXuKwx7urn?sn7mT_vyY3JFe6A^wu1J!aUeJ
zSLf%LE(UBi%6x~S_(eDnZ#{5mRP2dh#)2-ks@QOex}@s*eHWZ;5n+${|BPGR(M19z
z1=>lTqaG;RDSLr)*hlopt9h>8qH3v}apKC7wp<>u?DcM{D36a6gH~UDqNjkMM8u_z
zZ9E^IW^AiDIp6=)cSQ7+9kmj(nCtcHjl&I0{rTchc;j>z5N%ooi-P69k!P#ULqdM>
z7iyBq{-+Tg)qs8npxR;KD5ZPV<+udgmI*u1&uwo%k%iuU-!|8ujuu#uO$eUf<MT=<
z3;w+<#kq%v*bk6Q`1$w<1=Du}!_;USJVo$B2}edFTP6Z1)!iTGN|bafX=OCtHFp&d
z`wq$4kMt2~$llNQ?Zo+6KgS(>32It}Fo2ydws$(}YQ@;o#34?1?(BpR`tfyE?(p-I
z$fJe=+OwInIwVC(z!@0*v}-NTrn*mvi&}v=M74DM?t=&1R9!k?m=Uw-JTj^)LHLg{
zlNYipl#8$&%|u3%=m>>8*ilZ$X5}_)AqAGNc{Eg`4x#mOVI*3UcOxpBZJ-dJB3YzT
z=i{!oX&DrmvhZU1><CDOHlEerd#K`qyB(|5M>0{J)Bo6e){iQo9b&6(OXPWhE%?08
z2192t8UQ!7LGaz`BUh(tS)$Wi#gVHy7UW0O%B+1M1#-V4!ogu2>rx`7cbr5<ih1$*
zKEd0#I{UE}TjtszUlXz;Bu|CjFxSqD)X47*bK_E=hJoBM`~L)v8=~5Zbtp@@HQzl1
z{hxidg<2^NndRG$Ck3VEo8YG7C2jXMwLC2KY;glWZ*)57+!g+0IdK5YWkD<6;)fN*
zwiDIVUbsW*$0@IBW1Sc;w+BVgcvw&KiqpHUFJ!51RRh3TVKa}UepBy-c-bn9c<cz4
z5hpOEr=M)2HMx!sBBT5yUM&w{Ay+`yrTfJZBw-%U*q9bh+uFp~ib10Z_Eb1Mz7eIg
z+cy2U&in4TfixX#{{2d7tB{$bR~~_pk7J&l&byhZ+3J<y5AL^J7#0iQeF+Lg=jJI{
z>8|n@PhO~CT#LII3v%^LSFY4cwt-rM#+>mqGbNI$*)oda5^%uC^{~_(>#oQcTl_F>
z1ySOFKJz`cA?#QCJwOi%tr<&zQ&VW~C6m!WRsN<agHAMqFvI@u_E>-2G4C#9r*f_D
zZbovMHa!Cf{e8#~2b8hCmG{DSpG80n3rTaWWKyl)j{zbhTvi%_Sj4I$sN=d7j-CGa
zt0CAo;O|YeRi#;NHsl)OR^xqEQMRF2;xkz-tT4^#E|apTP8r|Rvj+kIDP?}+wt?Pc
zxIJ79=I%dvw?~y2O1h?FwwyS%D@eW9yBL5&4uy7$9(ePy68<>>um+npa<_TL@b9IW
zoFCJ%PXI(@2t~|v;+<%ohF5&N9hcPC$0Bw_5QH}1JMAc41dG<$7YURPGm<!~ki5nx
zOoI2(s@82TkC#og5K%Y9!EU&9KZlCK_kP8QM(>ORWA(CV<m$Psp1)N{9myU<Vgu*u
zMVL0@s4ykZ({JH=kohw8EqpCz*JN2}15yYICg_`LW<p;a9OUR@2I=yF+x4_%w<O@%
zKsqC-*pr?)xg#^1+ygze<fkj72o>#r;Fm55dn4PHe~I;M<W^Yu;zj1=d4$v5n(Z^f
zSm<zNrzIKnjpU)?d$F?!UF&Fi#aWsQgRzcl4YCnCCv@fEI@&Yb9MkvEaSR_3YRp~}
zo{u#5Byx-#D^|}RF$pn-_ya?;XDcy(nIw9O_Q5(%HRxXvXQ_%Xi)!B!!Ld3}0#=iU
zKg%@yjW0XB|5(tWX3GTQcMM0w0w1(Q3O!iEX>ruebJY;5?vTUYpu!qJaqbn0b{Fiu
zvORe)1i4WB;TYKwg+T^Y$Gi2LUw~Y0m;uBPIx+8wn80ZZqz>Aa!m;+wMr=jC)E+>k
za9=L9OhNR`nPL4ZEhd<Hm7xVRbiAMh0XmM=MT|%2SuU<avz)dE1F{s9BzQ&HHfFkS
z@^gpAb-xLdEQEDA5GZYPDhBJ&b4CQ?u^6!X%Fy=<4gcqLmp6v-!~pi@>24$anGV#1
zE>);F&$64;xw?^#Q05n2jGM1do?VaAUp~1^N)Y?xAMF?5Qn)b5$|?idG1ULr<6X>P
zYIB_ko5T@9)*^7mGm)pt{AFgw0T02QPgRpp3E!b=^b*lVtu}ph)xIZEl8w9cIaAVS
zKK?=+WAXlVN>3t2VtKy_oNXd-Cu?7cUBOOm72E>nct^VQxGXV@;QgN7jkTDxQo&<g
z#f;^HJ{^fo3>r2>q{Hu^MwgIUScApRs1Z*26rmQ;_%OZ1;mdt#S5<&9lYTvRW}t!6
zXvU{*s(B4YjZ`1?*^%9UHNvI2+Ud$j-qZKov0`WzI7Y-G)&Q;)v@Z<d8c1c>!N(YC
z<96hZzY$E?ret)B?1Km9l-&sm|I5AYLFevVdaFrlwsW*sNT?hWVmtZ@^&hSus6%0g
z?m?-=zPP@_P=ykxUwLv)jN-Gz>Ws^k@(?DLzIIZi=z^+%xrQ#w(^;d10hQg7H=QZ4
zwqB}&Saz54MbODTqwS#dvbRGig-pain4G|HlZ2yUXJ0ETBQKANSUEJcJ($AiiMqsb
z6d<P4ovMgDBl7TUY5js09G2mdQZ5zRtFm^nvwEN{hT%_*O(f4lqGe&Xv=|AJ2KtoF
ztFs>b(191GZnmBrLNNq^Am{9NT<`(KSdvd-M&GZ!(u2FouN3d7BwGstO57A;K9TQX
z#XF;;ErW3`R}w?_LN)544h?m_Xh5vJmb3cNX~|-uYaJ9WQ+JNc?otu^!<1*!V(eH_
z+Aaaa<GF)dJC~ji`rUPM)JyF@babA`2JN&OI}BY-hl?sYIC}%o$M|u#yPqcnQ|K{0
zB3((Hg8A5EPId?Q`E4R-q*0j8w!N033VB?79%#*4Z*+@Hl-VzbsL^h0DMqP_%&~-k
z_Zv)vsTf@Qe60m>P_<+_#mfm~9>w4IadZxUn`l}k({CXLJX0keb|1ppAU!w1HFH&O
zYBo~h<!;wvJJq>E`?kImuUgclXbbJR&lnLn2@~g1PWM4HH9YKaHEg}0-V<i-ZB?oY
z58qkQ>>g`q#`afecpDOt)%a$p!7k>k$52P1;YhdK+me?|l3S4kGsC^bjR-ExJMRPl
zjw9kNEFPXQmhY7j56pW0BB<qh)=*j53`H447@s+&^43Zh`d_ueB~p|%=pF8n82LGk
z)i!UEcZPh6juX$3K`a&;f>l}kwi+Q%)5AV!R$n*4%_6NuDST;vB}$k1XS7e%fYSy*
z0t1kceLTDc-WA>+K@rU};5uVOA3+{uSk5n%MMy7#Md>=X*hu}%UH;4mx~;N`#KzfH
zR+K^r`PYJ8#`R1graFV=rNJy^oWK&?OP<LX{~}bxn$JCXv!8Zfe<Y;CAa9H*{5aeL
z@spdA*!rEn^QuJTMVynS?aVV<ja||21`ZA7abQi6{?+8K(Gis7tS*`0pu2z)UYTe%
zsSOz?$M`~5GH|X@ezuNtc}%9jm8HO#PItQBoYnc4RZ;BM1@=DT&4^aW^RIX)!mJcT
zSXv`wPzbD!PqGNxM$J_G7>5W!DS7#UtW|k<3!U|5gIWcNQ)gS6kDzE@Vf);I$-6Pm
zWj#o-o1qGxDxv~cT$T8fh&Epx73iE0?9F{>yRYYdr79$q1VZ_Kms@-H7{|C_6%cM*
zXc_Z7&MP93ENf*_2b^Rl(h<t$8kwZ!r-7-q>h#ZU9~t4+WTsMp(&whz3$k8j%igJ+
z6Z21Y8Fa`#tq3pCx$|udG-e@Yu<>?t`hHdD238I<GJ`H@R5Ay>zj0vJQlGtYG01BY
z6iA<=u}Z}VqGehoqMe|YISN_ts?qH`>73OX(V8Y12N`(CzMgWQQ?D2W4)n;}xrN%g
zISbz`q!#lzKHJI=I6tTl#M(8+6Wdtzlini&ghlkK#grPYa;<vvq1dKDaQK=X1~o*}
z4_R43r*0O?*Uhtw&<mXmYrf*Lh}03*Lm=B5d5l$`>Ow55G0{iI!fgPWd_mb3w#chu
zBMmZs`NV|tV~&u;LQ*#fu;Ns{Wi*PhAEg-NHHs4TWs#V?E+F)57_Tja;Vt@W<IgOH
ztzdz8rQZ(lI8$tlEMDHg0svoSl1^A1m3%jP0A`&<aJN9cZ6>G=ioVZdLxyofPhwT)
za`*35Vz^-U!Dd4B+2dX+4LFFL5?a%{vkt_^bZwmx6itVRRyw%6$umk|c@!g4XaCn!
zk8O=Q3co<wBw5_{Gze#k0LI;IZvp`%XMG!Wpb@+SzuX^6waYVHD2vF75xwD>E>6fa
zz?}XcQ<aCo+Qu6G{3Qu)>9B+v1iIFL51VI}PQ{y6<8`%IAFj5mTW<^3t#OA%=_Ybz
z-`W%8YbXbyF$|xJS?0-P=2ftzy$8^m=cm!=Fna?LcAwuYC5aJN=;kz<bmtmME07q6
z9T8(1S;&rVb)$XrseK|+vAt<>ZXY6KTQ!uh@CMFX&emR@WhlUnqsnh}n?pTN|Btrs
zvYZAE;;E^)>lAGsW}+HYI-C*!C<0Rr^>iMNk{XnS&mCA@HuDwJFybO6>4-mMjyIrg
zOqS%*<w|!^1OOjXhV?5Rt^it6aLbynnyQI{a~2JTUDRP0tdsQs00RIC61tt&eMoh)
zu$rpk8nW}sJlR-D-oII-eY<|7XIwX%VGU<fDd*&RUYR(mP@lw<On3;)SmsxzO8pnw
z64Bzhw=_8V>M0@dQ|ec1#B)f9z47fZEbus4BA?xNOn8}&ZsZ(b6R`0HrH85Q7u`qC
zWcJJUn+j5qj2Sd%H*R0RJ5;z>a{=B*WIx8>ZA=l!kbgEHwigu8!8TL6L~B0cpM(Ag
zvAV#dR$y-MubQb7&6fqgk@?<TZg9~TFSMrh*Ed|4K+QQGog>ONg*}g)5zW%kUPzw3
zXdnY(Yk35JxfF8WqC8)|LEq+0_TDZ{oK@$~LyP6G{c=2KRk8?MwAVU2kNBKHZ!%m8
ztrxBc-*mEzeze<cvb&^&(G#9mXcG|EJMe?CB<smu#c65S*Xe2;LUI+vY!!mDCgOCd
z56JVP+@WaZS>F|b!U)ax4TktBnX5}G>>B!utQ5&O{wQ!BDKj06opoYiW2f+Hg#tJj
zyB$65$Y(8?Ne>=fDQ1ZrOIh1u>yHdzkGkxzFAfQM5~nlLK)Eqjz+7-{xK2sj%~Ig2
znM8F#gVk=Qo)Q680K4BgC}G@gs9~Zv()f`rHs`DCl)lN^$A`C;cgVrf!)J+R$bcE6
zS)^f>{f^VTzkV|6`6;}bQxv2)jmiDT+0Ur>W44GmYW?^*EN(_d%k(D()rg3cOSdMl
zbb}^L|H@~C?G{-v*6WKT8GqHN=Po{a%-g^U8qi!qT27S!>O1=m9C?h1q;Ny2g0q0J
zT~m(K=}lV+Sj^N{K9?V78<Crl8Q_y*N)}kLf4u4JNq;n09J51wAtk!!o~%Y@Ke&o?
zZsw}IAg41}G-k<)Ki-XPJw{CklxZ%l&SV;$qc6>gI~!7KLnC<9+fvv$B*dA;P>tZW
ziqQ#nqKMNWQ>b4a44_gp6Q2TdS6;J97wNb)Xgj0!8G1!RiysNLhd}pN%{Ec4N^oau
z`Kpt$ohd&l63U}6pKXRV%PfZM!0VR00WT2Zdu-8Y!K=k;UI0MBHsL0+PF|tyM<P!Z
zD;!NLlZb$*SZ@A-_rrB%#^+fmLh`#McjL$BE-^izfeS?$Tz<6U<~gZEFwDu4i>Q_q
za8%W$bS<n1hjQqrz-qSYzaGjnV*9jKS)<?!92F0{aE8u|nj5Tm-od8hg@-w8C05BG
z1^g65#D$E}=0hnY1*L?ikBMAqVa^_>;88`oq;jzd#wCG615v5@jR=tg`yws@C<`h!
zLc%grl@Pnbq$wf&=a@Z}ZP^F|AuohU1n>|S?s7vIi!7!@8?-;f7nLY}xOxJM6TN$q
z`xm%Ew?#Yyvy(!f2Lo@RABp1=v;-V>ajw&L4C9b7_s<j9W^PatjCc==MSS(umRgIF
zl+cGUnY^xs0^uy72IO}^#$<oQ5y7lWC5`{baJlP?Qqx1F?bM%Xh%w-({Ek`q<vVih
zHt(saaN$r>XE!QvNveWAd8G)PZQw&=Aspf`Xq)I<>gL@Sn>>=5n_Iws%+WAn@`<c5
zJOCFpDz4RdYAl{y$P*#l?`QN8QZ%YVB1Z1sj4_mU8yM5}$RSm@9|Pdwv?zO9R#}^U
zs#1!1&kSDTB$K<0sk?tHdvBM1C{_WS8Kbanh^nZwqR=2*hcus!ppVw%?Rp2CS=u`x
zY0Dg?gU+jz>9l=bg?f6$6RfWVtK)0>46KsPVxJ%_EkU+w3hxcIcg_hXVO}Gwux*J=
z&WZ#$>O-6+<>LJ5XZy%VvoJ{ciNL=L5mXE9N}l{awik=pmRX>-HIE=hMqjy9qERBE
z8aPKv6BKKTrg<d9_a9Aajq%y@x4ve*!c+zBnJ}u5fm1*3cE)|WUnx6}mS(x1YMnl4
z=H`x5Y`-O`+lYJ&;-ksLTQiiH+di69`Kkt$gkJ=#sk;t_Jto44f-~C18#)>rX9yji
z)0r1d!ZN1@CsMRn)8l-&BTzpTlA;a2lf7XuIO2+}6EEr_zk^OQO}_cGfw5|K0pH=o
zD0Y%=Mi}*iPDVCHjRB7xCK;ol_)NU~zEfe`0ncCEHCB*(1f7pRi)(1zwTc;$%Fhp=
z>v|<Wv3*52p8AlQFSqAnY2rYf-=5D+`->}h%Cz7RQAS>R)tE$8OJ(?XkE?`s?;bj(
ztz|JT;xq~{S2~>nOxkF1Xrt_1Pz3j=K+j2y4DT+M{#vo+f>;qrakHdOu77fWq>~vm
z@=WZ>2vRWxNrvm6nTJ~#Lb(%*u50XcMX<*U6&#(}gx|;I>|g)}@8!eka(ij}jP?-8
zsb>AeQ4Kzz_RwH!GaRcx_YrQOi+8KuA>6lHc#GZw!C`+R{?z?PoBB8A@-X7I&FqA~
z*zu^<#h*fXSwZTaZYZo^u^B8KY7Ib0LGrNEmsBo~bHl$fv^sdZAkc$C=Ae;>WzOi6
zBqw)7O~NDmiS_;ifN8TqqFdH~r?z;}Cz|Yb6Uub2cQ%w+Sj6dZttB)PS+h)2y4LZU
zsdH`RwCnl_;0M2sy0A0gu&zizs^b3mFkGktF@INRCz?#V#~Lk6KN*4f5j7Td;j>=5
zuWJCY|Nh!v6q|hYL7Ao@dgnE@nP2KS(7|CW8Vgt|(!7XD00vpauJT?T6bthW9(1#S
zO|!_^spy*0TlfAwLz@<JE6gv+GCJ$Kv<b89A#6W7|9mEh!;0S<^eR(6w+BG{ppF^+
z%6CQz2r@ranVt-tqXl=n?7;jE6KK~M4)92IN>SCR@lcs$E^M1Tm`oqM1*Xb*2xWwa
z1Q2xu@!T9Q$D%44#7Z`i!myaG@KY!vbS$>2#snEknyno23hBaO@EndoQF`2v`ns>T
zL3sh)%&q-<1pz9mv9fMOC$(@SeM%gJh)nkP4lCQjg>s<WFzBTGv$W`sW9ooX6GASC
zJK-8XkZ5d_g1?uI4Dyij)|!)PuctGSdCs7E!e%yMjHk}qWQdK`n8U~>*!fbu?)oZ-
zm}qN*fi@`R)Mf+9#}e>IpfQ`8S0PTYVh8VHHT<rrGfi^;1sBYI*Ee{qpDEG2roafi
zCiDY9+CBq;70(xmS&ByssU^!MK>bupk|(~T`PmwVC=v2tUfPt`c#mb_7JQY=C;9A+
zbp7nAA^QTxxI;aqUb|qD37$!^*K;R9IebN*o%GE~{cotgjpMrkN^wr^<^3EPQ2cYf
z_Ny-M+<PzJk}0!zJpWwwPJ^Aq)|+8ahg=X~gE1gdIiIb<H=dAzmHYn^smve%2x>!$
zS1|6*t`bG?oOeksD(d%DdT3a+%~anh4&<d?*);C{SgMTlT><h+-xpu5h&pjY-uQX_
zL(gGmXLHefF+x?}W<CAWoZV<6Y7EPs#ID!c`{>awcwdQ5$wtVonhpX$W}<48IiS<|
zRe;~j<Uc3D6xGrT3X??iC(x%@%lzW0SDrOfx7~o$Bqe!-q^aoBA3kRX?c%UgNX;R$
zzdb#@3MP@60M}YQhL*8<R7^)W{C~XF%e6l62tl{C)s5#&J0P~V7tb?En?vOFmrCxE
z6w-pNj%RXpa)t#%npUiU-V);LPCni1rU<cw>Hw}2nb?UZog}42tg0%tkwIp^!C!S0
zJ~p{B(3;VJ&vtbcb<U@T7kqdOh77a7nE|jEMP1Cm?`hoOXE5{_Wy-U_FD(8CBe0VQ
z!fBtc6&0}A;H(FJGde(q2X2NcL>BxUo}gM&@onCHP>S#t1SNcGIju6N3iIZnciVM?
z2WmyDd)+eR9f)polZ)N1c;BAg3?8^~n>7z0FQH~=L$gl|K%Y*6s5-&a_6@fCwX-X3
zV#t9CCz?NECXLyHYxBtkSI9UBCevBcH@ji<csIxi_;x#A><A@O507KzdUA#Z?VCug
zasd?^7@C%os`nyXzIn#WkxAP$aPfp<&w#LYAipg`aKca5L++gR5vd#)WT!BB?As5i
z+hgbmIf+vk9F9L5&P{FZVRKt+n^I8I!u4Z)(7BYZx<Ab^7@EA$iD2*Z8@5B~I7(ti
ztXFo-snhF*oW4J|ho*3fTR|j+IR(+CfbN^qp*sb-o=0H|iK4V6BS)UF*|bX2kS<|p
z&hDBB4#8Cy5tQLq^FT(AK4cvX1m3_7i`t$v^sqWxC*M5?rO9K1I}dU8!N)-Qt7gmF
zuKr8NU1FC`mL=~Kg8t4$ijUA7D+$uc|0E&E>BwwPgD}%C_k4P-oLOjP*0TP@u-Br{
zQ?F$joSCVr`-0VI#r9b=w|lZ*0jffreP16pa)RbmLYH+8zIv`IP9vnHb&=__31z9|
zLFx;6r-?wIJokAz{jq=YV4XhSRr+#{j@TFQQTLzY@{n-T=Zy111}*{iVLggs<ii7e
zRfcmI=XC(FMISHyTK0ex7Ffs|2Yfg1(}$&Lv!y8C52u01S5?SmWN9s#Rhr%O^?O+r
zZF5;$m4&zkr^t%7H%Ij>nay1?P(7`c$r3UkIyEf?UscnM#Ifhc8Y7|M{jC!)vSdpB
zVSzrFKe2?wrHEyp;CGI2VavGl_36>sWIDVg-vB`<QYqiu&>(3m(H;c;O_Yv<wjA7L
zQN2@giW5+@KTF=t;ZcplzYhtTh=$F4+4!9)(@b0>DH()eCpYM+1(qj1dG@9FmTcT8
z?$kjIo5G|@tM0FT!iLnxQ#FTN5(P&rPU3)%u(VMz)F?yTCsZ0l8GhT8cfb14sD-c4
zIfd^QyV`!`PqJ~xUHJP|ppMsd`k`-BPp-iQ@Fd&w{H6o*kV+M)IK=Ab9{@Wi_3rY4
zTgMf?{WnQRgU*8Im?dBS``);QRS19a+_jI#nGCaITxCfR`N#t2&!i4{NHCCO*5i0x
z47ZzKm7mBqTT;JSqaulK^bwZ2P1@CWippQ^`GH)I^vNRO7blbcdac3ln3pC<qMVrW
zXC}LGZ}P}|En*EkUU#7H4Qd)q9}z*b@bTQzbm(nex4@G~*Ioe#K{|aHl0)Oz+`7`P
z|6wA;D_?e!B}Ek8w*WfSzlE$Kfdp+#lqH>SF@%hHXbOLV;Qq#x>n}KF42_BJ_3w1)
zh7bh*9XhW5yrCk&Bt7~C!atxQw%OizKOLvyTiV>Rqc_bZmaf-r1j+%7j_)+G9J6)L
zRwhNrh}#|KV0JDoSD<8QXO<A(`#6`O7uN-u@WX}Fm=6u3IDn2*4L9Bj$BCc~$^={~
zK*-zRS-fqcUkvk?rqkD5`}fXS38@*v2R;C=`)5fira@%RRhXKhSZWCgGb3JM=3$Ap
zpPam~>ndBhg@)(z^n_B0eZ4q6ZV&mb4MwbMp4Y3M734Riu6X~#koQz+^ml@9rk+st
zVp##~xkpnKk%--f*oqb>j894I8rg?%%__$10Q)JvZ=4k<f8hV19q|BLK%yy4@t$gn
zAbg^QTgN9+dMCjg{P_>msBl^#O}s4l?3?=&RY3kn+CaGkXB=8x6uas<Vir`ZcCs0~
zB$+bq&W}q*oj(B;#in6FG1auhweemSF3W1&bJK$R2(9w8hvc%mv?lLY{4kuH3hS|C
z`z*x)HQv5S3H0C`IO!3k^7*@dfk2SYpmt@6$9ehp=}|Vl3`V9XdOyi+{!=%jD!DXj
zNWn7%qV;_D{%9k*Lj}ySJ7@vaYzs9Wf3K8sV$0*HR2CQtzsI=G09~-KA=y(HTKeq^
z59pL-7+wlhA`6)6*D4aWL+C(4<igL+jJXM;<qO=-P&@&nCy2=6)Et=tz_yuOu$j&n
zW=1hCgO(RLFu}FWoIy^&lL*C9i(i6KE$2NCJPUL>@6V*yU6CuM{ntCcVqw_T>yBE1
z3tA^%L}TbZw_e|(Ew;!)yJj8Q`n$RrF>^O-HM3m8G$A!BOlF#x>}@lR`w~?xRn>4u
z6)U@$#wbUv=%dHeu?0k2U(=Ey>Y)zm0(sMsoD1#3CY%1&y!gx4dVm~`8{ePSUU%%y
zkwGi@N5u1F%L0bB5`68|Kn<SH7?_0^dp@=;8(jOM(4jT|HTNEiFty?HD9$GKM6!2H
zJwsAXqZ57o^0b7!Q|&ML5^TbZdc&wm<q$wayd-MG9q0l?;2^LQvWR6mY_jIuB(5{3
zF?~OY9Kv7#00(?Qn-3Tz{{R5vcpJCNU}gn#F7&i`)kr;Z|9rTe0x+lVdX%OkwbXN~
zcTlz3Cbk*dCci$;PMR?GkoOpp$h%YPq$yQXB-HP_Ib#c5&xyr_^k%_SbvnS}u?<fx
zs*@A=eEkxChWPef$wZx=mpo%oo)4LR4+9*dJG_uf`(e~Z9FHo=z<>vtZ9&ip<HU?f
ztTb^w`w+q{4qbXq%&Z7ys{A3&@9iF6O~hCvmVvfc)Oe?d?(po`50reP$dIOw0*yh8
zHZWaHYyE%I5m(sB;xzwjiNxKWV+WgPoA+^ED>X-(6vxP?QNz16a@g^;FkMahu~{Rz
zDI*&0RCvzil@DR~w2;o>E!iSG6yI>P3wm1L_CIsOaChi?gQVsK&V}I%MA>Li6VKhz
zT=5juCsm_=h(0m8@>>%Sfn)19x+ZF3Y^|HOUE;AmtLtCQUV*|A8Z4d;w_HcmO{2my
z3i~|AIAO^jCpSetiP*iRGQ$sO=MJIZhnx1jIN4swG!4FW7m*VIn}w3-TDk}i{fHCZ
zK=5Y0e}UVwBlv;qB|?kFN!RNOE#8|5%W1hSkDqi>peDRydz#`@)K%!oUiV;RV~PqH
zSH4Gjw-YoFP%+BTP@dPL-;~ePH+*mBACwIUc=m5bA!6B?+I0qjcsnTB;`j6{soucK
ze|u9HV1(@kbW(aWB7yMSlvDylAW?z|%{Jo>gWhNPa4I^YuvoPnIP0I6!`WQuW5)yR
zh(+)f?>m*ntX5w_q?UX}p`?^BsCic&br9s-fM(ZOrF%JP5qNUh1X|puyrn3y|A{81
zW3ln_94GW77nccRJ640zVD}UBk6T=Mj+vq{H9aE~z_SD5zn;TeNN`Gw0zPXG8jSOu
zRBee%a@}V+wYLRc;j6@fp!})Gv>AKQSKL^wm9ipOYsqYui{>O$KyQva&Lh`8QIM=9
z;OBFkt04C8TZjTt`Ofg90Bn+4Yv3%_3TQleJ(Y7mgcN?v)6C$dGWyKXEt4-cgptVI
zWWLxicdSaD15e7ltq%+5`I&>C=yireC<|X@@+xAW(8;Tq`*pKEh{8M;#31ghU)^Y~
znzi2Rv&hcQ0(0)`oW3fECgywKL0(~8dg~JE;BTypB@Rr<!#;+04|9chN-2C9JSd3U
zP6H<v4)y++@(Es6*e*&U&`=N*M7&Gb5|x_b2&a;obO6**<oj*>J==N|qCapEjX{~?
z5~b?vSgiraz9gCO8q|;lx197GVkW(B2{<c<-Z+c3eDBb_BZ82<ve1U<;>7wJ$UC8-
z*;V74^B(mk8UN*ZNBoS?B~q)0wba_lPXq-!bx*&5>Ur(KDTpY6ID+>C1ShwCDU2#=
z=|>hM55Sk8XokQAfP-;}Aq8O<B}UM=sdRac?+E9E)WB(4_cKL@IlEIakp@_b7u9sU
z|3D>w1Bcev$3uBCoQ*p5jL_^Q*^lTsjOwplz{0Ng+SgqpF+~U!j;j+4e7G=P@im-;
zy`oTg)t%7iZk#Eh@A;8h_WlLMJF2S-TK!e<4!$|UL@OSb`=AR-RJNZRy)_tAaNYRc
z(_LhtP^^TF<k^wzg7e_tF=_LC{{l{p&wSq4oMo8SgJ}oZ%c3JncE1&yO)EihPdpqg
z5wWr`5rlTkwX~zkZ>wG4SV|2*(<jR&ae)*zY6Q}G;xGA~uhpg(3F4@6D?k?O5lR(&
z)m_(jNsjuAX3~kPCy7<XIMt%_C>&U^DP}$#-SPm!tOHhM!!!AKh>t)P*cl#Kq$t&(
zJM2@)HO$V6x80+{)no+=qdIPr=I33aujVH(E5<Pm!lEmFg^KG9Q&=)@9`&{$-&-eo
zU=BWWzKD~%uI5D3^Ne~Gm9gK*3q{mLy5>Y#{gSKX+l<=c*lAV{PER|Ctoe!cVIJ%7
z4}afyecdipO<ORHRou!d+^u8aOGnpp6i*=)<q*m@w3RYpnO&b(^YoO5RRT{csD8d|
z2euO<7&QfFd{za1oZY?E;4TW7{xvZNj=L{id%>`6Y`D+*7DW2w6lbb}C-q@OgP5jP
ztUKv4stT6Ec(?QD$a*X^BtkKDKd&T3j&%ygcNp$L;!-11S1AKdbMKzo+l`$<jHCwy
z!mRXv9Q;>O^Nx&YJdgd^`kc}O6%`=nSA1Kq$I7r@RNZI@SYP7Bp$mmnTUeYj%J{2?
z-A36x{0)MdzLaVSg_=S|JiQf;_){m_>S=tygz&_D{$fAO-tRRCNDlp>WV(%w{Ve0|
zlQkVoc!OL>)SbY(ySH=oAQ%}-d~mE&BlW+(L2*pkXJJ#9wYViBsBbwVMxurbVx+Z9
zqO;&miO2|JCE=L$8O~pZn&Up$HY7A`{qoU@&AUI2gx9YKg#<yyhvym8;)gtQGS^;M
zGv3)aa!>?z{cvHp3%tbFh{!Lc-(!Ln@^MJUql^MT&-eyP%%O2N=tq0bgTrnQoJxIp
zvG$s*kx@UC>)MSU$1J*hc1HL4@HW`e)zwTrv;5s4p8Y5EXgBTY{I33OA+}zs0?!wV
zfMUS_00BoqpDjfZJZAthcjP1h_p~W4jXH^pjrt`bH{ByC5diJ@ID^%|1|TtTts5*V
zDs;=zfNZR*bmD3j?V>~}dfS+~)B$Wg&`S(M1=jDd3`HLMDq4jcSe&=WvY8&mn5y(p
z+;S(g9W)dLl7z&lZKa^unfiB-4CfZ%<KC+@Pn9T_w|Ta>EmuG!AfOajfV<Y#uJk@q
zd#^8z8RMUF)0ud{QNi(g64vITf&e&kFYUG5AouI3z;ab9FXQ!}4L2R4?J>)>`EY(h
zCArvTNM;NFkVQDMk-H<gOI6^Mlzmt;Bb|R{&Jp;oC(OyjyW|dt-xQt?W-7iL<c2ji
zhzr}kHau#Y!x3mAqRGT2oIIx-8o>#ulxBgp<Ph@;h<Lq?H@Wn7le9;yfWNd+kX_(n
z&n~lZcj9w~(dqzZ2H|;7`(4Xu7!d#f0LTHKPDCO905=tRsDBo@yuV;u@d>}scf=yw
zXd?x~17iVRHp!e{;P64Y5Qt=bpvqCLC7hY~kkTxt)=#rycR;rG^BmU~A`1cWzBS9z
z=@0n?`XaqwHe5%S8GXL3_rSp*MVkZI!X`Rk064)|zBh>>!F!0SZwAlV7aT1@4FFp<
zRZL!cRS@WWt<4i)0dofJP!W1zXk?#bfB*mt;b=QhL;x=dqax8~CZ&)NQjo-WKmhDk
zoy&Vdrqg-ViO?d}000930#5({KFvX!P&A~$F91ezSVQ6;;$cI)Z~X$P{tq_5WMjxW
zV*k_%-_?l|dAq0<4p0YFR!IY-nwLpj6u5L7K8V8TO*E29afV?iKaTaShtz6XQim)F
zIeTkM%I(kRL5Qy8cSJp=`fmj<JcHoK&ydH7J^e=OsH1NQlsCs(7Z`Iw`_o?TejDp?
z4Pb27EkR;A)ib(2jkq}UmDr$2yqV{7tR3XwjhcnIWMV%veqg6!*2%UCl4)#-v*qM{
z-s3M`<IUR6AjN(j0dQZXJJ5sb0yz=RI1ks*2{N?f#n+dEN;wK;3>K|PI6#|sW7n&z
zf&;d_tkt$@X20^)A1!QkG}(tP09esGc7IbVYc0VANZeUgpCsf87ph!p$D;KQO)ACM
zj>${@V5}?C9FrRSiVFF}&Ck>d<34SUx{~03h*GM7!dzYu{bY-F?5b8%A?h}qfmQG!
z@zBLn(qbu9l1nHCEa#RJRU_dyDUy(O8B}D+%dxhqdRz^O;@&X|;{veKbDt}ReWeqc
z`|9r97In3IQ}l8Z&!O>$kv({Uda?P;2f!s>l2JHOI6zUq23*yJz>X^(SL^0eKU;Ls
z0Y*m=fw0nUVJ<%YINeHp<ry``D@ccy{2>#u5E<dP%wa}46>SFVf?p`I`6?)Ibln_Q
z93acwop1{uDH0d$p*R;2SbBKk2EQLTN+2RtZjgEZ|L%D9C16HoN{)f<HeWf73wzys
z2mj!%u`$LXkt<74*73R1$r?fk3sfX;v<UC+cMc*cw)t~Msv@1MP99o#uXVPP)o`bO
zbp205b&4{2ElxlxT(4Jx${$7H`cJEF(rYmeK&LD#@?8pLxl9jjaF#g?zJ7Pb1?ygg
zu(;12V=cxgYs%sBJusmF!V`(lF!1xsGyK5r(6Z-DXmASO_~9{}gii_OG_7;2zxbVY
zi`^7AJFQY4$g}R-v_q+(MnSuZM6f<{JGVzqQlAhN`WD5OclhW7d8&NId=Jh6Cl<}l
z*6n)qlPoaTP9OZE9b^%m1d~noh^|16N5{1ksld<Yk+vO#+D8{fb#rW?s}^PL_s|K&
z7q7e__WNNWoMVhEYdOL4`SsBvw<26AeZmY>=7mq^$6v%L4Enc~8VBa}uq(p2e5qE_
zt+cj4SbjP%jh8PF)eo#OrrwkjxTgan;3X1N65tG(@ES}2Am1v{*>(?9god3=BI=fa
z&xFJuCU_>&i>MTY6(O~OFTGun7;3Zny$P=bzgMh}=&s)fROlF-5#Kh8<ig#6Pw6kO
zs?n2(_j;r41%yYLn5l>Y_2?hc@$aXK#}wsKJ3GZUbvC`Ex}TUt{ihvkQ$@SsS|7$4
zJ$o;!$d0A+L~IaLla5+MW3?%IDsh6}He2{l+PyQeTLKmA0R-H6X|aLgJdG^~026su
z^I;uH%O1N=f`oZt8c7$Y`9GTqshkI$sODu=<$3}s(eor}Nkwj0@{Ieg78((YhQ`nB
zwxlUmb=I7|zdf0GMVN1se`aam6<bD5S`Xv~&EiaNy_;6gd3qnKbyRv3GdogSgIz1j
z0NbBVY<_DcI(VB$Y6hZ5Xd+e$+$<q4<DLw~F>!3G4CycYs-G-~{0z%O2`qDsYRH{U
ze3N5?tP!0|YWlD>lGnYvD-iDsrS7~HMNgxWkHU;88gJj>c*8KWIKWUyAbul-Pw97p
z>rGqJ=Ge<2vlp_V{gt+{PmZ_0@L#a}xGR9QAfaY2edGo|Bm!ABwEXO?@89-Q0vC1T
zYQy(Xu_FmL28K6-V}N3N2=i4y?MKRH7aW*K_`Bct!!DgpuYpIHhSxVVz!SHlCE<r-
z*W&tEIPe4e2P|(QYDOi#y>NSZ#z7ETR9>y%Za39Wl=*xZ;jjasB(S&!9^J^*TL=P0
z_!FzAR)uJ!p3jd;!7l<I%tt;k^y@*l>c70JBL3ZjJ(b+8J_3<#zQj4xnLMK$43jy3
zf?us?7xwG)SiC=^Ch06maB8GmOQ!=#NXe`C_?y3N$r+FxMo!;*gZN><>1jGk$9>w^
zFYyRJi!ae|y_oFRz2`R}5wBj*<$#9j6XVI^V|r?E0yZf21+Ntjg+p9~SDN7F(&EV9
z7k@S6n4&=piVi(j#{k7cC9Y1SjbmbOx~%{Jub<?`@#?$WUy{>QvOmnu7CI4T%u_y6
zgf0^2Qt0oARiBYXRy=b;)KRV0-bTeX{c#ExWZHj3VP+l`SueK7>Ly!mDe9!R*Af}=
zvSc<OMhwp-sGdZao-@pYVKWsM2K#8tAy+}MKRJa;q@0vV&hh}LR9NLO&d2^Yk6X=H
zn(|-wbnEFq6<?Z&_4dZ?-ym2_S%SLe`>?Q0Zls3^M#mMs+PWbMrp-VAFl6op3k*2L
znhehobJJtT>Y_n|B>J|~DE{yM8_M>$zqE)*mO$myU)Ie%;lA92IoPKe-7-S~D&k1Z
zs&K#hAiX+101n}5DY<EQXH;k(bzG*)rw*Vx*mIy$lTH^DE~JfW=6l@I9SWh0^ETmi
zl=|?Y30IP;wB_lEk?cqez<c$zec|LD(&_Ks{aRm3PFr+&@exz4pS>C+Bzg{y<^;?{
zZJ#_;-dJ$oI?hp#=c3U#EV#kHdVg!uU9vgm*#f)ZhgHQfz9Hf~eCSAA5@SXGBNOgD
zaInJ`kYlxGQNCvUz;GhB67xk|%zGA8?4ofS<eaV2GT0O$n-ZMb4zM7S%!Y`!e^9Cx
z&W6M6xDR@iOEnmXf}3Kz*w_cBgT>rsTvG5&dVz<fP<mP**ZIv<1$;?axg<kU^Yw}H
zcd_o$a<L{VZGG#1K~M|D+<ztOH3usiTfTH?)%nAW+ej%q3LsQ8*<VF41-3{od~9S8
zlne6w2nt}%QMKO^1X&4AM2_u|!|r4>*N&v>?cn1|29pD_bl83~4wQw(HKa%VnJt(c
z>qxzct6G?;JF-9W!tw->z*5QaAADPm3tTPPhqiu7#<RB;s6=GmIpk-LvOljseious
zi`c#EKT{M{-_o-g>MOi2+prVh;VroNgo5<zrGx$3oS;P?p%pwxNb~+VB<24?8xW#s
zKuCBMF-NoAl0#bL?-R#Q`{gdN;7XOnmWq421*E-xh$7-GEFRpl(QJ`{-(YFPb9>RX
z!}S~_cTjuF&648FIbFs<G-FQ>V5~&zx3evtMl;xbUX*AOx4mh8so&vF1UOD@P(f>t
ztwR4o6V#KPvk}l@>qA#(hzxH0D}fW<lLL`rx|F5a*;zBQg{?Ee>&{lwvgKbc#k_y|
z&-jKiQiIO$0Q2w;hY`EKcx8nm>~&Dk;moyPIq)h;KY+DcMIwU=939o3(5eqXYLRc@
z6}tC#8lWJ)sNQ3Kn;>xKKHP;NoIIN4(fc%6<^TYIL6!cj!Drto5yTMgcL#ZYxP0+s
z2jUaGYqImsIuvtoSQ3hlhJgv#HBxSK3-3Fs!E=AL6sOZ}`Z~mcM&t_hQ+ih!)zAI?
z_LQ+TqY9_@<RyqV5K!y|CxCVuM<&_)-{0$S;PM-jIOISN!%2e~+m*;6y(nzqAoe<3
zf@&u&ey0!EGYShH3<ARl>g7eeT((?oq8Y^dXExlPioLVmdFmn8mqOoWRgFt@5Pghi
zaJ;eBV&QJ(15HpG<Yn0E4w)R8hb0yC=9dko$c!i@JjLyz#w2(nIfPR72p#3M*op>e
zay2Eq@@!Wb)PU{7LMDmZ;%8$>t@&+nSZu0zxpF}7vvd^S(L^(Y@|E7(Jpe-kGfad%
z=c1wXk=AFuA&uG&sV+NAL^p%LWPVf`&LM*WwGaVOj;+P=ovZMsTAac-1jGe^Bae%l
zbbW49xXhVg$tky(?XKa;VUd?I+Jk)%Uh~89vX*L)EI>g3(gl2G9%Va3*CP3I%46w_
zkPT=HcegI(p%EE*Y{ER}tF*agi~7}cNApvfSEs7%$khWWe4#pX38&fW4|X}To){kx
zYHx6Hr5Py4ORWn9m*`T<Fg$#Onb0i8QuGtBu7amfWVPF}PO}j-v-t<yqmM1E-FN6m
zQ7ev}VRc5T)(G%E6Dvfm8m{HiE$j`wD2N3MOIuES#!ZKLs?HrPJ?r2<A7qe3UgP6D
zb(j~v5_LzgVe#I6wJ8V7_wqXf(LFt5Mt}^tf^CNoBCRNOAQ~-fh{_@!>jivIN&gQm
z6q%*6xe<)e`0iMq|CBrYhxoUiPgQj8QvivF%6k#!TcI4vA3`)ZzVsWl0^^ha1m*Wo
z+kbxH4#Y{iEBo&2Bn=K)`6EkJ8He|w@%{7=w3eDtKD8hY`IrYY?{w5}8rAmE7%$Rk
zP9?7>Meag)OPSQA7+OxGZu3J@)ci7axZ#dc_jH1aW|K_iCPtbo7#_{iMs0`=1k1Fr
zSFcWecS?PLKn2Hsw)m5XtLenq4zWBurj6u}Oz^&L4_%MO2c~@S1{fM-eS?Pan){}c
z&~bOLbY-<W{qH@9H7h@793sO3E~^@rZ}~UF8V!U3x7vfg3Bt~rT?O<Zs7=?d@z=^f
z|0a+d+>6HZ&a6f15@8k+ng7!&LbG%$k}c?~6i!k-4tbF|o4EbceSE;cQ7Mx&d^+y(
zjk1@}icADupDShx)$E51rZg=NRfLzqiho4#K??=*XmjVoU+;tVsYeO$Yn(!|8QhC$
z*T8Y9z24^t?M445cT1|8n_)msu)UA7Y1Z|Z`9<mbNNV}<amRmOBO-gaX+_h<lwB+%
zTb}`#Uvjj^68K140lb%dT)efRnkV5;2k!wL{@b&0#WbIO_4PVc-&+AtsN7cl*q20a
z1Bn`x)m<gNhx4a=CQzSQpPSPEzgEfABi3|2@qfX-Sr4t4%fJ0v4cglT;opET#x|_p
z>0{Q!v2S`Nj~GLUWx1WQB~7-oTFaO!c#=l5Er;167qQs_un$fSbCUKx*z89Z0WMva
zL`v84s_i@>r+hTK)@&6?U6WLeXeM>zN954T30*f#<KKZ5N_}`%aN(F0R={|fu>6?<
zdpd=^AB>mMI*gAY!IH%;lCZFr`2{s9nphHT!`#!V;R_255xkMHt`Z711*hmRk8RH#
zYzZ1LHf$A(CZDPkPVw0IES1-Gm}UzU;p28NNsRddAoVjkn#|U8Ie1y&Sonvm=1H83
z&EoPF73_)i;|&fPm*S9l3xZf+@-?(QkAlPpt#cxlU7!gRO|EDTw}l&X#d^Nc*ZE*5
zdSO%pMa*vOHa;AZ_U3W3^Bj?G^yNdLDm&J2{Hz=X$W$CmM*w@s#LQ6wXF7b?>uoSO
z<Lk>bwi<tp^OG$GaaP#Q65I`d0qH5}t#6dyuD&*1^dJC(eobb)Sg_}qsQ{&?-+d;y
zt+#+cY7>c4*J`D;O}paq#{C1}a3{2rKK5~*2vt3j+V<T8jxPn5karE)mo?nd6ilR|
z6}ypKYNR%z&$H>ug0+Jyh?K}?n@3(D^12HUasj`#+xYe6F4rC<gW90cV%p$*+p9n#
z>^BH67)?{u;+Gzoh}592I%NSz!d}pDRYr>2N@+^>hEbB-Ppjxad;{Ekd>329)u*^y
ziY0Qq9nD#-9F%t|Mk|0weD~0=l<lDxZa23SL?mxU&@dht4dglGvk_cL0<t6&4TNWC
z5U`M+vxj1j2)v?*Cfu`Ls$_Rpg<C(M+4Ul%!?G&QYj53`!*J$8_$-)`P^KV!AMsv(
z86c+ZOp1kS2ul4Qma+84HjW2GzPF=rPlp0#X>8ri8~?45Y0`kcVuCBSUy;shpY@sJ
z4gM7GCnppZxp8hUB(|DSXN8xBY2prX!mJ5p|NO8~Skss=<N1N4E?Ma4F`)*vNu?SH
z;s#p5ppB$8|4BWl;wcjM&m;NM-K&@X-aRuWoyk=K0ZWFhqpj(0kNqC{y`OK*k?sOg
zkc$mfiURzCF3*=s&dFZ%)iC>#yjl4!w*|Fcj+bVA-aF|6uaX9!SC4lAw=m@mQEmcv
z(+y*tI46%0giCWr`xxHR#42NNXlV7Q@^p`0<sCAxpO>|LScO%ex%#OO4`Z_n7_BLp
zwkv`iJByUTc2<B^b+M~9#)ZUEaBdtzx4v8M+N|7ABaidD0;<lTIm=uIYx+tD3@-j0
zE__Fr!^pa@hMCj}*0=RVu9A?!;&x7+ct&eWny(aX(c0G6-s;?d2mQlzO;OI+^ElrZ
zt(Kuj>??XZ^gJ~4@j&Y`Ao5<Lg-b@5H?%BDlTcLi79hBMQFr_p1%V9DM9$-iq})a4
zjq*O=s^?k-?%>I@huo=UITw{~8Ur2}ulLpMqZAQjPFXEFusGcOgF{G9_ONQ{lL!5L
z93=5F;cnkMp)YcR?&knKh`AO6LbHCwBd8Dts!TeLvrr4yGk12Pd%FSjv@#3KpSh+r
z99Yo88EJB`UL|Z<y>ABKw8PL1MAz~&;S>)57;_Jp>ju6}IYKERVkbCLUTg}i*$fo%
zIh4a!<kiEBRBo7(<s7A>h)>^tNku~x-ZUPHdOXj>ciGy5j2r(XNa%?9Gjpl8Vq0QK
zBr=134szX_o33=Y4zzAJt>gIE`*ciAf*^O=<qw*?zIfeAgSn#WJjPVG%a+7`6BFxe
z{iid1^a7fXv1RSo#GA4N%St;qM9$@L+e*8o)K?56G~s4&O$rP)WQ>taszSvDN#Jiu
z)(C&%iL)zC{%W(VE^VclU)uP|oV&NqM2gu<@Py?QZ3$IZwT2TbwDrG<CJx*x8<v4P
z(~idgLyo7aQa+Q2NPlo0-V=nW;6ce=j1g4uUi5D&U9z+j)vy!FY{+q~wd&9r0E_4}
z#MtDxkLG1%ZHU<@dhv;J_L8iyI2YRD>GYSDMyM^t?%M6(JYy>EAsqmivRj|=rBo|O
z|7j*bWY%=*@#Y$3gMzMd<5>>HJ=s-1Tsa2(8U9C-2ZzFQnA-rs<Qwu~;vMCL56>!7
z3;BONXy!bhTylplv+Ctgpu)m8zcHX4_L@D|%LO{YsR-Cc7gO9DKAT4xRf!4cv6`Zo
za{Iy*n|wZ+)?VJ(y69E(_b{c8Xo{*9^-Zk%g>c5#<4GVHl+8H&-`rJc&}`dAnKaWV
zmM*}6cE7^Uv@WZ`Q|!FysLAuE2-G*+zDbL#*Pk4W>o8nbMQjd`dwB^`NAZQ{i|HQt
z=~cnFy~XA9yub`bD(F-f;Kx$w!MM<sxLmbJK?+9J<dJf=GPnm*cX3<|{LvGrkw`=8
z0_v0EL@3LH`W^!tTwz9~G>JOc+$2ujD5wL%%#b(UgAlAP#n1O^gFzmh*q9hD1$cY)
z@Kaq4s^9X&jyc7DxTOMqtmB}KufE9mh#2H5WZ5IXFpc*QS3x%a#22mSf<7DLfp86`
z@V21)>13>j7P~nHyX|X{GzI4`iT1M^krn{_!wG*z-e%xDj9}`MyE8Q>+9G~fPG6Pe
zK$^arh;~n(pL&5-ESbiku1LrK8Gk6GRO@ld`d1)(ZR}CmNI{v*Os!I+a2t-68T+WY
z7+3nw3iUCuYciENc-a7YLoY)?uYT8i<7~=O!R@_uSe?tSFuHJem*Nz6YoW-(DNwAq
zySo;5*P_MUo#O6Z9Ew|!qHQT|-wV6@oPGB9JNLPN-aqcNS;=IQOy0~)=3&W<U(vy`
z2Fg{c@`OTF0^Pj|?7fjTsD#ee1%1w<H2H=4+dv`mV+OxE!8WVDga-bmMt1$Rz<M1#
zw(UxO0@|%$G6BV#B~P*7Z@NopgR>AS@T)8R)k+HUO^`@oB@Qs0$7Te1#r2Z%5B)F{
z+IA^C;!Y`d#tb)=^Ezlq{q5uEg%vSLIrmDar~Fs$xZ!q;lO^C>F)TWrPu8m0CGNq!
z9F6Iv)0TIJAK-W4=2X^mL>?Yf8Z9{!gj-L3Nk5{{IQUtp3+17|5XV#GjA@y@CR_4Z
zl~}1nv?EJ}bUU4gu2FR@>XIO%wqFlrQEdz`Qb5_{84+tR;@&Coz%&nj58cok78xw0
zd^Tt)JZoTS79Yoi65jv#ARkis4%seN=}k93T4&134iMy?yXK1V;pn*?&g5^Q1i0kO
zN+k8~;wy$N`*qYJIG-^CiyXU^dph3ysIo&ip1fY+vz%!3YSY;djERmpLHix8)0Rgy
zDm#{H9X0gfhy6g#`<D)*6vfW1M*}Ek^CJo0OX4-y{Tgii3?S}w-%)m8?wyp&KC-^?
za>s}L9Tw()cB++0hbQC6EXH{THl75#c7^oWYGo5blYU#Kttimw!KqH@-~F~eO-0W)
zSqSlt1s%lh5;IjeD3d1+f!O^+?E_v6|N8?Ta$?;_yD}p*d9F6>cXb;(P&nMB%*!Sz
z!fH$z+SCz3qB8Oew|aQz5ai#WOQd~*L+p`63&R9D@g?v2<V9Jszm|{dRWs{`uRG?k
z^9<1v-&zuAcQE+43t?Y%wM{P&I;_5kzv=S`y*f~jMHOhY{rDczHRJ+6c9W<|jb&Nk
zQ3`z@lld@I0)KFV0qSHk$dlklu+(F>l^>62C-cCfyQS|VOpUTJnoDiI*9VxB+-&SI
zKW}V3Id{ZO&LMZUVcptLTtme3SHRcLgOthQ^f#niQC>p^?xB0Xv%g*zltIiZG`q7d
z>KHG>oq;AmCKKls)KIo2t~#EI(IuRJfv5U|J(O(E5OHpWZ?AmFe$JdxuKowLTYS=Q
zwc5{3b_p%-E>T`zE_>7ZL@&CTu0;v#y-HAO&^%JNRun#2YyL$vqhU}M0I`k8FC~+E
zop1S=7b9a}wZEJNnf?>b*XaANPwy)TOi>w950K4!YSj;vwxYv%=<iMF#2-|z9_fFM
zT#69}lC!fcT<^nOd$?YOw!aq)@Xvw14vW+vn!zOdp-W*hsPRE`8go%Rb=u}|^OPg`
zwWJ-?36()1{7LACUp|C^Avn8rz^@)Mq`n|;z%Lg1=HkOj?mDtX-jKJ!SJ0gP8ou(N
z-9!ebqQWOol%d53A6DXz(+Tg#Jm``WKnJ`s`Z3IbV`t5DdFK~kE>P~JmF2EK&wo`0
zSsiiq+M6p5zs1g2>rGEYnL%it4skSw@)rjBU4=>COnBO=+C`*vX5h|ENL4ST!W_#I
z$c+5(3N-fssvtrwyD^wj*Yx9yN~}<_htDMJ6p{riZtO`4hOE0Q#9tw`i%Pv%)yvG2
zv}FQL;yBq5c<SE%YSp;<7XCZlT!k}3B{Q2c1HbQ9=OqtKPZI^q{^^oiDZy^5%EWi<
zRsAY-?}oD}IB}6J{o0Qh^xFq?_;pv9TVyV>RjPEkgk{YFqzh*p%&l3S`XGXL82+Bh
z*Xc*e!eymmCGm5$@7z+{MADMdJ$L4MIKK+AGla`9mySd8|4RN=!ueAd`Tgs)nynq}
zduQ_xS!djM+cZm;r31pCe(n@o1%#iPOQl(q`EjC<9XLak1=PoIsk!+{iMA?Qc?lqo
za&y!z0l}L}22b3a=%|YWJT+Wq*iO4V4&bt8%Qq91Jsc>3P84`Nj&B7zl}vhbOXjud
zrH*A(lZvoDP>2k8h#?A9>S8grG`ZZns292MPR@UOVQmpam9+?&r_t+u-MsBniiq_4
zaf1yG*l^jSB}W#ze#Qvvw=aE-vi|mI>EN<Uw4b-s(ox87X<m9cLfsuw$$^#_Rb<*?
z$9_5}iov|ra3GA{x?vNh>4utEGWi|wNxQB2i>56w!uV{;Dp?cpR+O5bj>1;8YSgPV
z(vb?6l4@7C!PIKcNx=vwS*LGW%|<J$bzKiK7k8K}hKF6O=5ba0LfXyEDyCowJe=dl
z!WKjW>Y2(ts<QnD65EdV=(RN#Un9m8#ySEnxO($kTBlmR>|b2Lp6}W_A1$IH81-6-
z6e4M+8JE?|3+74molc0}+%&#~oS!}NekgC4XCze6$Q-V`!XFf0Z_PhG!+>}_kX=n^
z6qobG9+meV@--<Y_<gWUvHHwF<Cl=;pEaBOMJ^-P%vc8+@>tTIwAr4W`#OOYnZ_J&
z54GOWTcSGmQCOGBZ`foyY$#y9<|%hI+l^1-hDVW-8$qvsXGX+@mCC;7Uu>2nR61pT
z6A`^S>F&?i2E5_4srDN70=gfgI^z>k>TSA9uyv`#X(}36&(<TLLawp@ooo-=LkCye
z{I$2}SGy_f7+JZy%mj^7IrOj(%AK0guRN8!DMzEC9|!1d-Si0xz8Ng)uxhDukY9G4
zqX5TYb7D-%(_GNa9wd6HZJ`_X-y`JD6^~`JajX|U>`A9vW+-x1hVpw+><IQSdcc`v
z_DBYBd{pRH>o7KmpWcf7{;qf=LH<0xOu#CUIAcOj=+ZC!#axe_DdsthfA5F3RKjGf
zK$OoMXb$7m?z?z!rKn%fDIVUNvTgCH!XgoxD&MMh*ue3uPtqeq*!IpD_FLr?r~6|_
zg<E>lav#)RZeM(?%h+zCWMi7rfH1POIIEzLqHxkR9*~7G-iS`<tHlSe4kJo{X1%fD
zdM;=d-lJO)iSR>miJ0xd_v{z`OhJQV?;20F?o0HMft#w0WKi_wd$7b%q+8t<>Sf?S
z)1Ie1B%}=uTG4$`x9GMhGTw@coX@lspKR(&Tkj?)1m&Lz@2@AsCT=U~N2)lexD+tM
z;3d&XqRM;xO5NdeGnPz)%zKXhm-&#M{w*`s-o5EBGsaX4BvFmHa1nG;Pam8nzkuZq
zecxr@)yy;@&6Lbsh`!diJ<Ht=TK|+k>79a2q=EIoxF8%-`^(~Da_x#WazR_U;aA;R
zrQOHyo|gNj@$b4p2(pP+q047DCdO|zttc#hJCRpSi*WJpZcB2#+U{x%pnS}YN7<as
z+qidc+yV>o*0V%Y7lj6Q>+B=Fb7Q%*)T5t+!;8l;fbhS<&0Se{R~zi$d*3d4+_~Za
zuJzYVp>W2Ny)n?65eXo%NaLO^A%n_RIVMsB4*P+a$&_61Fq>`<{W+rI`%)iGEkIR;
zDL>=zS9rG9+<xI$l`A#9CM)q76c|&>O5Y`8OniT+!YEiAXC)-ohqnhxqZ-3uGxn$#
z-81O0igarEQPj3yJu8GtScK?o16~20K?cg3efw&#rL!5zTtp^bIuQl_?!bZsirm{c
ztiZz8^fGgdqQ#N4p7T)Q@O=Edmc_f~Qgz`g_g%f=R+y{cfxy>J+n4Ujwt<&A{KPc8
zh%@MT=~<^%z7BZz4v7=qU}mOzJG|P*A)Sf2>W}dmt5-?ZSn%sNR>QliA+DrxEVJM`
z%&RR<u8OQ{hcork?5&}@%iP!OX>$rLx5U{AYaBJO4W1?)f!97$niFy<n?YD&q<sf>
z?#}MHUGc_lpQP?QnYI&ueyE)PdMdXa^oqfRAa?yT?L9Hr_*<HlETIfU)mdZ`?c)#g
zL9;a9os+^Nmo$M|XHg2qgLof($H<t&UFEk{L$Mmz8RgRQWs|i(Z`gU4i<jkz)>tML
zLb+<M&+6s_M1uJ}es?1xwV|6Z6q3%1^H4NHF>HQfRm~aYYWd7Z<8Xr_xe>ro2hwxi
zAPhc)ZJ(#OU=K;?*xW3{r1F153_Cie{CFHu60ON<^h>NJCGfWcgD~g!$j*REc_jD;
zIL8i1O5T)IH)W)eUlLX4tFZA(7JZeK4TOBbj}eB}Y9rM@v7`z6RH;IL*=4iy7N-9Y
z+3jnjuw0ayzCTW^?frOO!MNW%)*2&FB+LyNv`kX?;2?RHB`~u6_S$l#XGoW?<EC@D
zdeIqb;6*0ZyQDO#X=)=ogZ!2HGJN9mF27j!*HUu@N3gFhX^?Jp?+k~%BtP(nDXU1H
z8!Z_kIAJGm5au*?zLH@IPn1VY^oee|8Boq~?Jy6dbP?BGZ}-5Ay^0CwJ)e;)ZIW|x
z)+~jxc}?ChEZN;kh96Whut6^c7C%3LN0*lDk$FH<!--wA&==%DS70UrAD6Mb$e=IM
z2!0_a6c?Yr_ij?zT1V}7jXg~Kd%PQ^J4QsQnyowM1@j8JU)k>Nysy9%(W7j#d=@NK
zn#W9Z{PokP(D?&xUAkUfnDq!3hk`-i5mz?*)vh?v>Iqm4`ZqsSd%~l~y5A15$<S<*
zNYR&^brh6!vK&AJ8M{`w-SYMD*op;oGjbQs1+`z@*4RgkGQker9D$DnJ_;sCxotzA
z@X#Ufe_eLEPa*x(iJ8~oJ&0<|z{zFzix~o0gh7=hh|yX4N~m>Ok8)eWV0NeKD<svR
zn4!ry-H9b}m?{Lvr#c9O?^B=vC;lv5iDYMjbu<wTxI}vUc*)8Pwq|u+hRH3fX^@N;
z)t4Bo1<o&@u{Kv)vNMqC+B2!mIWDFj;!^H}4Q+|z_%={r=cY&+m=jyUg1e*fDwhpJ
zv)nEq9&C$vehxESsI2kcEcd0f{jR!D%fty+#`8HLB9Ak!OS4ncN2x&wmTFOng|Q%}
z(<>iS{*nvho6)ljFv|ybQ^G>F#zT~waO_87uO_p4H`}4S1#-EjA5yz~Xl<TCFYKDf
z!}}QFx4s_J3K-LDqDQ^JFpH^ut#iAvYIP&TiM~y3Xy#%q!Yz2Got!q5S=bQyO6LA{
zIPb10VW4NRgMZ7Aw=o#{KzW@5&6IX2YPjort?i~tm&5~KPl|r9Z>3o;X92@X^&=52
z#G70f_R+3EL>;A?4}SfT)XTV>QEagMJ}xpJqgan=F>`kc{8oT7k)-^O9_Qj~`Zv!r
zRc4HFX7^ppq9o<l1=7@Cg)er1OB;m11eGO{QdhkwoAgNP)ZUqiU?-$u`Hi=v6}la7
zPY2+~Hn=@scbf(ZVuI|$?vl?aDJ$Zl?-O<Vg7mpR?yrfe;ct-!DE-Des!Xf7P1jV@
zVr|N-y)fztemJX5FRnp>m1akt<<{_UepAF?<%KsJCLUvVUN5HkNi6g%ED(kp?!?dQ
zq}#UwF0~5BGpyLoZ{>)R5(%FqP6&$1^Ww)($~Y*d;!+QG$*G+Szd%;Y?wX&PeIXsk
z_BR>_osM!rJZMfC(|F9%QWGojoY6ij>NM~nSFsgX$g2*FG5U8bM~_Zlob*M#zW76*
zPD>p5jEuiu#)d_xfO(Pb=po;%Fg~_nvFwyREo6<eR3l6O-iN~X{xf40cOn~?Q3o5M
zn%V7Q9qAo;OY0lPBw4@CF)q}l_mH_;T?-WtCeAz3?ioVKufD$p8K#;ID|`F3B9v;P
zv2KrYvzc`iQ4JlBh!Nar@ueFsR;^lvSvf^~)0qt}Dv1`lKumz&BO8ItsI2hVM6V}j
z`*aW;1M(5$csC7A5xTtN#Q{5aVse)E;Z<%r{%uZ`M7EJ2u3`}SRq1JON9-ad7-_$t
z!R{R%{Lcue3$N{(E-!(f4dE7hL)y6(jF>klvIZ9Hsf7Xl<SDG{ozcNYw}TS7A8~G2
zi~6hC>NKFIa5NO&#tGtQ8GT0yzt6uFn|Py;{Ep;BGJ4DDWVBEt!yA@MhY<2Es<9lU
zEMMO~vk{?#JsG%pIJAp%47Cr^zIoDNQu?E3oDztWCR5csTTY5tS}#`C%iLER(f8a^
zS{(>}j$8T_PwA7#ZylYa77D1{errYTo7fhzZ_{d>jacJUwUb)h#Eg}iBJlR#O!_*R
z{P-$RO@z;Z{A>EqhxVJt?UX9nC8I2l6w*yzQ;M#y%D_G7H#~>niCKpN<1IGjM8<)}
zfwHT-_IvZVkuSHOZxOgqzSHizz(vo<YrM@)rhNLAU*ZQc28;qWat&93pJ$xv*PJKL
zdLi-@3Fe#$#SVu$%%0K;&J?i~%KE=Oz-_OaqcFM{{mD|_?`)lLa}Rlr#q@ad;4{#_
zqbP|~<?JSMI~g3E-;JB1|3#Y=-({Mba>t2_9&{$?(djJ7QNLCqEd=48jS(SKA3Sw|
z9klyp0jKAi)yZzwqzFOD{iSSjuP|TLprZqh8{ua2OqLv>ZS&n}$d5`zvU7)_2VT>Q
z#LABqYPco=0i^}iN79e4zYKT1c_eVn>8PSzvQ#xU%An2Sfw8jp&}FS#v#x}!(R$xc
z?`=U|jE)%@hq-1<i)U^J#ZJB(ZKA~@i^f6)QU94Ptgs&}5m=lsFf2RJQjAk=F7nMw
z<s_<#Od%IT^GBj+KBrfDBgU_KgJMm)1bu=F32hbK&WS!7XMW8ZR<W3y%8al!4G8#n
z=FbGH1gJF5#60?2WSU>v-$kp0jX-F^GmMgAj<V4DiHEi8V<V(2N@4NzF<ckTI&^h>
z9qJ_4Wsp{xiBxbpH&d4W!7Y~shr8D2QAlG&NKZ>Ei?Kd4sZ27WjfCwypILKx^OgOP
zL&5*;IL0kjG$ZbVlr;Z-mxfVz{*Pt-j?!tOilO1eR(U_S;lgX{QxS@Ljwl<7_DKvb
zMUGt}>zyRDfW~8+tJhwP>dS<Mc1nFrD0n7I4D6129JTsa?Nc|UCnN6As2GH&7}$$+
z!JM5D8ZW!)W)#ScEB7GzXI2zri<6<WnD&-O(i}Frw=R32n;)Ph6prA3f=DH4wm2YJ
zOSz=kVK>WAK7-ZvG*@x<>ltMS^)bAv&Dlvpu)n@dMT?`S^Sdl+x6n4#EP{tWgmKJT
zX1C}%HvY`BV*NQMJmKT@cbA8B{jhSgUACdaVJTtwXmxswms%h*&Cdfk3Y2GSsr+Wu
z&IzIrWYbnfz^YFsI5PgS>ZU?mG4*iCg?fdT{!$7!88j@esK;fXPQl(%i54kJiRCu(
zf%1L|ntM$+vbUL+HH2gbZ@BwMnq*3>ebxe^nsETj@h=@B`l5@}@S}w{e!l_})0nB7
zaS)e=hJT<8lj$}?j0ML@OiNwI&w?02g<mcGdbkF2OiRtA>aA_d*a!D-D*0G0iNk6r
zZZF^oMB>;RL}^I|w-rFRA*!ghf2q~-()MZfJ<A$=W5hNzpH&7~?2bXz6@o27M*;n)
zT>yPVS#+5YMs@ftRv<?~t4u>5<_$AzbAeecEsrHO^TI@&sCXhudRkW7)B=UA*;l7d
zL0o1QQu}1hVe7UkYRK2~3S!uDkxOx@#0n-97w<L<=!&A!Q;g1hKt~qNSwkJomP2$!
z7UU5o*8KJ+%e%^!3`L=fNQ@=}xs;GgcAt%v11R$y-->4Q$FtmK?<}|FH6Re~j84?-
zc+u%%aX{=R+~I<n$Y1l}cs3r~e{KGTU%ap1gs<RMrQo;xJB^;qkYMFUa<x}@N0(TY
zJua1<RR;}Ok*XTAnYfRJO2u@cyv}LgLGf16YvdE|W?1FI@+ei1rG3jH0#)`+S)|_R
zm%ZR=Ph4xJp4Eph{I2>sG3_~d+(nja2W91D0bTo5fz0BcHV_R2v7_*Y4Fc4iF0p%(
z{m9;X*`b`?@xPdqJ@FBbYwJT3%n;$o^R;2}=5thb3R^`HOv6?Jj&bd#NAT-Y517oi
zp#H(h0U}058s7@NV$HU#(L7Rs7%A^`8#_yZXCWJXC)RwXf<%s&9|!Ah!&qw=$xUWE
zEs=qnwjeD0Iyc>9BiCRd)Hk~spI3kAbiXe2qiNV@A>DV1-gv2d`Q4wrB5U0h*;(qT
z!CWzdd3I`4IvU5VC+}$t8R~$;Xl8=i2&mJdL%^_@M-I7kuimU89gdD_y@O|nSP8_Y
z`c--rw$*0H7QI&^KQxp*#;%g0SFPvMYj(_{MVzx@7A~xb;Bc-UL7hu3$>edMW+;9j
zw7RQ3stNpHQTdyg7EWv%tu&n0p^=60gzelleoU1`CD^aG<!2d8!;TdSbVF-Y9-}S%
zn({YuBxD{fk*pbS80>Wo4^CdLO#eC}+ua3S$`4zwO0;x%NsdWkS%Y}`2VNA^e#1Mp
zQ4S6>5i}fJ>sPuS$LboCw-Gz08>V*|_t<B$3Y=1nAw+>`i0DKNrbV-yesPnhf6hK`
zVmDddQUu=N-_F4l`b3fF7e0ROcbwhjA#2x>dpkyGO}hX+q^G<JUM1JvidTN)M`+W?
zVagheq(DxMYyT4KyqHTdBV(Nh@d3fH1#dv0jR4fHwK;N8mz#S1=`x$3>Ail<IRje3
zkZ+xBR<ewzAtF<6jnOA}eCf}SBON_BzIPtVnX|LUoyRJ4j+^Q4jNZ)UAB$ZdN$M(`
zmU?iNfZa)>xCf-xw;@H>V7{|e42ARlPzyT1Ke^)`L)tDSIK?|uHk6sj)E863yDZT|
zNmG^jnIb0qs;TOBg(A(G(4j$}$O^+w>g9nkle)^$c1kT(-$UrsMVG6vQT&zQ?+@rB
zM~a#aud!59w(afMTN5p(zS6fB&K5wKgOb-P^T8$!mM^A~2iqF7UYs3&^SJ&NxH+f3
z@8pIQyXELBHFPn%cxR(}*5qfy|3TEly<1vt*m12BDaGK+37egHuVQsyF^p%y?RuS$
zpRDrueDlI2dz{_^+X1RNKPnPl!44b8&}I)toK6Go3wSt8%a=b@22YP0XGK4)5t5`b
zW>LfQTnVb4`@8U=z?iF3ruX=Lm`h3<bowlM-St2`?{v#GZ(#{iqc_aX(kq4INDJ1E
zHNY=^=_=c9GXLtu{ng~n1DE+15Z3WI80#k&EE`;<%TIP5Q`VUTgQO|<2S}=bQ}2D^
z8bVLY+*ymW7wue`;W{6piq3@M>#^Jwcp<LoO{#g*j(#Etl?NlE=UbrM7bYCG{MbD{
z74IJ`eXwrl`9R})4;@%sRpYo(br>mNp>(kz@nbS>?=q?LHp-StR^2&9yku%4IsNDp
znXBobPX+ialNZ$DZ}!nG!j+DQ7j|WUOggYgLcNP$3EWS85ldXeCxCuA+7r?&oo%n&
z0mZOIMoL&|ViXZJD^gENk_7j;;DnIzNc4zObdXRWIbK1<6u0v@T#pZtovr?DC!d2T
z*PI+jp82gE6AW-QHuP)S@Ez^;jo9)0ZAX*rX!K}a*9%w^F+q~<^I&9HqbivYD_VZ(
z6sFrw$O-S9H*v#xNIE3zpAMVMUZ|seB+>l=_ERHWpK!lVz^o2eLtYp*S4<~DD%*)3
zm8f``U#1kaS-4foSfFDq$0?56&sn4jfq#!2D?_B_Z&5zQZjZzoy?YJ?x0eYH$(TSO
zV%Ie~-pnWp|9wu+{HrkGCvXj_hD;OX7!G!>%7#2@k&n1wbk^G;Wbk!J1(O?UI(=Ht
zt;rCp$NQwASW7!4qp^;lk=uYS<L_1!%=8Yv?gnP~MR9n0-K>-75)p7Fb*-4eWKz8d
zm4>`!b(56(<vuSvF{-9_eF?;tr&O7JLTMDkwnC}fSW;cp<MFjcc5pv2pJ1ks=~s?n
z>I<4kC`Fpr^bq=FwK&7a!YcRen61-11n)O~Kciz%lCv>7$r+5oe+RX1_igR|%73yw
z=4(6dSQY)v*P1MWoT995N1M;fC;AQ%U9r5&SeS5~bxQPpb=cfRgl9Z>13J_zhda?P
z=yNsULd+fJo%!j@UD7OarSMOq668b^;nF5V2M}f_s2zq8as+GzE0*y^IHtl=dcM|5
z$}jv*YR?_sWA(x|O}WW(@*-?ub&Z&(jU8iBO4XKnhfQcy!ToY_pVtf4izzn5T++LW
z2>FD~JWHud#Z=8AP0kSZB`rh$MpTstD(BDX3#Ann&9>l2{Zdh9&XQqkMfr|-qrUyO
zmFBY2svbE>H*x{<u<P>=$!bZp8nVz=NCS)XDq*9^^B4Ox;m3A8CddgBkbPeD&X@{e
zy}}04xp`U3UlW21_%7%s4UueaE(zD7*30G><;WOGDLCk2yb1T1(EG-tOMVxB6J8((
zm)KaL{-&7ghUX#p0v~nq`DarzeeDz$1SvGwNp)Zg64ssKb4Q`=%8TjJFAh*@uJ39?
z?nyM-QXjw1!)^=|s1g`%Wjd38Y&Wqei=MuW<IxNoP1*=X$RLRZKI^42K~}mv@6LvW
zIlg;e617}4q1GbzzCDFl7u)Q8N)MO1b!A6pU#mEjY&FS2Cj~aq_>LY#M|diRytFUY
z4LvjD0@YhK>1N3HYlfx`$eskt<JYVXxZ6RMrF?|_<3*2taldcVyjt=C#SJIu;LmAB
zPAd&aMLm_`Z*@Zu%J_9Bv+T-Y>IFRaXbT8sAjRY&?$jB-fAyx@G*2$+rghnXR5%o;
z*Nu)zJ-IIL>^hjk^>(MNI#y!YkTQGOMjxzNl&&tpshil_$ZTN|2DuTmVACkzKf4r{
zQxyXVypQH7Wjay6OSYqHYL|4cl!hE@n6YsEYqjCQAcd4I>hLYC9-$XuRc8gl?TTEW
z9<1u1knYkPWk%b`ExxnF2v^xFM^nNDjqKwl0cX@E)a}TamSiO!D<dk?6E|gTisB2O
zQR!c>B{WQ_8BH2PDwTQPB>jtpd?QI;N)0T76ZnuQ;=Fw|as~S=;<&8r2bR7T@?^%a
z6MxK)R<hslX_|9-WnOiv?X1RqOf0s4P1NaDej80m1@(5(OfQL)JpyGu(C}Ul2Oq9%
zZVVwOMS|$pw<<n{Hn-OOHXq-_&{~Nh(GmsQfYMIA)X4}Tebw0az&A|2k;s#x=2xVm
zBQyH!WTwkVl2PN3l0*b2SFCTMNfjfJw6cKRn0DtJ+jhaqjjiMj^Y6(rq{a+ge%^te
zT-;Y=uC|+c6~<++w|O%{i>duh)oPGU*M7dYWZT~6hTZ+`6~n4;N_QY53Q2?Nz>*#`
z#Z;FUQY4QId4hv>Jr<{VAx3nN@m{+`OTx<2`u>D-gCwcV?8HJOst5K#PBG|$rMUT{
z+{YpYST$57gvR#hWE&yv-=E+z@m4${#<ed}yS(}$@|1&Jgo`J>WgNFyhp4XMvWgSz
z^t~s`Hk_gTJc{|cHp?33^wRz<L%vVeu$i55yk-D_U{w>}%0u_i!oHk!y<(+~4EMUR
zT!dZ6cK`HGs=$lw?h-w=3r2FaWNiNo>bUNV@>{}~I&CRa>h{f`kg%bzy0$`4i-Vr|
znq6JD8ivGSoh;u^47F#RD?JIxrkRRD>!?Wta;VHgpbeADOEYODOZGhFx?Ai_y^dd1
zq?9o7;jSZ*ni-1}B{|JL9KCbq^udl9?@XcZFs?uuG8CH^4`9TF`JtT~xj&p{4l}Xy
zi~a4QYf|qb#DR-QJ}3Kw%3Y$iOt_r!@xz*wH78>s{h)HD)Hogd>1Kb-Ob|gAt5D7A
zx?vv!W`L9jSyE(<bj(My@mueHvHC+TCeymL-+fWAuXlCRZL+Du?@$R)BiY#7^gl=W
z+sXHGE>yww;%aS{i4-2eHhPF`s%TX1Uu2_CM#HxsK>836?WRRE%p%Ag5@O#+y!>Lt
zgG)Sf<M&>WxP=0Ij`R5g>t+zHweBrz5qbScePZg#3xE5}y6D!e!=96Expebryq{lQ
zneL7z2a;WRmU;b7j-6jk#@*rlW}2>0+_uRuM);NB+~V|8f3&fXx+y95p^g0fc8RGh
z8mDqG9j@$m#A3`K!Vh<@l2Fbm{hK3oB2vaB@^4C=bQh7#M7Y3RA8M@4=zisVa90>#
zf?dU+V3FG$leBVpun2?ssNepDM>Sr9O(_?G)N>u;u<yvsh3CT@ne$rh;<+<$p1l{*
z7fjUy)s2UK@?8lUr!@QHGLPM<Xq#L5L}j5F<c8a?`>NiE0wvjNY%g`)Z8HY<gY0`9
z6+?IAT}6c#<0|Oa85~PQ2;N}$9rs}ICU1n)9}2k;6BGV$w&;xZ7{8w{c4j#pu^;+k
z`kKw@f>~J4iIVjIJ7Vt`I@&7n$RMJcxg0^3EbA*shn^}$;_>zAPxjXktqqBWu2I$S
z$a|EBhaAj%cY#4ycGZpBaGQvWh<y{?`?eo`BOEh-2>(92rUG}^!e55iG^na2G<{;W
zM|neRRnI0Q)wyT}wjxb~lR=rxyH)SZ-J?MeKo&T0JTk(Hc$Z?hztHPAd50TQl`p6O
zXDuuAISsh=FSeA|lpxD?jNl9oH~JNq?WeS!qAyD+Z^TaZAkX};GLKX{bJe4?N=aT)
z6ujjtA!JPK%GdKIcrConA<pae)%06CdLhF?m1b#ANam+zx!GY#SW{LEk{VMmMa^rN
z{(AnV*1E&Ptn-;;Ni=57n7H-dlnzGSr$tk{=O-V$Wxo4oWO${%#m5_Jw5;&KThF#L
z_2gsIAt#s$z%6W!<p1~z;c_XX;$}UYEMpH_<A|umPqg?xC)RqL^v(dLy(!TprFF_O
z1Frj$idu#UY!N?fK_EHxvzGVM&0cuHfmf}Uw`hT%K_T)o>#lBm^ve2x6Ep9Yb(+<(
z2iVkX?Mz4o+f_#-5xKtAK`J+fU9Fx$K}up5UweXX=d(ZOc2REpjJuc8QZ|BmdU5X(
z=1%J;8gmAv??L?)GlNDBg^zL&+3{!H)XYK5aIARhwbVk227WgB8<D!d@#_6Y*dZDo
zCO)`ADg9o$R3>3aUQT}$4m0-g=Aff7pcd=yxqVYE@r6hsML_yX8kY=&Ns9gPuU3Ri
z@(2e4S?v=ABzGRt-a6f!+g{V?MRm*!<peON>11C%|L?_;Nw{C=XYLsJ=wH(q^GH@G
z#*kK=78JvhH5%VRdzw{8<n5`}T!F~s-OeD$vg=7BU-hpsA&UsRaht_|8%Wl@Oe#<s
zC}p9|VX5$yao}E3uW^{VvD`p1X55BmQ!+_FW>GTX>sG^Qcn~Q0Nzl&3MiQeohr*$r
zmu$r!w*dW+LWp<5xx=l975FAcQN>Gicb`A(^oa6;#xhUeZV*aJ+KqdwcL;AT-5D41
zV|i^G36ytA`t6XH=Szm{R3U53qz_$a2_r8j2n*t-IQKD~cr1D<bw)lqfa&u(7tmN2
z3I$i4oQpX2F<tlb3Cgjkr-YC@tMA$qtqdKm-drs4wn3kAY^9UIe6xL3u9@q%0CwC_
zz+0yBqAqo_a_nW8+YjemH!N8#Pwl3E0sfhmrGkudYS{Q&&_=SXRKupdR0H^ua(Vn%
z*N{_PN-=&^G7@Jht>?)}jW)DIX08M-YK9iow&tviVzv7SDy&&?&k*?G(@+)d@A|l{
ztl;?GK5A=>Qa{a*An!!#%F9Z7Y&di(XxRIF7+j71J&nlWxCpc{Hw~5AA8Tma0{DT5
z)rvAbG#mYVqsCH01Oi<{EC#=7Qr~@?t$x=Dm-_IsUAycH7MC&$WiuglC9*4qPKPOX
za*WdX**Zjd4G*;P$V^N!JPj+f=u3Kp%XQ7Twrl&EFYKj$(jKO98W5KKMrT^X@ych+
zu01~{%iW=1g`qk)L68tX;JF(1D}<KQXO%ZsUR1Rn9t=5*_RVf#WHZ_<Kb}Xbw|cUx
zW_dBX`h_f=uGJ3<6^we#A;z3Z-PM1qnU2Xrn9VU%kz~<p;JgB_%L)%b+K(5trSrWo
zVir%=?^Rc6di{wRtZpY$B2x;oYM<{ha@tbHc#xmR!zS=zHQs&=M`Dx)#hxfmRbg`T
z68CNI;XwS+Hs#}?;B0)ok}*_EO-i58*tI4UoVXdR-plA^V+lQOOz_U3s1#;oLliEA
z^lS5K5s6P#Xon3)%Q-YK5TP%`4(_K9{Cut4@TFa9KRaDA<fgo3q|Nq#bdF=Z)|DoH
zT!7Cio=4QY2j1|8r~s!q@M9rTXg-1<=q(=y-xIY^`+v46Qetg@t$4IGdjo|m55d=7
zogh#XIA1f!B|Kcg(8a_kk2FwU%x&N$P8)iuf79p)^O!MohmpC|fm=L1jd6%}uZlWE
zGe_WwOH+Z08pMrOG}n|t#BbyygE7-;Butlnb3@js{?-(s&+Meubnq1>4SyXW>I-a3
z29QSQ0Jao=9e?P|smD$2U=wheR?Apy$o!igOvogimQ<_mZqxo2H5N&kyHN?URGtaW
zF3r&Ij3$;`vnZpX-&MO_A;~a&A`f7f1VMguh(Ev020^_=b2sQ=yjg|w@y8<mmD<M1
zO4*W~6HE8W*m#xSR-0CI-*14n7g`WjiIFaSxSz=GKrtI#Si)gd1U8QERm^)=EpqjK
zQ5QnpW^{xQ;-Xkxj!s1MEc>%FdH91~7~(gpiQshW6+x7m3i~Rb9Kwr|I{Lv&MBb7t
zF-wyeJMGHZ!jwImBJ2Bh2R}r{qZbCcogTLg(Q!jxI&PVWBXK%?M)3)`e=)F|`=chc
zh;VoC@@>MdmMg9wXRT{YV#_eYjrE1g8;C&R0;eemKxD-|ou&YMRsrhVEEj?z8$Pu|
z;R-+`l7Hg4_Hzowj=|thw0#VfKWF8xF<_Zgu4l4UdsbNU1BU!9I4udE<=Fzk^8Ugp
zF7iB2&v(Lt?QDePK=vd-?wiaXBo}hE`(+;Es9!W5{C>61vVTYU-qFUBkV(s3dIg0+
zi>>EcAF@zEmzL?*po1Palg0LuV#0YPk~v8>RhqeFnu=;!{#~-XW`Z$C*s*BzGIX7=
z$HK6H>PX0x7#T-^`gI#swR2PVT{Sb)j*9Zx)M&ZgHU6R-W5gO_x+K)$R4xyO&*NCf
zcey=6IZJmH<yQrc%DGgE66Gr4zO>4_5T8M){tsWXkS{ZWh#*3;4|&v?gVKNA|7`UX
zn7oxL=+qP#@(do!SZCIkHR58CO4u!4$>XpKo=K{oSEHr~nPotZT|JG^{G7p~m)ICT
z=l*!E<fxMSzKt1nQy;d#JPU~$4$7<)VidbypT~l%#&N_HWswV&`vC7P<qj(r4f)1E
zU#u@|BrqOa;H=MLIKV+6K=6J2cnV-=qOxH%_DHUfyFit|`4Ye|$-0ld7EHFk8vljU
zB?JN?n87yzigXZJGfu*!&k}&p-~TZuf3ViTh=iKKoco|Zu?g$}VJ3*Ixj&;0pPy41
z2*S0{vz2^m79x?U{-dqtru9TY^#BT9;It*+po-^FhR`7jZ9MI8|1_26)n{g@31&Lo
z^J1<KNCiG$#!1SQc6ic44ZR=oVM2q5!!>?S$(eXy#BZ~?mIZ^zEOG7Yzg>?ytG7Z)
zpQRY%9?9#wuf)&tZspO{UiLEjEwfXyl_}d^t0TA8Rf4yA9Ab(6BH+LqaMqO=2IF&F
z;EJJg6kCM;xCwHEeNE=5vo#F=kn*Yc;+U8JCS6g!T&GhS6D|8m2I4!Q&km7^_a{8?
zp?_-vr*JsF2za@$0TJ70>Tqp7$4|g!jC%9jOu7MRF+gMz{JlE<jwoOe^V2)|T1;PT
zi2%uBr0nNT$TtD;6>usE5GCDb0|cuh46Hx8$XrX#$0v^EX=v68DA|%}Hb5Yp60|O~
zW&a~_31Tvaft{xMkw*On<TZb|{Bjw^)_4%p)$y>sXadC2(*6$4(41>r=odjgw%}Y;
zdVij|-L_7qN>r3E>&1R|0)v6`!E{eNNBrA)sI{!w^aQFSWCd(Q3y;wVLJDpE#bt)!
zker2eOBfkGe34(=v-*2iDkPq}(D~9z<KG|zNMTktY921PDWH#b8gKMnV!DUK%gp4k
zR#m?xOF>)Ck(luda!EBDgcgIC0lz`C;LJB-IDZWSi0JUu-*H6bj*no1NF>0zeda*R
z0<z=~nVNsk#}^(#e~TjZd2&C~@E-snYKTnj{}A8s53vlriLbAo1z+j`g0H}-!a!tc
zo;b{~xmiRZMIatK+30L~Q4k1m?yQ`Lqh9jp3iuH-tt*%5kE7qcsZXNNzzhbx1ZV2~
zm)HLoMNgYNi^?z^-{)Qk;{ZuUh|H|Neg21Fge8+6L~5(#(i@0qAmcr^@NWDi@An_v
z|4;I=z$ri=MsR8{@Dv!&%jn4t`-hkLW|G0rHuIHzAJCRsnMeT3P#|PAK%Nqung5?W
zcQ``$^?Z{92wEEu147;VAKZrcO9Tq!4*pB1|3CQpUqUg!lYywfsY9IkJz;@@e;)I%
zhkbetlRKw<VzTA@Wo+;N(U>m?1b=63YwH3CTUoo983Fho1!^AzLNWtE0Nckuxc{>P
zH2jZ75J>2svi~;?I0@6?<e+Z}G-)|mKKBXm{;T}42K4*y@~?jWQ@=2P4&>ysB9*a`
zlOsS88(TR#{V@etc(M!qx6jy44#vQRsUT!SGkrS%Ljt~0SR0w^12mbn(ZA!t4zNFh
zl=}b#Bxf@tD<FsdRb0%CjQ^&eunJJOmDIN}vNC>>fgZOuw|VLa+r|3X=szEY%IL2)
zVxzyDdD4GsM|O6wBKwPmj&gJ|umb23M<>U>2kA-XlfH`~8-Sn6KW#oUV4gxD36M|l
zRQ@lCzu5nH#eW1QJ%|IaDgt2yB7NKh5t;(Hd{IaqrWN9OXL@>pBKsLYpa%hhH9Oe+
zI8+U&pxfy?K1J}UizmQ$bb5|HKt9){o`VYn0C<3>QF$tVWFaLD|65k#FFr6r&+UkR
z@Za^P>XRNYQ2&2B5C{0DH~_);J07rq;_|=M|BmCo_5SAnTmS#-@&6zG5(9I~@F@U5
z`7^gbz`T2+AzlG(?$0fMy#RcS1%Pw|fC~UV0A2#{w3w*=041;nI{^C0##7r{U?F=0
zSRH^U0DyUn_cUKS0gwhD80ZJsT0!OjhyWl20>M7X6#($GczJ>PZva2}@zkdZARi83
zWdMLo4tfpPR{(H20DvsaQ|18rcrgu(FTkU022P0e1$3VJ8Uy|&m;&e;fEEVuI{*Xv
zASM8wp1}_QApn3~9K-^^1^|ozPy;{*z#9PQ0bu<H0NeI+`;!dq9~xM%hPD9xRGwlQ
z1o#5?uk8Ii*`6i-Ohn*0{?536*nhPDyY`p0f7FHkK?CIflD+@feewhZ;q$*|>ZhIS
zzkFc*XQp;CcKaW`DLETBnLAk-|97&6p!t)mWlaA{*7&9X<JmnSU(nOPKZWtx*0V2v
zvjF_By3k)u|1Xj}sOnFWm;P6h=lh4xPuBm{!*d7!%|kJ9(l-EPo;m+c!vOO+EdOb#
zJSjZEQ;Pn3sXR^1KfM1j4W6b=ud|VpK7ci>jh`_<g2?|FYG8OA^zH1Prv85wCiA~`
zW9kwo+oyT;!btyF`Kc3-jJ}Hr*DGdrPG&aNryleT&Frk6TY$>n7$o8BXzV~{sBc4N
s=wPhxWK5<{W@GG1rf+Cy>ulphW@|&{Xzb){M`ovQYE1TT*?&m>AB4z1P5=M^


From abf5e435fe4e18b86521a58a9f763d221501cf07 Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Thu, 5 Jan 2023 14:48:12 +0100
Subject: [PATCH 398/803] move to utility function

---
 src/pages/EditMonitor.vue | 15 +++------------
 src/util.ts               | 11 +++++++++++
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 13e0be54..124c9660 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -575,7 +575,7 @@ import NotificationDialog from "../components/NotificationDialog.vue";
 import DockerHostDialog from "../components/DockerHostDialog.vue";
 import ProxyDialog from "../components/ProxyDialog.vue";
 import TagsManager from "../components/TagsManager.vue";
-import { genSecret, isDev, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND } from "../util.ts";
+import { genSecret, isDev, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND, hostNameRegexPattern } from "../util.ts";
 
 const toast = useToast();
 
@@ -590,15 +590,6 @@ export default {
     },
 
     data() {
-        // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
-        const ipRegexPattern = "((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))";
-        const hostnameRegexPattern = "^([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$";
-
-        // Modified to accept mqtt, mqtts, ws and wss protocols accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
-        const mqttSchemePartialRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
-        const mqttIpRegexPattern = `((^\\s*${mqttSchemePartialRegexPattern}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))`;
-        const mqttHostNameRegexPattern = `^${mqttSchemePartialRegexPattern}([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$`;
-
         return {
             minInterval: MIN_INTERVAL_SECOND,
             maxInterval: MAX_INTERVAL_SECOND,
@@ -609,8 +600,8 @@ export default {
             },
             acceptedStatusCodeOptions: [],
             dnsresolvetypeOptions: [],
-            ipOrHostnameRegexPattern: `${ipRegexPattern}|${hostnameRegexPattern}`,
-            mqttIpOrHostnameRegexPattern: `${mqttIpRegexPattern}|${mqttHostNameRegexPattern}`
+            ipOrHostnameRegexPattern: hostNameRegexPattern(),
+            mqttIpOrHostnameRegexPattern: hostNameRegexPattern(true)
         };
     },
 
diff --git a/src/util.ts b/src/util.ts
index 99038c8d..4b8f1624 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -427,3 +427,14 @@ export function utcToLocal(input : string, format = SQL_DATETIME_FORMAT) {
 export function localToUTC(input : string, format = SQL_DATETIME_FORMAT) {
     return dayjs(input).utc().format(format);
 }
+
+export function hostNameRegexPattern(mqtt = false) {
+    // mqtt, mqtts, ws and wss schemes accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
+    const mqttSchemeRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
+    // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
+    const ipRegexPattern = `((^\\s*${mqtt ? mqttSchemeRegexPattern : ""}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))`;
+    // Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
+    const hostNameRegexPattern = `^${mqtt ? mqttSchemeRegexPattern : ""}([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$`;
+
+    return `${ipRegexPattern}|${hostNameRegexPattern}`;
+}
\ No newline at end of file

From 40ebc2df792ec23dc64098eb0f7e94e9d887cf96 Mon Sep 17 00:00:00 2001
From: long2ice <long2ice@gmail.com>
Date: Thu, 5 Jan 2023 22:58:24 +0800
Subject: [PATCH 399/803] feat: support redis monitor

---
 db/patch-redis-monitor.sql |   6 ++
 package-lock.json          | 153 +++++++++++++++++++++++++++++++++++++
 package.json               |   1 +
 server/database.js         |   1 +
 server/model/monitor.js    |  11 ++-
 server/util-server.js      |  14 ++++
 src/pages/EditMonitor.vue  |  11 ++-
 7 files changed, 195 insertions(+), 2 deletions(-)
 create mode 100644 db/patch-redis-monitor.sql

diff --git a/db/patch-redis-monitor.sql b/db/patch-redis-monitor.sql
new file mode 100644
index 00000000..e82f24fe
--- /dev/null
+++ b/db/patch-redis-monitor.sql
@@ -0,0 +1,6 @@
+BEGIN TRANSACTION;
+
+ALTER TABLE monitor
+    ADD redis_connection_string VARCHAR(255);
+
+COMMIT
diff --git a/package-lock.json b/package-lock.json
index 7e88d126..364d9436 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -53,6 +53,7 @@
                 "prometheus-api-metrics": "~3.2.1",
                 "protobufjs": "~7.1.1",
                 "redbean-node": "0.1.4",
+                "redis": "~4.5.1",
                 "socket.io": "~4.5.3",
                 "socket.io-client": "~4.5.3",
                 "socks-proxy-agent": "6.1.1",
@@ -3442,6 +3443,64 @@
             "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
             "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
         },
+        "node_modules/@redis/bloom": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz",
+            "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/client": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz",
+            "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==",
+            "dependencies": {
+                "cluster-key-slot": "1.1.1",
+                "generic-pool": "3.9.0",
+                "yallist": "4.0.0"
+            },
+            "engines": {
+                "node": ">=14"
+            }
+        },
+        "node_modules/@redis/client/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "node_modules/@redis/graph": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
+            "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/json": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+            "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/search": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz",
+            "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/time-series": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
+            "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
         "node_modules/@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -5386,6 +5445,14 @@
                 "node": ">=6"
             }
         },
+        "node_modules/cluster-key-slot": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
+            "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
         "node_modules/co": {
             "version": "4.6.0",
             "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -8304,6 +8371,14 @@
                 "is-property": "^1.0.2"
             }
         },
+        "node_modules/generic-pool": {
+            "version": "3.9.0",
+            "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
+            "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
+            "engines": {
+                "node": ">= 4"
+            }
+        },
         "node_modules/gensync": {
             "version": "1.0.0-beta.2",
             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -14282,6 +14357,19 @@
                 "node": ">=8"
             }
         },
+        "node_modules/redis": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz",
+            "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==",
+            "dependencies": {
+                "@redis/bloom": "1.1.0",
+                "@redis/client": "1.4.2",
+                "@redis/graph": "1.1.0",
+                "@redis/json": "1.0.4",
+                "@redis/search": "1.1.0",
+                "@redis/time-series": "1.0.4"
+            }
+        },
         "node_modules/regenerate": {
             "version": "1.4.2",
             "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -19703,6 +19791,48 @@
             "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
             "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
         },
+        "@redis/bloom": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz",
+            "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ=="
+        },
+        "@redis/client": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz",
+            "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==",
+            "requires": {
+                "cluster-key-slot": "1.1.1",
+                "generic-pool": "3.9.0",
+                "yallist": "4.0.0"
+            },
+            "dependencies": {
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
+            }
+        },
+        "@redis/graph": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
+            "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg=="
+        },
+        "@redis/json": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+            "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw=="
+        },
+        "@redis/search": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz",
+            "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ=="
+        },
+        "@redis/time-series": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
+            "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng=="
+        },
         "@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -21305,6 +21435,11 @@
                 "is-regexp": "^2.0.0"
             }
         },
+        "cluster-key-slot": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
+            "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw=="
+        },
         "co": {
             "version": "4.6.0",
             "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -23422,6 +23557,11 @@
                 "is-property": "^1.0.2"
             }
         },
+        "generic-pool": {
+            "version": "3.9.0",
+            "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
+            "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="
+        },
         "gensync": {
             "version": "1.0.0-beta.2",
             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -27900,6 +28040,19 @@
                 "strip-indent": "^3.0.0"
             }
         },
+        "redis": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz",
+            "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==",
+            "requires": {
+                "@redis/bloom": "1.1.0",
+                "@redis/client": "1.4.2",
+                "@redis/graph": "1.1.0",
+                "@redis/json": "1.0.4",
+                "@redis/search": "1.1.0",
+                "@redis/time-series": "1.0.4"
+            }
+        },
         "regenerate": {
             "version": "1.4.2",
             "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
diff --git a/package.json b/package.json
index ebe305f9..e233af9e 100644
--- a/package.json
+++ b/package.json
@@ -108,6 +108,7 @@
         "prometheus-api-metrics": "~3.2.1",
         "protobufjs": "~7.1.1",
         "redbean-node": "0.1.4",
+        "redis": "~4.5.1",
         "socket.io": "~4.5.3",
         "socket.io-client": "~4.5.3",
         "socks-proxy-agent": "6.1.1",
diff --git a/server/database.js b/server/database.js
index 2544f197..1ab1f441 100644
--- a/server/database.js
+++ b/server/database.js
@@ -66,6 +66,7 @@ class Database {
         "patch-add-radius-monitor.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
         "patch-maintenance-table2.sql": true,
+        "patch-redis-monitor.sql": true,
     };
 
     /**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 9f8c8300..76a18520 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -3,7 +3,9 @@ const dayjs = require("dayjs");
 const axios = require("axios");
 const { Prometheus } = require("../prometheus");
 const { log, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND } = require("../../src/util");
-const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery } = require("../util-server");
+const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery,
+    redisPingAsync
+} = require("../util-server");
 const { R } = require("redbean-node");
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { Notification } = require("../notification");
@@ -120,6 +122,7 @@ class Monitor extends BeanModel {
                 basic_auth_pass: this.basic_auth_pass,
                 pushToken: this.pushToken,
                 databaseConnectionString: this.databaseConnectionString,
+                redisConnectionString: this.redisConnectionString,
                 radiusUsername: this.radiusUsername,
                 radiusPassword: this.radiusPassword,
                 radiusSecret: this.radiusSecret,
@@ -617,6 +620,12 @@ class Monitor extends BeanModel {
                         }
                     }
                     bean.ping = dayjs().valueOf() - startTime;
+                } else if (this.type === "redis") {
+                    let startTime = dayjs().valueOf();
+
+                    bean.msg = await redisPingAsync(this.redisConnectionString);
+                    bean.status = UP;
+                    bean.ping = dayjs().valueOf() - startTime;
                 } else {
                     bean.msg = "Unknown Monitor Type";
                     bean.status = PENDING;
diff --git a/server/util-server.js b/server/util-server.js
index 4a30017a..f3d01b10 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -19,6 +19,7 @@ const { Settings } = require("./settings");
 const grpc = require("@grpc/grpc-js");
 const protojs = require("protobufjs");
 const radiusClient = require("node-radius-client");
+const redis = require("redis");
 const {
     dictionaries: {
         rfc2865: { file, attributes },
@@ -353,6 +354,19 @@ exports.radius = function (
         ],
     });
 };
+/**
+ * Redis server ping
+ * @param {string} dsn The redis connection string
+ */
+exports.redisPingAsync = async function (dsn) {
+    const client = redis.createClient({
+        url: dsn,
+    });
+    await client.connect();
+    const pong = await client.ping();
+    await client.disconnect();
+    return pong;
+};
 
 /**
  * Retrieve value of setting based on key
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index c9d5ad2f..6ae204ba 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -60,6 +60,9 @@
                                         <option value="radius">
                                             Radius
                                         </option>
+                                        <option value="redis">
+                                            Redis
+                                        </option>
                                     </optgroup>
                                 </select>
                             </div>
@@ -267,7 +270,13 @@
                                     <textarea id="sqlQuery" v-model="monitor.databaseQuery" class="form-control" placeholder="Example: select getdate()"></textarea>
                                 </div>
                             </template>
-
+                            <!-- Redis -->
+                            <template v-if="monitor.type === 'redis'">
+                                <div class="my-3">
+                                    <label for="redisConnectionString" class="form-label">{{ $t("Connection String") }}</label>
+                                    <input id="redisConnectionString" v-model="monitor.redisConnectionString" type="text" class="form-control" placeholder="redis://user:password@host:port">
+                                </div>
+                            </template>
                             <!-- Interval -->
                             <div class="my-3">
                                 <label for="interval" class="form-label">{{ $t("Heartbeat Interval") }} ({{ $t("checkEverySecond", [ monitor.interval ]) }})</label>

From fc5ec5f49249b79daf65caafc148cfa1e44683e2 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Thu, 5 Jan 2023 19:24:29 +0000
Subject: [PATCH 400/803] Fixed styling of clear data dropdown

Fixed #2419

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/pages/Details.vue | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 6d6a8dd9..8325caa4 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -473,6 +473,12 @@ table {
 
 .dropdown-clear-data {
     float: right;
+
+    ul {
+        width: 100%;
+        min-width: unset;
+        padding-left: 0;
+    }
 }
 
 .dark {

From c7eb72e73b09ddf7f02f355086cbdbe29ceb66c3 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Thu, 5 Jan 2023 19:57:28 +0000
Subject: [PATCH 401/803] JSDoc for extra/

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 extra/beta/update-version.js  | 13 +++++++++++++
 extra/download-cloudflared.js |  4 ++++
 extra/remove-2fa.js           |  5 +++++
 extra/reset-password.js       |  5 +++++
 extra/simple-dns-server.js    |  5 +++++
 extra/simple-mqtt-server.js   |  1 +
 extra/update-version.js       | 17 +++++++++--------
 extra/update-wiki-version.js  |  8 ++++++++
 8 files changed, 50 insertions(+), 8 deletions(-)

diff --git a/extra/beta/update-version.js b/extra/beta/update-version.js
index df2cb40a..7abac5ef 100644
--- a/extra/beta/update-version.js
+++ b/extra/beta/update-version.js
@@ -32,6 +32,10 @@ if (! exists) {
     process.exit(1);
 }
 
+/**
+ * Commit updated files
+ * @param {string} version Version to update to
+ */
 function commit(version) {
     let msg = "Update to " + version;
 
@@ -47,6 +51,10 @@ function commit(version) {
     console.log(res.stdout.toString().trim());
 }
 
+/**
+ * Create a tag with the specified version
+ * @param {string} version Tag to create
+ */
 function tag(version) {
     let res = childProcess.spawnSync("git", [ "tag", version ]);
     console.log(res.stdout.toString().trim());
@@ -55,6 +63,11 @@ function tag(version) {
     console.log(res.stdout.toString().trim());
 }
 
+/**
+ * Check if a tag exists for the specified version
+ * @param {string} version Version to check
+ * @returns {boolean} Does the tag already exist
+ */
 function tagExists(version) {
     if (! version) {
         throw new Error("invalid version");
diff --git a/extra/download-cloudflared.js b/extra/download-cloudflared.js
index 41519b7c..74b9bad2 100644
--- a/extra/download-cloudflared.js
+++ b/extra/download-cloudflared.js
@@ -25,6 +25,10 @@ if (platform === "linux/amd64") {
 const file = fs.createWriteStream("cloudflared.deb");
 get("https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-" + arch + ".deb");
 
+/**
+ * Download specified file
+ * @param {string} url URL to request
+ */
 function get(url) {
     http.get(url, function (res) {
         if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
diff --git a/extra/remove-2fa.js b/extra/remove-2fa.js
index 0f3f6346..f88c43fc 100644
--- a/extra/remove-2fa.js
+++ b/extra/remove-2fa.js
@@ -43,6 +43,11 @@ const main = async () => {
     console.log("Finished.");
 };
 
+/**
+ * Ask question of user
+ * @param {string} question Question to ask
+ * @returns {Promise<string>} Users response
+ */
 function question(question) {
     return new Promise((resolve) => {
         rl.question(question, (answer) => {
diff --git a/extra/reset-password.js b/extra/reset-password.js
index 8036a456..16898331 100644
--- a/extra/reset-password.js
+++ b/extra/reset-password.js
@@ -53,6 +53,11 @@ const main = async () => {
     console.log("Finished.");
 };
 
+/**
+ * Ask question of user
+ * @param {string} question Question to ask
+ * @returns {Promise<string>} Users response
+ */
 function question(question) {
     return new Promise((resolve) => {
         rl.question(question, (answer) => {
diff --git a/extra/simple-dns-server.js b/extra/simple-dns-server.js
index 376dbdd0..a6946dcb 100644
--- a/extra/simple-dns-server.js
+++ b/extra/simple-dns-server.js
@@ -135,6 +135,11 @@ server.listen({
     udp: 5300
 });
 
+/**
+ * Get human readable request type from request code
+ * @param {number} code Request code to translate
+ * @returns {string} Human readable request type
+ */
 function type(code) {
     for (let name in Packet.TYPE) {
         if (Packet.TYPE[name] === code) {
diff --git a/extra/simple-mqtt-server.js b/extra/simple-mqtt-server.js
index 238d2772..b970a380 100644
--- a/extra/simple-mqtt-server.js
+++ b/extra/simple-mqtt-server.js
@@ -11,6 +11,7 @@ class SimpleMqttServer {
         this.port = port;
     }
 
+    /** Start the MQTT server */
     start() {
         this.server.listen(this.port, () => {
             console.log("server started and listening on port ", this.port);
diff --git a/extra/update-version.js b/extra/update-version.js
index d5c2ee5c..246e1c1c 100644
--- a/extra/update-version.js
+++ b/extra/update-version.js
@@ -36,10 +36,8 @@ if (! exists) {
 }
 
 /**
- * Updates the version number in package.json and commits it to git.
- * @param {string} version - The new version number
- *
- * Generated by Trelent
+ * Commit updated files
+ * @param {string} version Version to update to
  */
 function commit(version) {
     let msg = "Update to " + version;
@@ -53,16 +51,19 @@ function commit(version) {
     }
 }
 
+/**
+ * Create a tag with the specified version
+ * @param {string} version Tag to create
+ */
 function tag(version) {
     let res = childProcess.spawnSync("git", [ "tag", version ]);
     console.log(res.stdout.toString().trim());
 }
 
 /**
- * Checks if a given version is already tagged in the git repository.
- * @param {string} version - The version to check for.
- *
- * Generated by Trelent
+ * Check if a tag exists for the specified version
+ * @param {string} version Version to check
+ * @returns {boolean} Does the tag already exist
  */
 function tagExists(version) {
     if (! version) {
diff --git a/extra/update-wiki-version.js b/extra/update-wiki-version.js
index 65b7e7b0..880bc556 100644
--- a/extra/update-wiki-version.js
+++ b/extra/update-wiki-version.js
@@ -10,6 +10,10 @@ if (!newVersion) {
 
 updateWiki(newVersion);
 
+/**
+ * Update the wiki with new version number
+ * @param {string} newVersion Version to update to
+ */
 function updateWiki(newVersion) {
     const wikiDir = "./tmp/wiki";
     const howToUpdateFilename = "./tmp/wiki/🆙-How-to-Update.md";
@@ -39,6 +43,10 @@ function updateWiki(newVersion) {
     safeDelete(wikiDir);
 }
 
+/**
+ * Check if a directory exists before deleting
+ * @param {string} dir Directory to delete
+ */
 function safeDelete(dir) {
     if (fs.existsSync(dir)) {
         fs.rm(dir, {

From caff9ca736228e833fcab0ecfef8ebb551f9d0ef Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Thu, 5 Jan 2023 22:19:05 +0000
Subject: [PATCH 402/803] Added JSDoc for server/

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/auth.js                              |  6 ++++
 server/cacheable-dns-http-agent.js          |  4 +++
 server/jobs.js                              |  1 +
 server/model/maintenance.js                 | 23 +++++++++++++++
 server/model/maintenance_timeslot.js        |  9 ++++++
 server/model/monitor.js                     |  8 ++++++
 server/notification-providers/serverchan.js |  6 ++++
 server/prometheus.js                        |  1 +
 server/uptime-cache-list.js                 | 18 +++++++++---
 server/uptime-kuma-server.js                | 32 +++++++++++++++++++++
 10 files changed, 104 insertions(+), 4 deletions(-)

diff --git a/server/auth.js b/server/auth.js
index 3ce1a604..fd19b0e4 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -63,6 +63,12 @@ function myAuthorizer(username, password, callback) {
     });
 }
 
+/**
+ * Use basic auth if auth is not disabled
+ * @param {express.Request} req Express request object
+ * @param {express.Response} res Express response object
+ * @param {express.NextFunction} next
+ */
 exports.basicAuth = async function (req, res, next) {
     const middleware = basicAuth({
         authorizer: myAuthorizer,
diff --git a/server/cacheable-dns-http-agent.js b/server/cacheable-dns-http-agent.js
index 30136791..cc067f72 100644
--- a/server/cacheable-dns-http-agent.js
+++ b/server/cacheable-dns-http-agent.js
@@ -37,6 +37,10 @@ class CacheableDnsHttpAgent {
         this.enable = isEnable;
     }
 
+    /**
+     * Attach cacheable to HTTP agent
+     * @param {http.Agent} agent Agent to install
+     */
     static install(agent) {
         this.cacheable.install(agent);
     }
diff --git a/server/jobs.js b/server/jobs.js
index f9c7f86e..66a27606 100644
--- a/server/jobs.js
+++ b/server/jobs.js
@@ -32,6 +32,7 @@ const initBackgroundJobs = function (args) {
     return bree;
 };
 
+/** Stop all background jobs if running */
 const stopBackgroundJobs = function () {
     if (bree) {
         bree.stop();
diff --git a/server/model/maintenance.js b/server/model/maintenance.js
index d9be3427..45db63d1 100644
--- a/server/model/maintenance.js
+++ b/server/model/maintenance.js
@@ -112,6 +112,11 @@ class Maintenance extends BeanModel {
         return this.toPublicJSON(timezone);
     }
 
+    /**
+     * Get a list of weekdays that the maintenance is active for
+     * Monday=1, Tuesday=2 etc.
+     * @returns {number[]} Array of active weekdays
+     */
     getDayOfWeekList() {
         log.debug("timeslot", "List: " + this.weekdays);
         return JSON.parse(this.weekdays).sort(function (a, b) {
@@ -119,12 +124,20 @@ class Maintenance extends BeanModel {
         });
     }
 
+    /**
+     * Get a list of days in month that maintenance is active for
+     * @returns {number[]} Array of active days in month
+     */
     getDayOfMonthList() {
         return JSON.parse(this.days_of_month).sort(function (a, b) {
             return a - b;
         });
     }
 
+    /**
+     * Get the start date and time for maintenance
+     * @returns {dayjs.Dayjs} Start date and time
+     */
     getStartDateTime() {
         let startOfTheDay = dayjs.utc(this.start_date).format("HH:mm");
         log.debug("timeslot", "startOfTheDay: " + startOfTheDay);
@@ -137,6 +150,10 @@ class Maintenance extends BeanModel {
         return dayjs.utc(this.start_date).add(startTimeSecond, "second");
     }
 
+    /**
+     * Get the duraction of maintenance in seconds
+     * @returns {number} Duration of maintenance
+     */
     getDuration() {
         let duration = dayjs.utc(this.end_time, "HH:mm").diff(dayjs.utc(this.start_time, "HH:mm"), "second");
         // Add 24hours if it is across day
@@ -146,6 +163,12 @@ class Maintenance extends BeanModel {
         return duration;
     }
 
+    /**
+     * Convert data from socket to bean
+     * @param {Bean} bean Bean to fill in
+     * @param {Object} obj Data to fill bean with
+     * @returns {Bean} Filled bean
+     */
     static jsonToBean(bean, obj) {
         if (obj.id) {
             bean.id = obj.id;
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index 2babe6bc..77643c2c 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -6,6 +6,11 @@ const { UptimeKumaServer } = require("../uptime-kuma-server");
 
 class MaintenanceTimeslot extends BeanModel {
 
+    /**
+     * Return an object that ready to parse to JSON for public
+     * Only show necessary data to public
+     * @returns {Object}
+     */
     async toPublicJSON() {
         const serverTimezoneOffset = UptimeKumaServer.getInstance().getTimezoneOffset();
 
@@ -21,6 +26,10 @@ class MaintenanceTimeslot extends BeanModel {
         return obj;
     }
 
+    /**
+     * Return an object that ready to parse to JSON
+     * @returns {Object}
+     */
     async toJSON() {
         return await this.toPublicJSON();
     }
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 9f8c8300..e6332b8f 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -748,6 +748,13 @@ class Monitor extends BeanModel {
         }
     }
 
+    /**
+     * Make a request using axios
+     * @param {Object} options Options for Axios
+     * @param {boolean} finalCall Should this be the final call i.e
+     * don't retry on faliure
+     * @returns {Object} Axios response
+     */
     async makeAxiosRequest(options, finalCall = false) {
         try {
             let res;
@@ -1229,6 +1236,7 @@ class Monitor extends BeanModel {
         return maintenance.count !== 0;
     }
 
+    /** Make sure monitor interval is between bounds */
     validate() {
         if (this.interval > MAX_INTERVAL_SECOND) {
             throw new Error(`Interval cannot be more than ${MAX_INTERVAL_SECOND} seconds`);
diff --git a/server/notification-providers/serverchan.js b/server/notification-providers/serverchan.js
index fbf99f80..d631c8e6 100644
--- a/server/notification-providers/serverchan.js
+++ b/server/notification-providers/serverchan.js
@@ -21,6 +21,12 @@ class ServerChan extends NotificationProvider {
         }
     }
 
+    /**
+     * Get the formatted title for message
+     * @param {?Object} monitorJSON Monitor details (For Up/Down only)
+     * @param {?Object} heartbeatJSON Heartbeat details (For Up/Down only)
+     * @returns {string} Formatted title
+     */
     checkStatus(heartbeatJSON, monitorJSON) {
         let title = "UptimeKuma Message";
         if (heartbeatJSON != null && heartbeatJSON["status"] === UP) {
diff --git a/server/prometheus.js b/server/prometheus.js
index 1473ab7a..aeba95f8 100644
--- a/server/prometheus.js
+++ b/server/prometheus.js
@@ -99,6 +99,7 @@ class Prometheus {
         }
     }
 
+    /** Remove monitor from prometheus */
     remove() {
         try {
             monitorCertDaysRemaining.remove(this.monitorLabelValues);
diff --git a/server/uptime-cache-list.js b/server/uptime-cache-list.js
index 1347968f..d88a9cbf 100644
--- a/server/uptime-cache-list.js
+++ b/server/uptime-cache-list.js
@@ -6,10 +6,10 @@ class UptimeCacheList {
     static list = {};
 
     /**
-     *
-     * @param monitorID
-     * @param duration
-     * @return number
+     * Get the uptime for a specific period
+     * @param {number} monitorID
+     * @param {number} duration
+     * @return {number}
      */
     static getUptime(monitorID, duration) {
         if (UptimeCacheList.list[monitorID] && UptimeCacheList.list[monitorID][duration]) {
@@ -20,6 +20,12 @@ class UptimeCacheList {
         }
     }
 
+    /**
+     * Add uptime for specified monitor
+     * @param {number} monitorID
+     * @param {number} duration
+     * @param {number} uptime Uptime to add
+     */
     static addUptime(monitorID, duration, uptime) {
         log.debug("UptimeCacheList", "addUptime: " + monitorID + " " + duration);
         if (!UptimeCacheList.list[monitorID]) {
@@ -28,6 +34,10 @@ class UptimeCacheList {
         UptimeCacheList.list[monitorID][duration] = uptime;
     }
 
+    /**
+     * Clear cache for specified monitor
+     * @param {number} monitorID
+     */
     static clearCache(monitorID) {
         log.debug("UptimeCacheList", "clearCache: " + monitorID);
         delete UptimeCacheList.list[monitorID];
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 06237562..14712176 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -86,6 +86,7 @@ class UptimeKumaServer {
         this.io = new Server(this.httpServer);
     }
 
+    /** Initialise app after the dabase has been set up */
     async initAfterDatabaseReady() {
         await CacheableDnsHttpAgent.update();
 
@@ -98,6 +99,11 @@ class UptimeKumaServer {
         this.generateMaintenanceTimeslotsInterval = setInterval(this.generateMaintenanceTimeslots, 60 * 1000);
     }
 
+    /**
+     * Send list of monitors to client
+     * @param {Socket} socket
+     * @returns {Object} List of monitors
+     */
     async sendMonitorList(socket) {
         let list = await this.getMonitorJSONList(socket.userID);
         this.io.to(socket.userID).emit("monitorList", list);
@@ -134,6 +140,11 @@ class UptimeKumaServer {
         return await this.sendMaintenanceListByUserID(socket.userID);
     }
 
+    /**
+     * Send list of maintenances to user
+     * @param {number} userID
+     * @returns {Object}
+     */
     async sendMaintenanceListByUserID(userID) {
         let list = await this.getMaintenanceJSONList(userID);
         this.io.to(userID).emit("maintenanceList", list);
@@ -185,6 +196,11 @@ class UptimeKumaServer {
         errorLogStream.end();
     }
 
+    /**
+     * Get the IP of the client connected to the socket
+     * @param {Socket} socket
+     * @returns {string}
+     */
     async getClientIP(socket) {
         let clientIP = socket.client.conn.remoteAddress;
 
@@ -203,6 +219,12 @@ class UptimeKumaServer {
         }
     }
 
+    /**
+     * Attempt to get the current server timezone
+     * If this fails, fall back to environment variables and then make a
+     * guess.
+     * @returns {string}
+     */
     async getTimezone() {
         let timezone = await Settings.get("serverTimezone");
         if (timezone) {
@@ -214,16 +236,25 @@ class UptimeKumaServer {
         }
     }
 
+    /**
+     * Get the current offset
+     * @returns {string}
+     */
     getTimezoneOffset() {
         return dayjs().format("Z");
     }
 
+    /**
+     * Set the current server timezone and environment variables
+     * @param {string} timezone
+     */
     async setTimezone(timezone) {
         await Settings.set("serverTimezone", timezone, "general");
         process.env.TZ = timezone;
         dayjs.tz.setDefault(timezone);
     }
 
+    /** Load the timeslots for maintenance */
     async generateMaintenanceTimeslots() {
 
         let list = await R.find("maintenance_timeslot", " generated_next = 0 AND start_date <= DATETIME('now') ");
@@ -237,6 +268,7 @@ class UptimeKumaServer {
 
     }
 
+    /** Stop the server */
     async stop() {
         clearTimeout(this.generateMaintenanceTimeslotsInterval);
     }

From dc8289df12e8c30861a38a15e3a39d277b5c9178 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Thu, 5 Jan 2023 22:55:51 +0000
Subject: [PATCH 403/803] Added JSDoc for src/

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/components/DockerHostDialog.vue       |  8 +++++
 src/components/notifications/Telegram.vue |  7 +++++
 src/components/settings/Security.vue      |  1 +
 src/mixins/datetime.js                    | 10 +++++++
 src/mixins/socket.js                      | 36 +++++++++++++++++++++++
 src/pages/EditMaintenance.vue             | 12 ++++++++
 src/pages/MaintenanceDetails.vue          |  3 ++
 src/pages/ManageMaintenance.vue           | 10 +++++++
 src/util.js                               | 16 ++++++++++
 src/util.ts                               | 17 ++++++++++-
 10 files changed, 119 insertions(+), 1 deletion(-)

diff --git a/src/components/DockerHostDialog.vue b/src/components/DockerHostDialog.vue
index 50ffa49c..fc9aea49 100644
--- a/src/components/DockerHostDialog.vue
+++ b/src/components/DockerHostDialog.vue
@@ -91,11 +91,16 @@ export default {
     },
     methods: {
 
+        /** Confirm deletion of docker host */
         deleteConfirm() {
             this.modal.hide();
             this.$refs.confirmDelete.show();
         },
 
+        /**
+         * Show specified docker host
+         * @param {number} dockerHostID
+         */
         show(dockerHostID) {
             if (dockerHostID) {
                 let found = false;
@@ -126,6 +131,7 @@ export default {
             this.modal.show();
         },
 
+        /** Add docker host */
         submit() {
             this.processing = true;
             this.$root.getSocket().emit("addDockerHost", this.dockerHost, this.id, (res) => {
@@ -144,6 +150,7 @@ export default {
             });
         },
 
+        /** Test the docker host */
         test() {
             this.processing = true;
             this.$root.getSocket().emit("testDockerHost", this.dockerHost, (res) => {
@@ -152,6 +159,7 @@ export default {
             });
         },
 
+        /** Delete this docker host */
         deleteDockerHost() {
             this.processing = true;
             this.$root.getSocket().emit("deleteDockerHost", this.id, (res) => {
diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 9daf31ac..723bd1be 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -42,6 +42,11 @@ export default {
         HiddenInput,
     },
     methods: {
+        /**
+         * Get the URL for telegram updates
+         * @param {string} [mode=masked] Should the token be masked?
+         * @returns {string} formatted URL
+         */
         telegramGetUpdatesURL(mode = "masked") {
             let token = `<${this.$t("YOUR BOT TOKEN HERE")}>`;
 
@@ -55,6 +60,8 @@ export default {
 
             return `https://api.telegram.org/bot${token}/getUpdates`;
         },
+
+        /** Get the telegram chat ID */
         async autoGetTelegramChatID() {
             try {
                 let res = await axios.get(this.telegramGetUpdatesURL("withToken"));
diff --git a/src/components/settings/Security.vue b/src/components/settings/Security.vue
index 330fe9ca..7d13ea90 100644
--- a/src/components/settings/Security.vue
+++ b/src/components/settings/Security.vue
@@ -191,6 +191,7 @@ export default {
             location.reload();
         },
 
+        /** Show confirmation dialog for disable auth */
         confirmDisableAuth() {
             this.$refs.confirmDisableAuth.show();
         },
diff --git a/src/mixins/datetime.js b/src/mixins/datetime.js
index 4fa2fa83..5a282ad0 100644
--- a/src/mixins/datetime.js
+++ b/src/mixins/datetime.js
@@ -12,6 +12,11 @@ export default {
     },
 
     methods: {
+        /**
+         * Convert value to UTC
+         * @param {string | number | Date | dayjs.Dayjs} value
+         * @returns {dayjs.Dayjs}
+         */
         toUTC(value) {
             return dayjs.tz(value, this.timezone).utc().format();
         },
@@ -34,6 +39,11 @@ export default {
             return this.datetimeFormat(value, "YYYY-MM-DD HH:mm:ss");
         },
 
+        /**
+         * Get time for maintenance
+         * @param {string | number | Date | dayjs.Dayjs} value
+         * @returns {string}
+         */
         datetimeMaintenance(value) {
             const inputDate = new Date(value);
             const now = new Date(Date.now());
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 378af06a..0121eb15 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -454,6 +454,10 @@ export default {
             socket.emit("getMonitorList", callback);
         },
 
+        /**
+         * Get list of maintenances
+         * @param {socketCB} callback
+         */
         getMaintenanceList(callback) {
             if (! callback) {
                 callback = () => { };
@@ -470,22 +474,49 @@ export default {
             socket.emit("add", monitor, callback);
         },
 
+        /**
+         * Adds a maintenace
+         * @param {Object} maintenance
+         * @param {socketCB} callback
+         */
         addMaintenance(maintenance, callback) {
             socket.emit("addMaintenance", maintenance, callback);
         },
 
+        /**
+         * Add monitors to maintenance
+         * @param {number} maintenanceID
+         * @param {number[]} monitors
+         * @param {socketCB} callback
+         */
         addMonitorMaintenance(maintenanceID, monitors, callback) {
             socket.emit("addMonitorMaintenance", maintenanceID, monitors, callback);
         },
 
+        /**
+         * Add status page to maintenance
+         * @param {number} maintenanceID
+         * @param {number} statusPages
+         * @param {socketCB} callback
+         */
         addMaintenanceStatusPage(maintenanceID, statusPages, callback) {
             socket.emit("addMaintenanceStatusPage", maintenanceID, statusPages, callback);
         },
 
+        /**
+         * Get monitors affected by maintenance
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         getMonitorMaintenance(maintenanceID, callback) {
             socket.emit("getMonitorMaintenance", maintenanceID, callback);
         },
 
+        /**
+         * Get status pages where maintenance is shown
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         getMaintenanceStatusPage(maintenanceID, callback) {
             socket.emit("getMaintenanceStatusPage", maintenanceID, callback);
         },
@@ -499,6 +530,11 @@ export default {
             socket.emit("deleteMonitor", monitorID, callback);
         },
 
+        /**
+         * Delete specified maintenance
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         deleteMaintenance(maintenanceID, callback) {
             socket.emit("deleteMaintenance", maintenanceID, callback);
         },
diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index d668d1ad..f0d87fe5 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -356,6 +356,7 @@ export default {
         });
     },
     methods: {
+        /** Initialise page */
         init() {
             this.affectedMonitors = [];
             this.selectedStatusPages = [];
@@ -414,6 +415,7 @@ export default {
             }
         },
 
+        /** Create new maintenance */
         async submit() {
             this.processing = true;
 
@@ -458,6 +460,11 @@ export default {
             }
         },
 
+        /**
+         * Add monitor to maintenance
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         async addMonitorMaintenance(maintenanceID, callback) {
             await this.$root.addMonitorMaintenance(maintenanceID, this.affectedMonitors, async (res) => {
                 if (!res.ok) {
@@ -470,6 +477,11 @@ export default {
             });
         },
 
+        /**
+         * Add status page to maintenance
+         * @param {number} maintenanceID
+         * @param {socketCB} callback
+         */
         async addMaintenanceStatusPage(maintenanceID, callback) {
             await this.$root.addMaintenanceStatusPage(maintenanceID, (this.showOnAllPages) ? this.selectedStatusPagesOptions : this.selectedStatusPages, async (res) => {
                 if (!res.ok) {
diff --git a/src/pages/MaintenanceDetails.vue b/src/pages/MaintenanceDetails.vue
index 04c21691..0cf9283d 100644
--- a/src/pages/MaintenanceDetails.vue
+++ b/src/pages/MaintenanceDetails.vue
@@ -65,6 +65,7 @@ export default {
         this.init();
     },
     methods: {
+        /** Initialise page */
         init() {
             this.$root.getSocket().emit("getMonitorMaintenance", this.$route.params.id, (res) => {
                 if (res.ok) {
@@ -83,10 +84,12 @@ export default {
             });
         },
 
+        /** Confirm deletion */
         deleteDialog() {
             this.$refs.confirmDelete.show();
         },
 
+        /** Delete maintenance after showing confirmation */
         deleteMaintenance() {
             this.$root.deleteMaintenance(this.maintenance.id, (res) => {
                 if (res.ok) {
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index dd36c950..aaffbbf9 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -133,15 +133,25 @@ export default {
             }
         },
 
+        /**
+         * Get maintenance URL
+         * @param {number} id
+         * @returns {string} Relative URL
+         */
         maintenanceURL(id) {
             return getMaintenanceRelativeURL(id);
         },
 
+        /**
+         * Show delete confirmation
+         * @param {number} maintenanceID
+         */
         deleteDialog(maintenanceID) {
             this.selectedMaintenanceID = maintenanceID;
             this.$refs.confirmDelete.show();
         },
 
+        /** Delete maintenance after showing confirmation dialog */
         deleteMaintenance() {
             this.$root.deleteMaintenance(this.selectedMaintenanceID, (res) => {
                 if (res.ok) {
diff --git a/src/util.js b/src/util.js
index 09e6d0ee..6b8f8f37 100644
--- a/src/util.js
+++ b/src/util.js
@@ -315,6 +315,11 @@ function getMonitorRelativeURL(id) {
     return "/dashboard/" + id;
 }
 exports.getMonitorRelativeURL = getMonitorRelativeURL;
+/**
+ * Get relative path for maintenance
+ * @param id ID of maintenance
+ * @returns Formatted relative path
+ */
 function getMaintenanceRelativeURL(id) {
     return "/maintenance/" + id;
 }
@@ -361,6 +366,11 @@ function parseTimeFromTimeObject(obj) {
     return result;
 }
 exports.parseTimeFromTimeObject = parseTimeFromTimeObject;
+/**
+ * Convert ISO date to UTC
+ * @param input Date
+ * @returns ISO Date time
+ */
 function isoToUTCDateTime(input) {
     return dayjs(input).utc().format(exports.SQL_DATETIME_FORMAT);
 }
@@ -379,6 +389,12 @@ function utcToLocal(input, format = exports.SQL_DATETIME_FORMAT) {
     return dayjs.utc(input).local().format(format);
 }
 exports.utcToLocal = utcToLocal;
+/**
+ * Convert local datetime to UTC
+ * @param input Local date
+ * @param format Format to return
+ * @returns Date in requested format
+ */
 function localToUTC(input, format = exports.SQL_DATETIME_FORMAT) {
     return dayjs(input).utc().format(format);
 }
diff --git a/src/util.ts b/src/util.ts
index 99038c8d..e8a2706e 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -352,6 +352,11 @@ export function getMonitorRelativeURL(id: string) {
     return "/dashboard/" + id;
 }
 
+/**
+ * Get relative path for maintenance
+ * @param id ID of maintenance
+ * @returns Formatted relative path
+ */
 export function getMaintenanceRelativeURL(id: string) {
     return "/maintenance/" + id;
 }
@@ -405,7 +410,11 @@ export function parseTimeFromTimeObject(obj : any) {
     return result;
 }
 
-
+/**
+ * Convert ISO date to UTC
+ * @param input Date
+ * @returns ISO Date time
+ */
 export function isoToUTCDateTime(input : string) {
     return dayjs(input).utc().format(SQL_DATETIME_FORMAT);
 }
@@ -424,6 +433,12 @@ export function utcToLocal(input : string, format = SQL_DATETIME_FORMAT) {
     return dayjs.utc(input).local().format(format);
 }
 
+/**
+ * Convert local datetime to UTC
+ * @param input Local date
+ * @param format Format to return
+ * @returns Date in requested format
+ */
 export function localToUTC(input : string, format = SQL_DATETIME_FORMAT) {
     return dayjs(input).utc().format(format);
 }

From 7ad4392529160fc7dc10b1cad5026330baabda4a Mon Sep 17 00:00:00 2001
From: MrEddX <66828538+MrEddX@users.noreply.github.com>
Date: Fri, 6 Jan 2023 09:00:45 +0200
Subject: [PATCH 404/803] Update bg-BG.js

Translation Updated
---
 src/languages/bg-BG.js | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
index dfd11c67..d8a789f3 100644
--- a/src/languages/bg-BG.js
+++ b/src/languages/bg-BG.js
@@ -669,4 +669,10 @@ export default {
     "General Monitor Type": "Общ тип монитор",
     "Passive Monitor Type": "Пасивет тип монитор",
     "Specific Monitor Type": "Специфичен тип монитор",
+    ZohoCliq: "ZohoCliq",
+    wayToGetZohoCliqURL: "Можете да научите как се създава URL адрес за уеб кука {0}.",
+    Kook: "Kook",
+    wayToGetKookBotToken: "Създайте приложение и вземете вашия бот токен на {0}",
+    wayToGetKookGuildID: "Превключете в 'Developer Mode' в 'Kook' настройките, след което десен клик върху 'guild' за да вземете неговото 'ID'",
+    "Guild ID": "Guild ID",
 };

From e490ec6d29a88a10979656a877fb4a7e3eeda2ee Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Fri, 6 Jan 2023 11:00:20 +0100
Subject: [PATCH 405/803] move hostname regex pattern function to
 frontend-utils

---
 src/pages/EditMonitor.vue |  3 ++-
 src/util-frontend.js      | 16 ++++++++++++++++
 src/util.ts               | 11 -----------
 3 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 124c9660..2ab9acc7 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -575,7 +575,8 @@ import NotificationDialog from "../components/NotificationDialog.vue";
 import DockerHostDialog from "../components/DockerHostDialog.vue";
 import ProxyDialog from "../components/ProxyDialog.vue";
 import TagsManager from "../components/TagsManager.vue";
-import { genSecret, isDev, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND, hostNameRegexPattern } from "../util.ts";
+import { genSecret, isDev, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND } from "../util.ts";
+import { hostNameRegexPattern } from "../util-frontend";
 
 const toast = useToast();
 
diff --git a/src/util-frontend.js b/src/util-frontend.js
index 3323f327..23b4ec95 100644
--- a/src/util-frontend.js
+++ b/src/util-frontend.js
@@ -78,3 +78,19 @@ export function getResBaseURL() {
         return "";
     }
 }
+
+/**
+ *
+ * @param {} mqtt wheather or not the regex should take into account the fact that it is an mqtt uri
+ * @returns RegExp The requested regex
+ */
+export function hostNameRegexPattern(mqtt = false) {
+    // mqtt, mqtts, ws and wss schemes accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
+    const mqttSchemeRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
+    // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
+    const ipRegexPattern = `((^\\s*${mqtt ? mqttSchemeRegexPattern : ""}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))`;
+    // Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
+    const hostNameRegexPattern = `^${mqtt ? mqttSchemeRegexPattern : ""}([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$`;
+
+    return `${ipRegexPattern}|${hostNameRegexPattern}`;
+}
diff --git a/src/util.ts b/src/util.ts
index 4b8f1624..99038c8d 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -427,14 +427,3 @@ export function utcToLocal(input : string, format = SQL_DATETIME_FORMAT) {
 export function localToUTC(input : string, format = SQL_DATETIME_FORMAT) {
     return dayjs(input).utc().format(format);
 }
-
-export function hostNameRegexPattern(mqtt = false) {
-    // mqtt, mqtts, ws and wss schemes accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
-    const mqttSchemeRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
-    // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
-    const ipRegexPattern = `((^\\s*${mqtt ? mqttSchemeRegexPattern : ""}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))`;
-    // Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
-    const hostNameRegexPattern = `^${mqtt ? mqttSchemeRegexPattern : ""}([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$`;
-
-    return `${ipRegexPattern}|${hostNameRegexPattern}`;
-}
\ No newline at end of file

From 21c19218677e0d8941d480401853c2ff417d6f8a Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 6 Jan 2023 23:04:02 +0800
Subject: [PATCH 406/803] Update server/uptime-kuma-server.js
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: 琚致远 / Zhiyuan Ju <juzhiyuan@apache.org>
---
 server/uptime-kuma-server.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 14712176..faffb98b 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -86,7 +86,7 @@ class UptimeKumaServer {
         this.io = new Server(this.httpServer);
     }
 
-    /** Initialise app after the dabase has been set up */
+    /** Initialise app after the database has been set up */
     async initAfterDatabaseReady() {
         await CacheableDnsHttpAgent.update();
 

From 675806829cc2548091350834b0d8b7efaf870bd9 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Fri, 6 Jan 2023 17:17:37 +0000
Subject: [PATCH 407/803] Changed wording for safeDelete function JSDoc

---
 extra/update-wiki-version.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/extra/update-wiki-version.js b/extra/update-wiki-version.js
index 880bc556..f551db41 100644
--- a/extra/update-wiki-version.js
+++ b/extra/update-wiki-version.js
@@ -44,7 +44,7 @@ function updateWiki(newVersion) {
 }
 
 /**
- * Check if a directory exists before deleting
+ * Check if a directory exists and then delete it
  * @param {string} dir Directory to delete
  */
 function safeDelete(dir) {

From 5d6770c0db4de6365b33c038aa880f9e2b85f264 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Fri, 6 Jan 2023 20:12:21 +0000
Subject: [PATCH 408/803] Removed excess space around function

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/util-server.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/util-server.js b/server/util-server.js
index 69719d2f..d4001c00 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -82,7 +82,7 @@ exports.tcping = function (hostname, port) {
  */
 exports.ping = async (hostname, size = 56) => {
     try {
-        return await exports.pingAsync(hostname, false, size );
+        return await exports.pingAsync(hostname, false, size);
     } catch (e) {
         // If the host cannot be resolved, try again with ipv6
         if (e.message.includes("service not known")) {

From d6c91869af6ea265ff711153fb3afe3a8a685731 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Fri, 6 Jan 2023 20:15:16 +0000
Subject: [PATCH 409/803] Reverted changes to en.js

Some changes were carried over in the merge

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/languages/en.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/languages/en.js b/src/languages/en.js
index 50b759a1..8ae4064d 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -590,9 +590,9 @@ export default {
     "Docker Host": "Docker Host",
     "Docker Hosts": "Docker Hosts",
     "ntfy Topic": "ntfy Topic",
-    "Domain": "Domain",
-    "Workstation": "Workstation",
-    disableCloudflaredNoAuthMsg: "You are in No Auth mode, password is not require.",
+    Domain: "Domain",
+    Workstation: "Workstation",
+    disableCloudflaredNoAuthMsg: "You are in No Auth mode, a password is not required.",
     "Packet Size": "Packet Size",
     trustProxyDescription: "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
     wayToGetLineNotifyToken: "You can get an access token from {0}",

From fe0317054095184c04a5d3b8f262a801588d3fc9 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Fri, 6 Jan 2023 20:41:25 +0000
Subject: [PATCH 410/803] [empty commit] pull request for #1685 Add API key for
 metrics page


From e8e4361e0940437a8ba858fa317aeb1af634d922 Mon Sep 17 00:00:00 2001
From: DimitriDR <dimitridroeck@gmail.com>
Date: Sat, 7 Jan 2023 13:10:25 +0100
Subject: [PATCH 411/803] Adding translations for Kook & ZohoCliq

---
 src/languages/fr-FR.js | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index aeb84731..6a6323a9 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -209,6 +209,7 @@ export default {
     here: "ici",
     Required: "Requis",
     telegram: "Telegram",
+    "ZohoCliq": "ZohoCliq",
     "Bot Token": "Jeton du robot",
     wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.",
     "Chat ID": "Chat ID",
@@ -240,7 +241,8 @@ export default {
     "Hello @everyone is...": "Bonjour {'@'}everyone il...",
     teams: "Microsoft Teams",
     "Webhook URL": "URL vers le webhook",
-    wayToGetTeamsURL: "Vous pouvez apprendre comment créer un Webhook {0}.",
+    wayToGetTeamsURL: "Vous pouvez apprendre comment créer une URL Webhook {0}.",
+    wayToGetZohoCliqURL: "Vous pouvez apprendre comment créer une URL Webhook {0}.",
     signal: "Signal",
     Number: "Numéro",
     Recipients: "Destinataires",
@@ -270,6 +272,10 @@ export default {
     apprise: "Apprise (prend en charge plus de 50 services de notification)",
     GoogleChat: "Google Chat (Google Workspace uniquement)",
     pushbullet: "Pushbullet",
+    Kook: "Kook",
+    wayToGetKookBotToken: "Créez une application et récupérer le jeton de robot à l'addresse {0}",
+    wayToGetKookGuildID: "Passez en « mode développeur » dans les paramètres de Kook, et cliquez droit sur le Guild pour obtenir son identifiant",
+    "Guild ID": "Identifiant de Guild",
     line: "Line Messenger",
     mattermost: "Mattermost",
     "User Key": "Clé d'utilisateur",

From 221d1d40f57fbd21fab63dceb8e850e337f2ea0e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 8 Jan 2023 00:32:13 +0800
Subject: [PATCH 412/803] Update CONTRIBUTING.md

---
 CONTRIBUTING.md | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a1a4a982..05987537 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -27,7 +27,7 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
 
 ## Can I create a pull request for Uptime Kuma?
 
-Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create an empty draft pull request or open an issue, so we can discuss first**. Especially for a large pull request or you don't know it will be merged or not.
+Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create an empty draft pull request or open an issue, so we can have a discussion first**. Especially for a large pull request or you don't know it will be merged or not.
 
 Here are some references:
 
@@ -51,6 +51,10 @@ Here are some references:
 - Convert existing code into other programming languages
 - Unnecessary large code changes (Hard to review, causes code conflicts to other pull requests)
 
+The above cases cannot cover all situations.
+
+I (@louislam) have the final say. If your pull request does not meet my expectations, I will reject it, no matter how much time you spend on it. Therefore, it is essential to have a discussion beforehand.
+
 I will mark your pull request in the [milestones](https://github.com/louislam/uptime-kuma/milestones), if I am plan to review and merge it.
 
 Also, please don't rush or ask for ETA, because I have to understand the pull request, make sure it is no breaking changes and stick to my vision of this project, especially for large pull requests.

From 23a525e36a0dc3a9904ca227c60a2ea323b48407 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 8 Jan 2023 00:42:15 +0800
Subject: [PATCH 413/803] Update CONTRIBUTING.md

---
 CONTRIBUTING.md | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 05987537..5cfa93e2 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,6 +1,6 @@
 # Project Info
 
-First of all, thank you everyone who made pull requests for Uptime Kuma, I never thought GitHub Community can be that nice! And also because of this, I also never thought other people actually read my code and edit my code. It is not structured and commented so well, lol. Sorry about that.
+First of all, I want to thank everyone who made pull requests for Uptime Kuma. I never thought the GitHub Community would be so nice! Because of this, I also never thought that other people would actually read and edit my code. It is not very well structured or commented, sorry about that.
 
 The project was created with vite.js (vue3). Then I created a subdirectory called "server" for server part. Both frontend and backend share the same package.json.
 
@@ -77,9 +77,9 @@ Before deep into coding, discussion first is preferred. Creating an empty pull r
 
 ## Project Styles
 
-I personally do not like something need to learn so much and need to config so much before you can finally start the app.
+I personally do not like it when something requires so much learning and configuration before you can finally start the app.
 
-- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort to get it run
+- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort required to get it running
 - Single container for Docker users, no very complex docker-compose file. Just map the volume and expose the port, then good to go
 - Settings should be configurable in the frontend. Environment variable is not encouraged, unless it is related to startup such as `DATA_DIR`.
 - Easy to use
@@ -177,15 +177,11 @@ The data and socket logic are in `src/mixins/socket.js`.
 
 ## Unit Test
 
-It is an end-to-end testing. It is using Jest and Puppeteer.
-
 ```bash
 npm run build
 npm test
 ```
 
-By default, the Chromium window will be shown up during the test. Specifying `HEADLESS_TEST=1` for terminal environments.
-
 ## Dependencies
 
 Both frontend and backend share the same package.json. However, the frontend dependencies are eventually not used in the production environment, because it is usually also baked into dist files. So:

From 774d754b213e88e03cfa07e3e2b71b1d53662a00 Mon Sep 17 00:00:00 2001
From: Adam Spurgeon <adam@mesomer.com>
Date: Sun, 8 Jan 2023 21:22:36 +1300
Subject: [PATCH 414/803] Add GameDig monitor

---
 db/patch-add-gamedig-monitor.sql |   5 +
 package-lock.json                | 756 ++++++++++++++++++++++++++++++-
 package.json                     |   1 +
 server/database.js               |   1 +
 server/model/monitor.js          |  16 +
 server/server.js                 |   1 +
 src/pages/EditMonitor.vue        |  14 +-
 7 files changed, 784 insertions(+), 10 deletions(-)
 create mode 100644 db/patch-add-gamedig-monitor.sql

diff --git a/db/patch-add-gamedig-monitor.sql b/db/patch-add-gamedig-monitor.sql
new file mode 100644
index 00000000..061bed30
--- /dev/null
+++ b/db/patch-add-gamedig-monitor.sql
@@ -0,0 +1,5 @@
+BEGIN TRANSACTION;
+
+ ALTER TABLE monitor
+     ADD game VARCHAR(255);
+ COMMIT
diff --git a/package-lock.json b/package-lock.json
index 7e88d126..1c194e6b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -30,6 +30,7 @@
                 "express-basic-auth": "~1.2.1",
                 "express-static-gzip": "~2.1.7",
                 "form-data": "~4.0.0",
+                "gamedig": "^4.0.5",
                 "http-graceful-shutdown": "~3.1.7",
                 "http-proxy-agent": "~5.0.0",
                 "https-proxy-agent": "~5.0.1",
@@ -3463,6 +3464,17 @@
             "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
             "dev": true
         },
+        "node_modules/@sindresorhus/is": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz",
+            "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==",
+            "engines": {
+                "node": ">=14.16"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/is?sponsor=1"
+            }
+        },
         "node_modules/@sinonjs/commons": {
             "version": "1.8.6",
             "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
@@ -3486,6 +3498,17 @@
             "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
             "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
         },
+        "node_modules/@szmarczak/http-timer": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+            "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+            "dependencies": {
+                "defer-to-connect": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=14.16"
+            }
+        },
         "node_modules/@tediousjs/connection-string": {
             "version": "0.3.0",
             "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.3.0.tgz",
@@ -3646,6 +3669,11 @@
             "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
             "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
         },
+        "node_modules/@types/http-cache-semantics": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+            "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
+        },
         "node_modules/@types/http-errors": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
@@ -4226,6 +4254,14 @@
                 "url": "https://github.com/sponsors/epoberezkin"
             }
         },
+        "node_modules/amdefine": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+            "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
+            "engines": {
+                "node": ">=0.4.2"
+            }
+        },
         "node_modules/anafanafo": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-2.0.0.tgz",
@@ -4278,6 +4314,11 @@
                 "node": ">=4"
             }
         },
+        "node_modules/any-promise": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+            "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+        },
         "node_modules/anymatch": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -4713,6 +4754,35 @@
             "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
             "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
         },
+        "node_modules/barse": {
+            "version": "0.4.3",
+            "resolved": "https://registry.npmjs.org/barse/-/barse-0.4.3.tgz",
+            "integrity": "sha512-UEpvriJqAn8zuVinYICuKoPttZy3XxXEoqX/V2uYAL4zzJRuNzCK3+20nAu3YUIa2U7G53kf90wfBIp9/A+Odw==",
+            "dependencies": {
+                "readable-stream": "~1.0.2"
+            }
+        },
+        "node_modules/barse/node_modules/isarray": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+            "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+        },
+        "node_modules/barse/node_modules/readable-stream": {
+            "version": "1.0.34",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+            "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.1",
+                "isarray": "0.0.1",
+                "string_decoder": "~0.10.x"
+            }
+        },
+        "node_modules/barse/node_modules/string_decoder": {
+            "version": "0.10.31",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+            "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+        },
         "node_modules/base64-js": {
             "version": "1.5.1",
             "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -5059,6 +5129,34 @@
                 "node": ">=10.6.0"
             }
         },
+        "node_modules/cacheable-request": {
+            "version": "10.2.5",
+            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.5.tgz",
+            "integrity": "sha512-5RwYYCfzjNPsyJxb/QpaM0bfzx+kw5/YpDhZPm9oMIDntHFQ9YXeyV47ZvzlTE0XrrrbyO2UITJH4GF9eRLdXQ==",
+            "dependencies": {
+                "@types/http-cache-semantics": "^4.0.1",
+                "get-stream": "^6.0.1",
+                "http-cache-semantics": "^4.1.0",
+                "keyv": "^4.5.2",
+                "mimic-response": "^4.0.0",
+                "normalize-url": "^8.0.0",
+                "responselike": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=14.16"
+            }
+        },
+        "node_modules/cacheable-request/node_modules/get-stream": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+            "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/cachedir": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
@@ -5552,6 +5650,29 @@
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
             "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
         },
+        "node_modules/compressjs": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz",
+            "integrity": "sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==",
+            "dependencies": {
+                "amdefine": "~1.0.0",
+                "commander": "~2.8.1"
+            },
+            "bin": {
+                "compressjs": "bin/compressjs"
+            }
+        },
+        "node_modules/compressjs/node_modules/commander": {
+            "version": "2.8.1",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+            "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==",
+            "dependencies": {
+                "graceful-readlink": ">= 1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.6.x"
+            }
+        },
         "node_modules/concat-map": {
             "version": "0.0.1",
             "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -5813,8 +5934,7 @@
         "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
-            "devOptional": true
+            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
         },
         "node_modules/cors": {
             "version": "2.8.5",
@@ -6277,6 +6397,31 @@
             "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
             "dev": true
         },
+        "node_modules/decompress-response": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+            "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+            "dependencies": {
+                "mimic-response": "^3.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/decompress-response/node_modules/mimic-response": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+            "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/dedent": {
             "version": "0.7.0",
             "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
@@ -6298,6 +6443,14 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/defer-to-connect": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+            "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/define-lazy-prop": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -7653,6 +7806,12 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/event-to-promise": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.7.0.tgz",
+            "integrity": "sha512-VOBBfyaADfe378ZzG0tgkzmsvzUyeU5arehrFzNRt5yaASUDshgctTwSrPI17ocAwR3+YftsxRClHF+GBKFByQ==",
+            "deprecated": "Use promise-toolbox/fromEvent instead"
+        },
         "node_modules/eventemitter2": {
             "version": "6.4.7",
             "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
@@ -8130,6 +8289,14 @@
                 "node": ">= 6"
             }
         },
+        "node_modules/form-data-encoder": {
+            "version": "2.1.4",
+            "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+            "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
+            "engines": {
+                "node": ">= 14.17"
+            }
+        },
         "node_modules/forwarded": {
             "version": "0.2.0",
             "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -8277,6 +8444,33 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/gamedig": {
+            "version": "4.0.5",
+            "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.0.5.tgz",
+            "integrity": "sha512-ROwljeTH8fcF44wi+NfTBdYSmiwtI5f1CJyGUx1DGVDvx7w2bfTxYSwR8FFFLCpNr78mtSwhsBONz1WZ5ucVig==",
+            "dependencies": {
+                "cheerio": "^1.0.0-rc.10",
+                "compressjs": "^1.0.2",
+                "gbxremote": "^0.2.1",
+                "got": "^12.0.3",
+                "iconv-lite": "^0.6.3",
+                "long": "^5.2.0",
+                "minimist": "^1.2.6",
+                "punycode": "^2.1.1",
+                "varint": "^6.0.0"
+            },
+            "bin": {
+                "gamedig": "bin/gamedig.js"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/gamedig/node_modules/long": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
+            "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
+        },
         "node_modules/gauge": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
@@ -8296,6 +8490,21 @@
                 "node": ">=10"
             }
         },
+        "node_modules/gbxremote": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/gbxremote/-/gbxremote-0.2.1.tgz",
+            "integrity": "sha512-SMehu6Y6ndq2Qgp9VxAb8Np3f+UUD+RWoW2SAMaxzGS96rWXyr4T1GGkecO0HHtxeH1m7pEh4FJWB8a/6aM2XQ==",
+            "dependencies": {
+                "any-promise": "^1.1.0",
+                "barse": "~0.4.2",
+                "event-to-promise": "^0.7.0",
+                "string-to-stream": "^1.0.1",
+                "xmlrpc": "^1.3.1"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
         "node_modules/generate-function": {
             "version": "2.3.1",
             "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
@@ -8558,12 +8767,60 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/got": {
+            "version": "12.5.3",
+            "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
+            "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
+            "dependencies": {
+                "@sindresorhus/is": "^5.2.0",
+                "@szmarczak/http-timer": "^5.0.1",
+                "cacheable-lookup": "^7.0.0",
+                "cacheable-request": "^10.2.1",
+                "decompress-response": "^6.0.0",
+                "form-data-encoder": "^2.1.2",
+                "get-stream": "^6.0.1",
+                "http2-wrapper": "^2.1.10",
+                "lowercase-keys": "^3.0.0",
+                "p-cancelable": "^3.0.0",
+                "responselike": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=14.16"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/got?sponsor=1"
+            }
+        },
+        "node_modules/got/node_modules/cacheable-lookup": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+            "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+            "engines": {
+                "node": ">=14.16"
+            }
+        },
+        "node_modules/got/node_modules/get-stream": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+            "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
             "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
             "devOptional": true
         },
+        "node_modules/graceful-readlink": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+            "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w=="
+        },
         "node_modules/har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -8758,6 +9015,11 @@
                 "entities": "^4.3.0"
             }
         },
+        "node_modules/http-cache-semantics": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+            "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+        },
         "node_modules/http-errors": {
             "version": "1.8.1",
             "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
@@ -8811,6 +9073,29 @@
                 "node": ">=0.10"
             }
         },
+        "node_modules/http2-wrapper": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
+            "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
+            "dependencies": {
+                "quick-lru": "^5.1.1",
+                "resolve-alpn": "^1.2.0"
+            },
+            "engines": {
+                "node": ">=10.19.0"
+            }
+        },
+        "node_modules/http2-wrapper/node_modules/quick-lru": {
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/https-proxy-agent": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -9415,8 +9700,7 @@
         "node_modules/isarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-            "devOptional": true
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
         },
         "node_modules/isemail": {
             "version": "3.2.0",
@@ -11495,6 +11779,11 @@
                 "node": ">=6"
             }
         },
+        "node_modules/json-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+            "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+        },
         "node_modules/json-parse-even-better-errors": {
             "version": "2.3.1",
             "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -11638,6 +11927,14 @@
             "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
             "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
         },
+        "node_modules/keyv": {
+            "version": "4.5.2",
+            "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
+            "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
+            "dependencies": {
+                "json-buffer": "3.0.1"
+            }
+        },
         "node_modules/kind-of": {
             "version": "6.0.3",
             "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -12129,6 +12426,17 @@
             "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
             "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
         },
+        "node_modules/lowercase-keys": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+            "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
+            "engines": {
+                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/lru-cache": {
             "version": "5.1.1",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -12327,6 +12635,17 @@
                 "node": ">=6"
             }
         },
+        "node_modules/mimic-response": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+            "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+            "engines": {
+                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/min-indent": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -12973,6 +13292,17 @@
             "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
             "dev": true
         },
+        "node_modules/normalize-url": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
+            "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
+            "engines": {
+                "node": ">=14.16"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/notp": {
             "version": "2.0.3",
             "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz",
@@ -13175,6 +13505,14 @@
             "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
             "dev": true
         },
+        "node_modules/p-cancelable": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+            "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
+            "engines": {
+                "node": ">=12.20"
+            }
+        },
         "node_modules/p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -14531,6 +14869,11 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/resolve-alpn": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+            "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
+        },
         "node_modules/resolve-cwd": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -14570,6 +14913,20 @@
                 "node": ">=10"
             }
         },
+        "node_modules/responselike": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+            "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+            "dependencies": {
+                "lowercase-keys": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=14.16"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/restore-cursor": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -14860,6 +15217,11 @@
                 "node": ">=8.9.0"
             }
         },
+        "node_modules/sax": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        },
         "node_modules/saxes": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
@@ -15354,6 +15716,37 @@
                 "node": ">=10"
             }
         },
+        "node_modules/string-to-stream": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.1.tgz",
+            "integrity": "sha512-QySF2+3Rwq0SdO3s7BAp4x+c3qsClpPQ6abAmb0DGViiSBAkT5kL6JT2iyzEVP+T1SmzHrQD1TwlP9QAHCc+Sw==",
+            "dependencies": {
+                "inherits": "^2.0.1",
+                "readable-stream": "^2.1.0"
+            }
+        },
+        "node_modules/string-to-stream/node_modules/readable-stream": {
+            "version": "2.3.7",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+            "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+            "dependencies": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+            }
+        },
+        "node_modules/string-to-stream/node_modules/string_decoder": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+            "dependencies": {
+                "safe-buffer": "~5.1.0"
+            }
+        },
         "node_modules/string-width": {
             "version": "4.2.3",
             "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -16342,6 +16735,11 @@
                 "spdx-expression-parse": "^3.0.0"
             }
         },
+        "node_modules/varint": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+            "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
+        },
         "node_modules/vary": {
             "version": "1.1.2",
             "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -17130,6 +17528,14 @@
             "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
             "dev": true
         },
+        "node_modules/xmlbuilder": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+            "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==",
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
         "node_modules/xmlchars": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -17144,6 +17550,19 @@
                 "node": ">=0.4.0"
             }
         },
+        "node_modules/xmlrpc": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz",
+            "integrity": "sha512-jQf5gbrP6wvzN71fgkcPPkF4bF/Wyovd7Xdff8d6/ihxYmgETQYSuTc+Hl+tsh/jmgPLro/Aro48LMFlIyEKKQ==",
+            "dependencies": {
+                "sax": "1.2.x",
+                "xmlbuilder": "8.2.x"
+            },
+            "engines": {
+                "node": ">=0.8",
+                "npm": ">=1.0.0"
+            }
+        },
         "node_modules/xtend": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -19724,6 +20143,11 @@
             "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
             "dev": true
         },
+        "@sindresorhus/is": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz",
+            "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw=="
+        },
         "@sinonjs/commons": {
             "version": "1.8.6",
             "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
@@ -19747,6 +20171,14 @@
             "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
             "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
         },
+        "@szmarczak/http-timer": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+            "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+            "requires": {
+                "defer-to-connect": "^2.0.1"
+            }
+        },
         "@tediousjs/connection-string": {
             "version": "0.3.0",
             "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.3.0.tgz",
@@ -19904,6 +20336,11 @@
             "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
             "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
         },
+        "@types/http-cache-semantics": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+            "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
+        },
         "@types/http-errors": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
@@ -20437,6 +20874,11 @@
                 "uri-js": "^4.2.2"
             }
         },
+        "amdefine": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+            "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg=="
+        },
         "anafanafo": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-2.0.0.tgz",
@@ -20474,6 +20916,11 @@
                 "color-convert": "^1.9.0"
             }
         },
+        "any-promise": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+            "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+        },
         "anymatch": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -20817,6 +21264,37 @@
             "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
             "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
         },
+        "barse": {
+            "version": "0.4.3",
+            "resolved": "https://registry.npmjs.org/barse/-/barse-0.4.3.tgz",
+            "integrity": "sha512-UEpvriJqAn8zuVinYICuKoPttZy3XxXEoqX/V2uYAL4zzJRuNzCK3+20nAu3YUIa2U7G53kf90wfBIp9/A+Odw==",
+            "requires": {
+                "readable-stream": "~1.0.2"
+            },
+            "dependencies": {
+                "isarray": {
+                    "version": "0.0.1",
+                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+                    "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+                },
+                "readable-stream": {
+                    "version": "1.0.34",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+                    "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.1",
+                        "isarray": "0.0.1",
+                        "string_decoder": "~0.10.x"
+                    }
+                },
+                "string_decoder": {
+                    "version": "0.10.31",
+                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+                    "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+                }
+            }
+        },
         "base64-js": {
             "version": "1.5.1",
             "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -21072,6 +21550,27 @@
             "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz",
             "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A=="
         },
+        "cacheable-request": {
+            "version": "10.2.5",
+            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.5.tgz",
+            "integrity": "sha512-5RwYYCfzjNPsyJxb/QpaM0bfzx+kw5/YpDhZPm9oMIDntHFQ9YXeyV47ZvzlTE0XrrrbyO2UITJH4GF9eRLdXQ==",
+            "requires": {
+                "@types/http-cache-semantics": "^4.0.1",
+                "get-stream": "^6.0.1",
+                "http-cache-semantics": "^4.1.0",
+                "keyv": "^4.5.2",
+                "mimic-response": "^4.0.0",
+                "normalize-url": "^8.0.0",
+                "responselike": "^3.0.0"
+            },
+            "dependencies": {
+                "get-stream": {
+                    "version": "6.0.1",
+                    "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+                    "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+                }
+            }
+        },
         "cachedir": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
@@ -21447,6 +21946,25 @@
                 }
             }
         },
+        "compressjs": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz",
+            "integrity": "sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==",
+            "requires": {
+                "amdefine": "~1.0.0",
+                "commander": "~2.8.1"
+            },
+            "dependencies": {
+                "commander": {
+                    "version": "2.8.1",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+                    "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==",
+                    "requires": {
+                        "graceful-readlink": ">= 1.0.0"
+                    }
+                }
+            }
+        },
         "concat-map": {
             "version": "0.0.1",
             "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -21633,8 +22151,7 @@
         "core-util-is": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
-            "devOptional": true
+            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
         },
         "cors": {
             "version": "2.8.5",
@@ -21994,6 +22511,21 @@
             "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
             "dev": true
         },
+        "decompress-response": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+            "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+            "requires": {
+                "mimic-response": "^3.1.0"
+            },
+            "dependencies": {
+                "mimic-response": {
+                    "version": "3.1.0",
+                    "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+                    "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
+                }
+            }
+        },
         "dedent": {
             "version": "0.7.0",
             "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
@@ -22012,6 +22544,11 @@
             "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
             "dev": true
         },
+        "defer-to-connect": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+            "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="
+        },
         "define-lazy-prop": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -22903,6 +23440,11 @@
             "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
             "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
         },
+        "event-to-promise": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.7.0.tgz",
+            "integrity": "sha512-VOBBfyaADfe378ZzG0tgkzmsvzUyeU5arehrFzNRt5yaASUDshgctTwSrPI17ocAwR3+YftsxRClHF+GBKFByQ=="
+        },
         "eventemitter2": {
             "version": "6.4.7",
             "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
@@ -23278,6 +23820,11 @@
                 "mime-types": "^2.1.12"
             }
         },
+        "form-data-encoder": {
+            "version": "2.1.4",
+            "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+            "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="
+        },
         "forwarded": {
             "version": "0.2.0",
             "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -23398,6 +23945,29 @@
             "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
             "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
         },
+        "gamedig": {
+            "version": "4.0.5",
+            "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.0.5.tgz",
+            "integrity": "sha512-ROwljeTH8fcF44wi+NfTBdYSmiwtI5f1CJyGUx1DGVDvx7w2bfTxYSwR8FFFLCpNr78mtSwhsBONz1WZ5ucVig==",
+            "requires": {
+                "cheerio": "^1.0.0-rc.10",
+                "compressjs": "^1.0.2",
+                "gbxremote": "^0.2.1",
+                "got": "^12.0.3",
+                "iconv-lite": "^0.6.3",
+                "long": "^5.2.0",
+                "minimist": "^1.2.6",
+                "punycode": "^2.1.1",
+                "varint": "^6.0.0"
+            },
+            "dependencies": {
+                "long": {
+                    "version": "5.2.1",
+                    "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
+                    "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
+                }
+            }
+        },
         "gauge": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
@@ -23414,6 +23984,18 @@
                 "wide-align": "^1.1.2"
             }
         },
+        "gbxremote": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/gbxremote/-/gbxremote-0.2.1.tgz",
+            "integrity": "sha512-SMehu6Y6ndq2Qgp9VxAb8Np3f+UUD+RWoW2SAMaxzGS96rWXyr4T1GGkecO0HHtxeH1m7pEh4FJWB8a/6aM2XQ==",
+            "requires": {
+                "any-promise": "^1.1.0",
+                "barse": "~0.4.2",
+                "event-to-promise": "^0.7.0",
+                "string-to-stream": "^1.0.1",
+                "xmlrpc": "^1.3.1"
+            }
+        },
         "generate-function": {
             "version": "2.3.1",
             "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
@@ -23606,12 +24188,47 @@
                 "get-intrinsic": "^1.1.3"
             }
         },
+        "got": {
+            "version": "12.5.3",
+            "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
+            "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
+            "requires": {
+                "@sindresorhus/is": "^5.2.0",
+                "@szmarczak/http-timer": "^5.0.1",
+                "cacheable-lookup": "^7.0.0",
+                "cacheable-request": "^10.2.1",
+                "decompress-response": "^6.0.0",
+                "form-data-encoder": "^2.1.2",
+                "get-stream": "^6.0.1",
+                "http2-wrapper": "^2.1.10",
+                "lowercase-keys": "^3.0.0",
+                "p-cancelable": "^3.0.0",
+                "responselike": "^3.0.0"
+            },
+            "dependencies": {
+                "cacheable-lookup": {
+                    "version": "7.0.0",
+                    "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+                    "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="
+                },
+                "get-stream": {
+                    "version": "6.0.1",
+                    "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+                    "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+                }
+            }
+        },
         "graceful-fs": {
             "version": "4.2.10",
             "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
             "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
             "devOptional": true
         },
+        "graceful-readlink": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+            "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w=="
+        },
         "har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -23751,6 +24368,11 @@
                 "entities": "^4.3.0"
             }
         },
+        "http-cache-semantics": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+            "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+        },
         "http-errors": {
             "version": "1.8.1",
             "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
@@ -23792,6 +24414,22 @@
                 "sshpk": "^1.14.1"
             }
         },
+        "http2-wrapper": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
+            "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
+            "requires": {
+                "quick-lru": "^5.1.1",
+                "resolve-alpn": "^1.2.0"
+            },
+            "dependencies": {
+                "quick-lru": {
+                    "version": "5.1.1",
+                    "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+                    "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
+                }
+            }
+        },
         "https-proxy-agent": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -24198,8 +24836,7 @@
         "isarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-            "devOptional": true
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
         },
         "isemail": {
             "version": "3.2.0",
@@ -25760,6 +26397,11 @@
             "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
             "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="
         },
+        "json-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+            "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+        },
         "json-parse-even-better-errors": {
             "version": "2.3.1",
             "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -25881,6 +26523,14 @@
             "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
             "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
         },
+        "keyv": {
+            "version": "4.5.2",
+            "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
+            "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
+            "requires": {
+                "json-buffer": "3.0.1"
+            }
+        },
         "kind-of": {
             "version": "6.0.3",
             "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -26258,6 +26908,11 @@
             "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
             "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
         },
+        "lowercase-keys": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+            "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="
+        },
         "lru-cache": {
             "version": "5.1.1",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -26400,6 +27055,11 @@
             "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
             "dev": true
         },
+        "mimic-response": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+            "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="
+        },
         "min-indent": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -26934,6 +27594,11 @@
             "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==",
             "dev": true
         },
+        "normalize-url": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
+            "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw=="
+        },
         "notp": {
             "version": "2.0.3",
             "resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz",
@@ -27085,6 +27750,11 @@
             "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
             "dev": true
         },
+        "p-cancelable": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+            "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="
+        },
         "p-finally": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -28099,6 +28769,11 @@
                 "supports-preserve-symlinks-flag": "^1.0.0"
             }
         },
+        "resolve-alpn": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+            "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
+        },
         "resolve-cwd": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -28128,6 +28803,14 @@
             "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
             "dev": true
         },
+        "responselike": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+            "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+            "requires": {
+                "lowercase-keys": "^3.0.0"
+            }
+        },
         "restore-cursor": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -28327,6 +29010,11 @@
                 "chokidar": ">=3.0.0 <4.0.0"
             }
         },
+        "sax": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+            "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        },
         "saxes": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
@@ -28721,6 +29409,39 @@
                 "strip-ansi": "^6.0.0"
             }
         },
+        "string-to-stream": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.1.tgz",
+            "integrity": "sha512-QySF2+3Rwq0SdO3s7BAp4x+c3qsClpPQ6abAmb0DGViiSBAkT5kL6JT2iyzEVP+T1SmzHrQD1TwlP9QAHCc+Sw==",
+            "requires": {
+                "inherits": "^2.0.1",
+                "readable-stream": "^2.1.0"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                },
+                "string_decoder": {
+                    "version": "1.1.1",
+                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+                    "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+                    "requires": {
+                        "safe-buffer": "~5.1.0"
+                    }
+                }
+            }
+        },
         "string-width": {
             "version": "4.2.3",
             "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -29485,6 +30206,11 @@
                 "spdx-expression-parse": "^3.0.0"
             }
         },
+        "varint": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+            "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
+        },
         "vary": {
             "version": "1.1.2",
             "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -30064,6 +30790,11 @@
             "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
             "dev": true
         },
+        "xmlbuilder": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+            "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw=="
+        },
         "xmlchars": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -30075,6 +30806,15 @@
             "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
             "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="
         },
+        "xmlrpc": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz",
+            "integrity": "sha512-jQf5gbrP6wvzN71fgkcPPkF4bF/Wyovd7Xdff8d6/ihxYmgETQYSuTc+Hl+tsh/jmgPLro/Aro48LMFlIyEKKQ==",
+            "requires": {
+                "sax": "1.2.x",
+                "xmlbuilder": "8.2.x"
+            }
+        },
         "xtend": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
diff --git a/package.json b/package.json
index ebe305f9..e51fd30e 100644
--- a/package.json
+++ b/package.json
@@ -85,6 +85,7 @@
         "express-basic-auth": "~1.2.1",
         "express-static-gzip": "~2.1.7",
         "form-data": "~4.0.0",
+        "gamedig": "^4.0.5",
         "http-graceful-shutdown": "~3.1.7",
         "http-proxy-agent": "~5.0.0",
         "https-proxy-agent": "~5.0.1",
diff --git a/server/database.js b/server/database.js
index 2544f197..3b4b88f9 100644
--- a/server/database.js
+++ b/server/database.js
@@ -66,6 +66,7 @@ class Database {
         "patch-add-radius-monitor.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
         "patch-maintenance-table2.sql": true,
+        "patch-add-gamedig-monitor.sql": true,
     };
 
     /**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 9f8c8300..f541a62b 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -16,6 +16,7 @@ const { CacheableDnsHttpAgent } = require("../cacheable-dns-http-agent");
 const { DockerHost } = require("../docker");
 const Maintenance = require("./maintenance");
 const { UptimeCacheList } = require("../uptime-cache-list");
+const Gamedig = require("gamedig");
 
 /**
  * status:
@@ -107,6 +108,7 @@ class Monitor extends BeanModel {
             grpcEnableTls: this.getGrpcEnableTls(),
             radiusCalledStationId: this.radiusCalledStationId,
             radiusCallingStationId: this.radiusCallingStationId,
+            game: this.game,
         };
 
         if (includeSensitiveData) {
@@ -487,6 +489,20 @@ class Monitor extends BeanModel {
                     } else {
                         throw new Error("Server not found on Steam");
                     }
+                } else if (this.type === "gamedig") {
+                    try {
+                        const state = await Gamedig.query({
+                            type: this.game,
+                            host: this.hostname,
+                            port: this.port
+                        });
+
+                        bean.msg = state.name;
+                        bean.status = UP;
+                        bean.ping = state.ping;
+                    } catch (e) {
+                        throw new Error("Server is offline");
+                    }
                 } else if (this.type === "docker") {
                     log.debug(`[${this.name}] Prepare Options for Axios`);
 
diff --git a/server/server.js b/server/server.js
index 5473cecd..26e16c2d 100644
--- a/server/server.js
+++ b/server/server.js
@@ -689,6 +689,7 @@ let needSetup = false;
                 bean.retryInterval = monitor.retryInterval;
                 bean.resendInterval = monitor.resendInterval;
                 bean.hostname = monitor.hostname;
+                bean.game = monitor.game;
                 bean.maxretries = monitor.maxretries;
                 bean.port = parseInt(monitor.port);
                 bean.keyword = monitor.keyword;
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index c9d5ad2f..3bb022ed 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -45,6 +45,9 @@
                                         <option value="steam">
                                             {{ $t("Steam Game Server") }}
                                         </option>
+                                        <option value="gamedig">
+                                            GameDig
+                                        </option>
                                         <option value="mqtt">
                                             MQTT
                                         </option>
@@ -101,16 +104,23 @@
                                 </div>
                             </div>
 
+                            <!-- Game -->
+                            <!-- GameDig only -->
+                            <div v-if="monitor.type === 'gamedig'" class="my-3">
+                                <label for="game" class="form-label"> {{ $t("Game") }} </label>
+                                <input id="game" v-model="monitor.game" type="text" class="form-control" required>
+                            </div>
+
                             <!-- Hostname -->
                             <!-- TCP Port / Ping / DNS / Steam / MQTT / Radius only -->
-                            <div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' || monitor.type === 'steam' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
+                            <div v-if="monitor.type === 'port' || monitor.type === 'ping' || monitor.type === 'dns' || monitor.type === 'steam' || monitor.type === 'gamedig' ||monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
                                 <label for="hostname" class="form-label">{{ $t("Hostname") }}</label>
                                 <input id="hostname" v-model="monitor.hostname" type="text" class="form-control" :pattern="`${ipRegexPattern}|${hostnameRegexPattern}`" required>
                             </div>
 
                             <!-- Port -->
                             <!-- For TCP Port / Steam / MQTT / Radius Type -->
-                            <div v-if="monitor.type === 'port' || monitor.type === 'steam' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
+                            <div v-if="monitor.type === 'port' || monitor.type === 'steam' || monitor.type === 'gamedig' || monitor.type === 'mqtt' || monitor.type === 'radius'" class="my-3">
                                 <label for="port" class="form-label">{{ $t("Port") }}</label>
                                 <input id="port" v-model="monitor.port" type="number" class="form-control" required min="0" max="65535" step="1">
                             </div>

From dd82f36da3fa3b2852bd470e3f62374f27e8d8e2 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Mon, 9 Jan 2023 00:16:18 +0800
Subject: [PATCH 415/803] Fix: Improve syntax & fix weird label logic

---
 server/routers/api-router.js | 23 +++++------------------
 1 file changed, 5 insertions(+), 18 deletions(-)

diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 45236d20..41608a04 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -143,36 +143,23 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
             const heartbeat = await Monitor.getPreviousHeartbeat(requestedMonitorId);
             const state = overrideValue !== undefined ? overrideValue : heartbeat.status;
 
-            badgeValues.label = label ? label : "";
+            badgeValues.label = label ?? "";
             switch (state) {
                 case 1:
                     badgeValues.color = upColor;
+                    badgeValues.message = upLabel;
                     break;
                 case 3:
                     badgeValues.color = maintenanceColor;
+                    badgeValues.message = maintenanceLabel;
                     break;
                 case 0:
                     badgeValues.color = downColor;
+                    badgeValues.message = downLabel;
                     break;
                 default:
                     badgeValues.color = badgeConstants.naColor;
-            }
-            if (label !== undefined) {
-                badgeValues.message = label;
-            } else {
-                switch (state) {
-                    case 1:
-                        badgeValues.message = upLabel;
-                        break;
-                    case 3:
-                        badgeValues.message = maintenanceLabel;
-                        break;
-                    case 0:
-                        badgeValues.message = downLabel;
-                        break;
-                    default:
-                        badgeValues.message = "N/A";
-                }
+                    badgeValues.message = "N/A";
             }
         }
 

From f8658d6160e280827fe6f35b6cc825bd771b73f5 Mon Sep 17 00:00:00 2001
From: SlothCroissant <ryan@ryanb.tv>
Date: Thu, 5 Jan 2023 10:53:41 -0600
Subject: [PATCH 416/803] Removed redundant title in Pushover notification

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

diff --git a/server/notification-providers/pushover.js b/server/notification-providers/pushover.js
index ebcb88c4..bafde56e 100644
--- a/server/notification-providers/pushover.js
+++ b/server/notification-providers/pushover.js
@@ -10,7 +10,7 @@ class Pushover extends NotificationProvider {
         let pushoverlink = "https://api.pushover.net/1/messages.json";
 
         let data = {
-            "message": "<b>Uptime Kuma Alert</b>\n\n<b>Message</b>:" + msg,
+            "message": "<b>Message</b>:" + msg,
             "user": notification.pushoveruserkey,
             "token": notification.pushoverapptoken,
             "sound": notification.pushoversounds,

From 32f7a0084acbf7c5f0984d55082b320e32a63fb0 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sun, 8 Jan 2023 19:09:06 +0000
Subject: [PATCH 417/803] Fixed negative retention time values

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/jobs/clear-old-data.js              | 21 ++++++++-----
 src/components/settings/MonitorHistory.vue |  6 +++-
 src/languages/en.js                        |  2 ++
 src/pages/Settings.vue                     | 36 +++++++++++++++++-----
 4 files changed, 49 insertions(+), 16 deletions(-)

diff --git a/server/jobs/clear-old-data.js b/server/jobs/clear-old-data.js
index 0ec5ffa5..ed80b0f7 100644
--- a/server/jobs/clear-old-data.js
+++ b/server/jobs/clear-old-data.js
@@ -25,15 +25,20 @@ const DEFAULT_KEEP_PERIOD = 180;
         parsedPeriod = DEFAULT_KEEP_PERIOD;
     }
 
-    log(`Clearing Data older than ${parsedPeriod} days...`);
+    if (parsedPeriod < 1) {
+        log(`Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`);
+    } else {
 
-    try {
-        await R.exec(
-            "DELETE FROM heartbeat WHERE time < DATETIME('now', '-' || ? || ' days') ",
-            [ parsedPeriod ]
-        );
-    } catch (e) {
-        log(`Failed to clear old data: ${e.message}`);
+        log(`Clearing Data older than ${parsedPeriod} days...`);
+
+        try {
+            await R.exec(
+                "DELETE FROM heartbeat WHERE time < DATETIME('now', '-' || ? || ' days') ",
+                [ parsedPeriod ]
+            );
+        } catch (e) {
+            log(`Failed to clear old data: ${e.message}`);
+        }
     }
 
     exit();
diff --git a/src/components/settings/MonitorHistory.vue b/src/components/settings/MonitorHistory.vue
index c78c6aaf..afcb7bc9 100644
--- a/src/components/settings/MonitorHistory.vue
+++ b/src/components/settings/MonitorHistory.vue
@@ -7,6 +7,7 @@
                         settings.keepDataPeriodDays,
                     ])
                 }}
+                {{ $t("infiniteRetention") }}
             </label>
             <input
                 id="keepDataPeriodDays"
@@ -14,9 +15,12 @@
                 type="number"
                 class="form-control"
                 required
-                min="1"
+                min="0"
                 step="1"
             />
+            <div v-if="settings.keepDataPeriodDays < 0" class="form-text">
+                {{ $t("dataRetentionTimeError") }}
+            </div>
         </div>
         <div class="my-4">
             <button class="btn btn-primary" type="button" @click="saveSettings()">
diff --git a/src/languages/en.js b/src/languages/en.js
index 8d07db6d..7a48d0d0 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -675,4 +675,6 @@ export default {
     "General Monitor Type": "General Monitor Type",
     "Passive Monitor Type": "Passive Monitor Type",
     "Specific Monitor Type": "Specific Monitor Type",
+    dataRetentionTimeError: "Retention period must be 0 or greater",
+    infiniteRetention: "Set to 0 for infinite retention.",
 };
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 87404968..f2dd3475 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -189,14 +189,36 @@ export default {
          * @param {string} [currentPassword] Only need for disableAuth to true
          */
         saveSettings(callback, currentPassword) {
-            this.$root.getSocket().emit("setSettings", this.settings, currentPassword, (res) => {
-                this.$root.toastRes(res);
-                this.loadSettings();
+            let valid = this.validateSettings();
+            if (valid.success) {
+                this.$root.getSocket().emit("setSettings", this.settings, currentPassword, (res) => {
+                    this.$root.toastRes(res);
+                    this.loadSettings();
 
-                if (callback) {
-                    callback();
-                }
-            });
+                    if (callback) {
+                        callback();
+                    }
+                });
+            } else {
+                this.$root.toastError(valid.msg);
+            }
+        },
+
+        /**
+         * Ensure settings are valid
+         * @returns {Object} Contains success state and error msg
+         */
+        validateSettings() {
+            if (this.settings.keepDataPeriodDays < 0) {
+                return {
+                    success: false,
+                    msg: this.$t("dataRetentionTimeError"),
+                };
+            }
+            return {
+                success: true,
+                msg: "",
+            };
         },
     }
 };

From 6bc0bd84afb9ca1e594c6632288bde3ddc30f4f9 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sun, 8 Jan 2023 20:39:27 +0000
Subject: [PATCH 418/803] Allowed markdown in footer of status page

Markdown support has been added using the marked module. To secure
against XSS attacks, DOMPurify is used to sanitize the generated HTML
before it is loaded on the page.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 package-lock.json        | 28 ++++++++++++++++++++++++++++
 package.json             |  2 ++
 src/languages/en.js      |  1 +
 src/pages/StatusPage.vue | 12 +++++++++++-
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/package-lock.json b/package-lock.json
index 7e88d126..3efce254 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,6 +26,7 @@
                 "compare-versions": "~3.6.0",
                 "compression": "~1.7.4",
                 "dayjs": "~1.11.5",
+                "dompurify": "^2.4.3",
                 "express": "~4.17.3",
                 "express-basic-auth": "~1.2.1",
                 "express-static-gzip": "~2.1.7",
@@ -38,6 +39,7 @@
                 "jsonwebtoken": "~9.0.0",
                 "jwt-decode": "~3.1.2",
                 "limiter": "~2.1.0",
+                "marked": "^4.2.5",
                 "mqtt": "~4.3.7",
                 "mssql": "~8.1.4",
                 "mysql2": "~2.3.3",
@@ -6499,6 +6501,11 @@
                 "url": "https://github.com/fb55/domhandler?sponsor=1"
             }
         },
+        "node_modules/dompurify": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
+            "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ=="
+        },
         "node_modules/domutils": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@@ -12185,6 +12192,17 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/marked": {
+            "version": "4.2.5",
+            "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz",
+            "integrity": "sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ==",
+            "bin": {
+                "marked": "bin/marked.js"
+            },
+            "engines": {
+                "node": ">= 12"
+            }
+        },
         "node_modules/mathml-tag-names": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -22155,6 +22173,11 @@
                 "domelementtype": "^2.3.0"
             }
         },
+        "dompurify": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
+            "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ=="
+        },
         "domutils": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@@ -26299,6 +26322,11 @@
             "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
             "dev": true
         },
+        "marked": {
+            "version": "4.2.5",
+            "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz",
+            "integrity": "sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ=="
+        },
         "mathml-tag-names": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
diff --git a/package.json b/package.json
index ebe305f9..fcda3437 100644
--- a/package.json
+++ b/package.json
@@ -81,6 +81,7 @@
         "compare-versions": "~3.6.0",
         "compression": "~1.7.4",
         "dayjs": "~1.11.5",
+        "dompurify": "^2.4.3",
         "express": "~4.17.3",
         "express-basic-auth": "~1.2.1",
         "express-static-gzip": "~2.1.7",
@@ -93,6 +94,7 @@
         "jsonwebtoken": "~9.0.0",
         "jwt-decode": "~3.1.2",
         "limiter": "~2.1.0",
+        "marked": "^4.2.5",
         "mqtt": "~4.3.7",
         "mssql": "~8.1.4",
         "mysql2": "~2.3.3",
diff --git a/src/languages/en.js b/src/languages/en.js
index 8d07db6d..5824ea4a 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -675,4 +675,5 @@ export default {
     "General Monitor Type": "General Monitor Type",
     "Passive Monitor Type": "Passive Monitor Type",
     "Specific Monitor Type": "Specific Monitor Type",
+    markdownSupported: "Markdown syntax supported",
 };
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 6cecf668..6fbbe69a 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -26,6 +26,9 @@
                 <div class="my-3">
                     <label for="footer-text" class="form-label">{{ $t("Footer Text") }}</label>
                     <textarea id="footer-text" v-model="config.footerText" class="form-control"></textarea>
+                    <div class="form-text">
+                        {{ $t("markdownSupported") }}
+                    </div>
                 </div>
 
                 <div class="my-3 form-check form-switch">
@@ -279,7 +282,9 @@
                 <div class="custom-footer-text text-start">
                     <strong v-if="enableEditMode">{{ $t("Custom Footer") }}:</strong>
                 </div>
-                <Editable v-model="config.footerText" tag="div" :contenteditable="enableEditMode" :noNL="false" class="alert-heading p-2" />
+                <Editable v-if="enableEditMode" v-model="config.footerText" tag="div" :contenteditable="enableEditMode" :noNL="false" class="alert-heading p-2" />
+                <!-- eslint-disable-next-line vue/no-v-html-->
+                <div v-if="! enableEditMode" class="alert-heading p-2" v-html="footerHTML"></div>
 
                 <p v-if="config.showPoweredBy">
                     {{ $t("Powered by") }} <a target="_blank" rel="noopener noreferrer" href="https://github.com/louislam/uptime-kuma">{{ $t("Uptime Kuma" ) }}</a>
@@ -310,6 +315,8 @@ import ImageCropUpload from "vue-image-crop-upload";
 import { PrismEditor } from "vue-prism-editor";
 import "vue-prism-editor/dist/prismeditor.min.css"; // import the styles somewhere
 import { useToast } from "vue-toastification";
+import { marked } from "marked";
+import DOMPurify from "dompurify";
 import Confirm from "../components/Confirm.vue";
 import PublicGroupList from "../components/PublicGroupList.vue";
 import MaintenanceTime from "../components/MaintenanceTime.vue";
@@ -477,6 +484,9 @@ export default {
             return this.overallStatus === STATUS_PAGE_MAINTENANCE;
         },
 
+        footerHTML() {
+            return DOMPurify.sanitize(marked(this.config.footerText));
+        },
     },
     watch: {
 

From 852a0885299bf3eeb2927c45675c8d578d18cb63 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sun, 8 Jan 2023 20:46:18 +0000
Subject: [PATCH 419/803] Added mardown support for incident

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/pages/StatusPage.vue | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 6fbbe69a..ab7ed69b 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -151,7 +151,12 @@
                 <Editable v-model="incident.title" tag="h4" :contenteditable="editIncidentMode" :noNL="true" class="alert-heading" />
 
                 <strong v-if="editIncidentMode">{{ $t("Content") }}:</strong>
-                <Editable v-model="incident.content" tag="div" :contenteditable="editIncidentMode" class="content" />
+                <Editable v-if="editIncidentMode" v-model="incident.content" tag="div" :contenteditable="editIncidentMode" class="content" />
+                <div v-if="editIncidentMode" class="form-text">
+                    {{ $t("markdownSupported") }}
+                </div>
+                <!-- eslint-disable-next-line vue/no-v-html-->
+                <div v-if="! editIncidentMode" class="content" v-html="incidentHTML"></div>
 
                 <!-- Incident Date -->
                 <div class="date mt-3">
@@ -484,6 +489,10 @@ export default {
             return this.overallStatus === STATUS_PAGE_MAINTENANCE;
         },
 
+        incidentHTML() {
+            return DOMPurify.sanitize(marked(this.incident.content));
+        },
+
         footerHTML() {
             return DOMPurify.sanitize(marked(this.config.footerText));
         },

From 80f2d6e2a7229147fe2cd055faf7df457de8a017 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sun, 8 Jan 2023 20:54:16 +0000
Subject: [PATCH 420/803] Added markdown support for maintenance

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/pages/EditMaintenance.vue |  3 +++
 src/pages/StatusPage.vue      | 12 +++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/pages/EditMaintenance.vue b/src/pages/EditMaintenance.vue
index d668d1ad..da7dee5a 100644
--- a/src/pages/EditMaintenance.vue
+++ b/src/pages/EditMaintenance.vue
@@ -21,6 +21,9 @@
                                 <textarea
                                     id="description" v-model="maintenance.description" class="form-control"
                                 ></textarea>
+                                <div class="form-text">
+                                    {{ $t("markdownSupported") }}
+                                </div>
                             </div>
 
                             <!-- Affected Monitors -->
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index ab7ed69b..3b89ed83 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -244,7 +244,8 @@
                     class="shadow-box alert mb-4 p-3 bg-maintenance mt-4 position-relative" role="alert"
                 >
                     <h4 class="alert-heading">{{ maintenance.title }}</h4>
-                    <div class="content">{{ maintenance.description }}</div>
+                    <!-- eslint-disable-next-line vue/no-v-html-->
+                    <div class="content" v-html="maintenanceHTML(maintenance.description)"></div>
                     <MaintenanceTime :maintenance="maintenance" />
                 </div>
             </template>
@@ -855,6 +856,15 @@ export default {
             this.config.domainNameList.splice(index, 1);
         },
 
+        /**
+         * Generate sanitized HTML from maintenance description
+         * @param {string} description
+         * @returns {string} Sanitized HTML
+         */
+        maintenanceHTML(description) {
+            return DOMPurify.sanitize(marked(description));
+        },
+
     }
 };
 </script>

From c00abac834adb5aaafb4905e1e6a51e724a9663e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 9 Jan 2023 13:42:53 +0800
Subject: [PATCH 421/803] Separate golang build layer

---
 docker/builder-go.dockerfile | 16 ++++++++++++++++
 docker/dockerfile            | 14 ++------------
 extra/healthcheck.go         |  4 ++++
 package.json                 |  1 +
 4 files changed, 23 insertions(+), 12 deletions(-)
 create mode 100644 docker/builder-go.dockerfile

diff --git a/docker/builder-go.dockerfile b/docker/builder-go.dockerfile
new file mode 100644
index 00000000..5d38cf4e
--- /dev/null
+++ b/docker/builder-go.dockerfile
@@ -0,0 +1,16 @@
+############################################
+# Build in Golang
+# Run npm run build-healthcheck-armv7 in the host first, another it will be super slow where it is building the armv7 healthcheck
+############################################
+FROM golang:1.19.4-buster
+WORKDIR /app
+ARG TARGETPLATFORM
+COPY ./extra/ ./extra/
+
+# Compile healthcheck.go
+RUN apt update
+RUN apt --yes --no-install-recommends install curl
+RUN curl -sL https://deb.nodesource.com/setup_18.x | bash
+RUN apt --yes --no-install-recommends install nodejs
+RUN node -v
+RUN node ./extra/build-healthcheck.js $TARGETPLATFORM
diff --git a/docker/dockerfile b/docker/dockerfile
index e084d649..26f70dd3 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -1,19 +1,9 @@
 ############################################
 # Build in Golang
 # Run npm run build-healthcheck-armv7 in the host first, another it will be super slow where it is building the armv7 healthcheck
+# Check file: builder-go.dockerfile
 ############################################
-FROM golang:1.19.4-buster AS build_healthcheck
-WORKDIR /app
-ARG TARGETPLATFORM
-COPY ./extra/ ./extra/
-
-# Compile healthcheck.go
-RUN apt update
-RUN apt --yes --no-install-recommends install curl
-RUN curl -sL https://deb.nodesource.com/setup_18.x | bash
-RUN apt --yes --no-install-recommends install nodejs
-RUN node -v
-RUN node ./extra/build-healthcheck.js $TARGETPLATFORM
+FROM louislam/uptime-kuma:builder-go AS build_healthcheck
 
 ############################################
 # Build in Node.js
diff --git a/extra/healthcheck.go b/extra/healthcheck.go
index 779b1583..302883d8 100644
--- a/extra/healthcheck.go
+++ b/extra/healthcheck.go
@@ -1,3 +1,7 @@
+/*
+ * If changed, have to run `npm run build-docker-builder-go`.
+ * This script should be run after a period of time (180s), because the server may need some time to prepare.
+ */
 package main
 
 import (
diff --git a/package.json b/package.json
index ebe305f9..0175e4b1 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
         "build-docker": "npm run build && npm run build-docker-debian && npm run build-docker-alpine",
         "build-docker-alpine-base": "docker buildx build -f docker/alpine-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-alpine . --push",
         "build-docker-debian-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base-debian . --push",
+        "build-docker-builder-go": "docker buildx build -f docker/builder-go.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:builder-go . --push",
         "build-docker-alpine": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile-alpine --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:$VERSION-alpine --target release . --push",
         "build-docker-debian": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:$VERSION-debian --target release . --push",
         "build-docker-nightly": "npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",

From 24d1dd4c3494b6b60362dfd1f3e16eabec1cd129 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 9 Jan 2023 20:24:20 +0800
Subject: [PATCH 422/803] [auto-test] Drop Node.js 17, add 19

---
 .github/workflows/auto-test.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/auto-test.yml b/.github/workflows/auto-test.yml
index b49a253c..3b962af1 100644
--- a/.github/workflows/auto-test.yml
+++ b/.github/workflows/auto-test.yml
@@ -18,7 +18,7 @@ jobs:
     strategy:
       matrix:
         os: [macos-latest, ubuntu-latest, windows-latest]
-        node: [ 14, 16, 17, 18 ]
+        node: [ 14, 16, 18, 19 ]
         # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
 
     steps:

From 71f4ab0aa6eaa3f09e19ff20f07c41b011d890bf Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 9 Jan 2023 21:01:45 +0800
Subject: [PATCH 423/803] Improve dockerfile

---
 docker/builder-go.dockerfile | 12 ++++++------
 docker/dockerfile            |  7 +++++--
 docker/dockerfile-alpine     |  8 +++++---
 3 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/docker/builder-go.dockerfile b/docker/builder-go.dockerfile
index 5d38cf4e..79c1a95b 100644
--- a/docker/builder-go.dockerfile
+++ b/docker/builder-go.dockerfile
@@ -8,9 +8,9 @@ ARG TARGETPLATFORM
 COPY ./extra/ ./extra/
 
 # Compile healthcheck.go
-RUN apt update
-RUN apt --yes --no-install-recommends install curl
-RUN curl -sL https://deb.nodesource.com/setup_18.x | bash
-RUN apt --yes --no-install-recommends install nodejs
-RUN node -v
-RUN node ./extra/build-healthcheck.js $TARGETPLATFORM
+RUN apt update && \
+    apt --yes --no-install-recommends install curl && \
+    curl -sL https://deb.nodesource.com/setup_18.x | bash && \
+    apt --yes --no-install-recommends install nodejs && \
+    node ./extra/build-healthcheck.js $TARGETPLATFORM && \
+    apt --yes remove nodejs
diff --git a/docker/dockerfile b/docker/dockerfile
index 26f70dd3..775cec59 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -12,10 +12,13 @@ FROM louislam/uptime-kuma:base-debian AS build
 WORKDIR /app
 
 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
+COPY .npmrc .npmrc
+COPY package.json package.json
+COPY package-lock.json package-lock.json
+RUN npm ci --omit=dev
 COPY . .
 COPY --from=build_healthcheck /app/extra/healthcheck /app/extra/healthcheck
-RUN npm ci --production && \
-    chmod +x /app/extra/entrypoint.sh
+RUN chmod +x /app/extra/entrypoint.sh
 
 ############################################
 # ⭐ Main Image
diff --git a/docker/dockerfile-alpine b/docker/dockerfile-alpine
index ab9255f9..43f26b8b 100644
--- a/docker/dockerfile-alpine
+++ b/docker/dockerfile-alpine
@@ -3,10 +3,12 @@ WORKDIR /app
 
 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
 
+COPY .npmrc .npmrc
+COPY package.json package.json
+COPY package-lock.json package-lock.json
+RUN npm ci --omit=dev
 COPY . .
-RUN npm ci --production && \
-    chmod +x /app/extra/entrypoint.sh
-
+RUN chmod +x /app/extra/entrypoint.sh
 
 FROM louislam/uptime-kuma:base-alpine AS release
 WORKDIR /app

From 5f5c2d7c469da6be1a1ac4208cbcfe35de9ae6d3 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 9 Jan 2023 21:02:57 +0800
Subject: [PATCH 424/803] Update to 1.19.4

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

diff --git a/package.json b/package.json
index 0175e4b1..499073b6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.3",
+    "version": "1.19.4",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -39,7 +39,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.19.3 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.19.4 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 33355c51b792430d4a262a86747d656af550d95e Mon Sep 17 00:00:00 2001
From: Joseph Irving <joseph.irving@sony.com>
Date: Thu, 13 Oct 2022 11:15:02 +0100
Subject: [PATCH 425/803] Add Splunk Notifications

---
 server/notification-providers/splunk.js | 113 ++++++++++++++++++++++++
 server/notification.js                  |   2 +
 src/components/notifications/Splunk.vue |  32 +++++++
 src/components/notifications/index.js   |   2 +
 4 files changed, 149 insertions(+)
 create mode 100644 server/notification-providers/splunk.js
 create mode 100644 src/components/notifications/Splunk.vue

diff --git a/server/notification-providers/splunk.js b/server/notification-providers/splunk.js
new file mode 100644
index 00000000..2d82dd39
--- /dev/null
+++ b/server/notification-providers/splunk.js
@@ -0,0 +1,113 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const { UP, DOWN, getMonitorRelativeURL } = require("../../src/util");
+const { setting } = require("../util-server");
+let successMessage = "Sent Successfully.";
+
+class Splunk extends NotificationProvider {
+    name = "Splunk";
+
+    /**
+     * @inheritdoc
+     */
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        try {
+            if (heartbeatJSON == null) {
+                const title = "Uptime Kuma Alert";
+                const monitor = {
+                    type: "ping",
+                    url: "Uptime Kuma Test Button",
+                };
+                return this.postNotification(notification, title, msg, monitor, "trigger");
+            }
+
+            if (heartbeatJSON.status === UP) {
+                const title = "Uptime Kuma Monitor ✅ Up";
+                return this.postNotification(notification, title, heartbeatJSON.msg, monitorJSON, "recovery");
+            }
+
+            if (heartbeatJSON.status === DOWN) {
+                const title = "Uptime Kuma Monitor 🔴 Down";
+                return this.postNotification(notification, title, heartbeatJSON.msg, monitorJSON, "trigger");
+            }
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+
+    /**
+     * Check if result is successful, result code should be in range 2xx
+     * @param {Object} result Axios response object
+     * @throws {Error} The status code is not in range 2xx
+     */
+    checkResult(result) {
+        if (result.status == null) {
+            throw new Error("Splunk notification failed with invalid response!");
+        }
+        if (result.status < 200 || result.status >= 300) {
+            throw new Error("Splunk notification failed with status code " + result.status);
+        }
+    }
+
+    /**
+     * Send the message
+     * @param {BeanModel} notification Message title
+     * @param {string} title Message title
+     * @param {string} body Message
+     * @param {Object} monitorInfo Monitor details (For Up/Down only)
+     * @param {?string} eventAction Action event for PagerDuty (trigger, acknowledge, resolve)
+     * @returns {string}
+     */
+    async postNotification(notification, title, body, monitorInfo, eventAction = "trigger") {
+
+        let monitorUrl;
+        if (monitorInfo.type === "port") {
+            monitorUrl = monitorInfo.hostname;
+            if (monitorInfo.port) {
+                monitorUrl += ":" + monitorInfo.port;
+            }
+        } else if (monitorInfo.hostname != null) {
+            monitorUrl = monitorInfo.hostname;
+        } else {
+            monitorUrl = monitorInfo.url;
+        }
+
+        if (eventAction === "recovery") {
+            if (notification.splunkAutoResolve === "0") {
+                return "No action required";
+            }
+            eventAction = notification.splunkAutoResolve;
+        } else {
+            eventAction = notification.splunkSeverity;
+        }
+
+        const options = {
+            method: "POST",
+            url: notification.splunkRestURL,
+            headers: { "Content-Type": "application/json" },
+            data: {
+                message_type: eventAction,
+                state_message: `[${title}] [${monitorUrl}] ${body}`,
+                entity_display_name: "Uptime Kuma Alert: " + monitorInfo.name,
+                routing_key: notification.pagerdutyIntegrationKey,
+                entity_id: "Uptime Kuma/" + monitorInfo.id,
+            }
+        };
+
+        const baseURL = await setting("primaryBaseURL");
+        if (baseURL && monitorInfo) {
+            options.client = "Uptime Kuma";
+            options.client_url = baseURL + getMonitorRelativeURL(monitorInfo.id);
+        }
+
+        let result = await axios.request(options);
+        this.checkResult(result);
+        if (result.statusText != null) {
+            return "Splunk notification succeed: " + result.statusText;
+        }
+
+        return successMessage;
+    }
+}
+
+module.exports = Splunk;
diff --git a/server/notification.js b/server/notification.js
index 1aad704c..fd349123 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -40,6 +40,7 @@ const Stackfield = require("./notification-providers/stackfield");
 const Teams = require("./notification-providers/teams");
 const TechulusPush = require("./notification-providers/techulus-push");
 const Telegram = require("./notification-providers/telegram");
+const Splunk = require("./notification-providers/splunk");
 const Webhook = require("./notification-providers/webhook");
 const WeCom = require("./notification-providers/wecom");
 const GoAlert = require("./notification-providers/goalert");
@@ -100,6 +101,7 @@ class Notification {
             new Teams(),
             new TechulusPush(),
             new Telegram(),
+            new Splunk(),
             new Webhook(),
             new WeCom(),
             new GoAlert(),
diff --git a/src/components/notifications/Splunk.vue b/src/components/notifications/Splunk.vue
new file mode 100644
index 00000000..86448517
--- /dev/null
+++ b/src/components/notifications/Splunk.vue
@@ -0,0 +1,32 @@
+<template>
+    <div class="mb-3">
+        <label for="splunk-rest-url" class="form-label">{{ $t("Splunk Rest URL") }}</label>
+        <HiddenInput id="splunk-rest-url" v-model="$parent.notification.splunkRestURL" :required="true" autocomplete="false"></HiddenInput>
+    </div>
+    <div class="mb-3">
+        <label for="splunk-severity" class="form-label">{{ $t("Severity") }}</label>
+        <select id="splunk-severity" v-model="$parent.notification.splunkSeverity" class="form-select">
+            <option value="INFO">{{ $t("info") }}</option>
+            <option value="WARNING">{{ $t("warning") }}</option>
+            <option value="CRITICAL" selected="selected">{{ $t("critical") }}</option>
+        </select>
+    </div>
+    <div class="mb-3">
+        <label for="splunk-resolve" class="form-label">{{ $t("Auto resolve or acknowledged") }}</label>
+        <select id="splunk-resolve" v-model="$parent.notification.splunkAutoResolve" class="form-select">
+            <option value="0" selected="selected">{{ $t("do nothing") }}</option>
+            <option value="ACKNOWLEDGEMENT">{{ $t("auto acknowledged") }}</option>
+            <option value="RECOVERY">{{ $t("auto resolve") }}</option>
+        </select>
+    </div>
+</template>
+
+<script>
+import HiddenInput from "../HiddenInput.vue";
+
+export default {
+    components: {
+        HiddenInput,
+    },
+};
+</script>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 810cdf03..3c8b2621 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -44,6 +44,7 @@ import Webhook from "./Webhook.vue";
 import WeCom from "./WeCom.vue";
 import GoAlert from "./GoAlert.vue";
 import ZohoCliq from "./ZohoCliq.vue";
+import Splunk from "./Splunk.vue";
 
 /**
  * Manage all notification form.
@@ -92,6 +93,7 @@ const NotificationFormList = {
     "stackfield": Stackfield,
     "teams": Teams,
     "telegram": Telegram,
+    "Splunk": Splunk,
     "webhook": Webhook,
     "WeCom": WeCom,
     "GoAlert": GoAlert,

From 890e3abf588fdad7ae4161ca4c83cc662db71636 Mon Sep 17 00:00:00 2001
From: DimitriDR <dimitridroeck@gmail.com>
Date: Mon, 9 Jan 2023 21:09:57 +0100
Subject: [PATCH 426/803] Updating French localization

Signed-off-by: DimitriDR <dimitridroeck@gmail.com>
---
 src/languages/fr-FR.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index 6a6323a9..ca61bbdc 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -675,4 +675,6 @@ export default {
     "General Monitor Type": "Type de sonde générale",
     "Passive Monitor Type": "Type de sonde passive",
     "Specific Monitor Type": "Type de sonde spécifique",
+    dataRetentionTimeError: "La durée de conservation doit être supérieure ou égale à 0",
+    infiniteRetention: "Définissez la valeur à 0 pour une durée de conservation infinie.",
 };

From 66d5408aadd083dd38fe89086794b46d5cfeb0c6 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Mon, 9 Jan 2023 20:20:09 +0000
Subject: [PATCH 427/803] Added DB schema for api keys

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 db/patch-api-key-table.sql | 13 +++++++++++++
 server/database.js         |  1 +
 2 files changed, 14 insertions(+)
 create mode 100644 db/patch-api-key-table.sql

diff --git a/db/patch-api-key-table.sql b/db/patch-api-key-table.sql
new file mode 100644
index 00000000..151b6918
--- /dev/null
+++ b/db/patch-api-key-table.sql
@@ -0,0 +1,13 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+CREATE TABLE [api_key] (
+    [id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+    [key] VARCHAR(255) NOT NULL,
+    [name] VARCHAR(255) NOT NULL,
+    [user_id] INTEGER NOT NULL,
+    [created_date] DATETIME DEFAULT (DATETIME('now')) NOT NULL,
+    [active] BOOLEAN DEFAULT 1 NOT NULL,
+    [expires] DATETIME DEFAULT NULL,
+    CONSTRAINT FK_user FOREIGN KEY ([user_id]) REFERENCES [user]([id]) ON DELETE CASCADE ON UPDATE CASCADE
+);
+COMMIT;
\ No newline at end of file
diff --git a/server/database.js b/server/database.js
index 2544f197..acf6f87a 100644
--- a/server/database.js
+++ b/server/database.js
@@ -66,6 +66,7 @@ class Database {
         "patch-add-radius-monitor.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
         "patch-maintenance-table2.sql": true,
+        "patch-api-key-table.sql": true,
     };
 
     /**

From 1565da87cf0cb13573de526cc0323a5d4dbb0c5e Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Tue, 10 Jan 2023 08:18:45 +0100
Subject: [PATCH 428/803] Implement cypress unit testing

---
 config/cypress.frontend.config.js | 10 +++++++
 package.json                      |  1 +
 test/cypress/unit/i18n.spec.js    | 44 +++++++++++++++++++++++++++++++
 3 files changed, 55 insertions(+)
 create mode 100644 config/cypress.frontend.config.js
 create mode 100644 test/cypress/unit/i18n.spec.js

diff --git a/config/cypress.frontend.config.js b/config/cypress.frontend.config.js
new file mode 100644
index 00000000..eecdcb8d
--- /dev/null
+++ b/config/cypress.frontend.config.js
@@ -0,0 +1,10 @@
+const { defineConfig } = require("cypress");
+
+module.exports = defineConfig({
+    e2e: {
+        supportFile: false,
+        specPattern: [
+            "test/cypress/unit/**/*.js"
+        ],
+    }
+});
diff --git a/package.json b/package.json
index ebe305f9..190ef247 100644
--- a/package.json
+++ b/package.json
@@ -60,6 +60,7 @@
         "start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev",
         "cy:test": "node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/ --e2e",
         "cy:run": "npx cypress run --browser chrome --headless --config-file ./config/cypress.config.js",
+        "cy:run:unit": "npx cypress run --browser chrome --headless --config-file ./config/cypress.frontend.config.js",
         "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\"",
         "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go"
     },
diff --git a/test/cypress/unit/i18n.spec.js b/test/cypress/unit/i18n.spec.js
new file mode 100644
index 00000000..da63d95a
--- /dev/null
+++ b/test/cypress/unit/i18n.spec.js
@@ -0,0 +1,44 @@
+import { currentLocale } from "../../../src/i18n";
+
+describe("Test i18n.js", () => {
+
+    it("currentLocale()", () => {
+        const setLanguage = (language) => {
+            Object.defineProperty(window.navigator, 'language', { 
+                value: language, 
+                writable: true 
+            });
+        }
+        setLanguage('en-EN');
+
+        expect(currentLocale()).equal("en");
+
+        setLanguage('zh-HK');
+        expect(currentLocale()).equal("zh-HK");
+
+        // Note that in Safari on iOS prior to 10.2, the country code returned is lowercase: "en-us", "fr-fr" etc.
+        // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language
+        setLanguage('zh-hk');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('en-US');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('ja-ZZ');
+        expect(currentLocale()).equal("ja");
+
+        setLanguage('zz-ZZ');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('zz-ZZ');
+        expect(currentLocale()).equal("en");
+
+        setLanguage('en');
+        localStorage.locale = "en";
+        expect(currentLocale()).equal("en");
+
+        localStorage.locale = "zh-HK";
+        expect(currentLocale()).equal("zh-HK");
+    });
+
+});
\ No newline at end of file

From 1c05ba09dcf17f898f8ea3b8a8c6ec6112d92933 Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Tue, 10 Jan 2023 08:24:15 +0100
Subject: [PATCH 429/803] Add cypress unit tests to workflow

---
 .github/workflows/auto-test.yml | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/.github/workflows/auto-test.yml b/.github/workflows/auto-test.yml
index b49a253c..c03e9e4d 100644
--- a/.github/workflows/auto-test.yml
+++ b/.github/workflows/auto-test.yml
@@ -66,3 +66,19 @@ jobs:
     - run: npm install
     - run: npm run build
     - run: npm run cy:test
+
+  frontend-unit-tests:
+    needs: [ check-linters ]
+    runs-on: ubuntu-latest
+    steps:
+    - run: git config --global core.autocrlf false  # Mainly for Windows
+    - uses: actions/checkout@v3
+
+    - name: Use Node.js 14
+      uses: actions/setup-node@v3
+      with:
+        node-version: 14
+        cache: 'npm'
+    - run: npm install
+    - run: npm run build
+    - run: cy:run:unit

From 636fc8fcfcdd46b7d60f367b66a23f13dc3e7815 Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Tue, 10 Jan 2023 08:43:39 +0100
Subject: [PATCH 430/803] Fix workflow

---
 .github/workflows/auto-test.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/auto-test.yml b/.github/workflows/auto-test.yml
index c03e9e4d..3ea96c2e 100644
--- a/.github/workflows/auto-test.yml
+++ b/.github/workflows/auto-test.yml
@@ -81,4 +81,4 @@ jobs:
         cache: 'npm'
     - run: npm install
     - run: npm run build
-    - run: cy:run:unit
+    - run: npm run cy:run:unit

From 21b418230cb76d970f40a81fd6cf53145f3d7ae9 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Tue, 10 Jan 2023 19:25:31 +0800
Subject: [PATCH 431/803] Chore: reorder cases

Co-authored-by: Frank Elsinga <frank@elsinga.de>
---
 server/routers/api-router.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 41608a04..f2e0874e 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -145,6 +145,10 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
 
             badgeValues.label = label ?? "";
             switch (state) {
+                case 0:
+                    badgeValues.color = downColor;
+                    badgeValues.message = downLabel;
+                    break;
                 case 1:
                     badgeValues.color = upColor;
                     badgeValues.message = upLabel;
@@ -153,10 +157,6 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
                     badgeValues.color = maintenanceColor;
                     badgeValues.message = maintenanceLabel;
                     break;
-                case 0:
-                    badgeValues.color = downColor;
-                    badgeValues.message = downLabel;
-                    break;
                 default:
                     badgeValues.color = badgeConstants.naColor;
                     badgeValues.message = "N/A";

From ecd661c8016309646a3c93ec0ee7cd5ee33827b6 Mon Sep 17 00:00:00 2001
From: Luke <35193662+PopcornPanda@users.noreply.github.com>
Date: Wed, 11 Jan 2023 12:06:09 +0100
Subject: [PATCH 432/803] Allow long sms in PromoSMS

---
 server/notification-providers/promosms.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/server/notification-providers/promosms.js b/server/notification-providers/promosms.js
index 4f7e8f90..a9e7631e 100644
--- a/server/notification-providers/promosms.js
+++ b/server/notification-providers/promosms.js
@@ -20,6 +20,7 @@ class PromoSMS extends NotificationProvider {
                 "recipients": [ notification.promosmsPhoneNumber ],
                 //Lets remove non ascii char
                 "text": msg.replace(/[^\x00-\x7F]/g, ""),
+                "long-sms": true,
                 "type": Number(notification.promosmsSMSType),
                 "sender": notification.promosmsSenderName
             };

From 2172112144fc5d66255c5edfc628b51bb6097a8b Mon Sep 17 00:00:00 2001
From: Luke <35193662+PopcornPanda@users.noreply.github.com>
Date: Wed, 11 Jan 2023 12:13:47 +0100
Subject: [PATCH 433/803] Setting for allowing long sms

---
 server/notification-providers/promosms.js | 2 +-
 src/components/notifications/PromoSMS.vue | 4 ++++
 src/languages/en.js                       | 1 +
 src/languages/pl.js                       | 1 +
 4 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/server/notification-providers/promosms.js b/server/notification-providers/promosms.js
index a9e7631e..6992171b 100644
--- a/server/notification-providers/promosms.js
+++ b/server/notification-providers/promosms.js
@@ -20,7 +20,7 @@ class PromoSMS extends NotificationProvider {
                 "recipients": [ notification.promosmsPhoneNumber ],
                 //Lets remove non ascii char
                 "text": msg.replace(/[^\x00-\x7F]/g, ""),
-                "long-sms": true,
+                "long-sms": notification.promosmsAllowLong,
                 "type": Number(notification.promosmsSMSType),
                 "sender": notification.promosmsSenderName
             };
diff --git a/src/components/notifications/PromoSMS.vue b/src/components/notifications/PromoSMS.vue
index 03c02222..9fe9c217 100644
--- a/src/components/notifications/PromoSMS.vue
+++ b/src/components/notifications/PromoSMS.vue
@@ -26,6 +26,10 @@
         <label for="promosms-sender-name" class="form-label">{{ $t("promosmsSMSSender") }}</label>
         <input id="promosms-sender-name" v-model="$parent.notification.promosmsSenderName" type="text" minlength="3" maxlength="11" class="form-control">
     </div>
+    <div class="mb-3">
+        <label for="promosms-allow-long" class="form-label">{{ $t("promosmsAllowLong") }}</label>
+        <input id="promosms-allow-long" v-model="$parent.notification.promosmsAllowLong" type="checkbox" class="form-control" checked>
+    </div>
 </template>
 
 <script>
diff --git a/src/languages/en.js b/src/languages/en.js
index 7a48d0d0..52803abb 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -320,6 +320,7 @@ export default {
     promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
     promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
     promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    promosmsAllowLong: "Allow long messages",
     "Feishu WebHookUrl": "Feishu WebHookURL",
     matrixHomeserverURL: "Homeserver URL (with http(s):// and optionally port)",
     "Internal Room Id": "Internal Room ID",
diff --git a/src/languages/pl.js b/src/languages/pl.js
index 04a74997..35f5320e 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -284,6 +284,7 @@ export default {
     promosmsTypeSpeed: "SMS SPEED - wysyłka priorytetowa, ma wszystkie zalety SMS FULL",
     promosmsPhoneNumber: "Numer odbiorcy",
     promosmsSMSSender: "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)",
+    promosmsAllowLong: "Zezwól na długie wiadomości",
     "Primary Base URL": "Główny URL",
     "Push URL": "Push URL",
     needPushEvery: "Powinieneś wywoływać ten URL co {0} sekund",

From 2bc165379a299a87001bd84d3647cc70d2297106 Mon Sep 17 00:00:00 2001
From: David Twigger <david.twigger@raisepartner.com>
Date: Wed, 11 Jan 2023 13:28:30 +0100
Subject: [PATCH 434/803] Add unit test for hostNameRegexPattern

---
 test/cypress/unit/util-frontend.spec.js | 33 +++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 test/cypress/unit/util-frontend.spec.js

diff --git a/test/cypress/unit/util-frontend.spec.js b/test/cypress/unit/util-frontend.spec.js
new file mode 100644
index 00000000..6abedf82
--- /dev/null
+++ b/test/cypress/unit/util-frontend.spec.js
@@ -0,0 +1,33 @@
+import { hostNameRegexPattern } from "../../../src/util-frontend";
+
+describe("Test util-frontend.js", () => {
+
+    describe("hostNameRegexPattern()", () => {
+        it('should return a valid regex for non mqtt hostnames', () => {
+            const regex = new RegExp(hostNameRegexPattern(false));
+
+            expect(regex.test("www.test.com")).to.be.true;
+            expect(regex.test("127.0.0.1")).to.be.true;
+            expect(regex.test("192.168.1.156")).to.be.true;
+            
+            ["mqtt", "mqtts", "ws", "wss"].forEach(schema => {
+                expect(regex.test(`${schema}://www.test.com`)).to.be.false;
+                expect(regex.test(`${schema}://127.0.0.1`)).to.be.false;
+            });
+        });
+        it('should return a valid regex for mqtt hostnames', () => {
+            const hostnameString = hostNameRegexPattern(false);
+            console.log('*********', hostnameString, '***********');
+            const regex = new RegExp(hostNameRegexPattern(true));
+
+            expect(regex.test("www.test.com")).to.be.true;
+            expect(regex.test("127.0.0.1")).to.be.true;
+            expect(regex.test("192.168.1.156")).to.be.true;
+            
+            ["mqtt", "mqtts", "ws", "wss"].forEach(schema => {
+                expect(regex.test(`${schema}://www.test.com`)).to.be.true;
+                expect(regex.test(`${schema}://127.0.0.1`)).to.be.true;
+            });
+        });
+    });
+});
\ No newline at end of file

From ec30147a7ffc459c0adc360cefe5d7a85c68e69b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Szczepa=C5=84ski?=
 <lukasz.szczepanski@speednet.pl>
Date: Wed, 11 Jan 2023 14:32:57 +0100
Subject: [PATCH 435/803] Add option for allowing long sms in PromoSMS

---
 server/notification-providers/promosms.js | 6 +++++-
 src/components/notifications/PromoSMS.vue | 6 +++---
 src/languages/en.js                       | 2 +-
 src/languages/pl.js                       | 2 +-
 4 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/server/notification-providers/promosms.js b/server/notification-providers/promosms.js
index 6992171b..05db6129 100644
--- a/server/notification-providers/promosms.js
+++ b/server/notification-providers/promosms.js
@@ -8,6 +8,10 @@ class PromoSMS extends NotificationProvider {
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
 
+        if (notification.promosmsAllowLongSMS === undefined) {
+            notification.promosmsAllowLongSMS = false
+        }
+
         try {
             let config = {
                 headers: {
@@ -20,7 +24,7 @@ class PromoSMS extends NotificationProvider {
                 "recipients": [ notification.promosmsPhoneNumber ],
                 //Lets remove non ascii char
                 "text": msg.replace(/[^\x00-\x7F]/g, ""),
-                "long-sms": notification.promosmsAllowLong,
+                "long-sms": notification.promosmsAllowLongSMS,
                 "type": Number(notification.promosmsSMSType),
                 "sender": notification.promosmsSenderName
             };
diff --git a/src/components/notifications/PromoSMS.vue b/src/components/notifications/PromoSMS.vue
index 9fe9c217..15ed241b 100644
--- a/src/components/notifications/PromoSMS.vue
+++ b/src/components/notifications/PromoSMS.vue
@@ -26,9 +26,9 @@
         <label for="promosms-sender-name" class="form-label">{{ $t("promosmsSMSSender") }}</label>
         <input id="promosms-sender-name" v-model="$parent.notification.promosmsSenderName" type="text" minlength="3" maxlength="11" class="form-control">
     </div>
-    <div class="mb-3">
-        <label for="promosms-allow-long" class="form-label">{{ $t("promosmsAllowLong") }}</label>
-        <input id="promosms-allow-long" v-model="$parent.notification.promosmsAllowLong" type="checkbox" class="form-control" checked>
+    <div class="form-check form-switch">
+        <input id="promosms-allow-long" v-model="$parent.notification.promosmsAllowLongSMS" type="checkbox" class="form-check-input">
+        <label for="promosms-allow-long" class="form-label">{{ $t("promosmsAllowLongSMS") }}</label>
     </div>
 </template>
 
diff --git a/src/languages/en.js b/src/languages/en.js
index 52803abb..9c19c2da 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -320,7 +320,7 @@ export default {
     promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
     promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
     promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    promosmsAllowLong: "Allow long messages",
+    promosmsAllowLongSMS: "Allow long SMS",
     "Feishu WebHookUrl": "Feishu WebHookURL",
     matrixHomeserverURL: "Homeserver URL (with http(s):// and optionally port)",
     "Internal Room Id": "Internal Room ID",
diff --git a/src/languages/pl.js b/src/languages/pl.js
index 35f5320e..beef5df5 100644
--- a/src/languages/pl.js
+++ b/src/languages/pl.js
@@ -284,7 +284,7 @@ export default {
     promosmsTypeSpeed: "SMS SPEED - wysyłka priorytetowa, ma wszystkie zalety SMS FULL",
     promosmsPhoneNumber: "Numer odbiorcy",
     promosmsSMSSender: "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)",
-    promosmsAllowLong: "Zezwól na długie wiadomości",
+    promosmsAllowLongSMS: "Zezwól na długie SMSy",
     "Primary Base URL": "Główny URL",
     "Push URL": "Push URL",
     needPushEvery: "Powinieneś wywoływać ten URL co {0} sekund",

From 56ba133a1f80ed42c3319c737f1537d260551107 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Szczepa=C5=84ski?=
 <lukasz.szczepanski@speednet.pl>
Date: Wed, 11 Jan 2023 14:36:33 +0100
Subject: [PATCH 436/803] Missing semicolon

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

diff --git a/server/notification-providers/promosms.js b/server/notification-providers/promosms.js
index 05db6129..3ab94169 100644
--- a/server/notification-providers/promosms.js
+++ b/server/notification-providers/promosms.js
@@ -9,7 +9,7 @@ class PromoSMS extends NotificationProvider {
         let okMsg = "Sent Successfully.";
 
         if (notification.promosmsAllowLongSMS === undefined) {
-            notification.promosmsAllowLongSMS = false
+            notification.promosmsAllowLongSMS = false;
         }
 
         try {

From d9f12a6376804e269fcf0d665859f090d0b5575f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 12 Jan 2023 01:04:58 +0800
Subject: [PATCH 437/803] Fallback to `/bin/ping` if `ping` is not found

---
 package-lock.json     | 50 ++++++++++++++++++++++---------------------
 package.json          |  2 +-
 server/util-server.js |  2 +-
 3 files changed, 28 insertions(+), 26 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 7e88d126..3fed4f5b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,15 +1,16 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.3",
+    "version": "1.19.4",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.3",
+            "version": "1.19.4",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
+                "@louislam/ping": "~0.4.2-mod.0",
                 "@louislam/sqlite3": "15.1.2",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
@@ -48,7 +49,6 @@
                 "password-hash": "~1.2.2",
                 "pg": "~8.8.0",
                 "pg-connection-string": "~2.5.0",
-                "ping": "~0.4.2",
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
                 "protobufjs": "~7.1.1",
@@ -3161,6 +3161,19 @@
             "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.1.tgz",
             "integrity": "sha512-oTFmkyv5MhgkHdZhoe5lwRoKW0t4njPvK3g7ODvK/prkoC5bwylKcyQJMsmjvgHBXoy4u5iLnB5yQ7AljouHAA=="
         },
+        "node_modules/@louislam/ping": {
+            "version": "0.4.2-mod.0",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.0.tgz",
+            "integrity": "sha512-cyHnJHsMkC+sFU32GBzX5SlwdTb+BIBlwsdwsDm+AS9jcS1sz7JPBrdCStqpNkVn5lUUQZ7Ak5DRwlWuwJOYAg==",
+            "dependencies": {
+                "command-exists": "~1.2.9",
+                "q": "1.x",
+                "underscore": "^1.12.0"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
         "node_modules/@louislam/sqlite3": {
             "version": "15.1.2",
             "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-15.1.2.tgz",
@@ -13502,18 +13515,6 @@
                 "node": ">=0.10.0"
             }
         },
-        "node_modules/ping": {
-            "version": "0.4.2",
-            "resolved": "https://registry.npmjs.org/ping/-/ping-0.4.2.tgz",
-            "integrity": "sha512-1uAw0bzHtrPbPo2s6no06oZAzY6KqKclEJR1JRZKIHKXKlPdrz9N0/1MPPB+BbrvMjN3Mk0pcod3bfLNZFRo9w==",
-            "dependencies": {
-                "q": "1.x",
-                "underscore": "^1.12.0"
-            },
-            "engines": {
-                "node": ">=4.0.0"
-            }
-        },
         "node_modules/pirates": {
             "version": "4.0.5",
             "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
@@ -19462,6 +19463,16 @@
             "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.1.tgz",
             "integrity": "sha512-oTFmkyv5MhgkHdZhoe5lwRoKW0t4njPvK3g7ODvK/prkoC5bwylKcyQJMsmjvgHBXoy4u5iLnB5yQ7AljouHAA=="
         },
+        "@louislam/ping": {
+            "version": "0.4.2-mod.0",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.0.tgz",
+            "integrity": "sha512-cyHnJHsMkC+sFU32GBzX5SlwdTb+BIBlwsdwsDm+AS9jcS1sz7JPBrdCStqpNkVn5lUUQZ7Ak5DRwlWuwJOYAg==",
+            "requires": {
+                "command-exists": "~1.2.9",
+                "q": "1.x",
+                "underscore": "^1.12.0"
+            }
+        },
         "@louislam/sqlite3": {
             "version": "15.1.2",
             "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-15.1.2.tgz",
@@ -27316,15 +27327,6 @@
             "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
             "dev": true
         },
-        "ping": {
-            "version": "0.4.2",
-            "resolved": "https://registry.npmjs.org/ping/-/ping-0.4.2.tgz",
-            "integrity": "sha512-1uAw0bzHtrPbPo2s6no06oZAzY6KqKclEJR1JRZKIHKXKlPdrz9N0/1MPPB+BbrvMjN3Mk0pcod3bfLNZFRo9w==",
-            "requires": {
-                "q": "1.x",
-                "underscore": "^1.12.0"
-            }
-        },
         "pirates": {
             "version": "4.0.5",
             "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
diff --git a/package.json b/package.json
index adc44df9..8093bec5 100644
--- a/package.json
+++ b/package.json
@@ -67,6 +67,7 @@
     },
     "dependencies": {
         "@grpc/grpc-js": "~1.7.3",
+        "@louislam/ping": "~0.4.2-mod.0",
         "@louislam/sqlite3": "15.1.2",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",
@@ -105,7 +106,6 @@
         "password-hash": "~1.2.2",
         "pg": "~8.8.0",
         "pg-connection-string": "~2.5.0",
-        "ping": "~0.4.2",
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
         "protobufjs": "~7.1.1",
diff --git a/server/util-server.js b/server/util-server.js
index 4a30017a..60d8baac 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -1,5 +1,5 @@
 const tcpp = require("tcp-ping");
-const ping = require("ping");
+const ping = require("@louislam/ping");
 const { R } = require("redbean-node");
 const { log, genSecret } = require("../src/util");
 const passwordHash = require("./password-hash");

From 0ed3dd5e4fd8e33ef2d1d579e1b9d882ce4f09c3 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Thu, 12 Jan 2023 04:14:46 +0800
Subject: [PATCH 438/803] Fix: Add support for pending in badges

---
 server/config.js             | 1 +
 server/routers/api-router.js | 6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/server/config.js b/server/config.js
index 398ddbb1..0523e707 100644
--- a/server/config.js
+++ b/server/config.js
@@ -5,6 +5,7 @@ const badgeConstants = {
     naColor: "#999",
     defaultUpColor: "#66c20a",
     defaultDownColor: "#c2290a",
+    defaultPendingColor: "#f8a306",
     defaultMaintenanceColor: "#1747f5",
     defaultPingColor: "blue",  // as defined by badge-maker / shields.io
     defaultStyle: "flat",
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index f2e0874e..6001d58e 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -111,9 +111,11 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
         label,
         upLabel = "Up",
         downLabel = "Down",
+        pendingLabel = "Pending",
         maintenanceLabel = "Maintenance",
         upColor = badgeConstants.defaultUpColor,
         downColor = badgeConstants.defaultDownColor,
+        pendingColor = badgeConstants.defaultPendingColor,
         maintenanceColor = badgeConstants.defaultMaintenanceColor,
         style = badgeConstants.defaultStyle,
         value, // for demo purpose only
@@ -153,6 +155,10 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
                     badgeValues.color = upColor;
                     badgeValues.message = upLabel;
                     break;
+                case 2:
+                    badgeValues.color = pendingColor;
+                    badgeValues.message = pendingLabel;
+                    break;
                 case 3:
                     badgeValues.color = maintenanceColor;
                     badgeValues.message = maintenanceLabel;

From 8433bceb32fc6e5cfc040802cb8332a22e5f0c11 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Szczepa=C5=84ski?=
 <lukasz.szczepanski@speednet.pl>
Date: Thu, 12 Jan 2023 08:14:31 +0100
Subject: [PATCH 439/803] Trim message to maximum allowed length

---
 server/notification-providers/promosms.js | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/server/notification-providers/promosms.js b/server/notification-providers/promosms.js
index 3ab94169..572a2132 100644
--- a/server/notification-providers/promosms.js
+++ b/server/notification-providers/promosms.js
@@ -12,6 +12,10 @@ class PromoSMS extends NotificationProvider {
             notification.promosmsAllowLongSMS = false;
         }
 
+        //TODO: Add option for enabling special characters. It will decrese message max length from 160 to 70 chars.
+        //Lets remove non ascii char
+        let cleanMsg = msg.replace(/[^\x00-\x7F]/g, "");
+
         try {
             let config = {
                 headers: {
@@ -22,8 +26,8 @@ class PromoSMS extends NotificationProvider {
             };
             let data = {
                 "recipients": [ notification.promosmsPhoneNumber ],
-                //Lets remove non ascii char
-                "text": msg.replace(/[^\x00-\x7F]/g, ""),
+                //Trim message to maximum length of 1 SMS or 4 if we allowed long messages
+                "text": notification.promosmsAllowLongSMS ? cleanMsg.substring(0, 639) : cleanMsg.substring(0, 159),
                 "long-sms": notification.promosmsAllowLongSMS,
                 "type": Number(notification.promosmsSMSType),
                 "sender": notification.promosmsSenderName

From b91fe9d96d1b8be9f6abbb241432d53fd9b61247 Mon Sep 17 00:00:00 2001
From: shyneko <tminei@ukr.net>
Date: Thu, 12 Jan 2023 15:09:05 +0200
Subject: [PATCH 440/803] Added a more telegram options such as thread id,
 silent notifications and forward protect

---
 server/notification-providers/telegram.js | 17 +++++++++---
 src/components/notifications/Telegram.vue | 34 +++++++++++++++++++++++
 src/languages/en.js                       |  6 ++++
 3 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/server/notification-providers/telegram.js b/server/notification-providers/telegram.js
index 2b057622..9c8f5750 100644
--- a/server/notification-providers/telegram.js
+++ b/server/notification-providers/telegram.js
@@ -9,11 +9,20 @@ class Telegram extends NotificationProvider {
         let okMsg = "Sent Successfully.";
 
         try {
+            const paramsObj =
+            {
+                chat_id: notification.telegramChatID,
+                text: msg,
+                disable_notification: notification.telegramSilentNotification ?? false,
+                protect_content: notification.telegramProtectContent ?? false,
+
+            };
+            // if telegramChatThread specified, then add it to paramsObj
+            if (notification.telegramChatThread && notification.telegramChatThread.length > 0) {
+                paramsObj.message_thread_id = notification.telegramChatThread;
+            }
             await axios.get(`https://api.telegram.org/bot${notification.telegramBotToken}/sendMessage`, {
-                params: {
-                    chat_id: notification.telegramChatID,
-                    text: msg,
-                },
+                params: paramsObj
             });
             return okMsg;
 
diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 9daf31ac..9b373b99 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -29,6 +29,40 @@
             </p>
         </div>
     </div>
+
+    <div class="mb-3">
+        <label for="telegram-chat-thread" class="form-label">{{ $t("Thread ID") }}</label>
+
+        <div class="input-group mb-3">
+            <input id="telegram-chat-thread" v-model="$parent.notification.telegramChatThread" type="text" class="form-control" required>
+        </div>
+
+       <div class="form-text">
+            {{ $t("Thread ID Description") }}
+        </div>
+    </div>
+
+    <div class="mb-3">
+         <div class="form-check form-switch">
+            <input v-model="$parent.notification.telegramSilentNotification" class="form-check-input" type="checkbox">
+            <label class="form-check-label">{{ $t("Silent Notification") }}</label>
+        </div>
+
+        <div class="form-text">
+            {{ $t("Silent Notification Description") }}
+        </div>
+    </div>
+
+    <div class="mb-3">
+         <div class="form-check form-switch">
+            <input v-model="$parent.notification.telegramProtectContent" class="form-check-input" type="checkbox">
+            <label class="form-check-label">{{ $t("Protect Forwarding") }}</label>
+        </div>
+
+        <div class="form-text">
+            {{ $t("Protect Forwarding Description") }}
+        </div>
+    </div>
 </template>
 
 <script>
diff --git a/src/languages/en.js b/src/languages/en.js
index 7a48d0d0..f09212b8 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -216,6 +216,12 @@ export default {
     supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
     wayToGetTelegramChatID: "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
     "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+    "Silent Notification": "Silent Notification",
+    "Silent Notification Description": "If enabled, the notification in Telegram will be without sound.",
+    "Protect Forwarding": "Protect Forwarding",
+    "Protect Forwarding Description": "If enabled, the notification in Telegram will be protected from forwarding and saving.",
+    "Thread ID": "Thread ID (optional)",
+    "Thread ID Description": "Since November 5 2022, bots can send messages to a specific thread. You can get the thread ID by clicking on the thread name in the chat.",
     chatIDNotFound: "Chat ID is not found; please send a message to this bot first",
     webhook: "Webhook",
     "Post URL": "Post URL",

From 521356e38a2a9386c1f981c3b56c0e2e22312de1 Mon Sep 17 00:00:00 2001
From: shyneko <tminei@ukr.net>
Date: Thu, 12 Jan 2023 15:21:56 +0200
Subject: [PATCH 441/803] LINT fixes

---
 src/components/notifications/Telegram.vue | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 9b373b99..7a1e659e 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -37,13 +37,13 @@
             <input id="telegram-chat-thread" v-model="$parent.notification.telegramChatThread" type="text" class="form-control" required>
         </div>
 
-       <div class="form-text">
+        <div class="form-text">
             {{ $t("Thread ID Description") }}
         </div>
     </div>
 
     <div class="mb-3">
-         <div class="form-check form-switch">
+        <div class="form-check form-switch">
             <input v-model="$parent.notification.telegramSilentNotification" class="form-check-input" type="checkbox">
             <label class="form-check-label">{{ $t("Silent Notification") }}</label>
         </div>
@@ -54,7 +54,7 @@
     </div>
 
     <div class="mb-3">
-         <div class="form-check form-switch">
+        <div class="form-check form-switch">
             <input v-model="$parent.notification.telegramProtectContent" class="form-check-input" type="checkbox">
             <label class="form-check-label">{{ $t("Protect Forwarding") }}</label>
         </div>

From e9564619f1c756aeb436a1e08d8267183cd46ff9 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Thu, 26 May 2022 16:52:18 +0800
Subject: [PATCH 442/803] Feat: Implement tags manager in settings

Fix: Remove unused color options

Chore: Fix typo
---
 server/server.js                 |  10 +-
 src/assets/localization.scss     |   6 +-
 src/components/Tag.vue           |   2 +-
 src/components/TagEditDialog.vue | 377 +++++++++++++++++++++++++++++++
 src/components/TagsManager.vue   |  20 +-
 src/components/settings/Tags.vue | 171 ++++++++++++++
 src/languages/en.js              |   3 +
 src/pages/Settings.vue           |   3 +
 src/router.js                    |   5 +
 src/util-frontend.js             |  26 +++
 10 files changed, 602 insertions(+), 21 deletions(-)
 create mode 100644 src/components/TagEditDialog.vue
 create mode 100644 src/components/settings/Tags.vue

diff --git a/server/server.js b/server/server.js
index 5473cecd..f43008e2 100644
--- a/server/server.js
+++ b/server/server.js
@@ -941,13 +941,21 @@ let needSetup = false;
             try {
                 checkLogin(socket);
 
-                let bean = await R.findOne("monitor", " id = ? ", [ tag.id ]);
+                let bean = await R.findOne("tag", " id = ? ", [ tag.id ]);
+                if (bean == null) {
+                    callback({
+                        ok: false,
+                        msg: "Tag not found",
+                    });
+                    return;
+                }
                 bean.name = tag.name;
                 bean.color = tag.color;
                 await R.store(bean);
 
                 callback({
                     ok: true,
+                    msg: "Saved",
                     tag: await bean.toJSON(),
                 });
 
diff --git a/src/assets/localization.scss b/src/assets/localization.scss
index f9a28d8a..97be3778 100644
--- a/src/assets/localization.scss
+++ b/src/assets/localization.scss
@@ -2,4 +2,8 @@ html[lang='fa'] {
     #app {
         font-family: 'IRANSans', 'Iranian Sans','B Nazanin', 'Tahoma', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, noto color emoji;
     }
-}
\ No newline at end of file
+}
+
+ul.multiselect__content {
+    padding-left: 0 !important;
+}
diff --git a/src/components/Tag.vue b/src/components/Tag.vue
index 0325d990..cbbe0b79 100644
--- a/src/components/Tag.vue
+++ b/src/components/Tag.vue
@@ -41,7 +41,7 @@ export default {
     },
     computed: {
         displayText() {
-            if (this.item.value === "") {
+            if (this.item.value === "" || this.item.value === undefined) {
                 return this.item.name;
             } else {
                 return `${this.item.name}: ${this.item.value}`;
diff --git a/src/components/TagEditDialog.vue b/src/components/TagEditDialog.vue
new file mode 100644
index 00000000..182efcbf
--- /dev/null
+++ b/src/components/TagEditDialog.vue
@@ -0,0 +1,377 @@
+<template>
+    <form @submit.prevent="submit">
+        <div ref="modal" class="modal fade" tabindex="-1" data-bs-backdrop="static">
+            <div class="modal-dialog">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 id="exampleModalLabel" class="modal-title">
+                            {{ $t("Edit Tag") }}
+                        </h5>
+                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" />
+                    </div>
+                    <div class="modal-body">
+                        <div class="mb-3">
+                            <label for="tag-name" class="form-label">{{ $t("Name") }}</label>
+                            <input id="tag-name" v-model="tag.name" type="text" class="form-control" required>
+                        </div>
+
+                        <div class="mb-3">
+                            <label for="tag-color" class="form-label">{{ $t("Color") }}</label>
+                            <div class="d-flex">
+                                <div class="col-8 pe-1">
+                                    <vue-multiselect
+                                        v-model="selectedColor"
+                                        :options="colorOptions"
+                                        :multiple="false"
+                                        :searchable="true"
+                                        :placeholder="$t('color')"
+                                        track-by="color"
+                                        label="name"
+                                        select-label=""
+                                        deselect-label=""
+                                    >
+                                        <template #option="{ option }">
+                                            <div
+                                                class="mx-2 py-1 px-3 rounded d-inline-flex"
+                                                style="height: 24px; color: white;"
+                                                :style="{ backgroundColor: option.color + ' !important' }"
+                                            >
+                                                <span>{{ option.name }}</span>
+                                            </div>
+                                        </template>
+                                        <template #singleLabel="{ option }">
+                                            <div
+                                                class="py-1 px-3 rounded d-inline-flex"
+                                                style="height: 24px; color: white;"
+                                                :style="{ backgroundColor: option.color + ' !important' }"
+                                            >
+                                                <span>{{ option.name }}</span>
+                                            </div>
+                                        </template>
+                                    </vue-multiselect>
+                                </div>
+                                <div class="col-4 ps-1">
+                                    <input id="tag-color-hex" v-model="tag.color" type="text" class="form-control">
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="mb-3">
+                            <label for="tag-monitors" class="form-label">{{ $tc("Monitor", selectedMonitors.length) }}</label>
+                            <div class="tag-monitors-list">
+                                <router-link v-for="monitor in selectedMonitors" :key="monitor.id" class="d-flex align-items-center justify-content-between text-decoration-none tag-monitors-list-row py-2 px-3" :to="monitorURL(monitor.id)" @click="modal.hide()">
+                                    <span>{{ monitor.name }}</span>
+                                    <button type="button" class="btn-rm-monitor btn btn-outline-danger ms-2 py-1" @click.stop.prevent="removeMonitor(monitor.id)">
+                                        <font-awesome-icon class="" icon="times" />
+                                    </button>
+                                </router-link>
+                            </div>
+                            <div v-if="allMonitorList.length > 0" class="pt-3 px-3">
+                                <label class="form-label">{{ $t("Add a monitor") }}:</label>
+                                <select v-model="selectedAddMonitor" class="form-control">
+                                    <option v-for="monitor in allMonitorList" :key="monitor.id" :value="monitor">{{ monitor.name }}</option>
+                                </select>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="modal-footer">
+                        <button v-if="tag" type="button" class="btn btn-danger" :disabled="processing" @click="deleteConfirm">
+                            {{ $t("Delete") }}
+                        </button>
+                        <button type="submit" class="btn btn-primary" :disabled="processing">
+                            <div v-if="processing" class="spinner-border spinner-border-sm me-1"></div>
+                            {{ $t("Save") }}
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </form>
+
+    <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteTag">
+        {{ $t("confirmDeleteTagMsg") }}
+    </Confirm>
+</template>
+
+<script>
+import { Modal } from "bootstrap";
+import Confirm from "./Confirm.vue";
+import VueMultiselect from "vue-multiselect";
+import { colorOptions } from "../util-frontend";
+import { useToast } from "vue-toastification";
+import { getMonitorRelativeURL } from "../util.ts";
+const toast = useToast();
+
+export default {
+    components: {
+        VueMultiselect,
+        Confirm,
+    },
+    props: {
+        updated: {
+            type: Function,
+            default: () => {},
+        }
+    },
+    data() {
+        return {
+            modal: null,
+            processing: false,
+            selectedColor: {
+                name: null,
+                color: null,
+            },
+            tag: {
+                id: null,
+                name: "",
+                color: "",
+                // Do not set default value here, please scroll to show()
+            },
+            monitors: [],
+            removingMonitor: [],
+            addingMonitor: [],
+            selectedAddMonitor: null,
+        };
+    },
+
+    computed: {
+        colorOptions() {
+            if (!colorOptions(this).find(option => option.color === this.tag.color)) {
+                return colorOptions(this).concat(
+                    {
+                        name: "custom",
+                        color: this.tag.color
+                    });
+            } else {
+                return colorOptions(this);
+            }
+        },
+        selectedMonitors() {
+            return this.monitors
+                .concat(Object.values(this.$root.monitorList).filter(monitor => this.addingMonitor.includes(monitor.id)))
+                .filter(monitor => !this.removingMonitor.includes(monitor.id));
+        },
+        allMonitorList() {
+            return Object.values(this.$root.monitorList).filter(monitor => !this.selectedMonitors.includes(monitor));
+        },
+    },
+
+    watch: {
+        // Set color option to "Custom" when a unknown color is entered
+        "tag.color"(to, from) {
+            if (colorOptions(this).find(x => x.color === to) == null) {
+                this.selectedColor.name = this.$t("Custom");
+                this.selectedColor.color = to;
+            }
+        },
+        selectedColor(to, from) {
+            if (to != null) {
+                this.tag.color = to.color;
+            }
+        },
+        /**
+         * Selected a monitor and add to the list.
+         */
+        selectedAddMonitor(monitor) {
+            if (monitor) {
+                if (this.removingMonitor.includes(monitor.id)) {
+                    this.removingMonitor = this.removingMonitor.filter(id => id !== monitor.id);
+                } else {
+                    this.addingMonitor.push(monitor.id);
+                }
+                this.selectedAddMonitor = null;
+            }
+        },
+    },
+
+    mounted() {
+        this.modal = new Modal(this.$refs.modal);
+    },
+
+    methods: {
+        /**
+         * Show confirmation for deleting a tag
+         * @returns {void}
+         */
+        deleteConfirm() {
+            this.$refs.confirmDelete.show();
+        },
+
+        /**
+         * Load tag information for display in the edit dialog
+         * @param {Object} tag tag object to edit
+         * @returns {void}
+         */
+        show(tag) {
+            if (tag) {
+                this.selectedColor = this.colorOptions.find(x => x.color === tag.color) ?? {
+                    name: this.$t("Custom"),
+                    color: tag.color
+                };
+                this.tag.id = tag.id;
+                this.tag.name = tag.name;
+                this.tag.color = tag.color;
+                this.monitors = this.monitorsByTag(tag.id);
+                this.removingMonitor = [];
+                this.addingMonitor = [];
+                this.selectedAddMonitor = null;
+            }
+
+            this.modal.show();
+        },
+
+        /**
+         * Submit tag and monitorTag changes to server
+         * @returns {void}
+         */
+        async submit() {
+            this.processing = true;
+            let editResult = true;
+
+            for (let addId of this.addingMonitor) {
+                await this.addMonitorTagAsync(this.tag.id, addId, "").then((res) => {
+                    if (!res.ok) {
+                        toast.error(res.msg);
+                        editResult = false;
+                    }
+                });
+            }
+
+            for (let removeId of this.removingMonitor) {
+                this.monitors.find(monitor => monitor.id === removeId)?.tags.forEach(async (monitorTag) => {
+                    await this.deleteMonitorTagAsync(this.tag.id, removeId, monitorTag.value).then((res) => {
+                        if (!res.ok) {
+                            toast.error(res.msg);
+                            editResult = false;
+                        }
+                    });
+                });
+            }
+
+            this.$root.getSocket().emit("editTag", this.tag, (res) => {
+                this.$root.toastRes(res);
+                this.processing = false;
+
+                if (res.ok && editResult) {
+                    this.updated();
+                    this.modal.hide();
+                }
+            });
+        },
+
+        /**
+         * Delete the editing tag from server
+         * @returns {void}
+         */
+        deleteTag() {
+            this.processing = true;
+            this.$root.getSocket().emit("deleteTag", this.tag.id, (res) => {
+                this.$root.toastRes(res);
+                this.processing = false;
+
+                if (res.ok) {
+                    this.updated();
+                    this.modal.hide();
+                }
+            });
+        },
+
+        /**
+         * Remove a monitor from the monitors list locally
+         * @param {number} id id of the tag to remove
+         * @returns {void}
+         */
+        removeMonitor(id) {
+            if (this.addingMonitor.includes(id)) {
+                this.addingMonitor = this.addingMonitor.filter(x => x !== id);
+            } else {
+                this.removingMonitor.push(id);
+            }
+        },
+
+        /**
+         * Get monitors which has a specific tag locally
+         * @param {number} tagId id of the tag to filter
+         * @returns {Object[]} list of monitors which has a specific tag
+         */
+        monitorsByTag(tagId) {
+            return Object.values(this.$root.monitorList).filter((monitor) => {
+                return monitor.tags.find(monitorTag => monitorTag.tag_id === tagId);
+            });
+        },
+
+        /**
+         * Get URL of monitor
+         * @param {number} id ID of monitor
+         * @returns {string} Relative URL of monitor
+         */
+        monitorURL(id) {
+            return getMonitorRelativeURL(id);
+        },
+
+        /**
+         * Add a tag to a monitor asynchronously
+         * @param {number} tagId ID of tag to add
+         * @param {number} monitorId ID of monitor to add tag to
+         * @param {string} value Value of tag
+         * @returns {Promise<void>}
+         */
+        addMonitorTagAsync(tagId, monitorId, value) {
+            return new Promise((resolve) => {
+                this.$root.getSocket().emit("addMonitorTag", tagId, monitorId, value, resolve);
+            });
+        },
+        /**
+         * Delete a tag from a monitor asynchronously
+         * @param {number} tagId ID of tag to remove
+         * @param {number} monitorId ID of monitor to remove tag from
+         * @param {string} value Value of tag
+         * @returns {Promise<void>}
+         */
+        deleteMonitorTagAsync(tagId, monitorId, value) {
+            return new Promise((resolve) => {
+                this.$root.getSocket().emit("deleteMonitorTag", tagId, monitorId, value, resolve);
+            });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../assets/vars.scss";
+
+.dark {
+    .modal-dialog .form-text, .modal-dialog p {
+        color: $dark-font-color;
+    }
+}
+
+.btn-rm-monitor {
+    padding-left: 11px;
+    padding-right: 11px;
+}
+
+.tag-monitors-list {
+    max-height: 40vh;
+    overflow-y: scroll;
+}
+
+.tag-monitors-list .tag-monitors-list-row {
+    cursor: pointer;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+
+    .dark & {
+        border-bottom: 1px solid $dark-border-color;
+    }
+
+    &:hover {
+        background-color: $highlight-white;
+    }
+
+    .dark &:hover {
+        background-color: $dark-bg2;
+    }
+}
+
+</style>
diff --git a/src/components/TagsManager.vue b/src/components/TagsManager.vue
index 8481fdfe..b302cd20 100644
--- a/src/components/TagsManager.vue
+++ b/src/components/TagsManager.vue
@@ -130,6 +130,7 @@
 import { Modal } from "bootstrap";
 import VueMultiselect from "vue-multiselect";
 import { useToast } from "vue-toastification";
+import { colorOptions } from "../util-frontend";
 import Tag from "../components/Tag.vue";
 const toast = useToast();
 
@@ -176,24 +177,7 @@ export default {
             return this.preSelectedTags.concat(this.newTags).filter(tag => !this.deleteTags.find(monitorTag => monitorTag.id === tag.id));
         },
         colorOptions() {
-            return [
-                { name: this.$t("Gray"),
-                    color: "#4B5563" },
-                { name: this.$t("Red"),
-                    color: "#DC2626" },
-                { name: this.$t("Orange"),
-                    color: "#D97706" },
-                { name: this.$t("Green"),
-                    color: "#059669" },
-                { name: this.$t("Blue"),
-                    color: "#2563EB" },
-                { name: this.$t("Indigo"),
-                    color: "#4F46E5" },
-                { name: this.$t("Purple"),
-                    color: "#7C3AED" },
-                { name: this.$t("Pink"),
-                    color: "#DB2777" },
-            ];
+            return colorOptions(this);
         },
         validateDraftTag() {
             let nameInvalid = false;
diff --git a/src/components/settings/Tags.vue b/src/components/settings/Tags.vue
new file mode 100644
index 00000000..347a6ef2
--- /dev/null
+++ b/src/components/settings/Tags.vue
@@ -0,0 +1,171 @@
+<template>
+    <div>
+        <div class="tags-list my-3">
+            <div v-for="(tag, index) in tagsList" :key="tag.id" class="d-flex align-items-center mx-4 py-1 tags-list-row" :disabled="processing" @click="editTag(index)">
+                <div class="col-5 ps-1">
+                    <Tag :item="tag" />
+                </div>
+                <div class="col-5 px-1">
+                    <div>{{ monitorsByTag(tag.id).length }} {{ $tc("Monitor", monitorsByTag(tag.id).length) }}</div>
+                </div>
+                <div class="col-2 pe-3 d-flex justify-content-end">
+                    <button type="button" class="btn ms-2 py-1">
+                        <font-awesome-icon class="" icon="edit" />
+                    </button>
+                    <button type="button" class="btn-rm-tag btn btn-outline-danger ms-2 py-1" :disabled="processing" @click.stop="deleteConfirm(index)">
+                        <font-awesome-icon class="" icon="trash" />
+                    </button>
+                </div>
+            </div>
+        </div>
+
+        <TagEditDialog ref="tagEditDialog" :updated="tagsUpdated" />
+        <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteTag">
+            {{ $t("confirmDeleteTagMsg") }}
+        </Confirm>
+    </div>
+</template>
+
+<script>
+import { useToast } from "vue-toastification";
+import TagEditDialog from "../../components/TagEditDialog.vue";
+import Tag from "../Tag.vue";
+import Confirm from "../Confirm.vue";
+const toast = useToast();
+
+export default {
+    components: {
+        Confirm,
+        TagEditDialog,
+        Tag,
+    },
+
+    data() {
+        return {
+            processing: false,
+            tagsList: null,
+            deletingTag: null,
+        };
+    },
+
+    computed: {
+        settings() {
+            return this.$parent.$parent.$parent.settings;
+        },
+        saveSettings() {
+            return this.$parent.$parent.$parent.saveSettings;
+        },
+        settingsLoaded() {
+            return this.$parent.$parent.$parent.settingsLoaded;
+        },
+    },
+
+    mounted() {
+        this.getExistingTags();
+    },
+
+    methods: {
+        /**
+         * Reflect tag changes in the UI by fetching data. Callback for the edit tag dialog.
+         * @returns {void}
+         */
+        tagsUpdated() {
+            this.getExistingTags();
+            this.$root.getMonitorList();
+        },
+
+        /**
+         * Get list of tags from server
+         * @returns {void}
+         */
+        getExistingTags() {
+            this.processing = true;
+            this.$root.getSocket().emit("getTags", (res) => {
+                this.processing = false;
+                if (res.ok) {
+                    this.tagsList = res.tags;
+                } else {
+                    toast.error(res.msg);
+                }
+            });
+        },
+
+        /**
+         * Show confirmation for deleting a tag
+         * @param {number} index index of the tag to delete in the local tagsList
+         * @returns {void}
+         */
+        deleteConfirm(index) {
+            this.deletingTag = this.tagsList[index];
+            this.$refs.confirmDelete.show();
+        },
+
+        /**
+         * Show dialog for editing a tag
+         * @param {number} index index of the tag to edit in the local tagsList
+         * @returns {void}
+         */
+        editTag(index) {
+            this.$refs.tagEditDialog.show(this.tagsList[index]);
+        },
+
+        /**
+         * Delete the tag "deletingTag" from server
+         * @returns {void}
+         */
+        deleteTag() {
+            this.processing = true;
+            this.$root.getSocket().emit("deleteTag", this.deletingTag.id, (res) => {
+                this.$root.toastRes(res);
+                this.processing = false;
+
+                if (res.ok) {
+                    this.tagsUpdated();
+                }
+            });
+        },
+
+        /**
+         * Get monitors which has a specific tag locally
+         * @param {number} tagId id of the tag to filter
+         * @returns {Object[]} list of monitors which has a specific tag
+         */
+        monitorsByTag(tagId) {
+            return Object.values(this.$root.monitorList).filter((monitor) => {
+                return monitor.tags.find(monitorTag => monitorTag.tag_id === tagId);
+            });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../assets/vars.scss";
+
+.btn-rm-tag {
+    padding-left: 11px;
+    padding-right: 11px;
+}
+
+.tags-list .tags-list-row {
+    cursor: pointer;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+
+    .dark & {
+        border-bottom: 1px solid $dark-border-color;
+    }
+
+    &:hover {
+        background-color: $highlight-white;
+    }
+
+    .dark &:hover {
+        background-color: $dark-bg2;
+    }
+}
+
+.tags-list .tags-list-row:last-child {
+    border: none;
+}
+
+</style>
diff --git a/src/languages/en.js b/src/languages/en.js
index 7a48d0d0..d3588321 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -74,6 +74,7 @@ export default {
     Current: "Current",
     Uptime: "Uptime",
     "Cert Exp.": "Cert Exp.",
+    Monitor: "Monitor | Monitors",
     day: "day | days",
     "-day": "-day",
     hour: "hour",
@@ -190,6 +191,7 @@ export default {
     Indigo: "Indigo",
     Purple: "Purple",
     Pink: "Pink",
+    Custom: "Custom",
     "Search...": "Search...",
     "Avg. Ping": "Avg. Ping",
     "Avg. Response": "Avg. Response",
@@ -677,4 +679,5 @@ export default {
     "Specific Monitor Type": "Specific Monitor Type",
     dataRetentionTimeError: "Retention period must be 0 or greater",
     infiniteRetention: "Set to 0 for infinite retention.",
+    confirmDeleteTagMsg: "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
 };
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index f2dd3475..f5d32e0e 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -95,6 +95,9 @@ export default {
                 "reverse-proxy": {
                     title: this.$t("Reverse Proxy"),
                 },
+                tags: {
+                    title: this.$t("Tags"),
+                },
                 "monitor-history": {
                     title: this.$t("Monitor History"),
                 },
diff --git a/src/router.js b/src/router.js
index 38048826..b5b46c30 100644
--- a/src/router.js
+++ b/src/router.js
@@ -24,6 +24,7 @@ import Appearance from "./components/settings/Appearance.vue";
 import General from "./components/settings/General.vue";
 const Notifications = () => import("./components/settings/Notifications.vue");
 import ReverseProxy from "./components/settings/ReverseProxy.vue";
+import Tags from "./components/settings/Tags.vue";
 import MonitorHistory from "./components/settings/MonitorHistory.vue";
 const Security = () => import("./components/settings/Security.vue");
 import Proxies from "./components/settings/Proxies.vue";
@@ -95,6 +96,10 @@ const routes = [
                                 path: "reverse-proxy",
                                 component: ReverseProxy,
                             },
+                            {
+                                path: "tags",
+                                component: Tags,
+                            },
                             {
                                 path: "monitor-history",
                                 component: MonitorHistory,
diff --git a/src/util-frontend.js b/src/util-frontend.js
index 3323f327..3ff751ff 100644
--- a/src/util-frontend.js
+++ b/src/util-frontend.js
@@ -78,3 +78,29 @@ export function getResBaseURL() {
         return "";
     }
 }
+
+/**
+ * Get the tag color options
+ * Shared between components
+ * @returns {Object[]}
+ */
+export function colorOptions(self) {
+    return [
+        { name: self.$t("Gray"),
+            color: "#4B5563" },
+        { name: self.$t("Red"),
+            color: "#DC2626" },
+        { name: self.$t("Orange"),
+            color: "#D97706" },
+        { name: self.$t("Green"),
+            color: "#059669" },
+        { name: self.$t("Blue"),
+            color: "#2563EB" },
+        { name: self.$t("Indigo"),
+            color: "#4F46E5" },
+        { name: self.$t("Purple"),
+            color: "#7C3AED" },
+        { name: self.$t("Pink"),
+            color: "#DB2777" },
+    ];
+}

From 9c1ba97e7d362cb30eb2c9e70df6ff40fe60477e Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Tue, 3 Jan 2023 12:16:25 +0800
Subject: [PATCH 443/803] Chore: Fix typo

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

diff --git a/src/components/DockerHostDialog.vue b/src/components/DockerHostDialog.vue
index 50ffa49c..193b3012 100644
--- a/src/components/DockerHostDialog.vue
+++ b/src/components/DockerHostDialog.vue
@@ -73,7 +73,7 @@ export default {
     emits: [ "added" ],
     data() {
         return {
-            model: null,
+            modal: null,
             processing: false,
             id: null,
             connectionTypes: [ "socket", "tcp" ],

From 27e0b1eea103060202e79aa0ae2028165d11b006 Mon Sep 17 00:00:00 2001
From: shyneko <tminei@ukr.net>
Date: Thu, 12 Jan 2023 15:52:50 +0200
Subject: [PATCH 444/803] Remove required attribute for optional field

---
 src/components/notifications/Telegram.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 7a1e659e..66bc7e93 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -34,7 +34,7 @@
         <label for="telegram-chat-thread" class="form-label">{{ $t("Thread ID") }}</label>
 
         <div class="input-group mb-3">
-            <input id="telegram-chat-thread" v-model="$parent.notification.telegramChatThread" type="text" class="form-control" required>
+            <input id="telegram-chat-thread" v-model="$parent.notification.telegramChatThread" type="text" class="form-control">
         </div>
 
         <div class="form-text">

From e427c70fef567f6957ab681c550e71fd0f92282c Mon Sep 17 00:00:00 2001
From: shyneko <tminei@ukr.net>
Date: Thu, 12 Jan 2023 16:00:02 +0200
Subject: [PATCH 445/803] Translate fixes

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

diff --git a/src/languages/en.js b/src/languages/en.js
index f09212b8..a1ac41b7 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -219,7 +219,7 @@ export default {
     "Silent Notification": "Silent Notification",
     "Silent Notification Description": "If enabled, the notification in Telegram will be without sound.",
     "Protect Forwarding": "Protect Forwarding",
-    "Protect Forwarding Description": "If enabled, the notification in Telegram will be protected from forwarding and saving.",
+    "Protect Forwarding Description": "If enabled, the bot messages in Telegram will be protected from forwarding and saving.",
     "Thread ID": "Thread ID (optional)",
     "Thread ID Description": "Since November 5 2022, bots can send messages to a specific thread. You can get the thread ID by clicking on the thread name in the chat.",
     chatIDNotFound: "Chat ID is not found; please send a message to this bot first",

From 4dcf31621e36be9af2fc3151fadd18ed51e3fdd7 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 13 Jan 2023 15:34:48 +0800
Subject: [PATCH 446/803] Update README.md

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

diff --git a/README.md b/README.md
index 1f26da8b..b1a0928c 100644
--- a/README.md
+++ b/README.md
@@ -7,9 +7,9 @@
     <img src="./public/icon.svg" width="128" alt="" />
 </div>
 
-It is a self-hosted monitoring tool like "Uptime Robot".
+Uptime Kuma is an easy-to-use self-hosted monitoring tool.
 
-<img src="https://uptime.kuma.pet/img/dark.jpg" width="700" alt="" />
+<img src="https://user-images.githubusercontent.com/1336778/212262296-e6205815-ad62-488c-83ec-a5b0d0689f7c.jpg" width="700" alt="" />
 
 ## 🥔 Live Demo
 

From db757123ba1ae0f41557d4d3a6c41858ef7b9053 Mon Sep 17 00:00:00 2001
From: long2ice <long2ice@gmail.com>
Date: Fri, 13 Jan 2023 16:32:49 +0800
Subject: [PATCH 447/803] refactor: reuse databaseConnectionString

---
 db/patch-redis-monitor.sql | 6 ------
 server/database.js         | 1 -
 server/model/monitor.js    | 3 +--
 src/pages/EditMonitor.vue  | 2 +-
 4 files changed, 2 insertions(+), 10 deletions(-)
 delete mode 100644 db/patch-redis-monitor.sql

diff --git a/db/patch-redis-monitor.sql b/db/patch-redis-monitor.sql
deleted file mode 100644
index e82f24fe..00000000
--- a/db/patch-redis-monitor.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-BEGIN TRANSACTION;
-
-ALTER TABLE monitor
-    ADD redis_connection_string VARCHAR(255);
-
-COMMIT
diff --git a/server/database.js b/server/database.js
index 1ab1f441..2544f197 100644
--- a/server/database.js
+++ b/server/database.js
@@ -66,7 +66,6 @@ class Database {
         "patch-add-radius-monitor.sql": true,
         "patch-monitor-add-resend-interval.sql": true,
         "patch-maintenance-table2.sql": true,
-        "patch-redis-monitor.sql": true,
     };
 
     /**
diff --git a/server/model/monitor.js b/server/model/monitor.js
index 76a18520..db1bca81 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -122,7 +122,6 @@ class Monitor extends BeanModel {
                 basic_auth_pass: this.basic_auth_pass,
                 pushToken: this.pushToken,
                 databaseConnectionString: this.databaseConnectionString,
-                redisConnectionString: this.redisConnectionString,
                 radiusUsername: this.radiusUsername,
                 radiusPassword: this.radiusPassword,
                 radiusSecret: this.radiusSecret,
@@ -623,7 +622,7 @@ class Monitor extends BeanModel {
                 } else if (this.type === "redis") {
                     let startTime = dayjs().valueOf();
 
-                    bean.msg = await redisPingAsync(this.redisConnectionString);
+                    bean.msg = await redisPingAsync(this.databaseConnectionString);
                     bean.status = UP;
                     bean.ping = dayjs().valueOf() - startTime;
                 } else {
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 6ae204ba..b54b0a20 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -274,7 +274,7 @@
                             <template v-if="monitor.type === 'redis'">
                                 <div class="my-3">
                                     <label for="redisConnectionString" class="form-label">{{ $t("Connection String") }}</label>
-                                    <input id="redisConnectionString" v-model="monitor.redisConnectionString" type="text" class="form-control" placeholder="redis://user:password@host:port">
+                                    <input id="redisConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control" placeholder="redis://user:password@host:port">
                                 </div>
                             </template>
                             <!-- Interval -->

From 21cd4d64c353b528bac115a6175664983b0112d2 Mon Sep 17 00:00:00 2001
From: long2ice <long2ice@gmail.com>
Date: Fri, 13 Jan 2023 19:10:07 +0800
Subject: [PATCH 448/803] fix: redisPingAsync

---
 server/util-server.js | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index f3d01b10..c443f859 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -358,14 +358,24 @@ exports.radius = function (
  * Redis server ping
  * @param {string} dsn The redis connection string
  */
-exports.redisPingAsync = async function (dsn) {
-    const client = redis.createClient({
-        url: dsn,
+exports.redisPingAsync = function (dsn) {
+    return new Promise((resolve, reject) => {
+        const client = redis.createClient({
+            url: dsn,
+        });
+        client.on("error", (err) => {
+            reject(err);
+        });
+        client.connect().then(() => {
+            client.ping().then((res, err) => {
+                if (err) {
+                    reject(err);
+                } else {
+                    resolve(res);
+                }
+            });
+        });
     });
-    await client.connect();
-    const pong = await client.ping();
-    await client.disconnect();
-    return pong;
 };
 
 /**

From 3b5893ea60a101059335698073929d4538e08f74 Mon Sep 17 00:00:00 2001
From: long2ice <long2ice@gmail.com>
Date: Fri, 13 Jan 2023 21:30:10 +0800
Subject: [PATCH 449/803] fix: add preserve line in redisPingAsync

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

diff --git a/server/util-server.js b/server/util-server.js
index c443f859..8e1c33cb 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -354,6 +354,7 @@ exports.radius = function (
         ],
     });
 };
+
 /**
  * Redis server ping
  * @param {string} dsn The redis connection string

From 0ef686ac2f61914679be1812762c0cd6e0238bcc Mon Sep 17 00:00:00 2001
From: black23 <black23@gmail.com>
Date: Fri, 13 Jan 2023 14:52:03 +0100
Subject: [PATCH 450/803] Update cs-CZ.js

new string
---
 src/languages/cs-CZ.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
index 99ae9ef0..3396e97b 100644
--- a/src/languages/cs-CZ.js
+++ b/src/languages/cs-CZ.js
@@ -591,7 +591,7 @@ export default {
     "You can divide numbers with": "Čísla můžete dělit pomocí",
     "or": "nebo",
     recurringInterval: "Interval",
-    "Recurring": "Recurring",
+    "Recurring": "Opakující se",
     strategyManual: "Aktivní/Neaktivní Ručně",
     warningTimezone: "Používá se časové pásmo serveru",
     weekdayShortMon: "Po",

From f7d41a30fa7c37e9cc48be3dbf0829ac37e7420d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 13 Jan 2023 23:15:41 +0800
Subject: [PATCH 451/803] Update src/components/TagEditDialog.vue

Co-authored-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/components/TagEditDialog.vue | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/components/TagEditDialog.vue b/src/components/TagEditDialog.vue
index 182efcbf..2f6afbed 100644
--- a/src/components/TagEditDialog.vue
+++ b/src/components/TagEditDialog.vue
@@ -192,7 +192,6 @@ export default {
     methods: {
         /**
          * Show confirmation for deleting a tag
-         * @returns {void}
          */
         deleteConfirm() {
             this.$refs.confirmDelete.show();

From e9497ac1ab66f72fe350521d5fdde307563cbb95 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 14 Jan 2023 20:49:34 +0800
Subject: [PATCH 452/803] Fix knex.js issue

---
 package-lock.json | 308 ++++++++++++----------------------------------
 package.json      |   2 +-
 2 files changed, 79 insertions(+), 231 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3fed4f5b..fbfcebe6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -52,7 +52,7 @@
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
                 "protobufjs": "~7.1.1",
-                "redbean-node": "0.1.4",
+                "redbean-node": "~0.2.0",
                 "socket.io": "~4.5.3",
                 "socket.io-client": "~4.5.3",
                 "socks-proxy-agent": "6.1.1",
@@ -394,12 +394,12 @@
             }
         },
         "node_modules/@azure/msal-node": {
-            "version": "1.14.5",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.5.tgz",
-            "integrity": "sha512-NcVdMfn8Z3ogN+9RjOSF7uwf2Gki5DEJl0BdDSL83KUAgVAobtkZi5W8EqxbJLrTO/ET0jv5DregrcR5qg2pEA==",
+            "version": "1.14.6",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.6.tgz",
+            "integrity": "sha512-em/qqFL5tLMxMPl9vormAs13OgZpmQoJbiQ/GlWr+BA77eCLoL+Ehr5xRHowYo+LFe5b+p+PJVkRvT+mLvOkwA==",
             "dependencies": {
-                "@azure/msal-common": "^9.0.1",
-                "jsonwebtoken": "^8.5.1",
+                "@azure/msal-common": "^9.0.2",
+                "jsonwebtoken": "^9.0.0",
                 "uuid": "^8.3.0"
             },
             "engines": {
@@ -407,42 +407,13 @@
             }
         },
         "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
-            "version": "9.0.1",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.1.tgz",
-            "integrity": "sha512-eNNHIW/cwPTZDWs9KtYgb1X6gtQ+cC+FGX2YN+t4AUVsBdUbqlMTnUs6/c/VBxC2AAGIhgLREuNnO3F66AN2zQ==",
+            "version": "9.0.2",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.2.tgz",
+            "integrity": "sha512-qzwxuF8kZAp+rNUactMCgJh8fblq9D4lSqrrIxMDzLjgSZtjN32ix7r/HBe8QdOr76II9SVVPcMkX4sPzPfQ7w==",
             "engines": {
                 "node": ">=0.8.0"
             }
         },
-        "node_modules/@azure/msal-node/node_modules/jsonwebtoken": {
-            "version": "8.5.1",
-            "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
-            "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
-            "dependencies": {
-                "jws": "^3.2.2",
-                "lodash.includes": "^4.3.0",
-                "lodash.isboolean": "^3.0.3",
-                "lodash.isinteger": "^4.0.4",
-                "lodash.isnumber": "^3.0.3",
-                "lodash.isplainobject": "^4.0.6",
-                "lodash.isstring": "^4.0.1",
-                "lodash.once": "^4.0.0",
-                "ms": "^2.1.1",
-                "semver": "^5.6.0"
-            },
-            "engines": {
-                "node": ">=4",
-                "npm": ">=1.4.28"
-            }
-        },
-        "node_modules/@azure/msal-node/node_modules/semver": {
-            "version": "5.7.1",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-            "bin": {
-                "semver": "bin/semver"
-            }
-        },
         "node_modules/@babel/code-frame": {
             "version": "7.18.6",
             "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -5456,8 +5427,7 @@
         "node_modules/colorette": {
             "version": "2.0.19",
             "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
-            "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
-            "dev": true
+            "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
         },
         "node_modules/combine-errors": {
             "version": "3.0.3",
@@ -8351,7 +8321,6 @@
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
             "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-            "dev": true,
             "engines": {
                 "node": ">=8.0.0"
             }
@@ -8399,9 +8368,9 @@
             }
         },
         "node_modules/getopts": {
-            "version": "2.2.5",
-            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
-            "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
+            "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="
         },
         "node_modules/getos": {
             "version": "3.2.1",
@@ -11670,31 +11639,35 @@
             }
         },
         "node_modules/knex": {
-            "version": "0.95.15",
-            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.15.tgz",
-            "integrity": "sha512-Loq6WgHaWlmL2bfZGWPsy4l8xw4pOE+tmLGkPG0auBppxpI0UcK+GYCycJcqz9W54f2LiGewkCVLBm3Wq4ur/w==",
+            "version": "2.4.0",
+            "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.0.tgz",
+            "integrity": "sha512-i0GWwqYp1Hs2yvc2rlDO6nzzkLhwdyOZKRdsMTB8ZxOs2IXQyL5rBjSbS1krowCh6V65T4X9CJaKtuIfkaPGSA==",
             "dependencies": {
-                "colorette": "2.0.16",
-                "commander": "^7.1.0",
-                "debug": "4.3.2",
+                "colorette": "2.0.19",
+                "commander": "^9.1.0",
+                "debug": "4.3.4",
                 "escalade": "^3.1.1",
                 "esm": "^3.2.25",
-                "getopts": "2.2.5",
+                "get-package-type": "^0.1.0",
+                "getopts": "2.3.0",
                 "interpret": "^2.2.0",
                 "lodash": "^4.17.21",
                 "pg-connection-string": "2.5.0",
-                "rechoir": "0.7.0",
+                "rechoir": "^0.8.0",
                 "resolve-from": "^5.0.0",
-                "tarn": "^3.0.1",
+                "tarn": "^3.0.2",
                 "tildify": "2.0.0"
             },
             "bin": {
                 "knex": "bin/cli.js"
             },
             "engines": {
-                "node": ">=10"
+                "node": ">=12"
             },
             "peerDependenciesMeta": {
+                "better-sqlite3": {
+                    "optional": true
+                },
                 "mysql": {
                     "optional": true
                 },
@@ -11715,40 +11688,14 @@
                 }
             }
         },
-        "node_modules/knex/node_modules/colorette": {
-            "version": "2.0.16",
-            "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
-            "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
-        },
         "node_modules/knex/node_modules/commander": {
-            "version": "7.2.0",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-            "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+            "version": "9.5.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+            "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
             "engines": {
-                "node": ">= 10"
+                "node": "^12.20.0 || >=14"
             }
         },
-        "node_modules/knex/node_modules/debug": {
-            "version": "4.3.2",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-            "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-            "dependencies": {
-                "ms": "2.1.2"
-            },
-            "engines": {
-                "node": ">=6.0"
-            },
-            "peerDependenciesMeta": {
-                "supports-color": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/knex/node_modules/ms": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        },
         "node_modules/knex/node_modules/resolve-from": {
             "version": "5.0.0",
             "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -11913,36 +11860,6 @@
             "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
             "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
         },
-        "node_modules/lodash.includes": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
-            "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
-        },
-        "node_modules/lodash.isboolean": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
-            "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
-        },
-        "node_modules/lodash.isinteger": {
-            "version": "4.0.4",
-            "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
-            "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
-        },
-        "node_modules/lodash.isnumber": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
-            "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
-        },
-        "node_modules/lodash.isplainobject": {
-            "version": "4.0.6",
-            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-            "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
-        },
-        "node_modules/lodash.isstring": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
-            "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
-        },
         "node_modules/lodash.merge": {
             "version": "4.6.2",
             "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -11952,7 +11869,8 @@
         "node_modules/lodash.once": {
             "version": "4.1.1",
             "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+            "dev": true
         },
         "node_modules/lodash.truncate": {
             "version": "4.4.2",
@@ -14242,26 +14160,26 @@
             }
         },
         "node_modules/rechoir": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
-            "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+            "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
             "dependencies": {
-                "resolve": "^1.9.0"
+                "resolve": "^1.20.0"
             },
             "engines": {
-                "node": ">= 0.10"
+                "node": ">= 10.13.0"
             }
         },
         "node_modules/redbean-node": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.1.4.tgz",
-            "integrity": "sha512-c1U6wnTeWS0c44tn9hkJWzjGgckLNJ8sN1E2bxnnnQsULOfvEVFLf8dLMjqhyyMrZ1L1mp8UvV4OfhRtH/ZrgQ==",
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.2.0.tgz",
+            "integrity": "sha512-bHbNgVpkLOn7i/kvfvGDVGzfDgvf20qVRm4EvQV9tD2V2nhcegYUITzAF3XSL2XVirrb5vmWy85vxM44faBnYw==",
             "dependencies": {
                 "@types/node": "^14.18.12",
                 "await-lock": "^2.1.0",
                 "dayjs": "^1.11.0",
                 "glob": "^7.2.0",
-                "knex": "^0.95.15",
+                "knex": "^2.4.0",
                 "lodash": "^4.17.21"
             }
         },
@@ -17469,41 +17387,19 @@
             "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q=="
         },
         "@azure/msal-node": {
-            "version": "1.14.5",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.5.tgz",
-            "integrity": "sha512-NcVdMfn8Z3ogN+9RjOSF7uwf2Gki5DEJl0BdDSL83KUAgVAobtkZi5W8EqxbJLrTO/ET0jv5DregrcR5qg2pEA==",
+            "version": "1.14.6",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.6.tgz",
+            "integrity": "sha512-em/qqFL5tLMxMPl9vormAs13OgZpmQoJbiQ/GlWr+BA77eCLoL+Ehr5xRHowYo+LFe5b+p+PJVkRvT+mLvOkwA==",
             "requires": {
-                "@azure/msal-common": "^9.0.1",
-                "jsonwebtoken": "^8.5.1",
+                "@azure/msal-common": "^9.0.2",
+                "jsonwebtoken": "^9.0.0",
                 "uuid": "^8.3.0"
             },
             "dependencies": {
                 "@azure/msal-common": {
-                    "version": "9.0.1",
-                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.1.tgz",
-                    "integrity": "sha512-eNNHIW/cwPTZDWs9KtYgb1X6gtQ+cC+FGX2YN+t4AUVsBdUbqlMTnUs6/c/VBxC2AAGIhgLREuNnO3F66AN2zQ=="
-                },
-                "jsonwebtoken": {
-                    "version": "8.5.1",
-                    "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
-                    "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
-                    "requires": {
-                        "jws": "^3.2.2",
-                        "lodash.includes": "^4.3.0",
-                        "lodash.isboolean": "^3.0.3",
-                        "lodash.isinteger": "^4.0.4",
-                        "lodash.isnumber": "^3.0.3",
-                        "lodash.isplainobject": "^4.0.6",
-                        "lodash.isstring": "^4.0.1",
-                        "lodash.once": "^4.0.0",
-                        "ms": "^2.1.1",
-                        "semver": "^5.6.0"
-                    }
-                },
-                "semver": {
-                    "version": "5.7.1",
-                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+                    "version": "9.0.2",
+                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.2.tgz",
+                    "integrity": "sha512-qzwxuF8kZAp+rNUactMCgJh8fblq9D4lSqrrIxMDzLjgSZtjN32ix7r/HBe8QdOr76II9SVVPcMkX4sPzPfQ7w=="
                 }
             }
         },
@@ -21363,8 +21259,7 @@
         "colorette": {
             "version": "2.0.19",
             "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
-            "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
-            "dev": true
+            "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
         },
         "combine-errors": {
             "version": "3.0.3",
@@ -23457,8 +23352,7 @@
         "get-package-type": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
-            "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-            "dev": true
+            "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
         },
         "get-stdin": {
             "version": "8.0.0",
@@ -23485,9 +23379,9 @@
             }
         },
         "getopts": {
-            "version": "2.2.5",
-            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
-            "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA=="
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
+            "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="
         },
         "getos": {
             "version": "3.2.1",
@@ -25905,47 +25799,30 @@
             "dev": true
         },
         "knex": {
-            "version": "0.95.15",
-            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.15.tgz",
-            "integrity": "sha512-Loq6WgHaWlmL2bfZGWPsy4l8xw4pOE+tmLGkPG0auBppxpI0UcK+GYCycJcqz9W54f2LiGewkCVLBm3Wq4ur/w==",
+            "version": "2.4.0",
+            "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.0.tgz",
+            "integrity": "sha512-i0GWwqYp1Hs2yvc2rlDO6nzzkLhwdyOZKRdsMTB8ZxOs2IXQyL5rBjSbS1krowCh6V65T4X9CJaKtuIfkaPGSA==",
             "requires": {
-                "colorette": "2.0.16",
-                "commander": "^7.1.0",
-                "debug": "4.3.2",
+                "colorette": "2.0.19",
+                "commander": "^9.1.0",
+                "debug": "4.3.4",
                 "escalade": "^3.1.1",
                 "esm": "^3.2.25",
-                "getopts": "2.2.5",
+                "get-package-type": "^0.1.0",
+                "getopts": "2.3.0",
                 "interpret": "^2.2.0",
                 "lodash": "^4.17.21",
                 "pg-connection-string": "2.5.0",
-                "rechoir": "0.7.0",
+                "rechoir": "^0.8.0",
                 "resolve-from": "^5.0.0",
-                "tarn": "^3.0.1",
+                "tarn": "^3.0.2",
                 "tildify": "2.0.0"
             },
             "dependencies": {
-                "colorette": {
-                    "version": "2.0.16",
-                    "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
-                    "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
-                },
                 "commander": {
-                    "version": "7.2.0",
-                    "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-                    "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
-                },
-                "debug": {
-                    "version": "4.3.2",
-                    "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-                    "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-                    "requires": {
-                        "ms": "2.1.2"
-                    }
-                },
-                "ms": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-                    "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+                    "version": "9.5.0",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+                    "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
                 },
                 "resolve-from": {
                     "version": "5.0.0",
@@ -26087,36 +25964,6 @@
             "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
             "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
         },
-        "lodash.includes": {
-            "version": "4.3.0",
-            "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
-            "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
-        },
-        "lodash.isboolean": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
-            "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
-        },
-        "lodash.isinteger": {
-            "version": "4.0.4",
-            "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
-            "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
-        },
-        "lodash.isnumber": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
-            "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
-        },
-        "lodash.isplainobject": {
-            "version": "4.0.6",
-            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-            "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
-        },
-        "lodash.isstring": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
-            "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
-        },
         "lodash.merge": {
             "version": "4.6.2",
             "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -26126,7 +25973,8 @@
         "lodash.once": {
             "version": "4.1.1",
             "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+            "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+            "dev": true
         },
         "lodash.truncate": {
             "version": "4.4.2",
@@ -27865,23 +27713,23 @@
             }
         },
         "rechoir": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
-            "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+            "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
             "requires": {
-                "resolve": "^1.9.0"
+                "resolve": "^1.20.0"
             }
         },
         "redbean-node": {
-            "version": "0.1.4",
-            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.1.4.tgz",
-            "integrity": "sha512-c1U6wnTeWS0c44tn9hkJWzjGgckLNJ8sN1E2bxnnnQsULOfvEVFLf8dLMjqhyyMrZ1L1mp8UvV4OfhRtH/ZrgQ==",
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/redbean-node/-/redbean-node-0.2.0.tgz",
+            "integrity": "sha512-bHbNgVpkLOn7i/kvfvGDVGzfDgvf20qVRm4EvQV9tD2V2nhcegYUITzAF3XSL2XVirrb5vmWy85vxM44faBnYw==",
             "requires": {
                 "@types/node": "^14.18.12",
                 "await-lock": "^2.1.0",
                 "dayjs": "^1.11.0",
                 "glob": "^7.2.0",
-                "knex": "^0.95.15",
+                "knex": "^2.4.0",
                 "lodash": "^4.17.21"
             },
             "dependencies": {
diff --git a/package.json b/package.json
index 8093bec5..b87eb0e2 100644
--- a/package.json
+++ b/package.json
@@ -109,7 +109,7 @@
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
         "protobufjs": "~7.1.1",
-        "redbean-node": "0.1.4",
+        "redbean-node": "~0.2.0",
         "socket.io": "~4.5.3",
         "socket.io-client": "~4.5.3",
         "socks-proxy-agent": "6.1.1",

From 712a3c29d48521ef7148807bdc1e69674339a4be Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 14 Jan 2023 21:06:10 +0800
Subject: [PATCH 453/803] Fix Postgres monitor do not handle some error cases
 correctly

---
 server/util-server.js | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index 60d8baac..f66b1039 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -280,18 +280,23 @@ exports.postgresQuery = function (connectionString, query) {
 
         const client = new Client({ connectionString });
 
-        client.connect();
-
-        return client.query(query)
-            .then(res => {
-                resolve(res);
-            })
-            .catch(err => {
+        client.connect((err) => {
+            if (err) {
                 reject(err);
-            })
-            .finally(() => {
                 client.end();
-            });
+            } else {
+                // Connected here
+                client.query(query, (err, res) => {
+                    if (err) {
+                        reject(err);
+                    } else {
+                        resolve(res);
+                    }
+                    client.end();
+                });
+            }
+        });
+
     });
 };
 

From 3adc9e65d6d5cd461abc461929f29513bc41e21a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Sat, 14 Jan 2023 16:33:21 +0300
Subject: [PATCH 454/803] Add only xml support to http monitors

---
 server/model/monitor.js   |  7 ++-----
 src/pages/EditMonitor.vue | 23 ++++++++---------------
 2 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 48b0b1d3..d93fd6dd 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -251,16 +251,13 @@ class Monitor extends BeanModel {
 
                     let contentType = null;
                     let bodyValue = null;
-                    
+
                     if (this.body && !this.httpBodyEncoding || this.httpBodyEncoding === "json") {
                         bodyValue = JSON.parse(this.body);
                         contentType = "application/json";
                     } else if (this.body && (this.httpBodyEncoding === "xml")) {
                         bodyValue = this.body;
-                        contentType = "text/xml";
-                    } else if (this.body && (this.httpBodyEncoding === "form")) {
-                        bodyValue = this.body;
-                        contentType = "application/x-www-form-urlencoded";
+                        contentType = "text/xml; charset=utf-8";
                     }
 
                     const options = {
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index ea246c60..05b89ab0 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -438,21 +438,14 @@
                                     </select>
                                 </div>
 
-                                <!-- Encoding -->
-                                <div class="my-3">
-                                    <label for="httpBodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
-                                    <select id="httpBodyEncoding" v-model="monitor.httpBodyEncoding" class="form-select">
-                                        <option value="json">
-                                            JSON
-                                        </option>
-                                        <option value="form">
-                                            x-www-form-urlencoded
-                                        </option>
-                                        <option value="xml">
-                                            XML
-                                        </option>
-                                    </select>
-                                </div>
+                              <!-- Encoding -->
+                              <div class="my-3">
+                                <label for="httpBodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
+                                <select id="httpBodyEncoding" v-model="monitor.httpBodyEncoding" class="form-select">
+                                  <option value="json">JSON</option>
+                                  <option value="xml">XML</option>
+                                </select>
+                              </div>
 
                                 <!-- Body -->
                                 <div class="my-3">

From 15c64d458b69489b455ee90b13dd610446a091ec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Sat, 14 Jan 2023 16:48:12 +0300
Subject: [PATCH 455/803] Fix lint

---
 src/pages/EditMonitor.vue | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index a68a1206..65680109 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -463,13 +463,13 @@
                                 </div>
 
                               <!-- Encoding -->
-                              <div class="my-3">
-                                <label for="httpBodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
-                                <select id="httpBodyEncoding" v-model="monitor.httpBodyEncoding" class="form-select">
-                                  <option value="json">JSON</option>
-                                  <option value="xml">XML</option>
-                                </select>
-                              </div>
+                                <div class="my-3">
+                                    <label for="httpBodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
+                                    <select id="httpBodyEncoding" v-model="monitor.httpBodyEncoding" class="form-select">
+                                      <option value="json">JSON</option>
+                                      <option value="xml">XML</option>
+                                    </select>
+                                </div>
 
                                 <!-- Body -->
                                 <div class="my-3">

From 9890a0754b409d458d7563c0d9a31dcbb20d76b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Sat, 14 Jan 2023 16:48:26 +0300
Subject: [PATCH 456/803] Fix lint

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

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 65680109..8d5e3e9d 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -462,7 +462,7 @@
                                     </select>
                                 </div>
 
-                              <!-- Encoding -->
+                                <!-- Encoding -->
                                 <div class="my-3">
                                     <label for="httpBodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
                                     <select id="httpBodyEncoding" v-model="monitor.httpBodyEncoding" class="form-select">

From cf21aa37376bc3175f4302940b5945a0704f81be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Sat, 14 Jan 2023 16:51:07 +0300
Subject: [PATCH 457/803] Fix lint

---
 src/pages/EditMonitor.vue | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 8d5e3e9d..8706c4aa 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -466,8 +466,8 @@
                                 <div class="my-3">
                                     <label for="httpBodyEncoding" class="form-label">{{ $t("Body Encoding") }}</label>
                                     <select id="httpBodyEncoding" v-model="monitor.httpBodyEncoding" class="form-select">
-                                      <option value="json">JSON</option>
-                                      <option value="xml">XML</option>
+                                        <option value="json">JSON</option>
+                                        <option value="xml">XML</option>
                                     </select>
                                 </div>
 

From 1326761a8a92b307f194d3bf92d70ac43674f206 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 15 Jan 2023 01:36:49 +0800
Subject: [PATCH 458/803] Update mongodb and simplify the logic of mongodbPing

---
 package-lock.json     | 14 +++++++-------
 package.json          |  2 +-
 server/util-server.js | 21 +++++++--------------
 3 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index a03e3956..c510233e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -39,7 +39,7 @@
                 "jsonwebtoken": "~9.0.0",
                 "jwt-decode": "~3.1.2",
                 "limiter": "~2.1.0",
-                "mongodb": "^4.12.0",
+                "mongodb": "~4.13.0",
                 "mqtt": "~4.3.7",
                 "mssql": "~8.1.4",
                 "mysql2": "~2.3.3",
@@ -13611,9 +13611,9 @@
             }
         },
         "node_modules/mongodb": {
-            "version": "4.12.0",
-            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.12.0.tgz",
-            "integrity": "sha512-ssWod7DqVE4faluZESdOqYhV1BI5CQA5c31sr+zxDLJDBX9EA5VJLo8RNSItPTwxExmuGn/T6MbETQWjywNehA==",
+            "version": "4.13.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
+            "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
             "dependencies": {
                 "bson": "^4.7.0",
                 "mongodb-connection-string-url": "^2.5.4",
@@ -28738,9 +28738,9 @@
             "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         },
         "mongodb": {
-            "version": "4.12.0",
-            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.12.0.tgz",
-            "integrity": "sha512-ssWod7DqVE4faluZESdOqYhV1BI5CQA5c31sr+zxDLJDBX9EA5VJLo8RNSItPTwxExmuGn/T6MbETQWjywNehA==",
+            "version": "4.13.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
+            "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
             "requires": {
                 "@aws-sdk/credential-providers": "^3.186.0",
                 "bson": "^4.7.0",
diff --git a/package.json b/package.json
index b3d1a656..276c4382 100644
--- a/package.json
+++ b/package.json
@@ -96,7 +96,7 @@
         "jsonwebtoken": "~9.0.0",
         "jwt-decode": "~3.1.2",
         "limiter": "~2.1.0",
-        "mongodb": "^4.12.0",
+        "mongodb": "~4.13.0",
         "mqtt": "~4.3.7",
         "mssql": "~8.1.4",
         "mysql2": "~2.3.3",
diff --git a/server/util-server.js b/server/util-server.js
index a28b99ad..a0ed03d7 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -325,21 +325,14 @@ exports.mysqlQuery = function (connectionString, query) {
  * @returns {Promise<(string[]|Object[]|Object)>}
  */
 exports.mongodbPing = async function (connectionString) {
-    let client;
+    let client = await MongoClient.connect(connectionString);
+    let dbPing = await client.db().command({ ping: 1 });
+    await client.close();
 
-    try {
-        client = await MongoClient.connect(connectionString, { useNewUrlParser: true });
-        let db = client.db();
-        let dbping = await db.command({ ping: 1 });
-        await client.close();
-        if (dbping["ok"] === 1) {
-            return "UP";
-        } else {
-            throw Error("failed");
-        }
-    } catch (err) {
-        console.error(err);
-        throw Error(err);
+    if (dbPing["ok"] === 1) {
+        return "UP";
+    } else {
+        throw Error("failed");
     }
 };
 

From ae3a543b3b2ef4c48c09e0d633f91231e4292ed4 Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Tue, 27 Dec 2022 18:11:53 +0800
Subject: [PATCH 459/803] convert language files to json format

---
 src/i18n.js           |   2 +-
 src/lang/bg-BG.json   | 672 +++++++++++++++++++++++++++++++++++++++++
 src/lang/cs-CZ.json   | 626 ++++++++++++++++++++++++++++++++++++++
 src/lang/da-DK.json   | 355 ++++++++++++++++++++++
 src/lang/de-CH.json   | 634 +++++++++++++++++++++++++++++++++++++++
 src/lang/de-DE.json   | 641 +++++++++++++++++++++++++++++++++++++++
 src/lang/el-GR.json   | 587 ++++++++++++++++++++++++++++++++++++
 src/lang/en.json      | 678 +++++++++++++++++++++++++++++++++++++++++
 src/lang/es-ES.json   | 209 +++++++++++++
 src/lang/et-EE.json   | 209 +++++++++++++
 src/lang/eu.json      | 541 +++++++++++++++++++++++++++++++++
 src/lang/fa.json      | 208 +++++++++++++
 src/lang/fr-FR.json   | 672 +++++++++++++++++++++++++++++++++++++++++
 src/lang/he-IL.json   | 672 +++++++++++++++++++++++++++++++++++++++++
 src/lang/hr-HR.json   | 581 +++++++++++++++++++++++++++++++++++
 src/lang/hu.json      | 376 +++++++++++++++++++++++
 src/lang/id-ID.json   | 585 ++++++++++++++++++++++++++++++++++++
 src/lang/it-IT.json   | 367 +++++++++++++++++++++++
 src/lang/ja.json      | 201 +++++++++++++
 src/lang/ko-KR.json   | 531 ++++++++++++++++++++++++++++++++
 src/lang/nb-NO.json   | 285 ++++++++++++++++++
 src/lang/nl-NL.json   | 531 ++++++++++++++++++++++++++++++++
 src/lang/pl.json      | 644 +++++++++++++++++++++++++++++++++++++++
 src/lang/pt-BR.json   | 203 +++++++++++++
 src/lang/pt-PT.json   | 203 +++++++++++++
 src/lang/ru-RU.json   | 581 +++++++++++++++++++++++++++++++++++
 src/lang/sl-SI.json   | 357 ++++++++++++++++++++++
 src/lang/sr-latn.json | 204 +++++++++++++
 src/lang/sr.json      | 204 +++++++++++++
 src/lang/sv-SE.json   | 110 +++++++
 src/lang/th-TH.json   | 580 +++++++++++++++++++++++++++++++++++
 src/lang/tr-TR.json   | 678 +++++++++++++++++++++++++++++++++++++++++
 src/lang/uk-UA.json   | 530 ++++++++++++++++++++++++++++++++
 src/lang/vi-VN.json   | 469 +++++++++++++++++++++++++++++
 src/lang/zh-CN.json   | 683 ++++++++++++++++++++++++++++++++++++++++++
 src/lang/zh-HK.json   | 388 ++++++++++++++++++++++++
 src/lang/zh-TW.json   | 672 +++++++++++++++++++++++++++++++++++++++++
 src/mixins/lang.js    |   4 +-
 38 files changed, 16670 insertions(+), 3 deletions(-)
 create mode 100644 src/lang/bg-BG.json
 create mode 100644 src/lang/cs-CZ.json
 create mode 100644 src/lang/da-DK.json
 create mode 100644 src/lang/de-CH.json
 create mode 100644 src/lang/de-DE.json
 create mode 100644 src/lang/el-GR.json
 create mode 100644 src/lang/en.json
 create mode 100644 src/lang/es-ES.json
 create mode 100644 src/lang/et-EE.json
 create mode 100644 src/lang/eu.json
 create mode 100644 src/lang/fa.json
 create mode 100644 src/lang/fr-FR.json
 create mode 100644 src/lang/he-IL.json
 create mode 100644 src/lang/hr-HR.json
 create mode 100644 src/lang/hu.json
 create mode 100644 src/lang/id-ID.json
 create mode 100644 src/lang/it-IT.json
 create mode 100644 src/lang/ja.json
 create mode 100644 src/lang/ko-KR.json
 create mode 100644 src/lang/nb-NO.json
 create mode 100644 src/lang/nl-NL.json
 create mode 100644 src/lang/pl.json
 create mode 100644 src/lang/pt-BR.json
 create mode 100644 src/lang/pt-PT.json
 create mode 100644 src/lang/ru-RU.json
 create mode 100644 src/lang/sl-SI.json
 create mode 100644 src/lang/sr-latn.json
 create mode 100644 src/lang/sr.json
 create mode 100644 src/lang/sv-SE.json
 create mode 100644 src/lang/th-TH.json
 create mode 100644 src/lang/tr-TR.json
 create mode 100644 src/lang/uk-UA.json
 create mode 100644 src/lang/vi-VN.json
 create mode 100644 src/lang/zh-CN.json
 create mode 100644 src/lang/zh-HK.json
 create mode 100644 src/lang/zh-TW.json

diff --git a/src/i18n.js b/src/i18n.js
index aff60c75..0a6874b6 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -1,5 +1,5 @@
 import { createI18n } from "vue-i18n/dist/vue-i18n.esm-browser.prod.js";
-import en from "./languages/en";
+import en from "./lang/en.json";
 
 const languageList = {
     "cs-CZ": "Čeština",
diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
new file mode 100644
index 00000000..2c4ce95f
--- /dev/null
+++ b/src/lang/bg-BG.json
@@ -0,0 +1,672 @@
+{
+    "languageName": "Български",
+    "checkEverySecond": "Ще се извършва на всеки {0} секунди",
+    "retryCheckEverySecond": "Ще се извършва на всеки {0} секунди",
+    "retriesDescription": "Максимален брой опити преди маркиране на услугата като недостъпна и изпращане на известие",
+    "ignoreTLSError": "Игнорирай TLS/SSL грешки за HTTPS уеб сайтове",
+    "upsideDownModeDescription": "Обръща статуса от достъпен на недостъпен. Ако услугата е достъпна, ще се вижда като НЕДОСТЪПНА.",
+    "maxRedirectDescription": "Максимален брой пренасочвания, които да бъдат следвани. Въведете 0 за да изключите пренасочване.",
+    "acceptedStatusCodesDescription": "Изберете статус кодове, които да се считат за успешен отговор.",
+    "passwordNotMatchMsg": "Повторената парола не съвпада.",
+    "notificationDescription": "Моля, задайте известието към монитор(и), за да функционира.",
+    "keywordDescription": "Търси ключова дума в чист html или JSON отговор - чувствителна е към регистъра",
+    "pauseDashboardHome": "Пауза",
+    "deleteMonitorMsg": "Наистина ли желаете да изтриете този монитор?",
+    "deleteNotificationMsg": "Наистина ли желаете да изтриете това известие за всички монитори?",
+    "resolverserverDescription": "Cloudflare е сървърът по подразбиране, но можете да го промените по всяко време.",
+    "rrtypeDescription": "Изберете ресурсния запис, който желаете да наблюдавате",
+    "pauseMonitorMsg": "Наистина ли желаете да поставите в режим пауза?",
+    "enableDefaultNotificationDescription": "За всеки нов монитор това известие ще бъде активирано по подразбиране. Можете да го изключите за всеки отделен монитор.",
+    "clearEventsMsg": "Наистина ли желаете да изтриете всички събития за този монитор?",
+    "clearHeartbeatsMsg": "Наистина ли желаете да изтриете всички записи за честотни проверки на този монитор?",
+    "confirmClearStatisticsMsg": "Наистина ли желаете да изтриете всички статистически данни?",
+    "importHandleDescription": "Изберете 'Пропусни съществуващите', ако желаете да пропуснете всеки монитор или известие със същото име. 'Презапис' ще изтрие всеки съществуващ монитор и известие.",
+    "confirmImportMsg": "Сигурни ли сте, че желаете импортирането на архива? Моля, уверете се, че сте избрали правилната опция за импортиране.",
+    "twoFAVerifyLabel": "Моля, въведете вашия токен код, за да проверите дали 2FA работи",
+    "tokenValidSettingsMsg": "Токен кодът е валиден! Вече можете да запазите настройките за 2FA.",
+    "confirmEnableTwoFAMsg": "Сигурни ли сте, че желаете да активирате 2FA?",
+    "confirmDisableTwoFAMsg": "Сигурни ли сте, че желаете да изключите 2FA?",
+    "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.": "Вал. сертификат",
+    "day": "ден | дни",
+    "-day": "-дни",
+    "hour": "час",
+    "-hour": "-часa",
+    "Response": "Отговор",
+    "Ping": "Пинг",
+    "Monitor Type": "Монитор тип",
+    "Keyword": "Ключова дума",
+    "Friendly Name": "Псевдоним",
+    "URL": "URL Адрес",
+    "Hostname": "Име на хост",
+    "Port": "Порт",
+    "Heartbeat Interval": "Честота на проверка",
+    "Retries": "Повторни опити",
+    "Heartbeat Retry Interval": "Честота на повторните опити",
+    "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": "Активирай удостоверяване",
+    "disableauth.message1": "Сигурни ли сте, че желаете да <strong>изключите удостоверяването</strong>?",
+    "disableauth.message2": "Използва се в случаите, когато <strong>има настроен алтернативен метод за удостоверяване</strong> преди Uptime Kuma, например Cloudflare Access, Authelia или друг механизъм за удостоверяване.",
+    "Please use this option carefully!": "Моля, използвайте с повишено внимание.",
+    "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": "Повторете паролата",
+    "Import Backup": "Импорт на архив",
+    "Export Backup": "Експорт на архив",
+    "Export": "Експорт",
+    "Import": "Импорт",
+    "respTime": "Време за отговор (ms)",
+    "notAvailableShort": "Няма",
+    "Default enabled": "Активирано по подразбиране",
+    "Apply on all existing monitors": "Приложи върху всички съществуващи монитори",
+    "Create": "Създай",
+    "Clear Data": "Изтрий данни",
+    "Events": "Събития",
+    "Heartbeats": "Проверки",
+    "Auto Get": "Авт. попълване",
+    "backupDescription": "Можете да архивирате всички монитори и всички известия в JSON файл.",
+    "backupDescription2": "PS: Имайте предвид, че данните за история и събития няма да бъдат включени.",
+    "backupDescription3": "Чувствителни данни, като токен кодове за известия, се съдържат в експортирания файл. Моля, бъдете внимателни с неговото съхранение.",
+    "alertNoFile": "Моля, изберете файл за импортиране.",
+    "alertWrongFileType": "Моля, изберете JSON файл.",
+    "Clear all statistics": "Изтрий цялата статистика",
+    "Skip existing": "Пропусни съществуващите",
+    "Overwrite": "Презапиши",
+    "Options": "Опции",
+    "Keep both": "Запази двете",
+    "Verify Token": "Провери токен код",
+    "Setup 2FA": "Настройка 2FA",
+    "Enable 2FA": "Активирай 2FA",
+    "Disable 2FA": "Деактивирай 2FA",
+    "2FA Settings": "Настройка за 2FA",
+    "Two Factor Authentication": "Двуфакторно удостоверяване",
+    "Active": "Активно",
+    "Inactive": "Неактивно",
+    "Token": "Токен код",
+    "Show URI": "Покажи URI",
+    "Tags": "Етикети",
+    "Add New below or Select...": "Добавете нов по-долу или изберете...",
+    "Tag with this name already exist.": "Етикет с това име вече съществува.",
+    "Tag with this value already exist.": "Етикет с тази стойност вече съществува.",
+    "color": "цвят",
+    "value (optional)": "стойност (по желание)",
+    "Gray": "Сиво",
+    "Red": "Червено",
+    "Orange": "Оранжево",
+    "Green": "Зелено",
+    "Blue": "Синьо",
+    "Indigo": "Индиго",
+    "Purple": "Лилаво",
+    "Pink": "Розово",
+    "Search...": "Търси...",
+    "Avg. Ping": "Ср. пинг",
+    "Avg. Response": "Ср. отговор",
+    "Entry Page": "Основна страница",
+    "statusPageNothing": "Все още няма нищо тук. Моля, добавете група или монитор.",
+    "No Services": "Няма Услуги",
+    "All Systems Operational": "Всички услуги са достъпни",
+    "Partially Degraded Service": "Част от услугите са недостъпни",
+    "Degraded Service": "Всички услуги са недостъпни",
+    "Add Group": "Добави група",
+    "Add a monitor": "Добави монитор",
+    "Edit Status Page": "Редактиране Статус страница",
+    "Go to Dashboard": "Към Таблото",
+    "telegram": "Telegram",
+    "webhook": "Уеб кука",
+    "smtp": "Имейл (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Поддържа 50+ услуги за известяване)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Status Page": "Статус страница",
+    "Status Pages": "Статус страници",
+    "Primary Base URL": "Основен базов URL адрес",
+    "Push URL": "Генериран Push URL адрес",
+    "needPushEvery": "Необходимо е да извършвате заявка към този URL адрес на всеки {0} секунди",
+    "pushOptionalParams": "Допълнителни, но не задължителни параметри: {0}",
+    "defaultNotificationName": "Моето {notification} известие ({number})",
+    "here": "тук",
+    "Required": "Задължително поле",
+    "Bot Token": "Бот токен",
+    "wayToGetTelegramToken": "Можете да получите токен от {0}.",
+    "Chat ID": "Чат ID",
+    "supportTelegramChatID": "Поддържа Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "Можете да получите вашето чат ID, като изпратите съобщение на бота, след което е нужно да посетите този URL адрес за да го видите:",
+    "YOUR BOT TOKEN HERE": "ВАШИЯТ БОТ ТОКЕН ТУК",
+    "chatIDNotFound": "Чат ID не е намерено. Моля, първо изпратете съобщение до този бот",
+    "Post URL": "Post URL адрес",
+    "Content Type": "Тип съдържание",
+    "webhookJsonDesc": "{0} е подходящ за всички съвременни http сървъри, като например express.js",
+    "webhookFormDataDesc": "{multipart} е подходящ за PHP, нужно е да анализирате json чрез {decodeFunction}",
+    "secureOptionNone": "Няма (25) / STARTTLS (587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Игнорирай TLS грешките",
+    "From Email": "От имейл адрес",
+    "emailCustomSubject": "Модифициране на тема",
+    "To Email": "Получател имейл адрес",
+    "smtpCC": "Явно копие до имейл адрес:",
+    "smtpBCC": "Скрито копие до имейл адрес:",
+    "Discord Webhook URL": "Discord URL адрес на уеб кука",
+    "wayToGetDiscordURL": "Може да създадете, от меню \"Настройки на сървъра\" -> \"Интеграции\" -> \"Уеб куки\" -> \"Нова уеб кука\"",
+    "Bot Display Name": "Име на бота, което да се показва",
+    "Prefix Custom Message": "Модифицирано обръщение",
+    "Hello @everyone is...": "Здравейте, {'@'}everyone е...",
+    "Webhook URL": "Уеб кука URL адрес",
+    "wayToGetTeamsURL": "Можете да научите как се създава URL адрес за уеб кука {0}.",
+    "Number": "Номер",
+    "Recipients": "Получатели",
+    "needSignalAPI": "Необходимо е да разполагате със Signal клиент с REST API.",
+    "wayToCheckSignalURL": "Може да посетите този URL адрес, ако се нуждаете от помощ при настройването:",
+    "signalImportant": "ВАЖНО: Не може да смесвате \"Групи\" и \"Номера\" в поле \"Получатели\"!",
+    "Application Token": "Токен код за приложението",
+    "Server URL": "URL адрес на сървъра",
+    "Priority": "Приоритет",
+    "Icon Emoji": "Иконка Емотикон",
+    "Channel Name": "Канал име",
+    "Uptime Kuma URL": "Uptime Kuma URL адрес",
+    "aboutWebhooks": "Повече информация относно уеб куки на: {0}",
+    "aboutChannelName": "Въведете името на канала в поле {0} \"Канал име\", ако желаете да заобиколите канала от уеб куката. Например: #other-channel",
+    "aboutKumaURL": "Ако оставите празно полето \"Uptime Kuma URL адрес\", по подразбиране ще се използва GitHub страницата на проекта.",
+    "emojiCheatSheet": "Подсказки за емотикони: {0}",
+    "User Key": "Потребителски ключ",
+    "Device": "Устройство",
+    "Message Title": "Заглавие на съобщението",
+    "Notification Sound": "Звуков сигнал",
+    "More info on:": "Повече информация на: {0}",
+    "pushoverDesc1": "Приоритет Спешно (2) по подразбиране изчаква 30 секунди между повторните опити и изтича след 1 час.",
+    "pushoverDesc2": "Ако желаете да изпратите известия до различни устройства, попълнете полето Устройство.",
+    "SMS Type": "SMS тип",
+    "octopushTypePremium": "Премиум (Бърз - препоръчителен в случай на тревога)",
+    "octopushTypeLowCost": "Евтин (Бавен - понякога бива блокиран от оператора)",
+    "checkPrice": "Тарифни планове на {0}:",
+    "octopushLegacyHint": "Дали използвате съвместима версия на Octopush (2011-2020) или нова версия?",
+    "Check octopush prices": "Тарифни планове на octopush {0}.",
+    "octopushPhoneNumber": "Телефонен номер (в международен формат, например: +33612345678) ",
+    "octopushSMSSender": "SMS подател Име: 3-11 знака - букви, цифри и интервал (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea ID на устройство",
+    "Apprise URL": "Apprise URL адрес",
+    "Example:": "Пример: {0}",
+    "Read more:": "Научете повече: {0}",
+    "Status:": "Статус: {0}",
+    "Read more": "Научете повече",
+    "appriseInstalled": "Apprise е инсталиран.",
+    "appriseNotInstalled": "Apprise не е инсталиран. {0}",
+    "Access Token": "Токен код за достъп",
+    "Channel access token": "Канал токен код",
+    "Line Developers Console": "Line - Конзола за разработчици",
+    "lineDevConsoleTo": "Line - Конзола за разработчици - {0}",
+    "Basic Settings": "Основни настройки",
+    "User ID": "Потребител ID",
+    "Messaging API": "API за съобщаване",
+    "wayToGetLineChannelToken": "Необходимо е първо да посетите {0}, за да създадете (Messaging API) за доставчик и канал, след което може да вземете токен кода за канал и потребителско ID от споменатите по-горе елементи на менюто.",
+    "Icon URL": "URL адрес за иконка",
+    "aboutIconURL": "Може да предоставите линк към картинка в поле \"URL Адрес за иконка\" за да отмените картинката на профила по подразбиране. Няма да се използва, ако вече сте настроили емотикон.",
+    "aboutMattermostChannelName": "Може да замените канала по подразбиране, към който публикува уеб куката, като въведете името на канала в полето \"Канал име\". Трябва да бъде активирано в настройките за уеб кука на Mattermost. Например: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - евтин, но бавен. Често е претоварен. Само за получатели от Полша.",
+    "promosmsTypeFlash": "SMS FLASH - Съобщението автоматично се показва на устройството на получателя. Само за получатели от Полша.",
+    "promosmsTypeFull": "SMS FULL - Високо ниво на SMS услуга. Може да използвате Вашето име като подател (Необходимо е първо да регистрирате името). Надежден метод за съобщения тип тревога.",
+    "promosmsTypeSpeed": "SMS SPEED - Най-висок приоритет в системата. Много бърза и надеждна, но същевременно скъпа услуга. (Около два пъти по-висока цена в сравнение с SMS FULL).",
+    "promosmsPhoneNumber": "Телефонен номер (за получатели от Полша, може да пропуснете въвеждането на код за населено място)",
+    "promosmsSMSSender": "SMS Подател име: Предварително регистрирано име или някое от имената по подразбиране: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu URL адрес за уеб кука",
+    "matrixHomeserverURL": "Сървър URL адрес (започва с http(s):// и порт по желание)",
+    "Internal Room Id": "ID на вътрешна стая",
+    "matrixDesc1": "Може да намерите \"ID на вътрешна стая\" в разширените настройки на стаята във вашия Matrix клиент. Примерен изглед: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Силно препоръчваме да създадете НОВ потребител и да НЕ използвате токен кодът на вашия личен Matrix потребител, т.к. той позволява пълен достъп до вашия акаунт и всички стаи към които сте се присъединили. Вместо това създайте нов потребител и го поканете само в стаята, където желаете да получавате известията. Токен код за достъп ще получите изпълнявайки {0}",
+    "Method": "Метод",
+    "Body": "Съобщение",
+    "Headers": "Хедъри",
+    "PushUrl": "Push URL адрес",
+    "HeadersInvalidFormat": "Заявените хедъри не са валидни JSON: ",
+    "BodyInvalidFormat": "Заявеното съобщение не е валиден JSON: ",
+    "Monitor History": "История на мониторите",
+    "clearDataOlderThan": "Ще се съхранява за {0} дни.",
+    "records": "записа",
+    "One record": "Един запис",
+    "steamApiKeyDescription": "За да мониторирате Steam Gameserver се нуждаете от Steam Web-API ключ. Може да регистрирате Вашия API ключ тук: ",
+    "clicksendsms": "ClickSend SMS",
+    "apiCredentials": "API удостоверяване",
+    "PasswordsDoNotMatch": "Паролите не съвпадат.",
+    "Current User": "Текущ потребител",
+    "recent": "Скорошни",
+    "shrinkDatabaseDescription": "Инициира \"VACUUM\" за \"SQLite\" база данни. Ако Вашата база данни е създадена след версия 1.10.0, \"AUTO_VACUUM\" функцията е активна и това действие не е нужно.",
+    "Done": "Готово",
+    "Info": "Информация",
+    "Security": "Сигурност",
+    "Steam API Key": "Steam API ключ",
+    "Shrink Database": "Редуцирай базата данни",
+    "Pick a RR-Type...": "Изберете вида на ресурсния запис за мониториране...",
+    "Pick Accepted Status Codes...": "Изберете статус кодове, които да се считат за успешен отговор...",
+    "Default": "По подразбиране",
+    "HTTP Options": "HTTP Опции",
+    "Create Incident": "Създаване на инцидент",
+    "Title": "Заглавие",
+    "Content": "Съдържание",
+    "Style": "Стил",
+    "info": "информация",
+    "warning": "предупреждение",
+    "danger": "опасност",
+    "primary": "основен",
+    "light": "светъл",
+    "dark": "тъмен",
+    "Post": "Публикувай",
+    "Please input title and content": "Моля, въведете заглавие и съдържание",
+    "Created": "Създаден",
+    "Last Updated": "Последно обновен",
+    "Unpin": "Откачи",
+    "Switch to Light Theme": "Превключи към светла тема",
+    "Switch to Dark Theme": "Превключи към тъмна тема",
+    "Show Tags": "Покажи етикети",
+    "Hide Tags": "Скрий етикети",
+    "Description": "Описание",
+    "No monitors available.": "Няма налични монитори.",
+    "Add one": "Добави един",
+    "No Monitors": "Няма монитори",
+    "Untitled Group": "Група без заглавие",
+    "Services": "Услуги",
+    "Discard": "Отмени",
+    "Cancel": "Отмени",
+    "Powered by": "Създадено чрез",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Потребителско име (вкл. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Парола",
+    "serwersmsPhoneNumber": "Телефон номер",
+    "serwersmsSenderName": "SMS Подател име (регистриран през клиентския портал)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM Настройки",
+    "smtpDkimDesc": "Моля, вижте {0} на Nodemailer DKIM за инструкции.",
+    "documentation": "документацията",
+    "smtpDkimDomain": "Домейн",
+    "smtpDkimKeySelector": "Селектор на ключ",
+    "smtpDkimPrivateKey": "Частен ключ",
+    "smtpDkimHashAlgo": "Хеш алгоритъм (по желание)",
+    "smtpDkimheaderFieldNames": "Хедър ключове за подписване (по желание)",
+    "smtpDkimskipFields": "Хедър ключове, които да не се подписват (по желание)",
+    "PushByTechulus": "Push от Techulus",
+    "GoogleChat": "Google Chat (Само за работното пространство на Google)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Крайна точка на API",
+    "alertaEnvironment": "Среда",
+    "alertaApiKey": "API Ключ",
+    "alertaAlertState": "Състояние на тревога",
+    "alertaRecoverState": "Състояние на възстановяване",
+    "deleteStatusPageMsg": "Сигурни ли сте, че желаете да изтриете тази статус страница?",
+    "Proxies": "Прокси",
+    "default": "По подразбиране",
+    "enabled": "Активирано",
+    "setAsDefault": "Зададен по подразбиране",
+    "deleteProxyMsg": "Сигурни ли сте, че желаете да изтриете това прокси за всички монитори?",
+    "proxyDescription": "За да функционират трябва да бъдат зададени към монитор.",
+    "enableProxyDescription": "Това прокси няма да има ефект върху заявките за мониторинг, докато не бъде активирано. Може да контролирате временното деактивиране на проксито от всички монитори чрез статуса на активиране.",
+    "setAsDefaultProxyDescription": "Това прокси ще бъде активно по подразбиране за новите монитори. Може да го изключите по отделно за всеки един монитор.",
+    "Certificate Chain": "Верига на сертификата",
+    "Valid": "Валиден",
+    "Invalid": "Невалиден",
+    "AccessKeyId": "ID на ключ за достъп",
+    "SecretAccessKey": "Тайна на ключа за достъп",
+    "PhoneNumbers": "Телефонни номера",
+    "TemplateCode": "Шаблон Код",
+    "SignName": "Знак име",
+    "Sms template must contain parameters: ": "SMS шаблонът трябва да съдържа следните параметри: ",
+    "Bark Endpoint": "Bark крайна точка",
+    "WebHookUrl": "URL адрес на уеб кука",
+    "SecretKey": "Таен ключ",
+    "For safety, must use secret key": "За сигурност, трябва да се използва таен ключ",
+    "Device Token": "Токен за устройство",
+    "Platform": "Платформа",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Висок",
+    "Retry": "Повтори",
+    "Topic": "Тема",
+    "WeCom Bot Key": "WeCom бот ключ",
+    "Setup Proxy": "Настрой прокси",
+    "Proxy Protocol": "Прокси протокол",
+    "Proxy Server": "Прокси сървър",
+    "Proxy server has authentication": "Прокси сървърът е с удостоверяване",
+    "User": "Потребител",
+    "Installed": "Инсталиран",
+    "Not installed": "Не е инсталиран",
+    "Running": "Работи",
+    "Not running": "Не работи",
+    "Remove Token": "Премахни токен",
+    "Start": "Стартирай",
+    "Stop": "Спри",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Добави нова статус страница",
+    "Slug": "Слъг",
+    "Accept characters:": "Приеми символи:",
+    "startOrEndWithOnly": "Започва или завършва само с {0}",
+    "No consecutive dashes": "Без последователни тирета",
+    "Next": "Следващ",
+    "The slug is already taken. Please choose another slug.": "Този слъг вече се използва. Моля изберете друг.",
+    "No Proxy": "Без прокси",
+    "Authentication": "Удостоверяване",
+    "HTTP Basic Auth": "HTTP основно удостоверяване",
+    "New Status Page": "Нова статус страница",
+    "Page Not Found": "Страницата не е открита",
+    "Reverse Proxy": "Ревърс прокси",
+    "Backup": "Архивиране",
+    "About": "Относно",
+    "wayToGetCloudflaredURL": "(Свалете \"cloudflared\" от {0})",
+    "cloudflareWebsite": "Cloudflare уеб сайт",
+    "Message:": "Съобщение:",
+    "Don't know how to get the token? Please read the guide:": "Не знаете как да вземете токен? Моля, прочетете ръководството:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Текущата връзка може да прекъсне ако в момента сте свързани чрез \"Cloudflare Tunnel\". Сигурни ли сте, че желаете да го спрете? Въведете Вашата текуща парола за да потвърдите.",
+    "Other Software": "Друг софтуер",
+    "For example: nginx, Apache and Traefik.": "Например: Nginx, Apache и Traefik.",
+    "Please read": "Моля, прочетете",
+    "Subject:": "Тема:",
+    "Valid To:": "Валиден до:",
+    "Days Remaining:": "Оставащи дни:",
+    "Issuer:": "Издател:",
+    "Fingerprint:": "Пръстов отпечатък:",
+    "No status pages": "Няма статус страници",
+    "topic": "Тема",
+    "topicExplanation": "MQTT тема за мониториране",
+    "successMessage": "Съобщение при успех",
+    "successMessageExplanation": "MQTT съобщение, което ще бъде считано за успех",
+    "Customize": "Персонализирай",
+    "Custom Footer": "Персонализиран долен колонтитул",
+    "Custom CSS": "Потребителски CSS",
+    "Domain Name Expiry Notification": "Известие при изтичащ домейн",
+    "Proxy": "Прокси",
+    "Date Created": "Дата на създаване",
+    "onebotHttpAddress": "OneBot HTTP адрес",
+    "onebotMessageType": "OneBot тип съобщение",
+    "onebotGroupMessage": "Група",
+    "onebotPrivateMessage": "Лично",
+    "onebotUserOrGroupId": "Група/Потребител ID",
+    "onebotSafetyTips": "С цел безопасност трябва да зададете токен код за достъп",
+    "PushDeer Key": "PushDeer ключ",
+    "Footer Text": "Текст долен колонтитул",
+    "Show Powered By": "Покажи \"Създадено чрез\"",
+    "Domain Names": "Домейни",
+    "signedInDisp": "Вписан като {0}",
+    "signedInDispDisabled": "Удостоверяването е изключено.",
+    "Certificate Expiry Notification": "Известие за изтичане валидността на сертификата",
+    "API Username": "API Потребител",
+    "API Key": "API Ключ",
+    "Recipient Number": "Номер на получателя",
+    "From Name/Number": "От Име/Номер",
+    "Leave blank to use a shared sender number.": "Оставете празно, за да използвате споделен номер на подател.",
+    "Octopush API Version": "Octopush API версия",
+    "Legacy Octopush-DM": "Octopush-DM старa версия",
+    "endpoint": "крайна точка",
+    "octopushAPIKey": "\"API ключ\" от HTTP API удостоверяване в контролния панел",
+    "octopushLogin": "\"Вписване\" от HTTP API удостоверяване в контролния панел",
+    "promosmsLogin": "API Потребителско име",
+    "promosmsPassword": "API Парола",
+    "pushoversounds pushover": "Pushover (по подразбиране)",
+    "pushoversounds bike": "Велосипед",
+    "pushoversounds bugle": "Тромпет",
+    "pushoversounds cashregister": "Касов апарат",
+    "pushoversounds classical": "Класическа музика",
+    "pushoversounds cosmic": "Космически",
+    "pushoversounds falling": "Падащ",
+    "pushoversounds gamelan": "Игра в мрежа",
+    "pushoversounds incoming": "Входящ",
+    "pushoversounds intermission": "Прекъсване",
+    "pushoversounds magic": "Магия",
+    "pushoversounds mechanical": "Механичен",
+    "pushoversounds pianobar": "Пиано бар",
+    "pushoversounds siren": "Сирена",
+    "pushoversounds spacealarm": "Космическа аларма",
+    "pushoversounds tugboat": "Буксир",
+    "pushoversounds alien": "Извънземна аларма (дълъг)",
+    "pushoversounds climb": "Изкачване (дълъг)",
+    "pushoversounds persistent": "Постоянен (дълъг)",
+    "pushoversounds echo": "Pushover ехо (дълъг)",
+    "pushoversounds updown": "Горе долу (дълъг)",
+    "pushoversounds vibrate": "Само вибрация",
+    "pushoversounds none": "Без (тих)",
+    "pushyAPIKey": "Таен API ключ",
+    "pushyToken": "Токен на устройство",
+    "Show update if available": "Покажи актуализация, ако е налична",
+    "Also check beta release": "Проверявай и за бета версии",
+    "Using a Reverse Proxy?": "Използвате ревърс прокси?",
+    "Check how to config it for WebSocket": "Проверете как да го конфигурирате за WebSocket",
+    "Steam Game Server": "Steam Game сървър",
+    "Most likely causes:": "Най-вероятни причини:",
+    "The resource is no longer available.": "Ресурсът вече не е наличен.",
+    "There might be a typing error in the address.": "Възможно е да е допусната грешка при изписването на адреса.",
+    "What you can try:": "Може да опитате:",
+    "Retype the address.": "Повторно въвеждане на адреса.",
+    "Go back to the previous page.": "Да се върнете към предишната страница.",
+    "Coming Soon": "Очаквайте скоро",
+    "wayToGetClickSendSMSToken": "Може да получите API потребителско име и API ключ от {0} .",
+    "dnsPortDescription": "DNS порт на сървъра. По подразбиране е 53, но може да бъде променен по всяко време.",
+    "error": "грешка",
+    "critical": "критично",
+    "wayToGetPagerDutyKey": "Може да го получите като посетите Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тук трябва да потърсите \"Events API V2\". Повече информация {0}",
+    "Integration Key": "Ключ за интегриране",
+    "Integration URL": "URL адрес за интеграция",
+    "Auto resolve or acknowledged": "Автоматично разрешаване или потвърждаване",
+    "do nothing": "не прави нищо",
+    "auto acknowledged": "автоматично потвърждаване",
+    "auto resolve": "автоматично разрешаване",
+    "Connection String": "Стринг за връзка",
+    "Query": "Заявка",
+    "settingsCertificateExpiry": "Изтичане валидността на TLS сертификата",
+    "certificationExpiryDescription": "HTTPS мониторите ще задействат известие, ако е наличен изтичащ TLS сертификат, през следващите:",
+    "ntfy Topic": "ntfy Тема",
+    "Domain": "Домейн",
+    "Workstation": "Работна станция",
+    "disableCloudflaredNoAuthMsg": "Тъй като сте в режим \"No Auth mode\", парола не се изисква.",
+    "wayToGetLineNotifyToken": "Може да получите токен код за достъп от {0}",
+    "resendEveryXTimes": "Изпращай повторно на всеки {0} пъти",
+    "resendDisabled": "Повторното изпращане е изключено",
+    "Resend Notification if Down X times consequently": "Повторно изпращане на известие, ако е недостъпен X пъти последователно",
+    "Bark Group": "Bark група",
+    "Bark Sound": "Bark звук",
+    "HTTP Headers": "HTTP хедъри",
+    "Trust Proxy": "Trust Proxy",
+    "HomeAssistant": "Home Assistant",
+    "RadiusSecret": "Radius таен код",
+    "RadiusSecretDescription": "Споделен таен код между клиент и сървър",
+    "RadiusCalledStationId": "Повиквана станция ID",
+    "RadiusCalledStationIdDescription": "Идентификатор на повикваното устройство",
+    "RadiusCallingStationId": "Повикваща станция ID",
+    "RadiusCallingStationIdDescription": "Идентификатор на повикващото устройство",
+    "Setup Docker Host": "Настройка на Docker хост",
+    "Connection Type": "Тип свързване",
+    "Docker Daemon": "Docker демон",
+    "deleteDockerHostMsg": "Сигурни ли сте, че желаете да изтриете този Docker хост за всички монитори?",
+    "socket": "Сокет",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker контейнер",
+    "Container Name / ID": "Име на контейнер / ID",
+    "Docker Host": "Docker хост",
+    "Docker Hosts": "Docker хостове",
+    "trustProxyDescription": "Trust 'X-Forwarded-*' headers.  Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
+    "Examples": "Примери",
+    "Home Assistant URL": "Home Assistant URL адрес",
+    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token можете да създадете, като кликнете върху името на профила си (долу ляво) и превъртите до най-долу, след това кликнете върху Създаване на токен. ",
+    "Notification Service": "Услуга за известяване",
+    "default: notify all devices": "по подразбиране: извести всички устройства",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Списък с услугите за известяване може да бъде намерен в Home Assistant под \"Developer Tools > Services\", там потърсете \"notification\", за да намерите името на вашето устройство/телефон.",
+    "Automations can optionally be triggered in Home Assistant:": "Автоматизациите могат да се задействат при нужда в Home Assistant:",
+    "Trigger type:": "Задействане тип:",
+    "Event type:": "Събитие тип:",
+    "Event data:": "Събитие данни:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "След което изберете действие, например да превключите сцената, където RGB светлината е червена.",
+    "Frontend Version": "Фронтенд версия",
+    "Frontend Version do not match backend version!": "Фронтенд версията не съвпада с Бекенд версията!",
+    "Base URL": "Базов  URL адрес",
+    "goAlertInfo": "GoAlert е приложение с отворен код за планиране на повиквания, автоматизирани ескалации и известия (като SMS или гласови повиквания). Автоматично ангажирайте точния човек, по точния начин и в точното време! {0}",
+    "goAlertIntegrationKeyInfo": "Вземете общ API интеграционен ключ за услугата във формат \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обикновено стойността на параметъра token на копирания URL адрес.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Отпаднало: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
+    "backupRecommend": "Моля, архивирайте дяла или папката (./data/) директно вместо това.",
+    "Maintenance": "Поддръжка",
+    "statusMaintenance": "Поддръжка",
+    "Schedule maintenance": "Планиране на поддръжка",
+    "Affected Monitors": "Засегнати монитори",
+    "Pick Affected Monitors...": "Изберете засегнати монитори...",
+    "Start of maintenance": "Стартирай поддръжка",
+    "All Status Pages": "Всички статус страници",
+    "Select status pages...": "Изберете статус страници...",
+    "recurringIntervalMessage": "Изпълнявай ежедневно | Изпълнявай всеки {0} дни",
+    "affectedMonitorsDescription": "Изберете монитори, засегнати от текущата поддръжка",
+    "affectedStatusPages": "Покажи това съобщение за поддръжка на избрани статус страници",
+    "atLeastOneMonitor": "Изберете поне един засегнат монитор",
+    "deleteMaintenanceMsg": "Сигурни ли сте, че желаете да изтриете тази поддръжка?",
+    "Optional": "По желание",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Документация ",
+    "Gateway Type": "Тип на шлюза",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Може да разделяте числата с",
+    "or": "или",
+    "recurringInterval": "Интервал",
+    "Recurring": "Повтаряне",
+    "strategyManual": "Активен/Неактивен ръчно",
+    "warningTimezone": "Използва се часовата зона на сървъра",
+    "weekdayShortMon": "Пон",
+    "weekdayShortTue": "Вт",
+    "weekdayShortWed": "Ср",
+    "weekdayShortThu": "Чет",
+    "weekdayShortFri": "Пет",
+    "weekdayShortSat": "Съб",
+    "weekdayShortSun": "Нед",
+    "dayOfWeek": "Ден",
+    "dayOfMonth": "Дата",
+    "lastDay": "Последен ден",
+    "lastDay1": "Последен ден от месеца",
+    "lastDay2": "2-ри последен ден на месеца",
+    "lastDay3": "3-ти последен ден на месеца",
+    "lastDay4": "4-ти последен ден на месеца",
+    "No Maintenance": "Няма поддръжка",
+    "pauseMaintenanceMsg": "Сигурни ли сте, че желаете да направите пауза?",
+    "maintenanceStatus-under-maintenance": "В режим поддръжка",
+    "maintenanceStatus-inactive": "Неактивна",
+    "maintenanceStatus-scheduled": "Планирана",
+    "maintenanceStatus-ended": "Приключена",
+    "maintenanceStatus-unknown": "Неизвестна",
+    "Display Timezone": "Покажи часова зона",
+    "Server Timezone": "Часова зона на сървъра",
+    "statusPageMaintenanceEndDate": "Край",
+    "enableGRPCTls": "Разреши изпращане на gRPC заявка с TLS връзка",
+    "grpcMethodDescription": "Името на метода се форматира в \"cammelCase\", например sayHello, check, и т.н.",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Тел. номер(а)",
+    "smseagleGroup": "Име на група/и от тел. указател",
+    "smseagleContact": "Име(на) от тел. указател",
+    "smseagleRecipientType": "Получател тип",
+    "smseagleRecipient": "Получател(и) (при повече от един разделете със запетая)",
+    "smseagleToken": "API токен за достъп",
+    "smseagleUrl": "Вашият SMSEagle URL на устройството",
+    "smseagleEncoding": "Изпрати като Unicode",
+    "smseaglePriority": "Приоритет на съобщението (0-9, по подразбиране = 0)",
+    "IconUrl": "Икона URL адрес",
+    "webhookAdditionalHeadersTitle": "Допълнителни хедъри",
+    "webhookAdditionalHeadersDesc": "Задава допълнителни хедъри, изпратени с уеб куката.",
+    "Enable DNS Cache": "Активирай DNS кеширане",
+    "Enable": "Активирай",
+    "Disable": "Деактивирай",
+    "dnsCacheDescription": "Възможно е да не работи в IPv6 среда - деактивирайте, ако срещнете проблеми.",
+    "Single Maintenance Window": "Единичен времеви интервал за поддръжка",
+    "Maintenance Time Window of a Day": "Времеви интервал от деня за поддръжка",
+    "Effective Date Range": "Интервал от дни на влизане в сила",
+    "Schedule Maintenance": "Планирай поддръжка",
+    "Date and Time": "Дата и час",
+    "DateTime Range": "Изтрий времеви интервал",
+    "Strategy": "Стратегия",
+    "Free Mobile User Identifier": "Free Mobile потребителски идентификатор",
+    "Free Mobile API Key": "Free Mobile API ключ",
+    "Enable TLS": "Активирай TLS",
+    "Proto Service Name": "Proto име на услугата",
+    "Proto Method": "Proto метод",
+    "Proto Content": "Proto съдържание",
+    "Economy": "Икономичен",
+    "Lowcost": "Евтин",
+    "high": "висок",
+    "General Monitor Type": "Общ тип монитор",
+    "Passive Monitor Type": "Пасивет тип монитор",
+    "Specific Monitor Type": "Специфичен тип монитор"
+}
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
new file mode 100644
index 00000000..4df2650e
--- /dev/null
+++ b/src/lang/cs-CZ.json
@@ -0,0 +1,626 @@
+{
+    "languageName": "Czech",
+    "checkEverySecond": "Kontrolovat každých {0} sekund",
+    "retryCheckEverySecond": "Opakovat každých {0} sekund",
+    "resendEveryXTimes": "Znovu zaslat {0}krát",
+    "resendDisabled": "Opakované zasílání je vypnuté",
+    "retriesDescription": "Maximální počet pokusů před označením služby jako nedostupné a odesláním oznámení",
+    "ignoreTLSError": "Ignorovat TLS/SSL chyby na HTTPS stránkách",
+    "upsideDownModeDescription": "Pomocí této možnosti změníte způsob vyhodnocování stavu. Pokud je služba dosažitelná, je NEDOSTUPNÁ.",
+    "maxRedirectDescription": "Maximální počet přesměrování, která se mají následovat. Nastavením hodnoty 0 zakážete přesměrování.",
+    "acceptedStatusCodesDescription": "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
+    "passwordNotMatchMsg": "Hesla se neshodují",
+    "notificationDescription": "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.",
+    "keywordDescription": "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
+    "pauseDashboardHome": "Pozastavit",
+    "deleteMonitorMsg": "Opravdu chcete odstranit tento dohled?",
+    "deleteNotificationMsg": "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
+    "dnsPortDescription": "Port DNS serveru. Standardně běží na portu 53. V případě potřeby jej můžete kdykoli změnit.",
+    "resolverserverDescription": "Cloudflare je výchozí server. V případě potřeby můžete Resolver server kdykoli změnit.",
+    "rrtypeDescription": "Vyberte typ záznamu o prostředku, který chcete monitorovat",
+    "pauseMonitorMsg": "Opravdu chcete dohled pozastavit?",
+    "enableDefaultNotificationDescription": "Toto oznámení bude standardně aktivní pro nové dohledy. V případě potřeby můžete oznámení stále zakázat na úrovni jednotlivých dohledů.",
+    "clearEventsMsg": "Opravdu chcete odstranit všechny události pro tento dohled?",
+    "clearHeartbeatsMsg": "Opravdu chcete odstranit všechny heartbeaty pro tento dohled?",
+    "confirmClearStatisticsMsg": "Opravdu chcete smazat VŠECHNY statistiky?",
+    "importHandleDescription": "Možnost 'Přeskočit existující' vyberte v případě, že chcete přeskočit všechny dohledy nebo oznámení se stejným názvem. Vybráním možnosti 'Přepsat' dojde k odstranění všech existujících dohledů a oznámení.",
+    "confirmImportMsg": "Opravdu chcete importovat zálohu? Prosím ověřte, zda jste vybrali správnou možnost importu.",
+    "twoFAVerifyLabel": "Prosím, zadejte svůj token pro ověření 2FA:",
+    "tokenValidSettingsMsg": "Token je platný! Nyní můžete uložit nastavení 2FA.",
+    "confirmEnableTwoFAMsg": "Opravdu chcete zapnout 2FA?",
+    "confirmDisableTwoFAMsg": "Opravdu chcete deaktivovat 2FA?",
+    "Settings": "Nastavení",
+    "Dashboard": "Nástěnka",
+    "New Update": "Nová aktualizace",
+    "Language": "Jazyk",
+    "Appearance": "Vzhled",
+    "Theme": "Motiv",
+    "General": "Obecné",
+    "Primary Base URL": "Primární URL adresa",
+    "Version": "Verze",
+    "Check Update On GitHub": "Zkontrolovat aktualizace na GitHubu",
+    "List": "Seznam",
+    "Add": "Přidat",
+    "Add New Monitor": "Přidat nový dohled",
+    "Quick Stats": "Rychlé statistiky",
+    "Up": "Běží",
+    "Down": "Nedostupný",
+    "Pending": "Čekám",
+    "Unknown": "Neznámý",
+    "Pause": "Pozastaveno",
+    "Name": "Název",
+    "Status": "Stav",
+    "DateTime": "Časové razítko",
+    "Message": "Zpráva",
+    "No important events": "Žádné důležité události",
+    "Resume": "Pokračovat",
+    "Edit": "Změnit",
+    "Delete": "Vymazat",
+    "Current": "Aktuální",
+    "Uptime": "Doba provozu",
+    "Cert Exp.": "Platnost certifikátu",
+    "day": "den | dny/í",
+    "-day": "-dní",
+    "hour": "hodina",
+    "-hour": "-hodin",
+    "Response": "Odpověď",
+    "Ping": "Ping",
+    "Monitor Type": "Typ dohledu",
+    "Keyword": "Klíčové slovo",
+    "Friendly Name": "Obecný název",
+    "URL": "URL",
+    "Hostname": "Adresa serveru",
+    "Port": "Port",
+    "Heartbeat Interval": "Heartbeat interval",
+    "Retries": "Počet pokusů",
+    "Heartbeat Retry Interval": "Interval opakování heartbeatu",
+    "Resend Notification if Down X times consequently": "Znovu zaslat oznámení, pokud je služba nedostupná Xkrát za sebou",
+    "Advanced": "Rozšířené",
+    "Upside Down Mode": "Inverzní režim",
+    "Max. Redirects": "Max. přesměrování",
+    "Accepted Status Codes": "Akceptované stavové kódy",
+    "Push URL": "Push URL",
+    "needPushEvery": "Tuto URL adresu byste měli volat každých {0} sekund.",
+    "pushOptionalParams": "Volitelné parametry: {0}",
+    "Save": "Uložit",
+    "Notifications": "Oznámení",
+    "Not available, please setup.": "Není k dispozici, prosím nastavte.",
+    "Setup Notification": "Nastavení oznámení",
+    "Light": "Světlý",
+    "Dark": "Tmavý",
+    "Auto": "Automaticky",
+    "Theme - Heartbeat Bar": "Motiv – Heartbeat panel",
+    "Normal": "Normální",
+    "Bottom": "Dole",
+    "None": "Žádné",
+    "Timezone": "Časové pásmo",
+    "Search Engine Visibility": "Viditelnost pro vyhledávače",
+    "Allow indexing": "Povolit indexování",
+    "Discourage search engines from indexing site": "Zabránit vyhledávačům v indexování stránky",
+    "Change Password": "Změnit heslo",
+    "Current Password": "Aktuální heslo",
+    "New Password": "Nové heslo",
+    "Repeat New Password": "Znovu zadat nové heslo",
+    "Update Password": "Aktualizovat heslo",
+    "Disable Auth": "Deaktivovat ověřování",
+    "Enable Auth": "Povolit ověřování",
+    "disableauth.message1": "Opravdu chcete <strong>deaktivovat autentifikaci</strong>?",
+    "disableauth.message2": "Tato možnost je určena pro případy, kdy <strong>máte autentifikaci zajištěnou třetí stranou</strong> ještě před přístupem do Uptime Kuma, například prostřednictvím Cloudflare Access.",
+    "Please use this option carefully!": "Používejte ji prosím s rozmyslem.",
+    "Logout": "Odhlásit",
+    "Leave": "Odejít",
+    "I understand, please disable": "Rozumím, chci ji deaktivovat",
+    "Confirm": "Potvrzení",
+    "Yes": "Ano",
+    "No": "Ne",
+    "Username": "Uživatelské jméno",
+    "Password": "Heslo",
+    "Remember me": "Zapamatovat si mě",
+    "Login": "Přihlášení",
+    "No Monitors, please": "Žádné dohledy, prosím",
+    "add one": "přidat jeden",
+    "Notification Type": "Typ oznámení",
+    "Email": "E-mail",
+    "Test": "Test",
+    "Certificate Info": "Informace o certifikátu",
+    "Resolver Server": "Resolver Server",
+    "Resource Record Type": "Typ záznamu o prostředku",
+    "Last Result": "Poslední výsledek",
+    "Create your admin account": "Vytvořit účet administrátora",
+    "Repeat Password": "Znovu zadat heslo",
+    "Import Backup": "Importovat zálohu",
+    "Export Backup": "Exportovat zálohu",
+    "Export": "Exportovat",
+    "Import": "Importovat",
+    "respTime": "Doba odezvy (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Standardně povoleno",
+    "Apply on all existing monitors": "Použít pro všechny existující dohledy",
+    "Create": "Vytvořit",
+    "Clear Data": "Vymazat data",
+    "Events": "Události",
+    "Heartbeats": "Heartbeaty",
+    "Auto Get": "Získat automaticky",
+    "backupDescription": "Všechny dohledy a oznámení můžete zálohovat do souboru ve formátu JSON.",
+    "backupDescription2": "Poznámka: Nezahrnuje historii a data událostí.",
+    "backupDescription3": "Součástí exportovaného souboru jsou citlivá data jako tokeny oznámení; export si prosím bezpečně uložte.",
+    "alertNoFile": "Vyberte soubor, který chcete importovat.",
+    "alertWrongFileType": "Vyberte soubor ve formátu JSON.",
+    "Clear all statistics": "Vymazat všechny statistiky",
+    "Skip existing": "Přeskočit existující",
+    "Overwrite": "Přepsat",
+    "Options": "Možnosti",
+    "Keep both": "Ponechat obojí",
+    "Verify Token": "Ověřit token",
+    "Setup 2FA": "Nastavení 2FA",
+    "Enable 2FA": "Povolit 2FA",
+    "Disable 2FA": "Deaktivovat 2FA",
+    "2FA Settings": "Nastavení 2FA",
+    "Two Factor Authentication": "Dvoufaktorová autentifikace",
+    "Active": "Zapnuto",
+    "Inactive": "Neaktivní",
+    "Token": "Token",
+    "Show URI": "Zobrazit URI",
+    "Tags": "Štítky",
+    "Add New below or Select...": "Níže přidejte nový nebo vyberte existující…",
+    "Tag with this name already exist.": "Štítek s tímto názvem již existuje.",
+    "Tag with this value already exist.": "Štítek touto hodnotou již existuje.",
+    "color": "barva",
+    "value (optional)": "hodnota (volitelné)",
+    "Gray": "Šedá",
+    "Red": "Červená",
+    "Orange": "Oranžová",
+    "Green": "Zelená",
+    "Blue": "Modrá",
+    "Indigo": "Indigo",
+    "Purple": "Purpurová",
+    "Pink": "Růžová",
+    "Search...": "Hledat…",
+    "Avg. Ping": "Průměr Ping",
+    "Avg. Response": "Průměr Odpověď",
+    "Entry Page": "Vstupní stránka",
+    "statusPageNothing": "Nic tady není, přidejte prosím skupinu nebo dohled.",
+    "No Services": "Žádné služby",
+    "All Systems Operational": "Všechny systémy běží",
+    "Partially Degraded Service": "Částečně zhoršená služba",
+    "Degraded Service": "Zhoršená služba",
+    "Add Group": "Přidat skupinu",
+    "Add a monitor": "Přidání dohledu",
+    "Edit Status Page": "Upravit stavovou stránku",
+    "Go to Dashboard": "Přejít na nástěnku",
+    "Status Page": "Stavová stránka",
+    "Status Pages": "Stavová stránka",
+    "defaultNotificationName": "Moje {notification} upozornění ({číslo})",
+    "here": "sem",
+    "Required": "Vyžadováno",
+    "telegram": "Telegram",
+    "Bot Token": "Token robota",
+    "wayToGetTelegramToken": "Token můžete získat od {0}.",
+    "Chat ID": "ID chatu",
+    "supportTelegramChatID": "Podpora přímého chatu / skupiny / ID chatu kanálu",
+    "wayToGetTelegramChatID": "ID chatu můžete získat tak, že robotovi zašlete zprávu a přejdete na tuto adresu URL, kde zobrazíte chat_id:",
+    "YOUR BOT TOKEN HERE": "SEM ZADEJTE TOKEN VAŠEHO CHATBOTA",
+    "chatIDNotFound": "ID chatu nebylo nalezeno; nejprve tomuto robotovi zašlete zprávu",
+    "webhook": "Webhook",
+    "Post URL": "URL adresa příspěvku",
+    "Content Type": "Typ obsahu",
+    "webhookJsonDesc": "{0} je vhodný pro všechny moderní servery HTTP, jako je Express.js",
+    "webhookFormDataDesc": "{multipart} je vhodné pro PHP. JSON bude nutné analyzovat prostřednictvím {decodeFunction}",
+    "smtp": "E-mail (SMTP)",
+    "secureOptionNone": "Žádné / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignorovat chybu TLS",
+    "From Email": "Odesílatel",
+    "emailCustomSubject": "Vlastní předmět",
+    "To Email": "Příjemce",
+    "smtpCC": "Kopie",
+    "smtpBCC": "Skrytá kopie",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Získáte tak, že přejdete do Nastavení serveru - > Integrace - > Vytvořit Webhook",
+    "Bot Display Name": "Zobrazované jméno robota",
+    "Prefix Custom Message": "Předpona vlastní zprávy",
+    "Hello @everyone is...": "Dobrý den, {'@'}všichni jsou…",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL adresa webhooku",
+    "wayToGetTeamsURL": "Informace o tom, jak vytvořit URL adresu webhooku naleznete {0}.",
+    "signal": "Signal",
+    "Number": "Číslo",
+    "Recipients": "Příjemci",
+    "needSignalAPI": "Musíte mít Signal klienta s REST API.",
+    "wayToCheckSignalURL": "Pro zobrazení instrukcí, jak službu nastavit, přejděte na následující adresu:",
+    "signalImportant": "Důležité V seznamu příjemců není možné současně použít skupiny a čísla!",
+    "gotify": "Gotify",
+    "Application Token": "Token aplikace",
+    "Server URL": "URL adresa serveru",
+    "Priority": "Priorita",
+    "slack": "Slack",
+    "Icon Emoji": "Ikona smajlíka",
+    "Channel Name": "Název kanálu",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Více informací o Webhoocích naleznete na adrese: {0}",
+    "aboutChannelName": "Pro vynechání Webhook kanálu zadejte jeho název do pole Název kanálu {0}. Příklad: #jiny-kanal",
+    "aboutKumaURL": "Pokud ponecháte pole URL adresa Uptime Kuma prázdné, použije se domovská stránka GitHub projektu.",
+    "emojiCheatSheet": "Tahák smajlíků: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (podpora více než 50 oznamovacích služeb)",
+    "GoogleChat": "Google Chat (pouze Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Klíč uživatele",
+    "Device": "Zařízení",
+    "Message Title": "Nadpis zprávy",
+    "Notification Sound": "Zvuk oznámení",
+    "More info on:": "Více informací naleznete na adrese: {0}",
+    "pushoverDesc1": "Výchozí časový limit pro emergency prioritu (2) je 30 sekund mezi opakovanými pokusy a vyprší po 1 hodině.",
+    "pushoverDesc2": "Pokud chcete odesílat oznámení do různých zařízení, vyplňte pole Zařízení.",
+    "SMS Type": "Typ SMS",
+    "octopushTypePremium": "Premium (rychlé – doporučeno pro upozornění)",
+    "octopushTypeLowCost": "Nízké náklady (pomalé – někdy blokované operátorem)",
+    "checkPrice": "Ceny {0} zjistíte na adrese:",
+    "apiCredentials": "API přihlašovací údaje",
+    "octopushLegacyHint": "Používáte starší verzi Octopush (2011-2020) nebo novou verzi?",
+    "Check octopush prices": "Ceny octopush naleznete na adrese {0}.",
+    "octopushPhoneNumber": "Telefonní číslo (v mezinárodním formátu, např: +42012345678) ",
+    "octopushSMSSender": "Odesílatel SMS: 3-11 alfanumerických znaků a mezera (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID zařízení LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Příklad: {0}",
+    "Read more:": "Více informací: {0}",
+    "Status:": "Stav: {0}",
+    "Read more": "Více informací",
+    "appriseInstalled": "Apprise je nainstalován.",
+    "appriseNotInstalled": "Apprise není nainstalován. {0}",
+    "Access Token": "Přístupový token",
+    "Channel access token": "Přístupový token ke kanálu",
+    "Line Developers Console": "Konzole Line Developers",
+    "lineDevConsoleTo": "Konzole Line Developers - {0}",
+    "Basic Settings": "Obecné nastavení",
+    "User ID": "ID uživatele",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Nejprve otevřete {0}, vytvořte poskytovatele a kanál (Messaging API). Poté můžete získat přístupový token ke kanálu a ID uživatele, v sekci uvedené výše.",
+    "Icon URL": "URL adresa ikony",
+    "aboutIconURL": "Pro přepsání výchozího profilového obrázku můžete do pole \"URL adresa ikony\" zadat odkaz na obrázek. Nebude použito, pokud je nastavena ikona smajlíka.",
+    "aboutMattermostChannelName": "Výchozí kanál, do kterého jsou zasílány Webhook příspěvky, můžete přepsat zadáním názvu kanálu do pole \"Název kanálu\". Tato možnost musí být povolena v nastavení Mattermost Webhooku. Příklad: #jiny-kanal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO – levné, ale pomalé a často přetížené. Omezeno pouze na polské příjemce.",
+    "promosmsTypeFlash": "SMS FLASH –zpráva se automaticky zobrazí na zařízení příjemce. Omezeno pouze na polské příjemce.",
+    "promosmsTypeFull": "SMS FULL – prémiová úroveň SMS. Můžete definovat odesílatele (vyžadována registrace jména). Spolehlivý pro výstrahy.",
+    "promosmsTypeSpeed": "SMS SPEED – nejvyšší priorita v systému. Velmi rychlé a spolehlivé, ale nákladné (přibližně dvojnásobek ceny SMS FULL).",
+    "promosmsPhoneNumber": "Telefonní číslo (polští příjemci mohou vynechat telefonní předvolbu)",
+    "promosmsSMSSender": "Odesílatel SMS: Předem zaregistrovaný název nebo jeden z výchozích: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "URL adresa domácího serveru (s http(s):// a volitelně portem)",
+    "Internal Room Id": "ID interní místnosti",
+    "matrixDesc1": "ID interní místnosti naleznete v Matrix klientovi v rozšířeném nastavení místnosti. Mělo by být ve tvaru !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Důrazně doporučujeme vytvořit nového uživatele a nepoužívat váš vlastní přístupový token uživatele Matrix. Pomocí něj je možné získat přístup k vašemu účtu a všem místnostem, ke kterým jste se připojili. Místo toho vytvořte nového uživatele a pozvěte jej pouze do místnosti, do které chcete oznámení dostávat. Přístupový token můžete získat spuštěním {0}",
+    "Method": "Metoda",
+    "Body": "Tělo",
+    "Headers": "Hlavičky",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Hlaviča žádosti není platný JSON: ",
+    "BodyInvalidFormat": "Text žádosti není platný JSON: ",
+    "Monitor History": "Historie dohledu",
+    "clearDataOlderThan": "Historie dohledu bude uchovávána po dobu {0} dní.",
+    "PasswordsDoNotMatch": "Hesla se neshodují.",
+    "records": "záznamů",
+    "One record": "Jeden záznam",
+    "steamApiKeyDescription": "Pro monitorování Steam Game Serveru je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
+    "Current User": "Aktuálně přihlášený uživatel",
+    "topic": "Topic",
+    "topicExplanation": "MQTT topic, který chcete sledovat",
+    "successMessage": "Zpráva o úspěchu",
+    "successMessageExplanation": "MQTT zpráva považovaná za úspěšnou",
+    "recent": "Poslední",
+    "Done": "Hotovo",
+    "Info": "Informace",
+    "Security": "Bezpečnost",
+    "Steam API Key": "API klíč služby Steam",
+    "Shrink Database": "Zmenšit databázi",
+    "Pick a RR-Type...": "Vyberte typ záznamu o prostředku…",
+    "Pick Accepted Status Codes...": "Vyberte stavové kódy, které chcete akceptovat…",
+    "Default": "Výchozí",
+    "HTTP Options": "Možnosti protokolu HTTP",
+    "Create Incident": "Vytvořit incident",
+    "Title": "Předmět",
+    "Content": "Obsah",
+    "Style": "Styl",
+    "info": "informace",
+    "warning": "upozornění",
+    "danger": "riziko",
+    "error": "chyba",
+    "critical": "kritické",
+    "primary": "primární",
+    "light": "světlý",
+    "dark": "tmavý",
+    "Post": "Publikovat",
+    "Please input title and content": "Zadejte prosím název a obsah",
+    "Created": "Vytvořen",
+    "Last Updated": "Poslední aktualizace",
+    "Unpin": "Odepnout",
+    "Switch to Light Theme": "Přepnout na světlý motiv",
+    "Switch to Dark Theme": "Přepnout na tmavý motiv",
+    "Show Tags": "Zobrazit štítky",
+    "Hide Tags": "Skrýt štítky",
+    "Description": "Popis",
+    "No monitors available.": "Není dostupný žádný dohled.",
+    "Add one": "Přidat jeden",
+    "No Monitors": "Žádný dohled",
+    "Untitled Group": "Skupina bez názvu",
+    "Services": "Služby",
+    "Discard": "Zahodit",
+    "Cancel": "Zrušit",
+    "Powered by": "Poskytuje",
+    "shrinkDatabaseDescription": "Pomocí této možnosti provedete příkaz VACUUM nad SQLite databází. Pokud byla databáze vytvořena po vydání verze 1.10.0, AUTO_VACUUM je již povolena a tato akce není vyžadována.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API uživatelské jméno (včetně předpony webapi_)",
+    "serwersmsAPIPassword": "API heslo",
+    "serwersmsPhoneNumber": "Telefonní číslo",
+    "serwersmsSenderName": "Odesílatel SMS (registrováno prostřednictvím zákaznického portálu)",
+    "stackfield": "Stackfield",
+    "Customize": "Přizpůsobit",
+    "Custom Footer": "Vlastní patička",
+    "Custom CSS": "Vlastní CSS",
+    "smtpDkimSettings": "Nastavení DKIM",
+    "smtpDkimDesc": "Informace o použití naleznete v {0} Nodemailer DKIM.",
+    "documentation": "dokumentaci",
+    "smtpDkimDomain": "Název domény",
+    "smtpDkimKeySelector": "Selektor klíče",
+    "smtpDkimPrivateKey": "Privátní klíč",
+    "smtpDkimHashAlgo": "Hashovací algoritmus (volitelné)",
+    "smtpDkimheaderFieldNames": "Podepisovat tyto hlavičky (volitelné)",
+    "smtpDkimskipFields": "Nepodepisovat tyto hlavičky (volitelné)",
+    "wayToGetPagerDutyKey": "Získat jej můžete v sekci Service -> Service Directory -> (vyberte službu) -> Integrations -> Add integration. Následně vyhledejte \"Events API V2\". Více informace naleznete na adrese {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
+    "do nothing": "do nothing",
+    "auto acknowledged": "auto acknowledged",
+    "auto resolve": "auto resolve",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Prostředí",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Stav upozornění",
+    "alertaRecoverState": "Stav obnovení",
+    "deleteStatusPageMsg": "Opravdu chcete odstranit tuto stavovou stránku?",
+    "Proxies": "Proxy",
+    "default": "Výchozí",
+    "enabled": "Zapnuto",
+    "setAsDefault": "Nastavit jako výchozí",
+    "deleteProxyMsg": "Opravdu chcete odstranit tuto proxy ze všech dohledů?",
+    "proxyDescription": "Pro zajištění funkčnosti musí být proxy přiřazena dohledům.",
+    "enableProxyDescription": "Tato proxy neovlivní žádosti dohledu do doby, než ji aktivujete. Změnou tohoto nastavení dočasně zakážete použití proxy ve všech dohledech.",
+    "setAsDefaultProxyDescription": "Tato proxy se použije pro všechny nové dohledy. V případě potřeby můžete její využívání zakázat v konkrétním dohledu.",
+    "Certificate Chain": "Řetězec certifikátu",
+    "Valid": "Platný",
+    "Invalid": "Neplatný",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Z důvodu bezpečnosti použijte secret key",
+    "Device Token": "Token zařízení",
+    "Platform": "Platforma",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Vysoký",
+    "Retry": "Opakovat",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Nastavit proxy",
+    "Proxy Protocol": "Protokol proxy",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server vyžaduje ověření",
+    "User": "Uživatel",
+    "Installed": "Nainstalováno",
+    "Not installed": "Nenainstalováno",
+    "Running": "Běží",
+    "Not running": "Neběží",
+    "Remove Token": "Odstranit token",
+    "Start": "Spustit",
+    "Stop": "Zastavit",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Přidat novou stavovou stránku",
+    "Slug": "Slug",
+    "Accept characters:": "Přípustné znaky:",
+    "startOrEndWithOnly": "Počáteční a koncový znak může být pouze {0}",
+    "No consecutive dashes": "Nesmí se opakovat pomlčky",
+    "Next": "Další",
+    "The slug is already taken. Please choose another slug.": "Slug s tímto názvem již existuje. Prosím, zadejte jiný název.",
+    "No Proxy": "Žádná proxy",
+    "Authentication": "Ověření",
+    "HTTP Basic Auth": "HTTP Basic ověření",
+    "New Status Page": "Nová stavová stránka",
+    "Page Not Found": "Stránka nenalezena",
+    "Reverse Proxy": "Reverzní proxy",
+    "Backup": "Záloha",
+    "About": "O programu",
+    "wayToGetCloudflaredURL": "(Stáhnout cloudflared z {0})",
+    "cloudflareWebsite": "Webová stránka Cloudflare",
+    "Message:": "Zpráva:",
+    "Don't know how to get the token? Please read the guide:": "Nevíte jak získat? Prosím, přečtěte si tuto příručku:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Stávající připojení mohlo být ztraceno, pokud jste připojeni prostřednictvím Cloudflare tunelu. Opravdu jej chcete zastavit? Pro potvrzení zadejte své současné heslo.",
+    "HTTP Headers": "HTTP hlavičky",
+    "Trust Proxy": "Důvěryhodná proxy",
+    "Other Software": "Jiný software",
+    "For example: nginx, Apache and Traefik.": "Například nginx, Apache nebo Traefik.",
+    "Please read": "Prosím, přečtěte si informace na adrese",
+    "Subject:": "Předmět:",
+    "Valid To:": "Platnost do:",
+    "Days Remaining:": "Počet zbývajících dní:",
+    "Issuer:": "Vydavatel:",
+    "Fingerprint:": "Otisk:",
+    "No status pages": "Žádná stavová stránka",
+    "Domain Name Expiry Notification": "Oznámení na blížící se konec platnosti doménového jména",
+    "Proxy": "Proxy",
+    "Date Created": "Datum vytvoření",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP adresa",
+    "onebotMessageType": "Typ OneBot zprávy",
+    "onebotGroupMessage": "Skupinová",
+    "onebotPrivateMessage": "Soukromá",
+    "onebotUserOrGroupId": "ID skupiny/uživatele",
+    "onebotSafetyTips": "Z důvodu bezpečnosti je nutné zadat přístupový token",
+    "PushDeer Key": "PushDeer klíč",
+    "Footer Text": "Text v patičce",
+    "Show Powered By": "Zobrazit \"Poskytuje\"",
+    "Domain Names": "Názvy domén",
+    "signedInDisp": "Přihlášen jako {0}",
+    "signedInDispDisabled": "Ověření je vypnuté.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Sdílený tajný klíč mezi klientem a serverem",
+    "RadiusCalledStationId": "ID volaného zařízení",
+    "RadiusCalledStationIdDescription": "Identifikátor volaného zařízení",
+    "RadiusCallingStationId": "ID volajícího zařízení",
+    "RadiusCallingStationIdDescription": "Identifikátor volajícího zařízení",
+    "Certificate Expiry Notification": "Oznámení na blížící se konec platnosti certifikátu",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "Číslo příjemce",
+    "From Name/Number": "Jméno/číslo odesílatele",
+    "Leave blank to use a shared sender number.": "Ponechte prázdné, pokud chcete použít číslo sdíleného příjemce.",
+    "Octopush API Version": "Octopush API verze",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" ze sekce HTTP API credentials na nástěnce",
+    "octopushLogin": "\"Login\" ze sekce HTTP API credentials na nástěnce",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (výchozí)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (dlouhý)",
+    "pushoversounds climb": "Climb (dlouhý)",
+    "pushoversounds persistent": "Persistent (dlouhý)",
+    "pushoversounds echo": "Pushover Echo (dlouhý)",
+    "pushoversounds updown": "Up Down (dlouhý)",
+    "pushoversounds vibrate": "Pouze vibrace",
+    "pushoversounds none": "Žádný (ticho)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Token zařízení",
+    "Show update if available": "Upozornit na aktualizace, pokud jsou k dispozici",
+    "Also check beta release": "Kontrolovat také dostupnost beta verzí",
+    "Using a Reverse Proxy?": "Používáte reverzní proxy?",
+    "Check how to config it for WebSocket": "Zjistěte, jak ji nakonfigurovat pro WebSockety",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Nejčastější důvody:",
+    "The resource is no longer available.": "Zdroj již není k dispozici.",
+    "There might be a typing error in the address.": "Při zadávání adresy jste udělali chybu.",
+    "What you can try:": "Co můžete vyzkoušet:",
+    "Retype the address.": "Znovu zadat adresu.",
+    "Go back to the previous page.": "Vrátit se na předchozí stránku.",
+    "Coming Soon": "Připravujeme",
+    "wayToGetClickSendSMSToken": "API Username a API Key získáte na adrese {0} .",
+    "Connection String": "Connection String",
+    "Query": "Dotaz",
+    "settingsCertificateExpiry": "Platnost TLS certifikátu",
+    "certificationExpiryDescription": "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:",
+    "Setup Docker Host": "Nastavit Docker hostitele",
+    "Connection Type": "Typ připojení",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Opravdu chcete odstranit tohoto docker hostitele ze všech dohledů?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker kontejner",
+    "Container Name / ID": "ID / název kontejneru",
+    "Docker Host": "Docker hostitel",
+    "Docker Hosts": "Docker hostitelé",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Doména",
+    "Workstation": "Pracovní stanice",
+    "disableCloudflaredNoAuthMsg": "Používáte režim bez ověření, heslo není vyžadováno.",
+    "trustProxyDescription": "Důvěřovat 'X-Forwarded-*' hlavičkám. Pokud chcete získat správnou IP adresu klientů a vaše instance Uptime Kuma je schována za Nginx nebo Apache, měli byste tuto možnost zapnout.",
+    "wayToGetLineNotifyToken": "Přístupový token můžete získat na adrese {0}",
+    "Examples": "Příklady",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Dlouhodobý přístupový token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Pro vytvoření dlouhodobého přístupový tokenu klikněte na název svého profilu (v levém dolním rohu) a následně v dolní části stránky klikněte na tlačítko Create Token. ",
+    "Notification Service": "Oznamovací služba",
+    "default: notify all devices": "výchozí: upozornit všechny zařízení",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Seznam dostupných oznamovacích služeb naleznete v Home Assistant v sekci \"Developer Tools > Services\", kde vyhledejte \"notification\" pro zjištění názvu zařízení.",
+    "Automations can optionally be triggered in Home Assistant:": "Automatizaci můžete volitelně aktivovat prostřednictvím Home Assistant:",
+    "Trigger type:": "Typ podmínky spuštění:",
+    "Event type:": "Typ události:",
+    "Event data:": "Data události:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Následně vyberte akci, například přepnutí scény z RGB světla na červenou.",
+    "Frontend Version": "Verze frontendu",
+    "Frontend Version do not match backend version!": "Verze frontendu neodpovídá verzi backendu!",
+    "Base URL": "Primární URL adresa",
+    "goAlertInfo": "GoAlert je aplikace s otevřeným zdrojovým kódem pro plánování hovorů, automatické eskalace a upozornění (jako jsou SMS nebo hlasové hovory). Automaticky zapojte správnou osobu, správným způsobem a ve správný čas! {0}",
+    "goAlertIntegrationKeyInfo": "Obecný API integrační klíč pro danou službu ve formátu \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" se obvykle nachází ve zkopírované URL jako hodnota parametru token.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Zastaralé: V poslední době byla funkčnost aplikace značně rozšířena, nicméně součást pro zálohování nepokrývá všechny možnosti. Z tohoto důvodu není možné vygenerovat úplnou zálohu a zajistit obnovení všech dat.",
+    "backupRecommend": "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
+    "Optional": "Volitelný",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Docs ",
+    "Gateway Type": "Gateway Typ",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Čísla můžete dělit pomocí",
+    "or": "nebo",
+    "recurringInterval": "Interval",
+    "Recurring": "Recurring",
+    "strategyManual": "Aktivní/Neaktivní Ručně",
+    "warningTimezone": "Používá se časové pásmo serveru",
+    "weekdayShortMon": "Po",
+    "weekdayShortTue": "Út",
+    "weekdayShortWed": "St",
+    "weekdayShortThu": "Čt",
+    "weekdayShortFri": "Pá",
+    "weekdayShortSat": "So",
+    "weekdayShortSun": "Ne",
+    "dayOfWeek": "Den v týdnu",
+    "dayOfMonth": "Den v měsíci",
+    "lastDay": "Poslední den",
+    "lastDay1": "1. poslední den v měsíci",
+    "lastDay2": "2. poslední den v měsíci",
+    "lastDay3": "3. poslední den v měsíci",
+    "lastDay4": "4. poslední den v měsíci",
+    "No Maintenance": "Žádna údržba",
+    "pauseMaintenanceMsg": "Jsi si jistý, že chceš pozastavit údržbu?",
+    "maintenanceStatus-under-maintenance": "Údržba",
+    "maintenanceStatus-inactive": "Neaktivní",
+    "maintenanceStatus-scheduled": "Naplánováno",
+    "maintenanceStatus-ended": "Ukončeno",
+    "maintenanceStatus-unknown": "Neznámý",
+    "Display Timezone": "Zobrazit časové pásmo",
+    "Server Timezone": "Časové pásmo serveru",
+    "statusPageMaintenanceEndDate": "Konec",
+    "IconUrl": "Adresa URL ikony",
+    "Enable DNS Cache": "Povolit DNS Cache",
+    "Enable": "Povolit",
+    "Disable": "Zakázat",
+    "dnsCacheDescription": "V některých prostředích IPv6 nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej."
+}
diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
new file mode 100644
index 00000000..9cd1a463
--- /dev/null
+++ b/src/lang/da-DK.json
@@ -0,0 +1,355 @@
+{
+    "languageName": "Danish (Danmark)",
+    "Settings": "Indstillinger",
+    "Dashboard": "Betjeningspanel",
+    "New Update": "Opdatering tilgængelig",
+    "Language": "Sprog",
+    "Appearance": "Udseende",
+    "Theme": "Tema",
+    "General": "Generelt",
+    "Version": "Version",
+    "Check Update On GitHub": "Tjek efter opdateringer på Github",
+    "List": "Liste",
+    "Add": "Tilføj",
+    "Add New Monitor": "Tilføj ny Overvåger",
+    "Quick Stats": "Oversigt",
+    "Up": "Aktiv",
+    "Down": "Inaktiv",
+    "Pending": "Afventer",
+    "Unknown": "Ukendt",
+    "Pause": "Stands",
+    "pauseDashboardHome": "Standset",
+    "Name": "Navn",
+    "Status": "Status",
+    "DateTime": "Dato / Tid",
+    "Message": "Beskeder",
+    "No important events": "Inden vigtige begivenheder",
+    "Resume": "Fortsæt",
+    "Edit": "Rediger",
+    "Delete": "Slet",
+    "Current": "Aktuelt",
+    "Uptime": "Oppetid",
+    "Cert Exp.": "Certifikatets udløb",
+    "day": "Dag | Dage",
+    "-day": "-Dage",
+    "hour": "Timer",
+    "-hour": "-Timer",
+    "checkEverySecond": "Tjek hvert {0} sekund",
+    "Response": "Respons",
+    "Ping": "Ping",
+    "Monitor Type": "Overvåger Type",
+    "Keyword": "Nøgleord",
+    "Friendly Name": "Visningsnavn",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Taktinterval",
+    "Retries": "Gentagelser",
+    "retriesDescription": "Maksimalt antal gentagelser, før tjenesten markeres som inaktiv og sender en meddelelse.",
+    "Advanced": "Avanceret",
+    "ignoreTLSError": "Ignorere TLS/SSL web fejl",
+    "Upside Down Mode": "Omvendt tilstand",
+    "upsideDownModeDescription": "Håndter tilstanden omvendt. Hvis tjenesten er tilgængelig, vises den som inaktiv.",
+    "Max. Redirects": "Maks. Omdirigeringer",
+    "maxRedirectDescription": "Maksimalt antal omdirigeringer, der skal følges. Indstil til 0 for at deaktivere omdirigeringer.",
+    "Accepted Status Codes": "Tilladte HTTP-Statuskoder",
+    "acceptedStatusCodesDescription": "Vælg de statuskoder, der stadig skal vurderes som vellykkede.",
+    "Save": "Gem",
+    "Notifications": "Underretninger",
+    "Not available, please setup.": "Ikke tilgængelige, opsæt venligst.",
+    "Setup Notification": "Opsæt underretninger",
+    "Light": "Lys",
+    "Dark": "Mørk",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Tema - Tidslinje",
+    "Normal": "Normal",
+    "Bottom": "Bunden",
+    "None": "Ingen",
+    "Timezone": "Tidszone",
+    "Search Engine Visibility": "Søgemaskine synlighed",
+    "Allow indexing": "Tillad indeksering",
+    "Discourage search engines from indexing site": "Frabed søgemaskiner at indeksere webstedet",
+    "Change Password": "Ændre adgangskode",
+    "Current Password": "Nuværende adgangskode",
+    "New Password": "Ny adgangskode",
+    "Repeat New Password": "Gentag den nye adgangskode",
+    "passwordNotMatchMsg": "Adgangskoderne er ikke ens.",
+    "Update Password": "Opdater adgangskode",
+    "Disable Auth": "Deaktiver autentificering",
+    "Enable Auth": "Aktiver autentificering",
+    "Logout": "Log ud",
+    "notificationDescription": "Tildel underretninger til Overvåger(e), så denne funktion træder i kraft.",
+    "Leave": "Verlassen",
+    "I understand, please disable": "Jeg er indforstået, deaktiver venligst",
+    "Confirm": "Bekræft",
+    "Yes": "Ja",
+    "No": "Nej",
+    "Username": "Brugernavn",
+    "Password": "Adgangskode",
+    "Remember me": "Husk mig",
+    "Login": "Log ind",
+    "No Monitors, please": "Ingen Overvågere",
+    "add one": "tilføj en",
+    "Notification Type": "Underretningstype",
+    "Email": "E-Mail",
+    "Test": "Test",
+    "Certificate Info": "Certifikatoplysninger",
+    "keywordDescription": "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.",
+    "deleteMonitorMsg": "Er du sikker på, at du vil slette overvågeren?",
+    "deleteNotificationMsg": "Er du sikker på, at du vil slette denne underretning for alle overvågere? ",
+    "resolverserverDescription": "Cloudflare er standardserveren, den kan til enhver tid ændres.",
+    "Resolver Server": "Navne-server",
+    "rrtypeDescription": "Vælg den type RR, du vil overvåge.",
+    "Last Result": "Seneste resultat",
+    "pauseMonitorMsg": "Er du sikker på, at du vil standse Overvågeren?",
+    "Create your admin account": "Opret din administratorkonto",
+    "Repeat Password": "Gentag adgangskoden",
+    "Resource Record Type": "Resource Record Type",
+    "respTime": "Resp. Tid (ms)",
+    "notAvailableShort": "N/A",
+    "Create": "Opret",
+    "clearEventsMsg": "Er du sikker på vil slette alle events for denne Overvåger?",
+    "clearHeartbeatsMsg": "Er du sikker på vil slette alle hjerteslag for denne Overvåger?",
+    "confirmClearStatisticsMsg": "Vil du helt sikkert slette ALLE statistikker?",
+    "Clear Data": "Ryd Data",
+    "Events": "Events",
+    "Heartbeats": "Hjerteslag",
+    "Auto Get": "Auto-hent",
+    "enableDefaultNotificationDescription": "For hver ny overvåger aktiveres denne underretning som standard. Du kan stadig deaktivere underretningen separat for hver skærm.",
+    "Default enabled": "Standard aktiveret",
+    "Also apply to existing monitors": "Anvend også på eksisterende overvågere",
+    "Export": "Eksport",
+    "Import": "Import",
+    "backupDescription": "Du kan sikkerhedskopiere alle Overvågere og alle underretninger til en JSON-fil.",
+    "backupDescription2": "PS: Historik og hændelsesdata er ikke inkluderet.",
+    "backupDescription3": "Følsom data, f.eks. underretnings-tokener, er inkluderet i eksportfilen. Gem den sikkert.",
+    "alertNoFile": "Vælg en fil der skal importeres.",
+    "alertWrongFileType": "Vælg venligst en JSON-fil.",
+    "twoFAVerifyLabel": "Indtast venligst dit token for at bekræfte, at 2FA fungerer",
+    "tokenValidSettingsMsg": "Token er gyldigt! Du kan nu gemme 2FA -indstillingerne.",
+    "confirmEnableTwoFAMsg": "Er du sikker på at du vil aktivere 2FA?",
+    "confirmDisableTwoFAMsg": "Er du sikker på at du vil deaktivere 2FA?",
+    "Apply on all existing monitors": "Anvend på alle eksisterende overvågere",
+    "Verify Token": "Verificere Token",
+    "Setup 2FA": "Opsæt 2FA",
+    "Enable 2FA": "Aktiver 2FA",
+    "Disable 2FA": "Deaktiver 2FA",
+    "2FA Settings": "2FA Indstillinger",
+    "Two Factor Authentication": "To-Faktor Autentificering",
+    "Active": "Aktive",
+    "Inactive": "Inaktive",
+    "Token": "Token",
+    "Show URI": "Vis URI",
+    "Clear all statistics": "Ryd alle Statistikker",
+    "retryCheckEverySecond": "Prøv igen hvert {0} sekund.",
+    "importHandleDescription": "Vælg 'Spring over eksisterende', hvis du vil springe over hver overvåger eller underretning med samme navn. 'Overskriv' sletter alle eksisterende overvågere og underretninger.",
+    "confirmImportMsg": "Er du sikker på at importere sikkerhedskopien? Sørg for, at du har valgt den rigtige importindstilling.",
+    "Heartbeat Retry Interval": "Hjerteslag Gentagelsesinterval",
+    "Import Backup": "Importer Backup",
+    "Export Backup": "Eksporter Backup",
+    "Skip existing": "Spring over eksisterende",
+    "Overwrite": "Overskriv",
+    "Options": "Valgmuligheder",
+    "Keep both": "Behold begge",
+    "Tags": "Etiketter",
+    "Add New below or Select...": "Tilføj Nyt nedenfor eller Vælg ...",
+    "Tag with this name already exist.": "Et Tag med dette navn findes allerede.",
+    "Tag with this value already exist.": "Et Tag med denne værdi findes allerede.",
+    "color": "farve",
+    "value (optional)": "værdi (valgfri)",
+    "Gray": "Grå",
+    "Red": "Rød",
+    "Orange": "Orange",
+    "Green": "Grøn",
+    "Blue": "Blå",
+    "Indigo": "Indigo",
+    "Purple": "Lilla",
+    "Pink": "Pink",
+    "Search...": "Søg...",
+    "Avg. Ping": "Gns. Ping",
+    "Avg. Response": "Gns. Respons",
+    "Entry Page": "Entry Side",
+    "statusPageNothing": "Intet her, tilføj venligst en Gruppe eller en Overvåger.",
+    "No Services": "Ingen Tjenester",
+    "All Systems Operational": "Alle Systemer i Drift",
+    "Partially Degraded Service": "Delvist Forringet Service",
+    "Degraded Service": "Forringet Service",
+    "Add Group": "Tilføj Gruppe",
+    "Add a monitor": "Tilføj en Overvåger",
+    "Edit Status Page": "Rediger Statusside",
+    "Go to Dashboard": "Gå til Betjeningspanel",
+    "Status Page": "Statusside",
+    "Status Pages": "Statusside",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Understøtter 50+ Notifikationstjenester)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Primær Basis-URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Du bør kalde denne webadresse hvert {0} sekund.",
+    "pushOptionalParams": "Valgfrie parametre: {0}",
+    "defaultNotificationName": "Min {notification} Advarsel ({number})",
+    "here": "her",
+    "Required": "Påkrævet",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Du kan få et token fra {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "Du kan få dit chat-ID ved at sende en besked til bot'en og gå til denne URL for at se chat_id'et:",
+    "YOUR BOT TOKEN HERE": "DIT BOT TOKEN HER",
+    "chatIDNotFound": "Chat-ID blev ikke fundet; send venligst en besked til denne bot først ",
+    "Post URL": "Post URL",
+    "Content Type": "Indholdstype",
+    "webhookJsonDesc": "{0} er god til alle moderne HTTP-servere som f.eks Express.js",
+    "webhookFormDataDesc": "{multipart} er god til PHP. JSON'en skal parses med {decodeFunction}",
+    "secureOptionNone": "Ingen / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignorer TLS-fejl",
+    "From Email": "Afsender Email",
+    "emailCustomSubject": "Brugerdefineret Emne",
+    "To Email": "Modtager Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Du kan få dette ved at gå til Serverindstillinger -> Integrationer -> Opret webhook ",
+    "Bot Display Name": "Bot Visningsnavn",
+    "Prefix Custom Message": "Præfiks Brugerdefineret Besked",
+    "Hello @everyone is...": "Hello {'@'}everyone is...",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Du kan lære, hvordan du laver en webhook URL {0}.",
+    "Number": "Nummer",
+    "Recipients": "Modtagere",
+    "needSignalAPI": "Du skal have en Signal-klient med REST API.",
+    "wayToCheckSignalURL": "Du kan tjekke denne URL for at se, hvordan du konfigurerer en:",
+    "signalImportant": "VIGTIGT: Du kan ikke blande grupper og numre i modtagere!",
+    "Application Token": "Program Token",
+    "Server URL": "Server URL",
+    "Priority": "Prioritet",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Kanalnavn",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Mere info om Webhooks på: {0}",
+    "aboutChannelName": "Indtast kanalnavnet i {0} Kanalnavn feltet, hvis du vil omgå Webhook-kanalen. Eks: #anden-kanal",
+    "aboutKumaURL": "Hvis du efterlader Uptime Kuma URL-feltet tomt, vil det som standard gå til projektets GitHub-siden.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "clicksendsms": "ClickSend SMS",
+    "User Key": "Bruger-Nøgle",
+    "Device": "Enhed",
+    "Message Title": "Besked Titel",
+    "Notification Sound": "Notifikationslyd",
+    "More info on:": "Mere info på: {0}",
+    "pushoverDesc1": "Nødprioritet (2) har som standard 30 sekunders timeout mellem genforsøg og udløber efter 1 time.",
+    "pushoverDesc2": "Hvis du vil sende meddelelser til forskellige enheder, skal du udfylde feltet Enhed.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Hurtig - anbefales til advarsel)",
+    "octopushTypeLowCost": "Lavpris (Langsom - nogle gange blokeret af operatøren)",
+    "checkPrice": "Tjek {0} priser:",
+    "apiCredentials": "API legitimationsoplysninger",
+    "octopushLegacyHint": "Bruger du den ældre version af Octopush (2011-2020) eller den nye version?",
+    "Check octopush prices": "Tjek octopush priser {0}.",
+    "octopushPhoneNumber": "Telefonnummer (intl format, f.eks : +4512345678) ",
+    "octopushSMSSender": "SMS Afsender Navn : 3-11 alfanumeriske tegn og mellemrum (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Enhed-ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Eksempel: {0}",
+    "Read more:": "Læs mere: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Læs mere",
+    "appriseInstalled": "Apprise er installeret.",
+    "appriseNotInstalled": "Apprise er ikke installeret. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "kanaladgangstoken",
+    "Line Developers Console": "Line Udviklerkonsol",
+    "lineDevConsoleTo": "Line Udviklerkonsol - {0}",
+    "Basic Settings": "Basisindstillinger",
+    "User ID": "Bruger-ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Tilgå først {0}, opret en udbyder og kanal (Messaging API), så kan du få kanaladgangstoken'et og bruger-ID'et fra de ovennævnte menupunkter.",
+    "Icon URL": "Ikon URL",
+    "aboutIconURL": "Du kan angive et link til et billede i \"Ikon URL\" for at tilsidesætte standardprofilbilledet. Vil ikke blive brugt, hvis Ikon Emoji er angivet.",
+    "aboutMattermostChannelName": "Du kan tilsidesætte standardkanalen, som Webhoo'en sender til ved at indtaste kanalnavnet i feltet \"Kanalnavn\". Dette skal aktiveres i Mattermost Webhook-indstillingerne. Eks: #anden-kanal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - billig, men langsom og ofte overbelastet. Begrænset kun til polske modtagere.",
+    "promosmsTypeFlash": "SMS FLASH - Beskeden vises automatisk på modtagerenheden. Begrænset kun til polske modtagere.",
+    "promosmsTypeFull": "SMS FULL - Premium-niveau af SMS, Du kan bruge dit \"Sender Name\" (Du skal først registrere navn). Pålidelig til advarsler.",
+    "promosmsTypeSpeed": "SMS SPEED - Højeste prioritet i systemet. Meget hurtig og pålidelig, men dyr (ca. to gange af SMS FULL pris).",
+    "promosmsPhoneNumber": "Telefonnummer (polske numre behøver ikke angive områdenumre)",
+    "promosmsSMSSender": "SMS Sender Name : Forudregistreret navn eller en af standarderne: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Hjemmeserver-URL (med http(s):// og eventuel port)",
+    "Internal Room Id": "Intern Rum-ID",
+    "matrixDesc1": "Du kan finde det interne rum-ID ved at se i det avancerede afsnit af rumindstillingerne i din Matrix-klient. Det skulle ligne !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Det anbefales stærkt, at du opretter en ny bruger og ikke bruger din egen Matrix-brugers adgangstoken, da det giver fuld adgang til din konto og alle de rum, du har tilsluttet dig. I stedet skal du oprette en ny bruger og kun invitere den til det rum, du vil modtage meddelelsen i. Du kan få adgangstokenet ved at køre {0}",
+    "Method": "Metode",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "\"request headers\"-erne er ikke gyldige JSON: ",
+    "BodyInvalidFormat": "\"request body\"-en er ikke gyldige JSON: ",
+    "Monitor History": "Overvåger Historik",
+    "clearDataOlderThan": "Gem overvågningshistorikdata i {0} dage.",
+    "PasswordsDoNotMatch": "Adgangskoderne stemmer ikke overens.",
+    "records": "forekomster",
+    "One record": "Én forekomst",
+    "steamApiKeyDescription": "For at overvåge en Steam Game Server skal du bruge en Steam Web-API nøgle. Du kan registrere din API-nøgle her: ",
+    "Current User": "Nuværende Bruger",
+    "recent": "Seneste",
+    "Done": "Færdig",
+    "Info": "Info",
+    "Security": "Sikkerhed",
+    "Steam API Key": "Steam API-nøgle",
+    "Shrink Database": "Krymp Database",
+    "Pick a RR-Type...": "Vælg en RR-Type...",
+    "Pick Accepted Status Codes...": "Vælg Accepterede Statuskoder...",
+    "Default": "Standard",
+    "HTTP Options": "HTTP Valgmuligheder",
+    "Create Incident": "Opret Annoncering",
+    "Title": "Titel",
+    "Content": "Indhold",
+    "Style": "Type",
+    "info": "info",
+    "warning": "advarsel",
+    "danger": "fare",
+    "primary": "primær",
+    "light": "lys",
+    "dark": "mørk",
+    "Post": "Udgiv",
+    "Please input title and content": "Indtast venligst titel og indhold",
+    "Created": "Oprettet",
+    "Last Updated": "Sidst Opdateret",
+    "Unpin": "Frigør",
+    "Switch to Light Theme": "Skift til Lys Tema",
+    "Switch to Dark Theme": "Skift til Mørkt Tema",
+    "Show Tags": "Vis Etiketter",
+    "Hide Tags": "Skjul Etiketter",
+    "Description": "Beskrivelse",
+    "No monitors available.": "No monitors available.",
+    "Add one": "Tilføj en",
+    "No Monitors": "Ingen Overvågere",
+    "Untitled Group": "Unavngivet Gruppe",
+    "Services": "Tjenester",
+    "Discard": "Kassér",
+    "Cancel": "Annullér",
+    "Powered by": "Drevet af",
+    "shrinkDatabaseDescription": "Udfør database VACUUM for SQLite. Hvis din database er oprettet efter 1.10.0, er AUTO_VACUUM allerede aktiveret, og denne handling er ikke nødvendig.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Brugernavn (inkl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Adgangskode",
+    "serwersmsPhoneNumber": "Telefonnummer",
+    "serwersmsSenderName": "SMS Afsender Navn (registreret via kundeportal)",
+    "stackfield": "Stackfield"
+}
diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
new file mode 100644
index 00000000..c3e4d3d5
--- /dev/null
+++ b/src/lang/de-CH.json
@@ -0,0 +1,634 @@
+{
+    "languageName": "Deutsch (Schweiz)",
+    "Settings": "Einstellungen",
+    "Dashboard": "Dashboard",
+    "New Update": "Update verfügbar",
+    "Language": "Sprache",
+    "Appearance": "Erscheinungsbild",
+    "Theme": "Erscheinungsbild",
+    "General": "Allgemein",
+    "Version": "Version",
+    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
+    "List": "Liste",
+    "Add": "Hinzufügen",
+    "Add New Monitor": "Neuen Monitor hinzufügen",
+    "Quick Stats": "Übersicht",
+    "Up": "Aktiv",
+    "Down": "Inaktiv",
+    "Pending": "Ausstehend",
+    "Unknown": "Unbekannt",
+    "Pause": "Pausieren",
+    "pauseDashboardHome": "Pausiert",
+    "Name": "Name",
+    "Status": "Status",
+    "DateTime": "Datum / Uhrzeit",
+    "Message": "Nachricht",
+    "No important events": "Keine wichtigen Ereignisse",
+    "Resume": "Fortsetzen",
+    "Edit": "Bearbeiten",
+    "Delete": "Löschen",
+    "Current": "Aktuell",
+    "Uptime": "Verfügbarkeit",
+    "Cert Exp.": "Zertifikatsablauf",
+    "day": "Tag | Tage",
+    "-day": "-Tage",
+    "hour": "Stunde",
+    "-hour": "-Stunden",
+    "checkEverySecond": "Überprüfe alle {0} Sekunden",
+    "Response": "Antwortzeit",
+    "Ping": "Ping",
+    "Monitor Type": "Monitor-Typ",
+    "Keyword": "Suchwort",
+    "Friendly Name": "Anzeigename",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Prüfintervall",
+    "Retries": "Wiederholungen",
+    "retriesDescription": "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
+    "Advanced": "Erweitert",
+    "ignoreTLSError": "Ignoriere TLS-/SSL-Fehler von Webseiten",
+    "Upside Down Mode": "Umgekehrter Modus",
+    "upsideDownModeDescription": "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
+    "Max. Redirects": "Max. Weiterleitungen",
+    "maxRedirectDescription": "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
+    "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
+    "acceptedStatusCodesDescription": "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
+    "Save": "Speichern",
+    "Notifications": "Benachrichtigungen",
+    "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
+    "Setup Notification": "Benachrichtigung einrichten",
+    "Light": "Hell",
+    "Dark": "Dunkel",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
+    "Normal": "Normal",
+    "Bottom": "Unten",
+    "None": "Keine",
+    "Timezone": "Zeitzone",
+    "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
+    "Allow indexing": "Indizierung zulassen",
+    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
+    "Change Password": "Passwort ändern",
+    "Current Password": "Aktuelles Passwort",
+    "New Password": "Neues Passwort",
+    "Repeat New Password": "Neues Passwort wiederholen",
+    "passwordNotMatchMsg": "Passwörter stimmen nicht überein.",
+    "Update Password": "Passwort aktualisieren",
+    "Disable Auth": "Authentifizierung deaktivieren",
+    "Enable Auth": "Authentifizierung aktivieren",
+    "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
+    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
+    "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
+    "Logout": "Ausloggen",
+    "notificationDescription": "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
+    "Leave": "Verlassen",
+    "I understand, please disable": "Ich verstehe, bitte deaktivieren",
+    "Confirm": "Bestätigen",
+    "Yes": "Ja",
+    "No": "Nein",
+    "Username": "Benutzername",
+    "Password": "Passwort",
+    "Remember me": "Angemeldet bleiben",
+    "Login": "Einloggen",
+    "No Monitors, please": "Keine Monitore, bitte",
+    "add one": "hinzufügen",
+    "Notification Type": "Benachrichtigungsdienst",
+    "Email": "E-Mail",
+    "Test": "Test",
+    "Certificate Info": "Zertifikatsinformation",
+    "keywordDescription": "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Gross-/Kleinschreibung unterschieden.",
+    "deleteMonitorMsg": "Bist du sicher, dass du den Monitor löschen möchtest?",
+    "deleteNotificationMsg": "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
+    "resolverserverDescription": "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
+    "Resolver Server": "Auflösungsserver",
+    "rrtypeDescription": "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
+    "Last Result": "Letztes Ergebnis",
+    "pauseMonitorMsg": "Bist du sicher, dass du den Monitor pausieren möchtest?",
+    "clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
+    "clearHeartbeatsMsg": "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
+    "Clear Data": "Lösche Daten",
+    "Events": "Ereignisse",
+    "Heartbeats": "Statistiken",
+    "confirmClearStatisticsMsg": "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
+    "Create your admin account": "Erstelle dein Admin-Konto",
+    "Repeat Password": "Passwort erneut eingeben",
+    "Resource Record Type": "Ressourcen Record Typ",
+    "Export": "Export",
+    "Import": "Import",
+    "respTime": "Antw.-Zeit (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Standardmässig aktiviert",
+    "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
+    "enableDefaultNotificationDescription": "Für jeden neuen Monitor wird diese Benachrichtigung standardmässig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.",
+    "Create": "Erstellen",
+    "Auto Get": "Auto Get",
+    "backupDescription": "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
+    "backupDescription2": "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
+    "backupDescription3": "Sensible Daten wie Benachrichtigungs-Token sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
+    "alertNoFile": "Bitte wähle eine Datei zum Importieren aus.",
+    "alertWrongFileType": "Bitte wähle eine JSON-Datei aus.",
+    "Clear all statistics": "Lösche alle Statistiken",
+    "importHandleDescription": "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
+    "Skip existing": "Vorhandene überspringen",
+    "Overwrite": "Überschreiben",
+    "Options": "Optionen",
+    "confirmImportMsg": "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
+    "Keep both": "Beide behalten",
+    "twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
+    "Verify Token": "Token verifizieren",
+    "Setup 2FA": "2FA einrichten",
+    "Enable 2FA": "2FA aktivieren",
+    "Disable 2FA": "2FA deaktivieren",
+    "2FA Settings": "2FA-Einstellungen",
+    "confirmEnableTwoFAMsg": "Bist du sicher, dass du 2FA aktivieren möchtest?",
+    "confirmDisableTwoFAMsg": "Bist du sicher, dass du 2FA deaktivieren möchtest?",
+    "tokenValidSettingsMsg": "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
+    "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
+    "Active": "Aktiv",
+    "Inactive": "Inaktiv",
+    "Token": "Token",
+    "Show URI": "URI anzeigen",
+    "Tags": "Tags",
+    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
+    "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
+    "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
+    "color": "Farbe",
+    "value (optional)": "Wert (optional)",
+    "Gray": "Grau",
+    "Red": "Rot",
+    "Orange": "Orange",
+    "Green": "Grün",
+    "Blue": "Blau",
+    "Indigo": "Indigo",
+    "Purple": "Lila",
+    "Pink": "Pink",
+    "Search...": "Suchen...",
+    "Heartbeat Retry Interval": "Überprüfungsintervall",
+    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
+    "retryCheckEverySecond": "Alle {0} Sekunden neu versuchen",
+    "resendEveryXTimes": "Erneut versenden alle {0} mal",
+    "resendDisabled": "Erneut versenden deaktiviert",
+    "Import Backup": "Backup importieren",
+    "Export Backup": "Backup exportieren",
+    "Avg. Ping": "Ping ø",
+    "Avg. Response": "Antwortzeit ø",
+    "Entry Page": "Einstiegsseite",
+    "statusPageNothing": "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
+    "No Services": "Keine Dienste",
+    "All Systems Operational": "Alle Systeme betriebsbereit",
+    "Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
+    "Degraded Service": "Eingeschränkter Dienst",
+    "Add Group": "Gruppe hinzufügen",
+    "Add a monitor": "Monitor hinzufügen",
+    "Edit Status Page": "Bearbeite Status-Seite",
+    "Go to Dashboard": "Gehe zum Dashboard",
+    "Status Page": "Status-Seite",
+    "Status Pages": "Status-Seiten",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "E-Mail (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
+    "GoogleChat": "Google Chat (nur Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Primär URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Du solltest diese URL alle {0} Sekunden aufrufen",
+    "pushOptionalParams": "Optionale Parameter: {0}",
+    "defaultNotificationName": "Mein {notification} Alarm ({number})",
+    "here": "hier",
+    "Required": "Erforderlich",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Hier kannst du einen Token erhalten {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
+    "wayToGetTelegramChatID": "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
+    "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
+    "chatIDNotFound": "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
+    "webhookFormDataDesc": "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
+    "secureOptionNone": "Keine / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS-Fehler ignorieren",
+    "From Email": "Absender E-Mail",
+    "emailCustomSubject": "Benutzerdefinierter Betreff",
+    "To Email": "Empfänger E-Mail",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
+    "Bot Display Name": "Bot-Anzeigename",
+    "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
+    "Hello @everyone is...": "Hallo {'@'}everyone ist...",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
+    "Number": "Nummer",
+    "Recipients": "Empfänger",
+    "needSignalAPI": "Es wird ein Signal Client mit REST-API benötigt.",
+    "wayToCheckSignalURL": "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
+    "signalImportant": "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
+    "Application Token": "Anwendungstoken",
+    "Server URL": "Server URL",
+    "Priority": "Priorität",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Kanalname",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Weitere Informationen zu Webhooks auf: {0}",
+    "aboutChannelName": "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
+    "aboutKumaURL": "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmässig die GitHub Projekt Seite verwendet.",
+    "emojiCheatSheet": "Emoji Cheat Sheet: {0}",
+    "User Key": "Benutzerschlüssel",
+    "Device": "Gerät",
+    "Message Title": "Nachrichtentitel",
+    "Notification Sound": "Benachrichtigungston",
+    "More info on:": "Mehr Infos auf: {0}",
+    "pushoverDesc1": "Notfallpriorität (2) hat standardmässig 30 Sekunden Auszeit zwischen den Versuchen und läuft nach 1 Stunde ab.",
+    "pushoverDesc2": "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
+    "SMS Type": "SMS Typ",
+    "octopushTypePremium": "Premium (Schnell - zur Benachrichtigung empfohlen)",
+    "octopushTypeLowCost": "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
+    "checkPrice": "Prüfe {0} Preise:",
+    "octopushLegacyHint": "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
+    "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
+    "octopushPhoneNumber": "Telefonnummer (Internationales Format, z.B : +49612345678) ",
+    "octopushSMSSender": "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Geräte ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Beispiel: {0}",
+    "Read more:": "Weiterlesen: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Weiterlesen",
+    "appriseInstalled": "Apprise ist installiert.",
+    "appriseNotInstalled": "Apprise ist nicht installiert. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Basic Settings",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
+    "aboutMattermostChannelName": "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
+    "promosmsTypeFlash": "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
+    "promosmsTypeFull": "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.",
+    "promosmsTypeSpeed": "SMS SPEED - Höchste Priorität im System. Sehr schnell und zuverlässig, aber teuer (Ungefähr das doppelte von SMS FULL).",
+    "promosmsPhoneNumber": "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
+    "promosmsSMSSender": "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu Webhook URL",
+    "matrixHomeserverURL": "Heimserver URL (mit http(s):// und optionalen Ports)",
+    "Internal Room Id": "Interne Raum-ID",
+    "matrixDesc1": "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Der Header ist kein gültiges JSON: ",
+    "BodyInvalidFormat": "Der Body ist kein gültiges JSON: ",
+    "Monitor History": "Monitor Verlauf",
+    "clearDataOlderThan": "Bewahre die Aufzeichnungsdaten für {0} Tage auf.",
+    "PasswordsDoNotMatch": "Passwörter stimmen nicht überein.",
+    "records": "Einträge",
+    "One record": "Ein Eintrag",
+    "steamApiKeyDescription": "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
+    "Current User": "Aktueller Benutzer",
+    "recent": "Letzte",
+    "Done": "Fertig",
+    "Info": "Info",
+    "Security": "Sicherheit",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Datenbank verkleinern",
+    "Pick a RR-Type...": "Wähle ein RR-Typ aus...",
+    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
+    "Default": "Standard",
+    "HTTP Options": "HTTP Optionen",
+    "Create Incident": "Vorfall erstellen",
+    "Title": "Titel",
+    "Content": "Inhalt",
+    "Style": "Stil",
+    "info": "info",
+    "warning": "warnung",
+    "danger": "gefahr",
+    "primary": "primär",
+    "light": "hell",
+    "dark": "dunkel",
+    "Post": "Eintrag",
+    "Please input title and content": "Bitte Titel und Inhalt eingeben",
+    "Created": "Erstellt",
+    "Last Updated": "Zuletzt aktualisiert",
+    "Unpin": "Loslösen",
+    "Switch to Light Theme": "Zu hellem Thema wechseln",
+    "Switch to Dark Theme": "Zum dunklen Thema wechseln",
+    "Show Tags": "Tags anzeigen",
+    "Hide Tags": "Tags ausblenden",
+    "Description": "Beschreibung",
+    "No monitors available.": "Keine Monitore verfügbar.",
+    "Add one": "Hinzufügen",
+    "No Monitors": "Keine Monitore",
+    "Untitled Group": "Gruppe ohne Titel",
+    "Services": "Dienste",
+    "Discard": "Verwerfen",
+    "Cancel": "Abbrechen",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Passwort",
+    "serwersmsPhoneNumber": "Telefonnummer",
+    "serwersmsSenderName": "Name des SMS-Absenders (über Kundenportal registriert)",
+    "stackfield": "Stackfield",
+    "clicksendsms": "ClickSend SMS",
+    "apiCredentials": "API Zugangsdaten",
+    "smtpDkimSettings": "DKIM Einstellungen",
+    "smtpDkimDesc": "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
+    "documentation": "Dokumentation",
+    "smtpDkimDomain": "Domain Name",
+    "smtpDkimKeySelector": "Schlüssel Auswahl",
+    "smtpDkimPrivateKey": "Privater Schlüssel",
+    "smtpDkimHashAlgo": "Hash-Algorithmus (Optional)",
+    "smtpDkimheaderFieldNames": "Zu validierende Header-Schlüssel (optional)",
+    "smtpDkimskipFields": "Zu ignorierende Header Schlüssel (optional)",
+    "PushByTechulus": "Push by Techulus",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpunkt",
+    "alertaEnvironment": "Umgebung",
+    "alertaApiKey": "API Schlüssel",
+    "alertaAlertState": "Alarmstatus",
+    "alertaRecoverState": "Wiederherstellungsstatus",
+    "deleteStatusPageMsg": "Bist du sicher, dass du diese Status-Seite löschen willst?",
+    "Proxies": "Proxies",
+    "default": "Standard",
+    "enabled": "Aktiviert",
+    "setAsDefault": "Als Standard setzen",
+    "deleteProxyMsg": "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
+    "proxyDescription": "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
+    "enableProxyDescription": "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
+    "setAsDefaultProxyDescription": "Dieser Proxy wird standardmässig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
+    "Certificate Chain": "Zertifikatskette",
+    "Valid": "Gültig",
+    "Invalid": "Ungültig",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "Telefonnummern",
+    "TemplateCode": "Vorlagencode",
+    "SignName": "Signaturname",
+    "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
+    "Bark Endpoint": "Bark Endpunkt",
+    "WebHookUrl": "Webhook URL",
+    "SecretKey": "Geheimer Schlüssel",
+    "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
+    "Device Token": "Gerätetoken",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Hoch",
+    "Retry": "Wiederholungen",
+    "Topic": "Thema",
+    "WeCom Bot Key": "WeCom Bot Schlüssel",
+    "Setup Proxy": "Proxy einrichten",
+    "Proxy Protocol": "Proxy Protokoll",
+    "Proxy Server": "Proxy-Server",
+    "Proxy server has authentication": "Proxy-Server hat Authentifizierung",
+    "User": "Benutzer",
+    "Installed": "Installiert",
+    "Not installed": "Nicht installiert",
+    "Running": "Läuft",
+    "Not running": "Gestoppt",
+    "Remove Token": "Token entfernen",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Neue Status-Seite hinzufügen",
+    "Slug": "Slug",
+    "Accept characters:": "Akzeptierte Zeichen:",
+    "startOrEndWithOnly": "Nur mit {0} anfangen und enden",
+    "No consecutive dashes": "Keine aufeinanderfolgenden Bindestriche",
+    "Next": "Weiter",
+    "The slug is already taken. Please choose another slug.": "Der Slug ist bereits in Verwendung. Bitte wähle einen anderen.",
+    "No Proxy": "Kein Proxy",
+    "Authentication": "Authentifizierung",
+    "HTTP Basic Auth": "HTTP Basisauthentifizierung",
+    "New Status Page": "Neue Status-Seite",
+    "Page Not Found": "Seite nicht gefunden",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Sicherung",
+    "About": "Über",
+    "wayToGetCloudflaredURL": "(Lade Cloudflare von {0} herunter)",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Nachricht:",
+    "Don't know how to get the token? Please read the guide:": "Du weisst nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Die aktuelle Verbindung kann unterbrochen werden, wenn du aktuell über Cloudflare Tunnel verbunden bist. Bist du sicher, dass du es stoppen willst? Gib zur Bestätigung dein aktuelles Passwort ein.",
+    "Other Software": "Andere Software",
+    "For example: nginx, Apache and Traefik.": "Zum Beispiel: nginx, Apache und Traefik.",
+    "Please read": "Bitte lesen",
+    "Subject:": "Betreff:",
+    "Valid To:": "Gültig bis:",
+    "Days Remaining:": "Tage verbleibend:",
+    "Issuer:": "Aussteller:",
+    "Fingerprint:": "Fingerabdruck:",
+    "No status pages": "Keine Status-Seiten",
+    "Domain Name Expiry Notification": "Benachrichtigung bei Ablauf des Domainnamens",
+    "Customize": "Anpassen",
+    "Custom Footer": "Eigener Footer",
+    "Custom CSS": "Eigenes CSS",
+    "Footer Text": "Fusszeile",
+    "Show Powered By": "Zeige 'Powered By'",
+    "Date Created": "Erstellt am",
+    "Domain Names": "Domainnamen",
+    "signedInDisp": "Angemeldet als {0}",
+    "signedInDispDisabled": "Authentifizierung deaktiviert.",
+    "dnsPortDescription": "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
+    "topic": "Thema",
+    "topicExplanation": "MQTT Thema für den monitor",
+    "successMessage": "Erfolgsnachricht",
+    "successMessageExplanation": "MQTT Nachricht, die als Erfolg angesehen wird",
+    "error": "Fehler",
+    "critical": "kritisch",
+    "wayToGetPagerDutyKey": "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
+    "Integration Key": "Schlüssel der Integration",
+    "Integration URL": "URL der Integration",
+    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
+    "do nothing": "nichts tun",
+    "auto acknowledged": "automatisch bestätigen",
+    "auto resolve": "automatisch lösen",
+    "Bark Group": "Bark Gruppe",
+    "Bark Sound": "Bark Klang",
+    "HTTP Headers": "HTTP Kopfzeilen",
+    "Trust Proxy": "Vertrauenswürdiger Proxy",
+    "Proxy": "Proxy",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Adresse",
+    "onebotMessageType": "OneBot Nachrichtentyp",
+    "onebotGroupMessage": "Gruppe",
+    "onebotPrivateMessage": "Privat",
+    "onebotUserOrGroupId": "Gruppe/Nutzer ID",
+    "onebotSafetyTips": "Zur Sicherheit ein access token setzen",
+    "PushDeer Key": "PushDeer Schlüssel",
+    "RadiusSecret": "Radius Geheimnis",
+    "RadiusSecretDescription": "Geteiltes Geheimnis zwischen Client und Server",
+    "RadiusCalledStationId": "ID der angesprochenen Station",
+    "RadiusCalledStationIdDescription": "Identifikation des angesprochenen Geräts",
+    "RadiusCallingStationId": "ID der ansprechenden Station",
+    "RadiusCallingStationIdDescription": "Identifikation des ansprechenden Geräts",
+    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
+    "API Username": "API Nutzername",
+    "API Key": "API Schlüssel",
+    "Recipient Number": "Empfängernummer",
+    "From Name/Number": "Von Name/Nummer",
+    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "Endpunkt",
+    "octopushAPIKey": "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
+    "octopushLogin": "\"Login\" der HTTP API Zugangsdaten im control panel",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (Standard)",
+    "pushoversounds bike": "Fahrrad",
+    "pushoversounds bugle": "Signalhorn",
+    "pushoversounds cashregister": "Kasse",
+    "pushoversounds classical": "Klassisch",
+    "pushoversounds cosmic": "Kosmisch",
+    "pushoversounds falling": "Abfallend",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Eingang",
+    "pushoversounds intermission": "Pause",
+    "pushoversounds magic": "Magisch",
+    "pushoversounds mechanical": "Mechanisch",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Sirene",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Schlepper Horn",
+    "pushoversounds alien": "Ausserirdisch (lang)",
+    "pushoversounds climb": "Ansteigende (lang)",
+    "pushoversounds persistent": "Hartnäckig (lang)",
+    "pushoversounds echo": "Pushover Echo (lang)",
+    "pushoversounds updown": "Auf und Ab (lang)",
+    "pushoversounds vibrate": "Nur vibrieren",
+    "pushoversounds none": "Nichts (Stille)",
+    "pushyAPIKey": "Geheimer API Schlüssel",
+    "pushyToken": "Gerätetoken",
+    "Show update if available": "Verfügbare Updates anzeigen",
+    "Also check beta release": "Auch nach beta Versionen schauen",
+    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
+    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Wahrscheinliche Ursachen:",
+    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
+    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
+    "What you can try:": "Was du versuchen kannst:",
+    "Retype the address.": "Schreibe die Adresse erneut.",
+    "Go back to the previous page.": "Gehe zur vorigen Seite.",
+    "Coming Soon": "Kommt bald",
+    "wayToGetClickSendSMSToken": "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
+    "Connection String": "Verbindungstext",
+    "Query": "Abfrage",
+    "settingsCertificateExpiry": "TLS Zertifikatsablauf",
+    "certificationExpiryDescription": "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
+    "Setup Docker Host": "Docker Host einrichten",
+    "Connection Type": "Verbindungstyp",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Bist du sicher diesen docker host für alle Monitore zu löschen?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Thema",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
+    "trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
+    "wayToGetLineNotifyToken": "Du kannst hier ein Token erhalten: {0}",
+    "Examples": "Beispiele",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Lange gültiges Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
+    "Notification Service": "Benachrichtigungsdienst",
+    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
+    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
+    "Trigger type:": "Auslöser:",
+    "Event type:": "Ereignistyp:",
+    "Event data:": "Ereignis daten:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
+    "Frontend Version": "Frontend Version",
+    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
+    "Maintenance": "Wartung",
+    "statusMaintenance": "Wartung",
+    "Schedule maintenance": "Geplante Wartung",
+    "Affected Monitors": "Betroffene Monitore",
+    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
+    "Start of maintenance": "Beginn der Wartung",
+    "All Status Pages": "Alle Status Seiten",
+    "Select status pages...": "Wähle Status Seiten...",
+    "recurringIntervalMessage": "einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
+    "affectedMonitorsDescription": "Wähle alle Monitore die von der Wartung betroffen sind",
+    "affectedStatusPages": "Zeige diese Nachricht auf ausgewählten Status Seiten",
+    "atLeastOneMonitor": "Wähle mindestens einen Monitor",
+    "deleteMaintenanceMsg": "Möchtest du diese Wartung löschen?",
+    "Base URL": "Basis URL",
+    "goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
+    "goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
+    "backupRecommend": "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
+    "Optional": "Optional",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Dokumente",
+    "Gateway Type": "Gateway Type",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Du kannst Zahlen teilen mit",
+    "or": "oder",
+    "recurringInterval": "Intervall",
+    "Recurring": "Wiederkehrend",
+    "strategyManual": "Active/Inactive Manually",
+    "warningTimezone": "Es wird die Zeitzone des Servers genutzt",
+    "weekdayShortMon": "Mo",
+    "weekdayShortTue": "Di",
+    "weekdayShortWed": "Mi",
+    "weekdayShortThu": "Do",
+    "weekdayShortFri": "Fr",
+    "weekdayShortSat": "Sa",
+    "weekdayShortSun": "So",
+    "dayOfWeek": "Tag der Woche",
+    "dayOfMonth": "Tag im Monat",
+    "lastDay": "Letzter Tag",
+    "lastDay1": "Letzter Tag im Monat",
+    "lastDay2": "Vorletzer Tag im Monat",
+    "lastDay3": "3. letzter Tag im Monat",
+    "lastDay4": "4. letzter Tag im Monat",
+    "No Maintenance": "Keine Wartung",
+    "pauseMaintenanceMsg": "Möchtest du wirklich pausieren?",
+    "maintenanceStatus-under-maintenance": "Unter Wartung",
+    "maintenanceStatus-inactive": "Inaktiv",
+    "maintenanceStatus-scheduled": "Geplant",
+    "maintenanceStatus-ended": "Ende",
+    "maintenanceStatus-unknown": "Unbekannt",
+    "Display Timezone": "Zeitzone anzeigen",
+    "Server Timezone": "Server Zeitzone",
+    "statusPageMaintenanceEndDate": "Ende"
+}
diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
new file mode 100644
index 00000000..e4472111
--- /dev/null
+++ b/src/lang/de-DE.json
@@ -0,0 +1,641 @@
+{
+    "languageName": "Deutsch (Deutschland)",
+    "Settings": "Einstellungen",
+    "Dashboard": "Dashboard",
+    "New Update": "Update verfügbar",
+    "Language": "Sprache",
+    "Appearance": "Erscheinungsbild",
+    "Theme": "Erscheinungsbild",
+    "General": "Allgemein",
+    "Version": "Version",
+    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
+    "List": "Liste",
+    "Add": "Hinzufügen",
+    "Add New Monitor": "Neuen Monitor hinzufügen",
+    "Quick Stats": "Übersicht",
+    "Up": "Aktiv",
+    "Down": "Inaktiv",
+    "Pending": "Ausstehend",
+    "Unknown": "Unbekannt",
+    "Pause": "Pausieren",
+    "pauseDashboardHome": "Pausiert",
+    "Name": "Name",
+    "Status": "Status",
+    "DateTime": "Datum / Uhrzeit",
+    "Message": "Nachricht",
+    "No important events": "Keine wichtigen Ereignisse",
+    "Resume": "Fortsetzen",
+    "Edit": "Bearbeiten",
+    "Delete": "Löschen",
+    "Current": "Aktuell",
+    "Uptime": "Verfügbarkeit",
+    "Cert Exp.": "Zertifikatsablauf",
+    "day": "Tag | Tage",
+    "-day": "-Tage",
+    "hour": "Stunde",
+    "-hour": "-Stunden",
+    "checkEverySecond": "Überprüfe alle {0} Sekunden",
+    "Response": "Antwortzeit",
+    "Ping": "Ping",
+    "Monitor Type": "Monitor-Typ",
+    "Keyword": "Suchwort",
+    "Friendly Name": "Anzeigename",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Prüfintervall",
+    "Retries": "Wiederholungen",
+    "retriesDescription": "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
+    "Advanced": "Erweitert",
+    "ignoreTLSError": "Ignoriere TLS-/SSL-Fehler von Webseiten",
+    "Upside Down Mode": "Umgekehrter Modus",
+    "upsideDownModeDescription": "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
+    "Max. Redirects": "Max. Weiterleitungen",
+    "maxRedirectDescription": "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
+    "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
+    "acceptedStatusCodesDescription": "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
+    "Save": "Speichern",
+    "Notifications": "Benachrichtigungen",
+    "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
+    "Setup Notification": "Benachrichtigung einrichten",
+    "Light": "Hell",
+    "Dark": "Dunkel",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
+    "Normal": "Normal",
+    "Bottom": "Unten",
+    "None": "Keine",
+    "Timezone": "Zeitzone",
+    "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
+    "Allow indexing": "Indizierung zulassen",
+    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
+    "Change Password": "Passwort ändern",
+    "Current Password": "Aktuelles Passwort",
+    "New Password": "Neues Passwort",
+    "Repeat New Password": "Neues Passwort wiederholen",
+    "passwordNotMatchMsg": "Passwörter stimmen nicht überein.",
+    "Update Password": "Passwort aktualisieren",
+    "Disable Auth": "Authentifizierung deaktivieren",
+    "Enable Auth": "Authentifizierung aktivieren",
+    "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
+    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
+    "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
+    "Logout": "Ausloggen",
+    "notificationDescription": "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
+    "Leave": "Verlassen",
+    "I understand, please disable": "Ich verstehe, bitte deaktivieren",
+    "Confirm": "Bestätigen",
+    "Yes": "Ja",
+    "No": "Nein",
+    "Username": "Benutzername",
+    "Password": "Passwort",
+    "Remember me": "Angemeldet bleiben",
+    "Login": "Einloggen",
+    "No Monitors, please": "Keine Monitore, bitte",
+    "add one": "hinzufügen",
+    "Notification Type": "Benachrichtigungsdienst",
+    "Email": "E-Mail",
+    "Test": "Test",
+    "Certificate Info": "Zertifikatsinformation",
+    "keywordDescription": "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.",
+    "deleteMonitorMsg": "Bist du sicher, dass du den Monitor löschen möchtest?",
+    "deleteNotificationMsg": "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
+    "resolverserverDescription": "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
+    "Resolver Server": "Auflösungsserver",
+    "rrtypeDescription": "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
+    "Last Result": "Letztes Ergebnis",
+    "pauseMonitorMsg": "Bist du sicher, dass du den Monitor pausieren möchtest?",
+    "clearEventsMsg": "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
+    "clearHeartbeatsMsg": "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
+    "Clear Data": "Lösche Daten",
+    "Events": "Ereignisse",
+    "Heartbeats": "Statistiken",
+    "confirmClearStatisticsMsg": "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
+    "Create your admin account": "Erstelle dein Admin-Konto",
+    "Repeat Password": "Passwort erneut eingeben",
+    "Resource Record Type": "Ressourcen Record Typ",
+    "Export": "Export",
+    "Import": "Import",
+    "respTime": "Antw.-Zeit (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Standardmäßig aktiviert",
+    "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
+    "enableDefaultNotificationDescription": "Für jeden neuen Monitor wird diese Benachrichtigung standardmäßig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.",
+    "Create": "Erstellen",
+    "Auto Get": "Auto Get",
+    "backupDescription": "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
+    "backupDescription2": "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
+    "backupDescription3": "Sensible Daten wie Benachrichtigungstoken sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
+    "alertNoFile": "Bitte wähle eine Datei zum Importieren aus.",
+    "alertWrongFileType": "Bitte wähle eine JSON-Datei aus.",
+    "Clear all statistics": "Lösche alle Statistiken",
+    "importHandleDescription": "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
+    "Skip existing": "Vorhandene überspringen",
+    "Overwrite": "Überschreiben",
+    "Options": "Optionen",
+    "confirmImportMsg": "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
+    "Keep both": "Beide behalten",
+    "twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
+    "Verify Token": "Token verifizieren",
+    "Setup 2FA": "2FA einrichten",
+    "Enable 2FA": "2FA aktivieren",
+    "Disable 2FA": "2FA deaktivieren",
+    "2FA Settings": "2FA-Einstellungen",
+    "confirmEnableTwoFAMsg": "Bist du sicher, dass du 2FA aktivieren möchtest?",
+    "confirmDisableTwoFAMsg": "Bist du sicher, dass du 2FA deaktivieren möchtest?",
+    "tokenValidSettingsMsg": "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
+    "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
+    "Active": "Aktiv",
+    "Inactive": "Inaktiv",
+    "Token": "Token",
+    "Show URI": "URI anzeigen",
+    "Tags": "Tags",
+    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
+    "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
+    "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
+    "color": "Farbe",
+    "value (optional)": "Wert (optional)",
+    "Gray": "Grau",
+    "Red": "Rot",
+    "Orange": "Orange",
+    "Green": "Grün",
+    "Blue": "Blau",
+    "Indigo": "Indigo",
+    "Purple": "Lila",
+    "Pink": "Pink",
+    "Search...": "Suchen...",
+    "Heartbeat Retry Interval": "Überprüfungsintervall",
+    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
+    "retryCheckEverySecond": "Alle {0} Sekunden neu versuchen",
+    "resendEveryXTimes": "Erneut versenden alle {0} mal",
+    "resendDisabled": "Erneut versenden deaktiviert",
+    "Import Backup": "Backup importieren",
+    "Export Backup": "Backup exportieren",
+    "Avg. Ping": "Durchschn. Ping",
+    "Avg. Response": "Durchschn. Antwort",
+    "Entry Page": "Einstiegsseite",
+    "statusPageNothing": "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
+    "No Services": "Keine Dienste",
+    "All Systems Operational": "Alle Systeme betriebsbereit",
+    "Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
+    "Degraded Service": "Eingeschränkter Dienst",
+    "Add Group": "Gruppe hinzufügen",
+    "Add a monitor": "Monitor hinzufügen",
+    "Edit Status Page": "Statusseite bearbeiten",
+    "Go to Dashboard": "Gehe zum Dashboard",
+    "Status Page": "Status-Seite",
+    "Status Pages": "Status-Seiten",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "E-Mail (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
+    "GoogleChat": "Google Chat (nur Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Primäre Basis-URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Du solltest diese URL alle {0} Sekunden aufrufen",
+    "pushOptionalParams": "Optionale Parameter: {0}",
+    "defaultNotificationName": "Mein {notification} Alarm ({number})",
+    "here": "hier",
+    "Required": "Erforderlich",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Hier kannst du einen Token erhalten {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
+    "wayToGetTelegramChatID": "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
+    "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
+    "chatIDNotFound": "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
+    "webhookFormDataDesc": "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
+    "secureOptionNone": "Keine / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS-Fehler ignorieren",
+    "From Email": "Absender E-Mail",
+    "emailCustomSubject": "Benutzerdefinierter Betreff",
+    "To Email": "Empfänger E-Mail",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
+    "Bot Display Name": "Bot-Anzeigename",
+    "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
+    "Hello @everyone is...": "Hallo {'@'}everyone ist...",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
+    "Number": "Nummer",
+    "Recipients": "Empfänger",
+    "needSignalAPI": "Es wird ein Signal Client mit REST-API benötigt.",
+    "wayToCheckSignalURL": "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
+    "signalImportant": "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
+    "Application Token": "Anwendungs Token",
+    "Server URL": "Server URL",
+    "Priority": "Priorität",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Kanalname",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Weitere Informationen zu Webhooks auf: {0}",
+    "aboutChannelName": "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
+    "aboutKumaURL": "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmäßig die GitHub Projekt Seite verwendet.",
+    "emojiCheatSheet": "Emoji Cheat Sheet: {0}",
+    "User Key": "Benutzerschlüssel",
+    "Device": "Gerät",
+    "Message Title": "Nachrichtentitel",
+    "Notification Sound": "Benachrichtigungston",
+    "More info on:": "Mehr Infos auf: {0}",
+    "pushoverDesc1": "Notfallpriorität (2) hat standardmäßig 30 Sekunden Auszeit zwischen den Versuchen und läuft nach 1 Stunde ab.",
+    "pushoverDesc2": "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
+    "SMS Type": "SMS Typ",
+    "octopushTypePremium": "Premium (Schnell - zur Benachrichtigung empfohlen)",
+    "octopushTypeLowCost": "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
+    "checkPrice": "Prüfe {0} Preise:",
+    "octopushLegacyHint": "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
+    "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
+    "octopushPhoneNumber": "Telefonnummer (Internationales Format, z.B : +49612345678) ",
+    "octopushSMSSender": "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Geräte ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Beispiel: {0}",
+    "Read more:": "Weiterlesen: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Weiterlesen",
+    "appriseInstalled": "Apprise ist installiert.",
+    "appriseNotInstalled": "Apprise ist nicht installiert. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Basic Settings",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
+    "aboutMattermostChannelName": "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
+    "promosmsTypeFlash": "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
+    "promosmsTypeFull": "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.",
+    "promosmsTypeSpeed": "SMS SPEED - Höchste Priorität im System. Sehr schnell und zuverlässig, aber teuer (Ungefähr das doppelte von SMS FULL).",
+    "promosmsPhoneNumber": "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
+    "promosmsSMSSender": "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu Webhook URL",
+    "matrixHomeserverURL": "Heimserver URL (mit http(s):// und optionalen Ports)",
+    "Internal Room Id": "Interne Raum-ID",
+    "matrixDesc1": "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Der Header ist kein gültiges JSON: ",
+    "BodyInvalidFormat": "Der Body ist kein gültiges JSON: ",
+    "Monitor History": "Monitor Verlauf",
+    "clearDataOlderThan": "Bewahre die Monitor-Verlaufsdaten für {0} Tage auf.",
+    "PasswordsDoNotMatch": "Passwörter stimmen nicht überein.",
+    "records": "Einträge",
+    "One record": "Ein Eintrag",
+    "steamApiKeyDescription": "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
+    "Current User": "Aktueller Benutzer",
+    "recent": "Letzte",
+    "Done": "Fertig",
+    "Info": "Info",
+    "Security": "Sicherheit",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Datenbank verkleinern",
+    "Pick a RR-Type...": "Wähle ein RR-Typ aus...",
+    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
+    "Default": "Standard",
+    "HTTP Options": "HTTP Optionen",
+    "Create Incident": "Vorfall erstellen",
+    "Title": "Titel",
+    "Content": "Inhalt",
+    "Style": "Stil",
+    "info": "info",
+    "warning": "warnung",
+    "danger": "gefahr",
+    "primary": "primär",
+    "light": "hell",
+    "dark": "dunkel",
+    "Post": "Eintrag",
+    "Please input title and content": "Bitte Titel und Inhalt eingeben",
+    "Created": "Erstellt",
+    "Last Updated": "Zuletzt aktualisiert",
+    "Unpin": "Loslösen",
+    "Switch to Light Theme": "Zu hellem Thema wechseln",
+    "Switch to Dark Theme": "Zum dunklen Thema wechseln",
+    "Show Tags": "Tags anzeigen",
+    "Hide Tags": "Tags ausblenden",
+    "Description": "Beschreibung",
+    "No monitors available.": "Keine Monitore verfügbar.",
+    "Add one": "Hinzufügen",
+    "No Monitors": "Keine Monitore",
+    "Untitled Group": "Gruppe ohne Titel",
+    "Services": "Dienste",
+    "Discard": "Verwerfen",
+    "Cancel": "Abbrechen",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Passwort",
+    "serwersmsPhoneNumber": "Telefonnummer",
+    "serwersmsSenderName": "Name des SMS-Absenders (über Kundenportal registriert)",
+    "stackfield": "Stackfield",
+    "clicksendsms": "ClickSend SMS",
+    "apiCredentials": "API Zugangsdaten",
+    "smtpDkimSettings": "DKIM Einstellungen",
+    "smtpDkimDesc": "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
+    "documentation": "Dokumentation",
+    "smtpDkimDomain": "Domain Name",
+    "smtpDkimKeySelector": "Schlüssel Auswahl",
+    "smtpDkimPrivateKey": "Privater Schlüssel",
+    "smtpDkimHashAlgo": "Hash-Algorithmus (Optional)",
+    "smtpDkimheaderFieldNames": "Zu validierende Header-Schlüssel (optional)",
+    "smtpDkimskipFields": "Zu ignorierende Header Schlüssel (optional)",
+    "PushByTechulus": "Push by Techulus",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpunkt",
+    "alertaEnvironment": "Umgebung",
+    "alertaApiKey": "API Schlüssel",
+    "alertaAlertState": "Alarmstatus",
+    "alertaRecoverState": "Wiederherstellungsstatus",
+    "deleteStatusPageMsg": "Bist du sicher, dass du diese Status-Seite löschen willst?",
+    "Proxies": "Proxies",
+    "default": "Standard",
+    "enabled": "Aktiviert",
+    "setAsDefault": "Als Standard setzen",
+    "deleteProxyMsg": "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
+    "proxyDescription": "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
+    "enableProxyDescription": "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
+    "setAsDefaultProxyDescription": "Dieser Proxy wird standardmäßig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
+    "Certificate Chain": "Zertifikatskette",
+    "Valid": "Gültig",
+    "Invalid": "Ungültig",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "Telefonnummern",
+    "TemplateCode": "Vorlagencode",
+    "SignName": "Signaturname",
+    "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
+    "Bark Endpoint": "Bark Endpunkt",
+    "WebHookUrl": "Webhook URL",
+    "SecretKey": "Geheimer Schlüssel",
+    "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
+    "Device Token": "Gerätetoken",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Hoch",
+    "Retry": "Wiederholungen",
+    "Topic": "Thema",
+    "WeCom Bot Key": "WeCom Bot Schlüssel",
+    "Setup Proxy": "Proxy einrichten",
+    "Proxy Protocol": "Proxy Protokoll",
+    "Proxy Server": "Proxy-Server",
+    "Proxy server has authentication": "Proxy-Server hat Authentifizierung",
+    "User": "Benutzer",
+    "Installed": "Installiert",
+    "Not installed": "Nicht installiert",
+    "Running": "Läuft",
+    "Not running": "Gestoppt",
+    "Remove Token": "Token entfernen",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Neue Status-Seite hinzufügen",
+    "Slug": "Slug",
+    "Accept characters:": "Akzeptierte Zeichen:",
+    "startOrEndWithOnly": "Nur mit {0} anfangen und enden",
+    "No consecutive dashes": "Keine aufeinanderfolgenden Bindestriche",
+    "Next": "Weiter",
+    "The slug is already taken. Please choose another slug.": "Der Slug ist bereits in Verwendung. Bitte wähle einen anderen.",
+    "No Proxy": "Kein Proxy",
+    "Authentication": "Authentifizierung",
+    "HTTP Basic Auth": "HTTP Basisauthentifizierung",
+    "New Status Page": "Neue Status-Seite",
+    "Page Not Found": "Seite nicht gefunden",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Sicherung",
+    "About": "Über",
+    "wayToGetCloudflaredURL": "(Lade cloudflared von {0} herunter)",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Nachricht:",
+    "Don't know how to get the token? Please read the guide:": "Du weißt nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Die aktuelle Verbindung kann unterbrochen werden, wenn du aktuell über Cloudflare Tunnel verbunden bist. Bist du sicher, dass du es stoppen willst? Gib zur Bestätigung dein aktuelles Passwort ein.",
+    "Other Software": "Andere Software",
+    "For example: nginx, Apache and Traefik.": "Zum Beispiel: nginx, Apache und Traefik.",
+    "Please read": "Bitte lesen",
+    "Subject:": "Betreff:",
+    "Valid To:": "Gültig bis:",
+    "Days Remaining:": "Tage verbleibend:",
+    "Issuer:": "Aussteller:",
+    "Fingerprint:": "Fingerabdruck:",
+    "No status pages": "Keine Status-Seiten",
+    "Domain Name Expiry Notification": "Benachrichtigung bei Ablauf des Domainnamens",
+    "Customize": "Anpassen",
+    "Custom Footer": "Eigener Footer",
+    "Custom CSS": "Eigenes CSS",
+    "Footer Text": "Fußzeile",
+    "Show Powered By": "Zeige 'Powered By'",
+    "Date Created": "Erstellt am",
+    "Domain Names": "Domainnamen",
+    "signedInDisp": "Angemeldet als {0}",
+    "signedInDispDisabled": "Authentifizierung deaktiviert.",
+    "dnsPortDescription": "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
+    "topic": "Thema",
+    "topicExplanation": "MQTT Thema für den monitor",
+    "successMessage": "Erfolgsnachricht",
+    "successMessageExplanation": "MQTT Nachricht, die als Erfolg angesehen wird",
+    "error": "Fehler",
+    "critical": "kritisch",
+    "wayToGetPagerDutyKey": "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
+    "Integration Key": "Schlüssel der Integration",
+    "Integration URL": "URL der Integration",
+    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
+    "do nothing": "nichts tun",
+    "auto acknowledged": "automatisch bestätigen",
+    "auto resolve": "automatisch lösen",
+    "Bark Group": "Bark Gruppe",
+    "Bark Sound": "Bark Klang",
+    "HTTP Headers": "HTTP Kopfzeilen",
+    "Trust Proxy": "Vertrauenswürdiger Proxy",
+    "Proxy": "Proxy",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Adresse",
+    "onebotMessageType": "OneBot Nachrichtentyp",
+    "onebotGroupMessage": "Gruppe",
+    "onebotPrivateMessage": "Privat",
+    "onebotUserOrGroupId": "Gruppe/Nutzer ID",
+    "onebotSafetyTips": "Zur Sicherheit ein access token setzen",
+    "PushDeer Key": "PushDeer Schlüssel",
+    "RadiusSecret": "Radius Geheimnis",
+    "RadiusSecretDescription": "Geteiltes Geheimnis zwischen Client und Server",
+    "RadiusCalledStationId": "ID der angesprochenen Station",
+    "RadiusCalledStationIdDescription": "Identifikation des angesprochenen Geräts",
+    "RadiusCallingStationId": "ID der ansprechenden Station",
+    "RadiusCallingStationIdDescription": "Identifikation des ansprechenden Geräts",
+    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
+    "API Username": "API Nutzername",
+    "API Key": "API Schlüssel",
+    "Recipient Number": "Empfängernummer",
+    "From Name/Number": "Von Name/Nummer",
+    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "Endpunkt",
+    "octopushAPIKey": "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
+    "octopushLogin": "\"Login\" der HTTP API Zugangsdaten im control panel",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (Standard)",
+    "pushoversounds bike": "Fahrrad",
+    "pushoversounds bugle": "Signalhorn",
+    "pushoversounds cashregister": "Kasse",
+    "pushoversounds classical": "Klassisch",
+    "pushoversounds cosmic": "Kosmisch",
+    "pushoversounds falling": "Abfallend",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Eingang",
+    "pushoversounds intermission": "Pause",
+    "pushoversounds magic": "Magisch",
+    "pushoversounds mechanical": "Mechanisch",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Sirene",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Schlepper Horn",
+    "pushoversounds alien": "Außerirdisch (lang)",
+    "pushoversounds climb": "Ansteigende (lang)",
+    "pushoversounds persistent": "Hartnäckig (lang)",
+    "pushoversounds echo": "Pushover Echo (lang)",
+    "pushoversounds updown": "Auf und Ab (lang)",
+    "pushoversounds vibrate": "Nur vibrieren",
+    "pushoversounds none": "Nichts (Stille)",
+    "pushyAPIKey": "Geheimer API Schlüssel",
+    "pushyToken": "Gerätetoken",
+    "Show update if available": "Verfügbare Updates anzeigen",
+    "Also check beta release": "Auch nach Beta Versionen schauen",
+    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
+    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Wahrscheinliche Ursachen:",
+    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
+    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
+    "What you can try:": "Was du versuchen kannst:",
+    "Retype the address.": "Schreibe die Adresse erneut.",
+    "Go back to the previous page.": "Gehe zur vorigen Seite.",
+    "Coming Soon": "Kommt bald",
+    "wayToGetClickSendSMSToken": "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
+    "Connection String": "Verbindungstext",
+    "Query": "Abfrage",
+    "settingsCertificateExpiry": "TLS Zertifikatsablauf",
+    "certificationExpiryDescription": "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
+    "Setup Docker Host": "Docker Host einrichten",
+    "Connection Type": "Verbindungstyp",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Bist du sicher diesen docker host für alle Monitore zu löschen?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Thema",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
+    "trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
+    "wayToGetLineNotifyToken": "Du kannst hier ein Token erhalten: {0}",
+    "Examples": "Beispiele",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Lange gültiges Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
+    "Notification Service": "Benachrichtigungsdienst",
+    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
+    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
+    "Trigger type:": "Auslöser:",
+    "Event type:": "Ereignistyp:",
+    "Event data:": "Ereignis daten:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
+    "Frontend Version": "Frontend Version",
+    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
+    "Maintenance": "Wartung",
+    "statusMaintenance": "Wartung",
+    "Schedule maintenance": "Geplante Wartung",
+    "Affected Monitors": "Betroffene Monitore",
+    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
+    "Start of maintenance": "Beginn der Wartung",
+    "All Status Pages": "Alle Status Seiten",
+    "Select status pages...": "Statusseiten auswählen...",
+    "recurringIntervalMessage": "Einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
+    "affectedMonitorsDescription": "Wähle Monitore aus, die von der aktuellen Wartung betroffen sind",
+    "affectedStatusPages": "Diese Wartungsmeldung auf ausgewählten Statusseiten anzeigen",
+    "atLeastOneMonitor": "Wähle mindestens einen Monitor",
+    "deleteMaintenanceMsg": "Möchtest du diese Wartung löschen?",
+    "Base URL": "Basis URL",
+    "goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
+    "goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Veraltet: Da viele Funktionen hinzugefügt wurden und diese Sicherungsfunktion nicht mehr gepflegt wird, kann sie keine vollständige Sicherung erstellen oder wiederherstellen.",
+    "backupRecommend": "Bitte sichere stattdessen das Volume oder den Datenordner (./data/) direkt.",
+    "Optional": "Optional",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Dokumente",
+    "Gateway Type": "Gateway Type",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Du kannst Zahlen teilen mit",
+    "or": "oder",
+    "recurringInterval": "Intervall",
+    "Recurring": "Wiederkehrend",
+    "Single Maintenance Window": "Einzigartiges Wartungsfenster",
+    "Maintenance Time Window of a Day": "Zeitfenster für die Wartung",
+    "Effective Date Range": "Bereich der Wirksamkeitsdaten",
+    "strategyManual": "Aktiv/Inaktiv Manuell",
+    "warningTimezone": "Es wird die Zeitzone des Servers verwendet",
+    "weekdayShortMon": "Mo",
+    "weekdayShortTue": "Di",
+    "weekdayShortWed": "Mi",
+    "weekdayShortThu": "Do",
+    "weekdayShortFri": "Fr",
+    "weekdayShortSat": "Sa",
+    "weekdayShortSun": "So",
+    "dayOfWeek": "Tag der Woche",
+    "dayOfMonth": "Tag im Monat",
+    "lastDay": "Letzter Tag",
+    "lastDay1": "Letzter Tag im Monat",
+    "lastDay2": "Vorletzer Tag im Monat",
+    "lastDay3": "3. letzter Tag im Monat",
+    "lastDay4": "4. letzter Tag im Monat",
+    "No Maintenance": "Keine Wartung",
+    "Schedule Maintenance": "Wartung planen",
+    "pauseMaintenanceMsg": "Möchtest du wirklich pausieren?",
+    "maintenanceStatus-under-maintenance": "Unter Wartung",
+    "maintenanceStatus-inactive": "Inaktiv",
+    "maintenanceStatus-scheduled": "Geplant",
+    "maintenanceStatus-ended": "Ende",
+    "maintenanceStatus-unknown": "Unbekannt",
+    "Display Timezone": "Zeitzone anzeigen",
+    "Server Timezone": "Server Zeitzone",
+    "Date and Time": "Datum und Zeit",
+    "DateTime Range": "Datums- und Zeitbereich",
+    "Strategy": "Strategie",
+    "statusPageMaintenanceEndDate": "Ende"
+}
diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json
new file mode 100644
index 00000000..c77d6158
--- /dev/null
+++ b/src/lang/el-GR.json
@@ -0,0 +1,587 @@
+{
+    "languageName": "Ελληνικά",
+    "checkEverySecond": "Έλεγχος κάθε {0} δευτερόλεπτα",
+    "retryCheckEverySecond": "Επανάληψη κάθε {0} δευτερόλεπτα",
+    "resendEveryXTimes": "Επανάληψη αποστολής ειδοποίησης κάθε {0} φορές",
+    "resendDisabled": "Η επανάληψη αποστολής ειδοποίησης είναι απενεργοποιημένη",
+    "retriesDescription": "Μέγιστες επαναλήψεις προτού η υπηρεσία επισημανθεί ως κατω και σταλεί μια ειδοποίηση",
+    "ignoreTLSError": "Παράβλεψη σφάλματος TLS/SSL για ιστότοπους HTTPS",
+    "upsideDownModeDescription": "Αναποδογυρίστε την κατάσταση. Εάν η υπηρεσία είναι προσβάσιμη, είναι ΚΑΤΩ.",
+    "maxRedirectDescription": "Μέγιστος αριθμός redirect που θα ακολουθήσουν. Ρυθμίστε το 0 για να απενεργοποιήσετε τα redirect.",
+    "acceptedStatusCodesDescription": "Επιλέξτε κωδικούς κατάστασης που θεωρούνται επιτυχή.",
+    "passwordNotMatchMsg": "Ο κωδικός δεν ταιριάζει.",
+    "notificationDescription": "Οι ειδοποιήσεις πρέπει να εκχωρηθούν σε μια παρακολούθηση για να λειτουργήσουν.",
+    "keywordDescription": "Αναζήτηση λέξης-κλειδιού σε απλή απόκριση HTML ή JSON. Η αναζήτηση είναι διάκριση πεζών-κεφαλαίων.",
+    "pauseDashboardHome": "Παύση",
+    "deleteMonitorMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την παρακολούθηση;",
+    "deleteNotificationMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την ειδοποίηση για όλες τις παρακολούθησης?",
+    "dnsPortDescription": "Θύρα διακομιστή DNS. Προεπιλογή σε 53. Μπορείτε να αλλάξετε τη θύρα ανά πάσα στιγμή.",
+    "resolverserverDescription": "Το Cloudflare είναι ο προεπιλεγμένος διακομιστής. Μπορείτε να αλλάξετε τον διακομιστή επίλυσης ανά πάσα στιγμήhe default server. You can change the resolver server anytime.",
+    "rrtypeDescription": "Επιλέξτε τον τύπο RR που θέλετε να παρακολουθήσετε",
+    "pauseMonitorMsg": "Είστε βέβαιοι ότι θέλετε να κάνετε παύση;",
+    "enableDefaultNotificationDescription": "Αυτή η ειδοποίηση θα είναι ενεργοποιημένη από προεπιλογή για νέες παρακολούθησης. Μπορείτε ακόμα να απενεργοποιήσετε την ειδοποίηση ξεχωριστά για κάθε παρακολούθηση.",
+    "clearEventsMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα συμβάντα για αυτήν την παρακολούθηση;",
+    "clearHeartbeatsMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλους τους καρδιακούς παλμούς για αυτήν την παρακολούθηση;",
+    "confirmClearStatisticsMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε ΟΛΑ τα στατιστικά στοιχεία;?",
+    "importHandleDescription": "Επιλέξτε «Παράλειψη υπάρχοντος» εάν θέλετε να παραλείψετε κάθε παρακολούθηση ή ειδοποίηση με το ίδιο όνομα. Το 'Overwrite' θα διαγράψει κάθε υπάρχουσα παρακολούθηση και ειδοποίηση.",
+    "confirmImportMsg": "Είστε βέβαιοι ότι θέλετε να εισαγάγετε το αντίγραφο ασφαλείας; Επαληθεύστε ότι έχετε επιλέξει τη σωστή επιλογή.",
+    "twoFAVerifyLabel": "Εισαγάγετε το 2FA κωδικό για να επαληθεύσετε: ",
+    "tokenValidSettingsMsg": "Ο κωδικός 2FA είναι έγκυρο! Τώρα μπορείτε να αποθηκεύσετε τις ρυθμίσεις 2FA",
+    "confirmEnableTwoFAMsg": "Είστε βέβαιοι ότι θέλετε να ενεργοποιήσετε το 2FA;",
+    "confirmDisableTwoFAMsg": "Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε το 2FA;",
+    "Settings": "Ρυθμίσεις",
+    "Dashboard": "Πίνακας",
+    "New Update": "Νέα αναβάθμιση",
+    "Language": "Γλώσσα",
+    "Appearance": "Εμφάνιση",
+    "Theme": "Θέμα",
+    "General": "Γενικά",
+    "Primary Base URL": "Κύρια βασική διεύθυνση URL",
+    "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": "Current",
+    "Uptime": "Χρόνος λειτουργίας",
+    "Cert Exp.": "Cert Exp.",
+    "day": "ημέρα | ημέρες",
+    "-day": "-ημέρα",
+    "hour": "ώρα",
+    "-hour": "-ώρα",
+    "Response": "Απάντηση",
+    "Ping": "Ping",
+    "Monitor Type": "Τύπος παρακολούθησης",
+    "Keyword": "Λέξη-κλειδί",
+    "Friendly Name": "Φιλικό όνομα",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Διάστημα καρδιακών παλμών",
+    "Retries": "Επαναλήψεις",
+    "Heartbeat Retry Interval": "Διάστημα επανάληψης παλμών καρδιάς",
+    "Resend Notification if Down X times consequently": "Αποστολή νέας ειδοποίησης εάν κατω X φορές κατά συνέχεια",
+    "Advanced": "Προχωρημένα",
+    "Upside Down Mode": "Ανάποδη λειτουργία",
+    "Max. Redirects": "Μέγιστη. Ανακατευθύνσεις",
+    "Accepted Status Codes": "Αποδεκτοί Κωδικοί Κατάστασης",
+    "Push URL": "Push URL",
+    "needPushEvery": "Θα πρέπει να καλείτε αυτήν τη διεύθυνση URL κάθε {0} δευτερόλεπτα.",
+    "pushOptionalParams": "Προαιρετικές παράμετροι: {0}",
+    "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": "Ενεργοποίηση ελέγχου ταυτότητας",
+    "disableauth.message1": "Είστε βέβαιοι ότι θέλετε να <strong>απενεργοποιήσετε τον έλεγχο ταυτότητας</strong>;",
+    "disableauth.message2": "Έχει σχεδιαστεί για σενάρια <strong>όπου σκοπεύετε να εφαρμόσετε έλεγχο ταυτότητας τρίτου μέρους</strong> μπροστά από το Uptime Kuma, όπως το Cloudflare Access, Authelia ή άλλους μηχανισμούς ελέγχου ταυτότητας.",
+    "Please use this option carefully!": "Χρησιμοποιήστε αυτή την επιλογή προσεκτικά!",
+    "Logout": "Αποσύνδεση",
+    "Leave": "Φύγετε",
+    "I understand, please disable": "Καταλαβαίνω, απενεργοποιήστε",
+    "Confirm": "Επιβεβαίωση",
+    "Yes": "Ναί",
+    "No": "Οχι",
+    "Username": "Όνομα χρήστη",
+    "Password": "Κωδικός πρόσβασης",
+    "Remember me": "Θυμήσου με",
+    "Login": "Σύνδεση",
+    "No Monitors, please": "Δεν υπάρχουν παρακολούθησης παρακαλώ",
+    "add one": "προσθέστε ένα",
+    "Notification Type": "Είδος ειδοποίησης",
+    "Email": "Email",
+    "Test": "Δοκιμή",
+    "Certificate Info": "Πληροφορίες πιστοποιητικού",
+    "Resolver Server": "Διακομιστής επίλυσης",
+    "Resource Record Type": "Τύπος εγγραφής πόρων",
+    "Last Result": "Τελευταίο Αποτέλεσμα",
+    "Create your admin account": "Δημιουργήστε τον λογαριασμό διαχειριστή σας",
+    "Repeat Password": "Επαναλάβετε τον κωδικό πρόσβασης",
+    "Import Backup": "Εισαγωγή αντιγράφων ασφαλείας",
+    "Export Backup": "Εξαγωγή αντιγράφων ασφαλείας",
+    "Export": "Εξαγωγή",
+    "Import": "Εισαγωγή",
+    "respTime": "Χρόν. Aπό (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Προεπιλογή ενεργοποιημένη",
+    "Apply on all existing monitors": "Εφαρμόστε σε όλες τις υπάρχουσες παρακολούθησης",
+    "Create": "Δημιουργία",
+    "Clear Data": "Καθαρισμός δεδομένων",
+    "Events": "Γεγονότα",
+    "Heartbeats": "Παλμοι καρδιας",
+    "Auto Get": "Αυτόματη λήψη",
+    "backupDescription": "Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας γία ολλες της παρακολούθησης και ειδοποιήσης σε ένα αρχείο JSON.",
+    "backupDescription2": "Σημείωση: δεν περιλαμβάνονται δεδομένα ιστορικού και συμβάντων.",
+    "backupDescription3": "Στο αρχείο εξαγωγής περιλαμβάνονται ευαίσθητα δεδομένα, όπως token ειδοποιήσεων. Aποθηκεύστε την εξαγωγή με ασφάλεια.",
+    "alertNoFile": "Επιλέξτε ένα αρχείο για εισαγωγή.",
+    "alertWrongFileType": "Επιλέξτε ένα αρχείο JSON.",
+    "Clear all statistics": "Εκκαθάριση όλων των στατιστικών",
+    "Skip existing": "Παράβλεψη υπάρχοντος",
+    "Overwrite": "Αντικατάσταση",
+    "Options": "Επιλογές",
+    "Keep both": "Κράτα και τα δύο",
+    "Verify Token": "Επαλήθευση Token",
+    "Setup 2FA": "Ρύθμιση 2FA",
+    "Enable 2FA": "Ενεργοποίηση 2FA",
+    "Disable 2FA": "Απενεργοποίηση 2FA",
+    "2FA Settings": "Ρυθμίσεις 2FA",
+    "Two Factor Authentication": "Έλεγχος ταυτότητας δύο παραγόντων",
+    "Active": "Ενεργός",
+    "Inactive": "Ανενεργό",
+    "Token": "Token",
+    "Show URI": "Εμφάνιση URI",
+    "Tags": "Ετικέτες",
+    "Add New below or Select...": "Προσθήκη νέου παρακάτω ή Επιλέξτε...",
+    "Tag with this name already exist.": "Υπάρχει ήδη η ετικέτα με αυτό το όνομα.",
+    "Tag with this value already exist.": "Υπάρχει ήδη ετικέτα με αυτό το value.",
+    "color": "χρώμα",
+    "value (optional)": "value (optional)",
+    "Gray": "Γκρί",
+    "Red": "Κόκκινο",
+    "Orange": "Πορτοκάλι",
+    "Green": "Πράσινο",
+    "Blue": "Μπλε",
+    "Indigo": "Indigo",
+    "Purple": "Μωβ",
+    "Pink": "Ροζ",
+    "Search...": "Αναζήτηση...",
+    "Avg. Ping": "Μέσo.Ping",
+    "Avg. Response": "Μέσo. Aπάντηση",
+    "Entry Page": "Σελίδα εισαγωγής",
+    "statusPageNothing": "Δεν υπάρχει τίποτα εδώ, προσθέστε μια ομάδα ή μια παρακολούθηση.",
+    "No Services": "Δεν υπάρχουν υπηρεσίες",
+    "All Systems Operational": "Όλα τα συστήματα λειτουργούν",
+    "Partially Degraded Service": "Μερικώς υποβαθμισμένη υπηρεσία",
+    "Degraded Service": "Υποβαθμισμένη υπηρεσία",
+    "Add Group": "Προσθήκη γρουπ",
+    "Add a monitor": "Προσθήκη παρακολούθησης",
+    "Edit Status Page": "Επεξεργασία σελίδας κατάστασης",
+    "Go to Dashboard": "Μεταβείτε στον Πίνακα ελέγχου",
+    "Status Page": "Σελίδα κατάστασης",
+    "Status Pages": "Σελίδες κατάστασης",
+    "defaultNotificationName": "Η ειδοποίηση μου {notification} ({number})",
+    "here": "εδώ",
+    "Required": "Απαιτείται",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Διακριτικό Bot",
+    "wayToGetTelegramToken": "Μπορείτε να πάρετε ένα διακριτικό από {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "Μπορείτε να λάβετε το αναγνωριστικό συνομιλίας σας στέλνοντας ένα μήνυμα στο bot και μεταβαίνοντας σε αυτήν τη διεύθυνση URL για να προβάλετε το chat_id:",
+    "YOUR BOT TOKEN HERE": "ΤΟ BOT ΣΑΣ ΔΙΑΚΡΙΤΙΚΌ ΕΔΩ",
+    "chatIDNotFound": "Το Chat ID δεν βρέθηκε. Στείλτε πρώτα ένα μήνυμα σε αυτό το bot",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Τύπος περιεχομένου",
+    "webhookJsonDesc": "{0} είναι καλό για οποιονδήποτε σύγχρονο διακομιστή HTTP όπως το Express.js",
+    "webhookFormDataDesc": "{multipart} είναι καλό για την PHP. Το JSON θα πρέπει να αναλυθεί με {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Παράβλεψη σφάλματος TLS",
+    "From Email": "Από Email",
+    "emailCustomSubject": "Προσαρμοσμένο θέμα",
+    "To Email": "Προς Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Μπορείτε να το αποκτήσετε μεταβαίνοντας στις Ρυθμίσεις διακομιστή -> Ενσωματώσεις -> Δημιουργία Webhook",
+    "Bot Display Name": "Εμφανιζόμενο όνομα bot",
+    "Prefix Custom Message": "Προσαρμοσμένο μήνυμα",
+    "Hello @everyone is...": "Γεια {'@'}everyone ειναι...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
+    "wayToGetZohoCliqURL": "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
+    "signal": "Signal",
+    "Number": "Αριθμός",
+    "Recipients": "Αποδέκτες",
+    "needSignalAPI": "Πρέπει να έχετε ένα signal client με REST API..",
+    "wayToCheckSignalURL": "Μπορείτε να ελέγξετε αυτό το URL για να δείτε πώς να ρυθμίσετε ένα:",
+    "signalImportant": "ΣΗΜΑΝΤΙΚΟ: Δεν μπορείτε να συνδυάσετε ομάδες και αριθμούς στους παραλήπτες!",
+    "gotify": "Gotify",
+    "Application Token": "Token εφαρμογής",
+    "Server URL": "URL διακομιστή",
+    "Priority": "Προτεραιότητα",
+    "slack": "Slack",
+    "Icon Emoji": "Εικονίδιο Emoji",
+    "Channel Name": "Όνομα καναλιού",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Περισσότερες πληροφορίες σχετικά με τα Webhooks στο: {0}",
+    "aboutChannelName": "Εισαγάγετε το όνομα του καναλιού στο {0} Όνομα καναλιού εάν θέλετε να παρακάμψετε το κανάλι Webhook. Π.χ.: #other-channel",
+    "aboutKumaURL": "Εάν αφήσετε κενό το πεδίο URL Uptime Kuma, θα είναι προεπιλεγμένο στη σελίδα Project GitHub..",
+    "emojiCheatSheet": "Φύλλο εξαπάτησης emoji: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Κλειδί χρήστη",
+    "Device": "Συσκευή",
+    "Message Title": "Τίτλος μηνύματος",
+    "Notification Sound": "Ήχος ειδοποίησης",
+    "More info on:": "Περισσότερες πληροφορίες στο: {0}",
+    "pushoverDesc1": "Η προτεραιότητα έκτακτης ανάγκης (2) έχει προεπιλεγμένο χρονικό όριο 30 δευτερολέπτων μεταξύ των επαναλήψεων και θα λήξει μετά από 1 ώρα.",
+    "pushoverDesc2": "Εάν θέλετε να στέλνετε ειδοποιήσεις σε διαφορετικές συσκευές, συμπληρώστε το πεδίο Συσκευή.",
+    "SMS Type": "Τύπος SMS",
+    "octopushTypePremium": "Premium (Γρήγορη - συνιστάται για ειδοποίηση)",
+    "octopushTypeLowCost": "Χαμηλό κόστος (Αργό - μερικές φορές μπλοκάρεται από τον χειριστή)",
+    "checkPrice": "Ελέγξτε τις τιμές {0}:",
+    "apiCredentials": "API credentials",
+    "octopushLegacyHint": "Χρησιμοποιείτε την παλαιού τύπου έκδοση του Octopush (2011-2020) ή τη νέα έκδοση;",
+    "Check octopush prices": "Ελέγξτε τις τιμές OctoPush {0}.",
+    "octopushPhoneNumber": "Αριθμός τηλεφώνου (διεθνής μορφή, π.χ.: +30694345678)",
+    "octopushSMSSender": "Όνομα αποστολέα SMS: 3-11 αλφαριθμητικοί χαρακτήρες και διάστημα (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Παράδειγμα: {0}",
+    "Read more:": "Διαβάστε περισσότερα: {0}",
+    "Status:": "Κατάσταση: {0}",
+    "Read more": "Διαβάστε περισσότερα",
+    "appriseInstalled": "Το Apprise έχει εγκατασταθεί.",
+    "appriseNotInstalled": "Το Apprise δεν έχει εγκατασταθεί. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel Access Token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Βασικές ρυθμίσεις",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Πρώτα αποκτήστε πρόσβαση στο {0}, δημιουργήστε έναν πάροχο και ένα κανάλι (Messanging API) και, στη συνέχεια, μπορείτε να λάβετε το channel access token και το user ID από τα παραπάνω στοιχεία μενού.",
+    "Icon URL": "Διεύθυνση URL εικονιδίου",
+    "aboutIconURL": "Μπορείτε να παρέχετε έναν σύνδεσμο προς μια εικόνα στο \"Icon URL\" για να παρακάμψετε την προεπιλεγμένη εικόνα προφίλ. Δεν θα χρησιμοποιηθεί εάν έχει οριστεί το εικονίδιο Emoji.",
+    "aboutMattermostChannelName": "Μπορείτε να παρακάμψετε το προεπιλεγμένο κανάλι στο οποίο δημοσιεύει το Webhook εισάγοντας το όνομα του καναλιού στο πεδίο \"Όνομα καναλιού\". Αυτό πρέπει να ενεργοποιηθεί στις ρυθμίσεις του Mattermost Webhook. Π.χ.: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - φθηνό αλλά αργό και συχνά υπερφορτωμένο. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
+    "promosmsTypeFlash": "SMS FLASH - Το μήνυμα θα εμφανίζεται αυτόματα στη συσκευή του παραλήπτη. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
+    "promosmsTypeFull": "SMS FULL - Premium επίπεδο SMS, Μπορείτε να χρησιμοποιήσετε το Όνομα Αποστολέα σας (Πρέπει πρώτα να καταχωρήσετε το όνομα). Αξιόπιστο για ειδοποιήσεις.",
+    "promosmsTypeSpeed": "SMS SPEED - Υψηλότερη προτεραιότητα στο σύστημα. Πολύ γρήγορο και αξιόπιστο αλλά ακριβό (περίπου διπλάσια τιμή SMS FULL).",
+    "promosmsPhoneNumber": "Αριθμός τηλεφώνου (για πολωνούς παραλήπτες Μπορείτε να παραλείψετε τους κωδικούς περιοχής)",
+    "promosmsSMSSender": "Όνομα αποστολέα SMS: Προεγγεγραμμένο όνομα ή ένα από τα προεπιλεγμένα: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (με http(s):// και προαιρετικά θύρα)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "Μπορείτε να βρείτε το internal room ID ανατρέχοντας στην ενότητα για προχωρημένους των ρυθμίσεων δωματίου στο πρόγραμμα-πελάτη Matrix. Θα πρέπει να μοιάζει με !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Συνιστάται ανεπιφύλακτα να δημιουργήσετε έναν νέο χρήστη και να μην χρησιμοποιήσετε το διακριτικό πρόσβασης του χρήστη Matrix, καθώς θα επιτρέψει την πλήρη πρόσβαση στον λογαριασμό σας και σε όλα τα δωμάτια στα οποία συμμετέχετε. Αντίθετα, δημιουργήστε έναν νέο χρήστη και προσκαλέστε τον μόνο στο δωμάτιο στο οποίο θέλετε να λαμβάνετε την ειδοποίηση. Μπορείτε να λάβετε το access token εκτελώντας {0}",
+    "Method": "Μέθοδος",
+    "Body": "Σώμα",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "The request headers are not valid JSON: ",
+    "BodyInvalidFormat": "The request body is not valid JSON: ",
+    "Monitor History": "Ιστορικο Παρακολούθησης",
+    "clearDataOlderThan": "Διατηρήστε τα δεδομένα ιστορικού παρακολούθησης για {0} ημέρες.",
+    "PasswordsDoNotMatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν.",
+    "records": "εγγραφές",
+    "One record": "Μία εγγραφή",
+    "steamApiKeyDescription": "Για την παρακολούθηση ενός διακομιστή παιχνιδιών Steam χρειάζεστε ένα κλειδί Steam Web-API. Μπορείτε να καταχωρήσετε το κλειδί API σας εδώ: ",
+    "Current User": "Τρέχων χρήστης",
+    "topic": "Θέμα",
+    "topicExplanation": "Θέμα MQTT προς παρακολούθηση",
+    "successMessage": "Μήνυμα επιτυχίας",
+    "successMessageExplanation": "Μήνυμα MQTT που θα θεωρηθεί επιτυχές",
+    "recent": "Πρόσφατος",
+    "Done": "Ολοκληρώθηκε",
+    "Info": "Πληροφορίες",
+    "Security": "Ασφάλεια",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Συρρίκνωση βάσης δεδομένων",
+    "Pick a RR-Type...": "Επιλέξτε έναν τύπο RR...",
+    "Pick Accepted Status Codes...": "Επιλέξτε Αποδεκτούς κωδικούς κατάστασης...",
+    "Default": "Προκαθορισμένο",
+    "HTTP Options": "Επιλογές HTTP",
+    "Create Incident": "Δημιουργία περιστατικού",
+    "Title": "Τίτλος",
+    "Content": "Περιεχόμενο",
+    "Style": "Στυλ",
+    "info": "πληροφορίες",
+    "warning": "προειδοποίηση",
+    "danger": "κίνδυνος",
+    "error": "σφάλμα",
+    "critical": "κριτικό",
+    "primary": "primary",
+    "light": "light",
+    "dark": "dark",
+    "Post": "Δημοσίευση",
+    "Please input title and content": "Παρακαλούμε εισαγάγετε τίτλο και περιεχόμενο",
+    "Created": "Δημιουργήθηκε",
+    "Last Updated": "Τελευταία ενημέρωση",
+    "Unpin": "Ξεκαρφιτσώστε",
+    "Switch to Light Theme": "Μετάβαση σε Ανιχτό θέμα",
+    "Switch to Dark Theme": "Μετάβαση σε Σκούρο θέμα",
+    "Show Tags": "Εμφάνιση ετικετών",
+    "Hide Tags": "Απόκρυψη ετικετών",
+    "Description": "Περιγραφή",
+    "No monitors available.": "Δεν υπάρχουν διαθέσιμες παρακολουθήσεις.",
+    "Add one": "Προσθέστε ένα",
+    "No Monitors": "Χωρίς παρακολουθήσεις",
+    "Untitled Group": "Ομάδα χωρίς τίτλο",
+    "Services": "Υπηρεσίες",
+    "Discard": "Απορρίψει",
+    "Cancel": "Ακυρο",
+    "Powered by": "Με την υποστήριξη του",
+    "shrinkDatabaseDescription": "Ενεργοποίηση βάσης δεδομένων VACUUM για SQLite. Εάν η βάση δεδομένων σας έχει δημιουργηθεί μετά την έκδοση 1.10.0, το AUTO_VACUUM είναι ήδη ενεργοποιημένο και αυτή η ενέργεια δεν χρειάζεται.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API κωδικός πρόσβασης",
+    "serwersmsPhoneNumber": "Αριθμός τηλεφώνου",
+    "serwersmsSenderName": "Όνομα αποστολέα SMS (καταχωρήθηκε μέσω της πύλης πελατών)",
+    "stackfield": "Stackfield",
+    "Customize": "Προσαρμογή",
+    "Custom Footer": "Προσαρμογή Footer",
+    "Custom CSS": "Προσαρμογή CSS",
+    "smtpDkimSettings": "Ρυθμίσεις DKIM",
+    "smtpDkimDesc": "Ανατρέξτε στο Nodemailer DKIM {0} για χρήση.",
+    "documentation": "documentation",
+    "smtpDkimDomain": "Domain Name",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "Hash Algorithm (Optional)",
+    "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
+    "smtpDkimskipFields": "Header Keys not to sign (Optional)",
+    "wayToGetPagerDutyKey": "Μπορείτε να το λάβετε μεταβαίνοντας στο Service -> Service Directory -> (Επιλέξτε μια υπηρεσία) -> Integrations -> Add integration. Εδώ μπορείτε να κάνετε αναζήτηση για \"Events API V2\". Περισσότερες πληροφορίες {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Αυτόματη επίλυση ή αναγνώριση",
+    "do nothing": "μην κάνεις τίποτα",
+    "auto acknowledged": "αυτόματη αναγνώριση",
+    "auto resolve": "αυτόματη επίλυση",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Alert State",
+    "alertaRecoverState": "Recover State",
+    "deleteStatusPageMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν τη σελίδα κατάστασης?",
+    "Proxies": "Proxies",
+    "default": "Προκαθορισμένο",
+    "enabled": "Ενεργοποιημένο",
+    "setAsDefault": "Ορίσετε ως προεπιλογή",
+    "deleteProxyMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το proxy για όλες τις παρακολουθήσεις;",
+    "proxyDescription": "Πρέπει να εκχωρηθούν proxies σε μια οθπαρακολουθή για να λειτουργήσουν..",
+    "enableProxyDescription": "Το proxy δεν θα επηρεάσει τα αιτήματα της παρακολουθήσεις μέχρι να ενεργοποιηθεί. Μπορείτε να ελέγξετε την προσωρινή απενεργοποίηση του proxy από όλες τις παρακολουθήσεις βάσει κατάστασης ενεργοποίησης.",
+    "setAsDefaultProxyDescription": "Αυτός το proxy θα είναι ενεργοποιημένο από προεπιλογή για νέες παρακολουθήσεις. Μπορείτε ακόμα να απενεργοποιήσετε το proxy ξεχωριστά για κάθε οθόνη.",
+    "Certificate Chain": "Certificate Chain",
+    "Valid": "Εγκυρο",
+    "Invalid": "Μη έγκυρο",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Το πρότυπο SMS πρέπει να περιέχει παραμέτρους: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Ομάδα",
+    "Bark Sound": "Bark Ήχος",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Για ασφάλεια, πρέπει να χρησιμοποιήσετε secret key",
+    "Device Token": "Device Token",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Ξαναδοκιμάσετε",
+    "Topic": "Θέμα",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Ρύθμιση Proxy",
+    "Proxy Protocol": "Πρωτόκολλο Proxy",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Το Proxy διαθέτει έλεγχο ταυτότητας",
+    "User": "Χρήστης",
+    "Installed": "Εγκατεστημένο",
+    "Not installed": "Μη εγκατεστημενο",
+    "Running": "Τρέχη",
+    "Not running": "Δεν τρεχη",
+    "Remove Token": "Κατάργηση Token",
+    "Start": "Αρχή",
+    "Stop": "Στάση",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Προσθήκη νέας σελίδας κατάστασης",
+    "Slug": "Slug",
+    "Accept characters:": "Αποδοχή χαρακτήρων:",
+    "startOrEndWithOnly": "Ξεκινήστε ή τελειώστε μόνο με {0}",
+    "No consecutive dashes": "Χωρίς διαδοχικές παύλες",
+    "Next": "Επόμενο",
+    "The slug is already taken. Please choose another slug.": "Ο slug έχει ήδη πιαστεί. Επιλέξτε άλλο slug.",
+    "No Proxy": "Οχι Proxy",
+    "Authentication": "Authentication",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Νέας Σελίδα κατάστασης",
+    "Page Not Found": "Η σελίδα δεν βρέθηκε",
+    "Reverse Proxy": "Αντίστροφο Proxy",
+    "Backup": "Αντιγράφων ασφαλείας",
+    "About": "Σχετικά με το Uptime Kuma",
+    "wayToGetCloudflaredURL": "(Λήψη cloudflared από {0})",
+    "cloudflareWebsite": "Ιστοσελίδα Cloudflare",
+    "Message:": "Μήνυμα:",
+    "Don't know how to get the token? Please read the guide:": "Δεν ξέρετε πώς να αποκτήσετε το token; Διαβάστε τον οδηγό:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Η τρέχουσα σύνδεση μπορεί να χαθεί εάν αυτή τη στιγμή συνδέεστε μέσω του Cloudflare Tunnel. Θέλετε σίγουρα να το σταματήσετε; Πληκτρολογήστε τον τρέχοντα κωδικό πρόσβασής σας για να τον επιβεβαιώσετε.",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Εμπιστοσύνη του Proxy",
+    "Other Software": "Other Software",
+    "For example: nginx, Apache and Traefik.": "Για παράδειγμα: nginx, Apache και Traefik.",
+    "Please read": "Παρακαλώ διαβάστε",
+    "Subject:": "Θέμα:",
+    "Valid To:": "Εγκυρο για:",
+    "Days Remaining:": "Ημέρες που απομένουν:",
+    "Issuer:": "Εκδότης:",
+    "Fingerprint:": "Δακτυλικό αποτύπωμα:",
+    "No status pages": "Δεν υπάρχουν σελίδες κατάστασης",
+    "Domain Name Expiry Notification": "Ειδοποίηση λήξης ονόματος τομέα",
+    "Proxy": "Proxy",
+    "Date Created": "Ημερομηνία Δημιουργίας",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Address",
+    "onebotMessageType": "OneBot Message Type",
+    "onebotGroupMessage": "Group",
+    "onebotPrivateMessage": "Private",
+    "onebotUserOrGroupId": "Group/User ID",
+    "onebotSafetyTips": "Για ασφάλεια, πρέπει να ορίσετε το acess token",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Κείμενο υποσέλιδου",
+    "Show Powered By": "Εμφάνιση Powered By",
+    "Domain Names": "Ονόματα Τομέα",
+    "signedInDisp": "Συνδεθήκατε ως {0}",
+    "signedInDispDisabled": "Εξουσιοδότηση είναι απενεργοποιημένη.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Shared Secret μεταξύ client και το server",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCalledStationIdDescription": "Identifier της καλούμενης συσκευής",
+    "RadiusCallingStationId": "Calling Station Id",
+    "RadiusCallingStationIdDescription": "Identifier oτης συσκευής κλήσης",
+    "Certificate Expiry Notification": "Ειδοποίηση Λήξης Πιστοποιητικού",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "Αριθμός Παραλήπτη",
+    "From Name/Number": "Από Όνομα/Αριθμός",
+    "Leave blank to use a shared sender number.": "Αφήστε το κενό για να χρησιμοποιήσετε έναν κοινόχρηστο αριθμό αποστολέα.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" από το HTTP API credentials στον πίνακα ελέγχου",
+    "octopushLogin": "\"Login\" από το HTTP API credentials στον πίνακα ελέγχου",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Μυστικό API Key",
+    "pushyToken": "Τoken Συσκευής",
+    "Show update if available": "Εμφάνιση ενημέρωσης εάν είναι διαθέσιμη",
+    "Also check beta release": "Ελέγξτε επίσης την έκδοση beta",
+    "Using a Reverse Proxy?": "Χρησιμοποιείτε reverse proxy;",
+    "Check how to config it for WebSocket": "Ελέγξτε πώς να το ρυθμίσετε για το WebSocket",
+    "Steam Game Server": "Διακομιστής παιχνιδιών Steam",
+    "Most likely causes:": "Πιο πιθανές αιτίες:",
+    "The resource is no longer available.": "Ο πόρος δεν είναι πλέον διαθέσιμος.",
+    "There might be a typing error in the address.": "Μπορεί να υπάρχει σφάλμα πληκτρολόγησης στη διεύθυνση.",
+    "What you can try:": "Τι μπορείτε να δοκιμάσετε:",
+    "Retype the address.": "Πληκτρολογήστε ξανά τη διεύθυνση.",
+    "Go back to the previous page.": "Επιστρέψτε στην προηγούμενη σελίδα.",
+    "Coming Soon": "Ερχεται σύντομα",
+    "wayToGetClickSendSMSToken": "Μπορείτε να πάρετε το API Username και API Key απο {0} .",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "Λήξη πιστοποιητικού TLS",
+    "certificationExpiryDescription": "Οι παρακολουθήσεις HTTPS ενεργοποιούν ειδοποίηση όταν λήξει το πιστοποιητικό TLS σε:",
+    "Setup Docker Host": "Ρύθμιση Docker Host",
+    "Connection Type": "Τύπος σύνδεσης",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον κεντρικό υπολογιστή βάσης για όλες τις παρακολουθήσεις;",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Βρίσκεστε σε λειτουργία No Auth, δεν απαιτείται κωδικός πρόσβασης.",
+    "trustProxyDescription": "Εμπιστευτείτε τις κεφαλίδες 'X-Forwarded-*'. Εάν θέλετε να λάβετε τη σωστή IP πελάτη και το Uptime Kuma σας βρίσκεται πίσω το Nginx ή το Apache, θα πρέπει να το ενεργοποιήσετε.",
+    "wayToGetLineNotifyToken": "Μπορείτε να λάβετε ένα access token από το {0}",
+    "Examples": "Παραδείγματα",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token μπορεί να δημιουργηθεί κάνοντας κλικ στο όνομα του προφίλ σας (κάτω αριστερά) και κάνοντας κύλιση προς τα κάτω και, στη συνέχεια, κάντε κλικ στο Create Token. ",
+    "Notification Service": "Υπηρεσία ειδοποιήσεων",
+    "default: notify all devices": "προεπιλογή: ειδοποίηση όλων των συσκευών",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Μπορείτε να βρείτε μια λίστα με τις Υπηρεσίες ειδοποιήσεων στον Home assistant στην περιοχή \"Developer Tools > Services\" αναζήτηση για \"notification\" για να βρείτε το όνομα της συσκευής/τηλεφώνου σας.",
+    "Automations can optionally be triggered in Home Assistant:": "Οι αυτοματισμοί μπορούν προαιρετικά να ενεργοποιηθούν στο Home Assistant:",
+    "Trigger type:": "Τύπος ενεργοποίησης:",
+    "Event type:": "Τύπος συμβάντος:",
+    "Event data:": "Δεδομένα συμβάντος:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Στη συνέχεια, επιλέξτε μια ενέργεια, για παράδειγμα αλλάξτε τη σκηνή στο σημείο όπου ένα φως RGB είναι κόκκινο.",
+    "Frontend Version": "Έκδοση Frontend",
+    "Frontend Version do not match backend version!": "Η Frontend έκδοση δεν ταιριάζει με την έκδοση backend!",
+    "Base URL": "Βασική διεύθυνση URL",
+    "goAlertInfo": "Το GoAlert είναι μια εφαρμογή ανοιχτού κώδικα για προγραμματισμό κλήσεων, αυτοματοποιημένες κλιμακώσεις και ειδοποιήσεις (όπως SMS ή φωνητικές κλήσεις). Αλληλεπιδράστε αυτόματα με το σωστό άτομο, με τον σωστό τρόπο και τη σωστή στιγμή! {0}",
+    "goAlertIntegrationKeyInfo": "Λάβετε το generic API integration key για την υπηρεσία σε αυτήν τη μορφή \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" συνήθως την τιμή της παραμέτρου διακριτικού της αντιγραμμένης διεύθυνσης URL.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται πολη, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
+    "backupRecommend": "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του volume ή του φακέλου δεδομένων (./data/) απευθείας."
+}
diff --git a/src/lang/en.json b/src/lang/en.json
new file mode 100644
index 00000000..897b28f5
--- /dev/null
+++ b/src/lang/en.json
@@ -0,0 +1,678 @@
+{
+    "languageName": "English",
+    "checkEverySecond": "Check every {0} seconds",
+    "retryCheckEverySecond": "Retry every {0} seconds",
+    "resendEveryXTimes": "Resend every {0} times",
+    "resendDisabled": "Resend disabled",
+    "retriesDescription": "Maximum retries before the service is marked as down and a notification is sent",
+    "ignoreTLSError": "Ignore TLS/SSL error for HTTPS websites",
+    "upsideDownModeDescription": "Flip the status upside down. If the service is reachable, it is DOWN.",
+    "maxRedirectDescription": "Maximum number of redirects to follow. Set to 0 to disable redirects.",
+    "enableGRPCTls": "Allow to send gRPC request with TLS connection",
+    "grpcMethodDescription": "Method name is convert to cammelCase format such as sayHello, check, etc.",
+    "acceptedStatusCodesDescription": "Select status codes which are considered as a successful response.",
+    "Maintenance": "Maintenance",
+    "statusMaintenance": "Maintenance",
+    "Schedule maintenance": "Schedule maintenance",
+    "Affected Monitors": "Affected Monitors",
+    "Pick Affected Monitors...": "Pick Affected Monitors...",
+    "Start of maintenance": "Start of maintenance",
+    "All Status Pages": "All Status Pages",
+    "Select status pages...": "Select status pages...",
+    "recurringIntervalMessage": "Run once every day | Run once every {0} days",
+    "affectedMonitorsDescription": "Select monitors that are affected by current maintenance",
+    "affectedStatusPages": "Show this maintenance message on selected status pages",
+    "atLeastOneMonitor": "Select at least one affected monitor",
+    "passwordNotMatchMsg": "The repeat password does not match.",
+    "notificationDescription": "Notifications must be assigned to a monitor to function.",
+    "keywordDescription": "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
+    "pauseDashboardHome": "Pause",
+    "deleteMonitorMsg": "Are you sure want to delete this monitor?",
+    "deleteMaintenanceMsg": "Are you sure want to delete this maintenance?",
+    "deleteNotificationMsg": "Are you sure want to delete this notification for all monitors?",
+    "dnsPortDescription": "DNS server port. Defaults to 53. You can change the port at any time.",
+    "resolverserverDescription": "Cloudflare is the default server. You can change the resolver server anytime.",
+    "rrtypeDescription": "Select the RR type you want to monitor",
+    "pauseMonitorMsg": "Are you sure want to pause?",
+    "enableDefaultNotificationDescription": "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
+    "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
+    "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
+    "confirmClearStatisticsMsg": "Are you sure you want to delete ALL statistics?",
+    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
+    "confirmImportMsg": "Are you sure you want to import the backup? Please verify you've selected the correct import option.",
+    "twoFAVerifyLabel": "Please enter your token to verify 2FA:",
+    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
+    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
+    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "Settings": "Settings",
+    "Dashboard": "Dashboard",
+    "New Update": "New Update",
+    "Language": "Language",
+    "Appearance": "Appearance",
+    "Theme": "Theme",
+    "General": "General",
+    "Primary Base URL": "Primary Base URL",
+    "Version": "Version",
+    "Check Update On GitHub": "Check Update On GitHub",
+    "List": "List",
+    "Add": "Add",
+    "Add New Monitor": "Add New Monitor",
+    "Quick Stats": "Quick Stats",
+    "Up": "Up",
+    "Down": "Down",
+    "Pending": "Pending",
+    "Unknown": "Unknown",
+    "Pause": "Pause",
+    "Name": "Name",
+    "Status": "Status",
+    "DateTime": "DateTime",
+    "Message": "Message",
+    "No important events": "No important events",
+    "Resume": "Resume",
+    "Edit": "Edit",
+    "Delete": "Delete",
+    "Current": "Current",
+    "Uptime": "Uptime",
+    "Cert Exp.": "Cert Exp.",
+    "day": "day | days",
+    "-day": "-day",
+    "hour": "hour",
+    "-hour": "-hour",
+    "Response": "Response",
+    "Ping": "Ping",
+    "Monitor Type": "Monitor Type",
+    "Keyword": "Keyword",
+    "Friendly Name": "Friendly Name",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Heartbeat Interval",
+    "Retries": "Retries",
+    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+    "Resend Notification if Down X times consequently": "Resend Notification if Down X times consequently",
+    "Advanced": "Advanced",
+    "Upside Down Mode": "Upside Down Mode",
+    "Max. Redirects": "Max. Redirects",
+    "Accepted Status Codes": "Accepted Status Codes",
+    "Push URL": "Push URL",
+    "needPushEvery": "You should call this URL every {0} seconds.",
+    "pushOptionalParams": "Optional parameters: {0}",
+    "Save": "Save",
+    "Notifications": "Notifications",
+    "Not available, please setup.": "Not available, please setup.",
+    "Setup Notification": "Setup Notification",
+    "Light": "Light",
+    "Dark": "Dark",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+    "Normal": "Normal",
+    "Bottom": "Bottom",
+    "None": "None",
+    "Timezone": "Timezone",
+    "Search Engine Visibility": "Search Engine Visibility",
+    "Allow indexing": "Allow indexing",
+    "Discourage search engines from indexing site": "Discourage search engines from indexing site",
+    "Change Password": "Change Password",
+    "Current Password": "Current Password",
+    "New Password": "New Password",
+    "Repeat New Password": "Repeat New Password",
+    "Update Password": "Update Password",
+    "Disable Auth": "Disable Auth",
+    "Enable Auth": "Enable Auth",
+    "disableauth.message1": "Are you sure want to <strong>disable authentication</strong>?",
+    "disableauth.message2": "It is designed for scenarios <strong>where you intend to implement third-party authentication</strong> in front of Uptime Kuma such as Cloudflare Access, Authelia or other authentication mechanisms.",
+    "Please use this option carefully!": "Please use this option carefully!",
+    "Logout": "Logout",
+    "Leave": "Leave",
+    "I understand, please disable": "I understand, please disable",
+    "Confirm": "Confirm",
+    "Yes": "Yes",
+    "No": "No",
+    "Username": "Username",
+    "Password": "Password",
+    "Remember me": "Remember me",
+    "Login": "Login",
+    "No Monitors, please": "No Monitors, please",
+    "add one": "add one",
+    "Notification Type": "Notification Type",
+    "Email": "Email",
+    "Test": "Test",
+    "Certificate Info": "Certificate Info",
+    "Resolver Server": "Resolver Server",
+    "Resource Record Type": "Resource Record Type",
+    "Last Result": "Last Result",
+    "Create your admin account": "Create your admin account",
+    "Repeat Password": "Repeat Password",
+    "Import Backup": "Import Backup",
+    "Export Backup": "Export Backup",
+    "Export": "Export",
+    "Import": "Import",
+    "respTime": "Resp. Time (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Default enabled",
+    "Apply on all existing monitors": "Apply on all existing monitors",
+    "Create": "Create",
+    "Clear Data": "Clear Data",
+    "Events": "Events",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Auto Get",
+    "backupDescription": "You can backup all monitors and notifications into a JSON file.",
+    "backupDescription2": "Note: history and event data is not included.",
+    "backupDescription3": "Sensitive data such as notification tokens are included in the export file; please store export securely.",
+    "alertNoFile": "Please select a file to import.",
+    "alertWrongFileType": "Please select a JSON file.",
+    "Clear all statistics": "Clear all Statistics",
+    "Skip existing": "Skip existing",
+    "Overwrite": "Overwrite",
+    "Options": "Options",
+    "Keep both": "Keep both",
+    "Verify Token": "Verify Token",
+    "Setup 2FA": "Setup 2FA",
+    "Enable 2FA": "Enable 2FA",
+    "Disable 2FA": "Disable 2FA",
+    "2FA Settings": "2FA Settings",
+    "Two Factor Authentication": "Two Factor Authentication",
+    "Active": "Active",
+    "Inactive": "Inactive",
+    "Token": "Token",
+    "Show URI": "Show URI",
+    "Tags": "Tags",
+    "Add New below or Select...": "Add New below or Select...",
+    "Tag with this name already exist.": "Tag with this name already exists.",
+    "Tag with this value already exist.": "Tag with this value already exists.",
+    "color": "color",
+    "value (optional)": "value (optional)",
+    "Gray": "Gray",
+    "Red": "Red",
+    "Orange": "Orange",
+    "Green": "Green",
+    "Blue": "Blue",
+    "Indigo": "Indigo",
+    "Purple": "Purple",
+    "Pink": "Pink",
+    "Search...": "Search...",
+    "Avg. Ping": "Avg. Ping",
+    "Avg. Response": "Avg. Response",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Nothing here, please add a group or a monitor.",
+    "No Services": "No Services",
+    "All Systems Operational": "All Systems Operational",
+    "Partially Degraded Service": "Partially Degraded Service",
+    "Degraded Service": "Degraded Service",
+    "Add Group": "Add Group",
+    "Add a monitor": "Add a monitor",
+    "Edit Status Page": "Edit Status Page",
+    "Go to Dashboard": "Go to Dashboard",
+    "Status Page": "Status Page",
+    "Status Pages": "Status Pages",
+    "defaultNotificationName": "My {notification} Alert ({number})",
+    "here": "here",
+    "Required": "Required",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "You can get a token from {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
+    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+    "chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} is good for any modern HTTP servers such as Express.js",
+    "webhookFormDataDesc": "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "Additional Headers",
+    "webhookAdditionalHeadersDesc": "Sets additional headers sent with the webhook.",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignore TLS Error",
+    "From Email": "From Email",
+    "emailCustomSubject": "Custom Subject",
+    "To Email": "To Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "Bot Display Name",
+    "Prefix Custom Message": "Prefix Custom Message",
+    "Hello @everyone is...": "Hello {'@'}everyone is...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
+    "wayToGetZohoCliqURL": "You can learn how to create a webhook URL {0}.",
+    "signal": "Signal",
+    "Number": "Number",
+    "Recipients": "Recipients",
+    "needSignalAPI": "You need to have a signal client with REST API.",
+    "wayToCheckSignalURL": "You can check this URL to view how to set one up:",
+    "signalImportant": "IMPORTANT: You cannot mix groups and numbers in recipients!",
+    "gotify": "Gotify",
+    "Application Token": "Application Token",
+    "Server URL": "Server URL",
+    "Priority": "Priority",
+    "slack": "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Channel Name",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "More info about Webhooks on: {0}",
+    "aboutChannelName": "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
+    "aboutKumaURL": "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "pushbullet": "Pushbullet",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Create application and get your bot token at {0}",
+    "wayToGetKookGuildID": "Switch on 'Developer Mode' in Kook setting, and right click the guild to get its ID",
+    "Guild ID": "Guild ID",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "User Key",
+    "Device": "Device",
+    "Message Title": "Message Title",
+    "Notification Sound": "Notification Sound",
+    "More info on:": "More info on: {0}",
+    "pushoverDesc1": "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
+    "pushoverDesc2": "If you want to send notifications to different devices, fill out Device field.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Fast - recommended for alerting)",
+    "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
+    "checkPrice": "Check {0} prices:",
+    "apiCredentials": "API credentials",
+    "octopushLegacyHint": "Do you use the legacy version of Octopush (2011-2020) or the new version?",
+    "Check octopush prices": "Check octopush prices {0}.",
+    "octopushPhoneNumber": "Phone number (intl format, eg : +33612345678) ",
+    "octopushSMSSender": "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Example: {0}",
+    "Read more:": "Read more: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Read more",
+    "appriseInstalled": "Apprise is installed.",
+    "appriseNotInstalled": "Apprise is not installed. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Basic Settings",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
+    "aboutMattermostChannelName": "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
+    "promosmsTypeFlash": "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
+    "promosmsTypeFull": "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
+    "promosmsTypeSpeed": "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
+    "promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes)",
+    "promosmsSMSSender": "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (with http(s):// and optionally port)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "The request headers are not valid JSON: ",
+    "BodyInvalidFormat": "The request body is not valid JSON: ",
+    "Monitor History": "Monitor History",
+    "clearDataOlderThan": "Keep monitor history data for {0} days.",
+    "PasswordsDoNotMatch": "Passwords do not match.",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
+    "Current User": "Current User",
+    "topic": "Topic",
+    "topicExplanation": "MQTT topic to monitor",
+    "successMessage": "Success Message",
+    "successMessageExplanation": "MQTT message that will be considered as success",
+    "recent": "Recent",
+    "Done": "Done",
+    "Info": "Info",
+    "Security": "Security",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Shrink Database",
+    "Pick a RR-Type...": "Pick a RR-Type...",
+    "Pick Accepted Status Codes...": "Pick Accepted Status Codes...",
+    "Default": "Default",
+    "HTTP Options": "HTTP Options",
+    "Create Incident": "Create Incident",
+    "Title": "Title",
+    "Content": "Content",
+    "Style": "Style",
+    "info": "info",
+    "warning": "warning",
+    "danger": "danger",
+    "error": "error",
+    "critical": "critical",
+    "primary": "primary",
+    "light": "light",
+    "dark": "dark",
+    "Post": "Post",
+    "Please input title and content": "Please input title and content",
+    "Created": "Created",
+    "Last Updated": "Last Updated",
+    "Unpin": "Unpin",
+    "Switch to Light Theme": "Switch to Light Theme",
+    "Switch to Dark Theme": "Switch to Dark Theme",
+    "Show Tags": "Show Tags",
+    "Hide Tags": "Hide Tags",
+    "Description": "Description",
+    "No monitors available.": "No monitors available.",
+    "Add one": "Add one",
+    "No Monitors": "No Monitors",
+    "Untitled Group": "Untitled Group",
+    "Services": "Services",
+    "Discard": "Discard",
+    "Cancel": "Cancel",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Password",
+    "serwersmsPhoneNumber": "Phone number",
+    "serwersmsSenderName": "SMS Sender Name (registered via customer portal)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Phone number(s)",
+    "smseagleGroup": "Phonebook group name(s)",
+    "smseagleContact": "Phonebook contact name(s)",
+    "smseagleRecipientType": "Recipient type",
+    "smseagleRecipient": "Recipient(s) (multiple must be separated with comma)",
+    "smseagleToken": "API Access token",
+    "smseagleUrl": "Your SMSEagle device URL",
+    "smseagleEncoding": "Send as Unicode",
+    "smseaglePriority": "Message priority (0-9, default = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "Customize",
+    "Custom Footer": "Custom Footer",
+    "Custom CSS": "Custom CSS",
+    "smtpDkimSettings": "DKIM Settings",
+    "smtpDkimDesc": "Please refer to the Nodemailer DKIM {0} for usage.",
+    "documentation": "documentation",
+    "smtpDkimDomain": "Domain Name",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "Hash Algorithm (Optional)",
+    "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
+    "smtpDkimskipFields": "Header Keys not to sign (Optional)",
+    "wayToGetPagerDutyKey": "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
+    "do nothing": "do nothing",
+    "auto acknowledged": "auto acknowledged",
+    "auto resolve": "auto resolve",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Alert State",
+    "alertaRecoverState": "Recover State",
+    "deleteStatusPageMsg": "Are you sure want to delete this status page?",
+    "Proxies": "Proxies",
+    "default": "Default",
+    "enabled": "Enabled",
+    "setAsDefault": "Set As Default",
+    "deleteProxyMsg": "Are you sure want to delete this proxy for all monitors?",
+    "proxyDescription": "Proxies must be assigned to a monitor to function.",
+    "enableProxyDescription": "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
+    "setAsDefaultProxyDescription": "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
+    "Certificate Chain": "Certificate Chain",
+    "Valid": "Valid",
+    "Invalid": "Invalid",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "For safety, must use secret key",
+    "Device Token": "Device Token",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Retry",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Setup Proxy",
+    "Proxy Protocol": "Proxy Protocol",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server has authentication",
+    "User": "User",
+    "Installed": "Installed",
+    "Not installed": "Not installed",
+    "Running": "Running",
+    "Not running": "Not running",
+    "Remove Token": "Remove Token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Add New Status Page",
+    "Slug": "Slug",
+    "Accept characters:": "Accept characters:",
+    "startOrEndWithOnly": "Start or end with {0} only",
+    "No consecutive dashes": "No consecutive dashes",
+    "Next": "Next",
+    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "No Proxy": "No Proxy",
+    "Authentication": "Authentication",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "New Status Page",
+    "Page Not Found": "Page Not Found",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Backup",
+    "About": "About",
+    "wayToGetCloudflaredURL": "(Download cloudflared from {0})",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Message:",
+    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Trust Proxy",
+    "Other Software": "Other Software",
+    "For example: nginx, Apache and Traefik.": "For example: nginx, Apache and Traefik.",
+    "Please read": "Please read",
+    "Subject:": "Subject:",
+    "Valid To:": "Valid To:",
+    "Days Remaining:": "Days Remaining:",
+    "Issuer:": "Issuer:",
+    "Fingerprint:": "Fingerprint:",
+    "No status pages": "No status pages",
+    "Domain Name Expiry Notification": "Domain Name Expiry Notification",
+    "Proxy": "Proxy",
+    "Date Created": "Date Created",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Address",
+    "onebotMessageType": "OneBot Message Type",
+    "onebotGroupMessage": "Group",
+    "onebotPrivateMessage": "Private",
+    "onebotUserOrGroupId": "Group/User ID",
+    "onebotSafetyTips": "For safety, must set access token",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Footer Text",
+    "Show Powered By": "Show Powered By",
+    "Domain Names": "Domain Names",
+    "signedInDisp": "Signed in as {0}",
+    "signedInDispDisabled": "Auth Disabled.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Shared Secret between client and server",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCalledStationIdDescription": "Identifier of the called device",
+    "RadiusCallingStationId": "Calling Station Id",
+    "RadiusCallingStationIdDescription": "Identifier of the calling device",
+    "Certificate Expiry Notification": "Certificate Expiry Notification",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "Recipient Number",
+    "From Name/Number": "From Name/Number",
+    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" from HTTP API credentials in control panel",
+    "octopushLogin": "\"Login\" from HTTP API credentials in control panel",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Device token",
+    "Show update if available": "Show update if available",
+    "Also check beta release": "Also check beta release",
+    "Using a Reverse Proxy?": "Using a Reverse Proxy?",
+    "Check how to config it for WebSocket": "Check how to config it for WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Most likely causes:",
+    "The resource is no longer available.": "The resource is no longer available.",
+    "There might be a typing error in the address.": "There might be a typing error in the address.",
+    "What you can try:": "What you can try:",
+    "Retype the address.": "Retype the address.",
+    "Go back to the previous page.": "Go back to the previous page.",
+    "Coming Soon": "Coming Soon",
+    "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "TLS Certificate Expiry",
+    "certificationExpiryDescription": "HTTPS Monitors trigger notification when TLS certificate expires in:",
+    "Setup Docker Host": "Setup Docker Host",
+    "Connection Type": "Connection Type",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Are you sure want to delete this docker host for all monitors?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "You are in No Auth mode, a password is not required.",
+    "trustProxyDescription": "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
+    "wayToGetLineNotifyToken": "You can get an access token from {0}",
+    "Examples": "Examples",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "default: notify all devices",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
+    "Automations can optionally be triggered in Home Assistant:": "Automations can optionally be triggered in Home Assistant:",
+    "Trigger type:": "Trigger type:",
+    "Event type:": "Event type:",
+    "Event data:": "Event data:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
+    "Frontend Version": "Frontend Version",
+    "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
+    "Base URL": "Base URL",
+    "goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
+    "goAlertIntegrationKeyInfo": "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
+    "backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.",
+    "Optional": "Optional",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Docs ",
+    "Gateway Type": "Gateway Type",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "You can divide numbers with",
+    "or": "or",
+    "recurringInterval": "Interval",
+    "Recurring": "Recurring",
+    "strategyManual": "Active/Inactive Manually",
+    "warningTimezone": "It is using the server's timezone",
+    "weekdayShortMon": "Mon",
+    "weekdayShortTue": "Tue",
+    "weekdayShortWed": "Wed",
+    "weekdayShortThu": "Thu",
+    "weekdayShortFri": "Fri",
+    "weekdayShortSat": "Sat",
+    "weekdayShortSun": "Sun",
+    "dayOfWeek": "Day of Week",
+    "dayOfMonth": "Day of Month",
+    "lastDay": "Last Day",
+    "lastDay1": "Last Day of Month",
+    "lastDay2": "2nd Last Day of Month",
+    "lastDay3": "3rd Last Day of Month",
+    "lastDay4": "4th Last Day of Month",
+    "No Maintenance": "No Maintenance",
+    "pauseMaintenanceMsg": "Are you sure want to pause?",
+    "maintenanceStatus-under-maintenance": "Under Maintenance",
+    "maintenanceStatus-inactive": "Inactive",
+    "maintenanceStatus-scheduled": "Scheduled",
+    "maintenanceStatus-ended": "Ended",
+    "maintenanceStatus-unknown": "Unknown",
+    "Display Timezone": "Display Timezone",
+    "Server Timezone": "Server Timezone",
+    "statusPageMaintenanceEndDate": "End",
+    "IconUrl": "Icon URL",
+    "Enable DNS Cache": "Enable DNS Cache",
+    "Enable": "Enable",
+    "Disable": "Disable",
+    "dnsCacheDescription": "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
+    "Single Maintenance Window": "Single Maintenance Window",
+    "Maintenance Time Window of a Day": "Maintenance Time Window of a Day",
+    "Effective Date Range": "Effective Date Range",
+    "Schedule Maintenance": "Schedule Maintenance",
+    "Date and Time": "Date and Time",
+    "DateTime Range": "DateTime Range",
+    "Strategy": "Strategy",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "Enable TLS",
+    "Proto Service Name": "Proto Service Name",
+    "Proto Method": "Proto Method",
+    "Proto Content": "Proto Content",
+    "Economy": "Economy",
+    "Lowcost": "Lowcost",
+    "high": "high",
+    "General Monitor Type": "General Monitor Type",
+    "Passive Monitor Type": "Passive Monitor Type",
+    "Specific Monitor Type": "Specific Monitor Type"
+}
diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
new file mode 100644
index 00000000..9a40ee8b
--- /dev/null
+++ b/src/lang/es-ES.json
@@ -0,0 +1,209 @@
+{
+    "languageName": "Español",
+    "checkEverySecond": "Comprobar cada {0} segundos.",
+    "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 asigna una notificación a el/los monitor(es) para hacerlos funcional(es).",
+    "keywordDescription": "Palabra clave en HTML plano o respuesta JSON, es sensible a mayúsculas",
+    "pauseDashboardHome": "Pausado",
+    "deleteMonitorMsg": "¿Seguro que quieres eliminar este monitor?",
+    "deleteNotificationMsg": "¿Seguro que quieres eliminar esta notificación para todos los monitores?",
+    "resolverserverDescription": "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": "Nueva 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": "Desconocido",
+    "Pause": "Pausar",
+    "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.",
+    "day": "día | días",
+    "-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": "Redirecciones máximas",
+    "Accepted Status Codes": "Códigos de estado aceptados",
+    "Save": "Guardar",
+    "Notifications": "Notificaciones",
+    "Not available, please setup.": "No disponible, por favor configúralo.",
+    "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",
+    "disableauth.message1": "Seguro que deseas <strong>deshabilitar la autenticación</strong>?",
+    "disableauth.message2": "Es para <strong>quien implementa autenticación de terceros</strong> ante Uptime Kuma como por ejemplo Cloudflare Access.",
+    "Please use this option carefully!": "Por favor usar con cuidado.",
+    "Logout": "Cerrar sesión",
+    "Leave": "Salir",
+    "I understand, please disable": "Entiendo, 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",
+    "Create": "Crear",
+    "clearEventsMsg": "¿Estás seguro de que deseas eliminar todos los eventos de este monitor?",
+    "clearHeartbeatsMsg": "¿Estás seguro de que deseas eliminar todos los latidos de este monitor?",
+    "confirmClearStatisticsMsg": "¿Estás seguro de que deseas eliminar TODAS las estadísticas?",
+    "Clear Data": "Borrar datos",
+    "Events": "Eventos",
+    "Heartbeats": "Latidos",
+    "Auto Get": "Obtener automáticamente",
+    "enableDefaultNotificationDescription": "Para cada nuevo monitor, esta notificación estará habilitada de forma predeterminada. Aún puedes deshabilitar la notificación por separado para cada monitor.",
+    "Default enabled": "Habilitado por defecto",
+    "Also apply to existing monitors": "También se aplica a monitores existentes",
+    "Export": "Exportar",
+    "Import": "Importar",
+    "backupDescription": "Puedes hacer una copia de seguridad de todos los monitores y todas las notificaciones en un archivo JSON.",
+    "backupDescription2": "PD: el historial y los datos de eventos no están incluidos.",
+    "backupDescription3": "Los datos confidenciales, como los tokens de notificación, se incluyen en el archivo de exportación. Guárdalo con cuidado.",
+    "alertNoFile": "Selecciona un archivo para importar.",
+    "alertWrongFileType": "Selecciona un archivo JSON.",
+    "twoFAVerifyLabel": "Ingresa tu token para verificar que 2FA está funcionando",
+    "tokenValidSettingsMsg": "¡El token es válido! Ahora puedes guardar la configuración de 2FA.",
+    "confirmEnableTwoFAMsg": "¿Estás seguro de que quieres habilitar 2FA?",
+    "confirmDisableTwoFAMsg": "¿Estás seguro de que quieres desactivar 2FA?",
+    "Apply on all existing monitors": "Aplicar en todos los monitores existentes",
+    "Verify Token": "Verificar token",
+    "Setup 2FA": "Configurar 2FA",
+    "Enable 2FA": "Habilitar 2FA",
+    "Disable 2FA": "Desactivar 2FA",
+    "2FA Settings": "Ajustes 2FA",
+    "Two Factor Authentication": "Autenticación de dos factores",
+    "Active": "Activo",
+    "Inactive": "Inactivo",
+    "Token": "Token",
+    "Show URI": "Mostrar URI",
+    "Clear all statistics": "Borrar todas las estadísticas",
+    "retryCheckEverySecond": "Reintentar cada {0} segundo.",
+    "importHandleDescription": "Elige 'Omitir existente' si deseas omitir todos los monitores o notificaciones con el mismo nombre. 'Sobrescribir' eliminará todos los monitores y notificaciones existentes.",
+    "confirmImportMsg": "¿Estás seguro de importar la copia de seguridad? Asegúrate de haber seleccionado la opción de importación correcta.",
+    "Heartbeat Retry Interval": "Intervalo de reintento de latido",
+    "Import Backup": "Importar copia de seguridad",
+    "Export Backup": "Exportar copia de seguridad",
+    "Skip existing": "Omitir existente",
+    "Overwrite": "Sobrescribir",
+    "Options": "Opciones",
+    "Keep both": "Manténer ambos",
+    "Tags": "Etiquetas",
+    "Add New below or Select...": "Agregar nuevo a continuación o seleccionar...",
+    "Tag with this name already exist.": "Una etiqueta con este nombre ya existe.",
+    "Tag with this value already exist.": "Una etiqueta con este valor ya existe.",
+    "color": "color",
+    "value (optional)": "valor (opcional)",
+    "Gray": "Gris",
+    "Red": "Rojo",
+    "Orange": "Naranja",
+    "Green": "Verde",
+    "Blue": "Azul",
+    "Indigo": "Índigo",
+    "Purple": "Morado",
+    "Pink": "Rosa",
+    "Search...": "Buscar...",
+    "Avg. Ping": "Ping promedio",
+    "Avg. Response": "Respuesta promedio",
+    "Entry Page": "Página de entrada",
+    "statusPageNothing": "No hay nada aquí, agrega un grupo o un monitor.",
+    "No Services": "Sin servicio",
+    "All Systems Operational": "Todos los sistemas están operativos",
+    "Partially Degraded Service": "Servicio parcialmente degradado",
+    "Degraded Service": "Servicio degradado",
+    "Add Group": "Agregar grupo",
+    "Add a monitor": "Agregar un monitor",
+    "Edit Status Page": "Editar página de estado",
+    "Go to Dashboard": "Ir al panel de control",
+    "Status Page": "Página de estado",
+    "Status Pages": "Páginas de estado",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Admite más de 50 servicios de notificación)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Monitor History": "Historial de monitor",
+    "clearDataOlderThan": "Mantener los datos del historial del monitor durante {0} días.",
+    "records": "registros",
+    "One record": "Un registro",
+    "steamApiKeyDescription": "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: "
+}
diff --git a/src/lang/et-EE.json b/src/lang/et-EE.json
new file mode 100644
index 00000000..f7a23a6c
--- /dev/null
+++ b/src/lang/et-EE.json
@@ -0,0 +1,209 @@
+{
+    "languageName": "eesti",
+    "retryCheckEverySecond": "Kontrolli {0} sekundilise vahega.",
+    "retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus.",
+    "ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel.",
+    "upsideDownModeDescription": "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.",
+    "maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi ",
+    "acceptedStatusCodesDescription": "Vali välja HTTP koodid, mida arvestada kõlblikuks.",
+    "passwordNotMatchMsg": "Salasõnad ei kattu.",
+    "notificationDescription": "Teavitusteenuse kasutamiseks seo see seirega.",
+    "keywordDescription": "Jälgi võtmesõna HTML või JSON vastustes. (tõstutundlik)",
+    "pauseDashboardHome": "Seisatud",
+    "deleteMonitorMsg": "Kas soovid eemaldada seire?",
+    "deleteNotificationMsg": "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?",
+    "resolverserverDescription": "Cloudflare on vaikimisi pöördserver.",
+    "rrtypeDescription": "Vali kirje tüüp, mida soovid jälgida.",
+    "pauseMonitorMsg": "Kas soovid peatada seire?",
+    "Settings": "Seaded",
+    "Status Page": "Ülevaade",
+    "Status Pages": "Ülevaated",
+    "Dashboard": "Töölaud",
+    "New Update": "Uuem tarkvara versioon on saadaval.",
+    "Language": "Keel",
+    "Appearance": "Välimus",
+    "Theme": "Teema",
+    "General": "Üldine",
+    "Version": "Versioon",
+    "Check Update On GitHub": "Otsi uuendusi GitHub'ist",
+    "List": "Nimekiri",
+    "Add": "Lisa",
+    "Add New Monitor": "Lisa seire",
+    "Add a monitor": "Lisa seire",
+    "Quick Stats": "Ülevaade",
+    "Up": "Töökorras",
+    "Down": "Rikkis",
+    "Pending": "Määramisel",
+    "Unknown": "Kahtlast",
+    "Pause": "Seiska",
+    "Name": "Nimi",
+    "Status": "Olek",
+    "DateTime": "Kuupäev",
+    "Message": "Tulemus",
+    "No important events": "Märkimisväärsed juhtumid puuduvad.",
+    "Resume": "Taasta",
+    "Edit": "Muuda",
+    "Delete": "Eemalda",
+    "Current": "Hetkeseisund",
+    "Uptime": "Eluiga",
+    "Cert Exp.": "Sert. aegumine",
+    "day": "päev | päeva",
+    "-day": "-päev",
+    "hour": "tund",
+    "-hour": "-tund",
+    "Response": "Reaktsiooniaeg",
+    "Ping": "Ping",
+    "Monitor Type": "Seire tüüp",
+    "Keyword": "Võtmesõna",
+    "Friendly Name": "Sõbralik nimi",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Tukse sagedus",
+    "Retries": "Korduskatsed",
+    "Advanced": "Rohkem",
+    "Upside Down Mode": "Tagurpidi seire",
+    "Max. Redirects": "Max. ümbersuunamine",
+    "Accepted Status Codes": "Kõlblikud HTTP koodid",
+    "Save": "Salvesta",
+    "Notifications": "Teavitused",
+    "Not available, please setup.": "Ühtegi teavitusteenust pole saadaval.",
+    "Setup Notification": "Lisa teavitusteenus",
+    "Light": "hele",
+    "Dark": "tume",
+    "Auto": "automaatne",
+    "Theme - Heartbeat Bar": "Teemasäte — tuksete riba",
+    "Normal": "tavaline",
+    "Bottom": "all",
+    "None": "puudub",
+    "Timezone": "Ajatsoon",
+    "Search Engine Visibility": "Otsimootorite ligipääs",
+    "Allow indexing": "Luba indekseerimine",
+    "Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt",
+    "Change Password": "Muuda parooli",
+    "Current Password": "praegune parool",
+    "New Password": "uus parool",
+    "Repeat New Password": "korda salasõna",
+    "Update Password": "Uuenda salasõna",
+    "Disable Auth": "Lülita autentimine välja",
+    "Enable Auth": "Lülita autentimine sisse",
+    "disableauth.message1": "Kas soovid <strong>lülitada autentimise välja</strong>?",
+    "disableauth.message2": "Kastuamiseks <strong>välise autentimispakkujaga</strong>, näiteks Cloudflare Access.",
+    "Please use this option carefully!": "Palun kasuta vastutustundlikult.",
+    "Logout": "Logi välja",
+    "Leave": "Lahku",
+    "I understand, please disable": "Olen tutvunud riskidega, lülita välja",
+    "Confirm": "Kinnita",
+    "Yes": "Jah",
+    "No": "Ei",
+    "Username": "kasutajanimi",
+    "Password": "parool",
+    "Remember me": "Mäleta mind",
+    "Login": "Logi sisse",
+    "No Monitors, please": "Seired puuduvad.",
+    "add one": "Lisa esimene",
+    "Notification Type": "Teavituse tüüp",
+    "Email": "e-posti aadress",
+    "Test": "Saada prooviteavitus",
+    "Certificate Info": "Sertifikaadi teave",
+    "Resolver Server": "Server, mis vastab DNS päringutele.",
+    "Resource Record Type": "DNS kirje tüüp",
+    "Last Result": "Viimane",
+    "Create your admin account": "Admininstraatori konto loomine",
+    "Repeat Password": "korda salasõna",
+    "respTime": "Reageerimisaeg (ms)",
+    "notAvailableShort": "N/A",
+    "enableDefaultNotificationDescription": "Kõik järgnevalt lisatud seired kasutavad seda teavitusteenuset. Seiretelt võib teavitusteenuse ühekaupa eemaldada.",
+    "clearEventsMsg": "Kas soovid seire kõik sündmused kustutada?",
+    "clearHeartbeatsMsg": "Kas soovid seire kõik tuksed kustutada?",
+    "confirmClearStatisticsMsg": "Kas soovid TERVE ajaloo kustutada?",
+    "Export": "Eksport",
+    "Import": "Import",
+    "Default enabled": "Kasuta vaikimisi",
+    "Apply on all existing monitors": "Kõik praegused seired hakkavad kasutama seda teavitusteenust",
+    "Create": "Loo konto",
+    "Clear Data": "Eemalda andmed",
+    "Events": "Sündmused",
+    "Heartbeats": "Tuksed",
+    "Auto Get": "Hangi automaatselt",
+    "backupDescription": "Varunda kõik seired ja teavitused JSON faili.",
+    "backupDescription2": "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.",
+    "backupDescription3": "Varukoopiad sisaldavad teavitusteenusete pääsuvõtmeid.",
+    "alertNoFile": "Palun lisa fail, mida importida.",
+    "alertWrongFileType": "Palun lisa JSON-formaadis fail.",
+    "twoFAVerifyLabel": "2FA kinnitamiseks sisesta pääsukood",
+    "tokenValidSettingsMsg": "Kood õige. Akna võib sulgeda.",
+    "confirmEnableTwoFAMsg": "Kas soovid 2FA sisse lülitada?",
+    "confirmDisableTwoFAMsg": "Kas soovid 2FA välja lülitada?",
+    "Verify Token": "Kontrolli",
+    "Setup 2FA": "Kaksikautentimise seadistamine",
+    "Enable 2FA": "Seadista 2FA",
+    "Disable 2FA": "Lülita 2FA välja",
+    "2FA Settings": "2FA seaded",
+    "Two Factor Authentication": "Kaksikautentimine",
+    "Active": "kasutusel",
+    "Inactive": "seadistamata",
+    "Token": "kaksikautentimise kood",
+    "Show URI": "Näita URId",
+    "Clear all statistics": "Tühjenda ajalugu",
+    "importHandleDescription": "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.",
+    "confirmImportMsg": "Käkerdistest hoidumiseks lae enne taastamist alla uus varukoopia. Kas soovid taastada üles laetud?",
+    "Heartbeat Retry Interval": "Korduskatsete intervall",
+    "Import Backup": "Varukoopia importimine",
+    "Export Backup": "Varukoopia eksportimine",
+    "Skip existing": "lisa praegustele",
+    "Overwrite": "asenda",
+    "Options": "Mestimisviis",
+    "Keep both": "kombineeri",
+    "Tags": "Sildid",
+    "Add New below or Select...": "Leia või lisa all uus…",
+    "Tag with this name already exist.": "Selle nimega silt on juba olemas.",
+    "Tag with this value already exist.": "Selle väärtusega silt on juba olemas.",
+    "color": "värvus",
+    "value (optional)": "väärtus (fakultatiivne)",
+    "Gray": "hall",
+    "Red": "punane",
+    "Orange": "oranž",
+    "Green": "roheline",
+    "Blue": "sinine",
+    "Indigo": "indigo",
+    "Purple": "lilla",
+    "Pink": "roosa",
+    "Search...": "Otsi…",
+    "Avg. Ping": "Keskmine ping",
+    "Avg. Response": "Keskmine reaktsiooniaeg",
+    "Entry Page": "Avaleht",
+    "statusPageNothing": "Kippu ega kõppu; siia saab lisada seireid või -gruppe.",
+    "No Services": "Teenused puuduvad.",
+    "All Systems Operational": "Kõik töökorras",
+    "Partially Degraded Service": "Teenuse töö osaliselt häiritud",
+    "Degraded Service": "Teenuse töö häiritud",
+    "Add Group": "Lisa grupp",
+    "Edit Status Page": "Muuda lehte",
+    "Go to Dashboard": "Töölauale",
+    "checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega.",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "elektronpost (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (vahendab üle 65 teavitusteenust)",
+    "pushbullet": "Pushbullet",
+    "line": "LINE",
+    "mattermost": "Mattermost",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API otsik",
+    "alertaEnvironment": "Keskkond",
+    "alertaApiKey": "API võti",
+    "alertaAlertState": "Häireseisund",
+    "alertaRecoverState": "Taasta algolek"
+}
diff --git a/src/lang/eu.json b/src/lang/eu.json
new file mode 100644
index 00000000..9d667a58
--- /dev/null
+++ b/src/lang/eu.json
@@ -0,0 +1,541 @@
+{
+    "languageName": "Euskara",
+    "checkEverySecond": "Egiaztatu {0} segunduro",
+    "retryCheckEverySecond": "Errepikatu {0} segunduro",
+    "retriesDescription": "Zerbitzua erorita markatu eta jakinarazpena bidali aurretik egindako saiakera kopuru maximoa",
+    "ignoreTLSError": "Ezikusiarena egin TLS/SSL erroreei HTTPS webguneetan",
+    "upsideDownModeDescription": "Alderantzizkatu erortze egoera. Zerbitzua martxan badago, ERORITA markatuko du.",
+    "maxRedirectDescription": "Jarraitu beharreko berbideratze kopuru maximoa. Jarri 0 berbideratzeak desgaitzeko.",
+    "acceptedStatusCodesDescription": "Hautatu erantzun ona kontsideratzen diren egoera kodeak.",
+    "passwordNotMatchMsg": "Errepikatutako pasahitza ez dator bat.",
+    "notificationDescription": "Jakinarazpenak monitorizazio funtzio bati asignatu behar zaizkio.",
+    "keywordDescription": "Bilatu gako-hitza HTML edo JSON erantzunean. Bilaketan maiuskulak kontuan hartzen dira.",
+    "pauseDashboardHome": "Gelditu",
+    "deleteMonitorMsg": "Ziur zaude monitorizazio hau ezabatu nahi duzula?",
+    "deleteNotificationMsg": "Ziur zaude jakinarazpen hau monitorizazio guztientzat ezabatu nahi duzula?",
+    "dnsPortDescription": "DNS zerbitzari portua. Defektuz 53. Nahi duzunean aldatu dezakezu portua.",
+    "resolverserverDescription": "Cloudflare zerbitzari lehenetsia da. Edozein unetan alda dezakezu ebazteko zerbitzaria.",
+    "rrtypeDescription": "Hautatu kontrolatu nahi duzun RR mota",
+    "enableDefaultNotificationDescription": "Jakinarazpen hau monitore berrientzat gaituko da defektuz. Baina monitorizazio bakoitzarentzat jakinarazpena desgaitu dezakezu.",
+    "pauseMonitorMsg": "Ziur zaude gelditu egin nahi duzula?",
+    "clearEventsMsg": "Ziur zaude monitorizazio honen gertaera guztiak ezabatu nahi dituzula?",
+    "clearHeartbeatsMsg": "Ziur zaude monitorizazio honen pultsu guztiak ezabatu nahi dituzula?",
+    "confirmClearStatisticsMsg": "Ziur zaude estatistika GUZTIAK ezabatu nahi dituzula?",
+    "importHandleDescription": "Aukeratu 'existitzen bada', izen bereko monitore edo jakinarazpen bakoitza saltatu nahi baduzu. Lehendik dauden kontrol eta jakinarazpen guztiak ezabatuko ditu 'Gainidatzi' aukerak.",
+    "confirmImportMsg": "Ziur zaude segurtasun-kopia inportatu nahi duzula? Egiaztatu inportatzeko aukera zuzena hautatu duzula.",
+    "twoFAVerifyLabel": "Sartu zure tokena 2FA egiaztatzeko:",
+    "tokenValidSettingsMsg": "Tokenak balio du! Orain 2FA konfigurazioa gorde dezakezu.",
+    "confirmEnableTwoFAMsg": "Ziur zaude 2FA gaitu nahi duzula?",
+    "confirmDisableTwoFAMsg": "Ziur zaude 2FA desgaitu nahi duzula?",
+    "Settings": "Ezarpenak",
+    "Dashboard": "Arbela",
+    "New Update": "Eguneraketa berria",
+    "Language": "Hizkuntza",
+    "Appearance": "Itxura",
+    "Theme": "Gaia",
+    "General": "Orokorra",
+    "Primary Base URL": "Oinarrizkoa URL",
+    "Version": "Bertsioa",
+    "Check Update On GitHub": "Egiaztatu eguneraketa GitHuben",
+    "List": "Zerrenda",
+    "Add": "Gehitu",
+    "Add New Monitor": "Gehitu monitorizazio berria",
+    "Quick Stats": "Estatistika azkarrak",
+    "Up": "Erabilgarri",
+    "Down": "Erorita",
+    "Pending": "Zain",
+    "Unknown": "Ezezaguna",
+    "Pause": "Gelditu",
+    "Name": "Izena",
+    "Status": "Egoera",
+    "DateTime": "Data eta ordua",
+    "Message": "Mezua",
+    "No important events": "Gertaera garrantzitsurik ez",
+    "Resume": "Jarraitu",
+    "Edit": "Editatu",
+    "Delete": "Ezabatu",
+    "Current": "Unekoa",
+    "Uptime": "Martxan",
+    "Cert Exp.": "Ziurtagiri iraun.",
+    "day": "egun | egun",
+    "-day": "-egun",
+    "hour": "ordua",
+    "-hour": "-ordu",
+    "Response": "Erantzuna",
+    "Ping": "Ping",
+    "Monitor Type": "Monitorizazio mota",
+    "Keyword": "Gakohitza",
+    "Friendly Name": "Izen xumea",
+    "URL": "URLa",
+    "Hostname": "Ostalari izena",
+    "Port": "Portua",
+    "Heartbeat Interval": "Pultsu interbaloak",
+    "Retries": "Errepikapenak",
+    "Heartbeat Retry Interval": "Pultsu errepikatze interbaloak",
+    "Advanced": "Aurreratua",
+    "Upside Down Mode": "Alderantzizkako modua",
+    "Max. Redirects": "Berbideratze max.",
+    "Accepted Status Codes": "Onartutako egoera kodeak",
+    "Push URL": "Push URLa",
+    "needPushEvery": "URL hau {0} segunduro deitu beharko zenuke.",
+    "pushOptionalParams": "Hautazko parametroak: {0}",
+    "Save": "Gorde",
+    "Notifications": "Jakinarazpenak",
+    "Not available, please setup.": "Ez dago eskuragarri, ezarri mesedez.",
+    "Setup Notification": "Ezarri jakinarazpenak",
+    "Light": "Argia",
+    "Dark": "Iluna",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Gaia - Pultsu barra",
+    "Normal": "Normala",
+    "Bottom": "Behean",
+    "None": "Bat ere ez",
+    "Timezone": "Timezone",
+    "Search Engine Visibility": "Bilatzaile ikurgarritasuna",
+    "Allow indexing": "Onartu indexatzea",
+    "Discourage search engines from indexing site": "Discourage search engines from indexing site",
+    "Change Password": "Aldatu pasahitza",
+    "Current Password": "Uneko pasahitza",
+    "New Password": "Pasahitz berria",
+    "Repeat New Password": "Errepikatu pasahitz berria",
+    "Update Password": "Eguneratu pasahitza",
+    "Disable Auth": "Desgaitu Auth",
+    "Enable Auth": "Gaitu Auth",
+    "disableauth.message1": "Ziur zaude <strong>autentifikazioa desgaitu</strong> nahi duzula?",
+    "disableauth.message2": "Egoera jakin batzuetarako diseinatuta dago, Uptime Kumaren <strong>aurrean hirugarrengo autentifikazio batzuek jartzeko</strong> (Cloudflare Access, Authelia edo beste autentifikazio-mekanismo batzuk).",
+    "Please use this option carefully!": "Mesedez, kontuz erabili aukera hau!",
+    "Logout": "Saioa amaitu",
+    "Leave": "Utzi",
+    "I understand, please disable": "Ulertzen dut, mesedez desgaitu",
+    "Confirm": "Baieztatu",
+    "Yes": "Bai",
+    "No": "Ez",
+    "Username": "Erabiltzailea",
+    "Password": "Pasahitza",
+    "Remember me": "Gogora nazazu",
+    "Login": "Saioa hasi",
+    "No Monitors, please": "Monitorizaziorik ez, mesedez",
+    "add one": "gehitu bat",
+    "Notification Type": "Jakinarazpen mota",
+    "Email": "Emaila",
+    "Test": "Testa",
+    "Certificate Info": "Ziurtagiri informazioa",
+    "Resolver Server": "Ebazpen-zerbitzaria",
+    "Resource Record Type": "Baliabideen erregistro mota",
+    "Last Result": "Azken emaitza",
+    "Create your admin account": "Sortu zure admin kontua",
+    "Repeat Password": "Errepikatu pasahitza",
+    "Import Backup": "segurtasun-kopia inportatu",
+    "Export Backup": "segurtasun-kopia esportatu",
+    "Export": "Esportatu",
+    "Import": "Inportatu",
+    "respTime": "Erantz. denbora (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Lehenetsia gaituta",
+    "Apply on all existing monitors": "Aplikatu existitzen diren monitorizazio guztietan",
+    "Create": "Sortu",
+    "Clear Data": "Garbitu datuak",
+    "Events": "Gertaerak",
+    "Heartbeats": "Pultsuak",
+    "Auto Get": "Auto Get",
+    "backupDescription": "Monitore eta jakinarazpen guztien segurtasun-kopiak egin ditzakezu JSON fitxategi batean.",
+    "backupDescription2": "Oharra: ez dira historia eta gertaeren datuak sartzen.",
+    "backupDescription3": "Datu sentikorrak, hala nola jakinarazpen tokenak, esportazio-fitxategian sartzen dira; mesedez, gorde esportazioa modu seguruan.",
+    "alertNoFile": "Mesedez hautatu inportatzeko fitxategia.",
+    "alertWrongFileType": "Mesedez hautatu JSON fitxategia.",
+    "Clear all statistics": "Garbitu estatistika guztiak",
+    "Skip existing": "Saltatu existitzen bada",
+    "Overwrite": "Gainidatzi",
+    "Options": "Aukerak",
+    "Keep both": "Biak mantendu",
+    "Verify Token": "Egiaztatu Tokena",
+    "Setup 2FA": "Ezarri 2FA",
+    "Enable 2FA": "Gaitu 2FA",
+    "Disable 2FA": "Desgaitu 2FA",
+    "2FA Settings": "2FA ezarpenak",
+    "Two Factor Authentication": "Bi aldetako autentifikazioa (2FA)",
+    "Active": "Aktibo",
+    "Inactive": "Inaktibo",
+    "Token": "Tokena",
+    "Show URI": "Erakutsi URIa",
+    "Tags": "Etiketak",
+    "Add New below or Select...": "Gehitu beste bat behean edo hautatu...",
+    "Tag with this name already exist.": "Izen hau duen etiketa dagoeneko badago.",
+    "Tag with this value already exist.": "Balio hau duen etiketa dagoeneko badago.",
+    "color": "kolorea",
+    "value (optional)": "balioa (hautazkoa)",
+    "Gray": "Grisa",
+    "Red": "Gorria",
+    "Orange": "Naranja",
+    "Green": "Berdea",
+    "Blue": "Urdina",
+    "Indigo": "Indigo",
+    "Purple": "Morea",
+    "Pink": "Arrosa",
+    "Search...": "Bilatu...",
+    "Avg. Ping": "Batazbesteko Pinga",
+    "Avg. Response": "Batazbesteko erantzuna",
+    "Entry Page": "Sarrera orria",
+    "statusPageNothing": "Ezer ere ez hemen, mesedez gehitu taldea edo monitorizazioa.",
+    "No Services": "Zerbitzurik ez",
+    "All Systems Operational": "Sistema guztiak martxan",
+    "Partially Degraded Service": "Zerbitzu partzialki degradatua",
+    "Degraded Service": "Zerbitzu degradatua",
+    "Add Group": "Gehitu taldea",
+    "Add a monitor": "Gehitu monitorizazioa",
+    "Edit Status Page": "Editatu egoera orria",
+    "Go to Dashboard": "Joan arbelera",
+    "Status Page": "Egoera orria",
+    "Status Pages": "Egoera orriak",
+    "defaultNotificationName": "Nire {notification} Alerta ({number})",
+    "here": "Hemen",
+    "Required": "Beharrezkoa",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Bot Tokena",
+    "wayToGetTelegramToken": "You can get a token from {0}.",
+    "Chat ID": "Txat IDa",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
+    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+    "chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
+    "webhook": "Webhook",
+    "Post URL": "Bidalketa URLa",
+    "Content Type": "Eduki mota",
+    "webhookJsonDesc": "{0} is good for any modern HTTP servers such as Express.js",
+    "webhookFormDataDesc": "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
+    "smtp": "Emaila (SMTP)",
+    "secureOptionNone": "Bat ere ez / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignore TLS Error",
+    "From Email": "Email honetatik",
+    "emailCustomSubject": "Pertsonalizatutako gaia",
+    "To Email": "Email honetara",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "Bot Display Name",
+    "Prefix Custom Message": "Prefix Custom Message",
+    "Hello @everyone is...": "Hello {'@'}everyone is...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
+    "wayToGetZohoCliqURL": "You can learn how to create a webhook URL {0}.",
+    "signal": "Signal",
+    "Number": "Zenbakia",
+    "Recipients": "Recipients",
+    "needSignalAPI": "You need to have a signal client with REST API.",
+    "wayToCheckSignalURL": "You can check this URL to view how to set one up:",
+    "signalImportant": "IMPORTANT: You cannot mix groups and numbers in recipients!",
+    "gotify": "Gotify",
+    "Application Token": "Aplikazio tokena",
+    "Server URL": "Zerbitzari URLa",
+    "Priority": "Lehentasuna",
+    "slack": "Slack",
+    "Icon Emoji": "Emoji ikonoa",
+    "Channel Name": "Kanalaren izena",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "More info about Webhooks on: {0}",
+    "aboutChannelName": "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
+    "aboutKumaURL": "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Erabiltzaile gakoa",
+    "Device": "Gailua",
+    "Message Title": "Mezuaren izenburua",
+    "Notification Sound": "Jakinarazpen soinua",
+    "More info on:": "More info on: {0}",
+    "pushoverDesc1": "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
+    "pushoverDesc2": "If you want to send notifications to different devices, fill out Device field.",
+    "SMS Type": "SMS mota",
+    "octopushTypePremium": "Premium (Fast - recommended for alerting)",
+    "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
+    "checkPrice": "Check {0} prices:",
+    "apiCredentials": "API credentials",
+    "octopushLegacyHint": "Do you use the legacy version of Octopush (2011-2020) or the new version?",
+    "Check octopush prices": "Check octopush prices {0}.",
+    "octopushPhoneNumber": "Phone number (intl format, eg : +33612345678) ",
+    "octopushSMSSender": "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Adibidez: {0}",
+    "Read more:": "Irakurri gehiago: {0}",
+    "Status:": "Egoera: {0}",
+    "Read more": "Irakurri gehiago",
+    "appriseInstalled": "Apprise instalatuta.",
+    "appriseNotInstalled": "Apprise ez dago instalatuta. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Oinarrizko ezarpenak",
+    "User ID": "Erabiltzaile ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
+    "Icon URL": "Ikono URL",
+    "aboutIconURL": "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
+    "aboutMattermostChannelName": "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
+    "promosmsTypeFlash": "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
+    "promosmsTypeFull": "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
+    "promosmsTypeSpeed": "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
+    "promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes)",
+    "promosmsSMSSender": "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Hasiera zerbitzari URL (with http(s):// and optionally port)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
+    "Method": "Metodoa",
+    "Body": "Gorputza",
+    "Headers": "Goiburuak",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "The request headers are not valid JSON: ",
+    "BodyInvalidFormat": "The request body is not valid JSON: ",
+    "Monitor History": "Monitorizazio Historia",
+    "clearDataOlderThan": "Keep monitor history data for {0} days.",
+    "PasswordsDoNotMatch": "Pasahitzak ez datoz bat.",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
+    "Current User": "Uneko erabiltzailea",
+    "topic": "Topic",
+    "topicExplanation": "MQTT topic to monitor",
+    "successMessage": "Arrakasta mezua",
+    "successMessageExplanation": "MQTT message that will be considered as success",
+    "recent": "Duela gutxikoa",
+    "Done": "Egina",
+    "Info": "Info",
+    "Security": "Segurtasuna",
+    "Steam API Key": "Steam API Giltza",
+    "Shrink Database": "Shrink Datubasea",
+    "Pick a RR-Type...": "Pick a RR-Type...",
+    "Pick Accepted Status Codes...": "Hautatu onartutako egoera kodeak...",
+    "Default": "Lehenetsia",
+    "HTTP Options": "HTTP Aukerak",
+    "Create Incident": "Sortu inzidentzia",
+    "Title": "Titulua",
+    "Content": "Edukia",
+    "Style": "Estiloa",
+    "info": "info",
+    "warning": "kontuz",
+    "danger": "arriskua",
+    "error": "errorea",
+    "critical": "kritikoa",
+    "primary": "oinarrizkoa",
+    "light": "argia",
+    "dark": "iluna",
+    "Post": "Post",
+    "Please input title and content": "Mesedez sartu titulua eta edukia",
+    "Created": "Sortuta",
+    "Last Updated": "Azken eguneratzea",
+    "Unpin": "Unpin",
+    "Switch to Light Theme": "Aldatu gai argira",
+    "Switch to Dark Theme": "Aldatu gai ilunera",
+    "Show Tags": "Erakutsi etiketak",
+    "Hide Tags": "Ezkutatu etiketak",
+    "Description": "Deskribapena",
+    "No monitors available.": "Monitorizaziorik eskuragarri ez.",
+    "Add one": "Gehitu bat",
+    "No Monitors": "Monitorizaziorik ez",
+    "Untitled Group": "Titulurik gabeko taldea",
+    "Services": "Zerbitzuak",
+    "Discard": "Baztertu",
+    "Cancel": "Ezeztatu",
+    "Powered by": "Honekin egina:",
+    "shrinkDatabaseDescription": "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API erabiltzailea (webapi_ aurre-hizkia barne)",
+    "serwersmsAPIPassword": "API pasahitza",
+    "serwersmsPhoneNumber": "Telefono zenbakia",
+    "serwersmsSenderName": "SMS bidaltzaile izena (registered via customer portal)",
+    "stackfield": "Stackfield",
+    "Customize": "Pertsonalizatu",
+    "Custom Footer": "Oin pertsonalizatua",
+    "Custom CSS": "CSS pertsonalizatua",
+    "smtpDkimSettings": "DKIM ezarpenak",
+    "smtpDkimDesc": "Please refer to the Nodemailer DKIM {0} for usage.",
+    "documentation": "dokumentazioa",
+    "smtpDkimDomain": "Domeinu izena",
+    "smtpDkimKeySelector": "Gako hautatzailea",
+    "smtpDkimPrivateKey": "Gako pribatua",
+    "smtpDkimHashAlgo": "Hash algoritmoa (hautazkoa)",
+    "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
+    "smtpDkimskipFields": "Header Keys not to sign (Optional)",
+    "wayToGetPagerDutyKey": "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integrazio URLa",
+    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
+    "do nothing": "ez egin ezer",
+    "auto acknowledged": "auto acknowledged",
+    "auto resolve": "auto resolve",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Ingurunea",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Alerta egoera",
+    "alertaRecoverState": "Berreskuratze egoera",
+    "deleteStatusPageMsg": "Ziur zaude egoera orri hau ezabatu nahi duzula?",
+    "Proxies": "Proxiak",
+    "default": "Lehenetsia",
+    "enabled": "Gaituta",
+    "setAsDefault": "Ezarri lehenetsitzat",
+    "deleteProxyMsg": "Are you sure want to delete this proxy for all monitors?",
+    "proxyDescription": "Proxies must be assigned to a monitor to function.",
+    "enableProxyDescription": "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
+    "setAsDefaultProxyDescription": "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
+    "Certificate Chain": "Certificate Chain",
+    "Valid": "Baliozkoa",
+    "Invalid": "Baliogabea",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "TelefonoZenbakiak",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms txantiloiak parametroak eduki behar ditu: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "For safety, must use secret key",
+    "Device Token": "Gailu tokena",
+    "Platform": "Plataforma",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Altua",
+    "Retry": "Errepikatu",
+    "Topic": "Gaia",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Ezarri Proxya",
+    "Proxy Protocol": "Proxy protokoloa",
+    "Proxy Server": "Proxy zerbitzaria",
+    "Proxy server has authentication": "Proxy zerbitzariak autentifikazioa dauka",
+    "User": "Erabiltzailea",
+    "Installed": "Instalatuta",
+    "Not installed": "Instalatu gabe",
+    "Running": "Martxan",
+    "Not running": "Ez martxan",
+    "Remove Token": "Ezabatu Tokena",
+    "Start": "Hasi",
+    "Stop": "Gelditu",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Gehitu egoera orri berria",
+    "Slug": "Sluga",
+    "Accept characters:": "Onartu karaktereak:",
+    "startOrEndWithOnly": "Start or end with {0} only",
+    "No consecutive dashes": "No consecutive dashes",
+    "Next": "Hurrengoa",
+    "The slug is already taken. Please choose another slug.": "Sluga dagoeneko hartuta dago. Mesedez beste bat hautatu.",
+    "No Proxy": "Proxyrik ez",
+    "Authentication": "Authentication",
+    "HTTP Basic Auth": "HTTP oinarrizko Auth",
+    "New Status Page": "Egoera orri berria",
+    "Page Not Found": "Orria ez da aurkitu",
+    "Reverse Proxy": "Alderantzizkako Proxya",
+    "Backup": "Backup",
+    "About": "Honi buruz",
+    "wayToGetCloudflaredURL": "(Download cloudflared from {0})",
+    "cloudflareWebsite": "Cloudflare webgunea",
+    "Message:": "Mezua:",
+    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
+    "Other Software": "Beste softwarea",
+    "For example: nginx, Apache and Traefik.": "Adibidez: nginx, Apache and Traefik.",
+    "Please read": "Mesedez irakurri",
+    "Subject:": "Gaia:",
+    "Valid To:": "Balio-epea:",
+    "Days Remaining:": "Egun faltan:",
+    "Issuer:": "Issuer:",
+    "Fingerprint:": "Hatzmarka:",
+    "No status pages": "Egoera orririk ez",
+    "Domain Name Expiry Notification": "Domeinu izen iraungitze jakinarazpena",
+    "Proxy": "Proxya",
+    "Date Created": "Data sortuta",
+    "onebotHttpAddress": "OneBot HTTP helbidea",
+    "onebotMessageType": "OneBot mezu mota",
+    "onebotGroupMessage": "Taldea",
+    "onebotPrivateMessage": "Pribatua",
+    "onebotUserOrGroupId": "Talde/Erabiltzaile IDa",
+    "onebotSafetyTips": "For safety, must set access token",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Oineko testua",
+    "Show Powered By": "Erakutsi Honekin egina:",
+    "Domain Names": "Domeinu izenak",
+    "signedInDisp": "Signed in as {0}",
+    "signedInDispDisabled": "Auth desgaituta.",
+    "Certificate Expiry Notification": "Zertifikatu iraungitze jakinarazpena",
+    "API Username": "API Erabiltzailea",
+    "API Key": "API Gakoa",
+    "Recipient Number": "Recipient Number",
+    "From Name/Number": "From Name/Number",
+    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" from HTTP API credentials in control panel",
+    "octopushLogin": "\"Login\" from HTTP API credentials in control panel",
+    "promosmsLogin": "API Saio haste izena",
+    "promosmsPassword": "API Pasahitza",
+    "pushoversounds pushover": "Pushover (defektuz)",
+    "pushoversounds bike": "Bizikleta",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Klasikoa",
+    "pushoversounds cosmic": "Kosmikoa",
+    "pushoversounds falling": "Erortzen",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magia",
+    "pushoversounds mechanical": "Mekanikoa",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Sirena",
+    "pushoversounds spacealarm": "Espazio Alarma",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Bibrazioa soilik",
+    "pushoversounds none": "Bat ere ez (isilik)",
+    "pushyAPIKey": "Secret API giltza",
+    "pushyToken": "Gailu tokena",
+    "Show update if available": "Erakutsi eguneratzea eskuragarri badago",
+    "Also check beta release": "Beta bertsioak ere egiaztatu",
+    "Using a Reverse Proxy?": "Proxy alderantzizkako zerbitzaria erabiltzen?",
+    "Check how to config it for WebSocket": "Check how to config it for WebSocket",
+    "Steam Game Server": "Steam joko zerbitzaria",
+    "Most likely causes:": "Arrazoi probableenak:",
+    "The resource is no longer available.": "Baliabidea ez dago erabilgarri.",
+    "There might be a typing error in the address.": "Idazketa-akats bat egon daiteke helbidean.",
+    "What you can try:": "Probatu dezakezuna:",
+    "Retype the address.": "Berridatzi helbidea.",
+    "Go back to the previous page.": "Itzuli aurreko orrialdera",
+    "Coming Soon": "Laster",
+    "wayToGetClickSendSMSToken": "API erabiltzailea and API giltza hemendik lortu ditzakezu: {0} .",
+    "Connection String": "Konexio katea",
+    "Query": "Kontsulta",
+    "settingsCertificateExpiry": "TLS irungitze zertifikatua",
+    "certificationExpiryDescription": "HTTPS Monitorizazio jakinarazpena martxan jarri TLS zertifikatua iraungitzeko hau falta denean:",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Domeinua",
+    "Workstation": "Lan gunea",
+    "disableCloudflaredNoAuthMsg": "Ez Auth moduan zaude, pasahitza ez da beharrezkoa."
+}
diff --git a/src/lang/fa.json b/src/lang/fa.json
new file mode 100644
index 00000000..fc099bc4
--- /dev/null
+++ b/src/lang/fa.json
@@ -0,0 +1,208 @@
+{
+    "languageName": "Farsi",
+    "checkEverySecond": "بررسی هر {0} ثانیه.",
+    "retryCheckEverySecond": "تکرار مجدد هر {0} ثانیه.",
+    "retriesDescription": "حداکثر تعداد تکرار پیش از علامت گذاری وب‌سایت بعنوان خارج از دسترس و ارسال اطلاع‌رسانی.",
+    "ignoreTLSError": "بی‌خیال ارور TLS/SSL برای سایت‌های HTTPS",
+    "upsideDownModeDescription": "نتیجه وضعیت را برعکس کن، مثلا اگر سرویس در دسترس بود فرض کن که سرویس پایین است!",
+    "maxRedirectDescription": "حداکثر تعداد ریدایرکتی که سرویس پشتیبانی کند. برای اینکه ری‌دایرکت‌ها پشتیبانی نشوند، عدد 0 را وارد کنید.",
+    "acceptedStatusCodesDescription": "لطفا HTTP Status Code هایی که میخواهید به عنوان پاسخ موفقیت آمیز در نظر گرفته شود را انتخاب کنید.",
+    "passwordNotMatchMsg": "تکرار رمز عبور مطابقت ندارد!",
+    "notificationDescription": "برای اینکه سرویس اطلاع‌رسانی کار کند، آنرا به یکی از مانیتور‌ها متصل کنید.",
+    "keywordDescription": "در نتیجه درخواست (اهمیتی ندارد پاسخ JSON است یا HTML) بدنبال این کلمه بگرد (حساس به کوچک/بزرگ بودن حروف).",
+    "pauseDashboardHome": "متوقف شده",
+    "deleteMonitorMsg": "آیا از حذف این مانیتور مطمئن هستید؟",
+    "deleteNotificationMsg": "آیا مطمئن هستید که میخواهید این سرویس اطلاع‌رسانی را برای تمامی مانیتورها حذف کنید؟",
+    "resolverserverDescription": "سرویس CloudFlare به عنوان سرور پیش‌فرض استفاده می‌شود، شما میتوانید آنرا به هر سرور دیگری بعدا تغییر دهید.",
+    "rrtypeDescription": "لطفا نوع Resource Record را انتخاب کنید.",
+    "pauseMonitorMsg": "آیا مطمئن هستید که میخواهید این مانیتور را متوقف کنید ؟",
+    "enableDefaultNotificationDescription": "برای هر مانیتور جدید، این سرویس اطلاع‌رسانی به صورت پیش‌فرض فعال خواهد شد. البته که شما میتوانید به صورت دستی آنرا برای هر مانیتور به صورت جداگانه غیر فعال کنید.",
+    "clearEventsMsg": "آیا از اینکه تمامی تاریخچه رویداد‌های این مانیتور حذف شود مطمئن هستید؟",
+    "clearHeartbeatsMsg": "آیا از اینکه تاریخچه تمامی Heartbeat های این مانیتور حذف شود مطمئن هستید؟ ",
+    "confirmClearStatisticsMsg": "آیا از حذف تمامی آمار و ارقام مطمئن هستید؟",
+    "importHandleDescription": " اگر که میخواهید بیخیال مانیتورها و یا سرویس‌های اطلاع‌رسانی که با نام مشابه از قبل موجود هستند شوید، گزینه 'بی‌خیال موارد ..' را انتخاب کنید. توجه کنید که گزینه 'بازنویسی' تمامی موارد موجود با نام مشابه را از بین خواهد برد.",
+    "confirmImportMsg": "آیا از بازگردانی بک آپ مطمئن هستید؟ لطفا از اینکه نوع بازگردانی درستی را انتخاب کرده‌اید اطمینان حاصل کنید!",
+    "twoFAVerifyLabel": "لطفا جهت اطمینان از عملکرد احراز هویت دو مرحله‌ای توکن خود را وارد کنید!",
+    "tokenValidSettingsMsg": "توکن شما معتبر است، هم اکنون میتوانید احراز هویت دو مرحله‌ای را فعال کنید!",
+    "confirmEnableTwoFAMsg": " آیا از فعال سازی احراز هویت دو مرحله‌ای مطمئن هستید؟",
+    "confirmDisableTwoFAMsg": "آیا از غیرفعال سازی احراز هویت دومرحله‌ای مطمئن هستید؟",
+    "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.": "تاریخ انقضای SSL",
+    "day": "روز",
+    "-day": "-روز",
+    "hour": "ساعت",
+    "-hour": "-ساعت",
+    "Response": "پاسخ",
+    "Ping": "Ping",
+    "Monitor Type": "نوع مانیتور",
+    "Keyword": "کلمه کلیدی",
+    "Friendly Name": "عنوان",
+    "URL": "آدرس (URL)",
+    "Hostname": "نام میزبان (Hostname)",
+    "Port": "پورت",
+    "Heartbeat Interval": "فاصله هر Heartbeat",
+    "Retries": "تلاش مجدد",
+    "Heartbeat Retry Interval": "فاصله تلاش مجدد برایHeartbeat",
+    "Advanced": "پیشرفته",
+    "Upside Down Mode": "حالت بر عکس",
+    "Max. Redirects": "حداکثر تعداد ری‌دایرکت",
+    "Accepted Status Codes": "وضعیت‌های (Status Code) های قابل قبول",
+    "Save": "ذخیره",
+    "Notifications": "اطلاع‌رسانی‌ها",
+    "Not available, please setup.": "هیچ موردی موجود نیست، اولین مورد را راه اندازی کنید!",
+    "Setup Notification": "راه اندازی اطلاع‌رسانی‌",
+    "Light": "روشن",
+    "Dark": "تاریک",
+    "Auto": "اتوماتیک",
+    "Theme - Heartbeat Bar": "ظاهر نوار Heartbeat",
+    "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": "فعال سازی تایید هویت",
+    "disableauth.message1": "آیا مطمئن هستید که میخواهید <strong>احراز هویت را غیر فعال کنید</strong>?",
+    "disableauth.message2": "این ویژگی برای کسانی است که <strong> لایه امنیتی شخص ثالث دیگر بر روی این آدرس فعال کرده‌اند</strong>، مانند Cloudflare Access.",
+    "Please use this option carefully!": "لطفا از این امکان با دقت استفاده کنید.",
+    "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": "نوع رکورد (Resource Record Type)",
+    "Last Result": "آخرین نتیجه",
+    "Create your admin account": "ایجاد حساب کاربری مدیر",
+    "Repeat Password": "تکرار رمز عبور",
+    "Import Backup": "بازگردانی فایل پشتیبان",
+    "Export Backup": "ذخیره فایل پشتیبان",
+    "Export": "استخراج اطلاعات",
+    "Import": "ورود اطلاعات",
+    "respTime": "زمان پاسخگویی (میلی‌ثانیه)",
+    "notAvailableShort": "ناموجود",
+    "Default enabled": "به صورت پیش‌فرض فعال باشد.",
+    "Apply on all existing monitors": "بر روی تمامی مانیتور‌های فعلی اعمال شود.",
+    "Create": "ایجاد",
+    "Clear Data": "پاکسازی داده‌ها",
+    "Events": "رخداد‌ها",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Auto Get",
+    "backupDescription": "شما میتوانید تمامی مانیتورها و تنظیمات اطلاع‌رسانی‌ها را در قالب یه فایل JSON دریافت کنید.",
+    "backupDescription2": "البته تاریخچه رخدادها دراین فایل قرار نخواهند داشت.",
+    "backupDescription3": "توجه داشته باشید که تمامی اطلاعات حساس شما مانند توکن‌ها نیز در این فایل وجود خواهد داشت ، پس از این فایل به خوبی مراقبت کنید.",
+    "alertNoFile": "لطفا یک فایل برای «ورود اطلاعات» انتخاب کنید..",
+    "alertWrongFileType": "یک فایل JSON انتخاب کنید.",
+    "Clear all statistics": "پاکسازی تمامی آمار و ارقام",
+    "Skip existing": "بی‌خیال مواردی که از قبل موجود است",
+    "Overwrite": "بازنویسی",
+    "Options": "تنظیمات",
+    "Keep both": "هر دو را نگه‌ دار",
+    "Verify Token": "تایید توکن",
+    "Setup 2FA": "تنظیمات احراز دو مرحله‌ای",
+    "Enable 2FA": "فعال سازی احراز 2 مرحله‌ای",
+    "Disable 2FA": "غیر فعال کردن احراز 2 مرحله‌ای",
+    "2FA Settings": "تنظیمات احراز 2 مرحله‌ای",
+    "Two Factor Authentication": "احراز هویت دومرحله‌ای",
+    "Active": "فعال",
+    "Inactive": "غیرفعال",
+    "Token": "توکن",
+    "Show URI": "نمایش آدرس (URI) ",
+    "Tags": "برچسب‌ها",
+    "Add New below or Select...": "یک مورد جدید اضافه کنید و یا از لیست انتخاب کنید...",
+    "Tag with this name already exist.": "یک برچسب با این «نام» از قبل وجود دارد",
+    "Tag with this value already exist.": "یک برچسب با این «مقدار» از قبل وجود دارد.",
+    "color": "رنگ",
+    "value (optional)": "مقدار (اختیاری)",
+    "Gray": "خاکستری",
+    "Red": "قرمز",
+    "Orange": "نارنجی",
+    "Green": "سبز",
+    "Blue": "آبی",
+    "Indigo": "نیلی",
+    "Purple": "بنفش",
+    "Pink": "صورتی",
+    "Search...": "جستجو...",
+    "Avg. Ping": "متوسط پینگ",
+    "Avg. Response": "متوسط زمان پاسخ",
+    "Entry Page": "صفحه ورودی",
+    "statusPageNothing": "چیزی اینجا نیست، لطفا یک گروه و یا یک مانیتور اضافه کنید!",
+    "No Services": "هیچ سرویسی موجود نیست",
+    "All Systems Operational": "تمامی سیستم‌ها عملیاتی هستند!",
+    "Partially Degraded Service": "افت نسبی کیفیت سرویس",
+    "Degraded Service": "افت کامل کیفیت سرویس",
+    "Add Group": "اضافه کردن گروه",
+    "Add a monitor": "اضافه کردن مانیتور",
+    "Edit Status Page": "ویرایش صفحه وضعیت",
+    "Status Page": "صفحه وضعیت",
+    "Status Pages": "صفحه وضعیت",
+    "Go to Dashboard": "رفتن به پیشخوان",
+    "Uptime Kuma": "آپتایم کوما",
+    "records": "مورد",
+    "One record": "یک مورد",
+    "Info": "اطلاعات",
+    "Powered by": "نیرو گرفته از",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost"
+}
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
new file mode 100644
index 00000000..9da84bda
--- /dev/null
+++ b/src/lang/fr-FR.json
@@ -0,0 +1,672 @@
+{
+    "languageName": "Français",
+    "checkEverySecond": "Vérifier toutes les {0} secondes",
+    "retryCheckEverySecond": "Réessayer toutes les {0} secondes",
+    "resendEveryXTimes": "Renvoyez toutes les {0} fois",
+    "resendDisabled": "Renvoi désactivé",
+    "retriesDescription": "Nombre d'essais avant que le service ne soit déclaré hors ligne et qu'une notification soit envoyée.",
+    "ignoreTLSError": "Ignorer les erreurs liées au certificat SSL/TLS",
+    "upsideDownModeDescription": "Si le service est en ligne, il sera alors noté hors ligne et vice-versa.",
+    "maxRedirectDescription": "Nombre maximal de redirections avant que le service ne soit marqué comme hors ligne.",
+    "enableGRPCTls": "Autoriser l'envoi d'une requête gRPC avec une connexion TLS",
+    "grpcMethodDescription": "Le nom de la méthode est converti au format CamelCase tel que sayHello, check, etc.",
+    "acceptedStatusCodesDescription": "Codes HTTP qui considèrent le service comme étant disponible.",
+    "Maintenance": "Maintenance",
+    "statusMaintenance": "Maintenance",
+    "Schedule maintenance": "Planifier la maintenance",
+    "Affected Monitors": "Sondes concernées",
+    "Pick Affected Monitors...": "Sélectionner les sondes concernées...",
+    "Start of maintenance": "Début de la maintenance",
+    "All Status Pages": "Toutes les pages d'état",
+    "Select status pages...": "Sélectionner les pages d'état...",
+    "recurringIntervalMessage": "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
+    "affectedMonitorsDescription": "Sélectionnez les sondes concernées par la maintenance en cours",
+    "affectedStatusPages": "Afficher ce message de maintenance sur les pages d'état sélectionnées",
+    "atLeastOneMonitor": "Sélectionnez au moins une sonde concernée",
+    "passwordNotMatchMsg": "Les mots de passe ne correspondent pas",
+    "notificationDescription": "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
+    "keywordDescription": "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
+    "pauseDashboardHome": "En pause",
+    "deleteMonitorMsg": "Êtes-vous sûr de vouloir supprimer cette sonde ?",
+    "deleteMaintenanceMsg": "Voulez-vous vraiment supprimer cette maintenance ?",
+    "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.",
+    "dnsPortDescription": "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
+    "resolverserverDescription": "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
+    "rrtypeDescription": "Veuillez sélectionner un type d'enregistrement DNS",
+    "pauseMonitorMsg": "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
+    "enableDefaultNotificationDescription": "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
+    "clearEventsMsg": "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
+    "clearHeartbeatsMsg": "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
+    "confirmClearStatisticsMsg": "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
+    "importHandleDescription": "Choisissez « Ignorer l'existant » si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option « Écraser » supprime toutes les sondes et notifications existantes.",
+    "confirmImportMsg": "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
+    "twoFAVerifyLabel": "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
+    "tokenValidSettingsMsg": "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres de double authentification (2FA).",
+    "confirmEnableTwoFAMsg": "Êtes-vous sûr de vouloir activer la double authentification (2FA) ?",
+    "confirmDisableTwoFAMsg": "Êtes-vous sûr de vouloir désactiver la double authentification (2FA) ?",
+    "Settings": "Paramètres",
+    "Dashboard": "Tableau de bord",
+    "New Update": "Mise à jour disponible",
+    "Language": "Langue",
+    "Appearance": "Apparence",
+    "Theme": "Thème",
+    "General": "Général",
+    "Primary Base URL": "URL principale",
+    "Version": "Version",
+    "Check Update On GitHub": "Consulter les mises à jour sur GitHub",
+    "List": "Lister",
+    "Add": "Ajouter",
+    "Add New Monitor": "Ajouter une nouvelle sonde",
+    "Quick Stats": "Résumé",
+    "Up": "En ligne",
+    "Down": "Hors ligne",
+    "Pending": "En attente",
+    "Unknown": "Inconnu",
+    "Pause": "En pause",
+    "Name": "Nom",
+    "Status": "État",
+    "DateTime": "Heure",
+    "Message": "Messages",
+    "No important events": "Aucun évènement important",
+    "Resume": "Reprendre",
+    "Edit": "Modifier",
+    "Delete": "Supprimer",
+    "Current": "Actuellement",
+    "Uptime": "Disponibilité",
+    "Cert Exp.": "Expiration SSL",
+    "day": "jour | jours",
+    "-day": " jours",
+    "hour": "heure",
+    "-hour": " heure",
+    "Response": "Temps de réponse",
+    "Ping": "Ping",
+    "Monitor Type": "Type de sonde",
+    "Keyword": "Mot-clé",
+    "Friendly Name": "Nom d'affichage",
+    "URL": "URL",
+    "Hostname": "Nom d'hôte / adresse IP",
+    "Port": "Port",
+    "Heartbeat Interval": "Intervalle de vérification",
+    "Retries": "Essais",
+    "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
+    "Resend Notification if Down X times consequently": "Renvoyer une notification si hors ligne X fois",
+    "Advanced": "Avancé",
+    "Upside Down Mode": "Mode inversé",
+    "Max. Redirects": "Nombre maximum de redirections",
+    "Accepted Status Codes": "Codes HTTP acceptés",
+    "Push URL": "Push URL",
+    "needPushEvery": "Vous devez appeler cette URL toutes les {0} secondes.",
+    "pushOptionalParams": "Paramètres facultatifs : {0}",
+    "Save": "Sauvegarder",
+    "Notifications": "Notifications",
+    "Not available, please setup.": "Non disponible, merci de le configurer.",
+    "Setup Notification": "Créer une notification",
+    "Light": "Clair",
+    "Dark": "Sombre",
+    "Auto": "Automatique",
+    "Theme - Heartbeat Bar": "Thème - barres d'état",
+    "Normal": "Normal",
+    "Bottom": "En dessous",
+    "None": "Aucun",
+    "Timezone": "Fuseau horaire",
+    "Search Engine Visibility": "Visibilité par les moteurs de recherche",
+    "Allow indexing": "Autoriser l'indexation",
+    "Discourage search engines from indexing site": "Refuser l'indexation",
+    "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",
+    "Update Password": "Mettre à jour le mot de passe",
+    "Disable Auth": "Désactiver l'authentification",
+    "Enable Auth": "Activer l'authentification",
+    "disableauth.message1": "Voulez-vous vraiment <strong>désactiver l'authentification</strong> ?",
+    "disableauth.message2": "Cette fonctionnalité est conçue pour les scénarios <strong>où vous avez l'intention d'implémenter une authentification tierce</strong> devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
+    "Please use this option carefully!": "Veuillez utiliser cette option avec précaution !",
+    "Logout": "Déconnexion",
+    "Leave": "Quitter",
+    "I understand, please disable": "Je comprends, désactivez-la",
+    "Confirm": "Confirmer",
+    "Yes": "Oui",
+    "No": "Non",
+    "Username": "Nom d'utilisateur",
+    "Password": "Mot de passe",
+    "Remember me": "Se souvenir de moi",
+    "Login": "Connexion",
+    "No Monitors, please": "Pas de sondes, veuillez",
+    "add one": "en ajouter une",
+    "Notification Type": "Type de notification",
+    "Email": "Courriel",
+    "Test": "Tester",
+    "Certificate Info": "Informations sur le certificat SSL",
+    "Resolver Server": "Serveur DNS utilisé",
+    "Resource Record Type": "Type d'enregistrement DNS recherché",
+    "Last Result": "Dernier résultat",
+    "Create your admin account": "Créer votre compte administrateur",
+    "Repeat Password": "Répéter le mot de passe",
+    "Import Backup": "Importation de la sauvegarde",
+    "Export Backup": "Exportation de la sauvegarde",
+    "Export": "Exporter",
+    "Import": "Importer",
+    "respTime": "Temps de réponse (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Activé par défaut",
+    "Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
+    "Create": "Créer",
+    "Clear Data": "Effacer les données",
+    "Events": "Événements",
+    "Heartbeats": "Vérifications",
+    "Auto Get": "Récupérer automatiquement",
+    "backupDescription": "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
+    "backupDescription2": "PS : Les données relatives à l'historique et aux événements ne sont pas incluses.",
+    "backupDescription3": "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
+    "alertNoFile": "Veuillez sélectionner un fichier à importer.",
+    "alertWrongFileType": "Veuillez sélectionner un fichier JSON à importer.",
+    "Clear all statistics": "Effacer toutes les statistiques",
+    "Skip existing": "Sauter l'existant",
+    "Overwrite": "Écraser",
+    "Options": "Options",
+    "Keep both": "Garder les deux",
+    "Verify Token": "Vérifier le jeton",
+    "Setup 2FA": "Configurer la double authentification (2FA)",
+    "Enable 2FA": "Activer la double authentification (2FA)",
+    "Disable 2FA": "Désactiver la double authentification (2FA)",
+    "2FA Settings": "Paramètres de la la double authentification (2FA)",
+    "Two Factor Authentication": "Double authentification",
+    "Active": "Actif",
+    "Inactive": "Inactif",
+    "Token": "Jeton",
+    "Show URI": "Afficher l'URI",
+    "Tags": "Étiquettes",
+    "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici...",
+    "Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
+    "Tag with this value already exist.": "Une étiquette avec cette valeur existe déjà.",
+    "color": "Couleur",
+    "value (optional)": "Valeur (facultatif)",
+    "Gray": "Gris",
+    "Red": "Rouge",
+    "Orange": "Orange",
+    "Green": "Vert",
+    "Blue": "Bleu",
+    "Indigo": "Indigo",
+    "Purple": "Violet",
+    "Pink": "Rose",
+    "Search...": "Rechercher...",
+    "Avg. Ping": "Ping moyen",
+    "Avg. Response": "Réponse moyenne",
+    "Entry Page": "Page d'accueil",
+    "statusPageNothing": "Rien ici, veuillez ajouter un groupe ou une sonde.",
+    "No Services": "Aucun service",
+    "All Systems Operational": "Tous les systèmes sont opérationnels",
+    "Partially Degraded Service": "Service partiellement dégradé",
+    "Degraded Service": "Service dégradé",
+    "Add Group": "Ajouter un groupe",
+    "Add a monitor": "Ajouter une sonde",
+    "Edit Status Page": "Modifier la page de statut",
+    "Go to Dashboard": "Accéder au tableau de bord",
+    "Status Page": "Page de statut",
+    "Status Pages": "Pages de statut",
+    "defaultNotificationName": "Ma notification {notification} numéro ({number})",
+    "here": "ici",
+    "Required": "Requis",
+    "telegram": "Telegram",
+    "Bot Token": "Jeton du robot",
+    "wayToGetTelegramToken": "Vous pouvez obtenir un token depuis {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Prend en charge les messages privés / messages de groupe / l'ID d'un salon",
+    "wayToGetTelegramChatID": "Vous pouvez obtenir le Chat ID en envoyant un message avec le robot puis en récupérant l'URL pour voir l'ID du salon :",
+    "YOUR BOT TOKEN HERE": "VOTRE JETON ROBOT ICI",
+    "chatIDNotFound": "ID du salon introuvable, envoyez un message via le robot avant",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Type de contenu",
+    "webhookJsonDesc": "{0} est bien pour tous les serveurs HTTP modernes comme Express.js",
+    "webhookFormDataDesc": "{multipart} est bien pour du PHP. Le JSON aura besoin d'être parsé avec {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "En-têtes supplémentaires",
+    "webhookAdditionalHeadersDesc": "Définit des en-têtes supplémentaires envoyés avec le webhook.",
+    "smtp": "Courriel (SMTP)",
+    "secureOptionNone": "Aucun / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignorer les erreurs TLS",
+    "From Email": "Depuis l'adresse",
+    "emailCustomSubject": "Objet personnalisé",
+    "To Email": "Vers l'adresse",
+    "smtpCC": "CC",
+    "smtpBCC": "CCI",
+    "discord": "Discord",
+    "Discord Webhook URL": "URL vers le webhook Discord",
+    "wayToGetDiscordURL": "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Créer un Webhook »",
+    "Bot Display Name": "Nom du robot (affiché)",
+    "Prefix Custom Message": "Préfixe du message personnalisé",
+    "Hello @everyone is...": "Bonjour {'@'}everyone il...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL vers le webhook",
+    "wayToGetTeamsURL": "Vous pouvez apprendre comment créer un Webhook {0}.",
+    "signal": "Signal",
+    "Number": "Numéro",
+    "Recipients": "Destinataires",
+    "needSignalAPI": "Vous avez besoin d'un client Signal avec l'API REST.",
+    "wayToCheckSignalURL": "Vous pouvez regarder l'URL suivante pour savoir comment la mettre en place :",
+    "signalImportant": "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
+    "gotify": "Gotify",
+    "Application Token": "Jeton d'application",
+    "Server URL": "URL du serveur",
+    "Priority": "Priorité",
+    "slack": "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Nom du salon",
+    "Uptime Kuma URL": "URL vers Uptime Kuma",
+    "aboutWebhooks": "Plus d'informations sur les webhooks ici : {0}",
+    "aboutChannelName": "Mettez le nom du salon dans {0} dans « Nom du salon » si vous voulez contourner le salon webhook. Ex. : #autre-salon",
+    "aboutKumaURL": "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
+    "emojiCheatSheet": "Aide sur les émojis : {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (prend en charge plus de 50 services de notification)",
+    "GoogleChat": "Google Chat (Google Workspace uniquement)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Clé d'utilisateur",
+    "Device": "Appareil",
+    "Message Title": "Titre du message",
+    "Notification Sound": "Son de notification",
+    "More info on:": "Plus d'informations sur : {0}",
+    "pushoverDesc1": "Priorité d'urgence (2) a un délai par défaut de 30 secondes entre les tentatives et expire après une heure.",
+    "pushoverDesc2": "Si vous voulez envoyer des notifications sur différents appareils, remplissez le champ « Appareil ».",
+    "SMS Type": "Type de SMS",
+    "octopushTypePremium": "Premium (rapide - recommandé pour les alertes)",
+    "octopushTypeLowCost": "Économique (lent, bloqué de temps en temps par l'opérateur)",
+    "checkPrice": "Vérification {0} tarifs :",
+    "apiCredentials": "Identifiants de l'API",
+    "octopushLegacyHint": "Voulez-vous utiliser l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
+    "Check octopush prices": "Vérifier les prix d'Octopush {0}.",
+    "octopushPhoneNumber": "Numéro de téléphone (format international, ex. : +33612345678)",
+    "octopushSMSSender": "Nom de l'expéditeur : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
+    "LunaSea Device ID": "Identifiant d'appareil LunaSea",
+    "Apprise URL": "URL d'Apprise",
+    "Example:": "Exemple : {0}",
+    "Read more:": "En savoir plus : {0}",
+    "Status:": "État : {0}",
+    "Read more": "En savoir plus",
+    "appriseInstalled": "Apprise est installé.",
+    "appriseNotInstalled": "Apprise n'est pas installé. {0}",
+    "Access Token": "Jeton d'accès",
+    "Channel access token": "Jeton d'accès au canal",
+    "Line Developers Console": "Console développeurs Line",
+    "lineDevConsoleTo": "Console développeurs Line - {0}",
+    "Basic Settings": "Paramètres de base",
+    "User ID": "Identifiant utilisateur",
+    "Messaging API": "Messaging API", // Ne pas traduire, il s'agit du type de salon affiché sur la console développeurs Line
+    "wayToGetLineChannelToken": "Premièrement accédez à {0}, créez un <i>provider</i> et définissez un type de salon à « Messaging API ». Vous pourrez alors avoir  puis vous pourrez avoir le jeton d'accès du salon et l'identifiant utilisateur demandés.",
+    "Icon URL": "URL vers l'icône",
+    "aboutIconURL": "Vous pouvez mettre un lien vers une image dans « URL vers l'icône » pour remplacer l'image de profil par défaut. Elle ne sera utilisé que si « Icône émoji » n'est pas défini.",
+    "aboutMattermostChannelName": "Vous pouvez remplacer le salon par défaut que le webhook utilise en mettant le nom du salon dans le champ « Nom du salon ». Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex. : #autre-salon",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - Bon marché mais lent et souvent surchargé. Limité uniquement aux destinataires polonais.",
+    "promosmsTypeFlash": "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux destinataires Polonais.",
+    "promosmsTypeFull": "SMS FULL - Version premium des SMS. Vous pouvez mettre le nom de l'expéditeur (vous devez l'enregistrer au préalable). Fiable pour les alertes.",
+    "promosmsTypeSpeed": "SMS SPEED - Priorité élevée pour le système. Très rapide et fiable mais coûteux (environ le double du prix d'un SMS FULL).",
+    "promosmsPhoneNumber": "Numéro de téléphone (pour les destinataires polonais, vous pouvez ignorer l'indicatif international)",
+    "promosmsSMSSender": "Nom de l'expéditeur du SMS : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "L'URL du serveur (avec http(s):// et le port de manière facultative)",
+    "Internal Room Id": "ID de la salle interne",
+    "matrixDesc1": "Vous pouvez trouver l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est censé ressembler à !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Pour cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
+    "Method": "Méthode",
+    "Body": "Corps",
+    "Headers": "En-têtes",
+    "PushUrl": "URL Push",
+    "HeadersInvalidFormat": "Les en-têtes de la requête ne sont pas dans un format JSON valide : ",
+    "BodyInvalidFormat": "Le corps de la requête n'est pas dans un format JSON valide : ",
+    "Monitor History": "Historique de la sonde",
+    "clearDataOlderThan": "Conserver l'historique des données de la sonde durant {0} jours.",
+    "PasswordsDoNotMatch": "Les mots de passe ne correspondent pas.",
+    "records": "enregistrements",
+    "One record": "Un enregistrement",
+    "steamApiKeyDescription": "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
+    "Current User": "Utilisateur actuel",
+    "topic": "Topic",
+    "topicExplanation": "Topic MQTT à surveiller",
+    "successMessage": "Message de réussite",
+    "successMessageExplanation": "Message MQTT qui sera considéré comme un succès",
+    "recent": "Récent",
+    "Done": "Fait",
+    "Info": "Info",
+    "Security": "Sécurité",
+    "Steam API Key": "Clé d'API Steam",
+    "Shrink Database": "Réduire la base de données",
+    "Pick a RR-Type...": "Choisissez un type d'enregistrement...",
+    "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés...",
+    "Default": "Défaut",
+    "HTTP Options": "Options HTTP",
+    "Create Incident": "Créer un incident",
+    "Title": "Titre",
+    "Content": "Contenu",
+    "Style": "Style",
+    "info": "Info",
+    "warning": "Attention",
+    "danger": "Danger",
+    "error": "Erreur",
+    "critical": "Critique",
+    "primary": "Primaire",
+    "light": "Blanc",
+    "dark": "Noir",
+    "Post": "Post",
+    "Please input title and content": "Veuillez saisir le titre et le contenu",
+    "Created": "Créé",
+    "Last Updated": "Dernière mise à jour",
+    "Unpin": "Retirer",
+    "Switch to Light Theme": "Passer au thème clair",
+    "Switch to Dark Theme": "Passer au thème sombre",
+    "Show Tags": "Afficher les étiquettes",
+    "Hide Tags": "Masquer les étiquettes",
+    "Description": "Description",
+    "No monitors available.": "Aucune sonde disponible.",
+    "Add one": "En rajouter une",
+    "No Monitors": "Aucune sonde",
+    "Untitled Group": "Groupe sans titre",
+    "Services": "Services",
+    "Discard": "Abandonner",
+    "Cancel": "Annuler",
+    "Powered by": "Propulsé par",
+    "shrinkDatabaseDescription": "Déclenche la commande VACUUM pour SQLite. Si votre base de données a été créée après la version 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "Mot de passe API",
+    "serwersmsPhoneNumber": "Numéro de téléphone",
+    "serwersmsSenderName": "Nom de l'expéditeur du SMS (enregistré via le portail client)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Numéro(s) de téléphone",
+    "smseagleGroup": "Nom(s) de groupe(s) de répertoire",
+    "smseagleContact": "Nom(s) de contact du répertoire",
+    "smseagleRecipientType": "Type de destinataire",
+    "smseagleRecipient": "Destinataire(s) (les multiples doivent être séparés par une virgule)",
+    "smseagleToken": "Jeton d'accès à l'API",
+    "smseagleUrl": "L'URL de votre appareil SMSEagle",
+    "smseagleEncoding": "Envoyer en Unicode",
+    "smseaglePriority": "Priorité des messages (0-9, par défaut = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "Personnaliser",
+    "Custom Footer": "Pied de page personnalisé",
+    "Custom CSS": "CSS personnalisé",
+    "smtpDkimSettings": "Paramètres DKIM",
+    "smtpDkimDesc": "Veuillez vous référer au Nodemailer DKIM {0} pour l'utilisation.",
+    "documentation": "documentation",
+    "smtpDkimDomain": "Nom de domaine",
+    "smtpDkimKeySelector": "Sélecteur de clé",
+    "smtpDkimPrivateKey": "Clé privée",
+    "smtpDkimHashAlgo": "Algorithme de hachage (facultatif)",
+    "smtpDkimheaderFieldNames": "Clés d'en-tête à signer (facultatif)",
+    "smtpDkimskipFields": "Clés d'en-tête à ne pas signer (facultatif)",
+    "wayToGetPagerDutyKey": "Vous pouvez l'obtenir en allant dans Service -> Annuaire des services -> (sélectionner un service) -> Intégrations -> Ajouter une intégration. Ici, vous pouvez rechercher \"Events API V2\". Plus d'infos {0}",
+    "Integration Key": "Clé d'intégration",
+    "Integration URL": "URL d'intégration",
+    "Auto resolve or acknowledged": "Résolution automatique ou accusé de réception",
+    "do nothing": "ne fais rien",
+    "auto acknowledged": "accusé de réception automatique",
+    "auto resolve": "résolution automatique",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environnement",
+    "alertaApiKey": "Clé de l'API",
+    "alertaAlertState": "État de l'alerte",
+    "alertaRecoverState": "État de récupération",
+    "deleteStatusPageMsg": "Voulez-vous vraiment supprimer cette page d'état ?",
+    "Proxies": "Proxies",
+    "default": "Défaut",
+    "enabled": "Activé",
+    "setAsDefault": "Définir par défaut",
+    "deleteProxyMsg": "Voulez-vous vraiment supprimer ce proxy pour toutes les sondes ?",
+    "proxyDescription": "Les proxies doivent être affectés à une sonde pour fonctionner.",
+    "enableProxyDescription": "Ce proxy n'aura pas d'effet sur les demandes de sonde tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de toutes les sondes en fonction de l'état d'activation.",
+    "setAsDefaultProxyDescription": "Ce proxy sera activé par défaut pour les nouvelles sondes. Vous pouvez toujours désactiver le proxy séparément pour chaque sonde.",
+    "Certificate Chain": "Chaîne de certificats",
+    "Valid": "Valide",
+    "Invalid": "Non valide",
+    "AccessKeyId": "ID de clé d'accès",
+    "SecretAccessKey": "Clé secrète d'accès",
+    "PhoneNumbers": "Numéros de téléphone",
+    "TemplateCode": "Modèle de code",
+    "SignName": "Signature",
+    "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
+    "Bark Endpoint": "Endpoint Bark",
+    "Bark Group": "Groupe Bark",
+    "Bark Sound": "Son Bark",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "Clé secrète",
+    "For safety, must use secret key": "Par sécurité, utilisation obligatoire de la clé secrète",
+    "Device Token": "Jeton d'appareil",
+    "Platform": "Plateforme",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Haute",
+    "Retry": "Recommencez",
+    "Topic": "Topic",
+    "WeCom Bot Key": "Clé de robot WeCom",
+    "Setup Proxy": "Configurer le proxy",
+    "Proxy Protocol": "Protocole proxy",
+    "Proxy Server": "Serveur proxy",
+    "Proxy server has authentication": "Une authentification est nécessaire pour le serveur proxy",
+    "User": "Utilisateur",
+    "Installed": "Installé",
+    "Not installed": "Non installé",
+    "Running": "Fonctionne",
+    "Not running": "Ne fonctionne pas",
+    "Remove Token": "Supprimer le jeton",
+    "Start": "Démarrer",
+    "Stop": "Arrêter",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Ajouter une page de statut",
+    "Slug": "Chemin",
+    "Accept characters:": "Caractères acceptés : ",
+    "startOrEndWithOnly": "Commence uniquement par {0}",
+    "No consecutive dashes": "Pas de double tirets",
+    "Next": "Continuer",
+    "The slug is already taken. Please choose another slug.": "Un chemin existe déjà. Veuillez en choisir un autre.",
+    "No Proxy": "Pas de proxy",
+    "Authentication": "Authentification",
+    "HTTP Basic Auth": "Authentification de base HTTP",
+    "New Status Page": "Nouvelle page de statut",
+    "Page Not Found": "Page non trouvée",
+    "Reverse Proxy": "Proxy inverse",
+    "Backup": "Sauvegarde",
+    "About": "À propos",
+    "wayToGetCloudflaredURL": "(télécharger cloudflared depuis {0})",
+    "cloudflareWebsite": "Site web de Cloudflare",
+    "Message:": "Message : ",
+    "Don't know how to get the token? Please read the guide:": "Vous ne savez pas comment obtenir le jeton ? Lisez le guide :",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexion actuelle peut être perdue si vous vous connectez actuellement via un tunnel Cloudflare. Êtes-vous sûr de vouloir l'arrêter ? Tapez votre mot de passe actuel pour le confirmer.",
+    "HTTP Headers": "En-têtes HTTP",
+    "Trust Proxy": "Proxy de confiance",
+    "Other Software": "Autres logiciels",
+    "For example: nginx, Apache and Traefik.": "Par exemple : nginx, Apache et Traefik.",
+    "Please read": "Veuillez lire",
+    "Subject:": "Objet : ",
+    "Valid To:": "Valable jusqu'au : ",
+    "Days Remaining:": "Jours restants : ",
+    "Issuer:": "Émetteur : ",
+    "Fingerprint:": "Empreinte : ",
+    "No status pages": "Aucune page de statut.",
+    "Domain Name Expiry Notification": "Notification d'expiration du nom de domaine",
+    "Proxy": "Proxy",
+    "Date Created": "Date de création",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "Adresse HTTP OneBot",
+    "onebotMessageType": "Type de message OneBot",
+    "onebotGroupMessage": "Groupe",
+    "onebotPrivateMessage": "Privé",
+    "onebotUserOrGroupId": "ID de groupe/utilisateur",
+    "onebotSafetyTips": "Pour des raisons de sécurité, vous devez définir un jeton d'accès",
+    "PushDeer Key": "Clé PushDeer",
+    "Footer Text": "Texte de pied de page",
+    "Show Powered By": "Afficher « Propulsé par »",
+    "Domain Names": "Noms de domaine",
+    "signedInDisp": "Connecté en tant que {0}",
+    "signedInDispDisabled": "Authentification désactivée.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Secret partagé entre le client et le serveur",
+    "RadiusCalledStationId": "Identifiant de la station appelée",
+    "RadiusCalledStationIdDescription": "Identifiant de l'appareil appelé",
+    "RadiusCallingStationId": "Identifiant de la station appelante",
+    "RadiusCallingStationIdDescription": "Identifiant de l'appareil appelant",
+    "Certificate Expiry Notification": "Notification d'expiration du certificat",
+    "API Username": "Nom d'utilisateur de l'API",
+    "API Key": "Clé API",
+    "Recipient Number": "Numéro du destinataire",
+    "From Name/Number": "De nom/numéro",
+    "Leave blank to use a shared sender number.": "Laisser vide pour utiliser un numéro d'expéditeur partagé.",
+    "Octopush API Version": "Version de l'API Octopush",
+    "Legacy Octopush-DM": "Ancien Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"Clé API\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+    "octopushLogin": "\"Identifiant\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
+    "promosmsLogin": "Nom de connexion API",
+    "promosmsPassword": "Mot de passe API",
+    "pushoversounds pushover": "Pushover (par défaut)",
+    "pushoversounds bike": "Vélo",
+    "pushoversounds bugle": "Clairon",
+    "pushoversounds cashregister": "Caisse enregistreuse",
+    "pushoversounds classical": "Classique",
+    "pushoversounds cosmic": "Cosmique",
+    "pushoversounds falling": "Chute",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Arrivée",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magique",
+    "pushoversounds mechanical": "Mécanique",
+    "pushoversounds pianobar": "Piano-bar",
+    "pushoversounds siren": "Sirène",
+    "pushoversounds spacealarm": "Alarme spatiale",
+    "pushoversounds tugboat": "Remorqueur",
+    "pushoversounds alien": "Alarme alienne (version longue)",
+    "pushoversounds climb": "Escalade (version longue)",
+    "pushoversounds persistent": "Persistent (version longue)",
+    "pushoversounds echo": "Pushover Echo (version longue)",
+    "pushoversounds updown": "Up Down (version longue)",
+    "pushoversounds vibrate": "Vibration seulement",
+    "pushoversounds none": "Aucun (silencieux)",
+    "pushyAPIKey": "Clé API secrète",
+    "pushyToken": "Jeton d'appareil",
+    "Show update if available": "Afficher la mise à jour si disponible",
+    "Also check beta release": "Vérifiez également la version bêta",
+    "Using a Reverse Proxy?": "Utiliser un proxy inverse ?",
+    "Check how to config it for WebSocket": "Vérifier comment le configurer pour WebSocket",
+    "Steam Game Server": "Serveur de jeu Steam",
+    "Most likely causes:": "Causes les plus probables : ",
+    "The resource is no longer available.": "La ressource n'est plus disponible.",
+    "There might be a typing error in the address.": "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
+    "What you can try:": "Ce que vous pouvez essayer :",
+    "Retype the address.": "Retaper l'adresse.",
+    "Go back to the previous page.": "Retourner à la page précédente.",
+    "Coming Soon": "Prochainement",
+    "wayToGetClickSendSMSToken": "Vous pouvez obtenir le nom d'utilisateur API et la clé API à partir de {0} .",
+    "Connection String": "Chaîne de connexion",
+    "Query": "Requête",
+    "settingsCertificateExpiry": "Expiration du certificat TLS",
+    "certificationExpiryDescription": "Les sondes HTTPS émettent une notification lorsque le certificat TLS expire dans :",
+    "Setup Docker Host": "Configurer l'hôte Docker",
+    "Connection Type": "Type de connexion",
+    "Docker Daemon": "Deamon Docker",
+    "deleteDockerHostMsg": "Voulez-vous vraiment supprimer cet hôte Docker pour toutes les sondes ?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Conteneur Docker",
+    "Container Name / ID": "Nom / ID du conteneur",
+    "Docker Host": "Hôte Docker",
+    "Docker Hosts": "Hôtes Docker",
+    "ntfy Topic": "Topic ntfy",
+    "Domain": "Domaine",
+    "Workstation": "Poste de travail",
+    "disableCloudflaredNoAuthMsg": "Vous êtes en mode No Auth, un mot de passe n'est pas nécessaire.",
+    "trustProxyDescription": "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière (nginx ou Apache) vous devez l'activer.",
+    "wayToGetLineNotifyToken": "Vous pouvez obtenir un jeton d'accès auprès de {0}",
+    "Examples": "Exemples",
+    "Home Assistant URL": "URL vers Home Assistant",
+    "Long-Lived Access Token": "Jeton d'accès de longue durée",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
+    "Notification Service": "Service de notifications",
+    "default: notify all devices": "par défaut: notifier tous les appareils",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
+    "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant : ",
+    "Trigger type:": "Type de déclencheur : ",
+    "Event type:": "Type d'événement : ",
+    "Event data:": "Données d'événement : ",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ensuite, choisissez une action, par exemple basculer la scène là où une lumière RVB est rouge.",
+    "Frontend Version": "Version frontend",
+    "Frontend Version do not match backend version!": "La version frontend ne correspond pas à la version backend !",
+    "Base URL": "URL de base",
+    "goAlertInfo": "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Impliquez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
+    "goAlertIntegrationKeyInfo": "Obtenez la clé d'intégration d'API générique pour le service dans ce format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" généralement la valeur du paramètre de jeton de l'URL copiée.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
+    "backupRecommend": "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
+    "Optional": "Optionnel",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "Documentations de l'API SMSManager ",
+    "Gateway Type": "Type de passerelle",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Vous pouvez diviser des nombres avec",
+    "or": "ou",
+    "recurringInterval": "Intervalle",
+    "Recurring": "Récurrent",
+    "strategyManual": "Activer/désactiver manuellement",
+    "warningTimezone": "Utilisation du fuseau horaire du serveur",
+    "weekdayShortMon": "Lun",
+    "weekdayShortTue": "Mar",
+    "weekdayShortWed": "Mer",
+    "weekdayShortThu": "Jeu",
+    "weekdayShortFri": "Ven",
+    "weekdayShortSat": "Sam",
+    "weekdayShortSun": "Dim",
+    "dayOfWeek": "Jour de la semaine",
+    "dayOfMonth": "Jour du mois",
+    "lastDay": "Dernier jour",
+    "lastDay1": "Dernier jour du mois",
+    "lastDay2": "Avant-dernier jour du mois",
+    "lastDay3": "3ème dernier jour du mois",
+    "lastDay4": "4ème dernier jour du mois",
+    "No Maintenance": "Aucune maintenance",
+    "pauseMaintenanceMsg": "Voulez-vous vraiment mettre en pause ?",
+    "maintenanceStatus-under-maintenance": "En maintenance",
+    "maintenanceStatus-inactive": "Inactif",
+    "maintenanceStatus-scheduled": "Programmé",
+    "maintenanceStatus-ended": "Terminé",
+    "maintenanceStatus-unknown": "Inconnue",
+    "Display Timezone": "Afficher le fuseau horaire",
+    "Server Timezone": "Fuseau horaire du serveur",
+    "statusPageMaintenanceEndDate": "Fin",
+    "IconUrl": "URL vers l'icône",
+    "Enable DNS Cache": "Activer le cache DNS",
+    "Enable": "Activer",
+    "Disable": "Désactiver",
+    "dnsCacheDescription": "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
+    "Single Maintenance Window": "Créneau de maintenance unique",
+    "Maintenance Time Window of a Day": "Créneau de la maintenance",
+    "Effective Date Range": "Plage de dates d'effet",
+    "Schedule Maintenance": "Créer une maintenance",
+    "Date and Time": "Date et heure",
+    "DateTime Range": "Plage de dates et d'heures",
+    "Strategy": "Stratégie",
+    "Free Mobile User Identifier": "Identifiant d'utilisateur Free Mobile",
+    "Free Mobile API Key": "Clé d'API Free Mobile",
+    "Enable TLS": "Activer le TLS",
+    "Proto Service Name": "Nom du service proto",
+    "Proto Method": "Méthode Proto",
+    "Proto Content": "Contenu proto",
+    "Economy": "Économique",
+    "Lowcost": "Faible coût",
+    "high": "Haute",
+    "General Monitor Type": "Type de sonde générale",
+    "Passive Monitor Type": "Type de sonde passive",
+    "Specific Monitor Type": "Type de sonde spécifique"
+}
diff --git a/src/lang/he-IL.json b/src/lang/he-IL.json
new file mode 100644
index 00000000..c8219ff5
--- /dev/null
+++ b/src/lang/he-IL.json
@@ -0,0 +1,672 @@
+{
+    "languageName": "עברית",
+    "checkEverySecond": "בדוק כל {0} שניות",
+    "retryCheckEverySecond": "נסה שוב כל {0} שניות",
+    "resendEveryXTimes": "התראה שוב כל {0} פעמים",
+    "resendDisabled": "השליחה מחדש מושבתת",
+    "retriesDescription": "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ונשלחת התראה",
+    "ignoreTLSError": "התעלם משגיאת TLS/SSL עבור אתרי HTTPS",
+    "upsideDownModeDescription": "הפוך את הסטטוס על הפוך. אם ניתן להגיע לשירות, הוא לא פעיל.",
+    "maxRedirectDescription": "המספר המרבי של הפניות מחדש לעקוב. הגדר ל-0 כדי להשבית הפניות מחדש.",
+    "enableGRPCTls": "אפשר לשלוח בקשת gRPC עם חיבור TLS",
+    "grpcMethodDescription": "שם השיטה מומר לפורמט cammelCase כגון sayHello, check וכו.",
+    "acceptedStatusCodesDescription": "בחר קודי סטטוס שנחשבים לתגובה מוצלחת.",
+    "Maintenance": "תחזוקה",
+    "statusMaintenance": "תחזוקה",
+    "Schedule maintenance": "תחזוקה מתוכננת",
+    "Affected Monitors": "מוניטורים מושפעים",
+    "Pick Affected Monitors...": "בחר המוניטרים מושפעים...",
+    "Start of maintenance": "תחילת תחזוקה",
+    "All Status Pages": "כל דפי הסטטוס",
+    "Select status pages...": "בחר דפי סטטוס...",
+    "recurringIntervalMessage": "רוץ פעם ביום | הפעל אחת ל-{0} ימים",
+    "affectedMonitorsDescription": "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית",
+    "affectedStatusPages": "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו",
+    "atLeastOneMonitor": "בחר לפחות מוניטור אחד מושפע",
+    "passwordNotMatchMsg": "הסיסמאות לא תואמות",
+    "notificationDescription": "יש להקצות התראות למוניטור כדי שהן יעבדו.",
+    "keywordDescription": "חפש מילת מפתח בתגובת HTML או JSON רגילה. החיפוש תלוי רישיות.",
+    "pauseDashboardHome": "עצור",
+    "deleteMonitorMsg": "האם אתה בטוח שברצונך למחוק את המוניטור הזה?",
+    "deleteMaintenanceMsg": "האם אתה בטוח שברצונך למחוק את התחזוקה הזו?",
+    "deleteNotificationMsg": "האם אתה בטוח שברצונך למחוק את ההודעה הזו עבור כל מוניטרים?",
+    "dnsPortDescription": "יציאת שרת DNS. ברירת המחדל היא 53. אתה יכול לשנות את היציאה בכל עת.",
+    "resolverserverDescription": "Cloudflare הוא שרת ברירת המחדל. אתה יכול לשנות את שרת הפותר בכל עת.",
+    "rrtypeDescription": "בחר את סוג ה-RR שברצונך לפקח עליו",
+    "pauseMonitorMsg": "האם אתה בטוח רוצה להשהות?",
+    "enableDefaultNotificationDescription": "הודעה זו תופעל כברירת מחדל עבור מוניטרים חדשים. אתה עדיין יכול להשבית את ההודעה בנפרד עבור כל מוניטור.",
+    "clearEventsMsg": "האם אתה בטוח שברצונך למחוק את כל האירועים עבור המוניטור הזה?",
+    "clearHeartbeatsMsg": "האם אתה בטוח שברצונך למחוק את כל פעימות הלב עבור המוניטור הזה?",
+    "confirmClearStatisticsMsg": "האם אתה בטוח שברצונך למחוק את כל הנתונים הסטטיסטיים?",
+    "importHandleDescription": "בחר 'דלג על קיים' אם ברצונך לדלג על כל מוניטור או התראה באותו שם. 'החלף' ימחק כל מוניטור והתראה קיימים.",
+    "confirmImportMsg": "האם אתה בטוח שברצונך לייבא את הגיבוי? אנא ודא שבחרת באפשרות הייבוא הנכונה.",
+    "twoFAVerifyLabel": "אנא הזן את האסימון שלך כדי לאמת מערכת אדוש:",
+    "tokenValidSettingsMsg": "האסימון תקף! כעת אתה יכול לשמור את הגדרות האדוש.",
+    "confirmEnableTwoFAMsg": "האם אתה בטוח שברצונך להפעיל את מערכת אדוש?",
+    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "Settings": "הגדרות",
+    "Dashboard": "פאנל ניהול",
+    "New Update": "עדכון חדש",
+    "Language": "שפה",
+    "Appearance": "נראות",
+    "Theme": "ערכת נושא",
+    "General": "כללי",
+    "Primary Base URL": "כתובת האתר הראשית של הבסיס",
+    "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.": "Cert Exp.",
+    "day": "יום | ימים",
+    "-day": "-יום",
+    "hour": "שעה",
+    "-hour": "-שעה",
+    "Response": "תגובה",
+    "Ping": "פינג",
+    "Monitor Type": "סוג מוניטור",
+    "Keyword": "מילת מפתח",
+    "Friendly Name": "שם ידידותי",
+    "URL": "כתובת אתר",
+    "Hostname": "שם המארח",
+    "Port": "פורט",
+    "Heartbeat Interval": "מרווח פעימות",
+    "Retries": "נסיונות חוזרים",
+    "Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות",
+    "Resend Notification if Down X times consequently": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך",
+    "Advanced": "מתקדם",
+    "Upside Down Mode": "מצב הפוך",
+    "Max. Redirects": "מקסימום הפניות מחדש",
+    "Accepted Status Codes": "קודי סטטוס מקובלים",
+    "Push URL": "דחף כתובת URL",
+    "needPushEvery": "עליך להתקשר לכתובת האתר הזו כל {0} שניות.",
+    "pushOptionalParams": "פרמטרים אופציונליים: {0}",
+    "Save": "שמירה",
+    "Notifications": "התראות",
+    "Not available, please setup.": "לא זמין, אנא הגדר.",
+    "Setup Notification": "הודעת הגדרה",
+    "Light": "בהיר",
+    "Dark": "חושך",
+    "Auto": "אוטומטי",
+    "Theme - Heartbeat Bar": "ערכת נושא - 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": "הפעלת אבטחה",
+    "disableauth.message1": "האם אתה בטוח שברצונך <strong>להשבית את האבטחה</strong>?",
+    "disableauth.message2": "הוא מיועד לתרחישים <strong>שבהם אתה מתכוון ליישם אימות של צד שלישי</strong> מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.",
+    "Please use this option carefully!": "אנא השתמש באפשרות זו בזהירות!",
+    "Logout": "התנתקות",
+    "Leave": "יציאה",
+    "I understand, please disable": "אני מבין, אני רוצה להשבית",
+    "Confirm": "אישור",
+    "Yes": "כן",
+    "No": "לא",
+    "Username": "שם משתמש",
+    "Password": "סיסמה",
+    "Remember me": "זכור אותי",
+    "Login": "התחברות",
+    "No Monitors, please": "בלי מוניטורים, בבקשה",
+    "add one": "להוסיף אחד",
+    "Notification Type": "סוג התראה",
+    "Email": "אימייל",
+    "Test": "Test",
+    "Certificate Info": "פרטי תעודת אבטחה",
+    "Resolver Server": "שרת פותר",
+    "Resource Record Type": "סוג רשומת משאבים",
+    "Last Result": "תוצאה אחרונה",
+    "Create your admin account": "צור את חשבון הניהול שלך",
+    "Repeat Password": "חזור על הסיסמה",
+    "Import Backup": "ייבוא גיבוי",
+    "Export Backup": "ייצוא גיבוי",
+    "Export": "ייצוא",
+    "Import": "ייבוא",
+    "respTime": "רפ. זמן (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "ברירת המחדל מופעלת",
+    "Apply on all existing monitors": "החל על כל המסכים הקיימים",
+    "Create": "ליצור",
+    "Clear Data": "נקה נתונים",
+    "Events": "אירועים",
+    "Heartbeats": "פעימות לב",
+    "Auto Get": "קבל אוטומטי",
+    "backupDescription": "אתה יכול לגבות את כל המסכים וההתראות לקובץ JSON.",
+    "backupDescription2": "הערה: היסטוריה ונתוני אירועים אינם כלולים.",
+    "backupDescription3": "נתונים רגישים כגון אסימוני הודעה כלולים בקובץ הייצוא; נא לאחסן יצוא בצורה מאובטחת.",
+    "alertNoFile": "אנא בחר קובץ לייבוא.",
+    "alertWrongFileType": "אנא בחר קובץ JSON.",
+    "Clear all statistics": "נקה את כל הנתונים הסטטיסטיים",
+    "Skip existing": "דילוג על הקיים",
+    "Overwrite": "החלף",
+    "Options": "אפשרויות",
+    "Keep both": "שמור את שניהם",
+    "Verify Token": "אמת את האסימון",
+    "Setup 2FA": "הגדרת מערכת אדוש",
+    "Enable 2FA": "הפעלת אדוש",
+    "Disable 2FA": "כיבוי אדוש",
+    "2FA Settings": "הגדרות אדוש",
+    "Two Factor Authentication": "אימות דו-שלבי (מערכת אדוש)",
+    "Active": "מופעל",
+    "Inactive": "קבוי",
+    "Token": "אסימון",
+    "Show URI": "הצג URI",
+    "Tags": "תגים",
+    "Add New below or Select...": "הוסף חדש למטה או בחר...",
+    "Tag with this name already exist.": "תג בשם זה כבר קיים.",
+    "Tag with this value already exist.": "תג עם ערך זה כבר קיים.",
+    "color": "צבע",
+    "value (optional)": "ערך (אופציונלי)",
+    "Gray": "אפור",
+    "Red": "אדום",
+    "Orange": "כתום",
+    "Green": "ירוק",
+    "Blue": "כחול",
+    "Indigo": "כחול כהה",
+    "Purple": "סגול",
+    "Pink": "כתום",
+    "Search...": "לחפש...",
+    "Avg. Ping": "פינג ממוצע",
+    "Avg. Response": "ממוצע תגובה",
+    "Entry Page": "דף כניסה",
+    "statusPageNothing": "אין כאן שום דבר, בבקשה הוסף קבוצה או מוניטור.",
+    "No Services": "אין שירותים",
+    "All Systems Operational": "כל המערכות עובדות",
+    "Partially Degraded Service": "שירות פגום חלקית",
+    "Degraded Service": "שירות פגום",
+    "Add Group": "הוסף קבוצה",
+    "Add a monitor": "הוסף מוניטור",
+    "Edit Status Page": "ערוך דף סטטוס",
+    "Go to Dashboard": "מעבר לפאנל",
+    "Status Page": "דף סטטוס",
+    "Status Pages": "דפי סטטוס",
+    "defaultNotificationName": "התראת {notification} שלי ({number})",
+    "here": "פה",
+    "Required": "נדרש",
+    "telegram": "טלגרם",
+    "Bot Token": "אסימון בוט",
+    "wayToGetTelegramToken": "אתה יכול לקבל אסימון מ-{0}.",
+    "Chat ID": "מזהה צ'אט",
+    "supportTelegramChatID": "תמיכה בצ'אט ישיר / קבוצה / מזהה הצ'אט של הערוץ",
+    "wayToGetTelegramChatID": "אתה יכול לקבל את מזהה הצ'אט שלך על ידי שליחת הודעה לבוט ומעבר לכתובת האתר הזו כדי להציג את ה-chat_id:",
+    "YOUR BOT TOKEN HERE": "אסימון הבוט שלך כאן",
+    "chatIDNotFound": "מזהה צ'אט לא נמצא; אנא שלח הודעה לבוט זה תחילה",
+    "webhook": "Webhook",
+    "Post URL": "כתובת אתר של פוסט",
+    "Content Type": "סוג התוכן",
+    "webhookJsonDesc": "{0} מתאים לכל שרתי HTTP מודרניים כגון Express.js",
+    "webhookFormDataDesc": "{multipart} טוב ל-PHP. יהיה צורך לנתח את ה-JSON באמצעות {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "כותרות נוספות",
+    "webhookAdditionalHeadersDesc": "מגדיר כותרות נוספות שנשלחות עם ה-webhook.",
+    "smtp": "אימייל (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "התעלם משגיאת TLS",
+    "From Email": "אמייל שולח",
+    "emailCustomSubject": "נושא מותאם אישית",
+    "To Email": "למייל",
+    "smtpCC": "עותק",
+    "smtpBCC": "עותק מוסתר",
+    "discord": "דיסקורד",
+    "Discord Webhook URL": "כתובת אתר של Discord Webhook",
+    "wayToGetDiscordURL": "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> צור Webhook",
+    "Bot Display Name": "שם תצוגה של בוט",
+    "Prefix Custom Message": "קידומת הודעה מותאמת אישית",
+    "Hello @everyone is...": "שלום {'@'}כולם...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "כתובת האתר של Webhook",
+    "wayToGetTeamsURL": "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
+    "signal": "אוֹת",
+    "Number": "מספר",
+    "Recipients": "נמענים",
+    "needSignalAPI": "אתה צריך שיהיה לך לקוח איתות עם REST API.",
+    "wayToCheckSignalURL": "אתה יכול לבדוק את כתובת האתר הזו כדי לראות כיצד להגדיר אחת:",
+    "signalImportant": "חשוב: לא ניתן לערבב קבוצות ומספרים בנמענים!",
+    "gotify": "Gotify",
+    "Application Token": "אסימון אפליקציה",
+    "Server URL": "כתובת האתר של השרת",
+    "Priority": "עדיפות",
+    "slack": "Slack",
+    "Icon Emoji": "אייקון אימוג'י",
+    "Channel Name": "שם הערוץ",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "מידע נוסף על Webhooks ב: {0}",
+    "aboutChannelName": "הזן את שם הערוץ בשדה {0} שם ערוץ אם ברצונך לעקוף את ערוץ Webhook. לדוגמה: #ערוץ אחר",
+    "aboutKumaURL": "אם תשאיר את השדה Uptime Kuma URL ריק, הוא יעבור כברירת מחדל לעמוד Project GitHub.",
+    "emojiCheatSheet": "גיליון הונאה של אמוג'י: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (תומך ב-50+ שירותי התראות)",
+    "GoogleChat": "Google Chat (Google Workspace בלבד)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "מפתח משתמש",
+    "Device": "התקן",
+    "Message Title": "כותרת ההודעה",
+    "Notification Sound": "צליל התראה",
+    "More info on:": "מידע נוסף על: {0}",
+    "pushoverDesc1": "לעדיפות חירום (2) יש פסק זמן של 30 שניות ברירת מחדל בין ניסיונות חוזרים, והיא תפוג לאחר שעה.",
+    "pushoverDesc2": "אם ברצונך לשלוח התראות למכשירים שונים, מלא את שדה התקן.",
+    "SMS Type": "סוג SMS",
+    "octopushTypePremium": "פרימיום (מהיר - מומלץ להתראה)",
+    "octopushTypeLowCost": "עלות נמוכה (איטית - לפעמים חסומה על ידי המפעיל)",
+    "checkPrice": "בדוק מחירים של {0}:",
+    "apiCredentials": "אישורי API",
+    "octopushLegacyHint": "האם אתה משתמש בגרסה הישנה של Octopush (2011-2020) או בגרסה החדשה?",
+    "Check octopush prices": "בדוק מחירי תמנון {0}.",
+    "octopushPhoneNumber": "מספר טלפון (פורמט אינטלי, למשל: +33612345678)",
+    "octopushSMSSender": "שם שולח SMS: 3-11 תווים אלפאנומריים ורווח (a-zA-Z0-9)",
+    "LunaSea Device ID": "מזהה מכשיר LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "דוגמה: {0}",
+    "Read more:": "קרא עוד: {0}",
+    "Status:": "סטטוס: {0}",
+    "Read more": "קרא עוד",
+    "appriseInstalled": "Apprise מותקן.",
+    "appriseNotInstalled": "Apprise אינו מותקן. {0}",
+    "Access Token": "אסימון גישה",
+    "Channel access token": "אסימון גישה לערוץ",
+    "Line Developers Console": "קונסולת מפתחים",
+    "lineDevConsoleTo": "קו מפתחי קונסולת - {0}",
+    "Basic Settings": "הגדרות בסיסיות",
+    "User ID": "תעודת זהות של משתמש",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "תחילה גש ל-{0}, צור ספק וערוץ (Messaging API), לאחר מכן תוכל לקבל את אסימון הגישה לערוץ ומזהה המשתמש מפריטי התפריט שהוזכרו לעיל.",
+    "Icon URL": "כתובת אתר של סמל",
+    "aboutIconURL": "אתה יכול לספק קישור לתמונה ב\"כתובת URL של סמל\" כדי לעקוף את תמונת הפרופיל המוגדרת כברירת מחדל. לא ישמש אם Icon Emoji מוגדר.",
+    "aboutMattermostChannelName": "אתה יכול לעקוף את ערוץ ברירת המחדל שאליו ה-Webhook מפרסם על ידי הזנת שם הערוץ בשדה \"שם ערוץ\". זה צריך להיות מופעל בהגדרות Mattermos Webhook. לדוגמה: #ערוץ אחר",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - זול אך איטי ולעיתים עמוס מדי. מוגבל רק לנמענים פולנים.",
+    "promosmsTypeFlash": "SMS FLASH - ההודעה תוצג אוטומטית במכשיר הנמען. מוגבל לנמענים פולנים בלבד.",
+    "promosmsTypeFull": "SMS FULL - שכבת פרימיום של SMS, אתה יכול להשתמש בשם השולח שלך (עליך לרשום את השם תחילה). אמין להתראות.",
+    "promosmsTypeSpeed": "SMS SPEED - העדיפות הגבוהה ביותר במערכת. מאוד מהיר ואמין אבל יקר (בערך פי שניים ממחיר מלא של SMS).",
+    "promosmsPhoneNumber": "מספר טלפון (לנמען פולני ניתן לדלג על אזורי חיוג)",
+    "promosmsSMSSender": "שם שולח SMS: שם רשום מראש או אחת מברירות המחדל: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "כתובת האתר של שרת הבית (עם http(s):// ויציאה אופציונלית)",
+    "Internal Room Id": "מזהה חדר פנימי",
+    "matrixDesc1": "אתה יכול למצוא את מזהה החדר הפנימי על ידי עיון בחלק המתקדם של לקוח Matrix שלך בהגדרות החדר. זה צריך להיראות כמו !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "מומלץ מאוד ליצור משתמש חדש ולא להשתמש באסימון הגישה של משתמש מטריקס משלך שכן הוא יאפשר גישה מלאה לחשבון שלך ולכל החדרים שהצטרפת אליהם. במקום זאת, צור משתמש חדש והזמן אותו רק לחדר שבו תרצה לקבל את ההתראה. תוכל לקבל את אסימון הגישה על ידי הפעלת {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "כותרות הבקשה אינן JSON חוקיות:",
+    "BodyInvalidFormat": "גוף הבקשה אינו JSON חוקי:",
+    "Monitor History": "מעקב אחר היסטוריה",
+    "clearDataOlderThan": "שמור את נתוני היסטוריית הצג למשך {0} ימים.",
+    "PasswordsDoNotMatch": "סיסמאות לא תואמות.",
+    "records": "רשומות",
+    "One record": "שיא אחד",
+    "steamApiKeyDescription": "לניטור שרת משחקי Steam אתה צריך מפתח Steam Web-API. אתה יכול לרשום את מפתח ה-API שלך כאן:",
+    "Current User": "משתמש נוכחי",
+    "topic": "נושא",
+    "topicExplanation": "נושא MQTT למעקב",
+    "successMessage": "הודעת הצלחה",
+    "successMessageExplanation": "הודעת MQTT שתיחשב כהצלחה",
+    "recent": "לאחרונה",
+    "Done": "בוצע",
+    "Info": "מידע",
+    "Security": "אבטחה",
+    "Steam API Key": "מפתח API Steam",
+    "Shrink Database": "מסד נתונים מכווץ",
+    "Pick a RR-Type...": "בחר סוג RR ...",
+    "Pick Accepted Status Codes...": "בחר קודי סטטוס מקובלים ...",
+    "Default": "בְּרִירַת מֶחדָל",
+    "HTTP Options": "אפשרויות HTTP",
+    "Create Incident": "ליצור אירוע",
+    "Title": "כותרת",
+    "Content": "תוֹכֶן",
+    "Style": "Style",
+    "info": "מידע",
+    "warning": "אַזהָרָה",
+    "danger": "סַכָּנָה",
+    "error": "שְׁגִיאָה",
+    "critical": "קריטי",
+    "primary": "יְסוֹדִי",
+    "light": "אוֹר",
+    "dark": "אפל",
+    "Post": "הודעה",
+    "Please input title and content": "אנא הזן כותרת ותוכן",
+    "Created": "נוצר",
+    "Last Updated": "עודכן לאחרונה",
+    "Unpin": "ענן חוף",
+    "Switch to Light Theme": "לעבור לנושא האור",
+    "Switch to Dark Theme": "לעבור לנושא אפל",
+    "Show Tags": "Show Tags",
+    "Hide Tags": "הסתר תגיות",
+    "Description": "תיאור",
+    "No monitors available.": "אין צגים זמינים.",
+    "Add one": "הוסף אחד",
+    "No Monitors": "אין צגים",
+    "Untitled Group": "קבוצה ללא כותרת",
+    "Services": "שירותים",
+    "Discard": "להשליך",
+    "Cancel": "לְבַטֵל",
+    "Powered by": "פועל על",
+    "shrinkDatabaseDescription": "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "סיסמת API",
+    "serwersmsPhoneNumber": "מספר טלפון",
+    "serwersmsSenderName": "שם שולח SMS (רשום באמצעות פורטל לקוחות)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "מספרי טלפון)",
+    "smseagleGroup": "שם קבוצת ספר טלפונים",
+    "smseagleContact": "שם איש קשר בספר הטלפונים",
+    "smseagleRecipientType": "Rסוג הנמען",
+    "smseagleRecipient": "נמענים (ים) (יש להפריד בין מרובים לפסיק)",
+    "smseagleToken": "API Access Token",
+    "smseagleUrl": "כתובת האתר של מכשיר ה- SMSeagege שלך",
+    "smseagleEncoding": "שלח כ- Unicode",
+    "smseaglePriority": "עדיפות הודעה (0-9, ברירת מחדל = 0)",
+    "stackfield": "סטאקפילד",
+    "Customize": "התאמה אישית",
+    "Custom Footer": "כותרת תחתונה מותאמת אישית",
+    "Custom CSS": "CSS מותאם אישית",
+    "smtpDkimSettings": "הגדרות DKIM",
+    "smtpDkimDesc": "אנא עיין ב- NodeMailer DKIM {0} לשימוש.",
+    "documentation": "ווקיפדיית מדריכים",
+    "smtpDkimDomain": "שם דומיין",
+    "smtpDkimKeySelector": "בורר מפתח",
+    "smtpDkimPrivateKey": "טוראי של פרטיy",
+    "smtpDkimHashAlgo": "אלגוריתם hash (אופציונלי)",
+    "smtpDkimheaderFieldNames": "מפתחות כותרת לחתום (אופציונלי)",
+    "smtpDkimskipFields": "מפתחות כותרת לא לחתום (אופציונלי)",
+    "wayToGetPagerDutyKey": "אתה יכול להשיג זאת על ידי מעבר לשירות -> ספריית שירות -> (בחר שירות) -> אינטגרציות -> הוסף אינטגרציה.כאן תוכלו לחפש \"אירועים API v2 \".מידע נוסף {0}",
+    "Integration Key": "מפתח אינטגרציה",
+    "Integration URL": "URL אינטגרציה",
+    "Auto resolve or acknowledged": "פיתרון אוטומטי או הודה",
+    "do nothing": "לעשות כלום",
+    "auto acknowledged": "Auto הודה",
+    "auto resolve": "פתרון אוטומטי",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "נקודת קצה של API",
+    "alertaEnvironment": "סביבה",
+    "alertaApiKey": "מפתח API",
+    "alertaAlertState": "מצב התראה",
+    "alertaRecoverState": "לשחזר מדינה",
+    "deleteStatusPageMsg": "האם אתה בטוח רוצה למחוק את דף הסטטוס הזה?",
+    "Proxies": "Proxies",
+    "default": "בְּרִירַת מֶחדָל",
+    "enabled": "מופעל",
+    "setAsDefault": "נקבע כברירת מחדל",
+    "deleteProxyMsg": "האם אתה בטוח רוצה למחוק את הפרוקסי הזה לכל המסכים?",
+    "proxyDescription": "Proxies must be assigned to a monitor to function.",
+    "enableProxyDescription": "פרוקסי זה לא ישפיע על בקשות צג עד שהוא יופעל.אתה יכול לשלוט באופן זמני להשבית את ה- Proxy מכל המסכים לפי מצב ההפעלה.",
+    "setAsDefaultProxyDescription": "פרוקסי זה יופעל כברירת מחדל עבור צגים חדשים.אתה עדיין יכול להשבית את ה- Proxy בנפרד עבור כל צג.",
+    "Certificate Chain": "שרשרת אישורים",
+    "Valid": "תָקֵף",
+    "Invalid": "לא חוקי",
+    "AccessKeyId": "מזהה AccessKey",
+    "SecretAccessKey": "גישהלמפתחסוד",
+    "PhoneNumbers": "מספר טלפוןs",
+    "TemplateCode": "TemplateCode",
+    "SignName": "שם שם",
+    "Sms template must contain parameters: ": "תבנית SMS חייבת להכיל פרמטרים: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "מפתח סודי",
+    "For safety, must use secret key": "לבטיחות, חייב להשתמש במפתח סודיy",
+    "Device Token": "אסימון מכשיר",
+    "Platform": "פּלַטפוֹרמָה",
+    "iOS": "iOS",
+    "Android": "דְמוּי אָדָם",
+    "Huawei": "huawei",
+    "High": "High",
+    "Retry": "נסה שוב",
+    "Topic": "נוֹשֵׂא",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "הגדרת פרוקסי",
+    "Proxy Protocol": "פרוטוקול פרוקסי",
+    "Proxy Server": "שרת פרוקסי",
+    "Proxy server has authentication": "לשרת ה- Proxy יש אימות",
+    "User": "מִשׁתַמֵשׁ",
+    "Installed": "מוּתקָן",
+    "Not installed": "לא מותקן",
+    "Running": "רץ",
+    "Not running": "לא רץ",
+    "Remove Token": "הסר אסימון",
+    "Start": "הַתחָלָה",
+    "Stop": "תפסיק",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "הוסף דף סטטוס חדש",
+    "Slug": "Slug",
+    "Accept characters:": "קבל תווים:",
+    "startOrEndWithOnly": "התחל או סוף עם {0} בלבד",
+    "No consecutive dashes": "אין מקפים רצופים",
+    "Next": "הַבָּא",
+    "The slug is already taken. Please choose another slug.": "השבלול כבר נלקח.אנא בחר שבלול נוסף.",
+    "No Proxy": "אין פרוקסי",
+    "Authentication": "אבטחה",
+    "HTTP Basic Auth": "HTTP בסיסי Auth",
+    "New Status Page": "דף סטטוס חדש",
+    "Page Not Found": "הדף לא נמצא",
+    "Reverse Proxy": "פרוקסי הפוך",
+    "Backup": "גיבוי",
+    "About": "אודות",
+    "wayToGetCloudflaredURL": "(הורד את CloudFlared מ- {0})",
+    "cloudflareWebsite": "אתר CloudFlare",
+    "Message:": "הוֹדָעָה:",
+    "Don't know how to get the token? Please read the guide:": "לא יודע איך להשיג את האסימון?אנא קרא את המדריך:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "החיבור הנוכחי עשוי ללכת לאיבוד אם אתה מתחבר כרגע באמצעות מנהרת CloudFlare.האם אתה בטוח רוצה לעצור את זה?הקלד את הסיסמה הנוכחית שלך כדי לאשר אותה.",
+    "HTTP Headers": "כותרות HTTP",
+    "Trust Proxy": "אמון בפרוקסי",
+    "Other Software": "תוכנה אחרת",
+    "For example: nginx, Apache and Traefik.": "למשל: Nginx, Apache ו- Traefik.",
+    "Please read": "בבקשה תקרא",
+    "Subject:": "נושא:",
+    "Valid To:": "תקף ל:",
+    "Days Remaining:": "ימים שנותרו:",
+    "Issuer:": "המנפיק:",
+    "Fingerprint:": "טביעת אצבע:",
+    "No status pages": "אין דפי סטטוס",
+    "Domain Name Expiry Notification": "הודעה על תום שם תחום",
+    "Proxy": "פרוקסי",
+    "Date Created": "תאריך יצירה",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "כתובת HTTP של OneBot ",
+    "onebotMessageType": "סוג ההודעה OneBot",
+    "onebotGroupMessage": "קְבוּצָה",
+    "onebotPrivateMessage": "פְּרָטִי",
+    "onebotUserOrGroupId": "מזהה קבוצה/משתמש ",
+    "onebotSafetyTips": "לבטיחות, חייב לקבוע אסימון גישה ",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "טקסט כותרת תחתונה ",
+    "Show Powered By": "הצג מופעל על ידי ",
+    "Domain Names": "שמות דומיין ",
+    "signedInDisp": "חתום כ- {0} ",
+    "signedInDispDisabled": "Auth מושבת.",
+    "RadiusSecret": "רדיוס סוד",
+    "RadiusSecretDescription": "סוד משותף בין לקוח לשרת",
+    "RadiusCalledStationId": "נקרא מזהה תחנה",
+    "RadiusCalledStationIdDescription": "מזהה של המכשיר הנקרא ",
+    "RadiusCallingStationId": "מזהה תחנת שיחה ",
+    "RadiusCallingStationIdDescription": "מזהה של מכשיר השיחה ",
+    "Certificate Expiry Notification": "הודעת תפוגה של אישור",
+    "API Username": "שם משתמש API",
+    "API Key": "מפתח API",
+    "Recipient Number": "מספר הנמען",
+    "From Name/Number": "משם/מספר",
+    "Leave blank to use a shared sender number.": "השאר ריק כדי להשתמש במספר שולח משותף.",
+    "Octopush API Version": "גרסת API של תמנון",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "נקודת קצה",
+    "octopushAPIKey": "\"מפתח API \" מתוך תעודות API של HTTP בלוח הבקרה",
+    "octopushLogin": "\"כניסה \" מתעודות API של HTTP בלוח הבקרה",
+    "promosmsLogin": "שם כניסה של API",
+    "promosmsPassword": "סיסמת API",
+    "pushoversounds pushover": "Pushover (ברירת מחדל)",
+    "pushoversounds bike": "אופניים",
+    "pushoversounds bugle": "חֲצוֹצְרָה",
+    "pushoversounds cashregister": "קופה רושמת",
+    "pushoversounds classical": "קלַאסִי",
+    "pushoversounds cosmic": "קוֹסמִי",
+    "pushoversounds falling": "נופל",
+    "pushoversounds gamelan": "gamelan",
+    "pushoversounds incoming": "נִכנָס",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "קֶסֶם",
+    "pushoversounds mechanical": "מֵכָנִי",
+    "pushoversounds pianobar": "בר פסנתר",
+    "pushoversounds siren": "סִירֶנָה",
+    "pushoversounds spacealarm": "אזעקת חלל",
+    "pushoversounds tugboat": "סירת משיכה",
+    "pushoversounds alien": "אזעקת חייזרים (ארוכה)",
+    "pushoversounds climb": "לטפס (ארוך)",
+    "pushoversounds persistent": "מתמיד (ארוך)",
+    "pushoversounds echo": "הד Pushover (ארוך)",
+    "pushoversounds updown": "למעלה (ארוך)",
+    "pushoversounds vibrate": "לרטוט בלבד",
+    "pushoversounds none": "אף אחד (שקט)",
+    "pushyAPIKey": "מפתח API סודי",
+    "pushyToken": "אסימון מכשיר",
+    "Show update if available": "הצג עדכון אם זמין",
+    "Also check beta release": "בדוק גם את שחרור הבטא",
+    "Using a Reverse Proxy?": "באמצעות פרוקסי הפוך?",
+    "Check how to config it for WebSocket": "בדוק כיצד להגדיר אותו ל- WebSocket",
+    "Steam Game Server": "שרת משחק קיטור",
+    "Most likely causes:": "ככל הנראה גורם:",
+    "The resource is no longer available.": "המשאב כבר לא זמין.",
+    "There might be a typing error in the address.": "יתכן שיש שגיאת הקלדה בכתובת.",
+    "What you can try:": "מה שאתה יכול לנסות:",
+    "Retype the address.": "הקלד מחדש את הכתובת.",
+    "Go back to the previous page.": "חזור לדף הקודם.",
+    "Coming Soon": "בקרוב",
+    "wayToGetClickSendSMSToken": "אתה יכול לקבל שם משתמש API ומפתח API מ- {0}.",
+    "Connection String": "מחרוזת חיבור",
+    "Query": "שאילתא",
+    "settingsCertificateExpiry": "תפוגת תעודת TLS",
+    "certificationExpiryDescription": "HTTPS עוקב אחר התראה על התראה כאשר תעודת TLS פגה ב:",
+    "Setup Docker Host": "הגדרת מארח Docker",
+    "Connection Type": "סוג חיבור",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "האם אתה בטוח רוצה למחוק את המארח של Docker לכל המוניטורים?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "מיכל Docker",
+    "Container Name / ID": "שם מכולה / מזהה",
+    "Docker Host": "מארח דוקר",
+    "Docker Hosts": "מארחי Docker",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "תְחוּם",
+    "Workstation": "עמדת עבודה",
+    "disableCloudflaredNoAuthMsg": "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.",
+    "trustProxyDescription": "סמוך על כותרות 'x-forwarded-*'.אם אתה רוצה להשיג את ה- IP של הלקוח הנכון וה- Uptime Kuma שלך מאחור כמו Nginx או Apache, עליך לאפשר זאת.",
+    "wayToGetLineNotifyToken": "אתה יכול לקבל אסימון גישה מ- {0}",
+    "Examples": "דוגמאות",
+    "Home Assistant URL": "כתובת URL עוזרת ביתית",
+    "Long-Lived Access Token": "אסימון גישה ארוכת שנים",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "ניתן ליצור אסימון גישה לאורך זמן על ידי לחיצה על שם הפרופיל שלך (שמאל למטה) וגלילה לתחתית ואז לחץ על צור אסימון. ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "default: notify all devices",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "רשימה של שירותי הודעה ניתן למצוא בעוזר הבית תחת \"כלי מפתחים> שירותים \" חפש \"הודעה \" כדי למצוא את שם המכשיר/טלפון שלך.",
+    "Automations can optionally be triggered in Home Assistant:": "אוטומציות יכולות להיות מופעלות באופן אופציונלי לעוזר הבית:",
+    "Trigger type:": "סוג ההדק:",
+    "Event type:": "סוג אירוע:",
+    "Event data:": "נתוני אירועים:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "ואז בחר פעולה, למשל העבר את הסצינה למקום בו אור RGB הוא אדום.",
+    "Frontend Version": "גרסת Frontend",
+    "Frontend Version do not match backend version!": "גרסת Frontend לא תואמת את גרסת Backend!",
+    "Base URL": "Base URL",
+    "goAlertInfo": "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}",
+    "goAlertIntegrationKeyInfo": "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "מיושם: מכיוון שהרבה תכונות שנוספו ותכונת הגיבוי הזו מעט לא מצומצמת, היא לא יכולה לייצר או לשחזר גיבוי שלם.",
+    "backupRecommend": "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.",
+    "Optional": "אופציונאלי",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "מסמכי API של SmsManager ",
+    "Gateway Type": "סוג שער",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "אתה יכול לחלק מספרים עם",
+    "or": "אוֹ",
+    "recurringInterval": "הפסקה",
+    "Recurring": "מחזורי",
+    "strategyManual": "פעיל/לא פעיל באופן ידני",
+    "warningTimezone": "זה משתמש באזור הזמן של השרת",
+    "weekdayShortMon": "שני",
+    "weekdayShortTue": "שלישי",
+    "weekdayShortWed": "רביעי",
+    "weekdayShortThu": "חמישי",
+    "weekdayShortFri": "שישי",
+    "weekdayShortSat": "שבת",
+    "weekdayShortSun": "ראשון",
+    "dayOfWeek": "יום בשבוע",
+    "dayOfMonth": "יום בחודש",
+    "lastDay": "Last Day",
+    "lastDay1": "היום האחרון של החודש",
+    "lastDay2": "יום שני האחרון של החודש",
+    "lastDay3": "יום 3 האחרון של החודש",
+    "lastDay4": "היום הרביעי האחרון בחודש",
+    "No Maintenance": "אין תחזוקה",
+    "pauseMaintenanceMsg": "האם אתה בטוח רוצה להשהות?",
+    "maintenanceStatus-under-maintenance": "מתבצעות עבודות תחזוקה",
+    "maintenanceStatus-inactive": "לא פעיל",
+    "maintenanceStatus-scheduled": "מתוזמן",
+    "maintenanceStatus-ended": "הסתיים",
+    "maintenanceStatus-unknown": "לא ידוע",
+    "Display Timezone": "הצג אזור זמן",
+    "Server Timezone": "אזור זמן של שרת",
+    "statusPageMaintenanceEndDate": "סוך",
+    "IconUrl": "קישור לתמונת אייקון",
+    "Enable DNS Cache": "הפעל מטמון DNS",
+    "Enable": "הפעל",
+    "Disable": "השבת",
+    "dnsCacheDescription": "ייתכן שהוא לא עובד בסביבות IPv6 מסוימות, השבת אותו אם אתה נתקל בבעיות כלשהן.",
+    "Single Maintenance Window": "חלון תחזוקה בודד",
+    "Maintenance Time Window of a Day": "חלון זמן תחזוקה ביום",
+    "Effective Date Range": "טווח תאריכים אפקטיבי",
+    "Schedule Maintenance": "לוח זמנים לתחזוקה",
+    "Date and Time": "תאריך ושעה",
+    "DateTime Range": "טווח תאריכים וזמן",
+    "Strategy": "אסטרטגיה",
+    "Free Mobile User Identifier": "מזהה משתמש נייד בחינם",
+    "Free Mobile API Key": "מפתח API חינם לנייד",
+    "Enable TLS": "אפשר TLS",
+    "Proto Service Name": "שם שירות פרוטו",
+    "Proto Method": "שיטת פרוטו",
+    "Proto Content": "תוכן פרוטו",
+    "Economy": "חיסכון",
+    "Lowcost": "זול",
+    "high": "גבוהה",
+    "General Monitor Type": "מוניטור כללי",
+    "Passive Monitor Type": "מוניטור פסיבי",
+    "Specific Monitor Type": "סוג מוניטור ספציפי"
+}
diff --git a/src/lang/hr-HR.json b/src/lang/hr-HR.json
new file mode 100644
index 00000000..417b689e
--- /dev/null
+++ b/src/lang/hr-HR.json
@@ -0,0 +1,581 @@
+{
+    "languageName": "Hrvatski",
+    "checkEverySecond": "Provjera svake {0} sekunde",
+    "retryCheckEverySecond": "Ponovni pokušaj svake {0} sekunde",
+    "retriesDescription": "Broj ponovnih pokušaja prije nego će se servis označiti kao nedostupan te poslati obavijest",
+    "ignoreTLSError": "Ignoriraj TLS/SSL pogreške za HTTPS web stranice",
+    "upsideDownModeDescription": "Preokreni logiku statusa. Ako se primi pozitivan odgovor, smatra se da je usluga nedostupna.",
+    "maxRedirectDescription": "Maksimalan broj preusmjeravanja. Postaviti na 0 kako bi se preusmjeravanja onemogućila.",
+    "acceptedStatusCodesDescription": "Odaberite statusne kodove koji se smatraju uspješnim odgovorom.",
+    "passwordNotMatchMsg": "Lozinke se ne poklapaju.",
+    "notificationDescription": "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.",
+    "keywordDescription": "Ključna riječ za pretragu, u obliku običnog HTML-a ili u JSON formatu. Pretraga je osjetljiva na velika i mala slova.",
+    "deleteMonitorMsg": "Jeste li sigurni da želite izbrisati monitor?",
+    "deleteNotificationMsg": "Jeste li sigurni da želite izbrisati ovu obavijest za sve monitore?",
+    "resolverserverDescription": "Cloudflare je zadani DNS poslužitelj. Možete to promijeniti u bilo kojem trenutku.",
+    "rrtypeDescription": "Odaberite vrstu DNS zapisa o resursu kojeg želite pratiti",
+    "pauseMonitorMsg": "Jeste li sigurni da želite pauzirati?",
+    "enableDefaultNotificationDescription": "Ova će obavijesti biti omogućena za sve nove monitore. Možete ju ručno onemogućiti za pojedini monitor.",
+    "clearEventsMsg": "Jeste li sigurni da želite izbrisati sve zapise o događajima za ovaj monitor?",
+    "clearHeartbeatsMsg": "Jeste li sigurni da želite izbrisati sve zapise o provjerama za ovaj monitor?",
+    "confirmClearStatisticsMsg": "Jeste li sigurni da želite izbrisati SVE statistike?",
+    "importHandleDescription": "Odaberite opciju \"Preskoči postojeće\" ako želite preskočiti uvoz postojećih monitora i obavijesti ako dođe do poklapanja u imenu. Opcija \"Prepiši\" će izbrisati postojeće monitore i obavijesti.",
+    "confirmImportMsg": "Jeste li sigurni da želite pokrenuti uvoz? Provjerite jeste li odabrali ispravnu opciju uvoza.",
+    "twoFAVerifyLabel": "Unesite svoj 2FA token:",
+    "tokenValidSettingsMsg": "Token je važeći! Sada možete spremiti postavke dvofaktorske autentikacije.",
+    "confirmEnableTwoFAMsg": "Želite li omogućiti dvofaktorsku autentikaciju?",
+    "confirmDisableTwoFAMsg": "Jeste li sigurni da želite onemogućiti dvofaktorsku autentikaciju?",
+    "Settings": "Postavke",
+    "Dashboard": "Kontrolna ploča",
+    "New Update": "Novo ažuriranje",
+    "Language": "Jezik",
+    "Appearance": "Izgled",
+    "Theme": "Tema",
+    "General": "Općenito",
+    "Primary Base URL": "Osnovni URL",
+    "Version": "Inačica",
+    "Check Update On GitHub": "Provjeri dostupnost nove inačice na GitHubu",
+    "List": "Popis",
+    "Add": "Dodaj",
+    "Add New Monitor": "Dodaj novi Monitor",
+    "Quick Stats": "Statistika",
+    "Up": "Dostupno",
+    "Down": "Nedostupno",
+    "Pending": "U tijeku",
+    "Unknown": "Nepoznato",
+    "pauseDashboardHome": "Pauzirano",
+    "Name": "Naziv",
+    "Status": "Status",
+    "DateTime": "Vremenska oznaka",
+    "Message": "Izvještaj",
+    "No important events": "Nema važnih događaja",
+    "Pause": "Pauziraj",
+    "Resume": "Nastavi",
+    "Edit": "Uredi",
+    "Delete": "Obriši",
+    "Current": "Trenutno",
+    "Uptime": "Dostupnost",
+    "Cert Exp.": "Istek cert.",
+    "day": "dan | dana",
+    "-day": "-dnevno",
+    "hour": "sat",
+    "-hour": "-satno",
+    "Response": "Odgovor",
+    "Ping": "Odziv",
+    "Monitor Type": "Vrsta Monitora",
+    "Keyword": "Ključna riječ",
+    "Friendly Name": "Prilagođen naziv",
+    "URL": "URL",
+    "Hostname": "Domaćin",
+    "Port": "Port",
+    "Heartbeat Interval": "Interval provjere",
+    "Retries": "Broj ponovnih pokušaja",
+    "Heartbeat Retry Interval": "Interval ponovnih pokušaja",
+    "Advanced": "Napredne postavke",
+    "Upside Down Mode": "Obrnuti način",
+    "Max. Redirects": "Maksimalan broj preusmjeravanja",
+    "Accepted Status Codes": "Prihvaćeni statusni kodovi",
+    "Push URL": "Push URL",
+    "needPushEvery": "Potrebno je slati zahtjeve na URL svakih {0} sekundi.",
+    "pushOptionalParams": "Neobavezni parametri: {0}",
+    "Save": "Spremi",
+    "Notifications": "Obavijesti",
+    "Not available, please setup.": "Nije dostupno, potrebno je dodati novu stavku.",
+    "Setup Notification": "Dodaj obavijest",
+    "Light": "Svijetli način",
+    "Dark": "Tamni način",
+    "Auto": "Automatski",
+    "Theme - Heartbeat Bar": "Tema za traku dostupnosti",
+    "Normal": "Normalno",
+    "Bottom": "Ispod",
+    "None": "Isključeno",
+    "Timezone": "Vremenska zona",
+    "Search Engine Visibility": "Vidljivost tražilicama",
+    "Allow indexing": "Dopusti indeksiranje",
+    "Discourage search engines from indexing site": "Sprječavanje indeksiranja",
+    "Change Password": "Promjena lozinke",
+    "Current Password": "Trenutna lozinka",
+    "New Password": "Nova lozinka",
+    "Repeat New Password": "Potvrdite novu lozinku",
+    "Update Password": "Spremi novu lozinku",
+    "Disable Auth": "Onemogući autentikaciju",
+    "Enable Auth": "Omogući autentikaciju",
+    "disableauth.message1": "Jeste li sigurni da želite <strong>isključiti autentikaciju</strong>?",
+    "disableauth.message2": "To je za <strong>korisnike koji imaju vanjsku autentikaciju stranice</strong> ispred Uptime Kume, poput usluge Cloudflare Access.",
+    "Please use this option carefully!": "Pažljivo koristite ovu opciju.",
+    "Logout": "Odjava",
+    "Leave": "Poništi",
+    "I understand, please disable": "Razumijem, svejedno onemogući",
+    "Confirm": "Potvrda",
+    "Yes": "Da",
+    "No": "Ne",
+    "Username": "Korisničko ime",
+    "Password": "Lozinka",
+    "Remember me": "Zapamti me",
+    "Login": "Prijava",
+    "No Monitors, please": "Nema monitora, ",
+    "add one": "dodaj jedan",
+    "Notification Type": "Tip obavijesti",
+    "Email": "E-pošta",
+    "Test": "Testiraj",
+    "Certificate Info": "Informacije o certifikatu",
+    "Resolver Server": "DNS poslužitelj",
+    "Resource Record Type": "Vrsta DNS zapisa",
+    "Last Result": "Posljednji rezultat",
+    "Create your admin account": "Stvori administratorski račun",
+    "Repeat Password": "Potvrda lozinke",
+    "Import Backup": "Uvoz sigurnosne kopije",
+    "Export Backup": "Izvoz sigurnosne kopije",
+    "Export": "Izvoz",
+    "Import": "Uvoz",
+    "respTime": "Vrijeme odgovora (ms)",
+    "notAvailableShort": "ne postoji",
+    "Default enabled": "Omogući za nove monitore",
+    "Apply on all existing monitors": "Primijeni na postojeće monitore",
+    "Create": "Kreiraj",
+    "Clear Data": "Obriši podatke",
+    "Events": "Događaji",
+    "Heartbeats": "Provjere",
+    "Auto Get": "Automatski dohvat",
+    "backupDescription": "Moguće je napraviti sigurnosnu kopiju svih monitora i obavijesti koja će biti spremljena kao JSON datoteka.",
+    "backupDescription2": "Napomena: povijest i podaci o događajima nisu uključeni u sigurnosnu kopiju.",
+    "backupDescription3": "Osjetljivi podaci poput tokena za obavijesti uključeni su u sigurnosnu kopiju. Zato je potrebno čuvati izvoz na sigurnom mjestu.",
+    "alertNoFile": "Datoteka za uvoz nije odabrana.",
+    "alertWrongFileType": "Datoteka za uvoz nije u JSON formatu.",
+    "Clear all statistics": "Obriši sve statistike",
+    "Skip existing": "Preskoči postojeće",
+    "Overwrite": "Prepiši",
+    "Options": "Opcije",
+    "Keep both": "Zadrži sve",
+    "Verify Token": "Provjeri Token",
+    "Setup 2FA": "Postavi dvofaktorsku autentikaciju",
+    "Enable 2FA": "Omogući dvofaktorsku autentikaciju",
+    "Disable 2FA": "Onemogući dvofaktorsku autentikaciju",
+    "2FA Settings": "Postavke 2FA",
+    "Two Factor Authentication": "Dvofaktorska autentikacija",
+    "Active": "Aktivna",
+    "Inactive": "Neaktivno",
+    "Token": "Token",
+    "Show URI": "Pokaži URI",
+    "Tags": "Oznake",
+    "Add New below or Select...": "Dodajte novu oznaku ispod ili odaberite...",
+    "Tag with this name already exist.": "Oznaka s tim nazivom već postoji",
+    "Tag with this value already exist.": "Oznaka s tom vrijednošću već postoji.",
+    "color": "Boja",
+    "value (optional)": "Vrijednost (neobavezno)",
+    "Gray": "Siva",
+    "Red": "Crvena",
+    "Orange": "Narančasta",
+    "Green": "Zelena",
+    "Blue": "Plava",
+    "Indigo": "Indigo",
+    "Purple": "Ljubičasta",
+    "Pink": "Ružičasta",
+    "Search...": "Pretraga...",
+    "Avg. Ping": "Prosječni odziv",
+    "Avg. Response": "Prosječni odgovor",
+    "Entry Page": "Početna stranica",
+    "statusPageNothing": "Ovdje nema ničega, dodajte grupu ili monitor.",
+    "No Services": "Nema usluga",
+    "All Systems Operational": "Svi sustavi su operativni",
+    "Partially Degraded Service": "Usluga djelomično nedostupna",
+    "Degraded Service": "Usluga nedostupna",
+    "Add Group": "Dodaj grupu",
+    "Add a monitor": "Dodaj monitor",
+    "Edit Status Page": "Uredi Statusnu stranicu",
+    "Go to Dashboard": "Na Kontrolnu ploču",
+    "Status Page": "Statusna stranica",
+    "Status Pages": "Statusne stranice",
+    "defaultNotificationName": "Moja {number}. {notification} obavijest",
+    "here": "ovdje",
+    "Required": "Potrebno",
+    "telegram": "Telegram",
+    "Bot Token": "Token bota",
+    "wayToGetTelegramToken": "Token možete nabaviti preko {0}.",
+    "Chat ID": "ID razgovora",
+    "supportTelegramChatID": "Podržani su ID-jevi izravnih razgovora, grupa i kanala",
+    "wayToGetTelegramChatID": "ID razgovora možete saznati tako da botu pošaljete poruku te odete na ovaj URL:",
+    "YOUR BOT TOKEN HERE": "OVDJE IDE TOKEN BOTA",
+    "chatIDNotFound": "ID razgovora nije pronađen; prvo morate poslati poruku botu",
+    "webhook": "Webhook",
+    "Post URL": "URL Post zahtjeva",
+    "Content Type": "Tip sadržaja (Content Type)",
+    "webhookJsonDesc": "{0} je dobra opcija za moderne HTTP poslužitelje poput Express.js-a",
+    "webhookFormDataDesc": "{multipart} je moguća alternativa za PHP, samo je potrebno parsirati JSON koristeći {decodeFunction}",
+    "smtp": "E-mail (SMTP)",
+    "secureOptionNone": "Bez sigurnosti / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignoriraj greške TLS-a",
+    "From Email": "Adresa za \"From\" polje",
+    "emailCustomSubject": "Prilagođeno \"Subject\" polje",
+    "To Email": "Odredišne adrese e-pošte",
+    "smtpCC": "Cc",
+    "smtpBCC": "Bcc",
+    "discord": "Discord",
+    "Discord Webhook URL": "URL Discord webhooka",
+    "wayToGetDiscordURL": "Ovo možete dobiti tako da odete na Postavke servera -> Integracije -> Napravi webhook",
+    "Bot Display Name": "Nadimak Bota unutar servera",
+    "Prefix Custom Message": "Prefiks prilagođene poruke",
+    "Hello @everyone is...": "Pozdrav {'@'}everyone...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL webhooka",
+    "wayToGetTeamsURL": "Više informacija o Teams webhookovima možete pročitati {0}.",
+    "signal": "Signal",
+    "Number": "Broj",
+    "Recipients": "Primatelji",
+    "needSignalAPI": "Potreban je klijent s REST sučeljem.",
+    "wayToCheckSignalURL": "Više informacija o postavljanju Signal klijenta:",
+    "signalImportant": "VAŽNO: Grupe i brojevi se ne mogu istovremeno koristiti kao primatelji!",
+    "gotify": "Gotify",
+    "Application Token": "Token Aplikacije",
+    "Server URL": "URL poslužitelja",
+    "Priority": "Prioritet",
+    "slack": "Slack",
+    "Icon Emoji": "Emotikon",
+    "Channel Name": "Naziv kanala",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Dodatne informacije o webhookovima su dostupne na: {0}",
+    "aboutChannelName": "Unesite ime {0} kanala u polju Naziv kanala ako želite zaobići webhook kanal. Primjerice: #neki-kanal",
+    "aboutKumaURL": "Ako je polje \"Uptime Kuma URL\" prazno, koristi se zadana vrijednost koja vodi na GitHub stranicu projekta.",
+    "emojiCheatSheet": "Popis emotikona: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Podržava preko 50 usluga za obavijesti)",
+    "pushbullet": "Pushbullet",
+    "line": "LINE",
+    "mattermost": "Mattermost",
+    "User Key": "Korisnički ključ",
+    "Device": "Uređaji",
+    "Message Title": "Naslov poruke",
+    "Notification Sound": "Zvuk obavijesti",
+    "More info on:": "Više informacija na: {0}",
+    "pushoverDesc1": "Hitni prioritet (2) ima zadani istek vremena od 30 sekundi između ponovnih pokušaja te će isteći nakon 1 sata.",
+    "pushoverDesc2": "Ako želite slati obavijesti na više uređaja, ispunite polje \"Uređaji\".",
+    "SMS Type": "Tip SMS-a",
+    "octopushTypePremium": "Premium (Brzo - preporučeno za obavijesti)",
+    "octopushTypeLowCost": "Low Cost (Sporo - mobilni operateri ponekad blokiraju ove poruke)",
+    "checkPrice": "Provjerite {0} cijene:",
+    "apiCredentials": "Vjerodajnice za API",
+    "octopushLegacyHint": "Koristite li staru inačicu usluge Octopush (2011-2020) ili noviju inačicu?",
+    "Check octopush prices": "Provjerite cijene usluge Octopush {0}.",
+    "octopushPhoneNumber": "Telefonski broj (međunarodni format, primjerice: +38512345678) ",
+    "octopushSMSSender": "Naziv SMS pošiljatelja : 3-11 alfanumeričkih znakova i razmak (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea ID Uređaja",
+    "Apprise URL": "URL usluge Apprise",
+    "Example:": "Primjerice: {0}",
+    "Read more:": "Pročitajte više: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Pročitaj više",
+    "appriseInstalled": "Apprise je instaliran.",
+    "appriseNotInstalled": "Apprise nije instaliran. {0}",
+    "Access Token": "Pristupni token",
+    "Channel access token": "Token za pristup kanalu",
+    "Line Developers Console": "LINE razvojnoj konzoli",
+    "lineDevConsoleTo": "LINE razvojna konzola - {0}",
+    "Basic Settings": "Osnovne Postavke",
+    "User ID": "Korisnički ID",
+    "Messaging API": "API za razmjenu poruka",
+    "wayToGetLineChannelToken": "Prvo, pristupite {0}, kreirajte pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti token za pristup kanalu te korisnički ID za polja iznad.",
+    "Icon URL": "URL slike",
+    "aboutIconURL": "Možete postaviti poveznicu na sliku u polju \"URL slike\" kako biste spriječili korištenje zadane slike. Ovo se polje neće koristiti ako je postavljeno polje \"Emotikon\".",
+    "aboutMattermostChannelName": "Možete promijeniti kanal u kojeg webhook šalje tako da ispunite polje \"Naziv kanala\". Ta opcija mora biti omogućena unutar Mattermost postavki za webhook. Primjerice: #neki-kanal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - jeftina, ali spora opcija koja je često preopterećena. Ograničeno samo na primatelje unutar Poljske.",
+    "promosmsTypeFlash": "SMS FLASH - Poruka se automatski pojavljuje na uređaju primatelja. Ograničeno samo na primatelje unutar Poljske.",
+    "promosmsTypeFull": "SMS FULL - Premium razina usluge, dozvoljava postavljanje naziva SMS pošiljatelja (Naziv mora biti registriran). Usluga pouzdana za obavijesti.",
+    "promosmsTypeSpeed": "SMS SPEED - Usluga najvećeg prioriteta. Brza i pouzdana, ali skupa (otprilike dvostruko skuplja od cijene usluge SMS FULL).",
+    "promosmsPhoneNumber": "Telefonski broj (za primatelje unutar Poljske nije potrebno navoditi pozivni broj države)",
+    "promosmsSMSSender": "Naziv SMS pošiljatelja: Registriran naziv ili jedan od zadanih: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu URL webhooka",
+    "matrixHomeserverURL": "URL Matrix homeservera (uključujući http(s):// te port, ako je potrebno)",
+    "Internal Room Id": "Interni ID sobe",
+    "matrixDesc1": "Interni ID sobe se može pronaći u naprednim postavkama sobe unutar Matrix klijenta. ID sobe nalikuje idućem zapisu: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Preporučuje se stvaranje novog korisnika te suzdržavanje od korištenja pristupnog tokena vlastitog Matrix korisnika. Novog korisnika potrebno je dodati u sobe u kojima želite primati obavijesti. Pristupni token možete dobiti pokretanjem naredbe {0}",
+    "Method": "Metoda",
+    "Body": "Tijelo",
+    "Headers": "Zaglavlja",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Zaglavlja nisu nije valjani JSON: ",
+    "BodyInvalidFormat": "Tijelo zahtjeva nije valjani JSON: ",
+    "Monitor History": "Povijest monitora",
+    "clearDataOlderThan": "Podaci o povijesti monitora čuvaju se {0} dana.",
+    "PasswordsDoNotMatch": "Lozinke se ne poklapaju.",
+    "records": "zapisa",
+    "One record": "Jedan zapis",
+    "Showing {from} to {to} of {count} records": "Prikaz zapisa {from}-{to} od sveukupno {count}",
+    "steamApiKeyDescription": "Za praćenje Steam poslužitelja za igru, potrebno je imati Steam Web-API ključ. Možete registrirati vlastiti ključ ovdje: ",
+    "Current User": "Trenutni korisnik",
+    "recent": "Nedavno",
+    "Done": "Gotovo",
+    "Info": "Informacije",
+    "Security": "Sigurnost",
+    "Shrink Database": "Smanji bazu podataka",
+    "Pick a RR-Type...": "Odaberite vrstu DNS zapisa od navedenih...",
+    "Pick Accepted Status Codes...": "Odaberite HTTP statusne kodove koji će biti prihvaćeni...",
+    "Steam API Key": "Steam API ključ",
+    "Default": "Zadano",
+    "HTTP Options": "HTTP Postavke",
+    "Create Incident": "Novi izvještaj o incidentu",
+    "Title": "Naslov",
+    "Content": "Sadržaj",
+    "Style": "Stil",
+    "info": "informacija",
+    "warning": "upozorenje",
+    "danger": "opasnost",
+    "primary": "primarno",
+    "light": "svijetlo",
+    "dark": "tamno",
+    "Post": "Objavi",
+    "Created": "Stvoreno",
+    "Last Updated": "Uređeno",
+    "Please input title and content": "Naslov i sadržaj ne mogu biti prazni",
+    "Unpin": "Ukloni",
+    "Switch to Light Theme": "Prebaci na svijetli način",
+    "Switch to Dark Theme": "Prebaci na tamni način",
+    "Show Tags": "Pokaži oznake",
+    "Hide Tags": "Sakrij oznake",
+    "Description": "Opis",
+    "No monitors available.": "Nema dostupnih monitora.",
+    "Add one": "Stvori jednog",
+    "No Monitors": "Bez monitora",
+    "Untitled Group": "Bezimena grupa",
+    "Services": "Usluge",
+    "Discard": "Odbaci",
+    "Cancel": "Otkaži",
+    "Powered by": "Pokreće",
+    "Saved": "Spremljeno",
+    "PushByTechulus": "Push by Techulus",
+    "GoogleChat": "Google Chat (preko platforme Google Workspace)",
+    "shrinkDatabaseDescription": "Pokreni VACUUM operaciju za SQLite. Ako je baza podataka kreirana nakon inačice 1.10.0, AUTO_VACUUM opcija već je uključena te ova akcija nije nužna.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API korisničko ime (uključujući webapi_ prefiks)",
+    "serwersmsAPIPassword": "API lozinka",
+    "serwersmsPhoneNumber": "Broj telefona",
+    "serwersmsSenderName": "Ime SMS pošiljatelja (registrirano preko korisničkog portala)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM postavke",
+    "smtpDkimDesc": "Za više informacija, postoji Nodemailer DKIM {0}.",
+    "documentation": "dokumentacija",
+    "smtpDkimDomain": "Domena",
+    "smtpDkimKeySelector": "Odabir ključa",
+    "smtpDkimPrivateKey": "Privatni ključ",
+    "smtpDkimHashAlgo": "Hash algoritam (neobavezno)",
+    "smtpDkimheaderFieldNames": "Ključevi zaglavlja za potpis (neobavezno)",
+    "smtpDkimskipFields": "Ključevi zaglavlja koji se neće potpisati (neobavezno)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Krajnja točka API-ja (Endpoint)",
+    "alertaEnvironment": "Okruženje (Environment)",
+    "alertaApiKey": "API ključ",
+    "alertaAlertState": "Stanje upozorenja",
+    "alertaRecoverState": "Stanje oporavka",
+    "deleteStatusPageMsg": "Sigurno želite obrisati ovu statusnu stranicu?",
+    "resendEveryXTimes": "Ponovno pošalji svakih {0} puta",
+    "resendDisabled": "Ponovno slanje je onemogućeno",
+    "dnsPortDescription": "Port DNS poslužitelja. Zadana vrijednost je 53. Moguće je promijeniti ga u svakom trenutku.",
+    "Resend Notification if Down X times consequently": "Ponovno pošalji obavijest ako je usluga nedostupna više puta zaredom",
+    "topic": "Tema",
+    "topicExplanation": "MQTT tema koja će se monitorirati",
+    "successMessage": "Poruka o uspjehu",
+    "successMessageExplanation": "MQTT poruka koja se smatra uspješnom",
+    "error": "greška",
+    "critical": "kritično",
+    "Customize": "Customize",
+    "Custom Footer": "Prilagođeno podnožje",
+    "Custom CSS": "Prilagođeni CSS",
+    "wayToGetPagerDutyKey": "Ključ možete dobiti odlaskom na \"Service -> Service Directory -> (Odabrani servis) -> Integrations -> Add integration\". Ovdje pretražite za \"Events API V2\". Više informacija {0}",
+    "Integration Key": "Ključ integracije",
+    "Integration URL": "URL integracije",
+    "Auto resolve or acknowledged": "Automatsko razrješavanje i priznavanje",
+    "do nothing": "Ne radi ništa",
+    "auto acknowledged": "Automatsko priznavanje",
+    "auto resolve": "Automatsko razrješavanje",
+    "Proxies": "Proxy poslužitelji",
+    "default": "Zadano",
+    "enabled": "Omogućeno",
+    "setAsDefault": "Postavi kao zadano",
+    "deleteProxyMsg": "Sigurno želite obrisati ovaj proxy za sve monitore?",
+    "proxyDescription": "Proxy poslužitelji moraju biti dodijeljni monitoru kako bi funkcionirali.",
+    "enableProxyDescription": "Onemogućeni proxy poslužitelj neće imati učinak na zahtjeve monitora. Možete privremeno onemogućiti proxy poslužitelja za sve monitore.",
+    "setAsDefaultProxyDescription": "Ovaj proxy poslužitelj bit će odmah omogućen za nove monitore. I dalje ga možete onemogućiti za svaki monitor zasebno.",
+    "Certificate Chain": "Lanac certifikata",
+    "Valid": "Važeći",
+    "Invalid": "Nevažeći",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey tajni ključ",
+    "PhoneNumbers": "Telefonski brojevi",
+    "TemplateCode": "Predložak koda",
+    "SignName": "Potpis",
+    "Sms template must contain parameters: ": "SMS predložak mora sadržavati parametre: ",
+    "Bark Endpoint": "Bark krajnja točka (endpoint)",
+    "Bark Group": "Bark grupa",
+    "Bark Sound": "Bark zvuk",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "Tajni ključ",
+    "For safety, must use secret key": "Korištenje tajnog ključa je obavezno",
+    "Device Token": "Token uređaja",
+    "Platform": "Platforma",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Visoko",
+    "Retry": "Ponovnih pokušaja",
+    "Topic": "Tema",
+    "WeCom Bot Key": "WeCom ključ Bota",
+    "Setup Proxy": "Dodaj proxy poslužitelj",
+    "Proxy Protocol": "Protokol",
+    "Proxy Server": "Proxy poslužitelj",
+    "Proxy server has authentication": "Proxy poslužitelj ima autentikaciju",
+    "User": "Korisnik",
+    "Installed": "Instalirano",
+    "Not installed": "Nije instalirano",
+    "Running": "Pokrenuto",
+    "Not running": "Nije pokrenuto",
+    "Remove Token": "Ukloni Token",
+    "Start": "Pokreni",
+    "Stop": "Zaustavi",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Dodaj novu statusnu stranicu",
+    "Slug": "Slug",
+    "Accept characters:": "Dozvoljeni znakovi:",
+    "startOrEndWithOnly": "Započinje ili završava znakovima {0}",
+    "No consecutive dashes": "Bez uzastopnih povlaka",
+    "Next": "Sljedeće",
+    "The slug is already taken. Please choose another slug.": "Slug je zauzet. Odaberite novi slug.",
+    "No Proxy": "Bez proxy poslužitelja",
+    "Authentication": "Autentikacija",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Dodaj statusnu stranicu",
+    "Page Not Found": "Stranica nije pronađena",
+    "Reverse Proxy": "Reverzni proxy",
+    "Backup": "Sigurnosno kopiranje",
+    "About": "O Uptime Kumi",
+    "wayToGetCloudflaredURL": "(Preuzmite cloudflared s {0})",
+    "cloudflareWebsite": "Cloudflare web stranice",
+    "Message:": "Poruka:",
+    "Don't know how to get the token? Please read the guide:": "Ne znate kako doći do tokena? Pročitajte vodič:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Trenutna veza možda bude prekinuta jer se koristi Cloudflare tuneliranje. Sigurno želite zaustaviti? Unesite lozinku za potvrdu.",
+    "HTTP Headers": "HTTP zaglavlja",
+    "Trust Proxy": "Vjeruj proxy poslužitelju",
+    "Other Software": "Ostali programi",
+    "For example: nginx, Apache and Traefik.": "Primjerice: nginx, Apache ili Traefik.",
+    "Please read": "Molimo pročitajte",
+    "Subject:": "Predmet:",
+    "Valid To:": "Valjano do:",
+    "Days Remaining:": "Preostalo dana:",
+    "Issuer:": "Izdavatelj:",
+    "Fingerprint:": "Fingerprint:",
+    "No status pages": "Nema statusnih stranica",
+    "Domain Name Expiry Notification": "Obavijest za istek domena",
+    "Proxy": "Proxy",
+    "Date Created": "Datum stvaranja",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP adresa",
+    "onebotMessageType": "OneBot tip poruke",
+    "onebotGroupMessage": "Grupna",
+    "onebotPrivateMessage": "Privatna",
+    "onebotUserOrGroupId": "ID korisnika/grupe",
+    "onebotSafetyTips": "Pristupni token mora biti postavljen",
+    "PushDeer Key": "PushDeer ključ",
+    "Footer Text": "Tekst podnožja",
+    "Show Powered By": "Pokaži natpis 'Pokreće...'",
+    "Domain Names": "Domene",
+    "signedInDisp": "Prijavljeni ste kao {0}",
+    "signedInDispDisabled": "Autentikacija onemogućena.",
+    "RadiusSecret": "Radius Tajna",
+    "RadiusSecretDescription": "Dijeljena Tajna između klijenta i poslužitelja",
+    "RadiusCalledStationId": "Called Station ID",
+    "RadiusCalledStationIdDescription": "Identifikator pozivne stanice",
+    "RadiusCallingStationId": "Calling Station ID",
+    "RadiusCallingStationIdDescription": "Identifikator pozivajuće stanice",
+    "Certificate Expiry Notification": "Obavijest za istek certifikata",
+    "API Username": "API korisničko ime",
+    "API Key": "API ključ",
+    "Recipient Number": "Broj primatelja",
+    "From Name/Number": "Naziv/broj pošiljatelja",
+    "Leave blank to use a shared sender number.": "Ostaviti prazno za korištenje dijeljenog broja pošiljatelja.",
+    "Octopush API Version": "Octopush verzija API-ja",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "krajnja točka (endpoint)",
+    "octopushAPIKey": "\"API ključ\" iz HTTP API postavki",
+    "octopushLogin": "\"Korisničko ime\" iz HTTP API postavki",
+    "promosmsLogin": "API korisničko ime",
+    "promosmsPassword": "API lozinka",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Tajni API ključ",
+    "pushyToken": "Token uređaja",
+    "Show update if available": "Pokaži moguću nadogradnju",
+    "Also check beta release": "Provjeravaj i za beta izdanja",
+    "Using a Reverse Proxy?": "Koristi li se reverzni proxy?",
+    "Check how to config it for WebSocket": "Provjerite kako se konfigurira za WebSocket protokol",
+    "Steam Game Server": "Steam poslužitelj igre",
+    "Most likely causes:": "Najvjerojatniji uzroci:",
+    "The resource is no longer available.": "Resurs više nije dostupan.",
+    "There might be a typing error in the address.": "Možda je nastala greška pri upisu adrese.",
+    "What you can try:": "Što možete pokušati:",
+    "Retype the address.": "Ponovno napišite adresu.",
+    "Go back to the previous page.": "Vratite se na prethodnu stranicu.",
+    "Coming Soon": "Dolazi uskoro",
+    "wayToGetClickSendSMSToken": "Možete dobiti API korisničko ime i API ključ sa {0}.",
+    "Connection String": "Tekst veze",
+    "Query": "Upit",
+    "settingsCertificateExpiry": "TLS istek certifikata",
+    "certificationExpiryDescription": "HTTPS monitori će obavijesiti kada je istek TLS certifikata za:",
+    "Setup Docker Host": "Dodaj Docker domaćina",
+    "Connection Type": "Tip veze",
+    "Docker Daemon": "Docker daemon",
+    "deleteDockerHostMsg": "Sigurno želite izbrisati ovog Docker domaćina za sve monitore?",
+    "socket": "Docker socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker kontejner",
+    "Container Name / ID": "Naziv / ID kontejnera",
+    "Docker Host": "Docker domaćin",
+    "Docker Hosts": "Docker domaćini",
+    "ntfy Topic": "ntfy tema",
+    "Domain": "Domena",
+    "Workstation": "Radna stanica",
+    "disableCloudflaredNoAuthMsg": "Lozinka nije nužna dok je isključena autentikacija.",
+    "trustProxyDescription": "Vjeruj 'X-Forwarded-*' zaglavljima. Ako želite dobiti ispravnu IP adresu klijenta i Uptime Kuma je iza reverznog proxy poslužitelja, trebate omogućiti ovo.",
+    "wayToGetLineNotifyToken": "Možete dobiti pristupni token sa {0}",
+    "Examples": "Primjeri",
+    "Home Assistant URL": "URL Home Assistanta",
+    "Long-Lived Access Token": "Dugotrajni pristupni token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Dugotrajni pristupni token može se kreirati klikom na korisničko ime (dolje lijevo) u Home Assistantu, pomicanjem do dna, te klikom na 'Create Token'. ",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "zadano ponašanje: obavijesti sve uređaje",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Popis servisa za obavijesti u Home Assistantu nalaze se pod \"Developer Tools > Services\" te pretražiti \"notification\".",
+    "Automations can optionally be triggered in Home Assistant:": "Automacije se mogu okinuti u Home Assistantu:",
+    "Trigger type:": "Tip triggera:",
+    "Event type:": "Tip eventa:",
+    "Event data:": "Podaci eventa:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Potrebno je i odabrati akciju za izvođenje na Home Assistantu.",
+    "Frontend Version": "Inačica sučelja",
+    "Frontend Version do not match backend version!": "Inačica sučelja ne odgovara poslužitelju!"
+}
diff --git a/src/lang/hu.json b/src/lang/hu.json
new file mode 100644
index 00000000..78036a1f
--- /dev/null
+++ b/src/lang/hu.json
@@ -0,0 +1,376 @@
+{
+    "languageName": "Magyar",
+    "checkEverySecond": "Ellenőrzés {0} másodpercenként",
+    "retryCheckEverySecond": "Újrapróbál {0} másodpercenként.",
+    "retriesDescription": "Maximális próbálkozás mielőtt a szolgáltatás 'Leállt' jelölést kap és értesítés kerül kiküldésre",
+    "ignoreTLSError": "TLS/SSL hibák figyelmen kívül hagyása HTTPS weboldalaknál",
+    "upsideDownModeDescription": "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.",
+    "maxRedirectDescription": "Az átirányítások maximális száma. állítsa 0-ra az átirányítás tiltásához.",
+    "acceptedStatusCodesDescription": "Válassza ki az állapot kódokat amelyek sikeres válasznak fognak számítani.",
+    "passwordNotMatchMsg": "A megismételt jelszó nem egyezik.",
+    "notificationDescription": "Kérem, rendeljen egy értesítést a figyeléshez, hogy működjön.",
+    "keywordDescription": "Kulcsszó keresése a HTML-ben vagy a JSON válaszban. (kis-nagybetű érzékeny)",
+    "pauseDashboardHome": "Szünetel",
+    "deleteMonitorMsg": "Biztos, hogy törölni akarja ezt a figyelőt?",
+    "deleteNotificationMsg": "Biztos, hogy törölni akarja ezt az értesítést az összes figyelőnél?",
+    "resolverserverDescription": "A Cloudflare az alapértelmezett szerver, bármikor meg tudja változtatni a resolver server-t.",
+    "rrtypeDescription": "Válassza ki az RR-típust a figyelőhöz",
+    "pauseMonitorMsg": "Biztos, hogy szüneteltetni akarja?",
+    "enableDefaultNotificationDescription": "Minden új figyelőhöz ez az értesítés engedélyezett lesz alapértelmezetten. Kikapcsolhatja az értesítést külön minden figyelőnél.",
+    "clearEventsMsg": "Biztos, hogy törölni akar miden eseményt ennél a figyelnél?",
+    "clearHeartbeatsMsg": "Biztos, hogy törölni akar minden életjelet ennél a figyelőnél?",
+    "confirmClearStatisticsMsg": "Biztos, hogy törölni akar MINDEN statisztikát?",
+    "importHandleDescription": "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.",
+    "confirmImportMsg": "Biztos, hogy importálja a mentést? Győződjön meg róla, hogy jól választotta ki az importálás opciót.",
+    "twoFAVerifyLabel": "Kérem, adja meg a token-t, hogy a 2FA működését ellenőrizzük",
+    "tokenValidSettingsMsg": "A token érvényes! El tudja menteni a 2FA beállításait.",
+    "confirmEnableTwoFAMsg": "Biztosan engedélyezi a 2FA-t?",
+    "confirmDisableTwoFAMsg": "Biztosan letiltja a 2FA-t?",
+    "Settings": "Beállítások",
+    "Dashboard": "Irányítópult",
+    "New Update": "Új frissítés",
+    "Language": "Nyelv",
+    "Appearance": "Megjelenés",
+    "Theme": "Téma",
+    "General": "Általános",
+    "Version": "Verzió",
+    "Check Update On GitHub": "Frissítések keresése a GitHub-on",
+    "List": "Lista",
+    "Add": "Hozzáadás",
+    "Add New Monitor": "Új figyelő hozzáadása",
+    "Quick Stats": "Gyors statisztikák",
+    "Up": "Működik",
+    "Down": "Leállt",
+    "Pending": "Függőben",
+    "Unknown": "Ismeretlen",
+    "Pause": "Szünet",
+    "Name": "Név",
+    "Status": "Állapot",
+    "DateTime": "Időpont",
+    "Message": "Üzenet",
+    "No important events": "Nincs fontos esemény",
+    "Resume": "Folytatás",
+    "Edit": "Szerkesztés",
+    "Delete": "Törlés",
+    "Current": "Aktuális",
+    "Uptime": "Uptime",
+    "Cert Exp.": "SSL lejárat",
+    "day": "nap",
+    "-day": " nap",
+    "hour": "óra",
+    "-hour": " óra",
+    "Response": "Válasz",
+    "Ping": "Ping",
+    "Monitor Type": "Figyelő típusa",
+    "Keyword": "Kulcsszó",
+    "Friendly Name": "Rövid név",
+    "URL": "URL",
+    "Hostname": "Hosztnév",
+    "Port": "Port",
+    "Heartbeat Interval": "Életjel időköz",
+    "Retries": "Újrapróbálkozás",
+    "Heartbeat Retry Interval": "Életjel újrapróbálkozások időköze",
+    "Advanced": "Haladó",
+    "Upside Down Mode": "Fordított mód",
+    "Max. Redirects": "Max. átirányítás",
+    "Accepted Status Codes": "Elfogadott állapot kódok",
+    "Save": "Mentés",
+    "Notifications": "Értesítések",
+    "Not available, please setup.": "Nem elérhető, állítsa be.",
+    "Setup Notification": "Értesítés beállítása",
+    "Light": "Világos",
+    "Dark": "Sötét",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Téma - Életjel sáv",
+    "Normal": "Normál",
+    "Bottom": "Nyomógomb",
+    "None": "Nincs",
+    "Timezone": "Időzóna",
+    "Search Engine Visibility": "Látható a keresőmotoroknak",
+    "Allow indexing": "Indexelés engedélyezése",
+    "Discourage search engines from indexing site": "Keresőmotorok elriasztása az oldal indexelésétől",
+    "Change Password": "Jelszó változtatása",
+    "Current Password": "Jelenlegi jelszó",
+    "New Password": "Új jelszó",
+    "Repeat New Password": "Ismételje meg az új jelszót",
+    "Update Password": "Jelszó módosítása",
+    "Disable Auth": "Hitelesítés tiltása",
+    "Enable Auth": "Hitelesítés engedélyezése",
+    "disableauth.message1": "Biztos benne, hogy <strong>kikapcsolja a hitelesítést</strong>?",
+    "disableauth.message2": "Akkor érdemes, ha <strong>van 3rd-party hitelesítés</strong> az Uptime Kuma-t megelőzően mint a Cloudflare Access.",
+    "Please use this option carefully!": "Használja megfontoltan!",
+    "Logout": "Kijelentkezés",
+    "Leave": "Elhagy",
+    "I understand, please disable": "Megértettem, kérem tiltsa le",
+    "Confirm": "Megerősítés",
+    "Yes": "Igen",
+    "No": "Nem",
+    "Username": "Felhasználónév",
+    "Password": "Jelszó",
+    "Remember me": "Emlékezzen rám",
+    "Login": "Bejelentkezés",
+    "No Monitors, please": "Nincs figyelő, kérem",
+    "add one": "adjon hozzá egyet",
+    "Notification Type": "Értesítés típusa",
+    "Email": "Email",
+    "Test": "Teszt",
+    "Certificate Info": "Tanúsítvány információk",
+    "Resolver Server": "DNS szerver",
+    "Resource Record Type": "Resource Record típusa",
+    "Last Result": "Utolsó eredmény",
+    "Create your admin account": "Hozza létre az adminisztrátor felhasználót",
+    "Repeat Password": "Jelszó ismétlése",
+    "Import Backup": "Mentés importálása",
+    "Export Backup": "Mentés exportálása",
+    "Export": "Exportálás",
+    "Import": "Importálás",
+    "respTime": "Válaszidő (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Alapértelmezetten engedélyezett",
+    "Apply on all existing monitors": "Alkalmazza az összes figyelőre",
+    "Create": "Létrehozás",
+    "Clear Data": "Adatok törlése",
+    "Events": "Események",
+    "Heartbeats": "Életjelek",
+    "Auto Get": "Auto lekérd.",
+    "backupDescription": "Mentheti az összes figyelőt és értesítést egy JSON fájlba.",
+    "backupDescription2": "Megj: Történeti és esemény adatokat nem tartalmaz.",
+    "backupDescription3": "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyeljen erre!",
+    "alertNoFile": "Válaszzon ki egy fájlt az importáláshoz.",
+    "alertWrongFileType": "Válasszon egy JSON fájlt.",
+    "Clear all statistics": "Összes statisztika törlése",
+    "Skip existing": "Meglévő kihagyása",
+    "Overwrite": "Felülírás",
+    "Options": "Opciók",
+    "Keep both": "Mindegyiket tartsa meg",
+    "Verify Token": "Token ellenőrzése",
+    "Setup 2FA": "2FA beállítása",
+    "Enable 2FA": "2FA engedélyezése",
+    "Disable 2FA": "2FA tiltása",
+    "2FA Settings": "2FA beállítások",
+    "Two Factor Authentication": "Kétfaktoros hitelesítés",
+    "Active": "Aktív",
+    "Inactive": "Inaktív",
+    "Token": "Token",
+    "Show URI": "URI megmutatása",
+    "Tags": "Címkék",
+    "Add New below or Select...": "Adjon hozzá lentre vagy válasszon...",
+    "Tag with this name already exist.": "Ilyen nevű címke már létezik.",
+    "Tag with this value already exist.": "Ilyen értékű címke már létezik.",
+    "color": "szín",
+    "value (optional)": "érték (opcionális)",
+    "Gray": "Szürke",
+    "Red": "Piros",
+    "Orange": "Narancs",
+    "Green": "Zöld",
+    "Blue": "Kék",
+    "Indigo": "Indigó",
+    "Purple": "Lila",
+    "Pink": "Rózsaszín",
+    "Search...": "Keres...",
+    "Avg. Ping": "Átl. ping",
+    "Avg. Response": "Átl. válasz",
+    "Entry Page": "Nyitólap",
+    "statusPageNothing": "Semmi nincs itt. Adjon hozzá egy vagy több figyelőt.",
+    "No Services": "Nincs szolgáltatás",
+    "All Systems Operational": "Minden rendszer működik",
+    "Partially Degraded Service": "Részlegesen leállt szolgáltatás",
+    "Degraded Service": "Leállt szolgáltatás",
+    "Add Group": "Csoport hozzáadása",
+    "Add a monitor": "Figyelő hozzáadása",
+    "Edit Status Page": "Státusz oldal szerkesztése",
+    "Go to Dashboard": "Irányítópulthoz",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (50+ értesítési szolgáltatás)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Status Page": "Státusz oldal",
+    "Status Pages": "Státusz oldalak",
+    "Primary Base URL": "Elsődleges URL",
+    "Push URL": "Meghívandó URL",
+    "needPushEvery": "Ezt az URL-t kell meghívni minden {0} másodpercben.",
+    "pushOptionalParams": "Opcionális paraméterek: {0}",
+    "defaultNotificationName": "{notification} értesítésem ({number})",
+    "here": "itt",
+    "Required": "Kötelező",
+    "Bot Token": "BOT token",
+    "wayToGetTelegramToken": "Innen kaphat token-t: {0}.",
+    "Chat ID": "Csevegés ID",
+    "supportTelegramChatID": "Támogatja a közvetlen csevegést, csoportnak küldést és csatona ID-t is",
+    "wayToGetTelegramChatID": "A csevegés ID-t kinyerheti azzal, hogy küld egy üzenetet a bot-nak és erre az URL-re ellátogat, ahol láthatja a chat_id:-t",
+    "YOUR BOT TOKEN HERE": "AZ ÖN BOT TOKENJE ITT",
+    "chatIDNotFound": "Csevegés ID nem található, küldjön egy első üzenetet a bot-nak",
+    "Post URL": "Cél URL (Post)",
+    "Content Type": "Tartalom típus (Content Type)",
+    "webhookJsonDesc": "{0} ideális a moderh HTTP szerverekhez, mint az Express.js",
+    "webhookFormDataDesc": "{multipart} ideális a PHP-hez. A JSON értelmezhető ezzel: {decodeFunction}",
+    "secureOptionNone": "Nincs / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS hiba figyelmen kívül hagyása",
+    "From Email": "Feladó email",
+    "emailCustomSubject": "Egyedi tárgy",
+    "To Email": "Cél email",
+    "smtpCC": "Másolat",
+    "smtpBCC": "Titkos másolat",
+    "Discord Webhook URL": "Discord cím (webhook URL)",
+    "wayToGetDiscordURL": "Kaphat egy ilyet, ha ellátogat a Server Settings -> Integrations -> Create Webhook oldalra",
+    "Bot Display Name": "Bot megjelenő neve",
+    "Prefix Custom Message": "Egyedi előtét üzenet",
+    "Hello @everyone is...": "Hello {'@'}mindenki...",
+    "Webhook URL": "Cím (webhook URL)",
+    "wayToGetTeamsURL": "Itt megnézheti, hogy kell ilyen URL-t készíteni: {0}.",
+    "Number": "Szám",
+    "Recipients": "Címzettek",
+    "needSignalAPI": "Egy Signal kliensre van szüksége, amihez REST API tartozik.",
+    "wayToCheckSignalURL": "Itt megnézheti, hogy hozhat létre egyet:",
+    "signalImportant": "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél.",
+    "Application Token": "Alkalmazás token",
+    "Server URL": "Szerver URL",
+    "Priority": "Prioritás",
+    "Icon Emoji": "Emoji ikonok",
+    "Channel Name": "Csatorna neve",
+    "Uptime Kuma URL": "Uptime Kuma cím",
+    "aboutWebhooks": "Webhook-okról több info: {0}",
+    "aboutChannelName": "Adja meg a {0} csatorna nevét ha szeretné elkerülni a webhook-ot. Pl: #masik-csatorna",
+    "aboutKumaURL": "Ha üresen hagyja a Uptime Kuma cím mezőt, akkor a projekt GitHub oldala lesz az alapértelmezett.",
+    "emojiCheatSheet": "Emoji csalás: {0}",
+    "clicksendsms": "ClickSend SMS",
+    "User Key": "Felhasználói kulcs",
+    "Device": "Eszköz",
+    "Message Title": "Üzenet címe",
+    "Notification Sound": "Értesítési hang",
+    "More info on:": "További információ: {0}",
+    "pushoverDesc1": "A vészhelyzeti prioritásnak (2) 30 másodperc az újrapróbálkozási alapértéke és egy óra után lejár.",
+    "pushoverDesc2": "Ha különböző eszközökre szeretne értesítést küldeni, töltse ki az Eszköz mezőt.",
+    "SMS Type": "SMS típusa",
+    "octopushTypePremium": "Premium (Fast - recommended for alerting)",
+    "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
+    "checkPrice": "Nézze meg az {0} féle árat:",
+    "apiCredentials": "API kulcsok",
+    "octopushLegacyHint": "Az Octopush régi (2011-2020) verzióját használja vagy az újat?",
+    "Check octopush prices": "Nézze meg az Octopush {0} féle árát.",
+    "octopushPhoneNumber": "Telefonszám (nemz. formátum, pl : +36705554433) ",
+    "octopushSMSSender": "SMS küldő neve : 3-11 betű/szám (a-zA-Z0-9) vagy szóköz",
+    "LunaSea Device ID": "LunaSea eszköz ID",
+    "Apprise URL": "Apprise cím (URL)",
+    "Example:": "Például: {0}",
+    "Read more:": "Itt olvashat róla: {0}",
+    "Status:": "Állapot: {0}",
+    "Read more": "Tovább olvasom",
+    "appriseInstalled": "Apprise telepítve.",
+    "appriseNotInstalled": "Apprise nincs telepítve. {0}",
+    "Access Token": "Elérési token",
+    "Channel access token": "Csatorna elérési token",
+    "Line Developers Console": "Line Developers konzol",
+    "lineDevConsoleTo": "Line Developers konzol - {0}",
+    "Basic Settings": "Alap beállítások",
+    "User ID": "Felhasználó ID",
+    "Messaging API": "Üzenet API",
+    "wayToGetLineChannelToken": "{0} első eléréséhez készítsen egy Provider-t és csatornát (Messaging API), utána kaphatja meg a csatorna elérési token-t és felhasználó ID-t az alábbi menüpontban.",
+    "Icon URL": "Ikon cím (URL)",
+    "aboutIconURL": "Megadhat egy webcímet az Ikon cím mezőben, ezzel felülírva az alapértelmezet képet. Nem kerül felhasználásra, ha az Emoji-k be vannak állítva.",
+    "aboutMattermostChannelName": "Felülírhatja az alapértelmezett csatornát, ahova a webhook az adatokat küldi. Ehhez töltse ki a \"Csatorna neve\" mezőt (pl: #egyeb-csatorna). A Mattermost webhook beállításaiban további engedélyek szükségesek",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - olcsó, de lassú, gyakran túlterhelt. Csak lengyel címzettekhez.",
+    "promosmsTypeFlash": "SMS FLASH - Az üzenet automatikusan megjelenik a fogadó eszközön. Csak lengyel címzettekhez.",
+    "promosmsTypeFull": "SMS FULL - Prémium szintje az SMS-nek. Megadható a feladó neve, de előtte jóváhagyás szükséges. Ideális értesítésekhez.",
+    "promosmsTypeSpeed": "SMS SPEED - A legmagasabb prioritás a rendszerben. Nagyon gyors és pontos, de költséges (kb. duplája a hagyományos SMS-nek).",
+    "promosmsPhoneNumber": "Telefonszám (lengyel címzett esetén az országkód elhagyható)",
+    "promosmsSMSSender": "SMS feladónév: Előre beállított név vagy az alábbiak egyike: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu webhook cím (URL)",
+    "matrixHomeserverURL": "Homeserver cím (URL http(s):// előtaggal és opcionálisan port-tal)",
+    "Internal Room Id": "Belső Szoba ID",
+    "matrixDesc1": "A belső szoba ID-t a szpbák speciális beállítások között találja meg a Matrix kliens programban. Így kell kinéznie: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Erősen ajánlott készíteni egy új felhasználót és nem a teljes joggal rendelkező felhasználót használni. Az új felhasználó létrehozása után csak azokba a szobákba kell megjhívni a felhasználót, ahol értesítéseket szeretne kapni. Ezzel a művelettel lehet elérési token-t kérni: {0}",
+    "Method": "Metódus",
+    "Body": "Törzs",
+    "Headers": "Fejlécek",
+    "PushUrl": "Push cím (URL)",
+    "HeadersInvalidFormat": "A kérés fejléc nem egy valós JSON: ",
+    "BodyInvalidFormat": "A kérés törzse nem egy valós JSON: ",
+    "Monitor History": "Vizsgálatok előzményei",
+    "clearDataOlderThan": "Előzmények megtartása {0} napig.",
+    "PasswordsDoNotMatch": "Jelszó nem egyezik.",
+    "records": "sorok",
+    "One record": "Egy sor",
+    "steamApiKeyDescription": "Steam Game Server ellenőrzéséhez szükséges egy Steam Web-API kulcs. Itt létrehozhat egy API kulcsot: ",
+    "Current User": "Felhasználó",
+    "recent": "Legújabb",
+    "Done": "Kész",
+    "Info": "Infó",
+    "Security": "Biztonság",
+    "Steam API Key": "Steam API kulcs",
+    "Shrink Database": "Adatbázis tömörítése",
+    "Pick a RR-Type...": "Válasszon egy RR-típust...",
+    "Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít...",
+    "Default": "Alapért.",
+    "HTTP Options": "HTTP beállítások",
+    "Create Incident": "Incidens létrehozása",
+    "Title": "Cím",
+    "Content": "Tartalom",
+    "Style": "Stílus",
+    "info": "info",
+    "warning": "warning",
+    "danger": "danger",
+    "primary": "primary",
+    "light": "light",
+    "dark": "dark",
+    "Post": "Bejegyzés",
+    "Please input title and content": "Adjon meg címet és tartalmat",
+    "Created": "Létrehozva",
+    "Last Updated": "Utolsó mód.",
+    "Unpin": "Leválaszt",
+    "Switch to Light Theme": "Világos témára váltás",
+    "Switch to Dark Theme": "Sötét témára váltás",
+    "Show Tags": "Címkék mutatása",
+    "Hide Tags": "Címkék elrejtése",
+    "Description": "Leírás",
+    "No monitors available.": "Nincs még figyelő beállítva.",
+    "Add one": "Adjon hozzá egyet",
+    "No Monitors": "Nincs figyelő",
+    "Untitled Group": "Névtelen csoport",
+    "Services": "Szolgáltatások",
+    "Discard": "Elvet",
+    "Cancel": "Mégsem",
+    "Powered by": "A megoldást szállítja az",
+    "shrinkDatabaseDescription": "VACUUM futtatása az SQLite-on. Ha az adatbázisod 1.10.0-nál újabb, akkor az AUTO_VACUUM engedélyezve van, nincs szükség a műveletre.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API felhasználónév (webapi_ előtaggal együtt)",
+    "serwersmsAPIPassword": "API jelszó",
+    "serwersmsPhoneNumber": "Telefonszám",
+    "serwersmsSenderName": "SMS feladó neve (regisztrált név az oldalon)",
+    "GoogleChat": "Google Chat (csak Google Workspace)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM beállítások",
+    "smtpDkimDesc": "Nézze meg a Nodemailer DKIM {0} használati szabályokat.",
+    "documentation": "dokumentáció",
+    "smtpDkimDomain": "Domain név",
+    "smtpDkimKeySelector": "Kulcs választó",
+    "smtpDkimPrivateKey": "Privát kulcs",
+    "smtpDkimHashAlgo": "Hash algoritmus (nem kötelező)",
+    "smtpDkimheaderFieldNames": "Fejléc kulcsok a bejelentkezéshez (nem kötelező)",
+    "smtpDkimskipFields": "Fejléc kulcsok egyéb esetben (nem kötelező)",
+    "PushByTechulus": "Techulus push",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API végpont",
+    "alertaEnvironment": "Környezet",
+    "alertaApiKey": "API kulcs",
+    "alertaAlertState": "Figyelmeztetési állapot",
+    "alertaRecoverState": "Visszaállási állapot",
+    "deleteStatusPageMsg": "Biztos, hogy törölni akarja a státusz oldalt?"
+}
diff --git a/src/lang/id-ID.json b/src/lang/id-ID.json
new file mode 100644
index 00000000..59a06521
--- /dev/null
+++ b/src/lang/id-ID.json
@@ -0,0 +1,585 @@
+{
+    "languageName": "Bahasa Indonesia (Indonesian)",
+    "checkEverySecond": "Cek Setiap {0} detik.",
+    "retryCheckEverySecond": "Coba lagi setiap {0} detik.",
+    "resendEveryXTimes": "Kirim ulang setiap {0} kali",
+    "resendDisabled": "Kirim ulang dinonaktifkan",
+    "retriesDescription": "Percobaan ulang maksimum sebelum layanan dinyatakan tidak aktif dan notifikasi dikirim",
+    "ignoreTLSError": "Abaikan kesalahan TLS/SSL untuk situs web HTTPS",
+    "upsideDownModeDescription": "Balikkan statusnya. Jika layanan dapat dijangkau, TIDAK AKTIF.",
+    "maxRedirectDescription": "Jumlah maksimum pengalihan untuk diikuti. Setel ke 0 untuk menonaktifkan pengalihan.",
+    "acceptedStatusCodesDescription": "Pilih kode status yang dianggap sebagai tanggapan yang berhasil.",
+    "passwordNotMatchMsg": "Kata sandi kedua tidak cocok.",
+    "notificationDescription": "Harap atur notifikasi ke monitor agar berfungsi.",
+    "keywordDescription": "Cari kata kunci dalam code html atau JSON huruf besar-kecil berpengaruh",
+    "pauseDashboardHome": "Jeda",
+    "deleteMonitorMsg": "Apakah Anda mau menghapus monitor ini?",
+    "deleteNotificationMsg": "Apakah Anda mau menghapus notifikasi untuk semua monitor?",
+    "dnsPortDescription": "Port server DNS. Bawaan menggunakan 53. Anda dapat mengubah port kapan saja.",
+    "resolverserverDescription": "Cloudflare adalah server bawaan, Anda dapat mengubah server resolver kapan saja.",
+    "rrtypeDescription": "Pilih RR-Type yang mau Anda monitor",
+    "pauseMonitorMsg": "Apakah Anda yakin mau menjeda?",
+    "enableDefaultNotificationDescription": "Untuk setiap monitor baru, notifikasi ini akan diaktifkan secara bawaan. Anda masih dapat menonaktifkan notifikasi secara terpisah untuk setiap monitor.",
+    "clearEventsMsg": "Apakah Anda yakin mau menghapus semua event di monitor ini?",
+    "clearHeartbeatsMsg": "Apakah Anda yakin mau menghapus semua heartbeats di monitor ini?",
+    "confirmClearStatisticsMsg": "Apakah Anda yakin mau menghapus semua statistik?",
+    "importHandleDescription": "Pilih 'Lewati yang ada' jika Anda ingin melewati setiap monitor atau notifikasi dengan nama yang sama. 'Timpa' akan menghapus setiap monitor dan notifikasi yang ada.",
+    "confirmImportMsg": "Apakah Anda yakin untuk mengimpor cadangan? Pastikan Anda telah memilih opsi impor yang tepat.",
+    "twoFAVerifyLabel": "Silakan ketik token Anda untuk memverifikasi bahwa 2FA berfungsi",
+    "tokenValidSettingsMsg": "Token benar! Anda sekarang dapat menyimpan pengaturan 2FA.",
+    "confirmEnableTwoFAMsg": "Apakah Anda yakin ingin mengaktifkan 2FA?",
+    "confirmDisableTwoFAMsg": "Apakah Anda yakin ingin menonaktifkan 2FA?",
+    "Settings": "Pengaturan",
+    "Dashboard": "Dasbor",
+    "New Update": "Pembaruan Baru",
+    "Language": "Bahasa",
+    "Appearance": "Tampilan",
+    "Theme": "Tema",
+    "General": "Umum",
+    "Primary Base URL": "URL Dasar Utama",
+    "Version": "Versi",
+    "Check Update On GitHub": "Cek Pembaruan di GitHub",
+    "List": "Daftar",
+    "Add": "Tambah",
+    "Add New Monitor": "Tambah Monitor Baru",
+    "Quick Stats": "Statistik",
+    "Up": "Aktif",
+    "Down": "Tidak Aktif",
+    "Pending": "Tertunda",
+    "Unknown": "Tidak diketahui",
+    "Pause": "Jeda",
+    "Name": "Nama",
+    "Status": "Status",
+    "DateTime": "Tanggal Waktu",
+    "Message": "Pesan",
+    "No important events": "Tidak ada peristiwa penting",
+    "Resume": "Lanjut",
+    "Edit": "Ubah",
+    "Delete": "Hapus",
+    "Current": "Saat ini",
+    "Uptime": "Waktu aktif",
+    "Cert Exp.": "Batas kedaluwarsa SSL",
+    "day": "hari | hari-hari",
+    "-day": "-hari",
+    "hour": "Jam",
+    "-hour": "-Jam",
+    "Response": "Tanggapan",
+    "Ping": "Ping",
+    "Monitor Type": "Tipe Monitor",
+    "Keyword": "Kata Kunci",
+    "Friendly Name": "Nama yang Ramah",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Jarak Waktu Heartbeat ",
+    "Retries": "Coba lagi",
+    "Heartbeat Retry Interval": "Jarak Waktu Heartbeat Mencoba kembali ",
+    "Resend Notification if Down X times consequently": "Kirim Ulang Notifikasi jika Tidak Aktif X kali",
+    "Advanced": "Tingkat Lanjut",
+    "Upside Down Mode": "Mode Terbalik",
+    "Max. Redirects": "Maksimal Pengalihan",
+    "Accepted Status Codes": "Kode Status yang Diterima",
+    "Push URL": "Push URL",
+    "needPushEvery": "Anda harus memanggil URL berikut setiap {0} detik..",
+    "pushOptionalParams": "Parameter tambahan: {0}",
+    "Save": "Simpan",
+    "Notifications": "Notifikasi",
+    "Not available, please setup.": "Tidak tersedia, silakan atur.",
+    "Setup Notification": "Setel Notifikasi",
+    "Light": "Terang",
+    "Dark": "Gelap",
+    "Auto": "Otomatis",
+    "Theme - Heartbeat Bar": "Tema - Heartbeat Bar",
+    "Normal": "Normal",
+    "Bottom": "Bawah",
+    "None": "Tidak ada",
+    "Timezone": "Zona Waktu",
+    "Search Engine Visibility": "Visibilitas Mesin Pencari",
+    "Allow indexing": "Mengizinkan untuk diindex",
+    "Discourage search engines from indexing site": "Mencegah mesin pencari untuk mengindex situs",
+    "Change Password": "Ganti Sandi",
+    "Current Password": "Sandi Lama",
+    "New Password": "Sandi Baru",
+    "Repeat New Password": "Ulangi Sandi Baru",
+    "Update Password": "Perbarui Kata Sandi",
+    "Disable Auth": "Nonaktifkan Autentikasi",
+    "Enable Auth": "Aktifkan Autentikasi",
+    "disableauth.message1": "Apakah Anda yakin ingin <strong>menonaktifkan autentikasi</strong>?",
+    "disableauth.message2": "Ini untuk <strong>mereka yang memiliki autentikasi pihak ketiga</strong> diletakkan di depan Uptime Kuma, misalnya akses Cloudflare.",
+    "Please use this option carefully!": "Gunakan dengan hati-hati.",
+    "Logout": "Keluar",
+    "Leave": "Pergi",
+    "I understand, please disable": "Saya mengerti, silakan dinonaktifkan",
+    "Confirm": "Konfirmasi",
+    "Yes": "Ya",
+    "No": "Tidak",
+    "Username": "Nama Pengguna",
+    "Password": "Sandi",
+    "Remember me": "Ingat saya",
+    "Login": "Masuk",
+    "No Monitors, please": "Tidak ada monitor, silakan",
+    "add one": "tambahkan satu",
+    "Notification Type": "Tipe Notifikasi",
+    "Email": "Surel",
+    "Test": "Tes",
+    "Certificate Info": "Info Sertifikasi",
+    "Resolver Server": "Resolver Server",
+    "Resource Record Type": "Resource Record Type",
+    "Last Result": "Hasil Terakhir",
+    "Create your admin account": "Buat akun admin Anda",
+    "Repeat Password": "Ulangi Sandi",
+    "Import Backup": "Impor Cadangan",
+    "Export Backup": "Ekspor Cadangan",
+    "Export": "Ekspor",
+    "Import": "Impor",
+    "respTime": "Tanggapan. Waktu (milidetik)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Bawaan diaktifkan",
+    "Apply on all existing monitors": "Terapkan pada semua monitor yang ada",
+    "Create": "Buat",
+    "Clear Data": "Bersihkan Data",
+    "Events": "Peristiwa",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Ambil Otomatis",
+    "backupDescription": "Anda dapat mencadangkan semua monitor dan semua notifikasi ke dalam berkas JSON.",
+    "backupDescription2": "Catatan: Data sejarah dan peristiwa tidak disertakan.",
+    "backupDescription3": "Data sensitif seperti notifikasi token disertakan dalam berkas ekspor, harap simpan dengan hati-hati.",
+    "alertNoFile": "Silakan pilih berkas untuk diimpor.",
+    "alertWrongFileType": "Silakan pilih berkas JSON.",
+    "Clear all statistics": "Hapus semua statistik",
+    "Skip existing": "Lewati yang ada",
+    "Overwrite": "Timpa",
+    "Options": "Opsi",
+    "Keep both": "Simpan keduanya",
+    "Verify Token": "Verifikasi Token",
+    "Setup 2FA": "Pengaturan 2FA",
+    "Enable 2FA": "Aktifkan 2FA",
+    "Disable 2FA": "Nonaktifkan 2FA",
+    "2FA Settings": "Pengaturan 2FA",
+    "Two Factor Authentication": "Autentikasi Dua Faktor",
+    "Active": "Aktif",
+    "Inactive": "Tidak Aktif",
+    "Token": "Token",
+    "Show URI": "Lihat URI",
+    "Tags": "Tanda",
+    "Add New below or Select...": "Tambahkan Baru di bawah atau Pilih...",
+    "Tag with this name already exist.": "Tanda dengan nama ini sudah ada.",
+    "Tag with this value already exist.": "Tanda dengan nilai ini sudah ada.",
+    "color": "warna",
+    "value (optional)": "nilai (harus diisi)",
+    "Gray": "Abu-abu",
+    "Red": "Merah",
+    "Orange": "Jingga",
+    "Green": "Hijau",
+    "Blue": "Biru",
+    "Indigo": "Biru Tua",
+    "Purple": "Ungu",
+    "Pink": "Merah Muda",
+    "Search...": "Cari...",
+    "Avg. Ping": "Rata-rata Ping",
+    "Avg. Response": "Rata-rata Tanggapan",
+    "Entry Page": "Halaman Masuk",
+    "statusPageNothing": "Tidak ada di sini, silakan tambahkan grup atau monitor.",
+    "No Services": "Tidak ada Layanan",
+    "All Systems Operational": "Semua Sistem Berfungsi",
+    "Partially Degraded Service": "Layanan Terdegradasi Sebagian",
+    "Degraded Service": "Layanan Terdegradasi",
+    "Add Group": "Tambah Grup",
+    "Add a monitor": "Tambah monitor",
+    "Edit Status Page": "Edit Halaman Status",
+    "Go to Dashboard": "Pergi ke Dasbor",
+    "Status Page": "Halaman Status",
+    "Status Pages": "Halaman Status",
+    "defaultNotificationName": "{notification} saya Peringatan ({number})",
+    "here": "di sini",
+    "Required": "Wajib",
+    "telegram": "Telegram",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Anda dapat mendapatkan token dari {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Mendukung Obrolan Langsung / Grup / Channel Chat ID",
+    "wayToGetTelegramChatID": "Anda bisa mendapatkan chat id Anda dengan mengirim pesan ke bot dan pergi ke url ini untuk melihat chat_id:",
+    "YOUR BOT TOKEN HERE": "BOT TOKEN ANDA DI SINI",
+    "chatIDNotFound": "Chat ID tidak ditemukan, tolong kirim pesan ke bot ini dulu",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Tipe konten",
+    "webhookJsonDesc": "{0} bagus untuk peladen http modern seperti express.js",
+    "webhookFormDataDesc": "{multipart} bagus untuk PHP, Anda hanya perlu mengurai json dengan {decodeFunction}",
+    "smtp": "Surel (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Abaikan Kesalahan TLS",
+    "From Email": "Dari Email",
+    "emailCustomSubject": "Subjek",
+    "To Email": "Ke Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Anda bisa mendapatkan ini dengan pergi ke Server Pengaturan -> Integrasi -> Buat Webhook",
+    "Bot Display Name": "Nama Bot",
+    "Prefix Custom Message": "Awalan Pesan",
+    "Hello @everyone is...": "Halo {'@'}everyone is...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Anda dapat mempelajari cara membuat url webhook {0}.",
+    "signal": "Sinyal",
+    "Number": "Nomer",
+    "Recipients": "Penerima",
+    "needSignalAPI": "Anda harus memiliki klien sinyal dengan REST API.",
+    "wayToCheckSignalURL": "Anda dapat memeriksa url ini untuk melihat cara menyiapkannya:",
+    "signalImportant": "PENTING: Anda tidak dapat mencampur grup dan nomor di penerima!",
+    "gotify": "Gotify",
+    "Application Token": "Token Aplikasi",
+    "Server URL": "URL Server",
+    "Priority": "Prioritas",
+    "slack": "Slack",
+    "Icon Emoji": "Ikon Emoji",
+    "Channel Name": "Nama Saluran",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Info lain tentang webhook: {0}",
+    "aboutChannelName": "Masukan nama saluran di {0} Kolom Nama Saluran jika Anda ingin melewati saluran webhook. Contoh: #saluran-lain",
+    "aboutKumaURL": "Jika Anda membiarkan bidang URL Uptime Kuma kosong, itu akan menjadi bawaan ke halaman Proyek Github.",
+    "emojiCheatSheet": "Lembar contekan emoji: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Mendukung 50+ layanan notifikasi)",
+    "GoogleChat": "Google Chat (hanya Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Kunci pengguna",
+    "Device": "Perangkat",
+    "Message Title": "Judul Pesan",
+    "Notification Sound": "Suara Nofifikasi",
+    "More info on:": "Info lebih lanjut tentang: {0}",
+    "pushoverDesc1": "Prioritas darurat (2) memiliki batas waktu bawaan 30 detik antara percobaan ulang dan akan kadaluwarsa setelah 1 jam.",
+    "pushoverDesc2": "Jika Anda ingin mengirim pemberitahuan ke perangkat yang berbeda, isi kolom Perangkat.",
+    "SMS Type": "Tipe SMS",
+    "octopushTypePremium": "Premium (Cepat - direkomendasikan untuk mengingatkan)",
+    "octopushTypeLowCost": "Low Cost (Lambat, terkadang diblokir oleh operator)",
+    "checkPrice": "Check {0} prices:",
+    "apiCredentials": "Kredensial API",
+    "octopushLegacyHint": "Apakah Anda menggunakan Octopush versi lama (2011-2020) atau versi baru?",
+    "Check octopush prices": "Cek harga octopush {0}.",
+    "octopushPhoneNumber": "Nomer Telpon/HP (format internasional, contoh : +33612345678) ",
+    "octopushSMSSender": "Nama Pengirim SMS : 3-11 karakter alfanumerik dan spasi (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Contoh: {0}",
+    "Read more:": "Baca lebih lanjut: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Baca lebih lanjut",
+    "appriseInstalled": "Apprise diinstall.",
+    "appriseNotInstalled": "Apprise tidak diinstall. {0}",
+    "Access Token": "Token Akses",
+    "Channel access token": "Token akses saluran",
+    "Line Developers Console": "Konsol Pengembang Line",
+    "lineDevConsoleTo": "Konsol Pengembang Line - {0}",
+    "Basic Settings": "Pengaturan Dasar",
+    "User ID": "ID User",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Pertama akses {0}, buat penyedia dan saluran (Messaging API), lalu Anda bisa mendapatkan token akses saluran dan id pengguna dari item menu yang disebutkan di atas.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "Anda dapat memberikan tautan ke gambar di \"Icon URL\" untuk mengganti gambar profil bawaan. Tidak akan digunakan jika Ikon Emoji diset.",
+    "aboutMattermostChannelName": "Anda dapat mengganti saluran bawaan tujuan posting webhook dengan memasukkan nama saluran ke dalam Kolom \"Channel Name\". Ini perlu diaktifkan di pengaturan webhook Mattermost. contoh: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - murah tapi lambat dan sering kelebihan beban. Terbatas hanya untuk penerima Polandia.",
+    "promosmsTypeFlash": "SMS FLASH - Pesan akan otomatis muncul di perangkat penerima. Terbatas hanya untuk penerima Polandia.",
+    "promosmsTypeFull": "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). Dapat diandalkan untuk peringatan.",
+    "promosmsTypeSpeed": "SMS SPEED - Prioritas tertinggi dalam sistem. Sangat cepat dan dapat diandalkan tetapi mahal (sekitar dua kali lipat dari harga SMS FULL).",
+    "promosmsPhoneNumber": "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
+    "promosmsSMSSender": "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookUrl",
+    "matrixHomeserverURL": "Homeserver URL (dengan http(s):// dan port tambahan)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "Kamu dapat menemukan Internal Room ID dengan melihat di bagian konfigurasi ruang di Matrix. Seharusnya berbentuk seperti !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Sangat direkomendasikan kepada Anda untuk membuat akun baru dan jangan menggunakan token atas akun terkini yang memiliki token akses secara penuh terhadap akun dan seluruh ruang yang terdaftar. Alih - alih, buat akun baru dan undang akun tsb ke ruang tempat anda ingin menerima notifikasi. Untuk mendapatkan token akses anda dapat menjalankan {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Request Headers memiliki format JSON yang tidak sesuai: ",
+    "BodyInvalidFormat": "Request Body memiliki format JSON yang tidak sesuai: ",
+    "Monitor History": "Riyawat Monitor",
+    "clearDataOlderThan": "Simpan data riwayat monitoring selama {0} hari.",
+    "PasswordsDoNotMatch": "Password tidak sama.",
+    "records": "catatan",
+    "One record": "Satu catatan",
+    "steamApiKeyDescription": "Untuk monitoring Steam Game Server Anda membutuhkan kunci Steam Web-API. Anda dapat mendaftarkan Kunci API Anda melalui: ",
+    "Current User": "Pengguna Saat Ini",
+    "topic": "Topic",
+    "topicExplanation": "MQTT topic untuk dimonitor",
+    "successMessage": "Pesan Berhasil",
+    "successMessageExplanation": "Pesan MQTT yang akan dianggap berhasil",
+    "recent": "Baru saja",
+    "Done": "Selesai",
+    "Info": "Info",
+    "Security": "Keamanan",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Shrink Database",
+    "Pick a RR-Type...": "Pilih RR-Type...",
+    "Pick Accepted Status Codes...": "Pilih Kode Status yang Diterima...",
+    "Default": "Default",
+    "HTTP Options": "Opsi HTTP",
+    "Create Incident": "Buat Incident",
+    "Title": "Judul",
+    "Content": "Konten",
+    "Style": "Gaya",
+    "info": "info",
+    "warning": "peringatan",
+    "danger": "bahaya",
+    "error": "kesalahan",
+    "critical": "kritis",
+    "primary": "utama",
+    "light": "terang",
+    "dark": "gelap",
+    "Post": "Post",
+    "Please input title and content": "Masukkan judul dan konten",
+    "Created": "Dibuat",
+    "Last Updated": "Terakhir Diperbarui",
+    "Unpin": "Lepaskan Semat",
+    "Switch to Light Theme": "Ubah ke Tema Terang",
+    "Switch to Dark Theme": "Ubah ke Tema Gelap",
+    "Show Tags": "Tampilkan Tags",
+    "Hide Tags": "Sembunyikan Tags",
+    "Description": "Deskripsi",
+    "No monitors available.": "Tidak ada monitor yang tersedia.",
+    "Add one": "Tambahkan",
+    "No Monitors": "Tidak ada monitor",
+    "Untitled Group": "Group Tanpa Judul",
+    "Services": "Layanan",
+    "Discard": "Buang",
+    "Cancel": "Batal",
+    "Powered by": "Dipersembahkan oleh",
+    "shrinkDatabaseDescription": "Trigger database VACUUM untuk SQLite. Jika database Anda dibuat setelah 1.10.0, AUTO_VACUUM sudah otomatis diaktifkan dan aksi berikut tidak dibutuhkan.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nama Pengguna API ( termamsuk awalan webapi_ )",
+    "serwersmsAPIPassword": "Kata Sandi API",
+    "serwersmsPhoneNumber": "Nomor Telepon",
+    "serwersmsSenderName": "Nama Pengirim SMS (didaftarkan melalui portal pelanggan)",
+    "stackfield": "Stackfield",
+    "Customize": "Kustomisasi",
+    "Custom Footer": "Tambahan Footer",
+    "Custom CSS": "Tambahan CSS",
+    "smtpDkimSettings": "Pengaturan DKIM",
+    "smtpDkimDesc": "Silakan merujuk ke Nodemailer DKIM {0} untuk penggunaan.",
+    "documentation": "dokumentasi",
+    "smtpDkimDomain": "Nama Domain",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "Algoritma Hash (Opsional)",
+    "smtpDkimheaderFieldNames": "Header Keys untuk ditambahkan (Optional)",
+    "smtpDkimskipFields": "Header Keys not untuk ditambahkan (Optional)",
+    "wayToGetPagerDutyKey": "Anda dapat menambahkan melalui Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Lalu Anda dapat menjadi dengan kata kunci \"Events API V2\". Informasi tambahan {0}",
+    "Integration Key": "Kunci Integrasi",
+    "Integration URL": "URL Integrasi",
+    "Auto resolve or acknowledged": "Penyelesaian otomatis atau diakui",
+    "do nothing": "tidak melakukan apapun",
+    "auto acknowledged": "otomatis diakui",
+    "auto resolve": "otomatis terselesaikan",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Lingkungan",
+    "alertaApiKey": "Kunci API",
+    "alertaAlertState": "Status Siaga",
+    "alertaRecoverState": "Status Pemulihan",
+    "deleteStatusPageMsg": "Apakah Anda yakin untuk menghapus halaman status berikut?",
+    "Proxies": "Proxy",
+    "default": "Bawaan",
+    "enabled": "Diaktifkan",
+    "setAsDefault": "Tetapkan sebagai bawaan",
+    "deleteProxyMsg": "Apakah Anda yakin ingin menghapus proxy berikut untuk seluruh monitor?",
+    "proxyDescription": "Proxy harus ditambahkan ke monitor agar berfungsi.",
+    "enableProxyDescription": "Proxy berikut tidak akan berdampak ke monitor hingga diaktifkan. Anda dapat mengontrol menonaktifkan sementara proxy dari semua monitor dengan status aktivasi.",
+    "setAsDefaultProxyDescription": "Proxy berikut akan diaktifkan sebagai bawaan untuk monitor baru. Anda masih dapat menonaktifkan proxy secara terpisah untuk setiap monitor.",
+    "Certificate Chain": "Certificate Chain",
+    "Valid": "Valid",
+    "Invalid": "Tidak Valid",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "Nomor Telepon",
+    "TemplateCode": "Kode Template",
+    "SignName": "Nama Tanda",
+    "Sms template must contain parameters: ": "Template SMS harus berisi parameter: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Untuk keamaan Anda harus menggunakan kunci rahasia",
+    "Device Token": "Token Perangkat",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Tinggi",
+    "Retry": "Ulang",
+    "Topic": "Topik",
+    "WeCom Bot Key": "Kunci WeCom Bot",
+    "Setup Proxy": "Siapkan Proxy",
+    "Proxy Protocol": "Protokol Proxy",
+    "Proxy Server": "Server Proxy",
+    "Proxy server has authentication": "Server Proxy memiliki autentikasi",
+    "User": "Pengguna",
+    "Installed": "Terpasang",
+    "Not installed": "Tidak terpasang",
+    "Running": "Berjalan",
+    "Not running": "Tidak berjalan",
+    "Remove Token": "Hapus Token",
+    "Start": "Mulai",
+    "Stop": "Berhenti",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Tambahkan Halaman Status Baru",
+    "Slug": "Slug",
+    "Accept characters:": "Terima karakter:",
+    "startOrEndWithOnly": "Mulai atau akhiri hanya dengan {0}",
+    "No consecutive dashes": "Tanda hubung tidak berurutan",
+    "Next": "Selanjutnya",
+    "The slug is already taken. Please choose another slug.": "Slug telah digunakan. Silakan pilih slug lain.",
+    "No Proxy": "Tidak ada Proxy",
+    "Authentication": "Autentikasi",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Halaman Status Baru",
+    "Page Not Found": "Halaman Tidak Ditemukan",
+    "Reverse Proxy": "Proxy Terbalik",
+    "Backup": "Cadangan",
+    "About": "Tentang",
+    "wayToGetCloudflaredURL": "(Unduh cloudflared dari {0})",
+    "cloudflareWebsite": "Situs Cloudflare",
+    "Message:": "Pesan:",
+    "Don't know how to get the token? Please read the guide:": "Tidak tahu cara mendapatkan token? Silakan baca panduannya:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Koneksi saat ini mungkin hilang jika Anda saat ini terhubung melalui Cloudflare Tunel. Apakah Anda yakin ingin menghentikannya? Ketik kata sandi Anda saat ini untuk mengonfirmasinya.",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Proxy Terpercaya",
+    "Other Software": "Perangkat Lunak lainnya",
+    "For example: nginx, Apache and Traefik.": "Sebagai contoh: nginx, Apache and Traefik.",
+    "Please read": "Harap dibaca",
+    "Subject:": "Subjek:",
+    "Valid To:": "Berlaku Untuk:",
+    "Days Remaining:": "Hari Tersisa:",
+    "Issuer:": "Penerbit:",
+    "Fingerprint:": "Sidik jari:",
+    "No status pages": "Tidak ada halaman status",
+    "Domain Name Expiry Notification": "Pemberitahuan Kedaluwarsa Nama Domain",
+    "Proxy": "Proxy",
+    "Date Created": "Tanggal Dibuat",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "Alamat HTTP OneBot",
+    "onebotMessageType": "Jenis Pesan OneBot",
+    "onebotGroupMessage": "Grup",
+    "onebotPrivateMessage": "Pribadi",
+    "onebotUserOrGroupId": "Grup/Pengguna ID",
+    "onebotSafetyTips": "Untuk keamanan, harus mengatur token akses",
+    "PushDeer Key": "Kunci PushDeer",
+    "Footer Text": "Tulisan Footer",
+    "Show Powered By": "Tampilkan Dipersembahkan oleh",
+    "Domain Names": "Nama Domain",
+    "signedInDisp": "Masuk sebagai {0}",
+    "signedInDispDisabled": "Autentikasi dinonaktifkan.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Shared Secret antara klien dan server",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCalledStationIdDescription": "Pengenal perangkat yang dipanggil",
+    "RadiusCallingStationId": "Calling Station Id",
+    "RadiusCallingStationIdDescription": "Pengenal perangkat panggilan",
+    "Certificate Expiry Notification": "Pemberitahuan Kedaluwarsa Sertifikat",
+    "API Username": "Nama Pengguna API",
+    "API Key": "Kunci API",
+    "Recipient Number": "Nomor Penerima",
+    "From Name/Number": "Dari Nama/Nomor",
+    "Leave blank to use a shared sender number.": "Biarkan kosong untuk menggunakan nomor pengirim bersama.",
+    "Octopush API Version": "Versi API Octopush",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" dari kredensial HTTP API di panel kontrol",
+    "octopushLogin": "\"Login\" dari kredensial HTTP API di panel kontrol",
+    "promosmsLogin": "Nama Masuk API",
+    "promosmsPassword": "Kata Sandi API",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Device token",
+    "Show update if available": "Tampilkan pembaruan jika tersedia",
+    "Also check beta release": "Periksa juga rilis beta",
+    "Using a Reverse Proxy?": "Menggunakan Proxy Terbalik?",
+    "Check how to config it for WebSocket": "Periksa cara mengonfigurasinya untuk A WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Kemungkinan besar penyebabnya:",
+    "The resource is no longer available.": "Sumber daya tidak lagi tersedia.",
+    "There might be a typing error in the address.": "Mungkin ada kesalahan pengetikan di alamat.",
+    "What you can try:": "Apa yang dapat kamu coba:",
+    "Retype the address.": "Ketik ulang alamat.",
+    "Go back to the previous page.": "Kembali ke halaman sebelumnya.",
+    "Coming Soon": "Segera",
+    "wayToGetClickSendSMSToken": "Anda bisa mendapatkan Nama Pengguna API dan Kunci API dari {0} .",
+    "Connection String": "String Koneksi",
+    "Query": "Query",
+    "settingsCertificateExpiry": "Sertifikat TLS Kadaluarsa",
+    "certificationExpiryDescription": "Monitor HTTPS memicu pemberitahuan saat sertifikat TLS kedaluwarsa dalam:",
+    "Setup Docker Host": "Siapkan Host Docker",
+    "Connection Type": "Jenis Koneksi",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Apakah Anda yakin ingin menghapus host docker berikut untuk semua monitor?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Anda berada dalam mode Tanpa Otentikasi, kata sandi tidak diperlukan.",
+    "trustProxyDescription": "Trust 'X-Forwarded-*' headers. Jika Anda ingin mendapatkan IP klien yang benar dan Uptime Kuma Anda dibalik layanan seperti Nginxor Apache, Anda harus mengaktifkan ini.",
+    "wayToGetLineNotifyToken": "Anda bisa mendapatkan token akses dari {0}",
+    "Examples": "Contoh",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Token Akses Berumur Panjang",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token Akses Berumur Panjang dapat dibuat dengan mengklik nama profil Anda (kiri bawah) dan menggulir ke bawah lalu klik Buat Token. ",
+    "Notification Service": "Layanan Pemberitahuan",
+    "default: notify all devices": "bawaan: notifikasi seluruh perangkat",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Daftar Layanan Pemberitahuan dapat ditemukan di Home Assistant pada \"Developer Tools > Services\" cari \"notification\" lalu cari nama perangkat Anda.",
+    "Automations can optionally be triggered in Home Assistant:": "Otomatisasi dapat dipicu secara opsional di Home Assistant:",
+    "Trigger type:": "Tipe Trigger/Pemicu:",
+    "Event type:": "Tipe event:",
+    "Event data:": "Data event:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Kemudian pilih tindakan, misalnya alihkan ke tempat dimana lampu RGB berwarna merah.",
+    "Frontend Version": "Versi Frontend",
+    "Frontend Version do not match backend version!": "Versi Frontend tidak sama dengan versi backend!",
+    "Base URL": "URL Dasar",
+    "goAlertInfo": "GoAlert adalah aplikasi open source untuk penjadwalan panggilan, eskalasi otomatis dan pemberitahuan (seperti SMS atau panggilan suara). Secara otomatis melibatkan orang yang tepat, dengan cara yang benar, dan pada waktu yang tepat! {0}",
+    "goAlertIntegrationKeyInfo": "Dapatkan kunci integrasi API generik untuk layanan dalam format ini \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biasanya nilai parameter token dari URL yang disalin.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Tidak digunakan lagi: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
+    "backupRecommend": "Harap cadangkan volume atau folder data (./data/) secara langsung."
+}
diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json
new file mode 100644
index 00000000..4b8a8675
--- /dev/null
+++ b/src/lang/it-IT.json
@@ -0,0 +1,367 @@
+{
+    "languageName": "Italiano (Italian)",
+    "checkEverySecond": "controlla ogni {0} secondi",
+    "retryCheckEverySecond": "Riprova ogni {0} secondi.",
+    "retriesDescription": "Tentativi prima che il servizio venga marcato come \"DOWN\" e che una notifica venga inviata.",
+    "ignoreTLSError": "Ignora gli errori TLS/SSL per i siti HTTPS.",
+    "upsideDownModeDescription": "Se il servizio risulta raggiungibile viene marcato come \"DOWN\".",
+    "maxRedirectDescription": "Numero massimo di redirezionamenti consentito. Per disabilitare, impostare \"0\".",
+    "acceptedStatusCodesDescription": "Elenco di codici di stato HTTP che sono considerati validi.",
+    "passwordNotMatchMsg": "La password non corrisponde.",
+    "notificationDescription": "Assegnare la notifica a uno o più oggetti monitorati per metterla in funzione.",
+    "keywordDescription": "Cerca la parola chiave nella risposta in html o JSON e fai distinzione tra maiuscole e minuscole",
+    "pauseDashboardHome": "In Pausa",
+    "deleteMonitorMsg": "Sei sicuro di voler eliminare questo oggetto monitorato?",
+    "deleteNotificationMsg": "Sei sicuro di voler eliminare questa notifica per tutti gli oggetti monitorati?",
+    "resolverserverDescription": "Cloudflare è il server predefinito ma è possibile cambiare il server DNS.",
+    "rrtypeDescription": "Scegliere il tipo di RR che si vuole monitorare",
+    "pauseMonitorMsg": "Sei sicuro di voler mettere in pausa?",
+    "enableDefaultNotificationDescription": "Per ogni nuovo monitor questa notifica sarà abilitata di default. È comunque possibile disabilitare la notifica singolarmente.",
+    "clearEventsMsg": "Sei sicuro di voler eliminare tutti gli eventi per questo servizio?",
+    "clearHeartbeatsMsg": "Sei sicuro di voler eliminare tutti gli intervalli di controllo per questo servizio?",
+    "confirmClearStatisticsMsg": "Sei sicuro di voler eliminare TUTTE le statistiche?",
+    "importHandleDescription": "Selezionare \"Ignora esistenti\" se si vuole ignorare l'importazione dei monitor o delle notifiche con lo stesso nome. \"Sovrascrivi\" rimpiazzerà tutti i monitor e le notifiche presenti con quelli nel backup.",
+    "confirmImportMsg": "Sei sicuro di voler importare il backup? Controlla di aver selezionato l'opzione corretta di importazione.",
+    "twoFAVerifyLabel": "Digita il token per verificare che l'autenticazione a due fattori funzioni correttamente:",
+    "tokenValidSettingsMsg": "Il token è valido! È ora possibile salvare le impostazioni.",
+    "confirmEnableTwoFAMsg": "Sei sicuro di voler abilitare l'autenticazione a due fattori?",
+    "confirmDisableTwoFAMsg": "Sei sicuro di voler disabilitare l'autenticazione a due fattori?",
+    "Settings": "Impostazioni",
+    "Dashboard": "Dashboard",
+    "New Update": "Nuovo aggiornamento disponibile!",
+    "Language": "Lingua",
+    "Appearance": "Aspetto",
+    "Theme": "Tema",
+    "General": "Generale",
+    "Primary Base URL": "URL base primario",
+    "Version": "Versione",
+    "Check Update On GitHub": "Controlla aggiornamenti su GitHub",
+    "List": "Lista",
+    "Add": "Aggiungi",
+    "Add New Monitor": "Aggiungi nuovo monitor",
+    "Quick Stats": "Statistiche rapide",
+    "Up": "Up",
+    "Down": "Down",
+    "Pending": "In attesa",
+    "Unknown": "Sconosciuti",
+    "Pause": "Metti in pausa",
+    "Name": "Nome",
+    "Status": "Stato",
+    "DateTime": "Data e Ora",
+    "Message": "Messaggio",
+    "No important events": "Nessun evento importante",
+    "Resume": "Riprendi",
+    "Edit": "Modifica",
+    "Delete": "Elimina",
+    "Current": "Corrente",
+    "Uptime": "Tempo di attività",
+    "Cert Exp.": "Scadenza certificato",
+    "day": "giorno | giorni",
+    "-day": "-giorni",
+    "hour": "ora",
+    "-hour": "-ore",
+    "Response": "Risposta",
+    "Ping": "Ping",
+    "Monitor Type": "Modalità di monitoraggio",
+    "Keyword": "Parola chiave",
+    "Friendly Name": "Nome",
+    "URL": "URL",
+    "Hostname": "Nome Host",
+    "Port": "Porta",
+    "Heartbeat Interval": "Intervallo di controllo",
+    "Retries": "Tentativi",
+    "Heartbeat Retry Interval": "Intervallo tra i tentativo di controllo",
+    "Advanced": "Avanzate",
+    "Upside Down Mode": "Modalità invertita",
+    "Max. Redirects": "Reindirizzamenti massimi",
+    "Accepted Status Codes": "Codici di stato accettati",
+    "Push URL": "Push URL",
+    "needPushEvery": "Notificare questo URL ogni {0} secondi.",
+    "pushOptionalParams": "Parametri aggiuntivi: {0}",
+    "Save": "Salva",
+    "Notifications": "Notifiche",
+    "Not available, please setup.": "Non disponibili, da configurare.",
+    "Setup Notification": "Configura le notifiche",
+    "Light": "Chiaro",
+    "Dark": "Scuro",
+    "Auto": "Automatico",
+    "Theme - Heartbeat Bar": "Tema (barra di stato)",
+    "Normal": "Normale",
+    "Bottom": "Sotto",
+    "None": "Nessuna",
+    "Timezone": "Fuso Orario",
+    "Search Engine Visibility": "Visibilità ai motori di ricerca",
+    "Allow indexing": "Consenti l'indicizzazione",
+    "Discourage search engines from indexing site": "Evita l'indicizzazione ai motori di ricerca",
+    "Change Password": "Cambia password",
+    "Current Password": "Password corrente",
+    "New Password": "Nuova password",
+    "Repeat New Password": "Ripeti nuova password",
+    "Update Password": "Modifica password",
+    "Disable Auth": "Disabilita autenticazione",
+    "Enable Auth": "Abilita autenticazione",
+    "disableauth.message1": "<strong>Disabilitare l'autenticazione?</strong>",
+    "disableauth.message2": "<strong>Questa opzione è per chi un sistema di autenticazione gestito da terze parti</strong> messo davanti ad Uptime Kuma, ad esempio Cloudflare Access.",
+    "Please use this option carefully!": "Utilizzare con attenzione!",
+    "Logout": "Esci",
+    "Leave": "Annulla",
+    "I understand, please disable": "Lo capisco, disabilitare l'autenticazione.",
+    "Confirm": "Conferma",
+    "Yes": "Sì",
+    "No": "No",
+    "Username": "Nome utente",
+    "Password": "Password",
+    "Remember me": "Ricorda credenziali",
+    "Login": "Accesso",
+    "No Monitors, please": "Nessun monitor presente,",
+    "add one": "aggiungine uno!",
+    "Notification Type": "Servizio di notifica",
+    "Email": "E-mail",
+    "Test": "Fai una prova",
+    "Certificate Info": "Informazioni sul certificato",
+    "Resolver Server": "Server DNS",
+    "Resource Record Type": "Tipo di Resource Record",
+    "Last Result": "Ultimo risultato",
+    "Create your admin account": "Crea l'account amministratore",
+    "Repeat Password": "Ripeti password",
+    "Import Backup": "Importa backup",
+    "Export Backup": "Esporta backup",
+    "Export": "Esporta",
+    "Import": "Importa",
+    "respTime": "Tempo di risposta (ms)",
+    "notAvailableShort": "N/D",
+    "Default enabled": "Abilitato di default",
+    "Apply on all existing monitors": "Applica su tutti i monitoraggi",
+    "Create": "Crea",
+    "Clear Data": "Cancella dati",
+    "Events": "Eventi",
+    "Heartbeats": "Controlli",
+    "Auto Get": "Rileva",
+    "backupDescription": "È possibile fare il backup di tutti i monitoraggi e di tutte le notifiche in un file JSON.",
+    "backupDescription2": "NOTA: lo storico e i dati relativi agli eventi non saranno inclusi nel backup",
+    "backupDescription3": "Dati sensibili come i token di autenticazione saranno inclusi nel backup, custodisci il file in un luogo sicuro!",
+    "alertNoFile": "Selezionare il file da importare.",
+    "alertWrongFileType": "Selezionare un file JSON.",
+    "Clear all statistics": "Cancella tutte le statistiche",
+    "Skip existing": "Ignora esistenti",
+    "Overwrite": "Sovrascrivi",
+    "Options": "Opzioni",
+    "Keep both": "Mantieni entrambi",
+    "Verify Token": "Verifica token",
+    "Setup 2FA": "Configura 2FA",
+    "Enable 2FA": "Abilita 2FA",
+    "Disable 2FA": "Disabilita 2FA",
+    "2FA Settings": "Gestisci l'autenticazione a due fattori",
+    "Two Factor Authentication": "Autenticazione a due fattori (2FA)",
+    "Active": "Attivata",
+    "Inactive": "Disattivata",
+    "Token": "Token",
+    "Show URI": "Mostra URI",
+    "Tags": "Etichette",
+    "Add New below or Select...": "Aggiungi oppure scegli...",
+    "Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
+    "Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
+    "color": "colore",
+    "value (optional)": "descrizione (opzionale)",
+    "Gray": "Grigio",
+    "Red": "Rosso",
+    "Orange": "Arancione",
+    "Green": "Verde",
+    "Blue": "Blu",
+    "Indigo": "Indaco",
+    "Purple": "Viola",
+    "Pink": "Rosa",
+    "Search...": "Cerca...",
+    "Avg. Ping": "Tempo medio di risposta al ping",
+    "Avg. Response": "Tempo medio di risposta",
+    "Entry Page": "Pagina Principale",
+    "statusPageNothing": "Non c'è nulla qui, aggiungi un gruppo oppure un monitor.",
+    "No Services": "Nessun servizio",
+    "All Systems Operational": "Tutti i sistemi sono funzionali",
+    "Partially Degraded Service": "Servizio parzialmente degradato",
+    "Degraded Service": "Servizio degradato",
+    "Add Group": "Aggiungi gruppo",
+    "Add a monitor": "Aggiungi monitor",
+    "Edit Status Page": "Modifica pagina di stato",
+    "Go to Dashboard": "Vai alla dashboard",
+    "Status Page": "Pagina di stato",
+    "Status Pages": "Pagina di stato",
+    "defaultNotificationName": "Notifica {notification} ({number})",
+    "here": "qui",
+    "Required": "Obbligatorio",
+    "telegram": "Telegram",
+    "Bot Token": "Token del bot",
+    "wayToGetTelegramToken": "Puoi ottenere il token da {0}.",
+    "Chat ID": "ID Chat",
+    "supportTelegramChatID": "Supporta chat private, gruppi e canali.",
+    "wayToGetTelegramChatID": "È possibile ricereve l'ID chat mandando un messaggio al bot e poi andando in questo URL per visualizzare il chat_id:",
+    "YOUR BOT TOKEN HERE": "QUI IL TOKEN DEL BOT",
+    "chatIDNotFound": "Non trovo l'ID chat. Prima bisogna mandare un messaggio al bot",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} va bene per qualsiasi server HTTP moderno ad esempio express.js",
+    "webhookFormDataDesc": "{multipart} va bene per PHP, c'è solo bisogno di analizzare il json con {decodeFunction}",
+    "smtp": "E-mail (SMTP)",
+    "secureOptionNone": "Nessuno / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignora gli errori TLS",
+    "From Email": "Mittente",
+    "emailCustomSubject": "Oggetto personalizzato",
+    "To Email": "Destinatario",
+    "smtpCC": "CC",
+    "smtpBCC": "CCn",
+    "discord": "Discord",
+    "Discord Webhook URL": "URL Webhook di Discord",
+    "wayToGetDiscordURL": "È possibile recuperarlo da Impostazioni server -> Integrazioni -> Creare Webhook",
+    "Bot Display Name": "Nome del Bot",
+    "Prefix Custom Message": "Prefisso per il messaggio personalizzato",
+    "Hello @everyone is...": "Ciao a {'@'}everyone ...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL Webhook",
+    "wayToGetTeamsURL": "È possibile imparare a creare un URL Webhook {0}.",
+    "signal": "Signal",
+    "Number": "Numero",
+    "Recipients": "Destinatari",
+    "needSignalAPI": "È necessario avere un client Signal con le API REST.",
+    "wayToCheckSignalURL": "Controllare questo url per capire come impostarne uno:",
+    "signalImportant": "IMPORTANTE: Non è possibile mischiare gruppi e numeri all'interno dei destinatari!",
+    "gotify": "Gotify",
+    "Application Token": "Token Applicazione",
+    "Server URL": "URL Server",
+    "Priority": "Priorità",
+    "slack": "Slack",
+    "Icon Emoji": "Icona Emoji",
+    "Channel Name": "Nome Canale",
+    "Uptime Kuma URL": "Indirizzo Uptime Kuma",
+    "aboutWebhooks": "Maggiori informazioni riguardo ai webhooks su: {0}",
+    "aboutChannelName": "Inserire il nome del canale nel campo \"Nome Canale\" {0} se si vuole bypassare il canale webhook. Ad esempio: #altro-canale",
+    "aboutKumaURL": "Se si lascia bianco il campo Indirizzo Uptime Kuma, la pagina GitHub sarà il valore predefinito.",
+    "emojiCheatSheet": "Lista Emoji: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Supporta più di 50 servizi di notifica)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Chiave Utente",
+    "Device": "Dispositivo",
+    "Message Title": "Titolo Messaggio",
+    "Notification Sound": "Suono di Notifica",
+    "More info on:": "Maggiori informazioni su: {0}",
+    "pushoverDesc1": "Priorità di Emergenza (2) ha 30 secondi di timeout tra un tentativo e l'altro e scadrà dopo un'ora.",
+    "pushoverDesc2": "Se si vuole inviare la notifica a dispositivi differenti, riempire il campo Dispositivi.",
+    "SMS Type": "Tipo di SMS",
+    "octopushTypePremium": "Premium (Veloce - raccomandato per allertare)",
+    "octopushTypeLowCost": "A Basso Costo (Lento - talvolta bloccato dall'operatore)",
+    "checkPrice": "Controlla {0} prezzi:",
+    "apiCredentials": "Credenziali API",
+    "octopushLegacyHint": "Si vuole utilizzare la vecchia versione (2011-2020) oppure la nuova versione di Octopush?",
+    "Check octopush prices": "Controlla i prezzi di Octopush {0}.",
+    "octopushPhoneNumber": "Numero di telefono (formato internazionale (p.e.): +33612345678) ",
+    "octopushSMSSender": "Nome del mittente: 3-11 caratteri alfanumerici e spazi (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID dispositivo LunaSea",
+    "Apprise URL": "URL Apprise",
+    "Example:": "Esempio: {0}",
+    "Read more:": "Maggiori informazioni: {0}",
+    "Status:": "Stato: {0}",
+    "Read more": "Maggiori informazioni",
+    "appriseInstalled": "Apprise è installato.",
+    "appriseNotInstalled": "Apprise non è installato. {0}",
+    "Access Token": "Token di accesso",
+    "Channel access token": "Token di accesso al canale",
+    "Line Developers Console": "Console sviluppatori Line",
+    "lineDevConsoleTo": "Console sviluppatori Line - {0}",
+    "Basic Settings": "Impostazioni Base",
+    "User ID": "ID Utente",
+    "Messaging API": "API di Messaggistica",
+    "wayToGetLineChannelToken": "Prima accedi a {0}, crea un provider e un canale (API di Messaggistica), dopodiché puoi avere il token di accesso e l'id utente dal menù sopra.",
+    "Icon URL": "URL Icona",
+    "aboutIconURL": "È possibile impostare un collegameno a una immagine in \"URL Icona\" per modificare l'immagine di profilo. Non verrà utilizzata se è impostata l'Icona Emoji.",
+    "aboutMattermostChannelName": "È possibile modificare il canale predefinito che dove il webhook manda messaggi immettendo il nome del canale nel campo \"Nome Canale\". Questo va abilitato nelle impostazioni webhook di Mattermost webhook. P.E.: #altro-canale",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - economico, ma lento e spesso sovraccarico. Limitato solamente a destinatari Polacchi.",
+    "promosmsTypeFlash": "SMS FLASH - Il messaggio sarà automaticamente mostrato sul dispositivo dei destinatari. Limitato solo a destinatari Polacchi.",
+    "promosmsTypeFull": "SMS FULL - Premium, È possibile utilizzare il proprio come come mittente (è necessario prima registrare il nome). Affidabile per gli allarmi.",
+    "promosmsTypeSpeed": "SMS SPEED - Maggior priorità. Rapido, affidabile, ma costoso (costa il doppio di SMS FULL).",
+    "promosmsPhoneNumber": "Numero di Telefono (per destinatari Polacchi si può omettere il codice area)",
+    "promosmsSMSSender": "Mittente SMS : Nome preregistrato oppure uno dei seguenti: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "URL WebHook di Feishu",
+    "matrixHomeserverURL": "URL Server (con http(s):// e opzionalmente la porta)",
+    "Internal Room Id": "ID Stanza Interna",
+    "matrixDesc1": "È possibile recuperare l'ID della stanza all'interno delle impostazioni avanzate della stanza nel client Matrix. Dovrebbe essere simile a !QMdRCpUIfLwsfjxye6:server.di.casa.",
+    "matrixDesc2": "È altamente raccomandata la creazione di un nuovo utente e di non utilizare il proprio token di accesso Matrix poiché darà pieno controllo al proprio account e a tutte le stanze in cui si ha accesso. Piuttosto, si crei un nuovo utente per invitarlo nella stanza dove si vuole ricevere le notifiche. Si può accedere al token eseguendo {0}",
+    "Method": "Metodo",
+    "Body": "Body",
+    "Headers": "Intestazioni",
+    "PushUrl": "URL di Push",
+    "HeadersInvalidFormat": "L'intestazione di richiesta non è un JSON valido: ",
+    "BodyInvalidFormat": "Il corpo di richiesta non è un JSON valido: ",
+    "Monitor History": "Storico monitor",
+    "clearDataOlderThan": "Mantieni lo storico per {0} giorni.",
+    "PasswordsDoNotMatch": "Le password non corrispondono!",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "Per monitorare un server di gioco Steam è necessaria una Web-API Key di Steam. È possibile registrarne una qui: ",
+    "Current User": "Utente corrente",
+    "recent": "Recenti",
+    "Done": "Fatto",
+    "Info": "Info",
+    "Security": "Sicurezza",
+    "Steam API Key": "API Key di Steam",
+    "Shrink Database": "Comprimi database",
+    "Pick a RR-Type...": "Scegli un tipo di RR...",
+    "Pick Accepted Status Codes...": "Scegli i codici di Stato Accettati...",
+    "Default": "Predefinito",
+    "HTTP Options": "Opzioni HTTP",
+    "Create Incident": "Segnala incidente",
+    "Title": "Titolo",
+    "Content": "Contenuto",
+    "Style": "Stile",
+    "info": "informativo",
+    "warning": "attenzione",
+    "danger": "critico",
+    "primary": "predefinito",
+    "light": "chiaro",
+    "dark": "scuro",
+    "Post": "Posta",
+    "Please input title and content": "Inserire il titolo e il contenuto",
+    "Created": "Creato",
+    "Last Updated": "Ultima modifica",
+    "Unpin": "Rimuovi",
+    "Switch to Light Theme": "Utilizza il tema chiaro",
+    "Switch to Dark Theme": "Utilizza il tema scuro",
+    "Show Tags": "Mostra etichette",
+    "Hide Tags": "Nascondi etichette",
+    "Description": "Descrizione",
+    "No monitors available.": "Nessun monitor disponibile.",
+    "Add one": "Aggiungine uno!",
+    "No Monitors": "Nessun monitor presente.",
+    "Untitled Group": "Gruppo senza titolo",
+    "Services": "Servizi",
+    "Discard": "Scarta modifiche",
+    "Cancel": "Annulla",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Lancia il comando \"VACUUM\" sul database SQLite. Se il database è stato creato dopo la versione 1.10.0, la funzione \"AUTO_VACUUM\" è già abilitata di default e quindi questa azione non è necessaria.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nome utente API (incl. prefisso webapi_)",
+    "serwersmsAPIPassword": "Password API",
+    "serwersmsPhoneNumber": "Numero di Telefono",
+    "serwersmsSenderName": "Nome del mittente SMS (registrato via portale cliente)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "Impostazioni DKIM",
+    "smtpDkimDesc": "Fare riferimento a Nodemailer DKIM {0} per l'utilizzo.",
+    "documentation": "documentazione",
+    "smtpDkimDomain": "Dominio",
+    "smtpDkimKeySelector": "Selettore Chiave",
+    "smtpDkimPrivateKey": "Chiave Privata",
+    "smtpDkimHashAlgo": "Algoritmo di hashing (opzionale)",
+    "smtpDkimheaderFieldNames": "Campi Intestazione da firmare (opzionale)",
+    "smtpDkimskipFields": "Campi Intestazione da non firmare (opzionale)",
+    "GoogleChat": "Google Chat (solo per Google Workspace)"
+}
diff --git a/src/lang/ja.json b/src/lang/ja.json
new file mode 100644
index 00000000..7b2b07fb
--- /dev/null
+++ b/src/lang/ja.json
@@ -0,0 +1,201 @@
+{
+    "languageName": "日本語",
+    "checkEverySecond": "{0}秒ごとにチェックします。",
+    "retriesDescription": "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数",
+    "ignoreTLSError": "HTTPS ウェブサイトの TLS/SSL エラーを無視する",
+    "upsideDownModeDescription": "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。",
+    "maxRedirectDescription": "フォローするリダイレクトの最大数。リダイレクトを無効にするには0を設定する。",
+    "acceptedStatusCodesDescription": "成功した応答とみなされるステータスコードを選択する。",
+    "passwordNotMatchMsg": "繰り返しのパスワードが一致しません。",
+    "notificationDescription": "監視を機能させるには、監視に通知を割り当ててください。",
+    "keywordDescription": "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します",
+    "pauseDashboardHome": "一時停止",
+    "deleteMonitorMsg": "この監視を削除してよろしいですか?",
+    "deleteNotificationMsg": "全ての監視のこの通知を削除してよろしいですか?",
+    "resolverserverDescription": "Cloudflareがデフォルトのサーバーですが、いつでもリゾルバサーバーを変更できます。",
+    "rrtypeDescription": "監視するRRタイプを選択します",
+    "pauseMonitorMsg": "一時停止しますか?",
+    "Settings": "設定",
+    "Dashboard": "ダッシュボード",
+    "New Update": "新しいアップデート",
+    "Language": "言語",
+    "Appearance": "外観",
+    "Theme": "テーマ",
+    "General": "General",
+    "Version": "バージョン",
+    "Check Update On GitHub": "GitHubでアップデートを確認する",
+    "List": "一覧",
+    "Add": "追加",
+    "Add New Monitor": "監視の追加",
+    "Quick Stats": "統計",
+    "Up": "Up",
+    "Down": "Down",
+    "Pending": "中止",
+    "Unknown": "不明",
+    "Pause": "一時停止",
+    "Name": "名前",
+    "Status": "ステータス",
+    "DateTime": "日時",
+    "Message": "メッセージ",
+    "No important events": "重要なイベントなし",
+    "Resume": "再開",
+    "Edit": "編集",
+    "Delete": "削除",
+    "Current": "現在",
+    "Uptime": "起動時間",
+    "Cert Exp.": "証明書有効期限",
+    "day": "日 | 日間",
+    "-day": "-日",
+    "hour": "時間",
+    "-hour": "-時間",
+    "Response": "レスポンス",
+    "Ping": "Ping",
+    "Monitor Type": "監視タイプ",
+    "Keyword": "キーワード",
+    "Friendly Name": "分かりやすい名前",
+    "URL": "URL",
+    "Hostname": "ホスト名",
+    "Port": "ポート",
+    "Heartbeat Interval": "監視間隔",
+    "Retries": "Retries",
+    "Advanced": "Advanced",
+    "Upside Down Mode": "Upside Down Mode",
+    "Max. Redirects": "最大リダイレクト数",
+    "Accepted Status Codes": "承認されたステータスコード",
+    "Save": "保存",
+    "Notifications": "通知",
+    "Not available, please setup.": "利用できません。設定してください。",
+    "Setup Notification": "通知設定",
+    "Light": "Light",
+    "Dark": "Dark",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "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": "add one",
+    "Notification Type": "通知タイプ",
+    "Email": "Eメール",
+    "Test": "テスト",
+    "Certificate Info": "証明書情報",
+    "Resolver Server": "問い合わせ先DNSサーバ",
+    "Resource Record Type": "DNSレコード設定",
+    "Last Result": "最終結果",
+    "Create your admin account": "Adminアカウントの作成",
+    "Repeat Password": "パスワード確認",
+    "respTime": "応答時間 (ms)",
+    "notAvailableShort": "N/A",
+    "Create": "作成",
+    "clearEventsMsg": "この監視のすべての記録を削除してもよろしいですか?",
+    "clearHeartbeatsMsg": "この監視のすべての異常記録を削除してもよろしいですか?",
+    "confirmClearStatisticsMsg": "すべての統計を削除してもよろしいですか?",
+    "Clear Data": "データを削除",
+    "Events": "統計",
+    "Heartbeats": "異常記録",
+    "Auto Get": "自動取得",
+    "enableDefaultNotificationDescription": "監視を作成するごとに、この通知方法はデフォルトで有効になります。監視ごとに通知を無効にすることもできます。",
+    "Default enabled": "デフォルトで有効にする",
+    "Also apply to existing monitors": "既存のモニターにも適用する",
+    "Export": "エクスポート",
+    "Import": "インポート",
+    "backupDescription": "すべての監視と通知方法をJSONファイルにできます。",
+    "backupDescription2": "※ 履歴と統計のデータはバックアップされません。",
+    "backupDescription3": "通知に使用するトークンなどの機密データも含まれています。注意して扱ってください。",
+    "alertNoFile": "インポートするファイルを選択してください。",
+    "alertWrongFileType": "JSONファイルを選択してください。",
+    "twoFAVerifyLabel": "トークンを入力して、2段階認証を有効にします。",
+    "tokenValidSettingsMsg": "トークンの確認が完了しました! 「保存」をしてください。",
+    "confirmEnableTwoFAMsg": "2段階認証を「有効」にします。よろしいですか?",
+    "confirmDisableTwoFAMsg": "2段階認証を「無効」にします。よろしいですか?",
+    "Apply on all existing monitors": "既存のすべてのモニターに適用する",
+    "Verify Token": "認証する",
+    "Setup 2FA": "2段階認証の設定",
+    "Enable 2FA": "2段階認証を有効にする",
+    "Disable 2FA": "2段階認証を無効にする",
+    "2FA Settings": "2段階認証の設定",
+    "Two Factor Authentication": "2段階認証",
+    "Active": "Active",
+    "Inactive": "Inactive",
+    "Token": "Token",
+    "Show URI": "Show URI",
+    "Clear all statistics": "すべての記録を削除",
+    "retryCheckEverySecond": "Retry every {0} seconds.",
+    "importHandleDescription": "同じ名前のすべての監視または通知方法を上書きしない場合は、「既存のをスキップ」を選択します。 「上書きする」は、既存のすべてのモニターと通知を削除します。",
+    "confirmImportMsg": "バックアップをインポートしてもよろしいですか?希望するオプションを選択してください。",
+    "Heartbeat Retry Interval": "異常検知後の再試行間隔",
+    "Import Backup": "バックアップのインポート",
+    "Export Backup": "バックアップのエクスポート",
+    "Skip existing": "既存のをスキップする",
+    "Overwrite": "上書きする",
+    "Options": "オプション",
+    "Keep both": "どちらも保持する",
+    "Tags": "タグ",
+    "Add New below or Select...": "新規追加または選択...",
+    "Tag with this name already exist.": "この名前のタグはすでに存在しています。",
+    "Tag with this value already exist.": "この値のタグはすでに存在しています。",
+    "color": "色",
+    "value (optional)": "値 (optional)",
+    "Gray": "Gray",
+    "Red": "Red",
+    "Orange": "Orange",
+    "Green": "Green",
+    "Blue": "Blue",
+    "Indigo": "Indigo",
+    "Purple": "Purple",
+    "Pink": "Pink",
+    "Search...": "検索...",
+    "Avg. Ping": "平均Ping時間",
+    "Avg. Response": "平均応答時間",
+    "Entry Page": "エントリーページ",
+    "statusPageNothing": "ここには何もありません。グループまたは監視を追加してください。",
+    "No Services": "No Services",
+    "All Systems Operational": "すべてのサービスが稼働中",
+    "Partially Degraded Service": "部分的にサービスが停止中",
+    "Degraded Service": "サービスが停止中",
+    "Add Group": "グループの追加",
+    "Add a monitor": "監視の追加",
+    "Edit Status Page": "ステータスページ編集",
+    "Go to Dashboard": "ダッシュボード",
+    "Status Page": "ステータスページ",
+    "Status Pages": "ステータスページ",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost"
+}
diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
new file mode 100644
index 00000000..2cb2131c
--- /dev/null
+++ b/src/lang/ko-KR.json
@@ -0,0 +1,531 @@
+{
+    "languageName": "한국어",
+    "checkEverySecond": "{0}초마다 확인해요.",
+    "retryCheckEverySecond": "{0}초마다 다시 확인해요.",
+    "retriesDescription": "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
+    "ignoreTLSError": "HTTPS 웹사이트에서 TLS/SSL 오류 무시하기",
+    "upsideDownModeDescription": "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거예요.",
+    "maxRedirectDescription": "최대 리다이렉트 횟수예요. 0을 입력하면 리다이렉트를 꺼요.",
+    "acceptedStatusCodesDescription": "응답 성공으로 간주할 상태 코드를 정해요.",
+    "passwordNotMatchMsg": "비밀번호 재입력이 일치하지 않아요.",
+    "notificationDescription": "모니터링에 알림을 설정할 수 있어요.",
+    "keywordDescription": "HTML 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.",
+    "pauseDashboardHome": "일시 정지",
+    "deleteMonitorMsg": "정말 이 모니터링을 삭제할까요?",
+    "deleteNotificationMsg": "정말 이 알림을 모든 모니터링에서 삭제할까요?",
+    "resolverserverDescription": "Cloudflare가 기본 서버예요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
+    "rrtypeDescription": "모니터링할 RR-Type을 선택해요.",
+    "pauseMonitorMsg": "정말 이 모니터링을 일시 정지할까요?",
+    "enableDefaultNotificationDescription": "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
+    "clearEventsMsg": "정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?",
+    "clearHeartbeatsMsg": "정말 이 모니터링에 대한 모든 하트비트를 삭제할까요?",
+    "confirmClearStatisticsMsg": "정말 모든 통계를 삭제할까요?",
+    "importHandleDescription": "이름이 같은 모든 모니터링이나 알림을 건너뛰려면 '기존값 건너뛰기'를 선택해주세요. '덮어쓰기'는 기존의 모든 모니터링과 알림을 삭제해요.",
+    "confirmImportMsg": "정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.",
+    "twoFAVerifyLabel": "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요.",
+    "tokenValidSettingsMsg": "토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.",
+    "confirmEnableTwoFAMsg": "정말 2단계 인증을 활성화할까요?",
+    "confirmDisableTwoFAMsg": "정말 2단계 인증을 비활성화할까요?",
+    "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.": "인증서 만료",
+    "day": "일",
+    "-day": "-일",
+    "hour": "시간",
+    "-hour": "-시간",
+    "Response": "응답",
+    "Ping": "핑",
+    "Monitor Type": "모니터링 종류",
+    "Keyword": "키워드",
+    "Friendly Name": "이름",
+    "URL": "URL",
+    "Hostname": "호스트네임",
+    "Port": "포트",
+    "Heartbeat Interval": "하트비트 주기",
+    "Retries": "재시도",
+    "Heartbeat Retry Interval": "하트비트 재시도 주기",
+    "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": "인증 활성화",
+    "disableauth.message1": "정말로 <strong>인증 기능을 끌까요</strong>?",
+    "disableauth.message2": "이 기능은 <strong>Cloudflare Access와 같은 서드파티 인증</strong>을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.",
+    "Please use this option carefully!": "신중하게 사용하세요.",
+    "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": "비밀번호 재입력",
+    "Import Backup": "백업 가져오기",
+    "Export Backup": "백업 내보내기",
+    "Export": "내보내기",
+    "Import": "가져오기",
+    "respTime": "응답 시간 (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "기본 알림으로 설정",
+    "Apply on all existing monitors": "기존 모니터링에 모두 적용하기",
+    "Create": "생성하기",
+    "Clear Data": "데이터 삭제",
+    "Events": "이벤트",
+    "Heartbeats": "하트비트",
+    "Auto Get": "자동 Get",
+    "backupDescription": "모든 모니터링과 알림을 JSON 파일 형식에 저장할 수 있어요.",
+    "backupDescription2": "히스토리와 이벤트 데이터는 포함되어 있지 않아요.",
+    "backupDescription3": "알림 토큰과 같은 보안 데이터가 내보내기 파일에 포함되어 있으므로 관리에 주의해주세요.",
+    "alertNoFile": "가져오기를 하기 위해 파일을 선택해주세요.",
+    "alertWrongFileType": "JSON 파일을 선택해주세요.",
+    "Clear all statistics": "모든 통계치 삭제",
+    "Skip existing": "기존값 건너뛰기",
+    "Overwrite": "덮어쓰기",
+    "Options": "옵션",
+    "Keep both": "두개 모두 보존",
+    "Verify Token": "토큰 검증",
+    "Setup 2FA": "2단계 인증 설정하기",
+    "Enable 2FA": "2단계 인증 활성화",
+    "Disable 2FA": "2단계 인증 비활성화",
+    "2FA Settings": "2단계 인증 설정",
+    "Two Factor Authentication": "2단계 인증",
+    "Active": "활성화",
+    "Inactive": "비활성화",
+    "Token": "토큰",
+    "Show URI": "URI 보기",
+    "Tags": "태그",
+    "Add New below or Select...": "아래 새롭게 추가 또는 선택...",
+    "Tag with this name already exist.": "같은 태그 이름이 이미 존재해요.",
+    "Tag with this value already exist.": "같은 값을 가진 태그가 이미 존재해요.",
+    "color": "색상",
+    "value (optional)": "값 (선택)",
+    "Gray": "회색",
+    "Red": "빨간색",
+    "Orange": "주황색",
+    "Green": "초록색",
+    "Blue": "파란색",
+    "Indigo": "남색",
+    "Purple": "보라색",
+    "Pink": "핑크색",
+    "Search...": "검색...",
+    "Avg. Ping": "평균 핑",
+    "Avg. Response": "평균 응답",
+    "Entry Page": "첫 페이지",
+    "statusPageNothing": "아무것도 없어요. 새로운 그룹 또는 모니터링을 추가해주세요.",
+    "No Services": "서비스 없음",
+    "All Systems Operational": "모든 시스템 정상",
+    "Partially Degraded Service": "일부 시스템 비정상",
+    "Degraded Service": "모든 시스템 비정상",
+    "Add Group": "그룹 추가",
+    "Add a monitor": "모니터링 추가",
+    "Edit Status Page": "상태 페이지 수정",
+    "Go to Dashboard": "대시보드로 가기",
+    "Status Page": "상태 페이지",
+    "Status Pages": "상태 페이지",
+    "defaultNotificationName": "내 {notification} 알림 ({number})",
+    "here": "여기",
+    "Required": "필수",
+    "telegram": "Telegram",
+    "Bot Token": "봇 토큰",
+    "wayToGetTelegramToken": "토큰은 여기서 얻을 수 있어요: {0}.",
+    "Chat ID": "채팅 ID",
+    "supportTelegramChatID": "개인 채팅 / 그룹 / 채널의 ID를 지원해요.",
+    "wayToGetTelegramChatID": "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
+    "YOUR BOT TOKEN HERE": "봇 토큰",
+    "chatIDNotFound": "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
+    "webhookFormDataDesc": "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "없음 / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS 에러 무시하기",
+    "From Email": "보내는 이메일",
+    "To Email": "받는 이메일",
+    "smtpCC": "참조",
+    "smtpBCC": "숨은 참조",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요!",
+    "Bot Display Name": "표시 이름",
+    "Prefix Custom Message": "접두사 메시지",
+    "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "{0}에서 Webhook을 어떻게 만드는지 알아보세요!",
+    "signal": "Signal",
+    "Number": "숫자",
+    "Recipients": "받는 사람",
+    "needSignalAPI": "REST API를 사용하는 Signal 클라이언트가 있어야 해요.",
+    "wayToCheckSignalURL": "밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요.",
+    "signalImportant": "경고: 받는 사람의 그룹과 숫자는 섞을 수 없어요!",
+    "gotify": "Gotify",
+    "Application Token": "애플리케이션 토큰",
+    "Server URL": "서버 URL",
+    "Priority": "Priority",
+    "slack": "Slack",
+    "Icon Emoji": "아이콘 이모지",
+    "Channel Name": "채널 이름",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Webhook에 대한 설명: {0}",
+    "aboutChannelName": "Webhook 채널을 무시하려면 {0} 채널 이름칸에 채널 이름을 입력해주세요. 예: #기타-채널",
+    "aboutKumaURL": "Uptime Kuma URL칸을 공백으로 두면 기본적으로 Github Project 페이지로 설정해요.",
+    "emojiCheatSheet": "이모지 목록 시트: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (50개 이상 알림 서비스)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "유저 키",
+    "Device": "디바이스",
+    "Message Title": "메시지 제목",
+    "Notification Sound": "알림음",
+    "More info on:": "자세한 정보: {0}",
+    "pushoverDesc1": "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.",
+    "pushoverDesc2": "다른 장치에 알림을 보내려면 장치칸을 입력해주세요.",
+    "SMS Type": "SMS 종류",
+    "octopushTypePremium": "프리미엄 (빠름) - 알림 기능에 적합해요)",
+    "octopushTypeLowCost": "저렴한 요금 (느림) - 가끔 차단될 수 있어요)",
+    "Check octopush prices": "{0}에서 Octopush 가격을 확인할 수 있어요.",
+    "octopushPhoneNumber": "휴대전화 번호 (intl format, 예시: +821023456789) ",
+    "octopushSMSSender": "보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9)",
+    "LunaSea Device ID": "LunaSea 장치 ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "예: {0}",
+    "Read more:": "더 보기: {0}",
+    "Status:": "상태: {0}",
+    "Read more": "더 보기",
+    "appriseInstalled": "Apprise가 설치되어있어요.",
+    "appriseNotInstalled": "Apprise가 설치되어있지 않아요. {0}",
+    "Access Token": "액세스 토큰",
+    "Channel access token": "채널 액세스 토큰",
+    "Line Developers Console": "Line 개발자 콘솔",
+    "lineDevConsoleTo": "Line 개발자 콘솔 - {0}",
+    "Basic Settings": "기본 설정 메뉴",
+    "User ID": "사용자 ID",
+    "Messaging API": "Messaging API 메뉴",
+    "wayToGetLineChannelToken": "먼저 {0}에 액세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
+    "Icon URL": "아이콘 URL",
+    "aboutIconURL": "\"아이콘 URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
+    "aboutMattermostChannelName": "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
+    "promosmsTypeFlash": "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
+    "promosmsTypeFull": "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
+    "promosmsTypeSpeed": "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
+    "promosmsPhoneNumber": "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 되어요.)",
+    "promosmsSMSSender": "SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나예요: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Primary Base URL": "기본 URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "이 URL을 {0} 초 마다 호출할 수 있어요.",
+    "pushOptionalParams": "선택적 파라미터: {0}",
+    "emailCustomSubject": "커스텀 주제",
+    "clicksendsms": "ClickSend SMS",
+    "checkPrice": "{0} 가격 확인:",
+    "apiCredentials": "API 인증정보",
+    "octopushLegacyHint": "Octopush 레거시 버전 (2011-2020) 을 사용하시나요? 아니면 새 버전을 사용하시나요?",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (http(s):// 와 함께 적어주세요. 그리고 포트 번호는 선택적 입니다.)",
+    "Internal Room Id": "내부 방 ID",
+    "matrixDesc1": "Matrix 클라이언트 방 설정의 고급 섹션에서 내부 방 ID를 찾을 수 있어요. 내부 방 ID는 이렇게 생겼답니다: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "사용자의 모든 방에 대한 엑세스가 허용될 수 있어서 새로운 사용자를 만들고 원하는 방에만 초대한 후 엑세스 토큰을 사용하는 것이 좋아요. {0} 이 명령어를 통해 엑세스 토큰을 얻을 수 있어요.",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "요청 Headers의 JSON 형식이 올바르지 않아요: ",
+    "BodyInvalidFormat": "요청 Body의 JSON 형식이 올바르지 않아요: ",
+    "Monitor History": "모니터링 기록",
+    "clearDataOlderThan": "모니터링 기록을 {0}일 동안 저장해요.",
+    "PasswordsDoNotMatch": "비밀번호가 일치하지 않아요.",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "스팀 게임 서버를 모니터링하려면 Steam Web API 키가 필요해요. API 키는 하단 웹사이트에서 등록할 수 있어요: ",
+    "Current User": "현재 사용자",
+    "recent": "최근",
+    "Done": "완료",
+    "Info": "정보",
+    "Security": "보안",
+    "Steam API Key": "스팀 API 키",
+    "Shrink Database": "데이터베이스 축소",
+    "Pick a RR-Type...": "RR-Type을 골라주세요...",
+    "Pick Accepted Status Codes...": "상태 코드를 골라주세요...",
+    "Default": "기본",
+    "HTTP Options": "HTTP 옵션",
+    "Create Incident": "인시던트 만들기",
+    "Title": "제목",
+    "Content": "내용",
+    "Style": "스타일",
+    "info": "정보",
+    "warning": "주의",
+    "danger": "경고",
+    "primary": "기본",
+    "light": "화이트",
+    "dark": "다크",
+    "Post": "게시",
+    "Please input title and content": "제목과 내용을 작성해주세요.",
+    "Created": "생성 날짜",
+    "Last Updated": "마지막 업데이트",
+    "Unpin": "제거",
+    "Switch to Light Theme": "화이트 테마로 전환",
+    "Switch to Dark Theme": "다크 테마로 전환",
+    "Show Tags": "태그 보이기",
+    "Hide Tags": "태그 숨기기",
+    "Description": "설명",
+    "No monitors available.": "모니터링이 없어요.",
+    "Add one": "추가하기",
+    "No Monitors": "모니터링 없음",
+    "Untitled Group": "이름없는 그룹",
+    "Services": "서비스",
+    "Discard": "취소",
+    "Cancel": "취소",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "SQLite 데이터베이스 VACUUM을 트리거해요. 만약 데이터베이스가 1.10.0 버전 이후에 생성되었다면 AUTO_VACUUM이 설정되어 있어 이 작업은 필요 없을 거에요.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Usename (webapi_ 접두사 포함)",
+    "serwersmsAPIPassword": "API 비밀번호",
+    "serwersmsPhoneNumber": "휴대전화 번호",
+    "serwersmsSenderName": "보내는 사람 이름 (customer portal를 통해 가입된 정보)",
+    "stackfield": "Stackfield",
+    "dnsPortDescription": "DNS 서버 포트, 기본값은 53 이에요. 포트는 언제나 변경할 수 있어요.",
+    "PushByTechulus": "Push by Techulus",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "topic": "Topic",
+    "topicExplanation": "모니터링할 MQTT Topic",
+    "successMessage": "성공 메시지",
+    "successMessageExplanation": "성공으로 간주되는 MQTT 메시지",
+    "error": "오류",
+    "critical": "크리티컬",
+    "Customize": "커스터마이즈",
+    "Custom Footer": "커스텀 Footer",
+    "Custom CSS": "커스텀 CSS",
+    "smtpDkimSettings": "DKIM 설정",
+    "smtpDkimDesc": "사용 방법은 DKIM {0}를 참조하세요.",
+    "documentation": "문서",
+    "smtpDkimDomain": "도메인 이름",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "해시 알고리즘 (선택)",
+    "smtpDkimheaderFieldNames": "서명할 헤더 키 (선택)",
+    "smtpDkimskipFields": "서명하지 않을 헤더 키 (선택)",
+    "wayToGetPagerDutyKey": "Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요.",
+    "Integration Key": "Integration 키",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "자동 해결 혹은 승인",
+    "do nothing": "아무것도 하지 않기",
+    "auto acknowledged": "자동 승인 (acknowledged)",
+    "auto resolve": "자동 해결 (resolve)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "환경변수",
+    "alertaApiKey": "API 키",
+    "alertaAlertState": "경고 상태",
+    "alertaRecoverState": "해결된 상태",
+    "deleteStatusPageMsg": "정말 이 상태 페이지를 삭제할까요?",
+    "Proxies": "프록시",
+    "default": "Default",
+    "enabled": "활성화",
+    "setAsDefault": "기본 프록시로 설정",
+    "deleteProxyMsg": "정말 이 프록시를 모든 모니터링에서 삭제할까요?",
+    "proxyDescription": "프록시가 작동하려면 모니터에 할당되어야 해요.",
+    "enableProxyDescription": "이 프록시는 활성화될 때까지 영향을 미치지 않아요. 활성화 상태에 따라 모든 모니터에서 프록시를 일시정지할 수 있어요.",
+    "setAsDefaultProxyDescription": "새로 추가하는 모든 모니터링에 이 프록시를 기본적으로 활성화해요. 각 모니터에 대해 별도로 프록시를 비활성화할 수 있어요.",
+    "Certificate Chain": "인증서 체인",
+    "Valid": "유효",
+    "Invalid": "유효하지 않음",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "휴대전화 번호",
+    "TemplateCode": "템플릿 코드",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "SMS 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "웹훅 URL",
+    "SecretKey": "Secret Key",
+    "For safety, must use secret key": "안전을 위해 꼭 Secret Key를 사용하세요.",
+    "Device Token": "기기 Token",
+    "Platform": "플랫폼",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "재시도",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "프록시 설정",
+    "Proxy Protocol": "프록시 프로토콜",
+    "Proxy Server": "프록시 서버",
+    "Proxy server has authentication": "프록시 서버에 인증 절차가 있음",
+    "User": "사용자",
+    "Installed": "설치됨",
+    "Not installed": "설치되어 있지 않음",
+    "Running": "작동 중",
+    "Not running": "작동하고 있지 않음",
+    "Remove Token": "토큰 삭제",
+    "Start": "시작",
+    "Stop": "정지",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "새로운 상태 페이지 만들기",
+    "Slug": "주소",
+    "Accept characters:": "허용되는 문자열:",
+    "startOrEndWithOnly": "{0}로 시작하거나 끝나야 해요.",
+    "No consecutive dashes": "연속되는 대시는 허용되지 않아요",
+    "Next": "다음",
+    "The slug is already taken. Please choose another slug.": "이미 존재하는 주소에요. 다른 주소를 사용해 주세요.",
+    "No Proxy": "프록시 없음",
+    "Authentication": "인증",
+    "HTTP Basic Auth": "HTTP 인증",
+    "New Status Page": "새로운 상태 페이지",
+    "Page Not Found": "페이지를 찾을 수 없어요",
+    "Reverse Proxy": "리버스 프록시",
+    "Backup": "백업",
+    "About": "정보",
+    "wayToGetCloudflaredURL": "({0}에서 Cloudflare 다운로드 하기)",
+    "cloudflareWebsite": "Cloudflare 웹사이트",
+    "Message:": "메시지:",
+    "Don't know how to get the token? Please read the guide:": "토큰을 얻는 방법은 이 가이드를 확인해주세요:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Cloudflare Tunnel를 연결하면 현재 연결이 끊길 수 있어요. 정말 중지할까요? 비밀번호를 입력해 확인하세요.",
+    "Other Software": "다른 소프트웨어",
+    "For example: nginx, Apache and Traefik.": "nginx, Apache, Traefik 등을 사용할 수 있어요.",
+    "Please read": "이 문서를 참조하세요:",
+    "Subject:": "Subject:",
+    "Valid To:": "Valid To:",
+    "Days Remaining:": "남은 일수:",
+    "Issuer:": "Issuer:",
+    "Fingerprint:": "Fingerprint:",
+    "No status pages": "상태 페이지 없음",
+    "Domain Name Expiry Notification": "도메인 이름 만료 알림",
+    "Proxy": "프록시",
+    "Date Created": "생성된 날짜",
+    "onebotHttpAddress": "OneBot HTTP 주소",
+    "onebotMessageType": "OneBot 메시지 종류",
+    "onebotGroupMessage": "그룹 메시지",
+    "onebotPrivateMessage": "개인 메시지",
+    "onebotUserOrGroupId": "그룹/사용자 ID",
+    "onebotSafetyTips": "안전을 위해 Access 토큰을 설정하세요.",
+    "PushDeer Key": "PushDeer 키",
+    "Footer Text": "Footer 문구",
+    "Show Powered By": "Powered By 문구 표시하기",
+    "Domain Names": "도메인 이름",
+    "signedInDisp": "{0} 로그인됨",
+    "signedInDispDisabled": "인증 비활성화됨.",
+    "Certificate Expiry Notification": "인증서 만료 알림",
+    "API Username": "API 사용자 이름",
+    "API Key": "API 키",
+    "Recipient Number": "받는 사람 번호",
+    "From Name/Number": "발신자 이름/번호",
+    "Leave blank to use a shared sender number.": "공유 발신자 번호를 사용하려면 공백으로 두세요.",
+    "Octopush API Version": "Octopush API 버전",
+    "Legacy Octopush-DM": "레거시 Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "제어판 HTTP API credentials 에서 \"API key\"",
+    "octopushLogin": "제어판 HTTP API credentials 에서 \"Login\"",
+    "promosmsLogin": "API 로그인 이름",
+    "promosmsPassword": "API 비밀번호",
+    "pushoversounds pushover": "Pushover (기본)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "진동만",
+    "pushoversounds none": "없음 (무음)",
+    "pushyAPIKey": "비밀 API 키",
+    "pushyToken": "기기 토큰",
+    "Show update if available": "사용 가능한 경우에 업데이트 표시",
+    "Also check beta release": "베타 릴리즈 확인",
+    "Using a Reverse Proxy?": "리버스 프록시를 사용하시나요?",
+    "Check how to config it for WebSocket": "웹소켓 대한 설정 방법",
+    "Steam Game Server": "스팀 게임 서버",
+    "Most likely causes:": "원인:",
+    "The resource is no longer available.": "더 이상 사용할 수 없어요...",
+    "There might be a typing error in the address.": "주소에 오탈자가 있을 수 있어요.",
+    "What you can try:": "해결 방법:",
+    "Retype the address.": "주소 다시 입력하기",
+    "Go back to the previous page.": "이전 페이지로 돌아가기",
+    "Coming Soon": "Coming Soon...",
+    "wayToGetClickSendSMSToken": "{0}에서 API 사용자 이름과 키를 얻을 수 있어요."
+}
diff --git a/src/lang/nb-NO.json b/src/lang/nb-NO.json
new file mode 100644
index 00000000..7af81299
--- /dev/null
+++ b/src/lang/nb-NO.json
@@ -0,0 +1,285 @@
+{
+    "languageName": "Norsk",
+    "checkEverySecond": "Sjekk hvert {0} sekund.",
+    "retryCheckEverySecond": "Prøv igjen hvert {0} sekund.",
+    "retriesDescription": "Maksimalt antall forsøk før tjenesten er merket som nede og et varsel sendes",
+    "ignoreTLSError": "Ignorer TLS/SSL-feil for HTTPS-nettsteder",
+    "upsideDownModeDescription": "Snu statusen opp ned. Hvis tjenesten er tilgjengelig, er den NEDE.",
+    "maxRedirectDescription": "Maksimalt antall viderekoblinger å følge. Sett til 0 for å deaktivere viderekoblinger.",
+    "acceptedStatusCodesDescription": "Velg statuskoder som anses som en vellykket respons.",
+    "passwordNotMatchMsg": "Passordene stemmer ikke overens.",
+    "notificationDescription": "Varsler må tilordnes en overvåkning for å fungere.",
+    "keywordDescription": "Søk etter nøkkelord i ren HTML eller JSON. Søket skiller mellom store og små bokstaver.",
+    "pauseDashboardHome": "Pause",
+    "deleteMonitorMsg": "Er du sikker på at du vil slette denne overvåkningen?",
+    "deleteNotificationMsg": "Er du sikker på at du vil slette dette varselet for alle overvåkningene?",
+    "resolverserverDescription": "Cloudflare er standardserveren. Du kan endre DNS-serveren når som helst.",
+    "rrtypeDescription": "Velg RR-typen du vil overvåke",
+    "pauseMonitorMsg": "Er du sikker på at du vil sette på pause?",
+    "enableDefaultNotificationDescription": "For hver ny overvåkning vil denne varslingen være aktivert som standard. Du kan fortsatt deaktivere varselet separat for hver overvåkning.",
+    "clearEventsMsg": "Er du sikker på at du vil slette alle hendelser for denne overvåkningen?",
+    "clearHeartbeatsMsg": "Er du sikker på at du vil slette alle hjerteslag for denne overvåkningen?",
+    "confirmClearStatisticsMsg": "Er du sikker på at du vil slette ALL statistikk?",
+    "importHandleDescription": "Velg 'Hopp over eksisterende' hvis du vil hoppe over hver overvåkning eller varsel med samme navn. 'Overskriv' sletter alle eksisterende overvåkninger og varsler.",
+    "confirmImportMsg": "Er du sikker på at du vil importere denne sikkerhetskopien? Sørg for at du har valgt riktig importalternativ.",
+    "twoFAVerifyLabel": "Skriv inn tokenet ditt for å bekrefte at 2FA fungerer",
+    "tokenValidSettingsMsg": "Token er gyldig! Du kan nå lagre 2FA-innstillingene.",
+    "confirmEnableTwoFAMsg": "Er du sikker på at du vil aktivere 2FA?",
+    "confirmDisableTwoFAMsg": "Er du sikker på at du vil deaktivere 2FA?",
+    "Settings": "Innstillinger",
+    "Dashboard": "Dashboard",
+    "New Update": "Ny Oppdatering",
+    "Language": "Språk",
+    "Appearance": "Utseende",
+    "Theme": "Tema",
+    "General": "Generelt",
+    "Version": "Versjon",
+    "Check Update On GitHub": "Sjekk oppdatering på GitHub",
+    "List": "Liste",
+    "Add": "Legg til",
+    "Add New Monitor": "Legg til ny overvåkning",
+    "Quick Stats": "Statistikk",
+    "Up": "Oppe",
+    "Down": "Nede",
+    "Pending": "Avventer",
+    "Unknown": "Ukjent",
+    "Pause": "Pause",
+    "Name": "Navn",
+    "Status": "Status",
+    "DateTime": "Dato tid",
+    "Message": "Melding",
+    "No important events": "Ingen viktige hendelser",
+    "Resume": "Fortsett",
+    "Edit": "Rediger",
+    "Delete": "Slett",
+    "Current": "Nåværende",
+    "Uptime": "Oppetid",
+    "Cert Exp.": "Sertifikat utløper",
+    "day": "dag | dager",
+    "-day": "-dag",
+    "hour": "time",
+    "-hour": "-time",
+    "Response": "Respons",
+    "Ping": "Ping",
+    "Monitor Type": "Overvåkningstype",
+    "Keyword": "Stikkord",
+    "Friendly Name": "Vennlig navn",
+    "URL": "URL",
+    "Hostname": "Vertsnavn",
+    "Port": "Port",
+    "Heartbeat Interval": "Hjerteslagsintervall",
+    "Retries": "Forsøk",
+    "Heartbeat Retry Interval": "Hjerteslagsforsøkintervall",
+    "Advanced": "Avansert",
+    "Upside Down Mode": "Opp-ned-modus",
+    "Max. Redirects": "Maks. viderekoblinger",
+    "Accepted Status Codes": "Godkjente statuskoder",
+    "Save": "Lagre",
+    "Notifications": "Varsler",
+    "Not available, please setup.": "Ikke tilgjengelig, venligst sett opp.",
+    "Setup Notification": "Sett opp varsel",
+    "Light": "Lys",
+    "Dark": "Mørk",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+    "Normal": "Normal",
+    "Bottom": "Bunn",
+    "None": "Ingen",
+    "Timezone": "Tidssone",
+    "Search Engine Visibility": "Søkemotor-synlighet",
+    "Allow indexing": "Tillat indeksering",
+    "Discourage search engines from indexing site": "Fraråd søkemotorer fra å indeksere nettstedet",
+    "Change Password": "Endre passord",
+    "Current Password": "Nåværende passord",
+    "New Password": "Nytt passord",
+    "Repeat New Password": "Gjenta nytt passord",
+    "Update Password": "Oppdater passord",
+    "Disable Auth": "Deaktiver autentisering",
+    "Enable Auth": "Aktiver autentisering",
+    "disableauth.message1": "Er du sikker på at du vil <strong>deaktiver autentisering</strong>?",
+    "disableauth.message2": "Dette er for <strong>de som har tredjepartsautorisering</strong> foran Uptime Kuma, for eksempel Cloudflare Access.",
+    "Please use this option carefully!": "Vennligst vær forsiktig.",
+    "Logout": "Logg ut",
+    "Leave": "Forlat",
+    "I understand, please disable": "Jeg forstår, vennligst deaktiver",
+    "Confirm": "Bekreft",
+    "Yes": "Ja",
+    "No": "Nei",
+    "Username": "Brukernavn",
+    "Password": "Passord",
+    "Remember me": "Husk meg",
+    "Login": "Logg inn",
+    "No Monitors, please": "Ingen overvåkning, vær så snill",
+    "add one": "legg til en",
+    "Notification Type": "Meldingstype",
+    "Email": "E-post",
+    "Test": "Test",
+    "Certificate Info": "Sertifikatinformasjon",
+    "Resolver Server": "DNS-server",
+    "Resource Record Type": "DNS-posttype",
+    "Last Result": "Siste resultat",
+    "Create your admin account": "Opprett en administratorkonto",
+    "Repeat Password": "Gjenta passord",
+    "Import Backup": "Importer sikkerhetskopi",
+    "Export Backup": "Eksporter sikkerhetskopi",
+    "Export": "Eksporter",
+    "Import": "Importer",
+    "respTime": "Svartid (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Standard aktivert",
+    "Apply on all existing monitors": "Anvend for alle eksisterende overvåkninger",
+    "Create": "Opprett",
+    "Clear Data": "Slett data",
+    "Events": "Hendelser",
+    "Heartbeats": "Hjerteslag",
+    "Auto Get": "Auto Hent",
+    "backupDescription": "Du kan sikkerhetskopiere alle overvåkninger og alle varsler til en JSON-fil.",
+    "backupDescription2": "PS: Historikk og hendelsesdata er ikke inkludert.",
+    "backupDescription3": "Følsomme data som varslingstokener er inkludert i eksportfilen. Vennligst oppbevar dem sikkert.",
+    "alertNoFile": "Velg en fil som skal importeres.",
+    "alertWrongFileType": "Velg en JSON-fil.",
+    "Clear all statistics": "Fjern all statistikk",
+    "Skip existing": "Hopp over eksisterende",
+    "Overwrite": "Overskriv",
+    "Options": "Alternativer",
+    "Keep both": "Behold begge",
+    "Verify Token": "Bekreft token",
+    "Setup 2FA": "Konfigurer 2FA",
+    "Enable 2FA": "Aktiver 2FA",
+    "Disable 2FA": "Deaktiver 2FA",
+    "2FA Settings": "2FA Innstillinger",
+    "Two Factor Authentication": "To-faktor autentisering",
+    "Active": "Aktiv",
+    "Inactive": "Inaktiv",
+    "Token": "Token",
+    "Show URI": "Vis URI",
+    "Tags": "Etiketter",
+    "Add New below or Select...": "Legg til nytt nedenfor eller Velg ...",
+    "Tag with this name already exist.": "Etikett med dette navnet eksisterer allerede.",
+    "Tag with this value already exist.": "Etikett med denne verdien eksisterer allerede.",
+    "color": "farge",
+    "value (optional)": "verdi (valgfritt)",
+    "Gray": "Grå",
+    "Red": "Rød",
+    "Orange": "Oransje",
+    "Green": "Grønn",
+    "Blue": "Blå",
+    "Indigo": "Indigo",
+    "Purple": "Lilla",
+    "Pink": "Rosa",
+    "Search...": "Søk...",
+    "Avg. Ping": "Gj.sn. Ping",
+    "Avg. Response": "Gj.sn. Respons",
+    "Entry Page": "Oppføringsside",
+    "statusPageNothing": "Ingenting her, vennligst legg til en gruppe eller en overvåkning.",
+    "No Services": "Ingen tjenester",
+    "All Systems Operational": "Alle systemer i drift",
+    "Partially Degraded Service": "Delvis degradert tjeneste",
+    "Degraded Service": "Degradert tjeneste",
+    "Add Group": "Legg til gruppe",
+    "Add a monitor": "Legg til en overvåkning",
+    "Edit Status Page": "Rediger statusside",
+    "Go to Dashboard": "Gå til Dashboard",
+    "Status Page": "Statusside",
+    "Status Pages": "Statusside",
+    "defaultNotificationName": "Min {notification} varsling ({number})",
+    "here": "her",
+    "Required": "Obligatorisk",
+    "telegram": "Telegram",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Du kan få et token fra {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "Du kan få chat-ID-en din ved å sende en melding til boten og gå til denne nettadressen for å se chat_id:",
+    "YOUR BOT TOKEN HERE": "DITT BOT TOKEN HER",
+    "chatIDNotFound": "Chat-ID ble ikke funnet. Send en melding til denne boten først",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Innholdstype",
+    "webhookJsonDesc": "{0} er bra for alle moderne HTTP-servere som express.js",
+    "webhookFormDataDesc": "{multipart} er bra for PHP. JSON trenger å bli analysert med {decodeFunction}",
+    "smtp": "E-post (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignorer TLS feilmelding",
+    "From Email": "Fra E-post",
+    "To Email": "Til E-post",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Du kan få denne ved å gå til Serverinnstillinger -> Integrasjoner -> Opprett en Webhook",
+    "Bot Display Name": "Bot Visningsnavn",
+    "Prefix Custom Message": "Prefiks tilpasset melding",
+    "Hello @everyone is...": "Hei {'@'}everyone det er...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Du kan lære hvordan du oppretter en webhook-URL {0}.",
+    "signal": "Signal",
+    "Number": "Nummer",
+    "Recipients": "Mottakere",
+    "needSignalAPI": "Du må ha en Signal-klient med REST API.",
+    "wayToCheckSignalURL": "Du kan sjekke denne nettadressen for å se hvordan du konfigurerer en:",
+    "signalImportant": "VIKTIG: Du kan ikke blande grupper og nummere i mottakere!",
+    "gotify": "Gotify",
+    "Application Token": "Application Token",
+    "Server URL": "Server URL",
+    "Priority": "Prioritet",
+    "slack": "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Kanal navn",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Mer informasjon om webhooks på: {0}",
+    "aboutChannelName": "Skriv inn kanalnavnet på {0} Kanalnavn-feltet hvis du vil omgå webhook-kanalen. Eks: #other-channel",
+    "aboutKumaURL": "Hvis du lar Uptime Kuma URL feltet være blank, den blir som standard til Github-siden for dette prosjektet.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Bruker-nøkkel",
+    "Device": "Enhet",
+    "Message Title": "Meldingstittel",
+    "Notification Sound": "Notifikasjonslyd",
+    "More info on:": "Mer info på: {0}",
+    "pushoverDesc1": "Nødsprioritet (2) har en standard 30 sekunders tidsavbrudd mellom forsøk og vil utløpe etter 1 time.",
+    "pushoverDesc2": "Hvis du vil sende varsler til forskjellige enheteter, fyll ut Enhet-feltet.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Raskt - anbefalt for varsling)",
+    "octopushTypeLowCost": "Lav kostnad (Sakte, noen ganger blokkert av leverandør)",
+    "Check octopush prices": "Sjekk octopush priser {0}.",
+    "octopushPhoneNumber": "Telefonnummer (intl format, eg : +4791234567) ",
+    "octopushSMSSender": "SMS Avsendernavn : 3-11 alphanumeriske tegn og mellomrom (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Enhet ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Eksempel: {0}",
+    "Read more:": "Les mer: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Les mer",
+    "appriseInstalled": "Apprise er installert.",
+    "appriseNotInstalled": "Apprise ikke installert. {0}",
+    "Access Token": "Tilgangs-Token",
+    "Channel access token": "Kanal tilgangs-token",
+    "Line Developers Console": "Line Utviklserskonsoll",
+    "lineDevConsoleTo": "Line Utviklserskonsoll - {0}",
+    "Basic Settings": "Grunnleggende instillinger",
+    "User ID": "Bruker-ID",
+    "Messaging API": "Meldings-API",
+    "wayToGetLineChannelToken": "Først, få tilgang til {0}, lag en leverandør og kanal (Meldings-API),  deretter kan du hente kanaltilgangs-token og bruker id fra menu-valgene nevnt over.",
+    "Icon URL": "Ikon URL",
+    "aboutIconURL": "Du kan gi en link til et bilde i \"Ikon URL\" for å overskrive det standard profilbildet. Vil ikke bli brukt hvis Ikon Emoji ikke er satt.",
+    "aboutMattermostChannelName": "Du kan overskrive standardkanalen som webhook-en poster i ved å skrive enn kanalnavnet i \"Kanalnavn\" feltet. Dette må være skrudd på i Mattermost webhook-instillingene. Eks: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - billig, men treg og ofte overbelastet. Begrenset til bare polske mottakere.",
+    "promosmsTypeFlash": "SMS FLASH - Melding vil automatisk vises på mottakker-enhet. Begrenset til bare polske mottakere.",
+    "promosmsTypeFull": "SMS FULL - Premuimnivå SMS. Du kan bruke dit avsendernavn (Du må registerere et navn først). Pålitelig for alle varslinger.",
+    "promosmsTypeSpeed": "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
+    "promosmsPhoneNumber": "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
+    "promosmsSMSSender": "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS"
+}
diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json
new file mode 100644
index 00000000..f32d5094
--- /dev/null
+++ b/src/lang/nl-NL.json
@@ -0,0 +1,531 @@
+{
+    "languageName": "Nederlands",
+    "checkEverySecond": "Controleer elke {0} seconden.",
+    "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?",
+    "resolverserverDescription": "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?",
+    "enableDefaultNotificationDescription": "Voor elke nieuwe monitor wordt deze melding standaard ingeschakeld. U kunt de melding nog steeds afzonderlijk uitschakelen voor elke monitor.",
+    "clearEventsMsg": "Weet je zeker dat je alle evenementen voor deze monitor wilt verwijderen?",
+    "clearHeartbeatsMsg": "Weet je zeker dat je alle heartbeats voor deze monitor wilt verwijderen?",
+    "confirmClearStatisticsMsg": "Weet u zeker dat u alle statistieken wilt verwijderen?",
+    "twoFAVerifyLabel": "Voer uw 2FA controle token in voor verificatie",
+    "tokenValidSettingsMsg": "Token is geldig! U kunt nu de 2FA-instellingen opslaan.",
+    "confirmEnableTwoFAMsg": "Weet je zeker dat je 2FA wilt inschakelen?",
+    "confirmDisableTwoFAMsg": "Weet je zeker dat je 2FA wilt uitschakelen?",
+    "Settings": "Instellingen",
+    "Dashboard": "Dashboard",
+    "New Update": "Nieuwe update",
+    "Language": "Taal",
+    "Appearance": "Weergave",
+    "Theme": "Thema",
+    "General": "Algemeen",
+    "Version": "Versie",
+    "Check Update On GitHub": "Controleer voor updates 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.",
+    "day": "dag | dagen",
+    "-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": "Authenticatie uitschakelen",
+    "Enable Auth": "Authenticatie inschakelen",
+    "disableauth.message1": "Weet je zeker dat je <strong>authenticatie wilt uitschakelen</strong>?",
+    "disableauth.message2": "Er zijn omstandigheden waarbij je <strong>authenticatie door derden wilt implementeren</strong> voor Uptime Kuma, zoals Cloudflare Access, Authelia of andere authenticatiemechanismen.",
+    "Please use this option carefully!": "Gebruik deze optie zorgvuldig!",
+    "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",
+    "Export": "Exporteren",
+    "Import": "Importeren",
+    "respTime": "reactietijd (ms)",
+    "notAvailableShort": "N.v.t.",
+    "Default enabled": "Default enabled",
+    "Apply on all existing monitors": "Pas toe op alle bestaande monitors",
+    "Create": "Aanmaken",
+    "Clear Data": "Data wissen",
+    "Events": "Gebeurtenissen",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Auto Get",
+    "backupDescription": "U kunt een back-up maken van alle monitoren en alle meldingen in een JSON-bestand.",
+    "backupDescription2": "PS: Geschiedenis- en gebeurtenisgegevens zijn niet inbegrepen.",
+    "backupDescription3": "Gevoelige gegevens zoals melding tokens zijn opgenomen in het exportbestand, houd het veilig opgeslagen.",
+    "alertNoFile": "Selecteer een bestand om te importeren.",
+    "alertWrongFileType": "Selecteer een JSON-bestand.",
+    "Verify Token": "Controleer token",
+    "Setup 2FA": "2FA instellingen",
+    "Enable 2FA": "Schakel 2FA in",
+    "Disable 2FA": "Schakel 2FA uit",
+    "2FA Settings": "2FA-instellingen",
+    "Two Factor Authentication": "Two Factor Authenticatie",
+    "Active": "Actief",
+    "Inactive": "Inactief",
+    "Also apply to existing monitors": "Voeg ook toe aan bestaande monitors",
+    "Token": "Token",
+    "Show URI": "Toon URI",
+    "Clear all statistics": "Wis alle statistieken",
+    "retryCheckEverySecond": "Probeer elke {0} seconden.",
+    "importHandleDescription": "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.",
+    "confirmImportMsg": "Weet je zeker dat je dit bestand wilt importeren?",
+    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+    "Import Backup": "Importeer Backup",
+    "Export Backup": "Exporteer Backup",
+    "Skip existing": "Sla bestaande over",
+    "Overwrite": "Overschrijf",
+    "Options": "Opties",
+    "Keep both": "Bewaar beide",
+    "Tags": "Labels",
+    "Add New below or Select...": "Voeg nieuwe toe of selecteer...",
+    "Tag with this name already exist.": "Label met deze naam bestaat al",
+    "Tag with this value already exist.": "Label met deze waarde bestaat al",
+    "color": "Kleur",
+    "value (optional)": "waarde (optioneel)",
+    "Gray": "Grijs",
+    "Red": "Rood",
+    "Orange": "Oranje",
+    "Green": "Groen",
+    "Blue": "Blauw",
+    "Indigo": "Indigo",
+    "Purple": "Paars",
+    "Pink": "Roze",
+    "Search...": "Zoeken...",
+    "Avg. Ping": "Gemiddelde Ping",
+    "Avg. Response": "Gemiddelde Response",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Niets hier, voeg een groep of monitor toe.",
+    "No Services": "Geen diensten",
+    "All Systems Operational": "Alle systemen operationeel",
+    "Partially Degraded Service": "Gedeeltelijk verminderde prestaties",
+    "Degraded Service": "Verminderde prestaties",
+    "Add Group": "Voeg groep toe",
+    "Add a monitor": "Voeg monitor toe",
+    "Edit Status Page": "Wijzig status pagina",
+    "Go to Dashboard": "Ga naar Dashboard",
+    "Status Page": "Status Pagina",
+    "Status Pages": "Status Pagina",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Method": "Methode",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "The request headers is geen geldige JSON: ",
+    "BodyInvalidFormat": "De request body is geen geldige JSON: ",
+    "Primary Base URL": "Hoofd Basis URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Je moet deze URL elke {0} seconden aanroepen.",
+    "pushOptionalParams": "Optionele parameters: {0}",
+    "defaultNotificationName": "Mijn {notification} Alert ({number})",
+    "here": "hier",
+    "Required": "Verplicht",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Je kunt een token krijgen van {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Ondersteuning Directe Chat / Groep / Kanaal Chat ID",
+    "wayToGetTelegramChatID": "Je kunt je CHAT ID krijgen door een bericht te sturen naar de bot en naar deze URL te gaan om het chat_id te bekijken:",
+    "YOUR BOT TOKEN HERE": "DE BOT TOKEN HIER",
+    "chatIDNotFound": "Chat ID is niet gevonden; stuur eerst een bericht naar de bot",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} is goed voor een moderne HTTP server zoals Express.js",
+    "webhookFormDataDesc": "{multipart} is goed voor PHP. De JSON moet worden ontleed met {decodeFunction}",
+    "secureOptionNone": "Geen / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Negeer TLS Error",
+    "From Email": "Van Email",
+    "emailCustomSubject": "Aangepast Onderwerp",
+    "To Email": "Naar Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Je kunt dit krijgen door te gaan naar Server Instellingen -> Integraties -> Creëer Webhook",
+    "Bot Display Name": "Bot Weergave Naam",
+    "Prefix Custom Message": "Prefix Aangepast Bericht",
+    "Hello @everyone is...": "Hallo {'@'}iedereen is...",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Je kunt hier leren hoe je een webhook URL kunt maken {0}.",
+    "Number": "Nummer",
+    "Recipients": "Ontvangers",
+    "needSignalAPI": "Je moet een signal client met REST API hebben.",
+    "wayToCheckSignalURL": "Je kunt op deze URL zien hoe je een kunt instellen:",
+    "signalImportant": "BELANGRIJK: Je kunt groepen en nummers niet mengen in ontvangers!",
+    "Application Token": "Applicatie Token",
+    "Server URL": "Server URL",
+    "Priority": "Prioriteit",
+    "Icon Emoji": "Icoon Emoji",
+    "Channel Name": "Kanaal Naam",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Meer info over Webhooks op: {0}",
+    "aboutChannelName": "Voer de kanaal naam in op {0} Kannaal Naam veld als je het Webhook kanaal wilt omzeilen. Bv: #other-channel",
+    "aboutKumaURL": "Als je de Uptime Kuma URL veld leeg laat, wordt standaard het GitHub project pagina weergegeven.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "PushByTechulus": "Push door Techulus",
+    "clicksendsms": "ClickSend SMS",
+    "GoogleChat": "Google Chat (Google Workspace alleen)",
+    "User Key": "Gebruikers sleutel",
+    "Device": "Apparaat",
+    "Message Title": "Bericht Titel",
+    "Notification Sound": "Notificatie Geluid",
+    "More info on:": "Meer info op: {0}",
+    "pushoverDesc1": "Nood prioriteit (2) heeft standaard een 30 seconden timeout tussen pogingen en verloopt na 1 uur.",
+    "pushoverDesc2": "Vul het appraat veld in als je notificaties naar andere apparaten wilt versturen.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Snel - aangeraden voor te alarmeren)",
+    "octopushTypeLowCost": "Low Cost (Langzaam - wordt soms geblokkeerd door operator)",
+    "checkPrice": "Controleer {0} prijzen:",
+    "apiCredentials": "API referenties",
+    "octopushLegacyHint": "Wil je de legacy versie van Octopush (2011-2020) gebruiken of de nieuwe versie?",
+    "Check octopush prices": "Controleer Octopush prijzen {0}.",
+    "octopushPhoneNumber": "Telefoon nummer (Int. formaat, eg : +33612345678) ",
+    "octopushSMSSender": "SMS zender naam : 3-11 alfanumerieke karakters en spatie (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Apparaat ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Voorbeeld: {0}",
+    "Read more:": "Lees meer: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Lees meer",
+    "appriseInstalled": "Apprise is geïnstalleerd.",
+    "appriseNotInstalled": "Apprise is niet geïnstalleerd. {0}",
+    "Access Token": "Access Token",
+    "Channel access token": "Kanaal access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Basis Instellingen",
+    "User ID": "Gebruiker ID",
+    "Messaging API": "Berichten API",
+    "wayToGetLineChannelToken": "Begin met {0} te openen, creëer een provider en kanaal (Messaging API), dan kun je de kanaal access token en gebruikers ID van de hierboven genoemde menu items krijgen.",
+    "Icon URL": "Icoon URL",
+    "aboutIconURL": "Je kunt een link om de standaard profiel afbeelding te overschrijving in \"Icoon URL\" meegeven. Dit wordt niet gebruikt als Icon Emoji is ingesteld.",
+    "aboutMattermostChannelName": "Je kunt het standaard kanaal dat de Webhook plaatst overschijven door de kanaal naam in te vullen in het \"Channel Name\" veld. Dit moet worden ingeschakeld in de Mattermost Webhook instellingen. Bv. #ander-kanaal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - Goedkoop maar langzaam en vaak overbelast. Gelimiteerd tot Poolse ontvangers.",
+    "promosmsTypeFlash": "SMS FLASH - Berichten worden automatisch weergegeven op het apparaat van de ontvanger. Gelimiteerd tot Poolse ontvangers.",
+    "promosmsTypeFull": "SMS FULL - Premium tier van SMS, je kunt de ontvanger naam gebruiken (Je moet eerst de naam registreren). Betrouwbaar voor alarmeringen.",
+    "promosmsTypeSpeed": "SMS SPEED - Hoogste prioriteit in systeem. Is veel sneller en betrouwbaarder maar kost meer (ongeveer twee keer zoveel als volle SMS prijs).",
+    "promosmsPhoneNumber": "Telefoon nummer (voor Poolse ontvangers. Je kunt gebieds codes overslaan)",
+    "promosmsSMSSender": "SMS Ontvanger naam : Voor geregistreerde naam of een van de standaarden: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (met http(s):// en optioneel poort)",
+    "Internal Room Id": "Interne Room ID",
+    "matrixDesc1": "Je kunt de interne room ID vinden door in de geavanceerde sectie van de room instellingen in je Matrix client te kijken. Het zou moeten uitzien als !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Het wordt ten zeerste aanbevolen om een nieuwe gebruiker aan te maken en niet de access token van je account te gebruiken, aangezien dit volledige toegang geeft tot je account en alle kamers waar je lid van bent. Maak in plaats daarvan een nieuwe gebruiker aan en nodig deze alleen uit voor de ruimte waarin je de melding wilt ontvangen. Je kunt de access token krijgen door het volgende uit te voeren {0}",
+    "Monitor History": "Monitor Geschiedenis",
+    "clearDataOlderThan": "Bewaar monitor geschiedenis voor {0} dagen.",
+    "PasswordsDoNotMatch": "Wachtwoorden komen niet overeen",
+    "records": "records",
+    "One record": "Een record",
+    "steamApiKeyDescription": "Om een Steam Game Server te monitoren heb je een Steam Web-API key nodig. Je kunt hier je API key registreren: ",
+    "Current User": "Huidge Gebruiker",
+    "topic": "Onderwerp",
+    "topicExplanation": "MQTT onderwerp om te monitoren",
+    "successMessage": "Succesbericht",
+    "successMessageExplanation": "MQTT bericht dat als succes wordt beschouwd.",
+    "recent": "Recent",
+    "Done": "Klaar",
+    "Info": "Info",
+    "Security": "Beveiliging",
+    "Steam API Key": "Steam API Sleutel",
+    "Shrink Database": "Verklein Database",
+    "Pick a RR-Type...": "Kies een RR-Type...",
+    "Pick Accepted Status Codes...": "Kies geaccepteerde Status Codes...",
+    "Default": "Standaard",
+    "HTTP Options": "HTTP Opties",
+    "Create Incident": "Creëer Incident",
+    "Title": "Titel",
+    "Content": "Content",
+    "Style": "Stijl",
+    "info": "info",
+    "warning": "waarschuwing",
+    "danger": "gevaar",
+    "primary": "primair",
+    "light": "licht",
+    "dark": "donker",
+    "Post": "Post",
+    "Please input title and content": "Voer alstublieft titel en content in",
+    "Created": "Gemaakt",
+    "Last Updated": "Laatst Bijgewerkt",
+    "Unpin": "Losmaken",
+    "Switch to Light Theme": "Wissel naar Licht Thema",
+    "Switch to Dark Theme": "Wissel naar Donker Thema",
+    "Show Tags": "Toon Labels",
+    "Hide Tags": "Verberg Labels",
+    "Description": "Beschrijving",
+    "No monitors available.": "Geen monitors beschikbaar.",
+    "Add one": "Voeg een toe",
+    "No Monitors": "Geen Monitors",
+    "Untitled Group": "Naamloze Groep",
+    "Services": "Diensten",
+    "Discard": "Weggooien",
+    "Cancel": "Annuleren",
+    "Powered by": "Mogelijk gemaakt door",
+    "shrinkDatabaseDescription": "Activeer database VACUUM voor SQLite. Als de database na 1.10.0 aangemaakt is, dan staat AUTO_VACUUM al aan en is deze actie niet nodig.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Gebruikersnaam (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Wachtwoord",
+    "serwersmsPhoneNumber": "Telefoon nummer",
+    "serwersmsSenderName": "SMS Zender Naam (geregistreerd via klant portaal)",
+    "stackfield": "Stackfield",
+    "Customize": "Aanpassen",
+    "Custom Footer": "Aangepaste Footer",
+    "Custom CSS": "Aangepaste CSS",
+    "smtpDkimSettings": "DKIM Instellingen",
+    "smtpDkimDesc": "Refereer alsjeblieft naar Nodemailer DKIM {0} voor gebruik.",
+    "documentation": "documentatie",
+    "smtpDkimDomain": "Domein Naam",
+    "smtpDkimKeySelector": "Sleutel Kiezer",
+    "smtpDkimPrivateKey": "Prive Sleutel",
+    "smtpDkimHashAlgo": "Hash Algoritme (Optioneel)",
+    "smtpDkimheaderFieldNames": "Header sleutels om te ondertekenen (Optioneel)",
+    "smtpDkimskipFields": "Header sleutels niet om te ondertekenen (Optioneel)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Eindpunt",
+    "alertaEnvironment": "Omgeving",
+    "alertaApiKey": "API Sleutel",
+    "alertaAlertState": "Alert Staat",
+    "alertaRecoverState": "Herstel Staat",
+    "deleteStatusPageMsg": "Weet je zeker je deze status pagina wilt verwijderen?",
+    "Proxies": "Proxies",
+    "default": "Standaard",
+    "enabled": "Ingeschakeld",
+    "setAsDefault": "Stel in als standaard",
+    "deleteProxyMsg": "Weet je zeker dat je deze proxy wilt verwijderen voor alle monitors?",
+    "proxyDescription": "Proxies moeten worden toegewezen aan een monitor om te functioneren.",
+    "enableProxyDescription": "Deze proxy heeft geen effect op monitor verzoeken totdat het is geactiveerd. Je kunt tijdelijk de proxy uitschakelen voor alle monitors voor activatie status.",
+    "setAsDefaultProxyDescription": "Deze proxy wordt standaard aangezet voor alle nieuwe monitors. Je kunt nog steeds de proxy apart uitschakelen voor elke monitor.",
+    "Certificate Chain": "Certificaatketen",
+    "Valid": "Geldig",
+    "Invalid": "Ongeldig",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "TelefoonNummers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken",
+    "Device Token": "Apparaat Token",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Hoog",
+    "Retry": "Opnieuw",
+    "Topic": "Onderwerp",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Proxy instellen",
+    "Proxy Protocol": "Proxy Protocol",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server heeft authenticatie",
+    "User": "Gebruiker",
+    "Installed": "Geïnstalleerd",
+    "Not installed": "Niet geïnstalleerd",
+    "Running": "Actief",
+    "Not running": "Niet actief",
+    "Remove Token": "Verwijder Token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Voeg nieuwe status pagina toe",
+    "Slug": "Slug",
+    "Accept characters:": "Geaccepteerde tekens:",
+    "startOrEndWithOnly": "Start of eindig alleen met {0}",
+    "No consecutive dashes": "Geen opeenvolgende streepjes",
+    "Next": "Volgende",
+    "The slug is already taken. Please choose another slug.": "De slug is al in gebruik. Kies een andere slug.",
+    "No Proxy": "Geen Proxy",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Nieuwe Status Pagina",
+    "Page Not Found": "Pagina Niet gevonden",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Backup",
+    "About": "Over",
+    "wayToGetCloudflaredURL": "(Download cloudflared van {0})",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Bericht:",
+    "Don't know how to get the token? Please read the guide:": "Lees de uitleg als je niet weet hoe je een token krijgt:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "De huidge verbinding kan worden verbroken als je momenteel bent verbonden met Cloudflare Tunnel. Weet je zeker dat je het wilt stoppen? Typ je huidige wachtwoord om het te bevestigen.",
+    "Other Software": "Andere Software",
+    "For example: nginx, Apache and Traefik.": "Bijvoorbeeld: nginx, Apache and Traefik.",
+    "Please read": "Lees alstublieft",
+    "Subject:": "Onderwerp:",
+    "Valid To:": "Geldig Tot:",
+    "Days Remaining:": "Dagen Resterend:",
+    "Issuer:": "Uitgever:",
+    "Fingerprint:": "Vingerafruk:",
+    "No status pages": "Geen status pagina's",
+    "Proxy": "Proxy",
+    "Date Created": "Datum Aangemaakt",
+    "onebotHttpAddress": "OneBot HTTP Adres",
+    "onebotMessageType": "OneBot Bericht Type",
+    "onebotGroupMessage": "Groep",
+    "onebotPrivateMessage": "Privé",
+    "onebotUserOrGroupId": "Groep/Gebruiker ID",
+    "onebotSafetyTips": "Voor de veiligheid moet een toegangssleutel worden ingesteld",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Footer Tekst",
+    "Show Powered By": "Laat \"Mogeljik gemaakt door\" zien",
+    "Domain Names": "Domein Namen",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "dnsPortDescription": "DNS-serverpoort. Standaard ingesteld op 53. Je kunt de poort op elk moment wijzigen.",
+    "error": "fout",
+    "critical": "kritisch",
+    "wayToGetPagerDutyKey": "Je kunt dit krijgen door naar Service -> Service Directory -> (Selecteer een service) -> Integraties -> Integratie toevoegen te gaan. Hier kunt u zoeken naar \"Events API V2\". Meer informatie {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Automatisch oplossen of bevestigen",
+    "do nothing": "niets doen",
+    "auto acknowledged": "automatisch bevestigen",
+    "auto resolve": "automatisch oplossen",
+    "Authentication": "authenticatie",
+    "signedInDisp": "Aangemeld als {0}",
+    "signedInDispDisabled": "Authenticatie uitgeschakeld.",
+    "Certificate Expiry Notification": "Melding over verlopen certificaat",
+    "Recipient Number": "Nummer ontvanger",
+    "From Name/Number": "Van naam/nummer",
+    "Leave blank to use a shared sender number.": "Laat leeg om een gedeeld afzendernummer te gebruiken.",
+    "endpoint": "endpoint",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Device token",
+    "Show update if available": "Update weergeven indien beschikbaar",
+    "Also check beta release": "Controleer ook de bètaversies",
+    "Using a Reverse Proxy?": "Een reverse proxy gebruiken?",
+    "Check how to config it for WebSocket": "Controleer hoe je het configureert voor een WebSocket",
+    "Steam Game Server": "Steam gameserver",
+    "Most likely causes:": "Meest waarschijnlijke oorzaken:",
+    "The resource is no longer available.": "De paginabron is niet langer beschikbaar.",
+    "There might be a typing error in the address.": "Er zit een typefout in het de URL.",
+    "What you can try:": "Wat je kan proberen:",
+    "Retype the address.": "De URL controleren en/of opnnieuw typen.",
+    "Go back to the previous page.": "Terug naar de vorige pagina.",
+    "Coming Soon": "Binnenkort beschikbaar",
+    "wayToGetClickSendSMSToken": "Je kan een  API Username en API Key krijgen vanuit {0} .",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "TLS Certificate Expiry",
+    "certificationExpiryDescription": "HTTPS Monitors trigger notification when TLS certificate expires in:",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Domein",
+    "Workstation": "Werkstation",
+    "disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist."
+}
diff --git a/src/lang/pl.json b/src/lang/pl.json
new file mode 100644
index 00000000..319a3175
--- /dev/null
+++ b/src/lang/pl.json
@@ -0,0 +1,644 @@
+{
+    "languageName": "Polski",
+    "checkEverySecond": "Sprawdzaj co {0} sekund",
+    "retryCheckEverySecond": "Ponawiaj co {0} sekund",
+    "retriesDescription": "Maksymalna liczba powtórzeń, zanim usługa zostanie oznaczona jako niedostępna i zostanie wysłane powiadomienie",
+    "ignoreTLSError": "Ignoruj błąd TLS/SSL dla stron HTTPS",
+    "upsideDownModeDescription": "Odwróć status do góry nogami. Jeśli usługa jest osiągalna, to jest oznaczona jako niedostępna.",
+    "maxRedirectDescription": "Maksymalna liczba przekierowań do wykonania. Ustaw na 0, aby wyłączyć przekierowania.",
+    "acceptedStatusCodesDescription": "Wybierz kody stanu, które są uważane za prawidłową odpowiedź.",
+    "passwordNotMatchMsg": "Powtórzone hasło nie pasuje.",
+    "notificationDescription": "Proszę przypisać powiadomienie do monitora(ów), aby działało.",
+    "keywordDescription": "Wyszukiwanie słów kluczowych w zwykłym html lub odpowiedzi JSON. Wielkość liter ma znaczenie.",
+    "pauseDashboardHome": "Wstrzymane",
+    "deleteMonitorMsg": "Czy na pewno chcesz usunąć ten monitor?",
+    "deleteNotificationMsg": "Czy na pewno chcesz usunąć to powiadomienie dla wszystkich monitorów?",
+    "resolverserverDescription": "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w każdej chwili.",
+    "rrtypeDescription": "Wybierz rodzaj rekordu, który chcesz monitorować.",
+    "pauseMonitorMsg": "Czy na pewno chcesz wstrzymać monitorowanie?",
+    "enableDefaultNotificationDescription": "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.",
+    "clearEventsMsg": "Jesteś pewien, że chcesz wyczyścić historię zdarzeń dla tego monitora?",
+    "clearHeartbeatsMsg": "Jesteś pewien, że chcesz wyczyścić historię bicia serca dla tego monitora?",
+    "confirmClearStatisticsMsg": "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?",
+    "importHandleDescription": "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.",
+    "confirmImportMsg": "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.",
+    "twoFAVerifyLabel": "Proszę, podaj swój token 2FA, aby sprawdzić, czy 2FA działa.",
+    "tokenValidSettingsMsg": "Token jest prawidłowy! Teraz możesz zapisać ustawienia 2FA.",
+    "confirmEnableTwoFAMsg": "Jesteś pewien, że chcesz włączyć 2FA?",
+    "confirmDisableTwoFAMsg": "Jesteś pewien, że chcesz wyłączyć 2FA?",
+    "Settings": "Ustawienia",
+    "Dashboard": "Panel",
+    "New Update": "Nowa aktualizacja",
+    "Language": "Język",
+    "Appearance": "Wygląd",
+    "Theme": "Motyw",
+    "General": "Ogólne",
+    "Version": "Wersja",
+    "Check Update On GitHub": "Sprawdź aktualizację na GitHub",
+    "List": "Lista",
+    "Add": "Dodaj",
+    "Add New Monitor": "Dodaj monitor",
+    "Quick Stats": "Szybki podgląd statystyk",
+    "Up": "Online",
+    "Down": "Offline",
+    "Pending": "Oczekuje",
+    "Unknown": "Nieznane",
+    "Pause": "Wstrzymaj",
+    "Name": "Nazwa",
+    "Status": "Status",
+    "DateTime": "Data i godzina",
+    "Message": "Wiadomość",
+    "No important events": "Brak ważnych wydarzeń",
+    "Resume": "Wznów",
+    "Edit": "Edytuj",
+    "Delete": "Usuń",
+    "Current": "Aktualny",
+    "Uptime": "Czas pracy",
+    "Cert Exp.": "Certyfikat wygasa",
+    "day": "dzień | dni",
+    "-day": " dni",
+    "hour": "godzina",
+    "-hour": " godzin",
+    "Response": "Odpowiedź",
+    "Ping": "Ping",
+    "Monitor Type": "Rodzaj monitora",
+    "Keyword": "Słowo kluczowe",
+    "Friendly Name": "Przyjazna nazwa",
+    "URL": "URL",
+    "Hostname": "Nazwa hosta",
+    "Port": "Port",
+    "Heartbeat Interval": "Częstotliwość bicia serca",
+    "Retries": "Prób",
+    "Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca",
+    "Advanced": "Zaawansowane",
+    "Upside Down Mode": "Tryb odwrócony",
+    "Max. Redirects": "Maks. przekierowań",
+    "Accepted Status Codes": "Akceptowane kody statusu",
+    "Save": "Zapisz",
+    "Notifications": "Powiadomienia",
+    "Not available, please setup.": "Niedostępne, proszę skonfigurować.",
+    "Setup Notification": "Skonfiguruj powiadomienie",
+    "Light": "Jasny",
+    "Dark": "Ciemny",
+    "Auto": "Automatyczny",
+    "Theme - Heartbeat Bar": "Motyw - pasek bicia serca",
+    "Normal": "Domyślne",
+    "Bottom": "Na dole",
+    "None": "Brak",
+    "Timezone": "Strefa czasowa",
+    "Search Engine Visibility": "Widoczność w wyszukiwarce",
+    "Allow indexing": "Zezwól na indeksowanie",
+    "Discourage search engines from indexing site": "Zniechęcaj wyszukiwarki do indeksowania strony",
+    "Change Password": "Zmień hasło",
+    "Current Password": "Aktualne hasło",
+    "New Password": "Nowe hasło",
+    "Repeat New Password": "Powtórz nowe hasło",
+    "Update Password": "Zaktualizuj hasło",
+    "Disable Auth": "Wyłącz autoryzację",
+    "Enable Auth": "Włącz autoryzację",
+    "disableauth.message1": "Czy na pewno chcesz <strong>wyłączyć autoryzację</strong>?",
+    "disableauth.message2": "Jest przeznaczony dla <strong>kogoś, kto ma autoryzację zewnętrzną</strong> przed Uptime Kuma, taką jak Cloudflare Access.",
+    "Please use this option carefully!": "Proszę używać ostrożnie.",
+    "Logout": "Wyloguj",
+    "Leave": "Zostaw",
+    "I understand, please disable": "Rozumiem, proszę wyłączyć",
+    "Confirm": "Potwierdź",
+    "Yes": "Tak",
+    "No": "Nie",
+    "Username": "Nazwa użytkownika",
+    "Password": "Hasło",
+    "Remember me": "Zapamiętaj mnie",
+    "Login": "Zaloguj",
+    "No Monitors, please": "Brak monitorów, proszę",
+    "add one": "dodać jeden",
+    "Notification Type": "Rodzaj powiadomienia",
+    "Email": "E-mail",
+    "Test": "Test",
+    "Certificate Info": "Informacje o certyfikacie",
+    "Resolver Server": "Serwer rozwiązywania nazw",
+    "Resource Record Type": "Typ rekordu zasobów",
+    "Last Result": "Ostatni wynik",
+    "Create your admin account": "Utwórz swoje konto administratora",
+    "Repeat Password": "Powtórz hasło",
+    "Import Backup": "Importuj kopię zapasową",
+    "Export Backup": "Eksportuj kopię zapasową",
+    "Export": "Eksportuj",
+    "Import": "Importuj",
+    "respTime": "Czas odp. (ms)",
+    "notAvailableShort": "N/D",
+    "Default enabled": "Włącz domyślnie",
+    "Apply on all existing monitors": "Zastosuj do istniejących monitorów",
+    "Create": "Stwórz",
+    "Clear Data": "Usuń dane",
+    "Events": "Wydarzenia",
+    "Heartbeats": "Bicia serca",
+    "Auto Get": "Wykryj",
+    "backupDescription": "Możesz wykonać kopię zapasową wszystkich monitorów i wszystkich powiadomień do pliku JSON.",
+    "backupDescription2": "PS: Historia i dane zdarzeń nie są uwzględniane.",
+    "backupDescription3": "Poufne dane, takie jak tokeny powiadomień, są zawarte w pliku eksportu, prosimy o ostrożne przechowywanie.",
+    "alertNoFile": "Wybierz plik do importu.",
+    "alertWrongFileType": "Proszę wybrać plik JSON.",
+    "Clear all statistics": "Wyczyść wszystkie statystyki",
+    "Skip existing": "Pomiń istniejące",
+    "Overwrite": "Nadpisz",
+    "Options": "Opcje",
+    "Keep both": "Zachowaj oba",
+    "Verify Token": "Zweryfikuj token",
+    "Setup 2FA": "Konfiguracja 2FA",
+    "Enable 2FA": "Włącz 2FA",
+    "Disable 2FA": "Wyłącz 2FA",
+    "2FA Settings": "Ustawienia 2FA",
+    "Two Factor Authentication": "Uwierzytelnienie dwuskładnikowe",
+    "Active": "Włączone",
+    "Inactive": "Wyłączone",
+    "Token": "Token",
+    "Show URI": "Pokaż URI",
+    "Tags": "Tagi",
+    "Add New below or Select...": "Dodaj nowy poniżej lub wybierz...",
+    "Tag with this name already exist.": "Tag o tej nazwie już istnieje.",
+    "Tag with this value already exist.": "Tag o tej wartości już istnieje.",
+    "color": "kolor",
+    "value (optional)": "wartość (opcjonalnie)",
+    "Gray": "Szary",
+    "Red": "Czerwony",
+    "Orange": "Pomarańczowy",
+    "Green": "Zielony",
+    "Blue": "Niebieski",
+    "Indigo": "Indygo",
+    "Purple": "Fioletowy",
+    "Pink": "Różowy",
+    "Search...": "Szukaj...",
+    "Avg. Ping": "Średni ping",
+    "Avg. Response": "Średnia odpowiedź",
+    "Entry Page": "Strona startowa",
+    "statusPageNothing": "Nic tu nie ma, dodaj grupę lub monitor.",
+    "No Services": "Brak usług",
+    "All Systems Operational": "Wszystkie systemy działają poprawnie",
+    "Partially Degraded Service": "Część usług nie działa",
+    "Degraded Service": "Usługa nie działa",
+    "Add Group": "Dodaj grupę",
+    "Add a monitor": "Dodaj monitor",
+    "Edit Status Page": "Edytuj stronę statusu",
+    "Go to Dashboard": "Idź do panelu",
+    "Status Page": "Strona statusu",
+    "Status Pages": "Strony statusów",
+    "defaultNotificationName": "Moje powiadomienie {notification} ({number})",
+    "here": "tutaj",
+    "Required": "Wymagane",
+    "telegram": "Telegram",
+    "Bot Token": "Token bota",
+    "wayToGetTelegramToken": "Token można uzyskać z {0}.",
+    "Chat ID": "Identyfikator czatu",
+    "supportTelegramChatID": "Czat wsparcia technicznego / Bezpośrednia rozmowa / Czat grupowy",
+    "wayToGetTelegramChatID": "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:",
+    "YOUR BOT TOKEN HERE": "TWÓJ TOKEN BOTA",
+    "chatIDNotFound": "Identyfikator czatu nie znaleziony, najpierw napisz do bota",
+    "webhook": "Webhook",
+    "Post URL": "Adres URL",
+    "Content Type": "Rodzaj danych",
+    "webhookJsonDesc": "{0} jest dobry w przypadku serwerów HTTP, takich jak express.js",
+    "webhookFormDataDesc": "{multipart} jest dobry dla PHP, musisz jedynie przetworzyć dane przez {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "Brak / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Zignoruj błędy TLS",
+    "From Email": "Nadawca (OD)",
+    "To Email": "Odbiorca (DO)",
+    "smtpCC": "DW",
+    "smtpBCC": "UDW",
+    "discord": "Discord",
+    "Discord Webhook URL": "URL webhook Discorda",
+    "wayToGetDiscordURL": "Możesz go uzyskać, przechodząc do Ustawienia serwera -> Integracje -> Tworzenie webhooka",
+    "Bot Display Name": "Wyświetlana nazwa bota",
+    "Prefix Custom Message": "Własny początek wiadomości",
+    "Hello @everyone is...": "Hej {'@'}everyone ...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "URL webhooka",
+    "wayToGetTeamsURL": "Możesz dowiedzieć się, jak utworzyć adres url webhooka {0}.",
+    "signal": "Signal",
+    "Number": "Numer",
+    "Recipients": "Odbiorcy",
+    "needSignalAPI": "Musisz mieć klienta Signal z REST API.",
+    "wayToCheckSignalURL": "W celu dowiedzenia się, jak go skonfigurować, odwiedź poniższy link:",
+    "signalImportant": "UWAGA: Nie można mieszać nazw grup i numerów odbiorców!",
+    "gotify": "Gotify",
+    "Application Token": "Token aplikacji",
+    "Server URL": "Server URL",
+    "Priority": "Priorytet",
+    "slack": "Slack",
+    "Icon Emoji": "Ikona emoji",
+    "Channel Name": "Nazwa kanału",
+    "Uptime Kuma URL": "Adres Uptime Kuma",
+    "aboutWebhooks": "Więcej informacji na temat webhooków: {0}",
+    "aboutChannelName": "Podaj nazwę kanału {0} w polu Nazwa kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal",
+    "aboutKumaURL": "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na GitHub.",
+    "emojiCheatSheet": "Ściąga emoji: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push od Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (obsługuje 50+ usług powiadomień)",
+    "GoogleChat": "Google Chat (wyłącznie Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Klucz użytkownika",
+    "Device": "Urządzenie",
+    "Message Title": "Tytuł wiadomości",
+    "Notification Sound": "Dźwięk powiadomienia",
+    "More info on:": "Więcej informacji na: {0}",
+    "pushoverDesc1": "Priorytet awaryjny (2) ma domyślny 30-sekundowy limit czasu między kolejnymi próbami i wygaśnie po 1 godzinie.",
+    "pushoverDesc2": "Jeśli chcesz wysyłać powiadomienia na różne urządzenia, wypełnij pole Urządzenie.",
+    "SMS Type": "Rodzaj SMS",
+    "octopushTypePremium": "Premium (szybki - rekomendowany dla powiadomień)",
+    "octopushTypeLowCost": "Low Cost (wolny, czasami blokowany przez operatorów)",
+    "Check octopush prices": "Sprawdź ceny Octopush {0}.",
+    "octopushPhoneNumber": "Numer telefonu (format międzynarodowy np.: +33612345678)",
+    "octopushSMSSender": "Nadawca SMS: 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)",
+    "LunaSea Device ID": "Identyfikator urządzenia LunaSea",
+    "Apprise URL": "URL Apprise",
+    "Example:": "Przykład: {0}",
+    "Read more:": "Czytaj dalej: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Czytaj dalej",
+    "appriseInstalled": "Apprise jest zainstalowane.",
+    "appriseNotInstalled": "Apprise nie zostało zainstalowane. {0}",
+    "Access Token": "Token dostępu",
+    "Channel access token": "Token dostępu kanału",
+    "Line Developers Console": "Konsola deweloperska Line",
+    "lineDevConsoleTo": "Konsola deweloperska Line - {0}",
+    "Basic Settings": "Ustawienia ogólne",
+    "User ID": "Identyfikator użytkownika",
+    "Messaging API": "API wiadomości",
+    "wayToGetLineChannelToken": "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.",
+    "Icon URL": "Adres Ikony",
+    "aboutIconURL": "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona emoji.",
+    "aboutMattermostChannelName": "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - tanie, lecz wolne. Dostępne tylko w Polsce",
+    "promosmsTypeFlash": "SMS FLASH - wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.",
+    "promosmsTypeFull": "SMS FULL - szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.",
+    "promosmsTypeSpeed": "SMS SPEED - wysyłka priorytetowa, ma wszystkie zalety SMS FULL",
+    "promosmsPhoneNumber": "Numer odbiorcy",
+    "promosmsSMSSender": "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)",
+    "Primary Base URL": "Główny URL",
+    "Push URL": "Push URL",
+    "needPushEvery": "Powinieneś wywoływać ten URL co {0} sekund",
+    "pushOptionalParams": "Parametry opcjonalne: {0}",
+    "emailCustomSubject": "Niestandardowy temat",
+    "checkPrice": "Sprawdź ceny {0}:",
+    "octopushLegacyHint": "Czy używasz starszej wersji Octopush (2011-2020) czy nowej wersji?",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Adres URL serwera domowego (z http(s):// i opcjonalnie port)",
+    "Internal Room Id": "Wewnętrzne ID pokoju",
+    "matrixDesc1": "Możesz znaleźć wewnętrzne ID pokoju, patrząc w zaawansowanej sekcji ustawień pokoju w twoim kliencie Matrix. Powinien on wyglądać jak !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Jest wysoce zalecane, abyś stworzył nowego użytkownika i nie używał tokena dostępu swojego użytkownika Matrix, ponieważ pozwoli on na pełny dostęp do twojego konta i wszystkich pokoi, do których dołączyłeś. Zamiast tego, utwórz nowego użytkownika i zaproś go tylko do pokoju, w którym chcesz otrzymywać powiadomienia. Możesz uzyskać token dostępu przez uruchomienie {0}",
+    "Method": "Metoda",
+    "Body": "Treść",
+    "Headers": "Nagłówki",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Nagłówki żądania nie są w poprawnym formacie JSON: ",
+    "BodyInvalidFormat": "Treść żądania nie jest w poprawnym formacie JSON: ",
+    "Monitor History": "Historia monitorów",
+    "clearDataOlderThan": "Przechowuj dane dotyczące historii monitorowania {0} dni.",
+    "PasswordsDoNotMatch": "Hasła nie pasują.",
+    "records": "rekordy",
+    "One record": "Jeden rekord",
+    "steamApiKeyDescription": "Do monitorowania serwera gier Steam potrzebny jest klucz Steam Web-API. Możesz zarejestrować swój klucz API tutaj: ",
+    "Current User": "Aktualny użytkownik",
+    "topic": "Temat",
+    "topicExplanation": "Temat MQTT do monitorowania",
+    "successMessage": "Komunikat o powodzeniu",
+    "successMessageExplanation": "Komunikat MQTT, który zostanie uznany za powodzenie",
+    "recent": "Ostatnie",
+    "Done": "Zrobione",
+    "Info": "Info",
+    "Security": "Bezpieczeństwo",
+    "Steam API Key": "Klucz Steam API",
+    "Shrink Database": "Zmniejsz bazę danych",
+    "Pick a RR-Type...": "Wybierz typ RR...",
+    "Pick Accepted Status Codes...": "Wybierz akceptowalne kody statusu...",
+    "Default": "Domyślnie",
+    "HTTP Options": "Opcje HTTP",
+    "Create Incident": "Stwórz incydent",
+    "Title": "Tytuł",
+    "Content": "Treść",
+    "Style": "Styl",
+    "info": "info",
+    "warning": "ostrzeżenie",
+    "danger": "niebezpieczeństwo",
+    "primary": "podstawowy",
+    "light": "jasny",
+    "dark": "ciemny",
+    "Post": "Wyślij",
+    "Please input title and content": "Podaj tytuł i treść",
+    "Created": "Stworzony",
+    "Last Updated": "Ostatnio zaktualizowany",
+    "Unpin": "Odepnij",
+    "Switch to Light Theme": "Przełącz na jasny motyw",
+    "Switch to Dark Theme": "Przełącz na ciemny motyw",
+    "Show Tags": "Pokaż tagi",
+    "Hide Tags": "Ukryj tagi",
+    "Description": "Opis",
+    "No monitors available.": "Brak dostępnych monitorów.",
+    "Add one": "Dodaj jeden",
+    "No Monitors": "Brak monitorów",
+    "Untitled Group": "Nienazwana grupa",
+    "Services": "Usługi",
+    "Discard": "Odrzuć",
+    "Cancel": "Anuluj",
+    "Powered by": "Napędzane przez",
+    "shrinkDatabaseDescription": "Uruchom VACUUM na bazie SQLite. Jeżeli twoja baza została stworzona po wersji 1.10.0, to ma już włączoną opcję AUTO_VACUUM i stosowanie ręcznego oczyszczania nie jest potrzebne.",
+    "clicksendsms": "ClickSend SMS",
+    "apiCredentials": "Poświadczenia API",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nazwa użytkownika API (z prefiksem webapi_)",
+    "serwersmsAPIPassword": "Hasło API",
+    "serwersmsPhoneNumber": "Numer telefonu",
+    "serwersmsSenderName": "Nazwa nadawcy (zatwierdzona w panelu klienta)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Numer/y telefonu",
+    "smseagleGroup": "Grupa/y z Książki adresowej",
+    "smseagleContact": "Kontakt/y z Książki adresowej",
+    "smseagleRecipientType": "Typ odbiorcy",
+    "smseagleRecipient": "Odbiorca/y (wiele musi być oddzielone przecinkami)",
+    "smseagleToken": "Klucz dostępu API",
+    "smseagleUrl": "URL Twojego urządzenia SMSEagle",
+    "smseagleEncoding": "Wyślij jako Unicode",
+    "smseaglePriority": "Priorytet wiadomości (0-9, domyślnie = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "Dostosuj",
+    "Custom Footer": "Niestandardowa stopka",
+    "Custom CSS": "Niestandardowy CSS",
+    "smtpDkimSettings": "Ustawienia DKIM",
+    "smtpDkimDesc": "Zapoznaj się z Nodemailer DKIM {0}, aby dowiedzieć się więcej",
+    "documentation": "dokumentacja",
+    "smtpDkimDomain": "Nazwa domeny",
+    "smtpDkimKeySelector": "Selektor klucza",
+    "smtpDkimPrivateKey": "Klucz prywatny",
+    "smtpDkimHashAlgo": "Algorytm haszujący (opcjonalne)",
+    "smtpDkimheaderFieldNames": "Klucze nagłówka do podpisu (opcjonalne)",
+    "smtpDkimskipFields": "Klucze nagłówka do pominięcia (opcjonalne)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Punkt końcowy API",
+    "alertaEnvironment": "Środowisko",
+    "alertaApiKey": "Klucz API",
+    "alertaAlertState": "Alert State",
+    "alertaRecoverState": "Recover State",
+    "deleteStatusPageMsg": "Jesteś pewien, że chcesz usunąć tę stronę statusów?",
+    "Proxies": "Proxy",
+    "default": "Domyślny",
+    "enabled": "Włączony",
+    "setAsDefault": "Ustaw jako domyślny",
+    "deleteProxyMsg": "Jesteś pewien, że chcesz usunąć proxy ze wszystkich monitorów?",
+    "proxyDescription": "Proxy muszą być przypisane do monitora, aby działały.",
+    "enableProxyDescription": "Ten serwer proxy nie będzie miał wpływu na żądania monitorów, dopóki nie zostanie aktywowany. Możesz kontrolować tymczasowe wyłączenie serwera proxy ze wszystkich monitorów za pomocą statusu aktywacji.",
+    "setAsDefaultProxyDescription": "Ten serwer proxy będzie domyślnie włączony dla nowych monitorów. Można go jednak wyłączyć osobno dla każdego monitora.",
+    "Certificate Chain": "Łańcuch certyfikatów",
+    "Valid": "Ważny",
+    "Invalid": "Nieważny",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Sekret",
+    "PhoneNumbers": "Numery telefonów",
+    "TemplateCode": "Kod szablonu",
+    "SignName": "Podpis",
+    "Sms template must contain parameters: ": "Szablon sms musi posiadać parametry: ",
+    "Bark Endpoint": "Punkt końcowy Bark",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "Tajny klucz",
+    "For safety, must use secret key": "Ze względów bezpieczeństwa musisz użyć tajnego klucza",
+    "Device Token": "Device Token",
+    "Platform": "Platforma",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Wysoki",
+    "Retry": "Ponów",
+    "Topic": "Temat",
+    "WeCom Bot Key": "Klucz bota WeCom",
+    "Setup Proxy": "Skonfiguruj proxy",
+    "Proxy Protocol": "Protokół proxy",
+    "Proxy Server": "Serwer proxy",
+    "Proxy server has authentication": "Serwer proxy ma autoryzację",
+    "User": "Użytkownik",
+    "Installed": "Zainstalowany",
+    "Not installed": "Nie zainstalowany",
+    "Running": "Działa",
+    "Not running": "Nie działa",
+    "Remove Token": "Usuń token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Dodaj nową stronę statusów",
+    "Slug": "Symbol",
+    "Accept characters:": "Dozwolone znaki:",
+    "startOrEndWithOnly": "Zaczynające się i kończące wyłącznie {0} znakami",
+    "No consecutive dashes": "Bez powtarzających się myślników",
+    "Next": "Dalej",
+    "The slug is already taken. Please choose another slug.": "Ten symbol jest już zajęty. Proszę, wybierz inny.",
+    "No Proxy": "Bez proxy",
+    "Authentication": "Uwierzytelnianie",
+    "HTTP Basic Auth": "Podstawowa autoryzacja HTTP",
+    "New Status Page": "Nowa strona statusu",
+    "Page Not Found": "Strona nie została znaleziona",
+    "Reverse Proxy": "Zwrotny serwer proxy",
+    "Backup": "Backup",
+    "About": "O skrypcie",
+    "wayToGetCloudflaredURL": "(Pobierz cloudflared z {0})",
+    "cloudflareWebsite": "Strona Cloudflare",
+    "Message:": "Wiadomość:",
+    "Don't know how to get the token? Please read the guide:": "Nie wiesz jak uzyksać token? Przeczytaj proszę poradnik:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Bieżące połączenie może zostać utracone, jeśli aktualnie łączysz się przez tunel Cloudflare. Czy na pewno chcesz to przerwać? Wpisz swoje aktualne hasło, aby je potwierdzić.",
+    "Other Software": "Inne oprogramowanie",
+    "For example: nginx, Apache and Traefik.": "Na przykład: nginx, Apache i Traefik.",
+    "Please read": "Przeczytaj proszę",
+    "Subject:": "Temat:",
+    "Valid To:": "Ważny do:",
+    "Days Remaining:": "Pozostało dni:",
+    "Issuer:": "Wydawca:",
+    "Fingerprint:": "Odcisk palca:",
+    "No status pages": "Brak stron statusów",
+    "Domain Name Expiry Notification": "Powiadomienie o wygasaniu domeny",
+    "Proxy": "Proxy",
+    "Date Created": "Data stworzenia",
+    "onebotHttpAddress": "Adres HTTP OneBot",
+    "onebotMessageType": "Rodzaj wiadomości OneBot",
+    "onebotGroupMessage": "Grupowa",
+    "onebotPrivateMessage": "Prywatna",
+    "onebotUserOrGroupId": "ID Grupy/Użytkownika",
+    "onebotSafetyTips": "Ze względów bezpieczeństwa musisz ustawić token dostępu",
+    "PushDeer Key": "Klucz PushDeer",
+    "Footer Text": "Treść stopki",
+    "Show Powered By": "Pokaż co napędza stronę",
+    "Domain Names": "Domeny",
+    "signedInDisp": "Zalogowany jako {0}",
+    "signedInDispDisabled": "Autoryzacja wyłączona.",
+    "resendEveryXTimes": "Wysyłaj ponownie co {0} razy",
+    "resendDisabled": "Ponowne wysyłanie jest wyłączone",
+    "Maintenance": "Konserwacja",
+    "statusMaintenance": "Konserwacja",
+    "Schedule maintenance": "Planowanie konserwacji",
+    "Affected Monitors": "Monitory dotknięte problemem",
+    "Pick Affected Monitors...": "Wybierz monitory, których to dotyczy...",
+    "Start of maintenance": "Rozpoczęcie konserwacji",
+    "All Status Pages": "Wszystkie strony statusu",
+    "Select status pages...": "Wybierz strony statusu...",
+    "recurringIntervalMessage": "Uruchom raz dziennie | Uruchom raz na {0} dni",
+    "affectedMonitorsDescription": "Wybierz monitory, których dotyczy bieżąca konserwacja",
+    "affectedStatusPages": "Pokaż ten komunikat o konserwacji na wybranych stronach statusu",
+    "atLeastOneMonitor": "Wybierz co najmniej jeden monitor, którego dotyczy problem",
+    "deleteMaintenanceMsg": "Czy na pewno chcesz usunąć tę konserwację?",
+    "dnsPortDescription": "Port serwera DNS. Domyślnie 53. Możesz zmienić port w dowolnym momencie.",
+    "Resend Notification if Down X times consequently": "Wyślij ponownie powiadomienie, jeśli nie działa X razy pod rząd",
+    "error": "błąd",
+    "critical": "krytyczny",
+    "wayToGetPagerDutyKey": "Możesz to uzyskać, przechodząc do Service -> Service Directory -> (wybierz usługę) -> Integrations -> Add integration. Tutaj możesz wyszukać \"Events API V2\". Więcej informacji {0}",
+    "Integration Key": "Klucz integracji",
+    "Integration URL": "Adres URL integracji",
+    "Auto resolve or acknowledged": "Automatycznie rozwiązany lub potwierdzony",
+    "do nothing": "nie rób nic",
+    "auto acknowledged": "auto potwierdzony",
+    "auto resolve": "automatycznie rozwiązany",
+    "Bark Group": "Grupa Bark",
+    "Bark Sound": "Dźwięk Bark",
+    "HTTP Headers": "Nagłówki HTTP",
+    "Trust Proxy": "Ufaj proxy",
+    "HomeAssistant": "Home Assistant",
+    "RadiusSecret": "Sekretny klucz Radius",
+    "RadiusSecretDescription": "Współdzielony sekretny klucz pomiędzy klientem a serwerem",
+    "RadiusCalledStationId": "Id stacji wywoływanej",
+    "RadiusCalledStationIdDescription": "Identyfikator wywoływanego urządzenia",
+    "RadiusCallingStationId": "Id stacji wywoławczej",
+    "RadiusCallingStationIdDescription": "Identyfikator urządzenia wywołującego",
+    "Certificate Expiry Notification": "Powiadomienie o wygaśnięciu certyfikatu",
+    "API Username": "Nazwa użytkownika API",
+    "API Key": "Klucz API",
+    "Recipient Number": "Numer odbiorcy",
+    "From Name/Number": "Od nazwa/numer",
+    "Leave blank to use a shared sender number.": "Pozostaw puste, aby użyć wspólnego numeru nadawcy.",
+    "Octopush API Version": "Wersja API Octopush",
+    "Legacy Octopush-DM": "Starsze Octopush-DM",
+    "endpoint": "punkt końcowy",
+    "octopushAPIKey": "\"API key\" z poświadczeń HTTP API w panelu sterowania",
+    "octopushLogin": "\"Login\" z poświadczeń HTTP API w panelu sterowania",
+    "promosmsLogin": "Nazwa logowania API",
+    "promosmsPassword": "Hasło API",
+    "pushoversounds pushover": "Pushover (domyślny)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (długie)",
+    "pushoversounds climb": "Climb (długie)",
+    "pushoversounds persistent": "Persistent (długie)",
+    "pushoversounds echo": "Pushover Echo (długie)",
+    "pushoversounds updown": "Up Down (długie)",
+    "pushoversounds vibrate": "Tylko wibracje",
+    "pushoversounds none": "Brak (cisza)",
+    "pushyAPIKey": "Tajny klucz API",
+    "pushyToken": "Token urządzenia",
+    "Show update if available": "Pokaż aktualizację, jeśli jest dostępna",
+    "Also check beta release": "Sprawdź również wydanie beta",
+    "Using a Reverse Proxy?": "Używasz odwróconego proxy?",
+    "Check how to config it for WebSocket": "Sprawdź jak go skonfigurować dla WebSocket",
+    "Steam Game Server": "Serwer gry Steam",
+    "Most likely causes:": "Najbardziej prawdopodobne przyczyny:",
+    "The resource is no longer available.": "Zasób nie jest już dostępny.",
+    "There might be a typing error in the address.": "W adresie może być błąd w pisowni.",
+    "What you can try:": "Co możesz spróbować:",
+    "Retype the address.": "Ponownie wpisz adres.",
+    "Go back to the previous page.": "Wróć do poprzedniej strony.",
+    "Coming Soon": "Wkrótce",
+    "wayToGetClickSendSMSToken": "Możesz uzyskać nazwę użytkownika API i klucz API z {0}.",
+    "Connection String": "Ciąg połączenia",
+    "Query": "Zapytanie",
+    "settingsCertificateExpiry": "Wygaśnięcie certyfikatu TLS",
+    "certificationExpiryDescription": "Monitory HTTPS uruchamiają powiadomienia o wygaśnięciu certyfikatu TLS w:",
+    "Setup Docker Host": "Konfiguracja hosta Docker",
+    "Connection Type": "Typ połączenia",
+    "Docker Daemon": "Demon Dockera",
+    "deleteDockerHostMsg": "Czy na pewno chcesz usunąć ten host Dockera dla wszystkich monitorów?",
+    "socket": "Gniazdo",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Kontener Dockera",
+    "Container Name / ID": "Nazwa kontenera / ID",
+    "Docker Host": "Host Dockera",
+    "Docker Hosts": "Hosty Dockera",
+    "ntfy Topic": "Temat ntfy",
+    "Domain": "Domena",
+    "Workstation": "Stacja robocza",
+    "disableCloudflaredNoAuthMsg": "Jesteś w trybie No Auth, hasło nie jest wymagane.",
+    "trustProxyDescription": "Zaufaj nagłówkom 'X-Forwarded-*'. Jeśli chcesz uzyskać poprawne IP klienta, a twój Uptime Kuma jest za Nginx lub Apache, powinieneś to włączyć.",
+    "wayToGetLineNotifyToken": "Możesz uzyskać token dostępu z {0}",
+    "Examples": "Przykłady",
+    "Home Assistant URL": "URL Home Assistant",
+    "Long-Lived Access Token": "Długotrwały token dostępu",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Długotrwały token dostępu można utworzyć klikając na nazwę swojego profilu (na dole po lewej stronie) i przewijając do dołu, a następnie klikając Create Token. ",
+    "Notification Service": "Usługa powiadamiania",
+    "default: notify all devices": "domyślnie: powiadamiaj wszystkie urządzenia",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Listę usług powiadamiania można znaleźć w Home Assistant pod \"Developer Tools > Services\" wyszukaj \"notification\", aby znaleźć nazwę swojego urządzenia/telefonu.",
+    "Automations can optionally be triggered in Home Assistant:": "Automaty mogą być opcjonalnie uruchamiane w Home Assistant:",
+    "Trigger type:": "Typ wyzwalacza:",
+    "Event type:": "Typ zdarzenia:",
+    "Event data:": "Dane o zdarzeniu:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Następnie wybierz akcję, na przykład przełącz scenę na taką, w której światło RGB jest czerwone.",
+    "Frontend Version": "Wersja frontu",
+    "Frontend Version do not match backend version!": "Wersja frontu nie pasuje do wersji backendu!",
+    "Base URL": "Bazowy adres URL",
+    "goAlertInfo": "GoAlert to aplikacja open source do planowania, automatycznych eskalacji i powiadomień (jak SMS lub połączenia głosowe). Automatycznie angażuj właściwą osobę, we właściwy sposób i we właściwym czasie! {0}",
+    "goAlertIntegrationKeyInfo": "Pobierz generyczny klucz integracyjny API dla usługi, którego wartość skopiowanego tokena URL jest zwykle w formacie \"aaaaaaaa-bbb-cccc-dddd-eeeeee\".",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Przestarzałe: ponieważ dodano wiele funkcji i funkcja tworzenia kopii zapasowych nie jest wystarczająco utrzymywana, nie może generować ani przywracać pełnej kopii zapasowej.",
+    "backupRecommend": "Zamiast tego należy wykonać bezpośrednią kopię zapasową woluminu lub folderu danych (./data/).",
+    "Optional": "Opcjonalne",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "Dokumentacja API SMSManager ",
+    "Gateway Type": "Typ bramy",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Możesz dzielić liczby przez",
+    "or": "lub",
+    "recurringInterval": "odstęp czasu",
+    "Recurring": "powtarzający się",
+    "strategyManual": "Aktywowany/dezaktywowany ręcznie",
+    "warningTimezone": "Używa strefy czasowej serwera",
+    "weekdayShortMon": "pon",
+    "weekdayShortTue": "wt",
+    "weekdayShortWed": "śr",
+    "weekdayShortThu": "czw",
+    "weekdayShortFri": "pt",
+    "weekdayShortSat": "sob",
+    "weekdayShortSun": "niedz",
+    "dayOfWeek": "Dzień tygodnia",
+    "dayOfMonth": "Dzień miesiąca",
+    "lastDay": "Ostatni dzień",
+    "lastDay1": "Ostatni dzień miesiąca",
+    "lastDay2": "2. ostatni dzień miesiąca",
+    "lastDay3": "3. ostatni dzień miesiąca",
+    "lastDay4": "4. ostatni dzień miesiąca",
+    "No Maintenance": "Brak konserwacji",
+    "pauseMaintenanceMsg": "Jesteś pewien, że chcesz zatrzymać?",
+    "maintenanceStatus-under-maintenance": "Podczas konserwacji",
+    "maintenanceStatus-inactive": "Nieaktywny",
+    "maintenanceStatus-scheduled": "Zaplanowany",
+    "maintenanceStatus-ended": "Zakończony",
+    "maintenanceStatus-unknown": "Nieznany",
+    "Display Timezone": "Wyświetlana strefa czasowa",
+    "Server Timezone": "Strefa czasowa serwera",
+    "statusPageMaintenanceEndDate": "Koniec"
+}
diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json
new file mode 100644
index 00000000..1f951407
--- /dev/null
+++ b/src/lang/pt-BR.json
@@ -0,0 +1,203 @@
+{
+    "languageName": "Português (Brasileiro)",
+    "checkEverySecond": "Verificar cada {0} segundos.",
+    "retryCheckEverySecond": "Tentar novamente a cada {0} segundos.",
+    "retriesDescription": "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
+    "ignoreTLSError": "Ignorar erros TLS/SSL para sites HTTPS",
+    "upsideDownModeDescription": "Inverta o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
+    "maxRedirectDescription": "Número máximo de redirecionamentos a seguir. Defina como 0 para desativar redirecionamentos.",
+    "acceptedStatusCodesDescription": "Selecione os códigos de status que são considerados uma resposta bem-sucedida.",
+    "passwordNotMatchMsg": "A senha repetida não corresponde.",
+    "notificationDescription": "Atribua uma notificação ao (s) monitor (es) para que funcione.",
+    "keywordDescription": "Pesquise a palavra-chave em html simples ou resposta JSON e diferencia maiúsculas de minúsculas",
+    "pauseDashboardHome": "Pausar",
+    "deleteMonitorMsg": "Tem certeza de que deseja excluir este monitor?",
+    "deleteNotificationMsg": "Tem certeza de que deseja excluir esta notificação para todos os monitores?",
+    "resolverserverDescription": "Cloudflare é o servidor padrão, você pode alterar o servidor resolvedor a qualquer momento.",
+    "rrtypeDescription": "Selecione o RR-Type que você deseja monitorar",
+    "pauseMonitorMsg": "Tem certeza que deseja fazer uma pausa?",
+    "enableDefaultNotificationDescription": "Para cada novo monitor, esta notificação será habilitada por padrão. Você ainda pode desativar a notificação separadamente para cada monitor.",
+    "clearEventsMsg": "Tem certeza de que deseja excluir todos os eventos deste monitor?",
+    "clearHeartbeatsMsg": "Tem certeza de que deseja excluir todos os heartbeats deste monitor?",
+    "confirmClearStatisticsMsg": "Tem certeza que deseja excluir TODAS as estatísticas?",
+    "importHandleDescription": "Escolha 'Ignorar existente' se quiser ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
+    "confirmImportMsg": "Tem certeza que deseja importar o backup? Certifique-se de que selecionou a opção de importação correta.",
+    "twoFAVerifyLabel": "Digite seu token para verificar se 2FA está funcionando",
+    "tokenValidSettingsMsg": "O token é válido! Agora você pode salvar as configurações 2FA.",
+    "confirmEnableTwoFAMsg": "Tem certeza de que deseja habilitar 2FA?",
+    "confirmDisableTwoFAMsg": "Tem certeza de que deseja desativar 2FA?",
+    "Settings": "Configurações",
+    "Dashboard": "Dashboard",
+    "New Update": "Nova Atualização",
+    "Language": "Linguagem",
+    "Appearance": "Aparência",
+    "Theme": "Tema",
+    "General": "Geral",
+    "Version": "Versão",
+    "Check Update On GitHub": "Verificar atualização no Github",
+    "List": "Lista",
+    "Add": "Adicionar",
+    "Add New Monitor": "Adicionar novo monitor",
+    "Quick Stats": "Estatísticas rápidas",
+    "Up": "On",
+    "Down": "Off",
+    "Pending": "Pendente",
+    "Unknown": "Desconhecido",
+    "Pause": "Pausar",
+    "Name": "Nome",
+    "Status": "Status",
+    "DateTime": "Data hora",
+    "Message": "Mensagem",
+    "No important events": "Nenhum evento importante",
+    "Resume": "Resumo",
+    "Edit": "Editar",
+    "Delete": "Deletar",
+    "Current": "Atual",
+    "Uptime": "Tempo de atividade",
+    "Cert Exp.": "Cert Exp.",
+    "day": "dia | dias",
+    "-day": "-dia",
+    "hour": "hora",
+    "-hour": "-hora",
+    "Response": "Resposta",
+    "Ping": "Ping",
+    "Monitor Type": "Tipo de Monitor",
+    "Keyword": "Palavra-Chave",
+    "Friendly Name": "Nome Amigável",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Porta",
+    "Heartbeat Interval": "Intervalo de Heartbeat",
+    "Retries": "Novas tentativas",
+    "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeat",
+    "Advanced": "Avançado",
+    "Upside Down Mode": "Modo de cabeça para baixo",
+    "Max. Redirects": "Redirecionamento Máx.",
+    "Accepted Status Codes": "Status Code Aceitáveis",
+    "Save": "Salvar",
+    "Notifications": "Notificações",
+    "Not available, please setup.": "Não disponível, por favor configure.",
+    "Setup Notification": "Configurar Notificação",
+    "Light": "Claro",
+    "Dark": "Escuro",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Tema - Barra de Heartbeat",
+    "Normal": "Normal",
+    "Bottom": "Inferior",
+    "None": "Nenhum",
+    "Timezone": "Fuso horário",
+    "Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
+    "Allow indexing": "Permitir Indexação",
+    "Discourage search engines from indexing site": "Desencoraje os motores de busca de indexar o site",
+    "Change Password": "Mudar senha",
+    "Current Password": "Senha atual",
+    "New Password": "Nova Senha",
+    "Repeat New Password": "Repetir Nova Senha",
+    "Update Password": "Atualizar Senha",
+    "Disable Auth": "Desativar Autenticação",
+    "Enable Auth": "Ativar Autenticação",
+    "disableauth.message1": "Você tem certeza que deseja <strong>desativar a autenticação</strong>?",
+    "disableauth.message2": "Isso é para <strong>alguém que tem autenticação de terceiros</strong> na frente do 'UpTime Kuma' como o Cloudflare Access.",
+    "Please use this option carefully!": "Por favor, utilize isso com cautela.",
+    "Logout": "Deslogar",
+    "Leave": "Sair",
+    "I understand, please disable": "Eu entendo, por favor desative.",
+    "Confirm": "Confirmar",
+    "Yes": "Sim",
+    "No": "Não",
+    "Username": "Usuário",
+    "Password": "Senha",
+    "Remember me": "Lembre-me",
+    "Login": "Autenticar",
+    "No Monitors, please": "Nenhum monitor, por favor",
+    "add one": "adicionar um",
+    "Notification Type": "Tipo de Notificação",
+    "Email": "Email",
+    "Test": "Testar",
+    "Certificate Info": "Info. do Certificado ",
+    "Resolver Server": "Resolver Servidor",
+    "Resource Record Type": "Tipo de registro de aplicação",
+    "Last Result": "Último resultado",
+    "Create your admin account": "Crie sua conta de admin",
+    "Repeat Password": "Repita a senha",
+    "Import Backup": "Importar Backup",
+    "Export Backup": "Exportar Backup",
+    "Export": "Exportar",
+    "Import": "Importar",
+    "respTime": "Tempo de Resp. (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Padrão habilitado",
+    "Apply on all existing monitors": "Aplicar em todos os monitores existentes",
+    "Create": "Criar",
+    "Clear Data": "Limpar Dados",
+    "Events": "Eventos",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Obter Automático",
+    "backupDescription": "Você pode fazer backup de todos os monitores e todas as notificações em um arquivo JSON.",
+    "backupDescription2": "OBS: Os dados do histórico e do evento não estão incluídos.",
+    "backupDescription3": "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantenha-o com cuidado.",
+    "alertNoFile": "Selecione um arquivo para importar.",
+    "alertWrongFileType": "Selecione um arquivo JSON.",
+    "Clear all statistics": "Limpar todas as estatísticas",
+    "Skip existing": "Pular existente",
+    "Overwrite": "Sobrescrever",
+    "Options": "Opções",
+    "Keep both": "Manter os dois",
+    "Verify Token": "Verificar Token",
+    "Setup 2FA": "Configurar 2FA",
+    "Enable 2FA": "Ativar 2FA",
+    "Disable 2FA": "Desativar 2FA",
+    "2FA Settings": "Configurações do 2FA ",
+    "Two Factor Authentication": "Autenticação e Dois Fatores",
+    "Active": "Ativo",
+    "Inactive": "Inativo",
+    "Token": "Token",
+    "Show URI": "Mostrar URI",
+    "Tags": "Tag",
+    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar ...",
+    "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
+    "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
+    "color": "cor",
+    "value (optional)": "valor (opcional)",
+    "Gray": "Cinza",
+    "Red": "Vermelho",
+    "Orange": "Laranja",
+    "Green": "Verde",
+    "Blue": "Azul",
+    "Indigo": "Índigo",
+    "Purple": "Roxo",
+    "Pink": "Rosa",
+    "Search...": "Buscar...",
+    "Avg. Ping": "Ping Médio.",
+    "Avg. Response": "Resposta Média. ",
+    "Status Page": "Página de Status",
+    "Status Pages": "Página de Status",
+    "Entry Page": "Página de entrada",
+    "statusPageNothing": "Nada aqui, por favor, adicione um grupo ou monitor.",
+    "No Services": "Nenhum Serviço",
+    "All Systems Operational": "Todos os Serviços Operacionais",
+    "Partially Degraded Service": "Serviço parcialmente degradado",
+    "Degraded Service": "Serviço Degradado",
+    "Add Group": "Adicionar Grupo",
+    "Add a monitor": "Adicionar um monitor",
+    "Edit Status Page": "Editar Página de Status",
+    "Go to Dashboard": "Ir para a dashboard",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost"
+}
diff --git a/src/lang/pt-PT.json b/src/lang/pt-PT.json
new file mode 100644
index 00000000..d8fc793e
--- /dev/null
+++ b/src/lang/pt-PT.json
@@ -0,0 +1,203 @@
+{
+    "languageName": "Português (Portugal)",
+    "checkEverySecond": "Verificar a cada {0} segundos.",
+    "retryCheckEverySecond": "Tentar novamente a cada {0} segundos.",
+    "retriesDescription": "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
+    "ignoreTLSError": "Ignorar erros TLS/SSL para sites HTTPS",
+    "upsideDownModeDescription": "Inverte o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
+    "maxRedirectDescription": "Número máximo de redirecionamentos a seguir. Define como 0 para desativar redirecionamentos.",
+    "acceptedStatusCodesDescription": "Seleciona os códigos de status que são considerados uma resposta bem-sucedida.",
+    "passwordNotMatchMsg": "A senha repetida não corresponde.",
+    "notificationDescription": "Atribuir uma notificação ao (s) monitor (es) para que funcione.",
+    "keywordDescription": "Pesquisa a palavra-chave em HTML simples ou resposta JSON e diferencia maiúsculas de minúsculas",
+    "pauseDashboardHome": "Pausa",
+    "deleteMonitorMsg": "Tens a certeza de que queres excluir este monitor?",
+    "deleteNotificationMsg": "Tens a certeza de que queres excluir esta notificação para todos os monitores?",
+    "resolverserverDescription": "A Cloudflare é o servidor padrão, podes alterar o servidor 'resolvedor' a qualquer momento.",
+    "rrtypeDescription": "Seleciona o RR-Type que queres monitorizar",
+    "pauseMonitorMsg": "Tens a certeza que queres fazer uma pausa?",
+    "enableDefaultNotificationDescription": "Para cada monitor novo esta notificação vai estar activa por padrão. Podes também desativar a notificação separadamente para cada monitor.",
+    "clearEventsMsg": "Tens a certeza que queres excluir todos os eventos deste monitor?",
+    "clearHeartbeatsMsg": "Tens a certeza de que queres excluir todos os heartbeats deste monitor?",
+    "confirmClearStatisticsMsg": "Tens a certeza que queres excluir TODAS as estatísticas?",
+    "importHandleDescription": "Escolhe 'Ignorar existente' se quiseres ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
+    "confirmImportMsg": "Tens a certeza que queres importar o backup? Certifica-te que selecionaste a opção de importação correta.",
+    "twoFAVerifyLabel": "Insire o teu token para verificares se o 2FA está a funcionar",
+    "tokenValidSettingsMsg": "O token é válido! Agora podes salvar as configurações do 2FA.",
+    "confirmEnableTwoFAMsg": "Tens a certeza de que queres habilitar 2FA?",
+    "confirmDisableTwoFAMsg": "Tens a certeza de que queres desativar 2FA?",
+    "Settings": "Configurações",
+    "Dashboard": "Dashboard",
+    "New Update": "Nova Atualização",
+    "Language": "Linguagem",
+    "Appearance": "Aparência",
+    "Theme": "Tema",
+    "General": "Geral",
+    "Version": "Versão",
+    "Check Update On GitHub": "Verificar atualização no Github",
+    "List": "Lista",
+    "Add": "Adicionar",
+    "Add New Monitor": "Adicionar novo monitor",
+    "Quick Stats": "Estatísticas rápidas",
+    "Up": "On",
+    "Down": "Off",
+    "Pending": "Pendente",
+    "Unknown": "Desconhecido",
+    "Pause": "Pausa",
+    "Name": "Nome",
+    "Status": "Status",
+    "DateTime": "Data hora",
+    "Message": "Mensagem",
+    "No important events": "Nenhum evento importante",
+    "Resume": "Resumo",
+    "Edit": "Editar",
+    "Delete": "Apagar",
+    "Current": "Atual",
+    "Uptime": "Tempo de atividade",
+    "Cert Exp.": "Cert Exp.",
+    "day": "dia | dias",
+    "-day": "-dia",
+    "hour": "hora",
+    "-hour": "-hora",
+    "Response": "Resposta",
+    "Ping": "Ping",
+    "Monitor Type": "Tipo de Monitor",
+    "Keyword": "Palavra-Chave",
+    "Friendly Name": "Nome Amigável",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Porta",
+    "Heartbeat Interval": "Intervalo de Heartbeats",
+    "Retries": "Novas tentativas",
+    "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeats",
+    "Advanced": "Avançado",
+    "Upside Down Mode": "Modo de cabeça para baixo",
+    "Max. Redirects": "Redirecionamento Máx.",
+    "Accepted Status Codes": "Status Code Aceitáveis",
+    "Save": "Guardar",
+    "Notifications": "Notificações",
+    "Not available, please setup.": "Não disponível, por favor configura.",
+    "Setup Notification": "Configurar Notificação",
+    "Light": "Claro",
+    "Dark": "Escuro",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Tema - Barra de Heartbeat",
+    "Normal": "Normal",
+    "Bottom": "Inferior",
+    "None": "Nenhum",
+    "Timezone": "Fuso horário",
+    "Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
+    "Allow indexing": "Permitir Indexação",
+    "Discourage search engines from indexing site": "Desencorajar que motores de busca indexem o site",
+    "Change Password": "Mudar senha",
+    "Current Password": "Senha atual",
+    "New Password": "Nova Senha",
+    "Repeat New Password": "Repetir Nova Senha",
+    "Update Password": "Atualizar Senha",
+    "Disable Auth": "Desativar Autenticação",
+    "Enable Auth": "Ativar Autenticação",
+    "disableauth.message1": "Tens a certeza que queres <strong>desativar a autenticação</strong>?",
+    "disableauth.message2": "Isso é para <strong>alguém que tem autenticação de terceiros</strong> em frente ao 'UpTime Kuma' como o Cloudflare Access.",
+    "Please use this option carefully!": "Por favor, utiliza esta opção com cuidado.",
+    "Logout": "Logout",
+    "Leave": "Sair",
+    "I understand, please disable": "Eu entendo, por favor desativa.",
+    "Confirm": "Confirmar",
+    "Yes": "Sim",
+    "No": "Não",
+    "Username": "Utilizador",
+    "Password": "Senha",
+    "Remember me": "Lembra-me",
+    "Login": "Autenticar",
+    "No Monitors, please": "Nenhum monitor, por favor",
+    "add one": "adicionar um",
+    "Notification Type": "Tipo de Notificação",
+    "Email": "Email",
+    "Test": "Testar",
+    "Certificate Info": "Info. do Certificado ",
+    "Resolver Server": "Resolver Servidor",
+    "Resource Record Type": "Tipo de registro de aplicação",
+    "Last Result": "Último resultado",
+    "Create your admin account": "Cria a tua conta de admin",
+    "Repeat Password": "Repete a senha",
+    "Import Backup": "Importar Backup",
+    "Export Backup": "Exportar Backup",
+    "Export": "Exportar",
+    "Import": "Importar",
+    "respTime": "Tempo de Resp. (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Padrão habilitado",
+    "Apply on all existing monitors": "Aplicar em todos os monitores existentes",
+    "Create": "Criar",
+    "Clear Data": "Limpar Dados",
+    "Events": "Eventos",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Obter Automático",
+    "backupDescription": "Podes fazer backup de todos os monitores e todas as notificações num arquivo JSON.",
+    "backupDescription2": "OBS: Os dados do histórico e do evento não estão incluídos.",
+    "backupDescription3": "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantem-no com cuidado.",
+    "alertNoFile": "Seleciona um arquivo para importar.",
+    "alertWrongFileType": "Seleciona um arquivo JSON.",
+    "Clear all statistics": "Limpar todas as estatísticas",
+    "Skip existing": "Saltar existente",
+    "Overwrite": "Sobrescrever",
+    "Options": "Opções",
+    "Keep both": "Manter os dois",
+    "Verify Token": "Verificar Token",
+    "Setup 2FA": "Configurar 2FA",
+    "Enable 2FA": "Ativar 2FA",
+    "Disable 2FA": "Desativar 2FA",
+    "2FA Settings": "Configurações do 2FA ",
+    "Two Factor Authentication": "Autenticação de Dois Fatores",
+    "Active": "Ativo",
+    "Inactive": "Inativo",
+    "Token": "Token",
+    "Show URI": "Mostrar URI",
+    "Tags": "Tag",
+    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar ...",
+    "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
+    "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
+    "color": "cor",
+    "value (optional)": "valor (opcional)",
+    "Gray": "Cinza",
+    "Red": "Vermelho",
+    "Orange": "Laranja",
+    "Green": "Verde",
+    "Blue": "Azul",
+    "Indigo": "Índigo",
+    "Purple": "Roxo",
+    "Pink": "Rosa",
+    "Search...": "Pesquisa...",
+    "Avg. Ping": "Ping Médio.",
+    "Avg. Response": "Resposta Média. ",
+    "Status Page": "Página de Status",
+    "Status Pages": "Página de Status",
+    "Entry Page": "Página de entrada",
+    "statusPageNothing": "Nada aqui, por favor, adiciona um grupo ou monitor.",
+    "No Services": "Nenhum Serviço",
+    "All Systems Operational": "Todos os Serviços Operacionais",
+    "Partially Degraded Service": "Serviço parcialmente degradados",
+    "Degraded Service": "Serviço Degradado",
+    "Add Group": "Adicionar Grupo",
+    "Add a monitor": "Adicionar um monitor",
+    "Edit Status Page": "Editar Página de Status",
+    "Go to Dashboard": "Ir para o dashboard",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost"
+}
diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
new file mode 100644
index 00000000..0c214b13
--- /dev/null
+++ b/src/lang/ru-RU.json
@@ -0,0 +1,581 @@
+{
+    "languageName": "Русский",
+    "checkEverySecond": "Проверка каждые {0} секунд",
+    "retriesDescription": "Максимальное количество попыток перед пометкой сервиса как недоступного и отправкой уведомления",
+    "ignoreTLSError": "Игнорировать ошибку TLS/SSL для HTTPS сайтов",
+    "upsideDownModeDescription": "Реверс статуса сервиса. Если сервис доступен, то он помечается как НЕДОСТУПНЫЙ.",
+    "maxRedirectDescription": "Максимальное количество перенаправлений. Поставьте 0, чтобы отключить перенаправления.",
+    "acceptedStatusCodesDescription": "Выберите коды статусов для определения доступности сервиса.",
+    "passwordNotMatchMsg": "Повтор пароля не совпадает.",
+    "notificationDescription": "Привяжите уведомления к мониторам.",
+    "keywordDescription": "Поиск слова в чистом HTML или в JSON-ответе (чувствительно к регистру)",
+    "pauseDashboardHome": "Пауза",
+    "deleteMonitorMsg": "Вы действительно хотите удалить данный монитор?",
+    "deleteNotificationMsg": "Вы действительно хотите удалить это уведомление для всех мониторов?",
+    "resolverserverDescription": "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.": "Сертификат истекает",
+    "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": "Включить авторизацию",
+    "disableauth.message1": "Вы уверены, что хотите <strong>отключить авторизацию</strong>?",
+    "disableauth.message2": "Это подходит для <strong>тех, у кого стоит другая авторизация</strong> перед открытием Uptime Kuma, например Cloudflare Access.",
+    "Please use this option carefully!": "Пожалуйста, используйте с осторожностью.",
+    "Logout": "Выйти",
+    "Leave": "Отмена",
+    "I understand, please disable": "Я понимаю, всё равно отключить",
+    "Confirm": "Подтвердить",
+    "Yes": "Да",
+    "No": "Нет",
+    "Username": "Логин",
+    "Password": "Пароль",
+    "Remember me": "Запомнить меня",
+    "Login": "Вход в систему",
+    "No Monitors, please": "Мониторов нет, пожалуйста",
+    "No Monitors": "Мониторы отсутствуют",
+    "add one": "создайте новый",
+    "Notification Type": "Тип уведомления",
+    "Email": "Почта",
+    "Test": "Проверка",
+    "Certificate Info": "Информация о сертификате",
+    "Resolver Server": "DNS сервер",
+    "Resource Record Type": "Тип ресурсной записи",
+    "Last Result": "Последний результат",
+    "Create your admin account": "Создайте аккаунт администратора",
+    "Repeat Password": "Повторите пароль",
+    "respTime": "Время ответа (мс)",
+    "notAvailableShort": "N/A",
+    "Create": "Создать",
+    "clearEventsMsg": "Вы действительно хотите удалить всю статистику событий данного монитора?",
+    "clearHeartbeatsMsg": "Вы действительно хотите удалить всю статистику опросов данного монитора?",
+    "confirmClearStatisticsMsg": "Вы действительно хотите удалить ВСЮ статистику?",
+    "Clear Data": "Удалить статистику",
+    "Events": "События",
+    "Heartbeats": "Опросы",
+    "Auto Get": "Авто-получение",
+    "enableDefaultNotificationDescription": "Для каждого нового монитора это уведомление будет включено по умолчанию. Вы всё ещё можете отключить уведомления в каждом мониторе отдельно.",
+    "Default enabled": "Использовать по умолчанию",
+    "Also apply to existing monitors": "Применить к существующим мониторам",
+    "Export": "Экспорт",
+    "Import": "Импорт",
+    "backupDescription": "Вы можете сохранить резервную копию всех мониторов и уведомлений в виде JSON-файла",
+    "backupDescription2": "P.S. История и события сохранены не будут",
+    "backupDescription3": "Важные данные, такие как токены уведомлений, добавляются при экспорте, поэтому храните файлы в безопасном месте",
+    "alertNoFile": "Выберите файл для импорта.",
+    "alertWrongFileType": "Выберите JSON-файл.",
+    "twoFAVerifyLabel": "Пожалуйста, введите свой токен, чтобы проверить работу 2FA",
+    "tokenValidSettingsMsg": "Токен действителен! Теперь вы можете сохранить настройки 2FA.",
+    "confirmEnableTwoFAMsg": "Вы действительно хотите включить 2FA?",
+    "confirmDisableTwoFAMsg": "Вы действительно хотите выключить 2FA?",
+    "Apply on all existing monitors": "Применить ко всем существующим мониторам",
+    "Verify Token": "Проверить токен",
+    "Setup 2FA": "Настройка 2FA",
+    "Enable 2FA": "Включить 2FA",
+    "Disable 2FA": "Выключить 2FA",
+    "2FA Settings": "Настройки 2FA",
+    "Two Factor Authentication": "Двухфакторная аутентификация",
+    "Active": "Активно",
+    "Inactive": "Неактивно",
+    "Token": "Токен",
+    "Show URI": "Показать URI",
+    "Clear all statistics": "Очистить статистику",
+    "retryCheckEverySecond": "Повтор каждые {0} секунд",
+    "importHandleDescription": "Выберите \"Пропустить существующие\", если вы хотите пропустить каждый монитор или уведомление с таким же именем. \"Перезаписать\" удалит каждый существующий монитор или уведомление и добавит заново. Вариант \"Не проверять\" принудительно восстанавливает все мониторы и уведомления, даже если они уже существуют.",
+    "confirmImportMsg": "Вы действительно хотите восстановить резервную копию? Убедитесь, что вы выбрали подходящий вариант импорта.",
+    "Heartbeat Retry Interval": "Интервал повтора опроса",
+    "Import Backup": "Импорт",
+    "Export Backup": "Скачать",
+    "Skip existing": "Пропустить существующие",
+    "Overwrite": "Перезаписать",
+    "Options": "Опции",
+    "Keep both": "Не проверять",
+    "Tags": "Теги",
+    "Add New below or Select...": "Добавить новый или выбрать...",
+    "Tag with this name already exist.": "Такой тег уже существует.",
+    "Tag with this value already exist.": "Тег с таким значением уже существует.",
+    "color": "цвет",
+    "value (optional)": "значение (опционально)",
+    "Gray": "Серый",
+    "Red": "Красный",
+    "Orange": "Оранжевый",
+    "Green": "Зелёный",
+    "Blue": "Синий",
+    "Indigo": "Индиго",
+    "Purple": "Пурпурный",
+    "Pink": "Розовый",
+    "Search...": "Поиск...",
+    "Avg. Ping": "Среднее значение пинга",
+    "Avg. Response": "Среднее время ответа",
+    "Entry Page": "Главная страница",
+    "statusPageNothing": "Здесь пусто. Добавьте группу или монитор.",
+    "No Services": "Нет сервисов",
+    "All Systems Operational": "Все системы работают в штатном режиме",
+    "Partially Degraded Service": "Сервисы работают частично",
+    "Degraded Service": "Все сервисы не работают",
+    "Add Group": "Добавить группу",
+    "Add a monitor": "Добавить монитор",
+    "Edit Status Page": "Редактировать",
+    "Go to Dashboard": "Панель управления",
+    "Status Page": "Страница статуса",
+    "Status Pages": "Страницы статуса",
+    "Discard": "Отмена",
+    "Create Incident": "Создать инцидент",
+    "Switch to Dark Theme": "Тёмная тема",
+    "Switch to Light Theme": "Светлая тема",
+    "telegram": "Telegram",
+    "webhook": "Вебхук",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Поддержка 50+ сервисов уведомлений)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Основной URL",
+    "Push URL": "URL пуша",
+    "needPushEvery": "К этому URL необходимо обращаться каждые {0} секунд",
+    "pushOptionalParams": "Опциональные параметры: {0}",
+    "defaultNotificationName": "Моё уведомление {notification} ({number})",
+    "here": "здесь",
+    "Required": "Требуется",
+    "Bot Token": "Токен бота",
+    "wayToGetTelegramToken": "Вы можете взять токен здесь - {0}.",
+    "Chat ID": "ID чата",
+    "supportTelegramChatID": "Поддерживаются ID чатов, групп и каналов",
+    "wayToGetTelegramChatID": "Вы можете взять ID вашего чата, отправив сообщение боту и перейдя по этому URL для просмотра chat_id:",
+    "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ЗДЕСЬ",
+    "chatIDNotFound": "ID чата не найден; пожалуйста отправьте сначала сообщение боту",
+    "Post URL": "Post URL",
+    "Content Type": "Тип контента",
+    "webhookJsonDesc": "{0} подходит для любых современных HTTP-серверов, например Express.js",
+    "webhookFormDataDesc": "{multipart} подходит для PHP. JSON-вывод необходимо будет обработать с помощью {decodeFunction}",
+    "secureOptionNone": "Нет / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Игнорировать ошибки TLS",
+    "From Email": "От кого",
+    "emailCustomSubject": "Своя тема",
+    "To Email": "Кому",
+    "smtpCC": "Копия",
+    "smtpBCC": "Скрытая копия",
+    "Discord Webhook URL": "Discord вебхук URL",
+    "wayToGetDiscordURL": "Вы можете создать его в Параметрах сервера -> Интеграции -> Создать вебхук",
+    "Bot Display Name": "Отображаемое имя бота",
+    "Prefix Custom Message": "Свой префикс сообщения",
+    "Hello @everyone is...": "Привет {'@'}everyone это...",
+    "Webhook URL": "URL вебхука",
+    "wayToGetTeamsURL": "Как создать URL вебхука вы можете узнать здесь - {0}.",
+    "Number": "Номер",
+    "Recipients": "Получатели",
+    "needSignalAPI": "Вам необходим клиент Signal с поддержкой REST API.",
+    "wayToCheckSignalURL": "Пройдите по этому URL, чтобы узнать как настроить такой клиент:",
+    "signalImportant": "ВАЖНО: Нельзя смешивать в Получателях группы и номера!",
+    "Application Token": "Токен приложения",
+    "Server URL": "URL сервера",
+    "Priority": "Приоритет",
+    "Icon Emoji": "Иконка Emoji",
+    "Channel Name": "Имя канала",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Больше информации о вебхуках: {0}",
+    "aboutChannelName": "Введите имя канала в поле {0} Имя канала, если вы хотите обойти канал вебхука. Например: #other-channel",
+    "aboutKumaURL": "Если поле Uptime Kuma URL в настройках останется пустым, по умолчанию будет использоваться ссылка на проект на GitHub.",
+    "emojiCheatSheet": "Шпаргалка по Emoji: {0}",
+    "User Key": "Ключ пользователя",
+    "Device": "Устройство",
+    "Message Title": "Заголовок сообщения",
+    "Notification Sound": "Звук уведомления",
+    "More info on:": "Больше информации: {0}",
+    "pushoverDesc1": "Экстренный приоритет (2) имеет таймаут повтора по умолчанию 30 секунд и истекает через 1 час.",
+    "pushoverDesc2": "Если вы хотите отправлять уведомления различным устройствам, необходимо заполнить поле Устройство.",
+    "SMS Type": "Тип SMS",
+    "octopushTypePremium": "Премиум (Быстрый - рекомендуется для алертов)",
+    "octopushTypeLowCost": "Дешёвый (Медленный - иногда блокируется операторами)",
+    "checkPrice": "Тарифы {0}:",
+    "octopushLegacyHint": "Вы используете старую версию Octopush (2011-2020) или новую?",
+    "Check octopush prices": "Тарифы Octopush {0}.",
+    "octopushPhoneNumber": "Номер телефона (межд. формат, например: +79831234567) ",
+    "octopushSMSSender": "Имя отправителя SMS: 3-11 символов алвафита, цифр и пробелов (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID устройства LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Пример: {0}",
+    "Read more:": "Подробнее: {0}",
+    "Status:": "Статус: {0}",
+    "Read more": "Подробнее",
+    "appriseInstalled": "Apprise установлен.",
+    "appriseNotInstalled": "Apprise не установлен. {0}",
+    "Access Token": "Токен доступа",
+    "Channel access token": "Токен доступа канала",
+    "Line Developers Console": "Консоль разработчиков Line",
+    "lineDevConsoleTo": "Консоль разработчиков Line - {0}",
+    "Basic Settings": "Базовые настройки",
+    "User ID": "ID пользователя",
+    "Messaging API": "API сообщений",
+    "wayToGetLineChannelToken": "Сначала зайдите в {0}, создайте провайдера и канал (API сообщений), затем вы сможете получить токен доступа канала и ID пользователя из вышеупомянутых пунктов меню.",
+    "Icon URL": "URL иконки",
+    "aboutIconURL": "Вы можете предоставить ссылку на иконку в поле \"URL иконки\" чтобы переопределить картинку профиля по умолчанию. Не используется, если задана иконка Emoji.",
+    "aboutMattermostChannelName": "Вы можете переопределить канал по умолчанию, в который вебхук пишет, введя имя канала в поле \"Имя канала\". Это необходимо включить в настройках вебхука Mattermost. Например: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - дёшево и медленно, часто перегружен. Только для получателей из Польши.",
+    "promosmsTypeFlash": "SMS FLASH - сообщения автоматически появятся на устройстве получателя. Только для получателей из Польши.",
+    "promosmsTypeFull": "SMS FULL - премиум-уровень SMS, можно использовать своё имя отправителя (предварительно зарегистрировав его). Надёжно для алертов.",
+    "promosmsTypeSpeed": "SMS SPEED - наивысший приоритет в системе. Очень быстро и надёжно, но очень дорого (в два раза дороже, чем SMS FULL).",
+    "promosmsPhoneNumber": "Номер телефона (для получателей из Польши можно пропустить код региона)",
+    "promosmsSMSSender": "Имя отправителя SMS: Зарегистрированное или одно из имён по умолчанию: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "URL сервера (вместе с http(s):// и опционально порт)",
+    "Internal Room Id": "Внутренний ID комнаты",
+    "matrixDesc1": "Внутренний ID комнаты можно найти в Подробностях в параметрах канала вашего Matrix клиента. Он должен выглядеть примерно как !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Рекомендуется создать нового пользователя и не использовать токен доступа личного пользователя Matrix, т.к. это влечёт за собой полный доступ к аккаунту и к комнатам, в которых вы состоите. Вместо этого создайте нового пользователя и пригласите его только в ту комнату, в которой вы хотите получать уведомления. Токен доступа можно получить, выполнив команду {0}",
+    "Method": "Метод",
+    "Body": "Тело",
+    "Headers": "Заголовки",
+    "PushUrl": "URL пуша",
+    "HeadersInvalidFormat": "Заголовки запроса некорректны JSON: ",
+    "BodyInvalidFormat": "Тело запроса некорректно JSON: ",
+    "Monitor History": "Статистика",
+    "clearDataOlderThan": "Сохранять статистику за {0} дней.",
+    "PasswordsDoNotMatch": "Пароли не совпадают.",
+    "records": "записей",
+    "One record": "Одна запись",
+    "steamApiKeyDescription": "Для мониторинга игрового сервера Steam вам необходим Web-API ключ Steam. Зарегистрировать его можно здесь: ",
+    "Certificate Chain": "Цепочка сертификатов",
+    "Valid": "Действительный",
+    "Hide Tags": "Скрыть тэги",
+    "Title": "Название инцидента:",
+    "Content": "Содержание инцидента:",
+    "Post": "Опубликовать",
+    "Cancel": "Отмена",
+    "Created": "Создано",
+    "Unpin": "Открепить",
+    "Show Tags": "Показать тэги",
+    "recent": "Сейчас",
+    "3h": "3 часа",
+    "6h": "6 часов",
+    "24h": "24 часа",
+    "1w": "1 неделя",
+    "No monitors available.": "Нет доступных мониторов",
+    "Add one": "Добавить новый",
+    "Backup": "Резервная копия",
+    "Security": "Безопасность",
+    "Shrink Database": "Сжать Базу Данных",
+    "Current User": "Текущий пользователь",
+    "About": "О программе",
+    "Description": "Описание",
+    "Powered by": "Работает на основе скрипта от",
+    "shrinkDatabaseDescription": "Включает VACUUM для базы данных SQLite. Если ваша база данных была создана на версии 1.10.0 и более, AUTO_VACUUM уже включен и это действие не требуется.",
+    "deleteStatusPageMsg": "Вы действительно хотите удалить эту страницу статуса сервисов?",
+    "Style": "Стиль",
+    "info": "ИНФО",
+    "warning": "ВНИМАНИЕ",
+    "danger": "ОШИБКА",
+    "primary": "ОСНОВНОЙ",
+    "light": "СВЕТЛЫЙ",
+    "dark": "ТЕМНЫЙ",
+    "New Status Page": "Новая страница статуса",
+    "Show update if available": "Показывать доступные обновления",
+    "Also check beta release": "Проверять обновления для бета версий",
+    "Add New Status Page": "Добавить страницу статуса",
+    "Next": "Далее",
+    "Accept characters: a-z 0-9 -": "Разрешены символы: a-z 0-9 -",
+    "Start or end with a-z 0-9 only": "Начало и окончание имени только на символы: a-z 0-9",
+    "No consecutive dashes --": "Запрещено использовать тире --",
+    "HTTP Options": "HTTP Опции",
+    "Authentication": "Аутентификация",
+    "HTTP Basic Auth": "HTTP Авторизация",
+    "PushByTechulus": "Push by Techulus",
+    "clicksendsms": "ClickSend SMS",
+    "GoogleChat": "Google Chat (только Google Workspace)",
+    "apiCredentials": "API реквизиты",
+    "Done": "Готово",
+    "Info": "Инфо",
+    "Steam API Key": "Steam API-Ключ",
+    "Pick a RR-Type...": "Выберите RR-Тип...",
+    "Pick Accepted Status Codes...": "Выберите принятые коды состояния...",
+    "Default": "По умолчанию",
+    "Please input title and content": "Пожалуйста, введите название и содержание",
+    "Last Updated": "Последнее Обновление",
+    "Untitled Group": "Группа без названия",
+    "Services": "Сервисы",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Пользователь (включая префикс webapi_)",
+    "serwersmsAPIPassword": "API Пароль",
+    "serwersmsPhoneNumber": "Номер телефона",
+    "serwersmsSenderName": "SMS Имя Отправителя (регистрированный через пользовательский портал)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM Настройки",
+    "smtpDkimDesc": "Пожалуйста ознакомьтесь с {0} Nodemailer DKIM для использования.",
+    "documentation": "документацией",
+    "smtpDkimDomain": "Имя Домена",
+    "smtpDkimKeySelector": "Ключ",
+    "smtpDkimPrivateKey": "Приватный ключ",
+    "smtpDkimHashAlgo": "Алгоритм хэша (опционально)",
+    "smtpDkimheaderFieldNames": "Заголовок ключей для подписи (опционально)",
+    "smtpDkimskipFields": "Заголовок ключей не для подписи (опционально)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Конечная точка API",
+    "alertaEnvironment": "Среда",
+    "alertaApiKey": "Ключ API",
+    "alertaAlertState": "Состояние алерта",
+    "alertaRecoverState": "Состояние восстановления",
+    "Proxies": "Прокси",
+    "Setup Proxy": "Настройка Прокси",
+    "Proxy Protocol": "Протокол Прокси",
+    "Proxy Server": "Прокси",
+    "Proxy server has authentication": "Прокси имеет аутентификацию",
+    "Reverse Proxy": "Обратный прокси",
+    "No Proxy": "Без прокси",
+    "default": "По умолчанию",
+    "enabled": "Включено",
+    "setAsDefault": "Установлено по умолчанию",
+    "deleteProxyMsg": "Вы действительно хотите удалить этот прокси для всех мониторов?",
+    "proxyDescription": "Прокси должны быть привязаны к монитору, чтобы работать.",
+    "enableProxyDescription": "Этот прокси не будет влиять на запросы монитора, пока не будет активирован. Вы можете контролировать временное отключение прокси для всех мониторов через статус активации.",
+    "setAsDefaultProxyDescription": "Этот прокси будет по умолчанию включен для новых мониторов. Вы всё ещё можете отдельно отключать прокси в каждом мониторе.",
+    "Invalid": "Недействительный",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Шаблон СМС должен содержать параметры: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "В целях безопасности необходимо использовать секретный ключ",
+    "Device Token": "Токен устройства",
+    "Platform": "Платформа",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Повторить",
+    "Topic": "Тема",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "User": "Пользователь",
+    "Installed": "Установлено",
+    "Not installed": "Не установлено",
+    "Running": "Запускается",
+    "Not running": "Не запускается",
+    "Remove Token": "Удалить токен",
+    "Start": "Запустить",
+    "Stop": "Остановить",
+    "Uptime Kuma": "Uptime Kuma",
+    "Slug": "Slug",
+    "Accept characters:": "Принимаемые символы:",
+    "startOrEndWithOnly": "Начинается или кончается только {0}",
+    "No consecutive dashes": "Без последовательных тире",
+    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "Page Not Found": "Страница не найдена",
+    "wayToGetCloudflaredURL": "(Скачать cloudflared с {0})",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Сообщение:",
+    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
+    "HTTP Headers": "HTTP заголовки",
+    "Trust Proxy": "Доверять прокси",
+    "Other Software": "Другое программное обеспечение",
+    "For example: nginx, Apache and Traefik.": "К примеру: nginx, Apache и Traefik.",
+    "Please read": "Пожалуйста, прочитайте",
+    "Subject:": "Тема:",
+    "Valid To:": "Действителен до:",
+    "Days Remaining:": "Дней осталось:",
+    "Issuer:": "Издатель:",
+    "Fingerprint:": "Отпечаток:",
+    "No status pages": "Нет статусных страниц",
+    "Domain Name Expiry Notification": "Уведомление об истечении срока действия доменного имени",
+    "Proxy": "Прокси",
+    "Date Created": "Дата создания",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Address",
+    "onebotMessageType": "OneBot Message Type",
+    "onebotGroupMessage": "Группа",
+    "onebotPrivateMessage": "Private",
+    "onebotUserOrGroupId": "Группа/ID пользователя",
+    "onebotSafetyTips": "В целях безопасности необходимо установить токен доступа",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Текст нижнего колонтитула",
+    "Show Powered By": "Показывать на чем создано",
+    "Domain Names": "Доменные имена",
+    "signedInDisp": "Вы вошли как {0}",
+    "signedInDispDisabled": "Аутентификация отключена.",
+    "RadiusSecret": "Секрет Radius",
+    "RadiusSecretDescription": "Общий секрет между клиентом и сервером",
+    "RadiusCalledStationId": "Идентификатор вызываемой станции",
+    "RadiusCalledStationIdDescription": "Идентификатор вызываемого устройства",
+    "RadiusCallingStationId": "Идентификатор вызывающей станции",
+    "RadiusCallingStationIdDescription": "Идентификатор вызывающего устройства",
+    "Certificate Expiry Notification": "Уведомление об истечении срока действия сертификата",
+    "API Username": "Имя пользователя API",
+    "API Key": "API ключ",
+    "Recipient Number": "Номер получателя",
+    "From Name/Number": "Имя/номер отправителя",
+    "Leave blank to use a shared sender number.": "Оставьте пустым, чтобы использовать общий номер отправителя.",
+    "Octopush API Version": "Версия API Octopush",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" из учетных данных HTTP API в панели управления",
+    "octopushLogin": "\"Login\" из учетных данных HTTP API в панели управления",
+    "promosmsLogin": "Логин API",
+    "promosmsPassword": "Пароль API",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Токен устройства",
+    "Using a Reverse Proxy?": "Используете обратный прокси?",
+    "Check how to config it for WebSocket": "Проверьте, как настроить его для WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Наиболее вероятные причины:",
+    "The resource is no longer available.": "Ресурс больше не доступен.",
+    "There might be a typing error in the address.": "В адресе может быть опечатка.",
+    "What you can try:": "Что вы можете попробовать:",
+    "Retype the address.": "Повторите адрес.",
+    "Go back to the previous page.": "Вернуться на предыдущую страницу.",
+    "Coming Soon": "Скоро",
+    "wayToGetClickSendSMSToken": "Вы можете получить имя пользователя API и ключ API из {0} .",
+    "Connection String": "Строка подключения",
+    "Query": "Запрос",
+    "settingsCertificateExpiry": "Истекание TLS сертификата",
+    "certificationExpiryDescription": "HTTPS Мониторы инициируют уведомление, когда срок действия сертификата TLS истечет:",
+    "Setup Docker Host": "Настроить Docker Host",
+    "Connection Type": "Тип соединения",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Are you sure want to delete this docker host for all monitors?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker контейнер",
+    "Container Name / ID": "Название контейнера / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "Домен",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "Вы находитесь в режиме без авторизации, пароль не требуется.",
+    "trustProxyDescription": "Доверять заголовкам 'X-Forwarded-*'. Если вы хотите получить правильный IP-адрес клиента, а ваш Uptime Kuma находится под Nginx или Apache, вам следует включить этот параметр.",
+    "wayToGetLineNotifyToken": "Вы можете получить токен доступа в {0}",
+    "Examples": "Примеры",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Токен доступа с длительным сроком службы",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
+    "Notification Service": "Служба уведомлений",
+    "default: notify all devices": "по стандарту: уведомлять все устройства",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
+    "Automations can optionally be triggered in Home Assistant:": "При желании автоматизацию можно активировать в Home Assistant.:",
+    "Trigger type:": "Тип триггера:",
+    "Event type:": "Тип события:",
+    "Event data:": "Данные события:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Затем выберите действие, например, переключите сцену на красный индикатор RGB..",
+    "Frontend Version": "Версия интерфейса",
+    "Frontend Version do not match backend version!": "Версия интерфейса не соответствует версии серверной части!",
+    "Base URL": "Базовый URL",
+    "goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
+    "goAlertIntegrationKeyInfo": "Получить общий ключ интеграции API для сервиса в этом формате \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обычно значение параметра токена скопированного URL.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Устарело: поскольку добавлено множество функций, а эта функция резервного копирования немного не поддерживается, она не может создать или восстановить полную резервную копию.",
+    "backupRecommend": "Сделайте резервную копию тома или папки с данными (./data/) напрямую.",
+    "Optional": "Необязательно",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "Документация к API SMSManager ",
+    "Gateway Type": "Тип шлюза",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Вы можете делить числа с",
+    "or": "или"
+}
diff --git a/src/lang/sl-SI.json b/src/lang/sl-SI.json
new file mode 100644
index 00000000..062413a8
--- /dev/null
+++ b/src/lang/sl-SI.json
@@ -0,0 +1,357 @@
+{
+    "languageName": "Slovenščina",
+    "checkEverySecond": "Preveri na vsakih {0} sekund",
+    "retryCheckEverySecond": "Ponovno poskusi na vsakih {0} sekund",
+    "retriesDescription": "Maksimalno število poskusov predenj se storitev označi kot 'ne deluje' in se pošlje obvestilo",
+    "ignoreTLSError": "Ignoriraj TLS/SSL napake za HTTPS spletne strani",
+    "upsideDownModeDescription": "Negiraj status. Če je storitev deluje bo označena kot 'ne deluje'.",
+    "maxRedirectDescription": "Maksimalno število sledečih preusmeritev. 0 onemogoči preusmeritve.",
+    "acceptedStatusCodesDescription": "Izberi kode statusa veljavna kot uspešen odgovor.",
+    "passwordNotMatchMsg": "Ponovljeno geslo se ne ujema.",
+    "notificationDescription": "Obvestila morajo biti dodeljena monitorju, da delujejo.",
+    "keywordDescription": "Iskana ključna beseda v surovem HTML ali JSON odgovoru. Iskanje je občutljivo na začetnico.",
+    "pauseDashboardHome": "Pavza",
+    "deleteMonitorMsg": "Ste prepričani, da želite izbrisati ta monitor?",
+    "deleteNotificationMsg": "Ste prepričani, da želite izbrisati to obvestilo za vse monitorje?",
+    "resolverserverDescription": "Cloudflare je privzeti strežnik. DNS strežnik lahko spremenite kadarkoli.",
+    "rrtypeDescription": "Izberite RR tip, ki ga želite spremljati",
+    "pauseMonitorMsg": "Ste prepričani, da želite pavzirati?",
+    "enableDefaultNotificationDescription": "To obvestilo bo kot privzeto omogočeno za vse nove monitorje. Še vedno ga lahko izključite posebej za vsak monitor.",
+    "clearEventsMsg": "Ste prepričani da želite izbrisati vse dogodke tega monitorja?",
+    "clearHeartbeatsMsg": "Ste prepričani da želite izbrisati vse srčne utripe tega monitorja?",
+    "confirmClearStatisticsMsg": "Ste prepričani da želite izbrisati VSO statistiko?",
+    "importHandleDescription": "Izberite 'Preskoči obstoječe', če želite preskočiti vsak monitor ali obvestilo z istim imenom. 'Prepiši' bo prepisal vse obstoječe monitorje in obvestila.",
+    "confirmImportMsg": "Ste prepričani da želite uvoziti varnostno kopijo? Preverite da ste izbrali pravo opcijo za uvoz.",
+    "twoFAVerifyLabel": "Prosimo vnesite žeton za potrditev 2FA:",
+    "tokenValidSettingsMsg": "Žeton je veljaven! Sedaj lahko shranite 2FA nastavitev.",
+    "confirmEnableTwoFAMsg": "Ste prepričani, da želite omogočiti 2FA?",
+    "confirmDisableTwoFAMsg": "Ste prepričani, da želite onemogočiti 2FA?",
+    "Settings": "Nastavitve",
+    "Dashboard": "Nadzorna plošča",
+    "New Update": "Nova posodobitev",
+    "Language": "Jezik",
+    "Appearance": "Izgled",
+    "Theme": "Teme",
+    "General": "Splošno",
+    "Primary Base URL": "Primaren URL",
+    "Version": "Različica",
+    "Check Update On GitHub": "Preveri posodobitev na GitHub-u",
+    "List": "Seznam",
+    "Add": "Dodaj",
+    "Add New Monitor": "Dodaj nov monitor",
+    "Quick Stats": "Hitro stanje",
+    "Up": "Deluje",
+    "Down": "Ne deluje",
+    "Pending": "Na čakanju",
+    "Unknown": "Neznano",
+    "Pause": "Pavza",
+    "Name": "Ime",
+    "Status": "Status",
+    "DateTime": "DateTime",
+    "Message": "Sporočilo",
+    "No important events": "Ni pomembnih dogodkov",
+    "Resume": "Nadaljuj",
+    "Edit": "Uredi",
+    "Delete": "Izbriši",
+    "Current": "Trenutno",
+    "Uptime": "Uptime",
+    "Cert Exp.": "Potek certifikata",
+    "day": "dan | dni",
+    "-day": "-dni",
+    "hour": "ura",
+    "-hour": "-ur",
+    "Response": "Odgovor",
+    "Ping": "Ping",
+    "Monitor Type": "Tip monitorja",
+    "Keyword": "Ključna beseda",
+    "Friendly Name": "Ime za prikaz",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Vrata",
+    "Heartbeat Interval": "Interval srčnega utripa",
+    "Retries": "Ponovni poskusi",
+    "Heartbeat Retry Interval": "Ponovni poskus srčnega utripa",
+    "Advanced": "Napredno",
+    "Upside Down Mode": "Negiran način",
+    "Max. Redirects": "Max. preusmeritev",
+    "Accepted Status Codes": "Sprejete kode statusa",
+    "Push URL": "Push URL",
+    "needPushEvery": "Pokliči ta URL vsakih {0} sekund.",
+    "pushOptionalParams": "Dodatni parametri: {0}",
+    "Save": "Shrani",
+    "Notifications": "Obvestila",
+    "Not available, please setup.": "Ni na voljo, prosimo nastavite.",
+    "Setup Notification": "Nastavi obvestila",
+    "Light": "Svetlo",
+    "Dark": "Temno",
+    "Auto": "Auto",
+    "Theme - Heartbeat Bar": "Tema - vrstica srčnega utripa",
+    "Normal": "Normalna",
+    "Bottom": "Spodaj",
+    "None": "Brez",
+    "Timezone": "Časovni pas",
+    "Search Engine Visibility": "Vidljivost v spletnih iskalnikih",
+    "Allow indexing": "Dovoli indeksiranje",
+    "Discourage search engines from indexing site": "Odvračaj spletne iskalnike od indeksiranja te strani",
+    "Change Password": "Zamenjaj geslo",
+    "Current Password": "Trenutno geslo",
+    "New Password": "Novo geslo",
+    "Repeat New Password": "Ponovi novo geslo",
+    "Update Password": "Posodobi geslo",
+    "Disable Auth": "Onemogoči auth",
+    "Enable Auth": "Omogoči auth",
+    "disableauth.message1": "Ali ste prepričani, da želite onemogočiti <strong>avtentikacijo</strong>?",
+    "disableauth.message2": "Namenjen je <strong>nekomu, ki ima pred programom Uptime Kuma vklopljeno zunanje preverjanje pristnosti</strong>, na primer Cloudflare Access.",
+    "Please use this option carefully!": "Uporabljajte previdno.",
+    "Logout": "Odjava",
+    "Leave": "Zapusti",
+    "I understand, please disable": "Razumem, prosim onemogočite",
+    "Confirm": "Potrdi",
+    "Yes": "Da",
+    "No": "Ne",
+    "Username": "Uporabniško ime",
+    "Password": "Geslo",
+    "Remember me": "Zapomni si me",
+    "Login": "Vpis",
+    "No Monitors, please": "Prosim, brez monitorjev",
+    "add one": "Dodaj enega",
+    "Notification Type": "Tip obvestila",
+    "Email": "Email",
+    "Test": "Test",
+    "Certificate Info": "Informacije certifikata",
+    "Resolver Server": "Strežnik za razreševanje",
+    "Resource Record Type": "Vrsta zapisa o viru",
+    "Last Result": "Zadnji rezultat",
+    "Create your admin account": "Ustvari administratorski račun",
+    "Repeat Password": "Ponovi geslo",
+    "Import Backup": "Uvozi varnostno kopijo",
+    "Export Backup": "Izvozi varnostno kopijo",
+    "Export": "Izvozi",
+    "Import": "Uvozi",
+    "respTime": "Odzivni čas (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Privzeto omogočeno",
+    "Apply on all existing monitors": "Uporabi na vseh obstoječih monitorjih",
+    "Create": "Ustvari",
+    "Clear Data": "Izbriši podatke",
+    "Events": "Dogodki",
+    "Heartbeats": "Srčni utripi",
+    "Auto Get": "Auto Get",
+    "backupDescription": "Izvozite lahko vse monitorje in obvestila v JSON datoteko.",
+    "backupDescription2": "Pomni: Zgodovina in podatki dogodkov niso vključeni.",
+    "backupDescription3": "Občutljivi podatki, kot žetoni za obvestila so vlkjučeni v datoteko za izvoz; prosimo hranite na varnem.",
+    "alertNoFile": "Izberite datoteko za Uvoz.",
+    "alertWrongFileType": "Prosimo izberite JSON datoteko.",
+    "Clear all statistics": "Pobrišite vso statistiko",
+    "Skip existing": "Preskoči obstoječe",
+    "Overwrite": "Prepiši",
+    "Options": "Možnosti",
+    "Keep both": "Ohrani oboje",
+    "Verify Token": "Potrdi žeton",
+    "Setup 2FA": "Nastavi 2FA",
+    "Enable 2FA": "Omogoči 2FA",
+    "Disable 2FA": "Onemogoči 2FA",
+    "2FA Settings": "2FA nastavitve",
+    "Two Factor Authentication": "Preverjanje pristnosti z dvema dejavnikoma",
+    "Active": "Aktivno",
+    "Inactive": "Neaktivno",
+    "Token": "Žeton",
+    "Show URI": "Prikaži URI",
+    "Tags": "Značke",
+    "Add New below or Select...": "Dodaj novo spodaj ali izberi iz seznama...",
+    "Tag with this name already exist.": "Značka s tem imenom že obstaja.",
+    "Tag with this value already exist.": "Značka s to vrednostjo že obstaja.",
+    "color": "barva",
+    "value (optional)": "vrednost (po želji)",
+    "Gray": "Siva",
+    "Red": "Rdeča",
+    "Orange": "Oranžna",
+    "Green": "Zelena",
+    "Blue": "Modra",
+    "Indigo": "Indigo",
+    "Purple": "Vijolična",
+    "Pink": "Roza",
+    "Search...": "Išči...",
+    "Avg. Ping": "Avg. Ping",
+    "Avg. Response": "Avg. odziv",
+    "Entry Page": "Vstopna stran",
+    "statusPageNothing": "Nikjer nič... Dodajte skupino ali monitor.",
+    "No Services": "Ni storitev",
+    "All Systems Operational": "Vsi sistemi delujejo",
+    "Partially Degraded Service": "Delno poslabšana storitev",
+    "Degraded Service": "Poslabšana storitev",
+    "Add Group": "Dodaj skupino",
+    "Add a monitor": "Dodaj monitor",
+    "Edit Status Page": "Uredi statusno stran",
+    "Go to Dashboard": "Pojdi na nadzorno ploščo",
+    "Status Page": "Statusna stran",
+    "Status Pages": "Statusne strani",
+    "defaultNotificationName": "Moje {notification} Obvestilo ({number})",
+    "here": "tukaj",
+    "Required": "Obvezno",
+    "telegram": "Telegram",
+    "Bot Token": "Robotkov žetonček",
+    "wayToGetTelegramToken": "Lahko dobiš žeton od {0}.",
+    "Chat ID": "ID pogovora",
+    "supportTelegramChatID": "Direkten pogovor pomoči / Skupina / ID kanala",
+    "wayToGetTelegramChatID": "Id lahko dobiš, če pošlješ sporočilo robotku in odpreš ta URL, da bi videl chat_id:",
+    "YOUR BOT TOKEN HERE": "ROBOTKOV ŽETON TUKAJ",
+    "chatIDNotFound": "Ne najdem Chat Id-ja; prvo pošlji sporočilo robotku",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Vrsta vsebine",
+    "webhookJsonDesc": "{0} je v redu za vsak moderen HTTP strežnik, kot recimo Express.js",
+    "webhookFormDataDesc": "{multipart} je v redu za PHP. JSON bo moral biti razčlenjen s {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "Brez / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignoriraj TLS napako",
+    "From Email": "Od Email",
+    "emailCustomSubject": "Poljubna zadeva",
+    "To Email": "Za Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "To lahko dibiš v Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "Prikazno ime robotka",
+    "Prefix Custom Message": "Predpona poljubnega sporočila",
+    "Hello @everyone is...": "Pozdravljen {'@'}everyone je...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Izvedi kako narediš webhook URL {0}.",
+    "signal": "Signal",
+    "Number": "Številka",
+    "Recipients": "Prejemniki",
+    "needSignalAPI": "Imeti moraš signal klienta z REST API.",
+    "wayToCheckSignalURL": "Kako se to naredi, lahko preveriš na tem URL-ju:",
+    "signalImportant": "POMEMBNO: Ne moreš mešati skupin in številk v prejemnikih!",
+    "gotify": "Gotify",
+    "Application Token": "Žeton za aplikacijo",
+    "Server URL": "URL Strežnika",
+    "Priority": "Prioriteta",
+    "slack": "Slack",
+    "Icon Emoji": "Emoji ikona",
+    "Channel Name": "Ime kanala",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Več o webhook-ih: {0}",
+    "aboutChannelName": "Vnesi ime kanala na {0} Channel Name polje, če želiš preskočiti webhook kanal. npr.: #drug-kanal",
+    "aboutKumaURL": "Če pustite polje Uptime Kuma URL prazno, bo nastavljeno privzeto na GitHub stran projekta.",
+    "emojiCheatSheet": "Emoji plonk listek: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (podpira 50+ storitev za obveščevanje)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "User Key",
+    "Device": "Naprava",
+    "Message Title": "Naslov sporočila",
+    "Notification Sound": "Zvok obvestila",
+    "More info on:": "Več informacij na: {0}",
+    "pushoverDesc1": "Prioriteta nujnosti (2) ima privzeto nastavitev 30 sekund časa med ponovni poskusi in poteče po 1 uri.",
+    "pushoverDesc2": "Če želite pošiljati obvestila na različne naprave izpolnite polje 'Naprava'.",
+    "SMS Type": "Vrsta SMS-a",
+    "octopushTypePremium": "Premium (hitro - priporočljivo za opozarjanje)",
+    "octopushTypeLowCost": "Cenovno ugodno (počasno - včasih jih blokira operater)",
+    "checkPrice": "preveri {0} cene:",
+    "apiCredentials": "API poverilnice",
+    "octopushLegacyHint": "Uporabljate legacy verzijo Octopush-a (2011-2020) ali novo verzijo?",
+    "Check octopush prices": "Preveri octopush cene {0}.",
+    "octopushPhoneNumber": "Telefonska številka (npr.: +386031234567) ",
+    "octopushSMSSender": "Ime SMS pošiljatelja: 3-11 alfanumeričnih znakov in presledki (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Primer: {0}",
+    "Read more:": "Preberi več: {0}",
+    "Status:": "Status: {0}",
+    "Read more": "Preberi več",
+    "appriseInstalled": "Apprise je nameščen.",
+    "appriseNotInstalled": "Apprise ni nameščen. {0}",
+    "Access Token": "Žeton za dostop",
+    "Channel access token": "Žeton za dostop do kanala",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Osnovne nastavitve",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Prvo odpri {0}, ustvarite ponudnika in kanal (Messaging API), potem lahko žeton za dostop do kanala in ID uporabnika dobite iz zgoraj navedenih elementov menija.",
+    "Icon URL": "URL ikone",
+    "aboutIconURL": "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji.",
+    "aboutMattermostChannelName": "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - poceni, vendar počasen in pogosto preobremenjen. Omejeno samo na poljske prejemnike.",
+    "promosmsTypeFlash": "SMS FLASH - sporočilo se samodejno prikaže v napravi prejemnika. Omejeno samo na poljske prejemnike.",
+    "promosmsTypeFull": "SMS FULL - Premium raven SMS, Uporabite lahko svoje ime pošiljatelja (najprej morate registrirati ime). Zanesljivo za opozorila.",
+    "promosmsTypeSpeed": "SMS SPEED - Najvišja prednost v sistemu. Zelo hitro in zanesljivo, vendar drago (približno dvakratnik cene SMS FULL)..",
+    "promosmsPhoneNumber": "Telefonska številka (za poljskega prejemnika Lahko preskočite področne oznake",
+    "promosmsSMSSender": "Ime pošiljatelja SMS : vnaprej registrirano ime ali eno od privzetih: SMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (z http(s):// in vrata po želji)",
+    "Internal Room Id": "Interni ID sobe",
+    "matrixDesc1": "Notranji ID sobe lahko poiščete v naprednem razdelku nastavitev sobe v odjemalcu Matrix. Izgledati mora kot !QMdRCpUIfLwsfjxye6:home.server",
+    "matrixDesc2": "Zelo priporočljivo je, da ustvarite novega uporabnika in ne uporabljate svojega žetona za dostop uporabnika Matrix, saj bo omogočil popoln dostop do vašega računa in vseh sob, ki ste se jim pridružili. Namesto tega ustvarite novega uporabnika in ga povabite le v sobo, v kateri želite prejemati obvestila. Token dostopa lahko dobite tako, da zaženete {0}",
+    "Method": "Metoda",
+    "Body": "Telo",
+    "Headers": "Glave",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Glave zahtevka niso veljavni JSON: ",
+    "BodyInvalidFormat": "Telo zahteve ni veljaven JSON: ",
+    "Monitor History": "Zgodovina",
+    "clearDataOlderThan": "Ohrani zgodovino {0} dni.",
+    "PasswordsDoNotMatch": "Gesli se ne ujemata.",
+    "records": "vnosi",
+    "One record": "En vnos",
+    "steamApiKeyDescription": "Za spremljanje igralnega strežnika Steam potrebujete ključ spletnega vmesnika Steam. Ključ API lahko registrirate tukaj: ",
+    "Current User": "Trenuten uporabnik",
+    "recent": "Nedavno",
+    "Done": "Zaključi",
+    "Info": "Info",
+    "Security": "Varnost",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Stisni bazo",
+    "Pick a RR-Type...": "Izberi RR tip...",
+    "Pick Accepted Status Codes...": "Izbiranje sprejetih kod stanja...",
+    "Default": "Privzeto",
+    "HTTP Options": "HTTP možnosti",
+    "Create Incident": "Ustvari incident",
+    "Title": "Naslov",
+    "Content": "Vsebina",
+    "Style": "Stil",
+    "info": "info",
+    "warning": "opozorilo",
+    "danger": "nevarnost",
+    "primary": "primarno",
+    "light": "svetlo",
+    "dark": "temno",
+    "Post": "Objavi",
+    "Please input title and content": "Vnesi naslov in vsebino",
+    "Created": "Ustvarjeno",
+    "Last Updated": "Nazadnje posodobljeno",
+    "Unpin": "Odpni",
+    "Switch to Light Theme": "Preklopi na svetlo temo",
+    "Switch to Dark Theme": "Preklopi na temno temo",
+    "Show Tags": "Prikaži značke",
+    "Hide Tags": "Skrij značke",
+    "Description": "Opis",
+    "No monitors available.": "Nobenega monitorja ni na voljo.",
+    "Add one": "Dodaj enega",
+    "No Monitors": "Ni monitorjev",
+    "Untitled Group": "Skupina brez imena",
+    "Services": "Storitve",
+    "Discard": "zavrzi",
+    "Cancel": "Prekliči",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "Sprožitev podatkovne zbirke VACUUM za SQLite. Če je vaša zbirka podatkov ustvarjena po različici 1.10.0, je funkcija AUTO_VACUUM že omogočena in ta ukrep ni potreben.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API uporabniško ime (vključno z webapi_ prefix)",
+    "serwersmsAPIPassword": "API geslo",
+    "serwersmsPhoneNumber": "Telefonska številka",
+    "serwersmsSenderName": "Ime SMS pošiljatelja (registrirani prek portala za stranke)",
+    "stackfield": "Stackfield"
+}
diff --git a/src/lang/sr-latn.json b/src/lang/sr-latn.json
new file mode 100644
index 00000000..95bf03f9
--- /dev/null
+++ b/src/lang/sr-latn.json
@@ -0,0 +1,204 @@
+{
+    "languageName": "Srpski",
+    "checkEverySecond": "Proveri svakih {0} sekundi.",
+    "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?",
+    "resolverserverDescription": "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.",
+    "day": "dan | dana",
+    "-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",
+    "disableauth.message1": "Da li ste sigurni da želite da <strong>isključite autentifikaciju</strong>?",
+    "disableauth.message2": "To je za <strong>one koji imaju dodatu autentifikaciju</strong> ispred Uptime Kuma kao na primer Cloudflare Access.",
+    "Please use this option carefully!": "Molim Vas koristite ovo sa pažnjom.",
+    "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",
+    "Create": "Create",
+    "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
+    "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
+    "confirmClearStatisticsMsg": "Are you sure want to delete ALL statistics?",
+    "Clear Data": "Clear Data",
+    "Events": "Events",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Auto Get",
+    "enableDefaultNotificationDescription": "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
+    "Default enabled": "Default enabled",
+    "Also apply to existing monitors": "Also apply to existing monitors",
+    "Export": "Export",
+    "Import": "Import",
+    "backupDescription": "You can backup all monitors and all notifications into a JSON file.",
+    "backupDescription2": "PS: History and event data is not included.",
+    "backupDescription3": "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
+    "alertNoFile": "Please select a file to import.",
+    "alertWrongFileType": "Please select a JSON file.",
+    "twoFAVerifyLabel": "Please type in your token to verify that 2FA is working",
+    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
+    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
+    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "Apply on all existing monitors": "Apply on all existing monitors",
+    "Verify Token": "Verify Token",
+    "Setup 2FA": "Setup 2FA",
+    "Enable 2FA": "Enable 2FA",
+    "Disable 2FA": "Disable 2FA",
+    "2FA Settings": "2FA Settings",
+    "Two Factor Authentication": "Two Factor Authentication",
+    "Active": "Active",
+    "Inactive": "Inactive",
+    "Token": "Token",
+    "Show URI": "Show URI",
+    "Clear all statistics": "Clear all Statistics",
+    "retryCheckEverySecond": "Retry every {0} seconds.",
+    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
+    "confirmImportMsg": "Are you sure to import the backup? Please make sure you've selected the right import option.",
+    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+    "Import Backup": "Import Backup",
+    "Export Backup": "Export Backup",
+    "Skip existing": "Skip existing",
+    "Overwrite": "Overwrite",
+    "Options": "Options",
+    "Keep both": "Keep both",
+    "Tags": "Tags",
+    "Add New below or Select...": "Add New below or Select...",
+    "Tag with this name already exist.": "Tag with this name already exist.",
+    "Tag with this value already exist.": "Tag with this value already exist.",
+    "color": "color",
+    "value (optional)": "value (optional)",
+    "Gray": "Gray",
+    "Red": "Red",
+    "Orange": "Orange",
+    "Green": "Green",
+    "Blue": "Blue",
+    "Indigo": "Indigo",
+    "Purple": "Purple",
+    "Pink": "Pink",
+    "Search...": "Search...",
+    "Avg. Ping": "Avg. Ping",
+    "Avg. Response": "Avg. Response",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Nothing here, please add a group or a monitor.",
+    "No Services": "No Services",
+    "All Systems Operational": "All Systems Operational",
+    "Partially Degraded Service": "Partially Degraded Service",
+    "Degraded Service": "Degraded Service",
+    "Add Group": "Add Group",
+    "Add a monitor": "Add a monitor",
+    "Edit Status Page": "Edit Status Page",
+    "Go to Dashboard": "Go to Dashboard",
+    "Status Page": "Status Page",
+    "Status Pages": "Status Pages",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost"
+}
diff --git a/src/lang/sr.json b/src/lang/sr.json
new file mode 100644
index 00000000..25f69add
--- /dev/null
+++ b/src/lang/sr.json
@@ -0,0 +1,204 @@
+{
+    "languageName": "Српски",
+    "checkEverySecond": "Провери сваких {0} секунди.",
+    "retriesDescription": "Максимум покушаја пре него што се сервис обележи као неактиван и пошаље се обавештење.",
+    "ignoreTLSError": "Игнориши TLS/SSL грешке за HTTPS веб странице.",
+    "upsideDownModeDescription": "Обрните статус. Ако је сервис доступан, онда је обележен као неактиван.",
+    "maxRedirectDescription": "Максимани број преусмерења да се прате. Поставите на 0 да би се искључила преусмерења.",
+    "acceptedStatusCodesDescription": "Одаберите статусне кодове који се сматрају успешним одговором.",
+    "passwordNotMatchMsg": "Поновљена лозинка се не поклапа.",
+    "notificationDescription": "Молим Вас поставите обавештење за масматраче да бисе активирали.",
+    "keywordDescription": "Претражи кључну реч у чистом html или JSON одговору са осетљивим великим и малим словима",
+    "pauseDashboardHome": "Паузирај",
+    "deleteMonitorMsg": "Да ли сте сигурни да желите да обришете овог посматрача?",
+    "deleteNotificationMsg": "Да ли сте сигурни д ажелите да уклоните ово обавештење за све посматраче?",
+    "resolverserverDescription": "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.": "Истек серт.",
+    "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": "Укључи аутентификацију",
+    "disableauth.message1": "Да ли сте сигурни да желите да <strong>искључите аутентификацију</strong>?",
+    "disableauth.message2": "То је за <strong>оне који имају додату аутентификацију</strong> испред Uptime Kuma као на пример Cloudflare Access.",
+    "Please use this option carefully!": "Молим Вас користите ово са пажњом.",
+    "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",
+    "Create": "Create",
+    "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
+    "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
+    "confirmClearStatisticsMsg": "Are you sure want to delete ALL statistics?",
+    "Clear Data": "Clear Data",
+    "Events": "Events",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Auto Get",
+    "enableDefaultNotificationDescription": "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
+    "Default enabled": "Default enabled",
+    "Also apply to existing monitors": "Also apply to existing monitors",
+    "Export": "Export",
+    "Import": "Import",
+    "backupDescription": "You can backup all monitors and all notifications into a JSON file.",
+    "backupDescription2": "PS: History and event data is not included.",
+    "backupDescription3": "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
+    "alertNoFile": "Please select a file to import.",
+    "alertWrongFileType": "Please select a JSON file.",
+    "twoFAVerifyLabel": "Please type in your token to verify that 2FA is working",
+    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
+    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
+    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "Apply on all existing monitors": "Apply on all existing monitors",
+    "Verify Token": "Verify Token",
+    "Setup 2FA": "Setup 2FA",
+    "Enable 2FA": "Enable 2FA",
+    "Disable 2FA": "Disable 2FA",
+    "2FA Settings": "2FA Settings",
+    "Two Factor Authentication": "Two Factor Authentication",
+    "Active": "Active",
+    "Inactive": "Inactive",
+    "Token": "Token",
+    "Show URI": "Show URI",
+    "Clear all statistics": "Clear all Statistics",
+    "retryCheckEverySecond": "Retry every {0} seconds.",
+    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
+    "confirmImportMsg": "Are you sure to import the backup? Please make sure you've selected the right import option.",
+    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+    "Import Backup": "Import Backup",
+    "Export Backup": "Export Backup",
+    "Skip existing": "Skip existing",
+    "Overwrite": "Overwrite",
+    "Options": "Options",
+    "Keep both": "Keep both",
+    "Tags": "Tags",
+    "Add New below or Select...": "Add New below or Select...",
+    "Tag with this name already exist.": "Tag with this name already exist.",
+    "Tag with this value already exist.": "Tag with this value already exist.",
+    "color": "color",
+    "value (optional)": "value (optional)",
+    "Gray": "Gray",
+    "Red": "Red",
+    "Orange": "Orange",
+    "Green": "Green",
+    "Blue": "Blue",
+    "Indigo": "Indigo",
+    "Purple": "Purple",
+    "Pink": "Pink",
+    "Search...": "Search...",
+    "Avg. Ping": "Avg. Ping",
+    "Avg. Response": "Avg. Response",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Nothing here, please add a group or a monitor.",
+    "No Services": "No Services",
+    "All Systems Operational": "All Systems Operational",
+    "Partially Degraded Service": "Partially Degraded Service",
+    "Degraded Service": "Degraded Service",
+    "Add Group": "Add Group",
+    "Add a monitor": "Add a monitor",
+    "Edit Status Page": "Edit Status Page",
+    "Go to Dashboard": "Go to Dashboard",
+    "Status Page": "Status Page",
+    "Status Pages": "Status Pages",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost"
+}
diff --git a/src/lang/sv-SE.json b/src/lang/sv-SE.json
new file mode 100644
index 00000000..233a91f2
--- /dev/null
+++ b/src/lang/sv-SE.json
@@ -0,0 +1,110 @@
+{
+    "languageName": "Svenska",
+    "checkEverySecond": "Uppdatera var {0} sekund.",
+    "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ösenordet stämmer ej överens.",
+    "notificationDescription": "Vänligen lägg till en notistjänst till dina övervakare.",
+    "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?",
+    "resolverserverDescription": "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": "Pausa",
+    "Name": "Namn",
+    "Status": "Status",
+    "DateTime": "Datum & Tid",
+    "Message": "Meddelande",
+    "No important events": "Inga viktiga händelser",
+    "Resume": "Återuppta",
+    "Edit": "Redigera",
+    "Delete": "Ta bort",
+    "Current": "Nuvarande",
+    "Uptime": "Drifttid",
+    "Cert Exp.": "Certifikat utgår",
+    "day": "dag | dagar",
+    "-day": " dagar",
+    "hour": "timme",
+    "-hour": " timmar",
+    "Response": "Svar",
+    "Ping": "Ping",
+    "Monitor Type": "Övervakningstyp",
+    "Keyword": "Nyckelord",
+    "Friendly Name": "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": "Ny Notistjänst",
+    "Light": "Ljust",
+    "Dark": "Mörkt",
+    "Auto": "Automatiskt",
+    "Theme - Heartbeat Bar": "Tema - Heartbeat Bar",
+    "Normal": "Normal",
+    "Bottom": "Botten",
+    "None": "Tomt",
+    "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",
+    "respTime": "Svarstid (ms)",
+    "notAvailableShort": "Ej Tillg."
+}
diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
new file mode 100644
index 00000000..7ad132f5
--- /dev/null
+++ b/src/lang/th-TH.json
@@ -0,0 +1,580 @@
+{
+    "languageName": "ไทย",
+    "checkEverySecond": "ตรวจสอบทุก {0} วินาที",
+    "retryCheckEverySecond": "ลองใหม่ทุก {0} วินาที",
+    "retriesDescription": "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
+    "ignoreTLSError": "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
+    "upsideDownModeDescription": "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
+    "maxRedirectDescription": "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั้งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
+    "acceptedStatusCodesDescription": "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
+    "passwordNotMatchMsg": "รหัสผ่านไม่ตรงกัน",
+    "notificationDescription": "การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้",
+    "keywordDescription": "ค้นหาคำสำคัญใน HTML หรือ JSON ของการตอบกลับ, คำสำคัญต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่",
+    "pauseDashboardHome": "หยุดชั่วคราว",
+    "deleteMonitorMsg": "คุณแน่ใจหรือไม่ที่จะลบมอนิเตอร์?",
+    "deleteNotificationMsg": "คุณแน่ใจหรือไม่ที่จะลบการแจ้งเตือนสำหรับมอนิเตอร์ทั้งหมด?",
+    "resolverserverDescription": "Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา",
+    "rrtypeDescription": "เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์",
+    "pauseMonitorMsg": "คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?",
+    "enableDefaultNotificationDescription": "การแจ้งเตือนนี้จะถูกเปิดโดยค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
+    "clearEventsMsg": "คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?",
+    "clearHeartbeatsMsg": "คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?",
+    "confirmClearStatisticsMsg": "คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?",
+    "importHandleDescription": "เลือก \"ข้ามรายการที่มีอยู่แล้ว\" ถ้าคุณต้องการข้ามทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน, \"เขียนทับ\" จะลบทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน",
+    "confirmImportMsg": "คุณแน่ใจหรือไม่ที่จะนำเข้าข้อมูลสำรอง, กรุณาตรวจสอบว่าคุณเลือกข้อมูลที่ถูกต้อง",
+    "twoFAVerifyLabel": "โปรดกรอกกุญแจ 2FA ของคุณเพื่อยืนยัน:",
+    "tokenValidSettingsMsg": "กุญแจถูกต้อง, ตอนนี้คุณสามารถบันทึกการตั้งค่า 2FA ของคุณได้แล้ว",
+    "confirmEnableTwoFAMsg": "คุณแน่ใจหรือไม่ที่จะเปิดใช้งาน 2FA?",
+    "confirmDisableTwoFAMsg": "คุณแน่ใจหรือไม่ที่จะปิดใช้งาน 2FA?",
+    "Settings": "การตั้งค่า",
+    "Dashboard": "แผงควบคุม",
+    "New Update": "อัพเดทใหม่",
+    "Language": "ภาษา",
+    "Appearance": "รูปร่าง",
+    "Theme": "หน้าตา",
+    "General": "ทั่วไป",
+    "Primary Base URL": "URL หลัก",
+    "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": "จำนวนครั้งที่จะลองใหม่",
+    "Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
+    "Advanced": "ขั้นสูง",
+    "Upside Down Mode": "โหมดกลับด้าน",
+    "Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด",
+    "Accepted Status Codes": "รหัสสถานะที่ยอมรับ",
+    "Push URL": "URL เป้าหมาย",
+    "needPushEvery": "คุณควรเรียก URL นี้ทุก {0} วินาที",
+    "pushOptionalParams": "ตัวแปรเสริม: {0}",
+    "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": "เปิดใช้งานการตรวจสอบสิทธิ์",
+    "disableauth.message1": "คุณต้องการที่จะ <strong>ปิดใช้งานระบบรับรองความถูกต้องใช่หรือไม่</strong>?",
+    "disableauth.message2": "ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่น ๆ",
+    "Please use this option carefully!": "โปรดใช้ความระมัดระวังในการเลือกใช้งานระบบนี้ !",
+    "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": "ประเภท DNS Record",
+    "Last Result": "ผลล่าสุด",
+    "Create your admin account": "สร้างบัญชีผู้ดูแลระบบ",
+    "Repeat Password": "ยืนยันรหัสผ่าน",
+    "Import Backup": "นำเข้าข้อมูลสำรอง",
+    "Export Backup": "ส่งออกข้อมูลสำรอง",
+    "Export": "ส่งออก",
+    "Import": "นำเข้า",
+    "respTime": "ระยะเวลาการตอบสนอง (ms)",
+    "notAvailableShort": "ไม่สามารถใช้งานได้",
+    "Default enabled": "เปิดใช้งานโดยค่าเริ่มต้น",
+    "Apply on all existing monitors": "ใช้กับมอนิเตอร์ทั้งหมด",
+    "Create": "สร้าง",
+    "Clear Data": "ล้างข้อมูล",
+    "Events": "เหตุการณ์",
+    "Heartbeats": "ประวัติการตรวจสอบ",
+    "Auto Get": "ดึงอัตโนมัติ",
+    "backupDescription": "คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดไว้ได้ในไฟล์ JSON",
+    "backupDescription2": "หมายเหตุ : ประวัติและข้อมูลเหตการณ์จะไม่ถูกสำรอง",
+    "backupDescription3": "ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย",
+    "alertNoFile": "กรุณาเลือกไฟล์ที่จะใช้งาน",
+    "alertWrongFileType": "กรุณาเลือกไฟล์ที่เป็น JSON",
+    "Clear all statistics": "ล้างข้อมูลสถิติทั้งหมด",
+    "Skip existing": "ข้ามรายการที่มีอยู่แล้ว",
+    "Overwrite": "เขียนทับ",
+    "Options": "ตัวเลือก",
+    "Keep both": "เก็บทั้งสอง",
+    "Verify Token": "ยืนยันกุญแจ",
+    "Setup 2FA": "ติดตั้ง 2FA",
+    "Enable 2FA": "เปิดใช้งาน 2FA",
+    "Disable 2FA": "ปิดใช้งาน 2FA",
+    "2FA Settings": "ตั้งค่า 2FA",
+    "Two Factor Authentication": "การยืนยันตัวตนแบบสองขั้นตอน",
+    "Active": "ใช้งาน",
+    "Inactive": "ไม่ใช้งาน",
+    "Token": "กุญแจ",
+    "Show URI": "แสดง URI",
+    "Tags": "แท็ก",
+    "Add New below or Select...": "เพิ่มใหม่ด้านล่างหรือเลือก...",
+    "Tag with this name already exist.": "แท็กที่มีชื่อนี้มีอยู่แล้ว",
+    "Tag with this value already exist.": "แท็กที่มีข้อมูลนี้มีอยู่แล้ว",
+    "color": "สี",
+    "value (optional)": "ข้อมูล (ไม่จำเป็น)",
+    "Gray": "เทา",
+    "Red": "แดง",
+    "Orange": "ส้ม",
+    "Green": "เขียว",
+    "Blue": "น้ำเงิน",
+    "Indigo": "ม่วง",
+    "Purple": "ม่วง",
+    "Pink": "ชมพู",
+    "Search...": "ค้นหา...",
+    "Avg. Ping": "ค่า Ping เฉลี่ย",
+    "Avg. Response": "ค่า Response เฉลี่ย",
+    "Entry Page": "หน้าต้อนรับ",
+    "statusPageNothing": "ไม่มีอะไรตรงนี้ !, กรุณาเพิ่มกลุ่มหรือมอนิเตอร์",
+    "No Services": "ไม่มีบริการ",
+    "All Systems Operational": "บริการทั้งหมดทำงานได้ปกติ",
+    "Partially Degraded Service": "บริการมีปัญหาบางส่วน",
+    "Degraded Service": "บริการมีปัญหา",
+    "Add Group": "เพิ่มกลุ่ม",
+    "Add a monitor": "เพิ่มมอนิเตอร์",
+    "Edit Status Page": "แก้ไขหน้าสถานะ",
+    "Go to Dashboard": "ไปที่หน้าควบคุม",
+    "Status Page": "หน้าสถานะ",
+    "Status Pages": "หน้าสถานะ",
+    "defaultNotificationName": "การแจ้งเตือน {notification} ของฉัน ({number})",
+    "here": "ที่นี่",
+    "Required": "จำเป็น",
+    "telegram": "Telegram",
+    "Bot Token": "กุญแจของบอท",
+    "wayToGetTelegramToken": "คุณสามารถรับกุญแจได้จาก {0}.",
+    "Chat ID": "ไอดีแชท",
+    "supportTelegramChatID": "รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท",
+    "wayToGetTelegramChatID": "คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :",
+    "YOUR BOT TOKEN HERE": "กุญแจของบอทของคุณที่นี่",
+    "chatIDNotFound": "ไม่พบไอดีแชท, กรุณาส่งข้อความไปที่บอท",
+    "webhook": "Webhook",
+    "Post URL": "URL โพสต์",
+    "Content Type": "ประเภทเนื้อหา",
+    "webhookJsonDesc": "{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js",
+    "webhookFormDataDesc": "{multipart} ดีสำหรับ PHP, ข้อมูล JSON จะต้องถูกประมวลผลด้วย {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "เพิกเฉยข้อผิดพลาด TLS",
+    "From Email": "จากอีเมล",
+    "emailCustomSubject": "หัวข้อที่กำหนดเอง",
+    "To Email": "ถึงอีเมล",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "ชื่อบอท",
+    "Prefix Custom Message": "คำนำหน้าข้อความที่กำหนดเอง",
+    "Hello @everyone is...": "สวัสดี {'@'}everyone นี่...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}",
+    "signal": "Signal",
+    "Number": "หมายเลข",
+    "Recipients": "ผู้รับ",
+    "needSignalAPI": "คุณต้องมี Signal Client ที่มี Rest API",
+    "wayToCheckSignalURL": "คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :",
+    "signalImportant": "สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!",
+    "gotify": "Gotify",
+    "Application Token": "กุญแจของแอพพลิเคชั่น",
+    "Server URL": "Server URL",
+    "Priority": "ลำดับความสำคัญ",
+    "slack": "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "ชื่อห้อง",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}",
+    "aboutChannelName": "ใส่ชื่อห้องใน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ",
+    "aboutKumaURL": "ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github",
+    "emojiCheatSheet": "ตาราง Emoji : {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)",
+    "GoogleChat": "Google Chat (สำหรับ Google Workspace เท่านั้น)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "กุญแจผู้ใช้งาน",
+    "Device": "อุปกรณ์",
+    "Message Title": "หัวข้อข้อความ",
+    "Notification Sound": "เสียงแจ้งเตือน",
+    "More info on:": "ข้อมูลเพิ่มเติม : {0}",
+    "pushoverDesc1": "ลำดับความสำคัญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างการลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง",
+    "pushoverDesc2": "ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่นๆ สามารถกำหนดได้ที่ช่องอุปกรณ์",
+    "SMS Type": "ประเภท SMS",
+    "octopushTypePremium": "พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)",
+    "octopushTypeLowCost": "ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)",
+    "checkPrice": "ตรวจสอบราคาของ {0} :",
+    "apiCredentials": "ข้อมูลการตรวจสอบสิทธิ์ API",
+    "octopushLegacyHint": "คุณใช้เวอร์ชันดั้งเดิมของ Octopush (2011 - 2020) หรือเวอร์ชันใหม่หรือไม่?",
+    "Check octopush prices": "ตรวจสอบราคาของ Octopush {0}",
+    "octopushPhoneNumber": "หมายเลขโทรศัพท์ (รูปแบบสากล เช่น +33612345678) ",
+    "octopushSMSSender": "ชื่อผู้ส่ง SMS : ความยาว 3 - 11 ตัวอักษร, ตัวเลข และช่องว่าง (a-zA-Z0-9 )",
+    "LunaSea Device ID": "ไอดีอุปกรณ์ LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "ตัวอย่าง : {0}",
+    "Read more:": "อ่านเพิ่มเติม : {0}",
+    "Status:": "สถานะ : {0}",
+    "Read more": "อ่านเพิ่มเติม",
+    "appriseInstalled": "Apprise ถูกติดตั้งแล้ว",
+    "appriseNotInstalled": "Apprise ยังไม่ถูกติดตั้ง {0}",
+    "Access Token": "กุญแจการเข้าถึง",
+    "Channel access token": "กุญแจการเข้าถึงของช่อง",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "การตั้งค่าพื้นฐาน",
+    "User ID": "ไอดีผู้ใช้",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "คุณสามารถระบุลิงก์รูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
+    "aboutMattermostChannelName": "คุณลบช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับในโปแลนด์",
+    "promosmsTypeFlash": "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับในโปแลนด์",
+    "promosmsTypeFull": "SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน",
+    "promosmsTypeSpeed": "SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)",
+    "promosmsPhoneNumber": "หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)",
+    "promosmsSMSSender": "ชื่อผู้ส่ง SMS : ชื่อที่ลงทะเบียนล่วงหน้าหรือหนึ่งในค่าเริ่มต้น: InfoSMS, ข้อมูล SMS, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)",
+    "Internal Room Id": "รหัสห้องภายใน",
+    "matrixDesc1": "คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.",
+    "matrixDesc2": "ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วม ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}",
+    "Method": "วิธี",
+    "Body": "เนื้อหา",
+    "Headers": "ส่วนหัว",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง :",
+    "BodyInvalidFormat": "เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ",
+    "Monitor History": "ประวัติมอนิเตอร์",
+    "clearDataOlderThan": "เก็บข้อมูลมอนิเตอร์ {0} วัน",
+    "PasswordsDoNotMatch": "รหัสผ่านไม่ตรงกัน",
+    "records": "บันทึก",
+    "One record": "หนึ่งบันทึก",
+    "steamApiKeyDescription": "สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถสมัครได้จากที่นี่ : ",
+    "Current User": "ผู้ใช้ปัจจุบัน",
+    "topic": "หัวข้อ",
+    "topicExplanation": "หัวข้อ MQTT ที่จะมอนิเตอร์",
+    "successMessage": "ข้อความที่จะถือว่าประสบความสำเร็จ",
+    "successMessageExplanation": "ข้อความ MQTT ที่จะถือว่าประสบความสำเร็จ",
+    "recent": "ล่าสุด",
+    "Done": "สำเร็จ",
+    "Info": "ข้อมูล",
+    "Security": "ความปลอดภัย",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "ย่อฐานข้อมูล",
+    "Pick a RR-Type...": "เลือกชนิด DNS Record",
+    "Pick Accepted Status Codes...": "เลือกสถานะที่ยอมรับ...",
+    "Default": "ค่าเริ่มต้น",
+    "HTTP Options": "ตัวเลือก HTTP",
+    "Create Incident": "สร้างเหตุการณ์",
+    "Title": "หัวข้อ",
+    "Content": "เนื้อหา",
+    "Style": "สไตล์",
+    "info": "ข้อมูล",
+    "warning": "แจ้งเตือน",
+    "danger": "อันตราย",
+    "primary": "หลัก",
+    "light": "สว่าง",
+    "dark": "มืด",
+    "Post": "โพสต์",
+    "Please input title and content": "กรุณาใส่ชื่อและเนื้อหา",
+    "Created": "สร้าง",
+    "Last Updated": "อัพเดทล่าสุด",
+    "Unpin": "เลิกตรึง",
+    "Switch to Light Theme": "เปลี่ยนเป็นแบบสว่าง",
+    "Switch to Dark Theme": "เปลี่ยนเป็นแบบมืด",
+    "Show Tags": "แสดงแท็ก",
+    "Hide Tags": "ซ่อนแท็ก",
+    "Description": "รายละเอียด",
+    "No monitors available.": "ไม่มีมอนิเตอร์ที่สามารถใช้งานได้",
+    "Add one": "เพิ่ม",
+    "No Monitors": "ไม่มีมอนิเตอร์",
+    "Untitled Group": "กลุ่มที่ไม่มีชื่อ",
+    "Services": "บริการ",
+    "Discard": "ทิ้ง",
+    "Cancel": "ยกเลิก",
+    "Powered by": "ขับเคลื่อนโดย",
+    "shrinkDatabaseDescription": "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจากเวอร์ชั่น 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Password",
+    "serwersmsPhoneNumber": "หมายเลขโทรศัพท์",
+    "serwersmsSenderName": "ชื่อผู้ส่ง SMS (ลงทะเบียนผ่านหน้าควบคุม)",
+    "stackfield": "Stackfield",
+    "Customize": "ปรับแต่ง",
+    "Custom Footer": "ส่วนท้ายที่กำหนดเอง",
+    "Custom CSS": "CSS ที่กำหนดเอง",
+    "smtpDkimSettings": "การตั้งค่า DKIM",
+    "smtpDkimDesc": "โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน",
+    "documentation": "คู่มือการใช้งาน",
+    "smtpDkimDomain": "ชื่อโดเมน",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "อัลกอริทึมแฮช (ไม่บังคับ)",
+    "smtpDkimheaderFieldNames": "คีย์ส่วนหัวสำหรับลงชื่อ (ไม่บังคับ)",
+    "smtpDkimskipFields": "Header Keys ไม่ต้องเซ็น (ไม่บังคับ)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "กุญแจ API",
+    "alertaAlertState": "แจ้งเตือนสถานะ",
+    "alertaRecoverState": "กู้คืนสถานะ",
+    "deleteStatusPageMsg": "คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้",
+    "Proxies": "พร็อกซี",
+    "default": "ค่าเริ่มต้น",
+    "enabled": "เปิดใช้งานแล้ว",
+    "setAsDefault": "ตั้งเป็นค่าเริ่มต้น",
+    "deleteProxyMsg": "คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?",
+    "proxyDescription": "ต้องตั้งค่ามอนิเตอร์ให้ใช้พร็อกซีเพื่อให้ใช้งานได้",
+    "enableProxyDescription": "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้ที่ส่วนสถานะการเปิดใช้งาน",
+    "setAsDefaultProxyDescription": "พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
+    "Certificate Chain": "ห่วงโซ่ใบรับรอง",
+    "Valid": "ถูกต้อง",
+    "Invalid": "ไม่ถูกต้อง",
+    "AccessKeyId": "กุญแจสิทธิ ID",
+    "SecretAccessKey": "กุญแจสิทธิ Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "รหัสเทมเพลต",
+    "SignName": "ป้ายชื่อ",
+    "Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
+    "Device Token": "Device Token",
+    "Platform": "แพลตฟอร์ม",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "สูง",
+    "Retry": "ลองใหม่",
+    "Topic": "หัวข้อ",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "ติดตั้งพร็อกซี่",
+    "Proxy Protocol": "โปรโตคอลพร็อกซี่",
+    "Proxy Server": "เซิร์ฟเวอร์พร็อกซี",
+    "Proxy server has authentication": "พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์",
+    "User": "ผู้ใช้",
+    "Installed": "ติดตั้งแล้ว",
+    "Not installed": "ไม่ได้ติดตั้ง",
+    "Running": "กำลังทำงาน",
+    "Not running": "ไม่ได้ทำงาน",
+    "Remove Token": "ลบกุญแจ",
+    "Start": "เริ่ม",
+    "Stop": "หยุด",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "เพิ่มหน้าสถานะใหม่",
+    "Slug": "ชื่อ",
+    "Accept characters:": "ตัวอักษรที่ใช้งานได้ :",
+    "startOrEndWithOnly": "เริ่มหรือจบด้วย {0} เท่านั้น",
+    "No consecutive dashes": "ไม่มีขีดกลางติดต่อกัน",
+    "Next": "ต่อไป",
+    "The slug is already taken. Please choose another slug.": "ชื่อนี้ถูกใช้งานแล้ว กรุณาใช้ชื่ออื่น",
+    "No Proxy": "ไม่มีพร็อกซี่",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "หน้าสถานะใหม่",
+    "Page Not Found": "ไม่พบหน้านี้",
+    "Reverse Proxy": "พร็อกซีย้อนกลับ",
+    "Backup": "สำรองข้อมูล",
+    "About": "เกี่ยวกับ",
+    "wayToGetCloudflaredURL": "(ดาวโหลด cloudflared จาก {0})",
+    "cloudflareWebsite": "เว็บไซต์ Cloudflare",
+    "Message:": "ข้อความ :",
+    "Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน",
+    "Other Software": "ซอฟต์แวร์อื่นๆ ",
+    "For example: nginx, Apache and Traefik.": "เช่น: nginx, Apache และ Traefik",
+    "Please read": "กรุณาอ่าน",
+    "Subject:": "เรื่อง :",
+    "Valid To:": "ใช้ได้ถึง :",
+    "Days Remaining:": "จำนวนวันที่เหลือ :",
+    "Issuer:": "ผู้ออก :",
+    "Fingerprint:": "ลายนิ้วมือ :",
+    "No status pages": "ไม่มีหน้าสถานะ",
+    "Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุของโดเมน",
+    "Proxy": "Proxy",
+    "Date Created": "วันที่สร้าง",
+    "onebotHttpAddress": "ที่อยู่ HTTP OneBot ",
+    "onebotMessageType": "ชนิดข้อความ OneBot",
+    "onebotGroupMessage": "กลุ่ม",
+    "onebotPrivateMessage": "ส่วนตัว",
+    "onebotUserOrGroupId": "กลุ่ม / ไอดีผู้ใช้",
+    "onebotSafetyTips": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
+    "PushDeer Key": "กุญแจ PushDeer",
+    "Footer Text": "ข้อความส่วนท้าย",
+    "Show Powered By": "แสดงข้อความ \"ขับเคลื่อนโดย\"",
+    "Domain Names": "Domain Names",
+    "signedInDisp": "เข้าใช้งานในฐานะ {0}",
+    "signedInDispDisabled": "ปิดการยืนยันตัวตน",
+    "Certificate Expiry Notification": "แจ้งเตือนใบรับรองหมดอายุ",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "หมายเลขผู้รับ",
+    "From Name/Number": "จาก ชื่อ / หมายเลข",
+    "Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
+    "octopushLogin": "\"Login\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Device token",
+    "Show update if available": "แสดงการอัปเดตถ้ามี",
+    "Also check beta release": "ตรวจสอบรุ่นเบต้า",
+    "Using a Reverse Proxy?": "ใช้ Reverse Proxy อยู่ใช่มั้ย?",
+    "Check how to config it for WebSocket": "ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "สาเหตุที่เป็นไปได้มากที่สุด :",
+    "The resource is no longer available.": "ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป",
+    "There might be a typing error in the address.": "อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่",
+    "What you can try:": "สิ่งที่คุณสามารถลองทำ :",
+    "Retype the address.": "พิมพ์ที่อยู่อีกครั้ง",
+    "Go back to the previous page.": "กลับไปหน้าที่แล้ว",
+    "Coming Soon": "เร็วๆ นี้",
+    "wayToGetClickSendSMSToken": "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
+    "wayToGetLineNotifyToken": "คุณสามารถรับ access token ได้จาก {0}",
+    "resendEveryXTimes": "ส่งซ้ำทุก {0} ครั้ง",
+    "resendDisabled": "การส่งซ้ำถูกปิดใช้งาน",
+    "dnsPortDescription": "พอร์ตของเซิร์ฟเวอร์ DNS, ค่าเริ่มต้นคือ 53, คุณสามารถเปลี่ยนพอร์ตตอนไหนก็ได้",
+    "Resend Notification if Down X times consequently": "ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง",
+    "error": "เกิดข้อผิดพลาด",
+    "critical": "วิกฤต",
+    "wayToGetPagerDutyKey": "คุณสามารถรับคีย์ได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา \"Events API V2\", สำหรับข้อมูลเพิ่มเติม {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "แก้ไขอัตโนมัติหรือยอมรับ",
+    "do nothing": "ไม่ทำอะไร",
+    "auto acknowledged": "ยอมรับอัตโนมัติ",
+    "auto resolve": "แก้ไขอัตโนมัติ",
+    "Bark Group": "กลุ่มที่จะประกาศ",
+    "Bark Sound": "เสียงประกาศ",
+    "Authentication": "การตรวจสอบสิทธิ์",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Trust Proxy",
+    "HomeAssistant": "Home Assistant",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "แบ่งปันคีย์ลับระหว่างผู้ใช้งานและเซิร์ฟเวอร์",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCalledStationIdDescription": "Identifier of the called device",
+    "RadiusCallingStationId": "Calling Station Id",
+    "RadiusCallingStationIdDescription": "Identifier of the calling device",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "วันหมดอายุของใบรับรอง TLS",
+    "certificationExpiryDescription": "การตรวจสอบ HTTPS จะแจ้งเตือนถ้าใบอนุญาติ TLS จะหมดอายุใน:",
+    "Setup Docker Host": "ติดตั้ง Docker Host",
+    "Connection Type": "ประเภทการเชื่อมต่อ",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "คุณแน่ใจหรือไม่ที่จะลบ Docker host นี้สำหรับการมอนิเตอร์ทั้งหมด?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Name / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "โดเมน",
+    "Workstation": "Workstation",
+    "disableCloudflaredNoAuthMsg": "คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน",
+    "trustProxyDescription": "เชื่อ Header 'X-Forwarded-*' ถ้าคุณต้องการไอพีที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache, คุณควรเปิดใช้งาน",
+    "Examples": "ตัวอย่าง",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Access Token แบบมีอายุนาน",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก \"Create Token\"",
+    "Notification Service": "บริการแจ้งเตือน",
+    "default: notify all devices": "ค่าเริ่มต้น: แจ้งเตือนทุกอุปกรณ์",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู \"Developer Tools > Services\" แล้วค้นหา \"notification\" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์",
+    "Automations can optionally be triggered in Home Assistant:": "สามารถเลือกสั่งงานระบบอัตโนมัติได้ใน Home Assistant:",
+    "Trigger type:": "ชนิดสิ่งกระตุ้น:",
+    "Event type:": "ชนิดเหตการณ์:",
+    "Event data:": "ข้อมูลกิจกรรม:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง",
+    "Frontend Version": "เวอร์ชั่น Frontend",
+    "Frontend Version do not match backend version!": "เวอร์ชั่น Frontend ไม่ตรงกับ Backend !"
+}
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
new file mode 100644
index 00000000..8428dcf9
--- /dev/null
+++ b/src/lang/tr-TR.json
@@ -0,0 +1,678 @@
+{
+    "languageName": "Türkçe",
+    "checkEverySecond": "{0} Saniyede bir kontrol et.",
+    "retryCheckEverySecond": "{0} Saniyede bir dene.",
+    "resendEveryXTimes": "Her {0} bir yeniden gönder",
+    "resendDisabled": "Yeniden gönderme devre dışı",
+    "retriesDescription": "Servisin kapalı olarak işaretlenmeden ve bir bildirim gönderilmeden önce maksimum yeniden deneme sayısı",
+    "ignoreTLSError": "HTTPS web siteleri için TLS/SSL hatasını yoksay",
+    "upsideDownModeDescription": "Servisin durumunu tersine çevirir. Servis çalışıyorsa kapalı olarak işaretler.",
+    "maxRedirectDescription": "İzlenecek maksimum yönlendirme sayısı. Yönlendirmeleri devre dışı bırakmak için 0'a ayarlayın.",
+    "acceptedStatusCodesDescription": "Servisin çalıştığını hangi durum kodları belirlesin?",
+    "passwordNotMatchMsg": "Şifre eşleşmiyor.",
+    "notificationDescription": "Servislerin bildirim gönderebilmesi için bir bildirim yöntemi belirleyin.",
+    "keywordDescription": "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır",
+    "pauseDashboardHome": "Durdur",
+    "deleteMonitorMsg": "Servisi silmek istediğinden emin misin?",
+    "deleteNotificationMsg": "Bu bildirimi tüm servisler için silmek istediğinden emin misin?",
+    "dnsPortDescription": "DNS sunucusu bağlantı noktası. Varsayılan değer 53'tür. Bağlantı noktasını istediğiniz zaman değiştirebilirsiniz.",
+    "resolverserverDescription": "Cloudflare varsayılan sunucudur, çözümleyici sunucusunu istediğiniz zaman değiştirebilirsiniz.",
+    "rrtypeDescription": "İzlemek istediğiniz servisin RR-Tipini seçin",
+    "pauseMonitorMsg": "Durdurmak istediğinden emin misin?",
+    "enableDefaultNotificationDescription": "Bu bildirim her yeni serviste aktif olacaktır. Bildirimi servisler için ayrı ayrı deaktive edebilirsiniz. ",
+    "clearEventsMsg": "Bu servisin bütün kayıtlarını silmek istediğinden emin misin?",
+    "clearHeartbeatsMsg": "Bu servis için tüm sağlık durumunu silmek istediğinden emin misin?",
+    "confirmClearStatisticsMsg": "Tüm istatistikleri silmek istediğinden emin misin?",
+    "importHandleDescription": "Aynı isimdeki bütün servisleri ve bildirimleri atlamak için 'Var olanı atla' seçiniz. 'Üzerine yaz' var olan bütün servisleri ve bildirimleri silecektir. ",
+    "confirmImportMsg": "Yedeği içeri aktarmak istediğinize emin misiniz? Lütfen doğru içeri aktarma seçeneğini seçtiğinizden emin olunuz. ",
+    "twoFAVerifyLabel": "Lütfen tokeni yazarak 2FA doğrulamanın çalıştığından emin olunuz.",
+    "tokenValidSettingsMsg": "Token geçerli! Şimdi 2FA ayarlarını kaydedebilirsiniz. ",
+    "confirmEnableTwoFAMsg": "2FA'ı etkinleştirmek istediğinizden emin misiniz?",
+    "confirmDisableTwoFAMsg": "2FA'ı devre dışı bırakmak istediğinize emin misiniz?",
+    "Settings": "Ayarlar",
+    "Dashboard": "Panel",
+    "New Update": "Yeni Güncelleme",
+    "Language": "Dil",
+    "Appearance": "Görünüm",
+    "Theme": "Tema",
+    "General": "Genel",
+    "Primary Base URL": "Birincil Temel URL",
+    "Version": "Versiyon",
+    "Check Update On GitHub": "GitHub'da Güncellemeyi Kontrol Edin",
+    "List": "Liste",
+    "Add": "Ekle",
+    "Add New Monitor": "Yeni Servis Ekle",
+    "Quick Stats": "Servis istatistikleri",
+    "Up": "Normal",
+    "Down": "Hatalı",
+    "Pending": "Bekliyor",
+    "Unknown": "Bilinmeyen",
+    "Pause": "Durdur",
+    "Name": "Servis ismi",
+    "Status": "Durum",
+    "DateTime": "Zaman",
+    "Message": "Mesaj",
+    "No important events": "Önemli olay yok",
+    "Resume": "Devam et",
+    "Edit": "Düzenle",
+    "Delete": "Sil",
+    "Current": "Şu anda",
+    "Uptime": "Çalışma zamanı",
+    "Cert Exp.": "Sertifika Süresi",
+    "day": "gün | günler",
+    "-day": "-gün",
+    "hour": "saat",
+    "-hour": "-saat",
+    "Response": "Cevap Süresi",
+    "Ping": "Ping",
+    "Monitor Type": "Servis Tipi",
+    "Keyword": "Anahtar Kelime",
+    "Friendly Name": "Panelde görünecek isim",
+    "URL": "URL",
+    "Hostname": "IP Adresi",
+    "Port": "Port",
+    "Heartbeat Interval": "Servis Test Aralığı",
+    "Retries": "Yeniden deneme",
+    "Heartbeat Retry Interval": "Sağlık Durumları Tekrar Deneme Sıklığı",
+    "Resend Notification if Down X times consequently": "Sonuç olarak X kez düşerse bildirimi yeniden gönder",
+    "Advanced": "Gelişmiş",
+    "Upside Down Mode": "Ters/Düz Modu",
+    "Max. Redirects": "Maksimum Yönlendirme",
+    "Accepted Status Codes": "Kabul Edilen Durum Kodları",
+    "Push URL": "Push URL",
+    "needPushEvery": "Bu URL'yi her {0} saniyede bir aramalısınız.",
+    "pushOptionalParams": "İsteğe bağlı parametreler: {0}",
+    "Save": "Kaydet",
+    "Notifications": "Bildirimler",
+    "Not available, please setup.": "Atanmış bildirim yöntemi yok. Ayarlardan belirleyebilirsiniz.",
+    "Setup Notification": "Bildirim yöntemi kur",
+    "Light": "Açık",
+    "Dark": "Koyu",
+    "Auto": "Oto",
+    "Theme - Heartbeat Bar": "Servis Bar Konumu",
+    "Normal": "Normal",
+    "Bottom": "Aşağıda",
+    "None": "Gösterme",
+    "Timezone": "Zaman Dilimi",
+    "Search Engine Visibility": "Arama Motoru Görünürlüğü",
+    "Allow indexing": "İndekslemeye izin ver",
+    "Discourage search engines from indexing site": "İndekslemeyi reddet",
+    "Change Password": "Şifre Değiştir",
+    "Current Password": "Şuan ki Şifre",
+    "New Password": "Yeni Şifre",
+    "Repeat New Password": "Yeni Şifreyi Tekrar Girin",
+    "Update Password": "Şifreyi Değiştir",
+    "Disable Auth": "Şifreli girişi iptal et.",
+    "Enable Auth": "Şifreli girişi aktif et.",
+    "disableauth.message1": "<strong>Şifreli girişi devre dışı bırakmak istediğinizden</strong>emin misiniz?",
+    "disableauth.message2": "Bu, Uptime Kuma'nın önünde Cloudflare Access gibi <strong>üçüncü taraf yetkilendirmesi olan</strong> kişiler içindir.",
+    "Please use this option carefully!": "Lütfen dikkatli kullanın.",
+    "Logout": "Çıkış yap",
+    "Leave": "Ayrıl",
+    "I understand, please disable": "Evet farkındayım, iptal et",
+    "Confirm": "Onayla",
+    "Yes": "Evet",
+    "No": "Hayır",
+    "Username": "Kullanıcı Adı",
+    "Password": "Şifre",
+    "Remember me": "Beni Hatırla",
+    "Login": "Giriş yap",
+    "No Monitors, please": "Servis yok, lütfen",
+    "add one": "bir servis ekleyin",
+    "Notification Type": "Bildirim Yöntemi",
+    "Email": "E-mail",
+    "Test": "Test",
+    "Certificate Info": "Sertifika Bilgisi",
+    "Resolver Server": "Çözümleyici Sunucu",
+    "Resource Record Type": "Kaynak Kayıt Türü",
+    "Last Result": "En son sonuçlar",
+    "Create your admin account": "Yönetici hesabınızı oluşturun",
+    "Repeat Password": "Şifrenizi tekrar girin",
+    "Import Backup": "Yedeği içe aktar",
+    "Export Backup": "Yedeği dışa aktar",
+    "Export": "Dışa aktar",
+    "Import": "İçe aktar",
+    "respTime": "Cevap Süresi (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Varsayılan etkinleştirilmiş",
+    "Apply on all existing monitors": "Var olan bütün servislere uygula",
+    "Create": "Oluştur",
+    "Clear Data": "Verileri Temizle",
+    "Events": "Olaylar",
+    "Heartbeats": "Sağlık Durumları",
+    "Auto Get": "Otomatik Al",
+    "backupDescription": "Bütün servisleri ve bildirimleri JSON dosyasına yedekleyebilirsiniz.",
+    "backupDescription2": "Not: Geçmiş ve etkinlik verileri içinde değildir.",
+    "backupDescription3": "Dışa aktarma dosyasında bildirim tokeni gibi hassas veriler bulunur, dikkatli bir şekilde saklayınız.",
+    "alertNoFile": "İçeri aktarmak için bir dosya seçiniz.",
+    "alertWrongFileType": "Lütfen bir JSON dosyası seçiniz.",
+    "Clear all statistics": "Bütün istatistikleri temizle",
+    "Skip existing": "Var olanı atla",
+    "Overwrite": "Üzerine yaz",
+    "Options": "Seçenekler",
+    "Keep both": "İkisini sakla",
+    "Verify Token": "Tokeni doğrula",
+    "Setup 2FA": "2FA Kur",
+    "Enable 2FA": "2FA Etkinleştir",
+    "Disable 2FA": "2FA Devre dışı bırak",
+    "2FA Settings": "2FA Ayarları",
+    "Two Factor Authentication": "İki Faktörlü Kimlik Doğrulama (2FA)",
+    "Active": "Aktif",
+    "Inactive": "İnaktif",
+    "Token": "Token",
+    "Show URI": "URI'yi göster",
+    "Tags": "Etiketler",
+    "Add New below or Select...": "Aşağıya Yeni Ekle veya Seç...",
+    "Tag with this name already exist.": "Bu ada sahip etiket zaten var.",
+    "Tag with this value already exist.": "Bu değere sahip etiket zaten var.",
+    "color": "renk",
+    "value (optional)": "değer (isteğe bağlı)",
+    "Gray": "Gri",
+    "Red": "Kırmızı",
+    "Orange": "Turuncu",
+    "Green": "Yeşil",
+    "Blue": "Mavi",
+    "Indigo": "Çivit mavisi",
+    "Purple": "Mor",
+    "Pink": "Pembe",
+    "Search...": "Ara...",
+    "Avg. Ping": "Ortalama Ping",
+    "Avg. Response": "Ortalama Cevap Süresi",
+    "Entry Page": "Giriş Sayfası",
+    "statusPageNothing": "Burada hiçbir şey yok, lütfen bir grup veya servis ekleyin.",
+    "No Services": "Hizmet Yok",
+    "All Systems Operational": "Tüm Sistemler Operasyonel",
+    "Partially Degraded Service": "Kısmen Bozulmuş Hizmet",
+    "Degraded Service": "Bozulmuş Hizmet",
+    "Add Group": "Grup Ekle",
+    "Add a monitor": "Servis Ekle",
+    "Edit Status Page": "Durum Sayfasını Düzenle",
+    "Go to Dashboard": "Panele Git",
+    "Status Page": "Durum Sayfası",
+    "Status Pages": "Durum Sayfaları",
+    "defaultNotificationName": "My {notification} Alert ({number})",
+    "here": "burada",
+    "Required": "Gerekli",
+    "telegram": "Telegram",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "{0} adresinden bir token alabilirsiniz.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Doğrudan Sohbet / Grup / Kanalın Sohbet Kimliğini Destekleyin",
+    "wayToGetTelegramChatID": "Bot'a bir mesaj göndererek ve chat_id'yi görüntülemek için bu URL'ye giderek sohbet kimliğinizi alabilirsiniz:",
+    "YOUR BOT TOKEN HERE": "BOT TOKENİNİZ BURADA",
+    "chatIDNotFound": "Chat ID bulunamadı; lütfen önce bu bota bir mesaj gönderin",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0}, Express.js gibi tüm modern HTTP sunucuları için iyidir",
+    "webhookFormDataDesc": "{multipart} PHP için iyidir. JSON'un {decodeFunction} ile ayrıştırılması gerekecek",
+    "smtp": "E-mail (SMTP)",
+    "secureOptionNone": "Hiçbiri / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "TLS Hatasını Yoksay",
+    "From Email": "E-postadan",
+    "emailCustomSubject": "Özel Konu",
+    "To Email": "E-postaya",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhook Oluştur'a giderek alabilirsiniz.",
+    "Bot Display Name": "Botun Görünecek Adı",
+    "Prefix Custom Message": "Önek Özel Mesaj",
+    "Hello @everyone is...": "Merhaba {'@'}everyone ...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
+    "signal": "Sinyal",
+    "Number": "Numara",
+    "Recipients": "Alıcılar",
+    "needSignalAPI": "REST API ile bir signal istemciniz olması gerekiyor.",
+    "wayToCheckSignalURL": "Nasıl kurulacağını görmek için bu URL'yi kontrol edebilirsiniz:",
+    "signalImportant": "ÖNEMLİ: Alıcılarda grupları ve sayıları karıştıramazsınız!",
+    "gotify": "Gotify",
+    "Application Token": "Uygulama Tokeni",
+    "Server URL": "Sunucu URL",
+    "Priority": "Öncelik",
+    "slack": "Slack",
+    "Icon Emoji": "İkon Emoji",
+    "Channel Name": "Kanal Adı",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Webhook hakkında daha fazla bilgi: {0}",
+    "aboutChannelName": "Webhook kanalını atlamak istiyorsanız, {0} Kanal Adı alanına kanal adını girin. Ör: #diğer-kanal",
+    "aboutKumaURL": "Uptime Kuma URL alanını boş bırakırsanız, varsayılan olarak Project GitHub sayfası olur.",
+    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (50'den fazla Bildirim hizmetini destekler)",
+    "GoogleChat": "Google Chat (sadece Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Kullancı Anahtarı",
+    "Device": "Cihaz",
+    "Message Title": "Mesaj Başlığı",
+    "Notification Sound": "Bilgilendirme sesi",
+    "More info on:": "Daha fazla bilgi: {0}",
+    "pushoverDesc1": "Acil durum önceliği (2), yeniden denemeler arasında varsayılan olarak 30 saniyelik bir zaman aşımına sahiptir ve 1 saat sonra sona erecektir.",
+    "pushoverDesc2": "Farklı cihazlara bildirim göndermek istiyorsanız Cihaz alanını doldurunuz.",
+    "SMS Type": "SMS Tipi",
+    "octopushTypePremium": "Premium (Hızlı - uyarı için önerilir)",
+    "octopushTypeLowCost": "Düşük Maliyet (Yavaş - bazen operatör tarafından engellenir)",
+    "checkPrice": "{0} fiyatlarını kontrol edin:",
+    "apiCredentials": "API kimlik bilgileri",
+    "octopushLegacyHint": "Octopush'un (2011-2020) eski sürümünü mü yoksa yeni sürümünü mü kullanıyorsunuz?",
+    "Check octopush prices": "Octopush fiyatlarını kontrol edin {0}.",
+    "octopushPhoneNumber": "Telefon numarası (uluslararası biçim, örneğin: +33612345678) ",
+    "octopushSMSSender": "SMS Gönderici Adı : 3-11 alfanümerik karakter ve boşluk (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Cihaz ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Örnek: {0}",
+    "Read more:": "Daha fazla oku: {0}",
+    "Status:": "Durum: {0}",
+    "Read more": "Daha fazla oku",
+    "appriseInstalled": "Apprise yüklendi.",
+    "appriseNotInstalled": "Appris yüklü değil. {0}",
+    "Access Token": "Erişim Tokeni",
+    "Channel access token": "Kanal erişim tokeni",
+    "Line Developers Console": "Line Geliştirici Konsolu",
+    "lineDevConsoleTo": "Line Geliştirici Konsolu - {0}",
+    "Basic Settings": "Temel Ayarlar",
+    "User ID": "Kullanıcı ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Önce {0}'e erişin, bir sağlayıcı ve kanal (Messaging API) oluşturun, ardından yukarıda belirtilen menü öğelerinden kanal erişim tokenini ve kullanıcı id alabilirsiniz.",
+    "Icon URL": "Simge URL",
+    "aboutIconURL": "Varsayılan profil resmini geçersiz kılmak için \"Simge URL\" bölümünde bir resme bağlantı sağlayabilirsiniz. Simge Emojisi ayarlanmışsa kullanılmayacaktır.",
+    "aboutMattermostChannelName": "Kanal adını \"Kanal Adı\" alanına girerek Webhook'un gönderi yaptığı varsayılan kanalı geçersiz kılabilirsiniz. Bunun Mattermost Webhook ayarlarında etkinleştirilmesi gerekir. Ör: #diğer-kanal",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - ucuz ama yavaş ve genellikle aşırı yüklü. Yalnızca Polonyalı alıcılarla sınırlıdır.",
+    "promosmsTypeFlash": "SMS FLASH - Mesaj, alıcı cihazda otomatik olarak gösterilecektir. Yalnızca Polonyalı alıcılarla sınırlıdır.",
+    "promosmsTypeFull": "SMS FULL - Premium SMS katmanı, Gönderici Adınızı kullanabilirsiniz (Önce adınızı kaydetmeniz gerekir). Uyarılar için güvenilir.",
+    "promosmsTypeSpeed": "SMS HIZI - Sistemde en yüksek öncelik. Çok hızlı ve güvenilir ancak maliyetli (SMS FULL fiyatının yaklaşık iki katı).",
+    "promosmsPhoneNumber": "Telefon numarası (Polonyalı alıcı için Alan kodlarını atlayabilirsiniz)",
+    "promosmsSMSSender": "SMS Gönderici Adı : Ön kayıtlı ad veya varsayılanlardan biri: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (http(s):// ve isteğe bağlı olarak bağlantı noktası ile)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "Internal Room ID'sini, Matrix istemcinizdeki oda ayarlarının gelişmiş bölümüne bakarak bulabilirsiniz. !QMdRCpUIfLwsfjxye6:home.server gibi görünmelidir.",
+    "matrixDesc2": "Hesabınıza ve katıldığınız tüm odalara tam erişime izin vereceğinden, yeni bir kullanıcı oluşturmanız ve kendi Matrix kullanıcınızın erişim belirtecini kullanmamanız şiddetle tavsiye edilir. Bunun yerine, yeni bir kullanıcı oluşturun ve onu yalnızca bildirimi almak istediğiniz odaya davet edin. {0} komutunu çalıştırarak erişim tokenini alabilirsiniz.",
+    "Method": "Yöntem",
+    "Body": "Gövde",
+    "Headers": "Başlıklar",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "İstek başlıkları geçerli JSON değil:",
+    "BodyInvalidFormat": "İstek gövdesi geçerli JSON değil:",
+    "Monitor History": "Servis Geçmişi",
+    "clearDataOlderThan": "{0} gün boyunca izleme geçmişi verilerini saklayın.",
+    "PasswordsDoNotMatch": "Parolalar uyuşmuyor.",
+    "records": "kayıtlar",
+    "One record": "Bir Kayıt",
+    "steamApiKeyDescription": "Bir Steam Oyun Sunucusunu izlemek için bir Steam Web-API anahtarına ihtiyacınız vardır. API anahtarınızı buradan kaydedebilirsiniz: ",
+    "Current User": "Şu anki kullanıcı",
+    "topic": "Başlık",
+    "topicExplanation": "İzlenecek MQTT servisi",
+    "successMessage": "Başarılı Mesaj",
+    "successMessageExplanation": "Başarılı olarak kabul edilecek MQTT mesajı",
+    "recent": "Son",
+    "Done": "Tamamlandı",
+    "Info": "Bilgi",
+    "Security": "Güvenlik",
+    "Steam API Key": "Steam API Anahtarı",
+    "Shrink Database": "Veritabanını Küçült",
+    "Pick a RR-Type...": "Bir RR-Tipi seçin...",
+    "Pick Accepted Status Codes...": "Kabul Edilen Durum Kodlarını Seçin...",
+    "Default": "Varsayılan",
+    "HTTP Options": "HTTP Ayarları",
+    "Create Incident": "Olay Oluştur",
+    "Title": "Başlık",
+    "Content": "İçerik",
+    "Style": "Stil",
+    "info": "info",
+    "warning": "warning",
+    "danger": "danger",
+    "error": "hata",
+    "critical": "kritik",
+    "primary": "primary",
+    "light": "light",
+    "dark": "dark",
+    "Post": "Post",
+    "Please input title and content": "Lütfen başlık ve içerik girin",
+    "Created": "Oluşturuldu",
+    "Last Updated": "Son Güncelleme",
+    "Unpin": "Unpin",
+    "Switch to Light Theme": "Açık Temaya Geç",
+    "Switch to Dark Theme": "Karanlık Temaya Geç",
+    "Show Tags": "Etiketleri Göster",
+    "Hide Tags": "Etiketleri Gizle",
+    "Description": "Açıklama",
+    "No monitors available.": "Kullanılabilir servis yok.",
+    "Add one": "Bir tane ekle",
+    "No Monitors": "Servis Yok",
+    "Untitled Group": "Adsız Grup",
+    "Services": "Hizmetler",
+    "Discard": "İptal Et",
+    "Cancel": "İptal Et",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "SQLite için veritabanı VACUUM'unu tetikleyin. Veritabanınız 1.10.0'dan sonra oluşturulduysa, AUTO_VACUUM zaten etkinleştirilmiştir ve bu eyleme gerek yoktur.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Kullanıcı Adı (webapi_ öneki dahil)",
+    "serwersmsAPIPassword": "API Şifre",
+    "serwersmsPhoneNumber": "Telefon numarası",
+    "serwersmsSenderName": "SMS Gönderici Adı (müşteri portalı üzerinden kayıtlı)",
+    "stackfield": "Stackfield",
+    "Customize": "Özelleştirme",
+    "Custom Footer": "Özel Altbilgi",
+    "Custom CSS": "Özel CSS",
+    "smtpDkimSettings": "DKIM Ayarları",
+    "smtpDkimDesc": "Kullanım için lütfen Nodemailer DKIM'e {0} bakın.",
+    "documentation": "belgeler",
+    "smtpDkimDomain": "Alan adı",
+    "smtpDkimKeySelector": "Anahtar Seçici",
+    "smtpDkimPrivateKey": "Özel anahtar",
+    "smtpDkimHashAlgo": "Hash Algoritması (Opsiyonel)",
+    "smtpDkimheaderFieldNames": "İmzalanacak Başlık Anahtarları (Opsiyonel)",
+    "smtpDkimskipFields": "İmzalamayacak Başlık Anahtarları (Opsiyonel)",
+    "wayToGetPagerDutyKey": "Bunu Hizmet -> Hizmet Dizini -> (Bir hizmet seçin) -> Entegrasyonlar -> Entegrasyon ekle'ye giderek alabilirsiniz. Burada \"Events API V2\" için arama yapabilirsiniz. Daha fazla bilgi {0}",
+    "Integration Key": "Entegrasyon Anahtarı",
+    "Integration URL": "Entegrasyon URL'si",
+    "Auto resolve or acknowledged": "Otomatik çözümleme veya onaylandı",
+    "do nothing": "hiçbir şey yapma",
+    "auto acknowledged": "otomatik onaylandı",
+    "auto resolve": "otomatik çözümleme",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Uyarı Durumu",
+    "alertaRecoverState": "Kurtarma Durumu",
+    "deleteStatusPageMsg": "Bu durum sayfasını silmek istediğinizden emin misiniz?",
+    "Proxies": "Proxy'ler",
+    "default": "Varsayılan",
+    "enabled": "Etkinleştirilmiş",
+    "setAsDefault": "Varsayılan Olarak Ayarla",
+    "deleteProxyMsg": "Bu proxy'yi tüm servisler için silmek istediğinizden emin misiniz?",
+    "proxyDescription": "Proxy'lerin çalışması için bir servise atanması gerekir.",
+    "enableProxyDescription": "Bu proxy, etkinleştirilene kadar izleme isteklerini etkilemeyecektir. Aktivasyon durumuna göre proxy'yi tüm servislerden geçici olarak devre dışı bırakabilirsiniz.",
+    "setAsDefaultProxyDescription": "Bu proxy, yeni servisler için varsayılan olarak etkinleştirilecektir. Yine de proxy'yi her servis için ayrı ayrı devre dışı bırakabilirsiniz.",
+    "Certificate Chain": "Sertifika Zinciri",
+    "Valid": "Geçerli",
+    "Invalid": "Geçersiz",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir:",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
+    "Device Token": "Cihaz Tokeni",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Retry",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Proxy kur",
+    "Proxy Protocol": "Proxy Protokolü",
+    "Proxy Server": "Proxy Sunucusu",
+    "Proxy server has authentication": "Proxy sunucusunun kimlik doğrulaması var",
+    "User": "Kullanıcı",
+    "Installed": "Yüklenmiş",
+    "Not installed": "Yüklü değil",
+    "Running": "Çalışıyor",
+    "Not running": "Çalışmıyor",
+    "Remove Token": "Tokeni Kaldır",
+    "Start": "Başlat",
+    "Stop": "Durdur",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Yeni Durum Sayfası Ekle",
+    "Slug": "Slug",
+    "Accept characters:": "Kabul edilen karakterler:",
+    "startOrEndWithOnly": "Yalnızca {0} ile başlayın veya bitirin",
+    "No consecutive dashes": "Ardışık tire yok",
+    "Next": "Sonraki",
+    "The slug is already taken. Please choose another slug.": "Slug zaten alındı. Lütfen başka bir slug seçin.",
+    "No Proxy": "Proxy Yok",
+    "Authentication": "Kimlik doğrulama",
+    "HTTP Basic Auth": "HTTP Temel Yetkilendirme",
+    "New Status Page": "Yeni Durum Sayfası",
+    "Page Not Found": "Sayfa bulunamadı",
+    "Reverse Proxy": "Ters Proxy",
+    "Backup": "Yedek",
+    "About": "Hakkında",
+    "wayToGetCloudflaredURL": "(Cloudflared'i {0} adresinden indirin)",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Mesaj:",
+    "Don't know how to get the token? Please read the guide:": "Tokeni nasıl alacağınızı bilmiyor musunuz? Lütfen kılavuzu okuyun:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Halihazırda Cloudflare Tüneli üzerinden bağlanıyorsanız mevcut bağlantı kesilebilir. Durdurmak istediğinden emin misin? Onaylamak için mevcut şifrenizi yazın.",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Trust Proxy",
+    "Other Software": "Diğer Yazılımlar",
+    "For example: nginx, Apache and Traefik.": "Örneğin: nginx, Apache ve Traefik.",
+    "Please read": "Lütfen oku",
+    "Subject:": "Başlık:",
+    "Valid To:": "Geçerlilik:",
+    "Days Remaining:": "Kalan günler:",
+    "Issuer:": "Veren:",
+    "Fingerprint:": "Parmak izi:",
+    "No status pages": "Durum sayfası yok",
+    "Domain Name Expiry Notification": "Alan Adı Sona Erme Bildirimi",
+    "Proxy": "Proxy",
+    "Date Created": "Tarih Oluşturuldu",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Adresi",
+    "onebotMessageType": "OneBot Mesaj Türü",
+    "onebotGroupMessage": "Grup",
+    "onebotPrivateMessage": "Özel",
+    "onebotUserOrGroupId": "Grup/Kullanıcı Kimliği",
+    "onebotSafetyTips": "Güvenlik için erişim tokeni ayarlamalısınız",
+    "PushDeer Key": "PushDeer Anahtarı",
+    "Footer Text": "Altbilgi metni",
+    "Show Powered By": "\"Powered by\" kısmını göster",
+    "Domain Names": "Alan isimleri",
+    "signedInDisp": "{0} olarak oturum açıldı",
+    "signedInDispDisabled": "Yetkilendirme Devre Dışı.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "İstemci ve sunucu arasında paylaşılan gizli anahtar",
+    "RadiusCalledStationId": "Aranan İstasyon Kimliği",
+    "RadiusCalledStationIdDescription": "Aranan cihazın tanımlayıcısı",
+    "RadiusCallingStationId": "Arayan İstasyon Kimliği",
+    "RadiusCallingStationIdDescription": "Arayan cihazın tanımlayıcısı",
+    "Certificate Expiry Notification": "Sertifika Sona Erme Bildirimi",
+    "API Username": "API Kullanıc Adı",
+    "API Key": "API Anahtarı",
+    "Recipient Number": "Alıcı Numarası",
+    "From Name/Number": "İsimden/Numaradan",
+    "Leave blank to use a shared sender number.": "Paylaşılan bir gönderen numarası kullanmak için boş bırakın.",
+    "Octopush API Version": "Octopush API Sürümü",
+    "Legacy Octopush-DM": "Eski Octopush-DM",
+    "endpoint": "uç nokta",
+    "octopushAPIKey": "Kontrol panelindeki HTTP API kimlik bilgilerinden \"API Key\"",
+    "octopushLogin": "Kontrol panelindeki HTTP API kimlik bilgilerinden \"Login\"",
+    "promosmsLogin": "API Oturum Açma Adı",
+    "promosmsPassword": "API Şifresi",
+    "pushoversounds pushover": "Pushover (varsayılan)",
+    "pushoversounds bike": "Bisiklet",
+    "pushoversounds bugle": "Boru",
+    "pushoversounds cashregister": "Yazar kasa",
+    "pushoversounds classical": "Klasik",
+    "pushoversounds cosmic": "Kozmik",
+    "pushoversounds falling": "Düşme",
+    "pushoversounds gamelan": "Oyun Alanı",
+    "pushoversounds incoming": "Gelen",
+    "pushoversounds intermission": "Ara",
+    "pushoversounds magic": "Büyü",
+    "pushoversounds mechanical": "Mekanik",
+    "pushoversounds pianobar": "Piano",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Uzay Alarmı",
+    "pushoversounds tugboat": "Römorkör",
+    "pushoversounds alien": "Uzaylı Alarmı (uzun)",
+    "pushoversounds climb": "Tırmanış (uzun)",
+    "pushoversounds persistent": "Sürekli (uzun)",
+    "pushoversounds echo": "Pushover Yankı (uzun)",
+    "pushoversounds updown": "Yukarı Aşağı (uzun)",
+    "pushoversounds vibrate": "Sadece titreşim",
+    "pushoversounds none": "Yok (sessiz)",
+    "pushyAPIKey": "Gizli API Anahtarı",
+    "pushyToken": "Cihaz tokeni",
+    "Show update if available": "Varsa güncellemeyi göster",
+    "Also check beta release": "Ayrıca beta sürümünü kontrol edin",
+    "Using a Reverse Proxy?": "Ters Proxy mi Kullanıyorsunuz?",
+    "Check how to config it for WebSocket": "WebSocket için nasıl yapılandırılacağını kontrol edin",
+    "Steam Game Server": "Steam Oyun Sunucusu",
+    "Most likely causes:": "En olası nedenler:",
+    "The resource is no longer available.": "Kaynak artık mevcut değil.",
+    "There might be a typing error in the address.": "Adreste bir yazım hatası olabilir.",
+    "What you can try:": "Ne deneyebilirsin:",
+    "Retype the address.": "Adresi tekrar yazın.",
+    "Go back to the previous page.": "Bir önceki sayfaya geri git.",
+    "Coming Soon": "Yakında gelecek",
+    "wayToGetClickSendSMSToken": "API Kullanıcı Adı ve API Anahtarını {0} adresinden alabilirsiniz.",
+    "Connection String": "Bağlantı dizisi",
+    "Query": "Sorgu",
+    "settingsCertificateExpiry": "TLS Sertifikasının Geçerlilik Süresi",
+    "certificationExpiryDescription": "HTTPS Monitörleri, TLS sertifikasının süresi dolduğunda bildirimi tetikler:",
+    "Setup Docker Host": "Docker Ana Bilgisayarını Kur",
+    "Connection Type": "Bağlantı türü",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Bu docker ana bilgisayarını tüm monitörler için silmek istediğinizden emin misiniz?",
+    "socket": "Soket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Konteyner",
+    "Container Name / ID": "Konteyner Adı / Kimliği",
+    "Docker Host": "Docker Ana Bilgisayarı",
+    "Docker Hosts": "Docker Ana Bilgisayarları",
+    "ntfy Topic": "ntfy Konu",
+    "Domain": "Domain",
+    "Workstation": "İş İstasyonu",
+    "disableCloudflaredNoAuthMsg": "Yetki yok modundasınız, şifre gerekli değil.",
+    "trustProxyDescription": "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.",
+    "wayToGetLineNotifyToken": "{0} adresinden bir erişim jetonu alabilirsiniz.",
+    "Examples": "Örnekler",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "Long-Lived Erişim Anahtarı",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Erişim Anahtarı, profil adınıza (sol altta) tıklayarak ve aşağıya kaydırarak ve ardından Anahtar Oluştur'a tıklayarak oluşturulabilir. ",
+    "Notification Service": "Bildirim Hizmeti",
+    "default: notify all devices": "varsayılan: tüm cihazları bilgilendir",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Cihazınızın/telefonunuzun adını bulmak için Home Assistant'ta \"Geliştirici Araçları > Hizmetler\" \"bildirim\" araması altında bir Bildirim Hizmetleri listesi bulunabilir.",
+    "Automations can optionally be triggered in Home Assistant:": "Otomasyonlar isteğe bağlı olarak Home Assistant'ta tetiklenebilir:",
+    "Trigger type:": "Trigger tipi:",
+    "Event type:": "Etkinlik tipi:",
+    "Event data:": "Etkinlik verileri:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ardından bir eylem seçin, örneğin RGB ışığının kırmızı olduğu sahneyi değiştirin.",
+    "Frontend Version": "Frontend Sürümü",
+    "Frontend Version do not match backend version!": "Frontend Sürümü, backend sürümüyle eşleşmiyor!",
+    "Base URL": "Temel URL",
+    "goAlertInfo": "GoAlert, çağrı üzerine zamanlama, otomatik eskalasyonlar ve bildirimler (SMS veya sesli çağrılar gibi) için açık kaynaklı bir uygulamadır. Doğru kişiyi, doğru şekilde ve doğru zamanda otomatik olarak devreye sokun! {0}",
+    "goAlertIntegrationKeyInfo": "Servis için genel API entegrasyon anahtarını, genellikle kopyalanan URL'nin belirteç parametresinin değeri olan \"aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biçiminde alın.",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "Kullanımdan Kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan, tam bir yedekleme oluşturamaz veya geri yükleyemez.",
+    "backupRecommend": "Lütfen bunun yerine birimi veya veri klasörünü (./data/) doğrudan yedekleyin.",
+    "enableGRPCTls": "TLS bağlantısıyla gRPC isteği göndermeye izin ver",
+    "grpcMethodDescription": "Yöntem adı, sayHello, check, vb. gibi cammelCase biçimine dönüştürülür.",
+    "Maintenance": "Bakım",
+    "statusMaintenance": "Bakım",
+    "Schedule maintenance": "Bakım Planla",
+    "Affected Monitors": "Etkilenen Monitörler",
+    "Pick Affected Monitors...": "Etkilenen Monitörleri Seçin...",
+    "Start of maintenance": "Bakım başlangıcı",
+    "All Status Pages": "Tüm Durum Sayfaları",
+    "Select status pages...": "Durum sayfalarını seçin...",
+    "recurringIntervalMessage": "Her gün bir kez çalıştırın | {0} günde bir çalıştırın",
+    "affectedMonitorsDescription": "Geçerli bakımdan etkilenen monitörleri seçin",
+    "affectedStatusPages": "Bu bakım mesajını seçili durum sayfalarında göster",
+    "atLeastOneMonitor": "Etkilenen en az bir monitör seçin",
+    "deleteMaintenanceMsg": "Bu bakımı silmek istediğinizden emin misiniz?",
+    "ZohoCliq": "ZohoCliq",
+    "webhookAdditionalHeadersTitle": "Ek Başlıklar",
+    "webhookAdditionalHeadersDesc": "Webhook ile gönderilen ek başlıkları ayarlar.",
+    "wayToGetZohoCliqURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Uygulama oluşturun ve {0} adresinde bot tokenı alın",
+    "wayToGetKookGuildID": "Kook ayarında \"Geliştirici Modu\"nu açın ve kimliğini almak için guild'e sağ tıklayın",
+    "Guild ID": "Guild ID",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Telefon numara(ları)",
+    "smseagleGroup": "Telefon defteri grubu ad(lar)ı",
+    "smseagleContact": "Telefon rehberi kişi ad(lar)ı",
+    "smseagleRecipientType": "Alıcı Türü",
+    "smseagleRecipient": "Alıcı(lar) (birden çok olanlar virgülle ayrılmalıdır)",
+    "smseagleToken": "API Erişim Tokenı",
+    "smseagleUrl": "SMSEagle cihaz URL\"niz",
+    "smseagleEncoding": "Unicode olarak gönder",
+    "smseaglePriority": "Mesaj önceliği (0-9, varsayılan = 0)",
+    "Optional": "İsteğe bağlı",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Dökümanları ",
+    "Gateway Type": "Ağ Geçidi Türü",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Sayıları aşağıdakilerle bölebilirsiniz",
+    "or": "veya",
+    "recurringInterval": "Sıklık",
+    "Recurring": "Yineleme",
+    "strategyManual": "Manuel olarak Aktif/Pasif",
+    "warningTimezone": "Sunucunun kullandığı saat dilimi",
+    "weekdayShortMon": "Pzt",
+    "weekdayShortTue": "Sal",
+    "weekdayShortWed": "Çar",
+    "weekdayShortThu": "Per",
+    "weekdayShortFri": "Cum",
+    "weekdayShortSat": "Cmt",
+    "weekdayShortSun": "Paz",
+    "dayOfWeek": "Haftanın Günleri",
+    "dayOfMonth": "Ayın Günleri",
+    "lastDay": "Son Gün",
+    "lastDay1": "Ayın Son Günü",
+    "lastDay2": "Ayın 2. Son Günü",
+    "lastDay3": "Ayın 3. Son Günü",
+    "lastDay4": "Ayın 4. Son Günü",
+    "No Maintenance": "Bakım Yok",
+    "pauseMaintenanceMsg": "Duraklatmak istediğinizden emin misiniz?",
+    "maintenanceStatus-under-maintenance": "Bakımda",
+    "maintenanceStatus-inactive": "Etkin Değil",
+    "maintenanceStatus-scheduled": "Planlanmış",
+    "maintenanceStatus-ended": "Bitti",
+    "maintenanceStatus-unknown": "Bilinmiyor",
+    "Display Timezone": "Saat dilimini göster",
+    "Server Timezone": "Sunucu Saat Dilimi",
+    "statusPageMaintenanceEndDate": "Bitiş Zamanı",
+    "IconUrl": "Icon URL",
+    "Enable DNS Cache": "DNS Önbelleğini Etkinleştir",
+    "Enable": "Etkin",
+    "Disable": "Devre Dışı",
+    "dnsCacheDescription": "Bazı IPv6 ortamlarında çalışmıyor olabilir, herhangi bir sorunla karşılaşırsanız devre dışı bırakın.",
+    "Single Maintenance Window": "Tek Seferlik Bakım",
+    "Maintenance Time Window of a Day": "Bür Günlük Bakım",
+    "Effective Date Range": "Bakim Tarih Aralığı",
+    "Schedule Maintenance": "Bakım Planla",
+    "Date and Time": "Tarih ve Saat",
+    "DateTime Range": "Tarih ve Saat Aralığı",
+    "Strategy": "Strateji",
+    "Free Mobile User Identifier": "Ücretsiz Mobil Kullanıcı ID",
+    "Free Mobile API Key": "Ücretsiz Mobil API Anahtarı",
+    "Enable TLS": "TLS'yi Etkinleştir",
+    "Proto Service Name": "Proto Service İsmi",
+    "Proto Method": "Proto Method",
+    "Proto Content": "Proto İçeriği",
+    "Economy": "Ekonomik",
+    "Lowcost": "Düşük maliyetli",
+    "high": "Yüksek",
+    "General Monitor Type": "Genel Monitör Tipi",
+    "Passive Monitor Type": "Pasif Monitör Tipi",
+    "Specific Monitor Type": "Özel Monitör Tipi"
+}
diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
new file mode 100644
index 00000000..fcd678a3
--- /dev/null
+++ b/src/lang/uk-UA.json
@@ -0,0 +1,530 @@
+{
+    "languageName": "Українська",
+    "checkEverySecond": "Перевірка кожні {0} секунд",
+    "retriesDescription": "Максимальна кількість спроб перед позначенням сервісу як недоступного та надсиланням повідомлення",
+    "ignoreTLSError": "Ігнорувати помилку TLS/SSL для сайтів HTTPS",
+    "upsideDownModeDescription": "Реверс статусу сервісу. Якщо сервіс доступний, він позначається як НЕДОСТУПНИЙ.",
+    "maxRedirectDescription": "Максимальна кількість перенаправлень. Поставте 0, щоб вимкнути перенаправлення.",
+    "acceptedStatusCodesDescription": "Виберіть коди статусів для визначення доступності сервісу.",
+    "passwordNotMatchMsg": "Повторення паролю не збігається.",
+    "notificationDescription": "Прив'яжіть сповіщення до моніторів.",
+    "keywordDescription": "Пошук слова в чистому HTML або JSON-відповіді (чутливо до регістру)",
+    "pauseDashboardHome": "Пауза",
+    "deleteMonitorMsg": "Ви дійсно хочете видалити цей монітор?",
+    "deleteNotificationMsg": "Ви дійсно хочете видалити це сповіщення для всіх моніторів?",
+    "resolverserverDescription": "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.": "Сертифікат спливає",
+    "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": "Увімкнути авторизацію",
+    "disableauth.message1": "Ви впевнені, що бажаєте <strong>вимкнути авторизацію</strong>?",
+    "disableauth.message2": "Це підходить для <strong>тих, у кого встановлена інша авторизація</strong> пееред відкриттям Uptime Kuma, наприклад Cloudflare Access.",
+    "Please use this option carefully!": "Будь ласка, використовуйте з обережністю.",
+    "Logout": "Вийти",
+    "Leave": "Відміна",
+    "I understand, please disable": "Я розумію, все одно відключити",
+    "Confirm": "Підтвердити",
+    "Yes": "Так",
+    "No": "Ні",
+    "Username": "Логін",
+    "Password": "Пароль",
+    "Remember me": "Запам'ятати мене",
+    "Login": "Вхід до системи",
+    "No Monitors, please": "Моніторів немає, будь ласка",
+    "No Monitors": "Монітори відсутні",
+    "add one": "створіть новий",
+    "Notification Type": "Тип сповіщення",
+    "Email": "Пошта",
+    "Test": "Перевірка",
+    "Certificate Info": "Інформація про сертифікат",
+    "Resolver Server": "DNS сервер",
+    "Resource Record Type": "Тип ресурсного запису",
+    "Last Result": "Останній результат",
+    "Create your admin account": "Створіть обліковий запис адміністратора",
+    "Repeat Password": "Повторіть пароль",
+    "respTime": "Час відповіді (мс)",
+    "notAvailableShort": "Н/д",
+    "Create": "Створити",
+    "clearEventsMsg": "Ви дійсно хочете видалити всю статистику подій цього монітора?",
+    "clearHeartbeatsMsg": "Ви дійсно хочете видалити всю статистику опитувань цього монітора?",
+    "confirmClearStatisticsMsg": "Ви дійсно хочете видалити ВСЮ статистику?",
+    "Clear Data": "Видалити статистику",
+    "Events": "Події",
+    "Heartbeats": "Опитування",
+    "Auto Get": "Авто-отримання",
+    "enableDefaultNotificationDescription": "Для кожного нового монітора це сповіщення буде включено за замовчуванням. Ви все ще можете відключити сповіщення в кожному моніторі окремо.",
+    "Default enabled": "Використовувати за промовчанням",
+    "Also apply to existing monitors": "Застосувати до існуючих моніторів",
+    "Export": "Експорт",
+    "Import": "Імпорт",
+    "backupDescription": "Ви можете зберегти резервну копію всіх моніторів та повідомлень у вигляді JSON-файлу",
+    "backupDescription2": "P.S.: Історія та події збережені не будуть",
+    "backupDescription3": "Важливі дані, такі як токени повідомлень, додаються під час експорту, тому зберігайте файли в безпечному місці",
+    "alertNoFile": "Виберіть файл для імпорту.",
+    "alertWrongFileType": "Виберіть JSON-файл.",
+    "twoFAVerifyLabel": "Будь ласка, введіть свій токен, щоб перевірити роботу 2FA",
+    "tokenValidSettingsMsg": "Токен дійсний! Тепер ви можете зберегти налаштування 2FA.",
+    "confirmEnableTwoFAMsg": "Ви дійсно хочете увімкнути 2FA?",
+    "confirmDisableTwoFAMsg": "Ви дійсно хочете вимкнути 2FA?",
+    "Apply on all existing monitors": "Застосувати до всіх існуючих моніторів",
+    "Verify Token": "Перевірити токен",
+    "Setup 2FA": "Налаштування 2FA",
+    "Enable 2FA": "Увімкнути 2FA",
+    "Disable 2FA": "Вимкнути 2FA",
+    "2FA Settings": "Налаштування 2FA",
+    "Two Factor Authentication": "Двофакторна аутентифікація",
+    "Active": "Активно",
+    "Inactive": "Неактивно",
+    "Token": "Токен",
+    "Show URI": "Показати URI",
+    "Clear all statistics": "Очистити статистику",
+    "retryCheckEverySecond": "Повтор кожні {0} секунд",
+    "importHandleDescription": "Виберіть \"Пропустити існуючі\", якщо ви хочете пропустити кожен монітор або повідомлення з таким же ім'ям. \"Перезаписати\" видалить кожен існуючий монітор або повідомлення та додасть заново. Варіант \"Не перевіряти\" примусово відновлює всі монітори і повідомлення, навіть якщо вони вже існують.",
+    "confirmImportMsg": "Ви дійсно хочете відновити резервну копію? Переконайтеся, що ви вибрали відповідний варіант імпорту.",
+    "Heartbeat Retry Interval": "Інтервал повтору опитування",
+    "Import Backup": "Імпорт",
+    "Export Backup": "Експорт",
+    "Skip existing": "Пропустити існуючі",
+    "Overwrite": "Перезаписати",
+    "Options": "Опції",
+    "Keep both": "Не перевіряти",
+    "Tags": "Теги",
+    "Add New below or Select...": "Додати новий або вибрати...",
+    "Tag with this name already exist.": "Такий тег вже існує.",
+    "Tag with this value already exist.": "Тег із таким значенням вже існує.",
+    "color": "колір",
+    "value (optional)": "значення (опціонально)",
+    "Gray": "Сірий",
+    "Red": "Червоний",
+    "Orange": "Помаранчевий",
+    "Green": "Зелений",
+    "Blue": "Синій",
+    "Indigo": "Індиго",
+    "Purple": "Пурпурний",
+    "Pink": "Рожевий",
+    "Search...": "Пошук...",
+    "Avg. Ping": "Середній пінг",
+    "Avg. Response": "Середній час відповіді",
+    "Entry Page": "Головна сторінка",
+    "statusPageNothing": "Тут порожньо. Додайте групу або монітор.",
+    "No Services": "Немає сервісів",
+    "All Systems Operational": "Всі системи працюють у штатному режимі",
+    "Partially Degraded Service": "Сервіси працюють частково",
+    "Degraded Service": "Всі сервіси не працюють",
+    "Add Group": "Додати групу",
+    "Add a monitor": "Додати монітор",
+    "Edit Status Page": "Редагувати",
+    "Go to Dashboard": "Панель управління",
+    "Status Page": "Сторінка статусу",
+    "Status Pages": "Сторінки статусу",
+    "Discard": "Скасування",
+    "Create Incident": "Створити інцидент",
+    "Switch to Dark Theme": "Темна тема",
+    "Switch to Light Theme": "Світла тема",
+    "telegram": "Telegram",
+    "webhook": "Вебхук",
+    "smtp": "Email (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Підтримка 50+ сервісів повідомлень)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "Primary Base URL": "Основна URL",
+    "Push URL": "URL пуша",
+    "needPushEvery": "До цієї URL необхідно звертатися кожні {0} секунд",
+    "pushOptionalParams": "Опціональні параметри: {0}",
+    "defaultNotificationName": "Моє сповіщення {notification} ({number})",
+    "here": "тут",
+    "Required": "Потрібно",
+    "Bot Token": "Токен бота",
+    "wayToGetTelegramToken": "Ви можете взяти токен тут - {0}.",
+    "Chat ID": "ID чату",
+    "supportTelegramChatID": "Підтримуються ID чатів, груп та каналів",
+    "wayToGetTelegramChatID": "Ви можете взяти ID вашого чату, відправивши повідомлення боту і перейшовши по цьому URL для перегляду chat_id:",
+    "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ТУТ",
+    "chatIDNotFound": "ID чату не знайдено; будь ласка, відправте спочатку повідомлення боту",
+    "Post URL": "Post URL",
+    "Content Type": "Тип контенту",
+    "webhookJsonDesc": "{0} підходить для будь-яких сучасних HTTP-серверів, наприклад Express.js",
+    "webhookFormDataDesc": "{multipart} підходить для PHP. JSON-вивід необхідно буде обробити за допомогою {decodeFunction}",
+    "secureOptionNone": "Ні / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ігнорувати помилки TLS",
+    "From Email": "Від кого",
+    "emailCustomSubject": "Своя тема",
+    "To Email": "Кому",
+    "smtpCC": "Копія",
+    "smtpBCC": "Прихована копія",
+    "Discord Webhook URL": "Discord Вебхук URL",
+    "wayToGetDiscordURL": "Ви можете створити його в Параметрах сервера -> Інтеграції -> Створити вебхук",
+    "Bot Display Name": "Ім'я бота, що відображається",
+    "Prefix Custom Message": "Свій префікс повідомлення",
+    "Hello @everyone is...": "Привіт {'@'}everyone це...",
+    "Webhook URL": "URL вебхука",
+    "wayToGetTeamsURL": "Як створити URL вебхука ви можете дізнатися тут - {0}.",
+    "Номер": "Номер",
+    "Recipients": "Одержувачі",
+    "needSignalAPI": "Вам необхідний клієнт Signal із підтримкою REST API.",
+    "wayToCheckSignalURL": "Пройдіть по цьому URL, щоб дізнатися як налаштувати такий клієнт:",
+    "signalImportant": "ВАЖЛИВО: Не можна змішувати в Одержувачах групи та номери!",
+    "Application Token": "Токен програми",
+    "Server URL": "URL сервера",
+    "Priority": "Пріоритет",
+    "Icon Emoji": "Іконка Emoji",
+    "Channel Name": "Ім'я каналу",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Більше інформації про вебхуки: {0}",
+    "aboutChannelName": "Введіть ім'я каналу в поле {0} Ім'я каналу, якщо ви хочете обійти канал вебхука. Наприклад: #other-channel",
+    "aboutKumaURL": "Якщо поле Uptime Kuma URL в налаштуваннях залишиться порожнім, за замовчуванням буде використовуватися посилання на проект на GitHub.",
+    "emojiCheatSheet": "Шпаргалка по Emoji: {0}",
+    "User Key": "Ключ користувача",
+    "Device": "Пристрій",
+    "Message Title": "Заголовок повідомлення",
+    "Notification Sound": "Звук сповіщення",
+    "More info on:": "Більше інформації: {0}",
+    "pushoverDesc1": "Екстренний пріоритет (2) має таймуут повтору за замовчуванням 30 секунд і закінчується через 1 годину.",
+    "pushoverDesc2": "Якщо ви бажаєте надсилати повідомлення різним пристроям, необхідно заповнити поле Пристрій.",
+    "SMS Type": "Тип SMS",
+    "octopushTypePremium": "Преміум (Швидкий - рекомендується для алертів)",
+    "octopushTypeLowCost": "Дешевий (Повільний - іноді блокується операторами)",
+    "checkPrice": "Тарифи {0}:",
+    "octopushLegacyHint": "Ви використовуєте стару версію Octopush (2011-2020) або нову?",
+    "Check octopush prices": "Тарифи Octopush {0}.",
+    "octopushPhoneNumber": "Номер телефону (між. формат, наприклад: +380123456789)",
+    "octopushSMSSender": "Ім'я відправника SMS: 3-11 символів алвафіту, цифр та пробілів (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID пристрою LunaSea",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Приклад: {0}",
+    "Read more:": "Докладніше: {0}",
+    "Status:": "Статус: {0}",
+    "Read more": "Докладніше",
+    "appriseInstalled": "Apprise встановлено.",
+    "appriseNotInstalled": "Apprise не встановлено. {0}",
+    "Access Token": "Токен доступу",
+    "Channel access token": "Токен доступу каналу",
+    "Line Developers Console": "Консоль розробників Line",
+    "lineDevConsoleTo": "Консоль розробників Line - {0}",
+    "Basic Settings": "Базові налаштування",
+    "User ID": "ID користувача",
+    "Messaging API": "API повідомлень",
+    "wayToGetLineChannelToken": "Спочатку зайдіть в {0}, створіть провайдера та канал (API повідомлень), потім ви зможете отримати токен доступу каналу та ID користувача з вищезгаданих пунктів меню.",
+    "Icon URL": "URL іконки",
+    "aboutIconURL": "Ви можете надати посилання на іконку в полі \"URL іконки\", щоб перевизначити картинку профілю за замовчуванням. Не використовується, якщо задана іконка Emoji.",
+    "aboutMattermostChannelName": "Ви можете перевизначити канал за замовчуванням, в який пише вебхук, ввівши ім'я каналу в полі \"Ім'я каналу\". Це необхідно включити в налаштуваннях вебхука Mattermost. Наприклад: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - дешево та повільно, часто перевантажений. Тільки для одержувачів з Польщі.",
+    "promosmsTypeFlash": "SMS FLASH - повідомлення автоматично з'являться на пристрої одержувача. Тільки для одержувачів з Польщі.",
+    "promosmsTypeFull": "SMS FULL - преміум-рівень SMS, можна використовувати своє ім'я відправника (попередньо зареєструвавши його). Надійно для алертів.",
+    "promosmsTypeSpeed": "SMS SPEED - найвищий пріоритет у системі. Дуже швидко і надійно, але дуже дорого (вдвічі дорожче, ніж SMS FULL).",
+    "promosmsPhoneNumber": "Номер телефону (для одержувачів з Польщі можна пропустити код регіону)",
+    "promosmsSMSSender": "Ім'я відправника SMS: Зареєстроване або одне з імен за замовчуванням: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookURL": "Feishu WebHookURL",
+    "matrixHomeserverURL": "URL сервера (разом з http(s):// і опціонально порт)",
+    "Internal Room Id": "Внутрішній ID кімнати",
+    "matrixDesc1": "Внутрішній ID кімнати можна знайти в Подробицях у параметрах каналу вашого Matrix клієнта. Він повинен виглядати приблизно як !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Рекомендується створити нового користувача і не використовувати токен доступу особистого користувача Matrix, тому що це спричиняє повний доступ до облікового запису та до кімнат, в яких ви є. Замість цього створіть нового користувача і запросіть його тільки в ту кімнату, в якій ви хочете отримувати повідомлення.Токен доступу можна отримати, виконавши команду {0}",
+    "Method": "Метод",
+    "Body": "Тіло",
+    "Headers": "Заголовки",
+    "PushUrl": "URL пуша",
+    "HeadersInvalidFormat": "Заголовки запиту некоректні JSON: ",
+    "BodyInvalidFormat": "Тіло запиту некоректне JSON: ",
+    "Monitor History": "Статистика",
+    "clearDataOlderThan": "Зберігати статистику за {0} днів.",
+    "PasswordsDoNotMatch": "Паролі не співпадають.",
+    "records": "записів",
+    "One record": "Один запис",
+    "steamApiKeyDescription": "Для моніторингу ігрового сервера Steam вам потрібен Web-API ключ Steam. Зареєструвати його можна тут: ",
+    "Certificate Chain": "Ланцюжок сертифікатів",
+    "Valid": "Дійсний",
+    "Hide Tags": "Приховати теги",
+    "Title": "Назва інциденту:",
+    "Content": "Зміст інциденту:",
+    "Post": "Опублікувати",
+    "Cancel": "Скасувати",
+    "Created": "Створено",
+    "Unpin": "Відкріпити",
+    "Show Tags": "Показати теги",
+    "recent": "Зараз",
+    "3h": "3 години",
+    "6h": "6 годин",
+    "24h": "24 години",
+    "1w": "1 тиждень",
+    "No monitors available.": "Немає доступних моніторів",
+    "Add one": "Додати новий",
+    "Backup": "Резервна копія",
+    "Security": "Безпека",
+    "Shrink Database": "Стиснути базу даних",
+    "Current User": "Поточний користувач",
+    "About": "Про програму",
+    "Description": "Опис",
+    "Powered by": "Працює на основі скрипту від",
+    "shrinkDatabaseDescription": "Включає VACUUM для бази даних SQLite. Якщо база даних була створена на версії 1.10.0 і більше, AUTO_VACUUM вже включений і ця дія не потрібна.",
+    "Style": "Стиль",
+    "info": "ІНФО",
+    "warning": "УВАГА",
+    "danger": "ПОМИЛКА",
+    "primary": "ОСНОВНИЙ",
+    "light": "СВІТЛИЙ",
+    "dark": "ТЕМНИЙ",
+    "New Status Page": "Нова сторінка статусу",
+    "Show update if available": "Показувати доступні оновлення",
+    "Also check beta release": "Перевіряти оновлення для бета версій",
+    "Add New Status Page": "Додати сторінку статусу",
+    "Next": "Далі",
+    "Acz characters: a-z 0-9 -": "Дозволені символи: a-z 0-9 -",
+    "Start or end with a-z 0-9 only": "Початок та закінчення імені лише на символи: a-z 0-9",
+    "No consecutive dashes --": "Заборонено використовувати тире --",
+    "HTTP Options": "HTTP Опції",
+    "Authentication": "Аутентифікація",
+    "HTTP Basic Auth": "Базова HTTP",
+    "PushByTechulus": "Push by Techulus",
+    "clicksendsms": "ClickSend SMS",
+    "GoogleChat": "Google Chat (тільки Google Workspace)",
+    "apiCredentials": "API реквізити",
+    "Done": "Готово",
+    "Info": "Інфо",
+    "Steam API Key": "Steam API-Ключ",
+    "Pick a RR-Type...": "Виберіть RR-тип...",
+    "Pick Accepted Status Codes...": "Виберіть прийняті коди стану...",
+    "Default": "За замовчуванням",
+    "Please input title and content": "Будь ласка, введіть назву та зміст",
+    "Last Updated": "Останнє Оновлення",
+    "Untitled Group": "Група без назви",
+    "Services": "Сервіси",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Користувач (включаючи префікс webapi_)",
+    "serwersmsAPIPassword": "API Пароль",
+    "serwersmsPhoneNumber": "Номер телефону",
+    "serwersmsSenderName": "SMS ім'я відправника (реєстрований через портал користувача)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM Налаштування",
+    "smtpDkimDesc": "Повернутися до Nodemailer DKIM {0} для використання.",
+    "documentation": "документація",
+    "smtpDkimDomain": "Ім'я домена",
+    "smtpDkimKeySelector": "Ключ",
+    "smtpDkimPrivateKey": "Приватний ключ",
+    "smtpDkimHashAlgo": "Алгоритм хеша (опціонально)",
+    "smtpDkimheaderFieldNames": "Заголовок ключів для підпису (опціонально)",
+    "smtpDkimskipFields": "Заколовок ключів не для підпису (опціонально)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "Кінцева точка API",
+    "alertaEnvironment": "Середовище",
+    "alertaApiKey": "Ключ API",
+    "alertaAlertState": "Стан алерту",
+    "alertaRecoverState": "Стан відновлення",
+    "deleteStatusPageMsg": "Дійсно хочете видалити цю сторінку статусів?",
+    "Proxies": "Проксі",
+    "default": "За замовчуванням",
+    "enabled": "Активно",
+    "setAsDefault": "Встановити за замовчуванням",
+    "deleteProxyMsg": "Ви впевнені, що хочете видалити цей проксі для всіх моніторів?",
+    "proxyDescription": "Щоб функціонувати, монітору потрібно призначити проксі.",
+    "enableProxyDescription": "Цей проксі не впливатиме на запити моніторингу, доки його не буде активовано. Ви можете контролювати тимчасове відключення проксі з усіх моніторів за статусом активації.",
+    "setAsDefaultProxyDescription": "Цей проксі буде ввімкнено за умовчанням для нових моніторів. Ви все одно можете вимкнути проксі окремо для кожного монітора.",
+    "Invalid": "Недійсний",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Шаблон смс повинен містити параметри: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Для безпеки необхідно використовувати секретний ключ",
+    "Device Token": "Токен пристрою",
+    "Platform": "Платформа",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "Високий",
+    "Retry": "Повтор",
+    "Topic": "Тема",
+    "WeCom Bot Key": "WeCom Bot ключ",
+    "Setup Proxy": "Налаштувати проксі",
+    "Proxy Protocol": "Протокол проксі",
+    "Proxy Server": "Проксі-сервер",
+    "Proxy server has authentication": "Проксі-сервер має аутентифікацію",
+    "User": "Користувач",
+    "Installed": "Встановлено",
+    "Not installed": "Не встановлено",
+    "Running": "Запущено",
+    "Not running": "Не запущено",
+    "Remove Token": "Видалити токен",
+    "Start": "Запустити",
+    "Stop": "Зупинити",
+    "Uptime Kuma": "Uptime Kuma",
+    "Slug": "Slug",
+    "Accept characters:": "Прийняти символи:",
+    "startOrEndWithOnly": "Починається або закінчується лише {0}",
+    "No consecutive dashes": "Немає послідовних тире",
+    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "No Proxy": "Без проксі",
+    "Page Not Found": "Сторінку не знайдено",
+    "Reverse Proxy": "Реверсивний проксі",
+    "wayToGetCloudflaredURL": "(Завантажити Cloudflare з {0})",
+    "cloudflareWebsite": "Веб-сайт Cloudflare",
+    "Message:": "Повідомлення:",
+    "Don't know how to get the token? Please read the guide:": "Не знаєте, як отримати токен? Прочитайте посібник:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Поточне з’єднання може бути втрачено, якщо ви зараз під’єднуєтеся через Cloudflare Tunnel. Ви дійсно хочете зробити це? Для підтвердження введіть поточний пароль.",
+    "Other Software": "Інше програмне забезпечення",
+    "For example: nginx, Apache and Traefik.": "Наприклад: nginx, Apache and Traefik.",
+    "Please read": "Будь ласка, прочитайте",
+    "Subject:": "Тема:",
+    "Valid To:": "Дійсний до:",
+    "Days Remaining:": "Залишилось днів:",
+    "Issuer:": "Емітент:",
+    "Fingerprint:": "Відбиток:",
+    "No status pages": "Немає сторінок статусу",
+    "Domain Name Expiry Notification": "Сповіщення про закінчення терміну дії доменного імені",
+    "Proxy": "Проксі",
+    "Date Created": "Дата створення",
+    "onebotHttpAddress": "OneBot адреса HTTP",
+    "onebotMessageType": "OneBot тип повідомлення",
+    "onebotGroupMessage": "Група",
+    "onebotPrivateMessage": "Приватне",
+    "onebotUserOrGroupId": "Група/Користувач ID",
+    "onebotSafetyTips": "Для безпеки необхідно встановити маркер доступу",
+    "PushDeer Key": "PushDeer ключ",
+    "Footer Text": "Текст нижнього колонтитула",
+    "Show Powered By": "Показувати платформу",
+    "Domain Names": "Доменні імена",
+    "signedInDisp": "Ви ввійшли як {0}",
+    "signedInDispDisabled": "Авторизація вимкнена.",
+    "Certificate Expiry Notification": "Сповіщення про закінчення терміну дії сертифіката",
+    "API Username": "Користувач API",
+    "API Key": "Ключ API",
+    "Recipient Number": "Номер одержувача",
+    "From Name/Number": "Від Ім'я/Номер",
+    "Leave blank to use a shared sender number.": "Залиште поле порожнім, щоб використовувати спільний номер відправника.",
+    "Octopush API Version": "Octopush API версія",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "кінцева точка",
+    "octopushAPIKey": "\"Ключ API\" з облікових даних HTTP API в панелі керування",
+    "octopushLogin": "\"Ім'я користувача\" з облікових даних HTTP API на панелі керування",
+    "promosmsLogin": "API Логін",
+    "promosmsPassword": "API Пароль",
+    "pushoversounds pushover": "Pushover (по замовчуванню)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Секретний ключ API",
+    "pushyToken": "Токен пристрою",
+    "Using a Reverse Proxy?": "Використовувати зворотній проксі?",
+    "Check how to config it for WebSocket": "Перевірте, як налаштувати його для WebSocket",
+    "Steam Game Server": "Ігровий сервер Steam",
+    "Most likely causes:": "Найімовірніші причини:",
+    "The resource is no longer available.": "Ресурс більше не доступний.",
+    "There might be a typing error in the address.": "Можливо, в адресі є помилка.",
+    "What you can try:": "Що ви можете спробувати:",
+    "Retype the address.": "Повторно введіть адресу.",
+    "Go back to the previous page.": "Повернутися на попередню сторінку.",
+    "Coming Soon": "Незабаром",
+    "wayToGetClickSendSMSToken": "Ви можете отримати ім’я користувача API та ключ API з {0} .",
+    "Connection String": "Рядок підключення",
+    "Query": "Запит",
+    "settingsCertificateExpiry": "Закінчення терміну дії сертифіката TLS",
+    "certificationExpiryDescription": "Запуск сповіщення для HTTPS моніторів коли до закінчення терміну дії TLS сертифіката:",
+    "ntfy Topic": "ntfy Тема",
+    "Domain": "Домен",
+    "Workstation": "Робоча станція",
+    "disableCloudflaredNoAuthMsg": "Ви перебуваєте в режимі без авторизації, пароль не потрібен."
+}
diff --git a/src/lang/vi-VN.json b/src/lang/vi-VN.json
new file mode 100644
index 00000000..8b527cce
--- /dev/null
+++ b/src/lang/vi-VN.json
@@ -0,0 +1,469 @@
+{
+    "languageName": "Tiếng Việt",
+    "checkEverySecond": "Kiểm tra mỗi {0} giây.",
+    "retryCheckEverySecond": "Thử lại mỗi {0} giây.",
+    "retriesDescription": "Số lần thử lại tối đa trước khi dịch vụ được đánh dấu là down và gửi thông báo.",
+    "ignoreTLSError": "Bỏ qua lỗi TLS/SSL với các web HTTPS.",
+    "upsideDownModeDescription": "Trạng thái đảo ngược, nếu dịch vụ có thể truy cập được nghĩa là DOWN.",
+    "maxRedirectDescription": "Số lần chuyển hướng (redirect) tối đa. Đặt thành 0 để tắt chuyển hướng",
+    "acceptedStatusCodesDescription": "Chọn mã trạng thái được coi là phản hồi thành công.",
+    "passwordNotMatchMsg": "Mật khẩu nhập lại không khớp.",
+    "notificationDescription": "Vui lòng chỉ định một kênh thông báo.",
+    "keywordDescription": "Từ khoá tìm kiếm phản hồi ở dạng html hoặc JSON, có phân biệt chữ HOA - thường",
+    "pauseDashboardHome": "Tạm dừng",
+    "deleteMonitorMsg": "Bạn chắc chắn muốn xóa kênh theo dõi này chứ?",
+    "deleteNotificationMsg": "Bạn có chắc chắn muốn xóa kênh thông báo này cho tất cả kênh theo dõi?",
+    "resolverserverDescription": "Cloudflare là máy chủ mặc định, bạn có thể thay đổi bất cứ lúc nào.",
+    "rrtypeDescription": "Hãy chọn RR-Type mà bạn muốn giám sát",
+    "pauseMonitorMsg": "Bạn chắc chắn muốn tạm dừng chứ?",
+    "enableDefaultNotificationDescription": "Bật làm mặc định cho mọi kênh theo dõi mới về sau. Bạn vẫn có thể tắt thông báo riêng cho từng kênh theo dõi.",
+    "clearEventsMsg": "Bạn chắc chắn muốn xoá TẤT CẢ sự kiện cho kênh theo dõi này chứ?",
+    "clearHeartbeatsMsg": "Bạn chắc chắn muốn xoá TẤT CẢ heartbeats cho kênh theo dõi này chứ?",
+    "confirmClearStatisticsMsg": "Bạn chắc chắn muốn xoá TẤT CẢ số liệu thống kê?",
+    "importHandleDescription": "Chọn 'Giữ lại' nếu bạn muốn bỏ qua mọi kênh theo dõi và kênh thông báo trùng tên. 'Ghi đè' sẽ ghi đè lên tất cả các kênh theo dõi và kênh thông báo.",
+    "confirmImportMsg": "Bạn có chắc chắn muốn khôi phục bản bản sao lưu này không?.",
+    "twoFAVerifyLabel": "Vui lòng nhập mã token của bạn để xác minh rằng xác thực 2 lớp (2FA) đang hoạt động",
+    "tokenValidSettingsMsg": "Mã token hợp lệ! Bạn có thể lưu cài đặt xác thực 2 lớp (2FA) bây giờ.",
+    "confirmEnableTwoFAMsg": "Bạn chắc chắn muốn bật xác thực 2 lớp (2FA) chứ?",
+    "confirmDisableTwoFAMsg": "Bạn chắc chắn muốn tắt xác thực 2 lớp (2FA) chứ?",
+    "Settings": "Cài đặt",
+    "Dashboard": "Dashboard",
+    "New Update": "Bản cập nhật mới",
+    "Language": "Ngôn ngữ",
+    "Appearance": "Giao diện",
+    "Theme": "Theme",
+    "General": "Chung",
+    "Primary Base URL": "URL chính",
+    "Version": "Phiên bản",
+    "Check Update On GitHub": "Kiểm tra bản cập nhật mới trên GitHub",
+    "List": "List",
+    "Add": "Thêm",
+    "Add New Monitor": "Thêm mới kênh theo dõi",
+    "Quick Stats": "Thống kê nhanh",
+    "Up": "Up",
+    "Down": "Down",
+    "Pending": "Chờ xử lý",
+    "Unknown": "Không xác định",
+    "Pause": "Tạm dừng",
+    "Name": "Tên",
+    "Status": "Trạng thái",
+    "DateTime": "Ngày tháng",
+    "Message": "Trạng thái request",
+    "No important events": "Không có sự kiện quan trọng nào",
+    "Resume": "Khôi phục",
+    "Edit": "Sửa",
+    "Delete": "Xoá",
+    "Current": "Hiện tại",
+    "Uptime": "Uptime",
+    "Cert Exp.": "Cert hết hạn",
+    "day": "ngày",
+    "-day": "-ngày",
+    "hour": "giờ",
+    "-hour": "-giờ",
+    "Response": "Phản hồi",
+    "Ping": "Ping",
+    "Monitor Type": "Kiểu kênh theo dõi",
+    "Keyword": "Từ khoá",
+    "Friendly Name": "Tên rút gọn",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "Tần suất kiểm tra",
+    "Retries": "Thử lại",
+    "Heartbeat Retry Interval": "Tần suất kiểm tra lại",
+    "Advanced": "Nâng cao",
+    "Upside Down Mode": "Chế độ đảo ngược",
+    "Max. Redirects": "Số chuyển hướng tối đa",
+    "Accepted Status Codes": "Codes trạng thái chấp nhận",
+    "Push URL": "Push URL",
+    "needPushEvery": "Bạn nên gọi URL mỗi {0} giây.",
+    "pushOptionalParams": "Tuỳ chỉnh parameters: {0}",
+    "Save": "Lưu",
+    "Notifications": "Thông báo",
+    "Not available, please setup.": "Chưa sẵn sàng, hãy cài đặt.",
+    "Setup Notification": "Cài đặt thông báo",
+    "Light": "Sáng",
+    "Dark": "Tối",
+    "Auto": "Tự động",
+    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
+    "Normal": "Bình thường",
+    "Bottom": "Dưới",
+    "None": "Không có",
+    "Timezone": "Múi giờ",
+    "Search Engine Visibility": "Hiển thị với các công cụ tìm kiếm",
+    "Allow indexing": "Cho phép indexing",
+    "Discourage search engines from indexing site": "Ngăn chặn các công cụ tìm kiếm indexing trang",
+    "Change Password": "Thay đổi mật khẩu",
+    "Current Password": "Mật khẩu hiện tại",
+    "New Password": "Mật khẩu mới",
+    "Repeat New Password": "Lặp lại mật khẩu mới",
+    "Update Password": "Cập nhật mật khẩu",
+    "Disable Auth": "Tắt xác minh",
+    "Enable Auth": "Bật xác minh",
+    "disableauth.message1": "Bạn có muốn <strong>TẮT XÁC THỰC</strong> không?",
+    "disableauth.message2": "Điều này rất nguy hiểm<strong>BẤT KỲ AI</strong> cũng có thể truy cập và cướp quyền điều khiển.",
+    "Please use this option carefully!": "Vui lòng <strong>cẩn thận</strong>.",
+    "Logout": "Đăng xuất",
+    "Leave": "Rời",
+    "I understand, please disable": "Tôi hiểu, làm ơn hãy tắt!",
+    "Confirm": "Xác nhận",
+    "Yes": "Có",
+    "No": "Không",
+    "Username": "Tài khoản",
+    "Password": "Mật khẩu",
+    "Remember me": "Lưu phiên đăng nhập",
+    "Login": "Đăng nhập",
+    "No Monitors, please": "Không có kênh theo dõi nào",
+    "add one": "Thêm mới",
+    "Notification Type": "Kiểu thông báo",
+    "Email": "Email",
+    "Test": "Thử",
+    "Certificate Info": "Thông tin Certificate",
+    "Resolver Server": "Máy chủ Resolver",
+    "Resource Record Type": "Loại bản ghi",
+    "Last Result": "Kết quả cuối cùng",
+    "Create your admin account": "Tạo tài khoản quản trị",
+    "Repeat Password": "Lặp lại mật khẩu",
+    "Import Backup": "Khôi phục bản sao lưu",
+    "Export Backup": "Xuất bản sao lưu",
+    "Export": "Xuất",
+    "Import": "Nhập",
+    "respTime": "Thời gian phản hồi (ms)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Mặc định bật",
+    "Apply on all existing monitors": "Áp dụng cho tất cả kênh theo dõi đang có",
+    "Create": "Tạo",
+    "Clear Data": "Xoá dữ liệu",
+    "Events": "Sự kiện",
+    "Heartbeats": "Heartbeats",
+    "Auto Get": "Tự động lấy",
+    "backupDescription": "Sao lưu tất cả các kênh theo dõi và tất cả các thông báo vào một file định dạng JSON.",
+    "backupDescription2": "Lưu ý: Không bao gồm dữ liệu lịch sử các sự kiện.",
+    "backupDescription3": "Hãy lưu giữ file này cẩn thận, trong file đó chứa cả các token thông báo.",
+    "alertNoFile": "Hãy chọn file để khôi phục.",
+    "alertWrongFileType": "Hãy chọn file định dạng JSON.",
+    "Clear all statistics": "Xoá tất cả thống kê",
+    "Skip existing": "Giữ lại",
+    "Overwrite": "Ghi đè",
+    "Options": "Tuỳ chọn",
+    "Keep both": "Giữ lại cả hai",
+    "Verify Token": "Xác minh Token",
+    "Setup 2FA": "Cài đặt xác thực 2 lớp (2FA)",
+    "Enable 2FA": "Bật xác thực 2 lớp (2FA)",
+    "Disable 2FA": "Tắt xác thực 2 lớp (2FA)",
+    "2FA Settings": "Cài đặt xác thực 2 lớp (2FA)",
+    "Two Factor Authentication": "Xác thực hai yếu tố",
+    "Active": "Hoạt động",
+    "Inactive": "Ngừng hoạt động",
+    "Token": "Token",
+    "Show URI": "Hiển thị URI",
+    "Tags": "Tags",
+    "Add New below or Select...": "Thêm mới ở dưới hoặc Chọn...",
+    "Tag with this name already exist.": "Tag với tên đã tồn tại.",
+    "Tag with this value already exist.": "Tag với value đã tồn tại.",
+    "color": "Màu sắc",
+    "value (optional)": "Value (tuỳ chọn)",
+    "Gray": "Xám",
+    "Red": "Đỏ",
+    "Orange": "Cam",
+    "Green": "Xanh lá",
+    "Blue": "Xanh da trời",
+    "Indigo": "Chàm",
+    "Purple": "Tím",
+    "Pink": "Hồng",
+    "Search...": "Tìm kiếm...",
+    "Avg. Ping": "Ping trung bình",
+    "Avg. Response": "Phản hồi trung bình",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Chưa có thông tin gì, hãy thêm nhóm kênh theo dõi hoặc kênh theo dõi.",
+    "No Services": "Không có dịch vụ",
+    "All Systems Operational": "Tất cả các hệ thống hoạt động bình thường",
+    "Partially Degraded Service": "Có hệ thống bị ngưng",
+    "Degraded Service": "Toàn bộ hệ thống bị ngưng",
+    "Add Group": "Thêm nhóm",
+    "Add a monitor": "Thêm kênh theo dõi",
+    "Edit Status Page": "Sửa trang trạng thái",
+    "Go to Dashboard": "Đi tới Dashboard",
+    "Status Page": "Trang trạng thái",
+    "Status Pages": "Trang trạng thái",
+    "defaultNotificationName": "My {notification} Alerts ({number})",
+    "here": "tại đây",
+    "Required": "Bắt buộc",
+    "telegram": "Telegram",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "Bạn có thể lấy mã token từ",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Hỗ trợ chat trực tiếp / Nhóm / Kênh Chat ID",
+    "wayToGetTelegramChatID": "Bạn có thể lấy chat id của mình bằng cách gửi tin nhắn tới bot và truy cập url này để xem chat_id:",
+    "YOUR BOT TOKEN HERE": "MÃ BOT TOKEN CỦA BẠN",
+    "chatIDNotFound": "Không tìm thấy Chat ID, vui lòng gửi tin nhắn cho bot này trước",
+    "webhook": "Webhook",
+    "Post URL": "URL webhook",
+    "Content Type": "Loại nội dung",
+    "webhookJsonDesc": "{0} tương thích với máy chủ HTTP ví dụ như Express.js",
+    "webhookFormDataDesc": "{multipart} tương thích với máy chủ PHP, bạn chỉ cần phân tích cú pháp json bằng {decodeFunction}",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "None/STARTTLS(25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Bỏ qua lỗi TLS",
+    "From Email": "Email gửi",
+    "emailCustomSubject": "Tuỳ chỉnh tiêu đề",
+    "To Email": "Email nhận",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "Để lấy Discord, hãy vào: Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "Tên hiển thị của BOT",
+    "Prefix Custom Message": "Tiền tố tin nhắn tuỳ chọn",
+    "Hello @everyone is...": "Xin chào {'@'} mọi người đang...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "Bạn có thể học cách tạo webhook url {0}.",
+    "signal": "Tín hiệu",
+    "Number": "Số",
+    "Recipients": "Người nhận",
+    "needSignalAPI": "Bạn cần một tín hiệu kết nối với REST API.",
+    "wayToCheckSignalURL": "Bạn có thể kiểm tra URL này để xem cách thiết lập:",
+    "signalImportant": "QUAN TRỌNG: Bạn không thể kết hợp các nhóm và số trong người nhận!",
+    "gotify": "Gotify",
+    "Application Token": "Mã Token ứng dụng",
+    "Server URL": "URL máy chủ",
+    "Priority": "Mức ưu tiên",
+    "slack": "Slack",
+    "Icon Emoji": "Icon Emoji",
+    "Channel Name": "Tên Channel",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "Thông tin thêm về webhook trên: {0}",
+    "aboutChannelName": "Nhập tên kênh trên {0} trường Channel Name nếu bạn muốn bỏ qua kênh webhook. vd: #other-channel",
+    "aboutKumaURL": "Nếu bạn để trống trường Uptime Kuma URL, mặc định sẽ là trang Project Github.",
+    "emojiCheatSheet": "Bảng tra cứu Emoji: {0}",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Hỗ trợ trên 50 dịch vụ thông báo)",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "User Key",
+    "Device": "Thiết bị",
+    "Message Title": "Tiêu đề tin nhắn",
+    "Notification Sound": "Âm thanh thông báo",
+    "More info on:": "Thông tin chi tiết tại: {0}",
+    "pushoverDesc1": "Mức ưu tiên khẩn cấp (2) có thời gian chờ mặc định là 30 giây giữa các lần thử lại và sẽ hết hạn sau 1 giờ.",
+    "pushoverDesc2": "Nếu bạn muốn gửi thông báo đến các thiết bị khác nhau, hãy điền vào trường Thiết bị.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Nhanh - Khuyến nghị nên dùng cho cảnh báo)",
+    "octopushTypeLowCost": "Giá rẻ (Chậm, thỉnh thoảng bị chặn)",
+    "checkPrice": "Kiểm tra giá {0}:",
+    "apiCredentials": "API credentials",
+    "octopushLegacyHint": "Bạn muốn sử dụng phiên bản cũ của Octopush (2011-2020) hay phiên bản mới?",
+    "Check octopush prices": "Kiểm tra giá octopush {0}.",
+    "octopushPhoneNumber": "Số điện thoại (Định dạng intl, vd : +84692341165​) ",
+    "octopushSMSSender": "SMS người gửi : 3-11 ký tự chữ, số và dấu cách (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea ID thiết bị",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Ví dụ: {0}",
+    "Read more:": "Đọc thêm: {0}",
+    "Status:": "Trạng thái: {0}",
+    "Read more": "Đọc thêm",
+    "appriseInstalled": "Đã cài đặt Apprise.",
+    "appriseNotInstalled": "Chưa cài đặt Apprise. {0}",
+    "Access Token": "Token truy cập",
+    "Channel access token": "Token kênh truy cập",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Cài đặt cơ bản",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "Trước tiên, hãy truy cập {0},tạo nhà cung cấp và kênh (Messaging API), sau đó bạn có thể nhận mã token truy cập kênh và id người dùng từ các mục menu được đề cập ở trên.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "Bạn có thể cung cấp liên kết đến ảnh trong \"Icon URL\" để ghi đè ảnh hồ sơ mặc định. Sẽ không được sử dụng nếu Biểu tượng cảm xúc được thiết lập.",
+    "aboutMattermostChannelName": "Bạn có thể ghi đè kênh mặc định mà webhook đăng lên bằng cách nhập tên kênh vào trường \"Channel Name\". Điều này cần được bật trong cài đặt Mattermost webhook. Ví dụ: #other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - rẻ nhưng chậm và thường xuyên quá tải. Chỉ dành cho người Ba Lan.",
+    "promosmsTypeFlash": "SMS FLASH - Tin nhắn sẽ tự động hiển thị trên thiết bị của người nhận. Chỉ dành cho người Ba Lan.",
+    "promosmsTypeFull": "SMS FULL - SMS cao cấp, Bạn có thể sử dụng Tên Người gửi (Bạn cần đăng ký tên trước). Đáng tin cậy cho các cảnh báo.",
+    "promosmsTypeSpeed": "SMS SPEED - Ưu tiên cao nhất trong hệ thống. Rất nhanh chóng và đáng tin cậy nhưng tốn kém, (giá gấp đôi SMS FULL).",
+    "promosmsPhoneNumber": "Số điện thoại (Bỏ qua mã vùng với người Ba Lan)",
+    "promosmsSMSSender": "SMS Tên người gửi: Tên đã đăng ký trước hoặc tên mặc định: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Feishu WebHookUrl": "Feishu WebHookUrl",
+    "matrixHomeserverURL": "Homeserver URL (với http(s):// và port tuỳ chỉnh)",
+    "Internal Room Id": "Room ID Nội bộ",
+    "matrixDesc1": "Bạn có thể tìm thấy room ID nội bộ bằng cách tìm trong mục advanced của phần room settings trong Matrix client của bạn. Nó có dạng giống như !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Bạn nên tạo người dùng mới và đừng sử dụng mã token truy cập của Matrix user vì nó sẽ cho phép truy cập toàn quyền vào tài khoản của bạn và tất cả các phòng bạn đã tham gia. Thay vào đó, hãy tạo một người dùng mới và chỉ mời người đó vào phòng mà bạn muốn nhận thông báo. Bạn có thể lấy được mã token truy cập bằng cách chạy {0}",
+    "Method": "Method",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "Header request không hợp lệ JSON: ",
+    "BodyInvalidFormat": "Tequest body không hợp lệ JSON: ",
+    "Monitor History": "Lịch sử kênh theo dõi",
+    "clearDataOlderThan": "Giữ dữ liệu lịch sử kênh theo dõi {0} ngày.",
+    "PasswordsDoNotMatch": "Passwords không khớp.",
+    "records": "records",
+    "One record": "One record",
+    "steamApiKeyDescription": "Để theo dõi các Steam Game Server bạn cần một Steam Web-API key. Bạn có thể đăng ký API key tại đây: ",
+    "Current User": "User hiện tại",
+    "topic": "Topic",
+    "topicExplanation": "MQTT topic to monitor",
+    "successMessage": "Success Message",
+    "successMessageExplanation": "MQTT message that will be considered as success",
+    "recent": "Gần đây",
+    "Done": "Hoàn thành",
+    "Info": "Thông tin",
+    "Security": "Bảo mật",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Shrink Database",
+    "Pick a RR-Type...": "Pick a RR-Type...",
+    "Pick Accepted Status Codes...": "Chọn các Codes trạng thái chấp nhận được...",
+    "Default": "Mặc định",
+    "HTTP Options": "Tuỳ chọn HTTP",
+    "Create Incident": "Tạo Incident",
+    "Title": "Tiêu đề",
+    "Content": "Nội dung",
+    "Style": "Style",
+    "info": "thông tin",
+    "warning": "cảnh báo",
+    "danger": "nguy hiểm",
+    "primary": "cơ sở",
+    "light": "sáng",
+    "dark": "tối",
+    "Post": "Post",
+    "Please input title and content": "Hãy nhập tiêu đề và nội dung",
+    "Created": "Đã tạo",
+    "Last Updated": "Cập nhật mới nhất",
+    "Unpin": "Bỏ ghim",
+    "Switch to Light Theme": "Chuyển sang giao diện Sáng",
+    "Switch to Dark Theme": "Chuyển sang giao diện Tối",
+    "Show Tags": "Hiện Tags",
+    "Hide Tags": "Ẩn Tags",
+    "Description": "Mô tả",
+    "No monitors available.": "Không có kênh theo dõi nào.",
+    "Add one": "Thêm mới",
+    "No Monitors": "Không có kênh theo dõi",
+    "Untitled Group": "Nhóm không có tiêu đề",
+    "Services": "Dịch vụ",
+    "Discard": "Bỏ",
+    "Cancel": "Hủy",
+    "Powered by": "Được cung cấp bởi",
+    "shrinkDatabaseDescription": "Khởi chạy database VACCUM cho SQLite. Nếu database được tạo sau version 1.10.0, AUTO_VACCUM đã được bật sẵn, hành động này không cần thiết.",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Password",
+    "serwersmsPhoneNumber": "Số điện thoại",
+    "serwersmsSenderName": "Tên người gửi SMS (Đã đăng ký qua portal)",
+    "stackfield": "Stackfield",
+    "Customize": "Customize",
+    "Custom Footer": "Custom Footer",
+    "Custom CSS": "Custom CSS",
+    "smtpDkimSettings": "Cài đặt xác thực Email(DKIM)",
+    "smtpDkimDesc": "Xem hướng dẫn tại {0}.",
+    "documentation": "Nodemailer DKIM",
+    "smtpDkimDomain": "Mail domain",
+    "smtpDkimKeySelector": "DKIM Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "Hash Algorithm (Tuỳ chọn)",
+    "smtpDkimheaderFieldNames": "Header Keys to sign (Tuỳ chọn)",
+    "smtpDkimskipFields": "Header Keys not to sign (Tuỳ chọn)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Alert State",
+    "alertaRecoverState": "Recover State",
+    "deleteStatusPageMsg": "Bạn có chắc chắn muốn xoá trang status này?",
+    "Proxies": "Proxies",
+    "default": "Mặc định",
+    "enabled": "Enabled",
+    "setAsDefault": "Set As Default",
+    "deleteProxyMsg": "Bạn muốn xoá proxy này cho tất cả monitors?",
+    "proxyDescription": "Proxies must be assigned to a monitor to function.",
+    "enableProxyDescription": "Proxy này chưa ảnh hưởng tới monitor requests cho tới khi được activated. Bạn có thể tạm thời tắt proxy cho tất cả monitors bằng trạng thái activation.",
+    "setAsDefaultProxyDescription": "Proxy này sẽ bật mặc định cho tất cả monitors mới. Bạn có thể tắt riêng lẻ proxy trên mỗi monitor.",
+    "Certificate Chain": "Certificate Chain",
+    "Valid": "Hợp lệ",
+    "Invalid": "Không hợp lệ",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "Để an toàn, hãy dùng secret key",
+    "Device Token": "Device Token",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Retry",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Setup Proxy",
+    "Proxy Protocol": "Proxy Protocol",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server has authentication",
+    "User": "User",
+    "Installed": "Installed",
+    "Not installed": "Not installed",
+    "Running": "Running",
+    "Not running": "Not running",
+    "Remove Token": "Remove Token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "Thêm mới Status Page",
+    "Slug": "Slug",
+    "Accept characters:": "Accept characters:",
+    "startOrEndWithOnly": "Start or end with {0} only",
+    "No consecutive dashes": "No consecutive dashes",
+    "Next": "Next",
+    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "No Proxy": "No Proxy",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "New Status Page",
+    "Page Not Found": "Page Not Found",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Backup",
+    "About": "About",
+    "wayToGetCloudflaredURL": "(Download cloudflared from {0})",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Message:": "Message:",
+    "Don't know how to get the token? Please read the guide:": "Chưa biết cách lấy token? Xem hướng dẫn tại:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Nếu bạn đang dùng Cloudflare Tunnel, kết nối hiện tại có thể đang bị mất. Bạn có muốn dừng lại? Nhập lại password để xác nhận.",
+    "Other Software": "Phần mềm khác",
+    "For example: nginx, Apache and Traefik.": "Ví dụ: Nginx, Apache hay Traefik.",
+    "Please read": "Hãy xem qua",
+    "Subject:": "Subject:",
+    "Valid To:": "Valid To:",
+    "Days Remaining:": "Số ngày còn lại:",
+    "Issuer:": "Issuer:",
+    "Fingerprint:": "Fingerprint:",
+    "No status pages": "No status pages",
+    "Domain Name Expiry Notification": "Cảnh báo hạn hạn Domain Name",
+    "Proxy": "Proxy",
+    "Date Created": "Ngày khởi tạo",
+    "onebotHttpAddress": "OneBot HTTP Address",
+    "onebotMessageType": "OneBot Message Type",
+    "onebotGroupMessage": "Group",
+    "onebotPrivateMessage": "Private",
+    "onebotUserOrGroupId": "Group/User ID",
+    "onebotSafetyTips": "Để đảm bảo an toàn, hãy thiết lập access token",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "Footer Text",
+    "Show Powered By": "Show Powered By",
+    "Domain Names": "Domain Names",
+    "signedInDisp": "Signed in as {0}",
+    "signedInDispDisabled": "Auth Disabled."
+}
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
new file mode 100644
index 00000000..a75b73fb
--- /dev/null
+++ b/src/lang/zh-CN.json
@@ -0,0 +1,683 @@
+{
+    "languageName": "简体中文",
+    "checkEverySecond": "检测频率 {0} 秒",
+    "retryCheckEverySecond": "重试间隔 {0} 秒",
+    "resendEveryXTimes": "每 {0} 次失败则重复发送一次",
+    "resendDisabled": "为 0 时禁用重复发送",
+    "retriesDescription": "服务被标记为故障并发送通知之前的最大重试次数",
+    "ignoreTLSError": "忽略 HTTPS 站点的 TLS/SSL 错误",
+    "upsideDownModeDescription": "反转状态监控,如果服务可访问,则认为是故障。",
+    "maxRedirectDescription": "允许的最大重定向次数。设置为 0 禁用重定向。",
+    "enableGRPCTls": "允许通过 TLS 连接发送 gRPC 请求",
+    "grpcMethodDescription": "方法名会转换为小驼峰格式,例如 sayHello、check 等等",
+    "acceptedStatusCodesDescription": "选择被视为成功响应的状态码。",
+    "Maintenance": "维护",
+    "statusMaintenance": "维护",
+    "Schedule maintenance": "计划维护",
+    "Affected Monitors": "受影响的监控项",
+    "Pick Affected Monitors...": "选择受影响的监控项…",
+    "Start of maintenance": "维护开始",
+    "All Status Pages": "所有状态页面",
+    "Select status pages...": "选择状态页面…",
+    "recurringIntervalMessage": "每天一次 | 每 {0} 天一次",
+    "affectedMonitorsDescription": "选择受当前维护影响的监控项",
+    "affectedStatusPages": "在所选状态页面上显示此维护消息",
+    "atLeastOneMonitor": "至少选择一个受影响的监控项",
+    "passwordNotMatchMsg": "两次输入的密码不一致。",
+    "notificationDescription": "通知必须被分配给监控项才能正常工作。",
+    "keywordDescription": "在纯 HTML 或 JSON 响应中搜索关键字,区分大小写。",
+    "pauseDashboardHome": "暂停",
+    "deleteMonitorMsg": "确定要删除此监控项吗?",
+    "deleteMaintenanceMsg": "确定要删除此维护吗?",
+    "deleteNotificationMsg": "确定要为所有监控项删除此通知吗?",
+    "dnsPortDescription": "DNS 服务器端口,默认为 53,您可以在任何时候更改此端口.",
+    "resolverserverDescription": "默认服务器是 Cloudflare。您随时可以修改解析服务器。",
+    "rrtypeDescription": "选择要监控的资源记录类型",
+    "pauseMonitorMsg": "确定要暂停吗?",
+    "enableDefaultNotificationDescription": "新的监控项将默认启用此通知,您仍然为每个监控项单独禁用。",
+    "clearEventsMsg": "确定要删除此监控项的所有事件吗?",
+    "clearHeartbeatsMsg": "确定要删除此监控项的所有心跳状态吗?",
+    "confirmClearStatisticsMsg": "确定要删除所有统计信息吗?",
+    "importHandleDescription": "如果想跳过同名的监控项或消息通知,请选择“跳过已存在”。“覆盖”将删除所有现有的监控项和通知。",
+    "confirmImportMsg": "确定要导入备份吗?请确保已经选择了正确的导入选项。",
+    "twoFAVerifyLabel": "请输入令牌码以确认二次验证:",
+    "tokenValidSettingsMsg": "令牌码有效!您现在可以保存二次验证设置了。",
+    "confirmEnableTwoFAMsg": "确定要启用二次验证吗?",
+    "confirmDisableTwoFAMsg": "确定要禁用二次验证吗?",
+    "Settings": "设置",
+    "Dashboard": "仪表盘",
+    "New Update": "有新版本",
+    "Language": "语言",
+    "Appearance": "外观",
+    "Theme": "主题",
+    "General": "常规",
+    "Primary Base URL": "站点主 URL",
+    "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.": "证书有效期",
+    "day": "天",
+    "-day": " 天",
+    "hour": "小时",
+    "-hour": " 小时",
+    "Response": "响应",
+    "Ping": "Ping",
+    "Monitor Type": "监控类型",
+    "Keyword": "关键字",
+    "Friendly Name": "显示名称",
+    "URL": "URL",
+    "Hostname": "主机名",
+    "Port": "端口号",
+    "Heartbeat Interval": "心跳间隔",
+    "Retries": "重试次数",
+    "Heartbeat Retry Interval": "心跳重试间隔",
+    "Resend Notification if Down X times consequently": "连续失败时重复发送通知的间隔次数",
+    "Advanced": "高级",
+    "Upside Down Mode": "反转监控",
+    "Max. Redirects": "最大重定向次数",
+    "Accepted Status Codes": "有效状态码",
+    "Push URL": "推送 URL",
+    "needPushEvery": "您需要每 {0} 秒调用一次该 URL",
+    "pushOptionalParams": "可选参数:{0}",
+    "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": "启用身份验证",
+    "disableauth.message1": "是否确定 <strong>取消登录验证</strong>?",
+    "disableauth.message2": "这是为 <strong>有第三方认证</strong> 的用户提供的功能,如 Cloudflare Access",
+    "Please use this option carefully!": "请谨慎使用!",
+    "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": "重复密码",
+    "Import Backup": "导入备份",
+    "Export Backup": "导出备份",
+    "Export": "导出",
+    "Import": "导入",
+    "respTime": "响应时间(毫秒)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "默认开启",
+    "Apply on all existing monitors": "应用到所有现有监控项",
+    "Create": "创建",
+    "Clear Data": "清除数据",
+    "Events": "事件",
+    "Heartbeats": "心跳",
+    "Auto Get": "自动获取",
+    "backupDescription": "您可以将所有监控项和通知备份到 JSON 文件。",
+    "backupDescription2": "注意: 不包括历史状态和事件数据。",
+    "backupDescription3": "导出的文件可能包含敏感信息,例如通知的令牌信息,请小心存放!",
+    "alertNoFile": "请选择要导入的文件",
+    "alertWrongFileType": "请选择一个 JSON 文件",
+    "Clear all statistics": "清除所有统计数据",
+    "Skip existing": "跳过已存在",
+    "Overwrite": "覆盖",
+    "Options": "选项",
+    "Keep both": "全部保留",
+    "Verify Token": "验证令牌",
+    "Setup 2FA": "设置二次验证",
+    "Enable 2FA": "启用二次验证",
+    "Disable 2FA": "禁用二次验证",
+    "2FA Settings": "二次验证设置",
+    "Two Factor Authentication": "二次验证",
+    "Active": "激活",
+    "Inactive": "停用",
+    "Token": "令牌",
+    "Show URI": "显示 URI",
+    "Tags": "标签",
+    "Add New below or Select...": "在下面添加或选择…",
+    "Tag with this name already exist.": "相同名称的标签已存在。",
+    "Tag with this value already exist.": "相同内容的标签已存在。",
+    "color": "颜色",
+    "value (optional)": "值(可选)",
+    "Gray": "灰色",
+    "Red": "红色",
+    "Orange": "橙色",
+    "Green": "绿色",
+    "Blue": "蓝色",
+    "Indigo": "靛蓝",
+    "Purple": "紫色",
+    "Pink": "粉色",
+    "Search...": "搜索…",
+    "Avg. Ping": "平均 Ping",
+    "Avg. Response": "平均响应",
+    "Entry Page": "入口页面",
+    "statusPageNothing": "这里什么也没有,请添加一个分组或一个监控项。",
+    "No Services": "无服务",
+    "All Systems Operational": "所有服务运行正常",
+    "Partially Degraded Service": "部分服务出现故障",
+    "Degraded Service": "全部服务出现故障",
+    "Add Group": "添加分组",
+    "Add a monitor": "添加监控项",
+    "Edit Status Page": "编辑状态页面",
+    "Go to Dashboard": "前往仪表盘",
+    "Status Page": "状态页面",
+    "Status Pages": "状态页面",
+    "defaultNotificationName": "{notification} 通知({number})",
+    "here": "这里",
+    "Required": "必填",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "您可以从 {0} 获取 Token。",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "支持对话/群组/频道的 Chat ID",
+    "wayToGetTelegramChatID": "您可以发送一条消息给您的机器人,然后访问此链接来查看 chat_id:",
+    "YOUR BOT TOKEN HERE": "这里替换成您的 BOT TOKEN",
+    "chatIDNotFound": "未找到 Chat ID,请先给您的机器人发送一条消息。",
+    "webhook": "Webhook",
+    "Post URL": "Post URL",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} 适合现代的 HTTP 服务器,例如 Express.js",
+    "webhookFormDataDesc": "{multipart} 适合 PHP,其中 JSON 需要使用 {decodeFunction} 解码",
+    "webhookAdditionalHeadersTitle": "额外 Header",
+    "webhookAdditionalHeadersDesc": "设置通过此 Webhook 发送的额外 Header。",
+    "smtp": "电子邮件(SMTP)",
+    "secureOptionNone": "无 / STARTTLS(常用端口 25、587)",
+    "secureOptionTLS": "TLS(常用端口 465)",
+    "Ignore TLS Error": "忽略 TLS 错误",
+    "From Email": "发信人",
+    "emailCustomSubject": "邮件主题",
+    "To Email": "收信人",
+    "smtpCC": "抄送",
+    "smtpBCC": "密送",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "要获取,可以前往服务器设置 -> 整合 -> 创建 Webhook",
+    "Bot Display Name": "机器人显示名称",
+    "Prefix Custom Message": "自定义消息前缀",
+    "Hello @everyone is...": "{'@'}everyone,……",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "您可以在{0}了解如何获取 Webhook URL。",
+    "wayToGetZohoCliqURL": "您可以在{0}了解如何创建 Webhook URL。",
+    "signal": "Signal",
+    "Number": "号码",
+    "Recipients": "收件人",
+    "needSignalAPI": "您需要有一个支持 REST API 的 Signal 客户端。",
+    "wayToCheckSignalURL": "您可以通过下面的 URL 了解如何设置:",
+    "signalImportant": "重要:您不能混合设定收件人的分组和号码!",
+    "gotify": "Gotify",
+    "Application Token": "Application Token",
+    "Server URL": "服务器 URL",
+    "Priority": "优先级",
+    "slack": "Slack",
+    "Icon Emoji": "Emoji 图标",
+    "Channel Name": "频道名称",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "aboutWebhooks": "关于 Webhook 的更多信息:{0}",
+    "aboutChannelName": "如果您想绕过 Webhook 频道,请在 {0} 字段输入所需的频道名称。例如:#other-channel",
+    "aboutKumaURL": "如果保留 Uptime Kuma URL 为空,将会默认指向项目的 GitHub 页面。",
+    "emojiCheatSheet": "Emoji 速查:{0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (支持 50+ 种通知服务)",
+    "GoogleChat": "Google Chat(仅 Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "AliyunSMS": "阿里云短信服务",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "在 {0} 创建应用并获取机器人 Token",
+    "wayToGetKookGuildID": "在 Kook 设置中打开“开发者模式”,然后右键点击频道可获取其 ID",
+    "Guild ID": "频道 ID",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "User Key",
+    "Device": "设备",
+    "Message Title": "消息标题",
+    "Notification Sound": "通知铃声",
+    "More info on:": "更多信息:{0}",
+    "pushoverDesc1": "紧急优先级(2)会在一小时内每隔 30 秒重试一次。",
+    "pushoverDesc2": "如果您想发送通知给不同的设备,请填写“设备”字段。",
+    "SMS Type": "短信类型",
+    "octopushTypePremium": "Premium(快 - 推荐用于警报)",
+    "octopushTypeLowCost": "Low Cost(慢 - 有时会被运营商屏蔽)",
+    "checkPrice": "查看 {0} 的价格:",
+    "apiCredentials": "API Credentials",
+    "octopushLegacyHint": "您是否在使用旧版本的 Octopush(2011-2020)?",
+    "Check octopush prices": "查看 Octopush 的价格 {0}。",
+    "octopushPhoneNumber": "电话号码(国际格式,例如:+33612345678)",
+    "octopushSMSSender": "短信发送名称:3-11 位大小写字母、数字和空格(a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea 设备 ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "例如:{0}",
+    "Read more:": "了解更多:{0}",
+    "Status:": "状态:{0}",
+    "Read more": "了解更多",
+    "appriseInstalled": "Apprise 已安装",
+    "appriseNotInstalled": "Apprise 未安装。{0}",
+    "Access Token": "Access Token",
+    "Channel access token": "频道 Access Token",
+    "Line Developers Console": "Line 开发者控制台",
+    "lineDevConsoleTo": "Line 开发者控制台 - {0}",
+    "Basic Settings": "基本设置",
+    "User ID": "用户 ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "首先访问 {0},创建一个提供者和频道(Messaging API),然后您就可以从上面提到的菜单获取频道的 Access Token 和用户 ID。",
+    "Icon URL": "图标 URL",
+    "aboutIconURL": "您可以在“图标 URL”中提供一个图片链接来覆盖默认的资料图片。如果设置了 Emoji 图标则此字段会被忽略。",
+    "aboutMattermostChannelName": "您可以覆盖 Webhook 发送消息的默认频道,只需在“频道名称”字段中输入您想要的频道名。这需要在 Mattermost 的 Webhook 设置中启用。例如:#other-channel",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - 便宜但是慢,并且容易超负荷。仅限波兰地区的收信人。",
+    "promosmsTypeFlash": "SMS FLASH - 消息会自动显示在收信人设备上。仅限波兰地区的收信人。",
+    "promosmsTypeFull": "SMS FULL - 高级短信,您可以使用您自己的发信人名称(需要先注册)。对于警报来说更可靠。",
+    "promosmsTypeSpeed": "SMS SPEED - 最高优先级。非常快速可靠,但更贵(大约两倍 SMS FULL 的价格)。",
+    "promosmsPhoneNumber": "电话号码(波兰地区收信人可以不填区号)",
+    "promosmsSMSSender": "短信发信人名称:已注册的名称或以下默认值之一:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
+    "Feishu": "飞书",
+    "Feishu WebHookUrl": "飞书 WebHook URL",
+    "matrixHomeserverURL": "服务器 URL(包含 http(s):// 和可选的端口号)",
+    "Internal Room Id": "内部房间 ID",
+    "matrixDesc1": "您可以在 Matrix 客户端房间设置的高级选项内找到内部房间 ID。格式类似于 !QMdRCpUIfLwsfjxye6:home.server。",
+    "matrixDesc2": "请不要使用您自己的 Access Token,这将开放您所有的账户权限和您已加入房间的权限。我们强烈建议您创建一个新用户并邀请它至您接收通知的房间中。您可以运行以下命令来获取 Access Token:{0}",
+    "Method": "方法",
+    "Body": "请求体",
+    "Headers": "请求头",
+    "PushUrl": "推送 URL",
+    "HeadersInvalidFormat": "请求头不是有效的 JSON: ",
+    "BodyInvalidFormat": "请求体不是有效的 JSON: ",
+    "Monitor History": "监控历史",
+    "clearDataOlderThan": "保留监控历史数据 {0} 天。",
+    "PasswordsDoNotMatch": "密码不匹配",
+    "records": "记录",
+    "One record": "一条记录",
+    "steamApiKeyDescription": "要监控 Steam 游戏服务器,您需要 Steam Web-API 密钥。您可以在这里注册您的 API 密钥: ",
+    "Current User": "当前用户",
+    "topic": "Topic",
+    "topicExplanation": "要监控的 MQTT Topic",
+    "successMessage": "成功消息",
+    "successMessageExplanation": "视为成功的 MQTT 消息",
+    "recent": "最近",
+    "Done": "完成",
+    "Info": "信息",
+    "Security": "安全性",
+    "Steam API Key": "Steam API 密钥",
+    "Shrink Database": "压缩数据库",
+    "Pick a RR-Type...": "选择资源记录类型…",
+    "Pick Accepted Status Codes...": "选择有效的状态码…",
+    "Default": "默认",
+    "HTTP Options": "HTTP 选项",
+    "Create Incident": "创建事件",
+    "Title": "标题",
+    "Content": "内容",
+    "Style": "类型",
+    "info": "信息",
+    "warning": "警告",
+    "danger": "危险",
+    "error": "错误",
+    "critical": "关键",
+    "primary": "主要",
+    "light": "明亮",
+    "dark": "黑暗",
+    "Post": "发布",
+    "Please input title and content": "请输入标题和内容",
+    "Created": "创建时间",
+    "Last Updated": "更新时间",
+    "Unpin": "取消钉选",
+    "Switch to Light Theme": "切换到浅色主题",
+    "Switch to Dark Theme": "切换到深色主题",
+    "Show Tags": "显示标签",
+    "Hide Tags": "隐藏标签",
+    "Description": "描述",
+    "No monitors available.": "没有可用的监控项。",
+    "Add one": "添加一个",
+    "No Monitors": "没有监控项",
+    "Untitled Group": "无标题分组",
+    "Services": "服务",
+    "Discard": "放弃",
+    "Cancel": "取消",
+    "Powered by": "Powered by",
+    "shrinkDatabaseDescription": "触发 SQLite 数据库的 VACUUM 命令,如果您的数据库是在 1.10.0 版本之后创建的,则已启用 AUTO_VACUUM,不再需要此操作。",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API 用户名(包括 webapi_ 前缀)",
+    "serwersmsAPIPassword": "API 密码",
+    "serwersmsPhoneNumber": "电话号码",
+    "serwersmsSenderName": "SMS 发信人名称(需要在客户中心注册)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "电话号码",
+    "smseagleGroup": "通讯录群组名",
+    "smseagleContact": "通讯录联系人",
+    "smseagleRecipientType": "收信人类型",
+    "smseagleRecipient": "收信人(多个需用半角逗号分隔)",
+    "smseagleToken": "API Access token",
+    "smseagleUrl": "您的 SMSEagle 设备 URL",
+    "smseagleEncoding": "以 Unicode 发送",
+    "smseaglePriority": "消息优先级(0-9,默认为 0)",
+    "stackfield": "Stackfield",
+    "Customize": "自定义",
+    "Custom Footer": "自定义底部",
+    "Custom CSS": "自定义 CSS",
+    "smtpDkimSettings": "DKIM 设置",
+    "smtpDkimDesc": "请访问 Nodemailer DKIM {0} 了解配置方法。",
+    "documentation": "文档",
+    "smtpDkimDomain": "域名",
+    "smtpDkimKeySelector": "前缀选择器",
+    "smtpDkimPrivateKey": "密钥",
+    "smtpDkimHashAlgo": "哈希算法(可选)",
+    "smtpDkimheaderFieldNames": "包含在哈希计算对象内的 Header 列表(可选)",
+    "smtpDkimskipFields": "不包含在哈希计算对象内的 Header 列表(可选)",
+    "wayToGetPagerDutyKey": "您可以在 Service -> Service Directory -> (选择一个 Service) -> Integrations -> Add integration 页面中搜索“Events API V2”以获取此 Integration Key,更多信息请看{0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "自动标记为已解决或已读",
+    "do nothing": "不做任何操作",
+    "auto acknowledged": "自动标记为已读",
+    "auto resolve": "自动标记为已解决",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API 接入点",
+    "alertaEnvironment": "环境参数",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "报警时的严重性",
+    "alertaRecoverState": "恢复后的严重性",
+    "deleteStatusPageMsg": "您确认要删除此状态页吗?",
+    "Proxies": "代理",
+    "default": "默认",
+    "enabled": "启用",
+    "setAsDefault": "设为默认",
+    "deleteProxyMsg": "您确认要在所有监控项中删除此代理吗?",
+    "proxyDescription": "代理必须配置到至少一个监控项后才会工作。",
+    "enableProxyDescription": "此代理必须启用才能对监控项的网络请求起作用。您可以通过修改激活状态,临时在所有监控项中禁用此代理。",
+    "setAsDefaultProxyDescription": "此代理会对新创建的监控项默认激活,您仍可以在监控项配置中单独禁用此代理。",
+    "Certificate Chain": "证书链",
+    "Valid": "有效",
+    "Invalid": "无效",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "短信模板必须包含以下变量:",
+    "Bark Endpoint": "Bark 接入点",
+    "Bark Group": "Bark 群组",
+    "Bark Sound": "Bark 铃声",
+    "DingDing": "钉钉自定义机器人",
+    "WebHookUrl": "钉钉自定义机器人 Webhook 地址",
+    "SecretKey": "钉钉自定义机器人加签密钥",
+    "For safety, must use secret key": "出于安全考虑,必须使用加签密钥",
+    "Device Token": "Apple Device Token",
+    "Platform": "平台",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "华为",
+    "High": "高",
+    "Retry": "重试次数",
+    "Topic": "Gorush Topic",
+    "WeCom": "企业微信群机器人",
+    "WeCom Bot Key": "企业微信群机器人 Key",
+    "Setup Proxy": "设置代理",
+    "Proxy Protocol": "代理协议",
+    "Proxy Server": "代理服务器",
+    "Server Address": "服务器地址",
+    "Proxy server has authentication": "代理服务器启用了身份验证功能",
+    "User": "用户名",
+    "Installed": "已安装",
+    "Not installed": "未安装",
+    "Running": "运行中",
+    "Not running": "未运行",
+    "Remove Token": "移除 Token",
+    "Start": "启动",
+    "Stop": "停止",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "添加新的状态页",
+    "Slug": "路径",
+    "Accept characters:": "可接受的字符:",
+    "startOrEndWithOnly": "开头和结尾必须为 {0}",
+    "No consecutive dashes": "不能有连续的破折号",
+    "Next": "下一步",
+    "The slug is already taken. Please choose another slug.": "该路径已被使用。请选择其他路径。",
+    "No Proxy": "无代理",
+    "Authentication": "验证",
+    "HTTP Basic Auth": "HTTP 基础身份验证",
+    "New Status Page": "新的状态页",
+    "Page Not Found": "未找到该页面",
+    "Reverse Proxy": "反向代理",
+    "Backup": "备份",
+    "About": "关于",
+    "wayToGetCloudflaredURL": "(可从 {0} 下载 cloudflared)",
+    "cloudflareWebsite": "Cloudflare 网站",
+    "Message:": "信息:",
+    "Don't know how to get the token? Please read the guide:": "不知道如何获取 Token?请阅读指南:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您正在通过 Cloudflare Tunnel 访问网站,则停止可能会导致当前连接断开。您确定要停止吗?请输入密码以确认。",
+    "HTTP Headers": "HTTP 头",
+    "Trust Proxy": "可信的代理类字段",
+    "Other Software": "其他软件",
+    "For example: nginx, Apache and Traefik.": "例如:nginx、Apache 和 Traefik。",
+    "Please read": "请阅读",
+    "Subject:": "颁发给:",
+    "Valid To:": "有效期至:",
+    "Days Remaining:": "剩余有效天数:",
+    "Issuer:": "颁发者:",
+    "Fingerprint:": "指纹:",
+    "No status pages": "无状态页",
+    "Domain Name Expiry Notification": "域名到期时通知",
+    "Proxy": "代理",
+    "Date Created": "创建于",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP 地址",
+    "onebotMessageType": "OneBot 消息类型",
+    "onebotGroupMessage": "群聊",
+    "onebotPrivateMessage": "私聊",
+    "onebotUserOrGroupId": "群组/用户 ID",
+    "onebotSafetyTips": "出于安全原因,请务必设置 AccessToken",
+    "PushDeer Key": "PushDeer Key",
+    "Footer Text": "底部自定义文本",
+    "Show Powered By": "显示 Powered By",
+    "Domain Names": "域名",
+    "signedInDisp": "当前用户: {0}",
+    "signedInDispDisabled": "已禁用身份验证",
+    "RadiusSecret": "Radius 共享机密",
+    "RadiusSecretDescription": "客户端和服务器之间共享的密钥",
+    "RadiusCalledStationId": "NAS 网络访问服务器号码(Called Station Id)",
+    "RadiusCalledStationIdDescription": "所访问的服务器的标识",
+    "RadiusCallingStationId": "呼叫方号码(Calling Station Id)",
+    "RadiusCallingStationIdDescription": "发出请求的设备的标识",
+    "Certificate Expiry Notification": "证书到期时通知",
+    "API Username": "API Username",
+    "API Key": "API Key",
+    "Recipient Number": "收件人手机号码",
+    "From Name/Number": "发件人名称/手机号码",
+    "Leave blank to use a shared sender number.": "留空以使用平台共享的发件人手机号码",
+    "Octopush API Version": "Octopush API 版本",
+    "Legacy Octopush-DM": "旧版本 Octopush-DM",
+    "endpoint": "接入点",
+    "octopushAPIKey": "控制台 HTTP API credentials 里的 \"API key\"",
+    "octopushLogin": "控制台 HTTP API credentials 里的 \"Login\"",
+    "promosmsLogin": "API 登录名",
+    "promosmsPassword": "API 密码",
+    "pushoversounds pushover": "Pushover(默认)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm(长铃声)",
+    "pushoversounds climb": "Climb(长铃声)",
+    "pushoversounds persistent": "Persistent(长铃声)",
+    "pushoversounds echo": "Pushover Echo(长铃声)",
+    "pushoversounds updown": "Up Down(长铃声)",
+    "pushoversounds vibrate": "仅震动",
+    "pushoversounds none": "无(禁音)",
+    "pushyAPIKey": "API 密钥",
+    "pushyToken": "设备 Token",
+    "Show update if available": "有更新时通知",
+    "Also check beta release": "一并检查 Beta 版更新",
+    "Using a Reverse Proxy?": "正在使用反向代理?",
+    "Check how to config it for WebSocket": "查看如何将反向代理与 WebSocket 一起使用",
+    "Steam Game Server": "Steam 游戏服务器",
+    "Most likely causes:": "最可能的原因:",
+    "The resource is no longer available.": "您所请求的资源已不再可用;",
+    "There might be a typing error in the address.": "您输入的地址可能有误。",
+    "What you can try:": "您可以尝试以下操作:",
+    "Retype the address.": "重新输入地址;",
+    "Go back to the previous page.": "返回到上一页面。",
+    "Coming Soon": "即将推出",
+    "wayToGetClickSendSMSToken": "您可以在{0}获取 API Username 和 API Key。",
+    "Connection String": "连接字符串",
+    "Query": "查询语句",
+    "settingsCertificateExpiry": "TLS 证书过期通知",
+    "certificationExpiryDescription": "HTTPS 监控项发现被监控目标的 TLS 证书剩余有效期少于以下天数时将发出通知:",
+    "Setup Docker Host": "配置 Docker 宿主信息",
+    "Connection Type": "连接方式",
+    "Docker Daemon": "Docker 守护进程",
+    "deleteDockerHostMsg": "您确定您要删除此 Docker 宿主设置吗?这会影响所有 Docker 监控项",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker 容器",
+    "Container Name / ID": "容器名称 / ID",
+    "Docker Host": "Docker 宿主",
+    "Docker Hosts": "Docker 宿主",
+    "ntfy Topic": "ntfy Topic",
+    "Domain": "域名",
+    "Workstation": "工作站",
+    "disableCloudflaredNoAuthMsg": "您现在正处于 No Auth 模式,无需输入密码",
+    "trustProxyDescription": "信任 'X-Forwarded-*' 头。如果您的 Uptime Kuma 是通过 Nginx 或 Apache 等反代服务对外提供访问的话,则您应当启用本功能以获取正确的客户端 IP。",
+    "wayToGetLineNotifyToken": "您可以在 {0} 获取 Access token",
+    "Examples": "例如",
+    "Home Assistant URL": "Home Assistant 地址",
+    "Long-Lived Access Token": "长期访问令牌",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "长期访问令牌可通过点击左下角您的用户名,滚动到页面底部并点击 Create Token 按钮获取。",
+    "Notification Service": "Notification Service",
+    "default: notify all devices": "默认:通知所有设备",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "通知服务的列表可在 Home Assistant 中的 Developer Tools > Services 通过搜索您的设备或手机的名称来获得。",
+    "Automations can optionally be triggered in Home Assistant:": "可以在 Home Assistant 使用下列模板设置自动化操作的触发条件:",
+    "Trigger type:": "触发类型:",
+    "Event type:": "事件类型:",
+    "Event data:": "事件数据:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "然后您可以选择关联操作,例如切换到 RGB 灯发出红光的场景",
+    "Frontend Version": "前端版本",
+    "Frontend Version do not match backend version!": "前端版本与后端版本不匹配!",
+    "Base URL": "API 基础地址",
+    "goAlertInfo": "GoAlert 是一个用于呼叫调度、自动汇报和通知(如 SMS 或语音呼叫)的开源应用程序。在正确的时间以正确的方式自动让正确的人参与!{0}",
+    "goAlertIntegrationKeyInfo": "使用形如 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 的通用 API 集成密钥,通常是复制来的链接中的 token 参数值。",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "已弃用:由于大量新功能的加入,以及备份功能没有时时维护,现在备份功能已经无法生成完整的备份和恢复完整的设置。",
+    "backupRecommend": "请改为直接备份 docker 卷或者数据文件夹(./data/)。",
+    "Optional": "可选的",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API 文档在",
+    "Gateway Type": "网关类型",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "可用的分隔符:",
+    "or": "或",
+    "recurringInterval": "时间间隔",
+    "Recurring": "重复",
+    "strategyManual": "手动启用/禁用",
+    "warningTimezone": "使用服务器时区",
+    "weekdayShortMon": "周一",
+    "weekdayShortTue": "周二",
+    "weekdayShortWed": "周三",
+    "weekdayShortThu": "周四",
+    "weekdayShortFri": "周五",
+    "weekdayShortSat": "周六",
+    "weekdayShortSun": "周日",
+    "dayOfWeek": "每周计划",
+    "dayOfMonth": "每月计划",
+    "lastDay": "结束日",
+    "lastDay1": "每月最后一天",
+    "lastDay2": "每月倒数第二天",
+    "lastDay3": "每月倒数第三天",
+    "lastDay4": "每月倒数第四天",
+    "No Maintenance": "无维护计划",
+    "pauseMaintenanceMsg": "确定要暂停吗?",
+    "maintenanceStatus-under-maintenance": "正在维护",
+    "maintenanceStatus-inactive": "未启用",
+    "maintenanceStatus-scheduled": "已计划",
+    "maintenanceStatus-ended": "已结束",
+    "maintenanceStatus-unknown": "未知",
+    "Display Timezone": "显示时区",
+    "Server Timezone": "服务器时区",
+    "statusPageMaintenanceEndDate": "结束时间",
+    "IconUrl": "图标 URL",
+    "Enable DNS Cache": "启用 DNS 缓存",
+    "Enable": "启用",
+    "Disable": "禁用",
+    "dnsCacheDescription": "可能无法在某些 IPv6 环境工作,如果遇到问题请禁用。",
+    "Single Maintenance Window": "单一时间窗口",
+    "Maintenance Time Window of a Day": "每日维护时间窗口",
+    "Effective Date Range": "生效日期范围",
+    "Schedule Maintenance": "计划维护",
+    "Date and Time": "日期时间",
+    "DateTime Range": "日期时间范围",
+    "Strategy": "策略",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "启用 TLS",
+    "Proto Service Name": "Proto 服务名称",
+    "Proto Method": "Proto 方法",
+    "Proto Content": "Proto 内容",
+    "Economy": "经济",
+    "Lowcost": "低价",
+    "high": "高价",
+    "General Monitor Type": "常规监控类型",
+    "Passive Monitor Type": "被动监控类型",
+    "Specific Monitor Type": "针对监控类型"
+}
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
new file mode 100644
index 00000000..0bc07786
--- /dev/null
+++ b/src/lang/zh-HK.json
@@ -0,0 +1,388 @@
+{
+    "languageName": "繁體中文 (香港)",
+    "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": "暫停",
+    "pauseDashboardHome": "暫停",
+    "Name": "名稱",
+    "Status": "狀態",
+    "DateTime": "日期時間",
+    "Message": "內容",
+    "No important events": "沒有重要事件",
+    "Resume": "恢復",
+    "Edit": "編輯",
+    "Delete": "刪除",
+    "Current": "目前",
+    "Uptime": "上線率",
+    "Cert Exp.": "証書期限",
+    "day": "日",
+    "-day": "日",
+    "hour": "小時",
+    "-hour": "小時",
+    "checkEverySecond": "每 {0} 秒檢查一次",
+    "Response": "反應時間",
+    "Ping": "反應時間",
+    "Monitor Type": "監測器類型",
+    "Keyword": "關鍵字",
+    "Friendly Name": "名稱",
+    "URL": "網址 URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Heartbeat Interval": "檢查間距",
+    "Retries": "重試數次確定為離線",
+    "retriesDescription": "重試多少次後才判定為離線及傳送通知。如數值為 0 會即判定為離線及傳送通知。",
+    "Advanced": "進階",
+    "ignoreTLSError": "忽略 TLS/SSL 錯誤",
+    "Upside Down Mode": "反轉模式",
+    "upsideDownModeDescription": "反轉狀態,如網址是可正常瀏覽,會被判定為 '離線/DOWN'",
+    "Max. Redirects": "跟隨重新導向 (Redirect) 的次數",
+    "maxRedirectDescription": "設為 0 即不跟蹤",
+    "Accepted Status Codes": "接受為上線的 HTTP 狀態碼",
+    "acceptedStatusCodesDescription": "可多選",
+    "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": "確認新密碼",
+    "passwordNotMatchMsg": "密碼不一致",
+    "Update Password": "更新密碼",
+    "Disable Auth": "取消登入認証",
+    "Enable Auth": "開啟登入認証",
+    "disableauth.message1": "你是否確認<strong>取消登入認証</strong>?",
+    "disableauth.message2": "這個功能是設計給已有<strong>第三方認証</strong>的用家,例如 Cloudflare Access。",
+    "Please use this option carefully!": "請小心使用。",
+    "Logout": "登出",
+    "notificationDescription": "新增後,你需要在監測器裡啟用。",
+    "Leave": "離開",
+    "I understand, please disable": "我明白,請取消登入認証",
+    "Confirm": "確認",
+    "Yes": "是",
+    "No": "否",
+    "Username": "帳號",
+    "Password": "密碼",
+    "Remember me": "記住我",
+    "Login": "登入",
+    "No Monitors, please": "沒有監測器,請",
+    "add one": "新增",
+    "Notification Type": "通知類型",
+    "Email": "電郵",
+    "Test": "測試",
+    "keywordDescription": "搜索 HTML 或 JSON 裡是否有出現關鍵字(注意英文大細階)",
+    "Certificate Info": "憑證詳細資料",
+    "deleteMonitorMsg": "是否確定刪除這個監測器?",
+    "deleteNotificationMsg": "是否確定刪除這個通知設定?如監測器啟用了這個通知,將會收不到通知。",
+    "Resolver Server": "DNS 伺服器",
+    "Resource Record Type": "DNS 記錄類型",
+    "resolverserverDescription": "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。",
+    "rrtypeDescription": "請選擇 DNS 記錄類型",
+    "pauseMonitorMsg": "是否確定暫停?",
+    "Last Result": "最後結果",
+    "Create your admin account": "建立管理員帳號",
+    "Repeat Password": "重複密碼",
+    "respTime": "反應時間 (ms)",
+    "notAvailableShort": "N/A",
+    "Create": "建立",
+    "clearEventsMsg": "是否確定刪除這個監測器的所有事件?",
+    "clearHeartbeatsMsg": "是否確定刪除這個監測器的所有脈搏資料?",
+    "confirmClearStatisticsMsg": "是否確定刪除所有監測器的脈搏資料?(您的監測器會繼續正常運作)",
+    "Clear Data": "清除資料",
+    "Events": "事件",
+    "Heartbeats": "脈搏",
+    "Auto Get": "自動獲取",
+    "enableDefaultNotificationDescription": "新增監測器時這個通知會預設啟用,當然每個監測器亦可分別控制開關。",
+    "Default enabled": "預設通知",
+    "Also apply to existing monitors": "同時取用至目前所有監測器",
+    "Export": "匯出",
+    "Import": "匯入",
+    "backupDescription": "您可以備份所有監測器及所有通知。",
+    "backupDescription2": "註:此備份不包括歷史記錄。",
+    "backupDescription3": "此備份可能包含了一些敏感資料如通知裡的 Token,請小心保存備份。",
+    "alertNoFile": "請選擇一個檔案",
+    "alertWrongFileType": "請選擇 JSON 檔案",
+    "twoFAVerifyLabel": "Please type in your token to verify that 2FA is working",
+    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
+    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
+    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "Apply on all existing monitors": "套用至目前所有監測器",
+    "Verify Token": "驗証 Token",
+    "Setup 2FA": "設定 2FA",
+    "Enable 2FA": "開啟 2FA",
+    "Disable 2FA": "關閉 2FA",
+    "2FA Settings": "2FA 設定",
+    "Two Factor Authentication": "雙重認證",
+    "Active": "生效",
+    "Inactive": "未生效",
+    "Token": "Token",
+    "Show URI": "顯示 URI",
+    "Clear all statistics": "清除所有歷史記錄",
+    "retryCheckEverySecond": "Retry every {0} seconds.",
+    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
+    "confirmImportMsg": "Are you sure to import the backup? Please make sure you've selected the right import option.",
+    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
+    "Import Backup": "匯入備份",
+    "Export Backup": "匯出備份",
+    "Skip existing": "略過已存在的",
+    "Overwrite": "覆蓋",
+    "Options": "選項",
+    "Keep both": "兩者並存",
+    "Tags": "標籤",
+    "Add New below or Select...": "Add New below or Select...",
+    "Tag with this name already exist.": "Tag with this name already exist.",
+    "Tag with this value already exist.": "Tag with this value already exist.",
+    "color": "顏色",
+    "value (optional)": "值 (非必需)",
+    "Gray": "灰",
+    "Red": "紅",
+    "Orange": "橙",
+    "Green": "綠",
+    "Blue": "藍",
+    "Indigo": "靛",
+    "Purple": "紫",
+    "Pink": "粉紅",
+    "Search...": "搜尋...",
+    "Avg. Ping": "平均反應時間",
+    "Avg. Response": "平均反應時間",
+    "Entry Page": "Entry Page",
+    "statusPageNothing": "Nothing here, please add a group or a monitor.",
+    "No Services": "沒有服務",
+    "All Systems Operational": "一切正常",
+    "Partially Degraded Service": "部份服務受阻",
+    "Degraded Service": "服務受阻",
+    "Add Group": "新增群組",
+    "Add a monitor": " 新增監測器",
+    "Edit Status Page": "編輯 Status Page",
+    "Go to Dashboard": "前往主控台",
+    "Status Page": "Status Page",
+    "Status Pages": "Status Pages",
+    "telegram": "Telegram",
+    "webhook": "Webhook",
+    "smtp": "電郵 (SMTP)",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (支援 50 多種通知)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "deleteStatusPageMsg": "是否確定刪除這個 Status Page?",
+    "Push URL": "推送網址",
+    "needPushEvery": "您應每 {0} 秒呼叫此網址。",
+    "pushOptionalParams": "選填參數:{0}",
+    "defaultNotificationName": "我的 {notification} 通知 ({number})",
+    "here": "此處",
+    "Required": "必填",
+    "Bot Token": "機器人權杖",
+    "wayToGetTelegramToken": "您可以從 {0} 取得 Token。",
+    "Chat ID": "聊天 ID",
+    "supportTelegramChatID": "支援 對話/群組/頻道的聊天 ID",
+    "wayToGetTelegramChatID": "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
+    "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
+    "chatIDNotFound": "找不到 Chat ID;請先傳送訊息給機器人",
+    "Post URL": "Post 網址",
+    "Content Type": "Content Type",
+    "webhookJsonDesc": "{0} 適合任何現代的 HTTP 伺服器,如 Express.js",
+    "webhookFormDataDesc": "{multipart} 適合 PHP。 JSON 必須先經由 {decodeFunction} 剖析。",
+    "secureOptionNone": "無 / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "忽略 TLS 錯誤",
+    "From Email": "寄件人",
+    "emailCustomSubject": "自訂主旨",
+    "To Email": "收件人",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook 網址",
+    "wayToGetDiscordURL": "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
+    "Bot Display Name": "機器人顯示名稱",
+    "Prefix Custom Message": "前綴自訂訊息",
+    "Webhook URL": "Webhook 網址",
+    "wayToGetTeamsURL": "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
+    "Number": "號碼",
+    "Recipients": "收件人",
+    "needSignalAPI": "您需要有 REST API 的 Signal 客戶端。",
+    "wayToCheckSignalURL": "您可以前往下列網址以了解如何設定:",
+    "signalImportant": "注意: 不得混合收件人的群組和號碼!",
+    "Application Token": "應用程式權杖",
+    "Server URL": "伺服器網址",
+    "Priority": "優先度",
+    "Icon Emoji": "Emoji 圖示",
+    "Channel Name": "頻道名稱",
+    "Uptime Kuma URL": "Uptime Kuma 網址",
+    "aboutWebhooks": "更多關於 Webhook 的資訊: {0}",
+    "aboutChannelName": "如果您不想使用 Webhook 頻道,請在 {0} 頻道名稱欄位填入您想使用的頻道。例如: #其他頻道",
+    "aboutKumaURL": "如果您未填入 Uptime Kuma 網址。將預設使用專案 Github 頁面。",
+    "emojiCheatSheet": "Emoji 一覽表: {0}",
+    "PushByTechulus": "Push by Techulus",
+    "clicksendsms": "ClickSend SMS",
+    "GoogleChat": "Google Chat (僅限 Google Workspace)",
+    "User Key": "使用者金鑰",
+    "Device": "裝置",
+    "Message Title": "訊息標題",
+    "Notification Sound": "通知音效",
+    "More info on:": "更多資訊: {0}",
+    "pushoverDesc1": "緊急優先度 (2) 的重試間隔為 30 秒並且會在 1 小時後過期。",
+    "pushoverDesc2": "如果您想要傳送通知到不同裝置,請填寫裝置欄位。",
+    "SMS Type": "簡訊類型",
+    "octopushTypePremium": "Premium (快速 - 建議用於警報)",
+    "octopushTypeLowCost": "Low Cost (緩慢 - 有時會被營運商阻擋)",
+    "checkPrice": "查看 {0} 價格:",
+    "apiCredentials": "API 認證",
+    "octopushLegacyHint": "您使用的是舊版的 Octopush (2011-2020) 還是新版?",
+    "Check octopush prices": "查看 octopush 價格 {0}。",
+    "octopushPhoneNumber": "電話號碼 (intl 格式,例如:+33612345678) ",
+    "octopushSMSSender": "簡訊寄件人名稱:3-11位英數字元及空白 (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea 裝置 ID",
+    "Apprise URL": "Apprise 網址",
+    "Example:": "範例:{0}",
+    "Read more:": "深入瞭解:{0}",
+    "Status:": "狀態:{0}",
+    "Read more": "深入瞭解",
+    "appriseInstalled": "已安裝 Apprise。",
+    "appriseNotInstalled": "尚未安裝 Apprise。{0}",
+    "Access Token": "存取權杖",
+    "Channel access token": "頻道存取權杖",
+    "Line Developers Console": "Line 開發者控制台",
+    "lineDevConsoleTo": "Line 開發者控制台 - {0}",
+    "Basic Settings": "基本設定",
+    "User ID": "使用者 ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "首先,前往 {0},建立 provider 和 channel (Messaging API)。接著您就可以從上面提到的選單項目中取得頻道存取權杖及使用者 ID。",
+    "Icon URL": "圖示網址",
+    "aboutIconURL": "您可以在 \"圖示網址\" 中提供圖片網址以覆蓋預設個人檔案圖片。若已設定 Emoji 圖示,將忽略此設定。",
+    "aboutMattermostChannelName": "您可以在 \"頻道名稱\" 欄位中填寫頻道名稱以覆蓋 Webhook 的預設頻道。必須在 Mattermost 的 Webhook 設定中啟用。例如:#其他頻道",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件人。",
+    "promosmsTypeFlash": "SMS FLASH - 訊息會自動在收件人的裝置上顯示。僅限位於波蘭的收件人。",
+    "promosmsTypeFull": "SMS FULL - 高級版,您可以使用您的寄件人名稱 (必須先註冊名稱。對於警報來說十分可靠。",
+    "promosmsTypeSpeed": "SMS SPEED - 系統中的最高優先度。快速、可靠,但昂貴 (約 SMS FULL 的兩倍價格)。",
+    "promosmsPhoneNumber": "電話號碼 (若收件人位於波蘭則無需輸入區域代碼)",
+    "promosmsSMSSender": "簡訊寄件人名稱:預先註冊的名稱或以下的預設名稱:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
+    "Feishu WebHookUrl": "飛書 WebHook 網址",
+    "matrixHomeserverURL": "Homeserver 網址 (開頭為 http(s)://,結尾可能帶連接埠)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "您可以在 Matrix 客戶端的房間設定中的進階選項找到 internal room ID。應該看起來像 !QMdRCpUIfLwsfjxye6:home.server。",
+    "matrixDesc2": "使用您自己的 Matrix 使用者存取權杖將賦予存取您的帳號和您加入的房間的完整權限。建議建立新使用者,並邀請至您想要接收通知的房間中。您可以執行 {0} 以取得存取權杖",
+    "Method": "方法",
+    "Body": "主體",
+    "Headers": "標頭",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "要求標頭不是有效的 JSON:",
+    "BodyInvalidFormat": "請求主體不是有效的 JSON:",
+    "Monitor History": "監測器歷史紀錄",
+    "clearDataOlderThan": "保留 {0} 天內的監測器歷史紀錄。",
+    "PasswordsDoNotMatch": "密碼不相符。",
+    "records": "記錄",
+    "One record": "一項記錄",
+    "Showing {from} to {to} of {count} records": "正在顯示 {count} 項記錄中的 {from} 至 {to} 項",
+    "steamApiKeyDescription": "若要監測 Steam 遊戲伺服器,您將需要 Steam Web-API 金鑰。您可以在此註冊您的 API 金鑰:",
+    "Current User": "目前使用者",
+    "recent": "最近",
+    "Done": "完成",
+    "Info": "資訊",
+    "Security": "安全性",
+    "Steam API Key": "Steam API 金鑰",
+    "Shrink Database": "壓縮資料庫",
+    "Pick a RR-Type...": "選擇資源記錄類型...",
+    "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
+    "Default": "預設",
+    "HTTP Options": "HTTP 選項",
+    "Create Incident": "建立事件",
+    "Title": "標題",
+    "Content": "內容",
+    "Style": "樣式",
+    "info": "資訊",
+    "warning": "警告",
+    "danger": "危險",
+    "primary": "主要",
+    "light": "淺色",
+    "dark": "暗色",
+    "Post": "發佈",
+    "Please input title and content": "請輸入標題及內容",
+    "Created": "建立",
+    "Last Updated": "最後更新",
+    "Unpin": "取消釘選",
+    "Switch to Light Theme": "切換至淺色佈景主題",
+    "Switch to Dark Theme": "切換至深色佈景主題",
+    "Show Tags": "顯示標籤",
+    "Hide Tags": "隱藏標籤",
+    "Description": "描述",
+    "No monitors available.": "沒有可用的監測器。",
+    "Add one": "新增一個",
+    "No Monitors": "無監測器",
+    "Untitled Group": "未命名群組",
+    "Services": "服務",
+    "Discard": "捨棄",
+    "Cancel": "取消",
+    "shrinkDatabaseDescription": "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立,AUTO_VACUUM 已自動啟用,則無需此操作。",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API 使用者名稱 (包括 webapi_ 前綴)",
+    "serwersmsAPIPassword": "API 密碼",
+    "serwersmsPhoneNumber": "電話號碼",
+    "serwersmsSenderName": "SMS 寄件人名稱 (由客戶入口網站註冊)",
+    "stackfield": "Stackfield",
+    "smtpDkimSettings": "DKIM 設定",
+    "smtpDkimDesc": "請參考 Nodemailer DKIM {0} 使用方式。",
+    "documentation": "文件",
+    "smtpDkimDomain": "網域名稱",
+    "smtpDkimKeySelector": "DKIM 選取器",
+    "smtpDkimPrivateKey": "私密金鑰",
+    "smtpDkimHashAlgo": "雜湊演算法 (選填)",
+    "smtpDkimheaderFieldNames": "要簽署的郵件標頭 (選填)",
+    "smtpDkimskipFields": "不簽署的郵件標頭 (選填)",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "環境",
+    "alertaApiKey": "API 金鑰",
+    "alertaAlertState": "警示狀態",
+    "alertaRecoverState": "恢復狀態",
+    "Proxies": "代理伺服器",
+    "default": "預設",
+    "enabled": "啟用",
+    "setAsDefault": "設為預設",
+    "deleteProxyMsg": "您確定要為所有監測器刪除此代理伺服器嗎?",
+    "proxyDescription": "必須將代理伺服器指派給監測器才能運作。",
+    "enableProxyDescription": "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
+    "setAsDefaultProxyDescription": "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
+    "Maintenance": "維護",
+    "statusMaintenance": "維護中",
+    "Enable DNS Cache": "啟用 DNS 快取",
+    "Enable": "啟用",
+    "Disable": "停用"
+}
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
new file mode 100644
index 00000000..142ebf2d
--- /dev/null
+++ b/src/lang/zh-TW.json
@@ -0,0 +1,672 @@
+{
+    "languageName": "繁體中文 (台灣)",
+    "checkEverySecond": "每 {0} 秒檢查一次",
+    "retryCheckEverySecond": "每 {0} 秒重試一次",
+    "resendEveryXTimes": "每 {0} 次便重新傳送",
+    "resendDisabled": "重新傳送已停用",
+    "retriesDescription": "在服務被標記為離線並傳送通知前的最大重試次數",
+    "ignoreTLSError": "忽略 HTTPS 網站的 TLS/SSL 錯誤",
+    "upsideDownModeDescription": "反轉顯示狀態。若服務可以連線,將顯示離線。",
+    "maxRedirectDescription": "最大重新導向跟隨次數。設為 0 將停用重新導向。",
+    "enableGRPCTls": "允許以 TLS 連線傳送 gRPC 要求",
+    "grpcMethodDescription": "方法名稱將轉換至駝峰式命名,如 sayHello、check 等。",
+    "acceptedStatusCodesDescription": "選擇視為成功回應的狀態碼。",
+    "Maintenance": "維護",
+    "statusMaintenance": "維護",
+    "Schedule maintenance": "排程維護",
+    "Affected Monitors": "受影響的監測器",
+    "Pick Affected Monitors...": "挑選受影響的監測器...",
+    "Start of maintenance": "維護起始",
+    "All Status Pages": "所有狀態頁",
+    "Select status pages...": "選擇狀態頁...",
+    "recurringIntervalMessage": "每日執行 | 每 {0} 天執行",
+    "affectedMonitorsDescription": "選擇受目前維護影響的監測器",
+    "affectedStatusPages": "在已選取的狀態頁中顯示此維護訊息",
+    "atLeastOneMonitor": "至少選擇一個受影響的監測器",
+    "passwordNotMatchMsg": "密碼不相符。",
+    "notificationDescription": "必須將通知指派給監測器才能運作。",
+    "keywordDescription": "HTML 或 JSON 回應的搜尋關鍵字。區分大小寫。",
+    "pauseDashboardHome": "暫停",
+    "deleteMonitorMsg": "您確定要刪除此監測器嗎?",
+    "deleteMaintenanceMsg": "您確定要刪除此維護嗎?",
+    "deleteNotificationMsg": "您確定要為所有監測器刪除此通知嗎?",
+    "dnsPortDescription": "DNS 伺服器連接埠。預設為 53。您可以隨時變更連接埠。",
+    "resolverserverDescription": "Cloudflare 為預設伺服器。您可以隨時更換解析伺服器。",
+    "rrtypeDescription": "選擇您想要監測的資源記錄類型",
+    "pauseMonitorMsg": "您確定要暫停嗎?",
+    "enableDefaultNotificationDescription": "預設情況下,新監測器將啟用此通知。您仍可分別停用各監測器的通知。",
+    "clearEventsMsg": "您確定要刪除此監測器的所有事件嗎?",
+    "clearHeartbeatsMsg": "您確定要刪除此監測器的所有心跳嗎?",
+    "confirmClearStatisticsMsg": "您確定要刪除所有統計資料嗎?",
+    "importHandleDescription": "若您想跳過所有相同名稱的監測器或通知,請選擇 '略過現有'。選擇 '覆寫' 將刪除所有現有的監測器及通知。",
+    "confirmImportMsg": "您確定要匯入備份嗎?請確認是否選擇正確的匯入設定。",
+    "twoFAVerifyLabel": "請輸入權杖以驗證雙步驟驗證:",
+    "tokenValidSettingsMsg": "權杖有效!您可以儲存雙步驟驗證設定了。",
+    "confirmEnableTwoFAMsg": "您確定要啟用雙步驟驗證嗎?",
+    "confirmDisableTwoFAMsg": "您確定要停用雙步驟驗證嗎?",
+    "Settings": "設定",
+    "Dashboard": "儀表板",
+    "New Update": "新版本",
+    "Language": "語言",
+    "Appearance": "外觀",
+    "Theme": "主題",
+    "General": "一般",
+    "Primary Base URL": "主要基底網址",
+    "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.": "憑證期限",
+    "day": "天",
+    "-day": "天",
+    "hour": "小時",
+    "-hour": "小時",
+    "Response": "回應",
+    "Ping": "Ping",
+    "Monitor Type": "監測器類型",
+    "Keyword": "關鍵字",
+    "Friendly Name": "易記名稱",
+    "URL": "網址",
+    "Hostname": "主機名稱",
+    "Port": "連接埠",
+    "Heartbeat Interval": "心跳間隔",
+    "Retries": "重試次數",
+    "Heartbeat Retry Interval": "心跳重試間隔",
+    "Resend Notification if Down X times consequently": "若 X 次心跳皆離線,重新傳送通知",
+    "Advanced": "進階",
+    "Upside Down Mode": "顛倒模式",
+    "Max. Redirects": "最大重新導向次數",
+    "Accepted Status Codes": "可接受的狀態碼",
+    "Push URL": "推送網址",
+    "needPushEvery": "您應每 {0} 秒呼叫此網址。",
+    "pushOptionalParams": "選填參數:{0}",
+    "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": "啟用驗證",
+    "disableauth.message1": ">你是否要<strong>取消登入驗證</strong>?",
+    "disableauth.message2": "此功能是設計給已有<strong>第三方認證</strong>的使用者,例如 Cloudflare Access。",
+    "Please use this option carefully!": "請謹慎使用。",
+    "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": "確認密碼",
+    "Import Backup": "匯入備份",
+    "Export Backup": "匯出備份",
+    "Export": "匯出",
+    "Import": "匯入",
+    "respTime": "回應時間 (毫秒)",
+    "notAvailableShort": "N/A",
+    "Default enabled": "啟用預設",
+    "Apply on all existing monitors": "套用到目前所有的監測器",
+    "Create": "建立",
+    "Clear Data": "清除資料",
+    "Events": "活動",
+    "Heartbeats": "心跳",
+    "Auto Get": "自動取得",
+    "backupDescription": "您可以將所有監測器及通知備份成一個 JSON 檔案。",
+    "backupDescription2": "提醒:不包含歷史紀錄及活動紀錄。",
+    "backupDescription3": "如通知權杖等機密資料也會一同匯出。請妥善保存。",
+    "alertNoFile": "請選擇要匯入的檔案。",
+    "alertWrongFileType": "請選擇 JSON 檔案。",
+    "Clear all statistics": "清除所有統計資料",
+    "Skip existing": "略過現有",
+    "Overwrite": "覆寫",
+    "Options": "選項",
+    "Keep both": "保留兩者",
+    "Verify Token": "認證權杖",
+    "Setup 2FA": "設置雙步驟驗證",
+    "Enable 2FA": "啟用雙步驟驗證",
+    "Disable 2FA": "停用雙步驟驗證",
+    "2FA Settings": "雙步驟驗證設定",
+    "Two Factor Authentication": "雙步驟驗證",
+    "Active": "啟用",
+    "Inactive": "停用",
+    "Token": "權杖",
+    "Show URI": "顯示 URI",
+    "Tags": "標籤",
+    "Add New below or Select...": "在下方新增或選取...",
+    "Tag with this name already exist.": "已存在相同名稱的標籤。",
+    "Tag with this value already exist.": "已存在相同數值的標籤。",
+    "color": "顏色",
+    "value (optional)": "數值 (選填)",
+    "Gray": "灰色",
+    "Red": "紅色",
+    "Orange": "橘色",
+    "Green": "綠色",
+    "Blue": "藍色",
+    "Indigo": "靛色",
+    "Purple": "紫色",
+    "Pink": "粉色",
+    "Search...": "搜尋...",
+    "Avg. Ping": "平均 Ping",
+    "Avg. Response": "平均回應",
+    "Entry Page": "入口頁面",
+    "statusPageNothing": "空空如也,請新增群組或監測器。",
+    "No Services": "無服務",
+    "All Systems Operational": "所有系統正常運作",
+    "Partially Degraded Service": "部分服務效能降低",
+    "Degraded Service": "服務效能降低",
+    "Add Group": "新增群組",
+    "Add a monitor": "加入監測器",
+    "Edit Status Page": "編輯狀態頁",
+    "Go to Dashboard": "前往儀表板",
+    "Status Page": "狀態頁",
+    "Status Pages": "狀態頁",
+    "defaultNotificationName": "我的 {notification} 通知 ({number})",
+    "here": "此處",
+    "Required": "必填",
+    "telegram": "Telegram",
+    "Bot Token": "機器人權杖",
+    "wayToGetTelegramToken": "您可以從 {0} 取得權杖。",
+    "Chat ID": "聊天 ID",
+    "supportTelegramChatID": "支援 對話/群組/頻道的聊天 ID",
+    "wayToGetTelegramChatID": "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
+    "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
+    "chatIDNotFound": "找不到 Chat ID;請先傳送訊息給機器人",
+    "webhook": "Webhook",
+    "Post URL": "Post 網址",
+    "Content Type": "內容類型",
+    "webhookJsonDesc": "{0} 適合任何現代的 HTTP 伺服器,如 Express.js",
+    "webhookFormDataDesc": "{multipart} 適合 PHP。 JSON 必須先經由 {decodeFunction} 剖析。",
+    "webhookAdditionalHeadersTitle": "額外標頭",
+    "webhookAdditionalHeadersDesc": "設定與 webhook 一同傳送的額外標頭。",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "無 / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "忽略 TLS 錯誤",
+    "From Email": "寄件人",
+    "emailCustomSubject": "自訂主旨",
+    "To Email": "收件者",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "discord": "Discord",
+    "Discord Webhook URL": "Discord Webhook 網址",
+    "wayToGetDiscordURL": "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
+    "Bot Display Name": "機器人顯示名稱",
+    "Prefix Custom Message": "前綴自訂訊息",
+    "Hello @everyone is...": "Hello {'@'}everyone is...",
+    "teams": "Microsoft Teams",
+    "Webhook URL": "Webhook 網址",
+    "wayToGetTeamsURL": "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
+    "signal": "Signal",
+    "Number": "號碼",
+    "Recipients": "收件者",
+    "needSignalAPI": "您需要有 REST API 的 Signal 客戶端。",
+    "wayToCheckSignalURL": "您可以前往下列網址以了解如何設定:",
+    "signalImportant": "注意: 不得混合收件者的群組和號碼!",
+    "gotify": "Gotify",
+    "Application Token": "應用程式權杖",
+    "Server URL": "伺服器網址",
+    "Priority": "優先度",
+    "slack": "Slack",
+    "Icon Emoji": "Emoji 圖示",
+    "Channel Name": "頻道名稱",
+    "Uptime Kuma URL": "Uptime Kuma 網址",
+    "aboutWebhooks": "更多關於 Webhook 的資訊: {0}",
+    "aboutChannelName": "如果您不想使用 Webhook 頻道,請在 {0} 頻道名稱欄位填入您想使用的頻道。例如: #其他頻道",
+    "aboutKumaURL": "如果您未填入 Uptime Kuma 網址。將預設使用專案 Github 頁面。",
+    "emojiCheatSheet": "Emoji 一覽表: {0}",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (支援 50 種以上的通知服務)",
+    "GoogleChat": "Google Chat (僅限 Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "使用者金鑰",
+    "Device": "裝置",
+    "Message Title": "訊息標題",
+    "Notification Sound": "通知音效",
+    "More info on:": "更多資訊: {0}",
+    "pushoverDesc1": "緊急優先度 (2) 的重試間隔為 30 秒並且會在 1 小時後過期。",
+    "pushoverDesc2": "如果您想要傳送通知到不同裝置,請填寫裝置欄位。",
+    "SMS Type": "簡訊類型",
+    "octopushTypePremium": "Premium (快速 - 建議用於警報)",
+    "octopushTypeLowCost": "Low Cost (緩慢 - 有時會被營運商阻擋)",
+    "checkPrice": "查看 {0} 價格:",
+    "apiCredentials": "API 認證",
+    "octopushLegacyHint": "您使用的是舊版的 Octopush (2011-2020) 還是新版?",
+    "Check octopush prices": "查看 octopush 價格 {0}。",
+    "octopushPhoneNumber": "電話號碼 (intl 格式,例如:+33612345678) ",
+    "octopushSMSSender": "簡訊寄件人名稱:3-11位英數字元及空白 (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea 裝置 ID",
+    "Apprise URL": "Apprise 網址",
+    "Example:": "範例:{0}",
+    "Read more:": "深入瞭解:{0}",
+    "Status:": "狀態:{0}",
+    "Read more": "深入瞭解",
+    "appriseInstalled": "已安裝 Apprise。",
+    "appriseNotInstalled": "尚未安裝 Apprise。{0}",
+    "Access Token": "存取權杖",
+    "Channel access token": "頻道存取權杖",
+    "Line Developers Console": "Line 開發者控制台",
+    "lineDevConsoleTo": "Line 開發者控制台 - {0}",
+    "Basic Settings": "基本設定",
+    "User ID": "使用者 ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "首先,前往 {0},建立 provider 和 channel (Messaging API)。接著您就可以從上面提到的選單項目中取得頻道存取權杖及使用者 ID。",
+    "Icon URL": "圖示網址",
+    "aboutIconURL": "您可以在 \"圖示網址\" 中提供圖片網址以覆蓋預設個人檔案圖片。若已設定 Emoji 圖示,將忽略此設定。",
+    "aboutMattermostChannelName": "您可以在 \"頻道名稱\" 欄位中填寫頻道名稱以覆蓋 Webhook 的預設頻道。必須在 Mattermost 的 Webhook 設定中啟用。例如:#其他頻道",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件者。",
+    "promosmsTypeFlash": "SMS FLASH - 訊息會自動在收件者的裝置上顯示。僅限位於波蘭的收件者。",
+    "promosmsTypeFull": "SMS FULL - 高級版,您可以使用您的寄件人名稱 (必須先註冊名稱。對於警報來說十分可靠。",
+    "promosmsTypeSpeed": "SMS SPEED - 系統中的最高優先度。快速、可靠,但昂貴 (約 SMS FULL 的兩倍價格)。",
+    "promosmsPhoneNumber": "電話號碼 (若收件者位於波蘭則無需輸入區域代碼)",
+    "promosmsSMSSender": "簡訊寄件人名稱:預先註冊的名稱或以下的預設名稱:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
+    "Feishu WebHookUrl": "飛書 WebHook 網址",
+    "matrixHomeserverURL": "Homeserver 網址 (開頭為 http(s)://,結尾可能帶連接埠)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "您可以在 Matrix 客戶端的房間設定中的進階選項找到 internal room ID。應該看起來像 !QMdRCpUIfLwsfjxye6:home.server。",
+    "matrixDesc2": "使用您自己的 Matrix 使用者存取權杖將賦予存取您的帳號和您加入的房間的完整權限。建議建立新使用者,並邀請至您想要接收通知的房間中。您可以執行 {0} 以取得存取權杖",
+    "Method": "方法",
+    "Body": "主體",
+    "Headers": "標頭",
+    "PushUrl": "Push 網址",
+    "HeadersInvalidFormat": "要求標頭不是有效的 JSON:",
+    "BodyInvalidFormat": "要求主體不是有效的 JSON:",
+    "Monitor History": "監測器歷史紀錄",
+    "clearDataOlderThan": "保留 {0} 天內的監測器歷史紀錄。",
+    "PasswordsDoNotMatch": "密碼不相符。",
+    "records": "記錄",
+    "One record": "一項記錄",
+    "steamApiKeyDescription": "若要監測 Steam 遊戲伺服器,您將需要 Steam Web-API 金鑰。您可以在此註冊您的 API 金鑰:",
+    "Current User": "目前使用者",
+    "topic": "Topic",
+    "topicExplanation": "要監測的 MQTT Topic",
+    "successMessage": "成功訊息",
+    "successMessageExplanation": "視為成功的 MQTT 訊息",
+    "recent": "最近",
+    "Done": "完成",
+    "Info": "資訊",
+    "Security": "安全性",
+    "Steam API Key": "Steam API 金鑰",
+    "Shrink Database": "壓縮資料庫",
+    "Pick a RR-Type...": "選擇資源記錄類型...",
+    "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
+    "Default": "預設",
+    "HTTP Options": "HTTP 選項",
+    "Create Incident": "建立事件",
+    "Title": "標題",
+    "Content": "內容",
+    "Style": "樣式",
+    "info": "資訊",
+    "warning": "警告",
+    "danger": "危險",
+    "error": "錯誤",
+    "critical": "嚴重",
+    "primary": "主要",
+    "light": "淺色",
+    "dark": "暗色",
+    "Post": "發佈",
+    "Please input title and content": "請輸入標題及內容",
+    "Created": "建立",
+    "Last Updated": "最後更新",
+    "Unpin": "取消釘選",
+    "Switch to Light Theme": "切換至淺色佈景主題",
+    "Switch to Dark Theme": "切換至深色佈景主題",
+    "Show Tags": "顯示標籤",
+    "Hide Tags": "隱藏標籤",
+    "Description": "說明",
+    "No monitors available.": "沒有可用的監測器。",
+    "Add one": "新增一個",
+    "No Monitors": "無監測器",
+    "Untitled Group": "未命名群組",
+    "Services": "服務",
+    "Discard": "捨棄",
+    "Cancel": "取消",
+    "Powered by": "技術支援",
+    "shrinkDatabaseDescription": "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立,AUTO_VACUUM 已自動啟用,則無需此操作。",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API 使用者名稱 (包括 webapi_ 前綴)",
+    "serwersmsAPIPassword": "API 密碼",
+    "serwersmsPhoneNumber": "電話號碼",
+    "serwersmsSenderName": "SMS 寄件人名稱 (由客戶入口網站註冊)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "電話號碼",
+    "smseagleGroup": "電話簿群組名稱",
+    "smseagleContact": "電話簿聯絡人名稱",
+    "smseagleRecipientType": "收件者類型",
+    "smseagleRecipient": "收件者 (用逗號分隔)",
+    "smseagleToken": "API 存取權杖",
+    "smseagleUrl": "您的 SMSEagle 裝置網址",
+    "smseagleEncoding": "以 Unicode 傳送",
+    "smseaglePriority": "訊息優先度 (0-9,預設 = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "自訂",
+    "Custom Footer": "自訂頁尾",
+    "Custom CSS": "自訂 CSS",
+    "smtpDkimSettings": "DKIM 設定",
+    "smtpDkimDesc": "請參考 Nodemailer DKIM {0} 使用方式。",
+    "documentation": "文件",
+    "smtpDkimDomain": "網域名稱",
+    "smtpDkimKeySelector": "DKIM 選取器",
+    "smtpDkimPrivateKey": "私密金鑰",
+    "smtpDkimHashAlgo": "雜湊演算法 (選填)",
+    "smtpDkimheaderFieldNames": "要簽署的郵件標頭 (選填)",
+    "smtpDkimskipFields": "不簽署的郵件標頭 (選填)",
+    "wayToGetPagerDutyKey": "您可以前往服務 -> 服務目錄 -> (選取服務) -> 整合 -> 新增整合以取得。您可以搜尋 \"Events API V2\"。詳細資訊 {0}",
+    "Integration Key": "整合金鑰",
+    "Integration URL": "整合網址",
+    "Auto resolve or acknowledged": "自動解決或認可",
+    "do nothing": "不進行任何操作",
+    "auto acknowledged": "自動認可",
+    "auto resolve": "自動解決",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API 端點",
+    "alertaEnvironment": "環境",
+    "alertaApiKey": "API 金鑰",
+    "alertaAlertState": "警示狀態",
+    "alertaRecoverState": "恢復狀態",
+    "deleteStatusPageMsg": "您確定要刪除此狀態頁嗎?",
+    "Proxies": "代理伺服器",
+    "default": "預設",
+    "enabled": "啟用",
+    "setAsDefault": "設為預設",
+    "deleteProxyMsg": "您確定要為所有監測器刪除此代理伺服器嗎?",
+    "proxyDescription": "必須將代理伺服器指派給監測器才能運作。",
+    "enableProxyDescription": "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
+    "setAsDefaultProxyDescription": "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
+    "Certificate Chain": "憑證鏈結",
+    "Valid": "有效",
+    "Invalid": "無效",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey 密碼",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms 範本必須包含參數:",
+    "Bark Endpoint": "Bark 端點",
+    "Bark Group": "Bark 群組",
+    "Bark Sound": "Bark 鈴聲",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "為了安全起見,必須使用秘密金鑰",
+    "Device Token": "裝置權杖",
+    "Platform": "平台",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "華為",
+    "High": "高",
+    "Retry": "重試",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom 機器人金鑰",
+    "Setup Proxy": "設置 Proxy",
+    "Proxy Protocol": "Proxy 通訊協定",
+    "Proxy Server": "Proxy 伺服器",
+    "Proxy server has authentication": "Proxy 伺服器啟用了驗證功能",
+    "User": "使用者",
+    "Installed": "已安裝",
+    "Not installed": "未安裝",
+    "Running": "執行中",
+    "Not running": "未執行",
+    "Remove Token": "移除權杖",
+    "Start": "開始",
+    "Stop": "停止",
+    "Uptime Kuma": "Uptime Kuma",
+    "Add New Status Page": "新增狀態頁",
+    "Slug": "Slug",
+    "Accept characters:": "可用字元:",
+    "startOrEndWithOnly": "僅能使用 {0} 開頭或結尾",
+    "No consecutive dashes": "不得連續使用破折號",
+    "Next": "下一步",
+    "The slug is already taken. Please choose another slug.": "此 slug 已被使用。請選擇其他 slug。",
+    "No Proxy": "無 Proxy",
+    "Authentication": "驗證",
+    "HTTP Basic Auth": "HTTP 基本驗證",
+    "New Status Page": "新狀態頁",
+    "Page Not Found": "找不到頁面",
+    "Reverse Proxy": "反向代理",
+    "Backup": "備份",
+    "About": "關於",
+    "wayToGetCloudflaredURL": "(從 {0} 下載 cloudflared)",
+    "cloudflareWebsite": "Cloudflare 網站",
+    "Message:": "訊息:",
+    "Don't know how to get the token? Please read the guide:": "不知道如何取得權杖嗎?請閱讀指南:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您目前正透過 Cloudflare Tunnel 連線,可能會導致連線中斷。您確定要停止嗎?請輸入密碼以確認。",
+    "HTTP Headers": "HTTP 標頭",
+    "Trust Proxy": "信任的 Proxy",
+    "Other Software": "其他軟體",
+    "For example: nginx, Apache and Traefik.": "例如 nginx、Apache 和 Traefik。",
+    "Please read": "請閱覽",
+    "Subject:": "簽發給:",
+    "Valid To:": "有效期限:",
+    "Days Remaining:": "剩餘天數:",
+    "Issuer:": "簽發者:",
+    "Fingerprint:": "指紋:",
+    "No status pages": "無狀態頁",
+    "Domain Name Expiry Notification": "網域名稱到期通知",
+    "Proxy": "Proxy",
+    "Date Created": "建立日期",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP 位址",
+    "onebotMessageType": "OneBot 訊息類型",
+    "onebotGroupMessage": "群組",
+    "onebotPrivateMessage": "私人",
+    "onebotUserOrGroupId": "群組/使用者 ID",
+    "onebotSafetyTips": "為了安全起見,必須設置存取權杖",
+    "PushDeer Key": "PushDeer 金鑰",
+    "Footer Text": "頁尾文字",
+    "Show Powered By": "顯示技術支援文字",
+    "Domain Names": "網域名稱",
+    "signedInDisp": "以 {0} 身分登入",
+    "signedInDispDisabled": "驗證已停用。",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "客戶端與伺服器端的共享機密",
+    "RadiusCalledStationId": "被叫站 Id",
+    "RadiusCalledStationIdDescription": "被呼叫裝置的識別碼",
+    "RadiusCallingStationId": "呼叫站 Id",
+    "RadiusCallingStationIdDescription": "呼叫裝置的識別碼",
+    "Certificate Expiry Notification": "憑證到期通知",
+    "API Username": "API 使用者名稱",
+    "API Key": "API 金鑰",
+    "Recipient Number": "收件者號碼",
+    "From Name/Number": "來自名字/號碼",
+    "Leave blank to use a shared sender number.": "留空以使用共享寄件人號碼。",
+    "Octopush API Version": "Octopush API 版本",
+    "Legacy Octopush-DM": "舊版 Octopush-DM",
+    "endpoint": "端",
+    "octopushAPIKey": "在控制台的 HTTP API 憑證取得的 \"API 金鑰\"",
+    "octopushLogin": "在控制台的 HTTP API 憑證取得的 \"Login\"",
+    "promosmsLogin": "API 登入名稱",
+    "promosmsPassword": "API 密碼",
+    "pushoversounds pushover": "Pushover (預設)",
+    "pushoversounds bike": "車鈴",
+    "pushoversounds bugle": "號角",
+    "pushoversounds cashregister": "收銀機",
+    "pushoversounds classical": "古典",
+    "pushoversounds cosmic": "宇宙",
+    "pushoversounds falling": "下落",
+    "pushoversounds gamelan": "甘美朗",
+    "pushoversounds incoming": "來電",
+    "pushoversounds intermission": "中場休息",
+    "pushoversounds magic": "魔法",
+    "pushoversounds mechanical": "機械",
+    "pushoversounds pianobar": "鋼琴酒吧",
+    "pushoversounds siren": "警鈴",
+    "pushoversounds spacealarm": "太空鬧鐘",
+    "pushoversounds tugboat": "汽笛",
+    "pushoversounds alien": "外星鬧鐘 (長)",
+    "pushoversounds climb": "爬升 (長)",
+    "pushoversounds persistent": "持續 (長)",
+    "pushoversounds echo": "Pushover 回音 (長)",
+    "pushoversounds updown": "上下 (長)",
+    "pushoversounds vibrate": "僅震動",
+    "pushoversounds none": "無 (靜音)",
+    "pushyAPIKey": "API 密鑰",
+    "pushyToken": "裝置權杖",
+    "Show update if available": "顯示可用更新",
+    "Also check beta release": "檢查 Beta 版",
+    "Using a Reverse Proxy?": "正在使用反向代理?",
+    "Check how to config it for WebSocket": "查看如何為 WebSocket 設定",
+    "Steam Game Server": "Steam 遊戲伺服器",
+    "Most likely causes:": "可能原因:",
+    "The resource is no longer available.": "資源已不可用。",
+    "There might be a typing error in the address.": "網址可能有誤。",
+    "What you can try:": "您可以嘗試:",
+    "Retype the address.": "重新輸入網址。",
+    "Go back to the previous page.": "返回上一頁。",
+    "Coming Soon": "即將推出",
+    "wayToGetClickSendSMSToken": "您可以從 {0} 取得 API 使用者名稱和金鑰。",
+    "Connection String": "連線字串",
+    "Query": "查詢",
+    "settingsCertificateExpiry": "TLS 憑證到期",
+    "certificationExpiryDescription": "TLS 將於 X 天後到期時觸發 HTTPS 監測器通知:",
+    "Setup Docker Host": "設定 Docker 主機",
+    "Connection Type": "連線類型",
+    "Docker Daemon": "Docker 精靈",
+    "deleteDockerHostMsg": "您確定要為所有監測器刪除此 Docker 主機嗎?",
+    "socket": "通訊端",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker 容器",
+    "Container Name / ID": "容器名稱 / ID",
+    "Docker Host": "Docker 主機",
+    "Docker Hosts": "Docker 主機",
+    "ntfy Topic": "ntfy 主題",
+    "Domain": "網域",
+    "Workstation": "工作站",
+    "disableCloudflaredNoAuthMsg": "您處於無驗證模式。無須輸入密碼。",
+    "trustProxyDescription": "信任 'X-Forwarded-*' 標頭。如果您想要取得正確的客戶端 IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache 後方,您應啟用此選項。",
+    "wayToGetLineNotifyToken": "您可以從 {0} 取得存取權杖",
+    "Examples": "範例",
+    "Home Assistant URL": "Home Assistant 網址",
+    "Long-Lived Access Token": "長期有效存取權杖",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要建立長期有效存取權杖,請點擊您的個人檔案名稱 (左下角),捲動至最下方,然後點擊建立權杖。",
+    "Notification Service": "通知服務",
+    "default: notify all devices": "預設:通知所有服務",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
+    "Automations can optionally be triggered in Home Assistant:": "可以選擇在 Home Assistant 中觸發自動化程序:",
+    "Trigger type:": "觸發器類型:",
+    "Event type:": "事件類型:",
+    "Event data:": "事件資料:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "然後選擇動作,例如切換至 RGB 燈為紅色的場景。",
+    "Frontend Version": "前端版本",
+    "Frontend Version do not match backend version!": "前端版本與後端版本不符!",
+    "Base URL": "基底網址",
+    "goAlertInfo": "GoAlert 是用於待命排程、升級自動化,以及通知 (如簡訊或語音通話) 的開源應用程式。自動在正確的時間、用洽當的方法、聯絡合適的人! {0}",
+    "goAlertIntegrationKeyInfo": "取得服務的通用 API 整合金鑰,格式為 \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"。通常是已複製的網址的權杖參數值。",
+    "goAlert": "GoAlert",
+    "backupOutdatedWarning": "過時:由於新功能的增加,且未妥善維護,故此備份功能無法產生或復原完整備份。",
+    "backupRecommend": "請直接備份磁碟區或 ./data/ 資料夾。",
+    "Optional": "選填",
+    "squadcast": "Squadcast",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API 文件 ",
+    "Gateway Type": "閘道類型",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "若要除數,您可以使用",
+    "or": "或是",
+    "recurringInterval": "間隔",
+    "Recurring": "週期性",
+    "strategyManual": "手動切換使用中/非使用中",
+    "warningTimezone": "正在使用伺服器的時區",
+    "weekdayShortMon": "一",
+    "weekdayShortTue": "二",
+    "weekdayShortWed": "三",
+    "weekdayShortThu": "四",
+    "weekdayShortFri": "五",
+    "weekdayShortSat": "六",
+    "weekdayShortSun": "日",
+    "dayOfWeek": "每周特定一天",
+    "dayOfMonth": "每月特定一天",
+    "lastDay": "最後一天",
+    "lastDay1": "每月的最後一天",
+    "lastDay2": "每月的倒數第二天",
+    "lastDay3": "每月的倒數第三天",
+    "lastDay4": "每月的倒數第四天",
+    "No Maintenance": "無維護",
+    "pauseMaintenanceMsg": "您確定要暫停嗎?",
+    "maintenanceStatus-under-maintenance": "維護中",
+    "maintenanceStatus-inactive": "非使用中",
+    "maintenanceStatus-scheduled": "已排程",
+    "maintenanceStatus-ended": "已結束",
+    "maintenanceStatus-unknown": "未知",
+    "Display Timezone": "顯示時區",
+    "Server Timezone": "伺服器時區",
+    "statusPageMaintenanceEndDate": "結束",
+    "IconUrl": "圖示網址",
+    "Enable DNS Cache": "啟用 DNS 快取",
+    "Enable": "啟用",
+    "Disable": "停用",
+    "dnsCacheDescription": "在某些 IPv6 環境可能會無法運作,如果您遇到任何問題,請停用。",
+    "Single Maintenance Window": "單一維護時段",
+    "Maintenance Time Window of a Day": "每日的維護時段",
+    "Effective Date Range": "有效的日期範圍",
+    "Schedule Maintenance": "排程維護",
+    "Date and Time": "時間和日期",
+    "DateTime Range": "DateTime 範圍",
+    "Strategy": "策略",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API 金鑰",
+    "Enable TLS": "啟用 TLS",
+    "Proto Service Name": "Proto 服務名稱",
+    "Proto Method": "Proto 方式",
+    "Proto Content": "Proto 內容",
+    "Economy": "節約",
+    "Lowcost": "低費率",
+    "high": "高",
+    "General Monitor Type": "一般監測器類型",
+    "Passive Monitor Type": "被動監測器類型",
+    "Specific Monitor Type": "指定監測器類型"
+}
diff --git a/src/mixins/lang.js b/src/mixins/lang.js
index aca95149..7e36d158 100644
--- a/src/mixins/lang.js
+++ b/src/mixins/lang.js
@@ -1,6 +1,6 @@
 import { currentLocale } from "../i18n";
 import { setPageLocale } from "../util-frontend";
-const langModules = import.meta.glob("../languages/*.js");
+const langModules = import.meta.glob("../lang/*.json");
 
 export default {
     data() {
@@ -24,7 +24,7 @@ export default {
     methods: {
         /** Change the application language */
         async changeLang(lang) {
-            let message = (await langModules["../languages/" + lang + ".js"]()).default;
+            let message = (await langModules["../lang/" + lang + ".json"]()).default;
             this.$i18n.setLocaleMessage(lang, message);
             this.$i18n.locale = lang;
             localStorage.locale = lang;

From bfa32f6b07a2821c5d04fdfe14685682c6055e65 Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Sat, 7 Jan 2023 09:46:49 +0800
Subject: [PATCH 460/803] comment not allowed in json file

---
 src/lang/fr-FR.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 9da84bda..04819c8a 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -302,7 +302,7 @@
     "lineDevConsoleTo": "Console développeurs Line - {0}",
     "Basic Settings": "Paramètres de base",
     "User ID": "Identifiant utilisateur",
-    "Messaging API": "Messaging API", // Ne pas traduire, il s'agit du type de salon affiché sur la console développeurs Line
+    "Messaging API": "Messaging API",
     "wayToGetLineChannelToken": "Premièrement accédez à {0}, créez un <i>provider</i> et définissez un type de salon à « Messaging API ». Vous pourrez alors avoir  puis vous pourrez avoir le jeton d'accès du salon et l'identifiant utilisateur demandés.",
     "Icon URL": "URL vers l'icône",
     "aboutIconURL": "Vous pouvez mettre un lien vers une image dans « URL vers l'icône » pour remplacer l'image de profil par défaut. Elle ne sera utilisé que si « Icône émoji » n'est pas défini.",

From ceb7d481182c333f980fe9254ed880b20207aaa4 Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Sat, 7 Jan 2023 11:37:40 +0800
Subject: [PATCH 461/803] add convert script

---
 extra/convert-language-files/.gitignore   |  3 +++
 extra/convert-language-files/index.js     | 29 +++++++++++++++++++++++
 extra/convert-language-files/package.json | 12 ++++++++++
 src/lang/bg-BG.json                       |  2 +-
 src/lang/cs-CZ.json                       |  2 +-
 src/lang/da-DK.json                       |  2 +-
 src/lang/de-CH.json                       |  2 +-
 src/lang/de-DE.json                       |  2 +-
 src/lang/el-GR.json                       |  2 +-
 src/lang/en.json                          |  2 +-
 src/lang/es-ES.json                       |  2 +-
 src/lang/et-EE.json                       |  2 +-
 src/lang/eu.json                          |  2 +-
 src/lang/fa.json                          |  2 +-
 src/lang/fr-FR.json                       |  2 +-
 src/lang/he-IL.json                       |  2 +-
 src/lang/hr-HR.json                       |  2 +-
 src/lang/hu.json                          |  2 +-
 src/lang/id-ID.json                       |  2 +-
 src/lang/it-IT.json                       |  2 +-
 src/lang/ja.json                          |  2 +-
 src/lang/ko-KR.json                       |  2 +-
 src/lang/nb-NO.json                       |  2 +-
 src/lang/nl-NL.json                       |  2 +-
 src/lang/pl.json                          |  2 +-
 src/lang/pt-BR.json                       |  2 +-
 src/lang/pt-PT.json                       |  2 +-
 src/lang/ru-RU.json                       |  2 +-
 src/lang/sl-SI.json                       |  2 +-
 src/lang/sr-latn.json                     |  2 +-
 src/lang/sr.json                          |  2 +-
 src/lang/sv-SE.json                       |  2 +-
 src/lang/th-TH.json                       |  2 +-
 src/lang/tr-TR.json                       |  2 +-
 src/lang/uk-UA.json                       |  2 +-
 src/lang/vi-VN.json                       |  2 +-
 src/lang/zh-CN.json                       |  2 +-
 src/lang/zh-HK.json                       |  2 +-
 src/lang/zh-TW.json                       |  2 +-
 39 files changed, 80 insertions(+), 36 deletions(-)
 create mode 100644 extra/convert-language-files/.gitignore
 create mode 100644 extra/convert-language-files/index.js
 create mode 100644 extra/convert-language-files/package.json

diff --git a/extra/convert-language-files/.gitignore b/extra/convert-language-files/.gitignore
new file mode 100644
index 00000000..410c913c
--- /dev/null
+++ b/extra/convert-language-files/.gitignore
@@ -0,0 +1,3 @@
+package-lock.json
+test.js
+languages/
diff --git a/extra/convert-language-files/index.js b/extra/convert-language-files/index.js
new file mode 100644
index 00000000..3082d32e
--- /dev/null
+++ b/extra/convert-language-files/index.js
@@ -0,0 +1,29 @@
+// Need to use ES6 to read language files
+
+import fs from "fs";
+import rmSync from "../fs-rmSync.js";
+
+async function convent(langCode) {
+    fs.copyFileSync(`../../src/languages/${langCode}.js`, `./languages/${langCode}.js`);
+    const lang = (await import(`./languages/${langCode}.js`)).default;
+    // console.log(JSON.stringify(lang));
+    fs.writeFile(`../../src/lang/${langCode}.json`, JSON.stringify(lang, null, 4), function (err) {
+        if (err) {
+            throw err;
+        }
+        console.log(`Convent success for ${langCode}`);
+    });
+}
+
+if (fs.existsSync("./languages")) {
+    rmSync("./languages", { recursive: true });
+}
+fs.mkdirSync("./languages");
+
+let files = fs.readdirSync("../../src/languages/");
+console.log(files);
+files.forEach(async (filename) => {
+    if (filename !== "README.md") {
+        await convent(filename.replace(".js", ""));
+    }
+});
diff --git a/extra/convert-language-files/package.json b/extra/convert-language-files/package.json
new file mode 100644
index 00000000..81493aa3
--- /dev/null
+++ b/extra/convert-language-files/package.json
@@ -0,0 +1,12 @@
+{
+    "name": "convert-language-files",
+    "type": "module",
+    "version": "1.0.0",
+    "description": "",
+    "main": "index.js",
+    "scripts": {
+        "test": "echo \"Error: no test specified\" && exit 1"
+    },
+    "author": "",
+    "license": "ISC"
+}
diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 2c4ce95f..6390a351 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -669,4 +669,4 @@
     "General Monitor Type": "Общ тип монитор",
     "Passive Monitor Type": "Пасивет тип монитор",
     "Specific Monitor Type": "Специфичен тип монитор"
-}
+}
\ No newline at end of file
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index 4df2650e..bc43337b 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -623,4 +623,4 @@
     "Enable": "Povolit",
     "Disable": "Zakázat",
     "dnsCacheDescription": "V některých prostředích IPv6 nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej."
-}
+}
\ No newline at end of file
diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
index 9cd1a463..18177f6f 100644
--- a/src/lang/da-DK.json
+++ b/src/lang/da-DK.json
@@ -352,4 +352,4 @@
     "serwersmsPhoneNumber": "Telefonnummer",
     "serwersmsSenderName": "SMS Afsender Navn (registreret via kundeportal)",
     "stackfield": "Stackfield"
-}
+}
\ No newline at end of file
diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
index c3e4d3d5..b39814f9 100644
--- a/src/lang/de-CH.json
+++ b/src/lang/de-CH.json
@@ -631,4 +631,4 @@
     "Display Timezone": "Zeitzone anzeigen",
     "Server Timezone": "Server Zeitzone",
     "statusPageMaintenanceEndDate": "Ende"
-}
+}
\ No newline at end of file
diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index e4472111..938ab195 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -638,4 +638,4 @@
     "DateTime Range": "Datums- und Zeitbereich",
     "Strategy": "Strategie",
     "statusPageMaintenanceEndDate": "Ende"
-}
+}
\ No newline at end of file
diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json
index c77d6158..cbd6497d 100644
--- a/src/lang/el-GR.json
+++ b/src/lang/el-GR.json
@@ -584,4 +584,4 @@
     "goAlert": "GoAlert",
     "backupOutdatedWarning": "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται πολη, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
     "backupRecommend": "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του volume ή του φακέλου δεδομένων (./data/) απευθείας."
-}
+}
\ No newline at end of file
diff --git a/src/lang/en.json b/src/lang/en.json
index 897b28f5..74829884 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -675,4 +675,4 @@
     "General Monitor Type": "General Monitor Type",
     "Passive Monitor Type": "Passive Monitor Type",
     "Specific Monitor Type": "Specific Monitor Type"
-}
+}
\ No newline at end of file
diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index 9a40ee8b..2a3ae446 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -206,4 +206,4 @@
     "records": "registros",
     "One record": "Un registro",
     "steamApiKeyDescription": "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: "
-}
+}
\ No newline at end of file
diff --git a/src/lang/et-EE.json b/src/lang/et-EE.json
index f7a23a6c..53ef8abd 100644
--- a/src/lang/et-EE.json
+++ b/src/lang/et-EE.json
@@ -206,4 +206,4 @@
     "alertaApiKey": "API võti",
     "alertaAlertState": "Häireseisund",
     "alertaRecoverState": "Taasta algolek"
-}
+}
\ No newline at end of file
diff --git a/src/lang/eu.json b/src/lang/eu.json
index 9d667a58..d5e3f91c 100644
--- a/src/lang/eu.json
+++ b/src/lang/eu.json
@@ -538,4 +538,4 @@
     "Domain": "Domeinua",
     "Workstation": "Lan gunea",
     "disableCloudflaredNoAuthMsg": "Ez Auth moduan zaude, pasahitza ez da beharrezkoa."
-}
+}
\ No newline at end of file
diff --git a/src/lang/fa.json b/src/lang/fa.json
index fc099bc4..3809ec33 100644
--- a/src/lang/fa.json
+++ b/src/lang/fa.json
@@ -205,4 +205,4 @@
     "pushbullet": "Pushbullet",
     "line": "Line Messenger",
     "mattermost": "Mattermost"
-}
+}
\ No newline at end of file
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 04819c8a..fe7b605b 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -669,4 +669,4 @@
     "General Monitor Type": "Type de sonde générale",
     "Passive Monitor Type": "Type de sonde passive",
     "Specific Monitor Type": "Type de sonde spécifique"
-}
+}
\ No newline at end of file
diff --git a/src/lang/he-IL.json b/src/lang/he-IL.json
index c8219ff5..469e1d4d 100644
--- a/src/lang/he-IL.json
+++ b/src/lang/he-IL.json
@@ -669,4 +669,4 @@
     "General Monitor Type": "מוניטור כללי",
     "Passive Monitor Type": "מוניטור פסיבי",
     "Specific Monitor Type": "סוג מוניטור ספציפי"
-}
+}
\ No newline at end of file
diff --git a/src/lang/hr-HR.json b/src/lang/hr-HR.json
index 417b689e..698b1afd 100644
--- a/src/lang/hr-HR.json
+++ b/src/lang/hr-HR.json
@@ -578,4 +578,4 @@
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Potrebno je i odabrati akciju za izvođenje na Home Assistantu.",
     "Frontend Version": "Inačica sučelja",
     "Frontend Version do not match backend version!": "Inačica sučelja ne odgovara poslužitelju!"
-}
+}
\ No newline at end of file
diff --git a/src/lang/hu.json b/src/lang/hu.json
index 78036a1f..17645dbb 100644
--- a/src/lang/hu.json
+++ b/src/lang/hu.json
@@ -373,4 +373,4 @@
     "alertaAlertState": "Figyelmeztetési állapot",
     "alertaRecoverState": "Visszaállási állapot",
     "deleteStatusPageMsg": "Biztos, hogy törölni akarja a státusz oldalt?"
-}
+}
\ No newline at end of file
diff --git a/src/lang/id-ID.json b/src/lang/id-ID.json
index 59a06521..b0903155 100644
--- a/src/lang/id-ID.json
+++ b/src/lang/id-ID.json
@@ -582,4 +582,4 @@
     "goAlert": "GoAlert",
     "backupOutdatedWarning": "Tidak digunakan lagi: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
     "backupRecommend": "Harap cadangkan volume atau folder data (./data/) secara langsung."
-}
+}
\ No newline at end of file
diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json
index 4b8a8675..c4c719e0 100644
--- a/src/lang/it-IT.json
+++ b/src/lang/it-IT.json
@@ -364,4 +364,4 @@
     "smtpDkimheaderFieldNames": "Campi Intestazione da firmare (opzionale)",
     "smtpDkimskipFields": "Campi Intestazione da non firmare (opzionale)",
     "GoogleChat": "Google Chat (solo per Google Workspace)"
-}
+}
\ No newline at end of file
diff --git a/src/lang/ja.json b/src/lang/ja.json
index 7b2b07fb..42ae45ee 100644
--- a/src/lang/ja.json
+++ b/src/lang/ja.json
@@ -198,4 +198,4 @@
     "pushbullet": "Pushbullet",
     "line": "Line Messenger",
     "mattermost": "Mattermost"
-}
+}
\ No newline at end of file
diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
index 2cb2131c..c2d7b880 100644
--- a/src/lang/ko-KR.json
+++ b/src/lang/ko-KR.json
@@ -528,4 +528,4 @@
     "Go back to the previous page.": "이전 페이지로 돌아가기",
     "Coming Soon": "Coming Soon...",
     "wayToGetClickSendSMSToken": "{0}에서 API 사용자 이름과 키를 얻을 수 있어요."
-}
+}
\ No newline at end of file
diff --git a/src/lang/nb-NO.json b/src/lang/nb-NO.json
index 7af81299..b215abd1 100644
--- a/src/lang/nb-NO.json
+++ b/src/lang/nb-NO.json
@@ -282,4 +282,4 @@
     "promosmsTypeSpeed": "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
     "promosmsPhoneNumber": "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
     "promosmsSMSSender": "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS"
-}
+}
\ No newline at end of file
diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json
index f32d5094..e16519fe 100644
--- a/src/lang/nl-NL.json
+++ b/src/lang/nl-NL.json
@@ -528,4 +528,4 @@
     "Domain": "Domein",
     "Workstation": "Werkstation",
     "disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist."
-}
+}
\ No newline at end of file
diff --git a/src/lang/pl.json b/src/lang/pl.json
index 319a3175..5dd163ed 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -641,4 +641,4 @@
     "Display Timezone": "Wyświetlana strefa czasowa",
     "Server Timezone": "Strefa czasowa serwera",
     "statusPageMaintenanceEndDate": "Koniec"
-}
+}
\ No newline at end of file
diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json
index 1f951407..3164702a 100644
--- a/src/lang/pt-BR.json
+++ b/src/lang/pt-BR.json
@@ -200,4 +200,4 @@
     "pushbullet": "Pushbullet",
     "line": "Line Messenger",
     "mattermost": "Mattermost"
-}
+}
\ No newline at end of file
diff --git a/src/lang/pt-PT.json b/src/lang/pt-PT.json
index d8fc793e..454d5b07 100644
--- a/src/lang/pt-PT.json
+++ b/src/lang/pt-PT.json
@@ -200,4 +200,4 @@
     "pushbullet": "Pushbullet",
     "line": "Line Messenger",
     "mattermost": "Mattermost"
-}
+}
\ No newline at end of file
diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 0c214b13..a70c50c4 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -578,4 +578,4 @@
     "SMSManager": "SMSManager",
     "You can divide numbers with": "Вы можете делить числа с",
     "or": "или"
-}
+}
\ No newline at end of file
diff --git a/src/lang/sl-SI.json b/src/lang/sl-SI.json
index 062413a8..d1476285 100644
--- a/src/lang/sl-SI.json
+++ b/src/lang/sl-SI.json
@@ -354,4 +354,4 @@
     "serwersmsPhoneNumber": "Telefonska številka",
     "serwersmsSenderName": "Ime SMS pošiljatelja (registrirani prek portala za stranke)",
     "stackfield": "Stackfield"
-}
+}
\ No newline at end of file
diff --git a/src/lang/sr-latn.json b/src/lang/sr-latn.json
index 95bf03f9..ff92748f 100644
--- a/src/lang/sr-latn.json
+++ b/src/lang/sr-latn.json
@@ -201,4 +201,4 @@
     "pushbullet": "Pushbullet",
     "line": "Line Messenger",
     "mattermost": "Mattermost"
-}
+}
\ No newline at end of file
diff --git a/src/lang/sr.json b/src/lang/sr.json
index 25f69add..fcdb3316 100644
--- a/src/lang/sr.json
+++ b/src/lang/sr.json
@@ -201,4 +201,4 @@
     "pushbullet": "Pushbullet",
     "line": "Line Messenger",
     "mattermost": "Mattermost"
-}
+}
\ No newline at end of file
diff --git a/src/lang/sv-SE.json b/src/lang/sv-SE.json
index 233a91f2..29a47756 100644
--- a/src/lang/sv-SE.json
+++ b/src/lang/sv-SE.json
@@ -107,4 +107,4 @@
     "Repeat Password": "Upprepa Lösenord",
     "respTime": "Svarstid (ms)",
     "notAvailableShort": "Ej Tillg."
-}
+}
\ No newline at end of file
diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
index 7ad132f5..33268010 100644
--- a/src/lang/th-TH.json
+++ b/src/lang/th-TH.json
@@ -577,4 +577,4 @@
     "Then choose an action, for example switch the scene to where an RGB light is red.": "จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง",
     "Frontend Version": "เวอร์ชั่น Frontend",
     "Frontend Version do not match backend version!": "เวอร์ชั่น Frontend ไม่ตรงกับ Backend !"
-}
+}
\ No newline at end of file
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 8428dcf9..85340255 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -675,4 +675,4 @@
     "General Monitor Type": "Genel Monitör Tipi",
     "Passive Monitor Type": "Pasif Monitör Tipi",
     "Specific Monitor Type": "Özel Monitör Tipi"
-}
+}
\ No newline at end of file
diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
index fcd678a3..018c45c9 100644
--- a/src/lang/uk-UA.json
+++ b/src/lang/uk-UA.json
@@ -527,4 +527,4 @@
     "Domain": "Домен",
     "Workstation": "Робоча станція",
     "disableCloudflaredNoAuthMsg": "Ви перебуваєте в режимі без авторизації, пароль не потрібен."
-}
+}
\ No newline at end of file
diff --git a/src/lang/vi-VN.json b/src/lang/vi-VN.json
index 8b527cce..022b5053 100644
--- a/src/lang/vi-VN.json
+++ b/src/lang/vi-VN.json
@@ -466,4 +466,4 @@
     "Domain Names": "Domain Names",
     "signedInDisp": "Signed in as {0}",
     "signedInDispDisabled": "Auth Disabled."
-}
+}
\ No newline at end of file
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index a75b73fb..fcc4310f 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -680,4 +680,4 @@
     "General Monitor Type": "常规监控类型",
     "Passive Monitor Type": "被动监控类型",
     "Specific Monitor Type": "针对监控类型"
-}
+}
\ No newline at end of file
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 0bc07786..f1933f27 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -385,4 +385,4 @@
     "Enable DNS Cache": "啟用 DNS 快取",
     "Enable": "啟用",
     "Disable": "停用"
-}
+}
\ No newline at end of file
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
index 142ebf2d..1c168412 100644
--- a/src/lang/zh-TW.json
+++ b/src/lang/zh-TW.json
@@ -669,4 +669,4 @@
     "General Monitor Type": "一般監測器類型",
     "Passive Monitor Type": "被動監測器類型",
     "Specific Monitor Type": "指定監測器類型"
-}
+}
\ No newline at end of file

From e99652c5a2c1b19874243af7c879bd06f165cfad Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Wed, 11 Jan 2023 10:11:19 +0800
Subject: [PATCH 462/803] sync language file changes

---
 src/lang/bg-BG.json |  8 +++++++-
 src/lang/en.json    |  4 +++-
 src/lang/fr-FR.json | 12 ++++++++++--
 3 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 6390a351..63806675 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -668,5 +668,11 @@
     "high": "висок",
     "General Monitor Type": "Общ тип монитор",
     "Passive Monitor Type": "Пасивет тип монитор",
-    "Specific Monitor Type": "Специфичен тип монитор"
+    "Specific Monitor Type": "Специфичен тип монитор",
+    "ZohoCliq": "ZohoCliq",
+    "wayToGetZohoCliqURL": "Можете да научите как се създава URL адрес за уеб кука {0}.",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Създайте приложение и вземете вашия бот токен на {0}",
+    "wayToGetKookGuildID": "Превключете в 'Developer Mode' в 'Kook' настройките, след което десен клик върху 'guild' за да вземете неговото 'ID'",
+    "Guild ID": "Guild ID"
 }
\ No newline at end of file
diff --git a/src/lang/en.json b/src/lang/en.json
index 74829884..ce07e068 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -674,5 +674,7 @@
     "high": "high",
     "General Monitor Type": "General Monitor Type",
     "Passive Monitor Type": "Passive Monitor Type",
-    "Specific Monitor Type": "Specific Monitor Type"
+    "Specific Monitor Type": "Specific Monitor Type",
+    "dataRetentionTimeError": "Retention period must be 0 or greater",
+    "infiniteRetention": "Set to 0 for infinite retention."
 }
\ No newline at end of file
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index fe7b605b..4a3feb63 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -209,6 +209,7 @@
     "here": "ici",
     "Required": "Requis",
     "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
     "Bot Token": "Jeton du robot",
     "wayToGetTelegramToken": "Vous pouvez obtenir un token depuis {0}.",
     "Chat ID": "Chat ID",
@@ -240,7 +241,8 @@
     "Hello @everyone is...": "Bonjour {'@'}everyone il...",
     "teams": "Microsoft Teams",
     "Webhook URL": "URL vers le webhook",
-    "wayToGetTeamsURL": "Vous pouvez apprendre comment créer un Webhook {0}.",
+    "wayToGetTeamsURL": "Vous pouvez apprendre comment créer une URL Webhook {0}.",
+    "wayToGetZohoCliqURL": "Vous pouvez apprendre comment créer une URL Webhook {0}.",
     "signal": "Signal",
     "Number": "Numéro",
     "Recipients": "Destinataires",
@@ -270,6 +272,10 @@
     "apprise": "Apprise (prend en charge plus de 50 services de notification)",
     "GoogleChat": "Google Chat (Google Workspace uniquement)",
     "pushbullet": "Pushbullet",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Créez une application et récupérer le jeton de robot à l'addresse {0}",
+    "wayToGetKookGuildID": "Passez en « mode développeur » dans les paramètres de Kook, et cliquez droit sur le Guild pour obtenir son identifiant",
+    "Guild ID": "Identifiant de Guild",
     "line": "Line Messenger",
     "mattermost": "Mattermost",
     "User Key": "Clé d'utilisateur",
@@ -668,5 +674,7 @@
     "high": "Haute",
     "General Monitor Type": "Type de sonde générale",
     "Passive Monitor Type": "Type de sonde passive",
-    "Specific Monitor Type": "Type de sonde spécifique"
+    "Specific Monitor Type": "Type de sonde spécifique",
+    "dataRetentionTimeError": "La durée de conservation doit être supérieure ou égale à 0",
+    "infiniteRetention": "Définissez la valeur à 0 pour une durée de conservation infinie."
 }
\ No newline at end of file

From 8128c8081bf9be1c551daf7b512f22937173ae4b Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Sun, 15 Jan 2023 10:50:52 +0800
Subject: [PATCH 463/803] sync language file changes

---
 src/lang/cs-CZ.json | 2 +-
 src/lang/en.json    | 5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index bc43337b..2e2e52f7 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -591,7 +591,7 @@
     "You can divide numbers with": "Čísla můžete dělit pomocí",
     "or": "nebo",
     "recurringInterval": "Interval",
-    "Recurring": "Recurring",
+    "Recurring": "Opakující se",
     "strategyManual": "Aktivní/Neaktivní Ručně",
     "warningTimezone": "Používá se časové pásmo serveru",
     "weekdayShortMon": "Po",
diff --git a/src/lang/en.json b/src/lang/en.json
index ce07e068..e919a537 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -74,6 +74,7 @@
     "Current": "Current",
     "Uptime": "Uptime",
     "Cert Exp.": "Cert Exp.",
+    "Monitor": "Monitor | Monitors",
     "day": "day | days",
     "-day": "-day",
     "hour": "hour",
@@ -190,6 +191,7 @@
     "Indigo": "Indigo",
     "Purple": "Purple",
     "Pink": "Pink",
+    "Custom": "Custom",
     "Search...": "Search...",
     "Avg. Ping": "Avg. Ping",
     "Avg. Response": "Avg. Response",
@@ -676,5 +678,6 @@
     "Passive Monitor Type": "Passive Monitor Type",
     "Specific Monitor Type": "Specific Monitor Type",
     "dataRetentionTimeError": "Retention period must be 0 or greater",
-    "infiniteRetention": "Set to 0 for infinite retention."
+    "infiniteRetention": "Set to 0 for infinite retention.",
+    "confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted."
 }
\ No newline at end of file

From b073ec22870e1cb8b0894bfeb65782bc6198f8a7 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 16 Jan 2023 12:39:24 +0800
Subject: [PATCH 464/803] Add Help button which links to wiki

---
 src/icon.js            | 2 ++
 src/layouts/Layout.vue | 6 ++++++
 2 files changed, 8 insertions(+)

diff --git a/src/icon.js b/src/icon.js
index b38bef3c..6cc997bb 100644
--- a/src/icon.js
+++ b/src/icon.js
@@ -44,6 +44,7 @@ import {
     faWrench,
     faHeartbeat,
     faFilter,
+    faInfoCircle,
 } from "@fortawesome/free-solid-svg-icons";
 
 library.add(
@@ -88,6 +89,7 @@ library.add(
     faWrench,
     faHeartbeat,
     faFilter,
+    faInfoCircle,
 );
 
 export { FontAwesomeIcon };
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index d8e96aa8..9069aef7 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -63,6 +63,12 @@
                                 </router-link>
                             </li>
 
+                            <li>
+                                <a href="https://github.com/louislam/uptime-kuma/wiki" class="dropdown-item" target="_blank">
+                                    <font-awesome-icon icon="info-circle" /> {{ $t("Help") }}
+                                </a>
+                            </li>
+
                             <li v-if="$root.loggedIn && $root.socket.token !== 'autoLogin'">
                                 <button class="dropdown-item" @click="$root.logout">
                                     <font-awesome-icon icon="sign-out-alt" />

From 27585d0812365afee5890ad16787f94101fbd63a Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 17 Jan 2023 01:21:01 +0800
Subject: [PATCH 465/803] Fix #2618

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

diff --git a/server/util-server.js b/server/util-server.js
index 9ec3a310..90cb344b 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -103,7 +103,7 @@ exports.pingAsync = function (hostname, ipv6 = false) {
         ping.promise.probe(hostname, {
             v6: ipv6,
             min_reply: 1,
-            timeout: 10,
+            deadline: 10,
         }).then((res) => {
             // If ping failed, it will set field to unknown
             if (res.alive) {

From 7bb12a7e00486d30e89defe3ff4f58d61e3c0176 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 17 Jan 2023 17:25:35 +0800
Subject: [PATCH 466/803] Fix #2608

---
 src/mixins/socket.js | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 0121eb15..4191c6b3 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -3,6 +3,7 @@ import { useToast } from "vue-toastification";
 import jwtDecode from "jwt-decode";
 import Favico from "favico.js";
 import dayjs from "dayjs";
+import { DOWN, MAINTENANCE, PENDING, UP } from "../util.ts";
 const toast = useToast();
 
 let socket;
@@ -669,17 +670,17 @@ export default {
                 let beat = this.$root.lastHeartbeatList[monitorID];
                 let monitor = this.$root.monitorList[monitorID];
 
-                if (monitor && monitor.maintenance) {
-                    result.maintenance++;
-                } else if (monitor && ! monitor.active) {
+                if (monitor && ! monitor.active) {
                     result.pause++;
                 } else if (beat) {
-                    if (beat.status === 1) {
+                    if (beat.status === UP) {
                         result.up++;
-                    } else if (beat.status === 0) {
+                    } else if (beat.status === DOWN) {
                         result.down++;
-                    } else if (beat.status === 2) {
+                    } else if (beat.status === PENDING) {
                         result.up++;
+                    } else if (beat.status === MAINTENANCE) {
+                        result.maintenance++;
                     } else {
                         result.unknown++;
                     }

From a5ff27da7a43015535917dd55ccc79c490f37e2f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 17 Jan 2023 17:34:47 +0800
Subject: [PATCH 467/803] Drop the property `monitor.maintenance`, use
 `lastHeartBeat.status` to check status instead

---
 server/model/monitor.js   |  1 -
 src/components/Uptime.vue | 11 ++++++-----
 src/mixins/socket.js      | 18 +++++++++---------
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index e6332b8f..4fa478ac 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -36,7 +36,6 @@ class Monitor extends BeanModel {
             id: this.id,
             name: this.name,
             sendUrl: this.sendUrl,
-            maintenance: await Monitor.isUnderMaintenance(this.id),
         };
 
         if (this.sendUrl) {
diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index df9bd47a..7b5f48bb 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -3,6 +3,8 @@
 </template>
 
 <script>
+import { DOWN, MAINTENANCE, PENDING, UP } from "../util.ts";
+
 export default {
     props: {
         /** Monitor this represents */
@@ -24,7 +26,6 @@ export default {
 
     computed: {
         uptime() {
-
             if (this.type === "maintenance") {
                 return this.$t("statusMaintenance");
             }
@@ -39,19 +40,19 @@ export default {
         },
 
         color() {
-            if (this.type === "maintenance" || this.monitor.maintenance) {
+            if (this.lastHeartBeat.status === MAINTENANCE) {
                 return "maintenance";
             }
 
-            if (this.lastHeartBeat.status === 0) {
+            if (this.lastHeartBeat.status === DOWN) {
                 return "danger";
             }
 
-            if (this.lastHeartBeat.status === 1) {
+            if (this.lastHeartBeat.status === UP) {
                 return "primary";
             }
 
-            if (this.lastHeartBeat.status === 2) {
+            if (this.lastHeartBeat.status === PENDING) {
                 return "warning";
             }
 
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 4191c6b3..6bd0aafc 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -627,28 +627,28 @@ export default {
             for (let monitorID in this.lastHeartbeatList) {
                 let lastHeartBeat = this.lastHeartbeatList[monitorID];
 
-                if (this.monitorList[monitorID] && this.monitorList[monitorID].maintenance) {
-                    result[monitorID] = {
-                        text: this.$t("statusMaintenance"),
-                        color: "maintenance",
-                    };
-                } else if (! lastHeartBeat) {
+                if (! lastHeartBeat) {
                     result[monitorID] = unknown;
-                } else if (lastHeartBeat.status === 1) {
+                } else if (lastHeartBeat.status === UP) {
                     result[monitorID] = {
                         text: this.$t("Up"),
                         color: "primary",
                     };
-                } else if (lastHeartBeat.status === 0) {
+                } else if (lastHeartBeat.status === DOWN) {
                     result[monitorID] = {
                         text: this.$t("Down"),
                         color: "danger",
                     };
-                } else if (lastHeartBeat.status === 2) {
+                } else if (lastHeartBeat.status === PENDING) {
                     result[monitorID] = {
                         text: this.$t("Pending"),
                         color: "warning",
                     };
+                } else if (lastHeartBeat.status === MAINTENANCE) {
+                    result[monitorID] = {
+                        text: this.$t("statusMaintenance"),
+                        color: "maintenance",
+                    };
                 } else {
                     result[monitorID] = unknown;
                 }

From 7ef404ccc10517187ad4841afb331dac9e53cc6e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 17 Jan 2023 20:32:44 +0800
Subject: [PATCH 468/803] Update to 1.19.5

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

diff --git a/package.json b/package.json
index b87eb0e2..bfd03b33 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.4",
+    "version": "1.19.5",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -39,7 +39,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.19.4 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.19.5 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 54d4c4d3f76934e4392e209b58eb2d081ee36293 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 17 Jan 2023 21:18:13 +0800
Subject: [PATCH 469/803] Merge package-lock.json

---
 package-lock.json | 2379 ++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 2377 insertions(+), 2 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index fbfcebe6..12941d56 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.4",
+    "version": "1.19.5",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.4",
+            "version": "1.19.5",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
@@ -39,6 +39,7 @@
                 "jsonwebtoken": "~9.0.0",
                 "jwt-decode": "~3.1.2",
                 "limiter": "~2.1.0",
+                "mongodb": "~4.13.0",
                 "mqtt": "~4.3.7",
                 "mssql": "~8.1.4",
                 "mysql2": "~2.3.3",
@@ -53,6 +54,7 @@
                 "prometheus-api-metrics": "~3.2.1",
                 "protobufjs": "~7.1.1",
                 "redbean-node": "~0.2.0",
+                "redis": "~4.5.1",
                 "socket.io": "~4.5.3",
                 "socket.io-client": "~4.5.3",
                 "socks-proxy-agent": "6.1.1",
@@ -169,6 +171,1072 @@
                 "node": ">=6.0.0"
             }
         },
+        "node_modules/@aws-crypto/ie11-detection": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz",
+            "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/sha256-browser": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
+            "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/ie11-detection": "^2.0.0",
+                "@aws-crypto/sha256-js": "^2.0.0",
+                "@aws-crypto/supports-web-crypto": "^2.0.0",
+                "@aws-crypto/util": "^2.0.0",
+                "@aws-sdk/types": "^3.1.0",
+                "@aws-sdk/util-locate-window": "^3.0.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/sha256-js": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
+            "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/util": "^2.0.0",
+                "@aws-sdk/types": "^3.1.0",
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/sha256-js/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/supports-web-crypto": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz",
+            "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-crypto/util": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz",
+            "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "^3.110.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            }
+        },
+        "node_modules/@aws-crypto/util/node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "optional": true
+        },
+        "node_modules/@aws-sdk/abort-controller": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz",
+            "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-cognito-identity": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.245.0.tgz",
+            "integrity": "sha512-c5briTS05rAioO5b84bVng9M1KyAXcxJtDHeuoeAAZBuU+Dd0Scg3vyXyAFlGI+TsNyxqHAqqRdAoG4WNxJo/Q==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/client-sts": "3.245.0",
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/credential-provider-node": "3.245.0",
+                "@aws-sdk/fetch-http-handler": "3.226.0",
+                "@aws-sdk/hash-node": "3.226.0",
+                "@aws-sdk/invalid-dependency": "3.226.0",
+                "@aws-sdk/middleware-content-length": "3.226.0",
+                "@aws-sdk/middleware-endpoint": "3.226.0",
+                "@aws-sdk/middleware-host-header": "3.226.0",
+                "@aws-sdk/middleware-logger": "3.226.0",
+                "@aws-sdk/middleware-recursion-detection": "3.226.0",
+                "@aws-sdk/middleware-retry": "3.235.0",
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/middleware-signing": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/middleware-user-agent": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/node-http-handler": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/smithy-client": "3.234.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
+                "@aws-sdk/util-defaults-mode-node": "3.234.0",
+                "@aws-sdk/util-endpoints": "3.245.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/util-user-agent-browser": "3.226.0",
+                "@aws-sdk/util-user-agent-node": "3.226.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-sso": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.245.0.tgz",
+            "integrity": "sha512-dxzRwRo55ZNQ4hQigC+cishxLSWlBrbr3iszG0FLviavLDOlnVG5UUxWpOIGvwr8pYiSfM4jnfMxiwYwiCLg1g==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/fetch-http-handler": "3.226.0",
+                "@aws-sdk/hash-node": "3.226.0",
+                "@aws-sdk/invalid-dependency": "3.226.0",
+                "@aws-sdk/middleware-content-length": "3.226.0",
+                "@aws-sdk/middleware-endpoint": "3.226.0",
+                "@aws-sdk/middleware-host-header": "3.226.0",
+                "@aws-sdk/middleware-logger": "3.226.0",
+                "@aws-sdk/middleware-recursion-detection": "3.226.0",
+                "@aws-sdk/middleware-retry": "3.235.0",
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/middleware-user-agent": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/node-http-handler": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/smithy-client": "3.234.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
+                "@aws-sdk/util-defaults-mode-node": "3.234.0",
+                "@aws-sdk/util-endpoints": "3.245.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/util-user-agent-browser": "3.226.0",
+                "@aws-sdk/util-user-agent-node": "3.226.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-sso-oidc": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.245.0.tgz",
+            "integrity": "sha512-0pGPA00kEsu2Yq1Ul+OwftHxws5YVllm4iZrPtGnqmXr7wmf6B9lOtrMQF44y7Tfw53po6+bKz08OKTEWkkjUA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/fetch-http-handler": "3.226.0",
+                "@aws-sdk/hash-node": "3.226.0",
+                "@aws-sdk/invalid-dependency": "3.226.0",
+                "@aws-sdk/middleware-content-length": "3.226.0",
+                "@aws-sdk/middleware-endpoint": "3.226.0",
+                "@aws-sdk/middleware-host-header": "3.226.0",
+                "@aws-sdk/middleware-logger": "3.226.0",
+                "@aws-sdk/middleware-recursion-detection": "3.226.0",
+                "@aws-sdk/middleware-retry": "3.235.0",
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/middleware-user-agent": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/node-http-handler": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/smithy-client": "3.234.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
+                "@aws-sdk/util-defaults-mode-node": "3.234.0",
+                "@aws-sdk/util-endpoints": "3.245.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/util-user-agent-browser": "3.226.0",
+                "@aws-sdk/util-user-agent-node": "3.226.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/client-sts": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.245.0.tgz",
+            "integrity": "sha512-E+7v2sy34TLni/Dmz6bTU20NWvbHYH9sVUHKQ9kHhmFopUWrs4Nt77f85PbuiKJz/irjUh9ppT5q1odJNRKRVQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/credential-provider-node": "3.245.0",
+                "@aws-sdk/fetch-http-handler": "3.226.0",
+                "@aws-sdk/hash-node": "3.226.0",
+                "@aws-sdk/invalid-dependency": "3.226.0",
+                "@aws-sdk/middleware-content-length": "3.226.0",
+                "@aws-sdk/middleware-endpoint": "3.226.0",
+                "@aws-sdk/middleware-host-header": "3.226.0",
+                "@aws-sdk/middleware-logger": "3.226.0",
+                "@aws-sdk/middleware-recursion-detection": "3.226.0",
+                "@aws-sdk/middleware-retry": "3.235.0",
+                "@aws-sdk/middleware-sdk-sts": "3.226.0",
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/middleware-signing": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/middleware-user-agent": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/node-http-handler": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/smithy-client": "3.234.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
+                "@aws-sdk/util-defaults-mode-node": "3.234.0",
+                "@aws-sdk/util-endpoints": "3.245.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/util-user-agent-browser": "3.226.0",
+                "@aws-sdk/util-user-agent-node": "3.226.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "fast-xml-parser": "4.0.11",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/config-resolver": {
+            "version": "3.234.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz",
+            "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/signature-v4": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-cognito-identity": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.245.0.tgz",
+            "integrity": "sha512-DkiPv7Yb9iw3yAzvWUAkXrI23F1+kV8grdXzlSzob5suqv/dVON5pFXK9Siz62WwWsa2FeCEpgEF7RA0mrWLtA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-cognito-identity": "3.245.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-env": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz",
+            "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-imds": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz",
+            "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-ini": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.245.0.tgz",
+            "integrity": "sha512-1SjfVc5Wg0lLRUvwMrfjGgFkl+zfxn74gnkPr6by1QyMAoTzmeUkalPLAIqd+uHtFom9e3K633BQtX7zVPZ5XQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/credential-provider-env": "3.226.0",
+                "@aws-sdk/credential-provider-imds": "3.226.0",
+                "@aws-sdk/credential-provider-process": "3.226.0",
+                "@aws-sdk/credential-provider-sso": "3.245.0",
+                "@aws-sdk/credential-provider-web-identity": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-node": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.245.0.tgz",
+            "integrity": "sha512-Dwv8zmRLTDLeEkGrK/sLNFZSC+ahXZxr07CuID054QKACIdUEvkqYlnalRiTeXngiHGQ54u8wU7f0D32R2oL0g==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/credential-provider-env": "3.226.0",
+                "@aws-sdk/credential-provider-imds": "3.226.0",
+                "@aws-sdk/credential-provider-ini": "3.245.0",
+                "@aws-sdk/credential-provider-process": "3.226.0",
+                "@aws-sdk/credential-provider-sso": "3.245.0",
+                "@aws-sdk/credential-provider-web-identity": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-process": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz",
+            "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-sso": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.245.0.tgz",
+            "integrity": "sha512-txWrJc0WNBhXMi7q+twjx7cs/qzgTfbQ+vbag5idRmdoUeiR8rfLvihCab2NaGg50xhh+TaoUCXrgJp3E/XjYQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-sso": "3.245.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/token-providers": "3.245.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-provider-web-identity": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz",
+            "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/credential-providers": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.245.0.tgz",
+            "integrity": "sha512-6Uhsxk6MOuWplejhPJf7XDhegHmcZfj8hwnF4mXFJ6u4b2RxWPQCnqPcA0+VoAzIMUqbjqvkSzmVjQelGFtjNg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-cognito-identity": "3.245.0",
+                "@aws-sdk/client-sso": "3.245.0",
+                "@aws-sdk/client-sts": "3.245.0",
+                "@aws-sdk/credential-provider-cognito-identity": "3.245.0",
+                "@aws-sdk/credential-provider-env": "3.226.0",
+                "@aws-sdk/credential-provider-imds": "3.226.0",
+                "@aws-sdk/credential-provider-ini": "3.245.0",
+                "@aws-sdk/credential-provider-node": "3.245.0",
+                "@aws-sdk/credential-provider-process": "3.226.0",
+                "@aws-sdk/credential-provider-sso": "3.245.0",
+                "@aws-sdk/credential-provider-web-identity": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/fetch-http-handler": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz",
+            "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/querystring-builder": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/hash-node": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz",
+            "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/invalid-dependency": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz",
+            "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/is-array-buffer": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz",
+            "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-content-length": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz",
+            "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-endpoint": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz",
+            "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/signature-v4": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-host-header": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz",
+            "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-logger": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz",
+            "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-recursion-detection": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz",
+            "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-retry": {
+            "version": "3.235.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz",
+            "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/service-error-classification": "3.229.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "tslib": "^2.3.1",
+                "uuid": "^8.3.2"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-sdk-sts": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz",
+            "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/middleware-signing": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/signature-v4": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-serde": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz",
+            "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-signing": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz",
+            "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/signature-v4": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-stack": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz",
+            "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/middleware-user-agent": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz",
+            "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/node-config-provider": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz",
+            "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/node-http-handler": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz",
+            "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/abort-controller": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/querystring-builder": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/property-provider": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz",
+            "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/protocol-http": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz",
+            "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/querystring-builder": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz",
+            "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/querystring-parser": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz",
+            "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/service-error-classification": {
+            "version": "3.229.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.229.0.tgz",
+            "integrity": "sha512-dnzWWQ0/NoWMUZ5C0DW3dPm0wC1O76Y/SpKbuJzWPkx1EYy6r8p32Ly4D9vUzrKDbRGf48YHIF2kOkBmu21CLg==",
+            "optional": true,
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/shared-ini-file-loader": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz",
+            "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/signature-v4": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz",
+            "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-hex-encoding": "3.201.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/smithy-client": {
+            "version": "3.234.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz",
+            "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/token-providers": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.245.0.tgz",
+            "integrity": "sha512-m/spXR/vEXGb+zMqRUMQYVMwFZSTdK5RkddYqamYkNhIoLm60EYeRu57JsMMs5djKi8dBRSKiXwVHx0l2rXMjg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/client-sso-oidc": "3.245.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/types": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz",
+            "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/url-parser": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz",
+            "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/querystring-parser": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-base64": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz",
+            "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-body-length-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+            "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-body-length-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz",
+            "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-buffer-from": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz",
+            "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-config-provider": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz",
+            "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-defaults-mode-browser": {
+            "version": "3.234.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz",
+            "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-defaults-mode-node": {
+            "version": "3.234.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz",
+            "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/credential-provider-imds": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-endpoints": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.245.0.tgz",
+            "integrity": "sha512-UNOFquB1tKx+8RT8n82Zb5tIwDyZHVPBg/m0LB0RsLETjr6krien5ASpqWezsXKIR1hftN9uaxN4bvf2dZrWHg==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-hex-encoding": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz",
+            "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-locate-window": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz",
+            "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-middleware": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz",
+            "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-retry": {
+            "version": "3.229.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.229.0.tgz",
+            "integrity": "sha512-0zKTqi0P1inD0LzIMuXRIYYQ/8c1lWMg/cfiqUcIAF1TpatlpZuN7umU0ierpBFud7S+zDgg0oemh+Nj8xliJw==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/service-error-classification": "3.229.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">= 14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-uri-escape": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz",
+            "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
+        "node_modules/@aws-sdk/util-user-agent-browser": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz",
+            "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/types": "3.226.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-user-agent-node": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz",
+            "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            },
+            "peerDependencies": {
+                "aws-crt": ">=1.0.0"
+            },
+            "peerDependenciesMeta": {
+                "aws-crt": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@aws-sdk/util-utf8-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz",
+            "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "node_modules/@aws-sdk/util-utf8-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz",
+            "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==",
+            "optional": true,
+            "dependencies": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            }
+        },
         "node_modules/@azure/abort-controller": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
@@ -3426,6 +4494,64 @@
             "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
             "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
         },
+        "node_modules/@redis/bloom": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz",
+            "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/client": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz",
+            "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==",
+            "dependencies": {
+                "cluster-key-slot": "1.1.1",
+                "generic-pool": "3.9.0",
+                "yallist": "4.0.0"
+            },
+            "engines": {
+                "node": ">=14"
+            }
+        },
+        "node_modules/@redis/client/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "node_modules/@redis/graph": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
+            "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/json": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+            "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/search": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz",
+            "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
+        "node_modules/@redis/time-series": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
+            "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==",
+            "peerDependencies": {
+                "@redis/client": "^1.0.0"
+            }
+        },
         "node_modules/@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -3768,6 +4894,20 @@
             "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
             "dev": true
         },
+        "node_modules/@types/webidl-conversions": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+            "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+        },
+        "node_modules/@types/whatwg-url": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+            "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+            "dependencies": {
+                "@types/node": "*",
+                "@types/webidl-conversions": "*"
+            }
+        },
         "node_modules/@types/yargs": {
             "version": "16.0.5",
             "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz",
@@ -4882,6 +6022,12 @@
                 "@popperjs/core": "^2.10.2"
             }
         },
+        "node_modules/bowser": {
+            "version": "2.11.0",
+            "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+            "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+            "optional": true
+        },
         "node_modules/brace-expansion": {
             "version": "1.1.11",
             "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -4967,6 +6113,17 @@
                 "node-int64": "^0.4.0"
             }
         },
+        "node_modules/bson": {
+            "version": "4.7.2",
+            "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
+            "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
+            "dependencies": {
+                "buffer": "^5.6.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/buffer": {
             "version": "5.7.1",
             "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -5370,6 +6527,14 @@
                 "node": ">=6"
             }
         },
+        "node_modules/cluster-key-slot": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
+            "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
         "node_modules/co": {
             "version": "4.6.0",
             "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -7901,6 +9066,22 @@
             "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
             "dev": true
         },
+        "node_modules/fast-xml-parser": {
+            "version": "4.0.11",
+            "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+            "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+            "optional": true,
+            "dependencies": {
+                "strnum": "^1.0.5"
+            },
+            "bin": {
+                "fxparser": "src/cli/cli.js"
+            },
+            "funding": {
+                "type": "paypal",
+                "url": "https://paypal.me/naturalintelligence"
+            }
+        },
         "node_modules/fastest-levenshtein": {
             "version": "1.0.16",
             "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -8287,6 +9468,14 @@
                 "is-property": "^1.0.2"
             }
         },
+        "node_modules/generic-pool": {
+            "version": "3.9.0",
+            "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
+            "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
+            "engines": {
+                "node": ">= 4"
+            }
+        },
         "node_modules/gensync": {
             "version": "1.0.0-beta.2",
             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -12134,6 +13323,12 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/memory-pager": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+            "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+            "optional": true
+        },
         "node_modules/meow": {
             "version": "9.0.0",
             "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
@@ -12355,6 +13550,63 @@
                 "node": ">=10"
             }
         },
+        "node_modules/mongodb": {
+            "version": "4.13.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
+            "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
+            "dependencies": {
+                "bson": "^4.7.0",
+                "mongodb-connection-string-url": "^2.5.4",
+                "socks": "^2.7.1"
+            },
+            "engines": {
+                "node": ">=12.9.0"
+            },
+            "optionalDependencies": {
+                "@aws-sdk/credential-providers": "^3.186.0",
+                "saslprep": "^1.0.3"
+            }
+        },
+        "node_modules/mongodb-connection-string-url": {
+            "version": "2.6.0",
+            "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
+            "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
+            "dependencies": {
+                "@types/whatwg-url": "^8.2.1",
+                "whatwg-url": "^11.0.0"
+            }
+        },
+        "node_modules/mongodb-connection-string-url/node_modules/tr46": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+            "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+            "dependencies": {
+                "punycode": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+            "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": {
+            "version": "11.0.0",
+            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+            "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+            "dependencies": {
+                "tr46": "^3.0.0",
+                "webidl-conversions": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/mqemitter": {
             "version": "4.5.0",
             "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
@@ -14201,6 +15453,19 @@
                 "node": ">=8"
             }
         },
+        "node_modules/redis": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz",
+            "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==",
+            "dependencies": {
+                "@redis/bloom": "1.1.0",
+                "@redis/client": "1.4.2",
+                "@redis/graph": "1.1.0",
+                "@redis/json": "1.0.4",
+                "@redis/search": "1.1.0",
+                "@redis/time-series": "1.0.4"
+            }
+        },
         "node_modules/regenerate": {
             "version": "1.4.2",
             "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -14764,6 +16029,18 @@
             "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
+        "node_modules/saslprep": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+            "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+            "optional": true,
+            "dependencies": {
+                "sparse-bitfield": "^3.0.3"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/sass": {
             "version": "1.42.1",
             "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz",
@@ -15097,6 +16374,15 @@
             "deprecated": "Please use @jridgewell/sourcemap-codec instead",
             "dev": true
         },
+        "node_modules/sparse-bitfield": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+            "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+            "optional": true,
+            "dependencies": {
+                "memory-pager": "^1.0.2"
+            }
+        },
         "node_modules/spawn-command": {
             "version": "0.0.2-1",
             "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
@@ -15365,6 +16651,12 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/strnum": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+            "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+            "optional": true
+        },
         "node_modules/style-search": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
@@ -17203,6 +18495,912 @@
                 }
             }
         },
+        "@aws-crypto/ie11-detection": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz",
+            "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==",
+            "optional": true,
+            "requires": {
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/sha256-browser": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
+            "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/ie11-detection": "^2.0.0",
+                "@aws-crypto/sha256-js": "^2.0.0",
+                "@aws-crypto/supports-web-crypto": "^2.0.0",
+                "@aws-crypto/util": "^2.0.0",
+                "@aws-sdk/types": "^3.1.0",
+                "@aws-sdk/util-locate-window": "^3.0.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/sha256-js": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
+            "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/util": "^2.0.0",
+                "@aws-sdk/types": "^3.1.0",
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/supports-web-crypto": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz",
+            "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==",
+            "optional": true,
+            "requires": {
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-crypto/util": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz",
+            "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "^3.110.0",
+                "@aws-sdk/util-utf8-browser": "^3.0.0",
+                "tslib": "^1.11.1"
+            },
+            "dependencies": {
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+                    "optional": true
+                }
+            }
+        },
+        "@aws-sdk/abort-controller": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz",
+            "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-cognito-identity": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.245.0.tgz",
+            "integrity": "sha512-c5briTS05rAioO5b84bVng9M1KyAXcxJtDHeuoeAAZBuU+Dd0Scg3vyXyAFlGI+TsNyxqHAqqRdAoG4WNxJo/Q==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/client-sts": "3.245.0",
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/credential-provider-node": "3.245.0",
+                "@aws-sdk/fetch-http-handler": "3.226.0",
+                "@aws-sdk/hash-node": "3.226.0",
+                "@aws-sdk/invalid-dependency": "3.226.0",
+                "@aws-sdk/middleware-content-length": "3.226.0",
+                "@aws-sdk/middleware-endpoint": "3.226.0",
+                "@aws-sdk/middleware-host-header": "3.226.0",
+                "@aws-sdk/middleware-logger": "3.226.0",
+                "@aws-sdk/middleware-recursion-detection": "3.226.0",
+                "@aws-sdk/middleware-retry": "3.235.0",
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/middleware-signing": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/middleware-user-agent": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/node-http-handler": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/smithy-client": "3.234.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
+                "@aws-sdk/util-defaults-mode-node": "3.234.0",
+                "@aws-sdk/util-endpoints": "3.245.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/util-user-agent-browser": "3.226.0",
+                "@aws-sdk/util-user-agent-node": "3.226.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-sso": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.245.0.tgz",
+            "integrity": "sha512-dxzRwRo55ZNQ4hQigC+cishxLSWlBrbr3iszG0FLviavLDOlnVG5UUxWpOIGvwr8pYiSfM4jnfMxiwYwiCLg1g==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/fetch-http-handler": "3.226.0",
+                "@aws-sdk/hash-node": "3.226.0",
+                "@aws-sdk/invalid-dependency": "3.226.0",
+                "@aws-sdk/middleware-content-length": "3.226.0",
+                "@aws-sdk/middleware-endpoint": "3.226.0",
+                "@aws-sdk/middleware-host-header": "3.226.0",
+                "@aws-sdk/middleware-logger": "3.226.0",
+                "@aws-sdk/middleware-recursion-detection": "3.226.0",
+                "@aws-sdk/middleware-retry": "3.235.0",
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/middleware-user-agent": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/node-http-handler": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/smithy-client": "3.234.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
+                "@aws-sdk/util-defaults-mode-node": "3.234.0",
+                "@aws-sdk/util-endpoints": "3.245.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/util-user-agent-browser": "3.226.0",
+                "@aws-sdk/util-user-agent-node": "3.226.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-sso-oidc": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.245.0.tgz",
+            "integrity": "sha512-0pGPA00kEsu2Yq1Ul+OwftHxws5YVllm4iZrPtGnqmXr7wmf6B9lOtrMQF44y7Tfw53po6+bKz08OKTEWkkjUA==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/fetch-http-handler": "3.226.0",
+                "@aws-sdk/hash-node": "3.226.0",
+                "@aws-sdk/invalid-dependency": "3.226.0",
+                "@aws-sdk/middleware-content-length": "3.226.0",
+                "@aws-sdk/middleware-endpoint": "3.226.0",
+                "@aws-sdk/middleware-host-header": "3.226.0",
+                "@aws-sdk/middleware-logger": "3.226.0",
+                "@aws-sdk/middleware-recursion-detection": "3.226.0",
+                "@aws-sdk/middleware-retry": "3.235.0",
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/middleware-user-agent": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/node-http-handler": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/smithy-client": "3.234.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
+                "@aws-sdk/util-defaults-mode-node": "3.234.0",
+                "@aws-sdk/util-endpoints": "3.245.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/util-user-agent-browser": "3.226.0",
+                "@aws-sdk/util-user-agent-node": "3.226.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/client-sts": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.245.0.tgz",
+            "integrity": "sha512-E+7v2sy34TLni/Dmz6bTU20NWvbHYH9sVUHKQ9kHhmFopUWrs4Nt77f85PbuiKJz/irjUh9ppT5q1odJNRKRVQ==",
+            "optional": true,
+            "requires": {
+                "@aws-crypto/sha256-browser": "2.0.0",
+                "@aws-crypto/sha256-js": "2.0.0",
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/credential-provider-node": "3.245.0",
+                "@aws-sdk/fetch-http-handler": "3.226.0",
+                "@aws-sdk/hash-node": "3.226.0",
+                "@aws-sdk/invalid-dependency": "3.226.0",
+                "@aws-sdk/middleware-content-length": "3.226.0",
+                "@aws-sdk/middleware-endpoint": "3.226.0",
+                "@aws-sdk/middleware-host-header": "3.226.0",
+                "@aws-sdk/middleware-logger": "3.226.0",
+                "@aws-sdk/middleware-recursion-detection": "3.226.0",
+                "@aws-sdk/middleware-retry": "3.235.0",
+                "@aws-sdk/middleware-sdk-sts": "3.226.0",
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/middleware-signing": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/middleware-user-agent": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/node-http-handler": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/smithy-client": "3.234.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "@aws-sdk/util-body-length-browser": "3.188.0",
+                "@aws-sdk/util-body-length-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
+                "@aws-sdk/util-defaults-mode-node": "3.234.0",
+                "@aws-sdk/util-endpoints": "3.245.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/util-user-agent-browser": "3.226.0",
+                "@aws-sdk/util-user-agent-node": "3.226.0",
+                "@aws-sdk/util-utf8-browser": "3.188.0",
+                "@aws-sdk/util-utf8-node": "3.208.0",
+                "fast-xml-parser": "4.0.11",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/config-resolver": {
+            "version": "3.234.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz",
+            "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/signature-v4": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-cognito-identity": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.245.0.tgz",
+            "integrity": "sha512-DkiPv7Yb9iw3yAzvWUAkXrI23F1+kV8grdXzlSzob5suqv/dVON5pFXK9Siz62WwWsa2FeCEpgEF7RA0mrWLtA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-cognito-identity": "3.245.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-env": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz",
+            "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-imds": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz",
+            "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-ini": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.245.0.tgz",
+            "integrity": "sha512-1SjfVc5Wg0lLRUvwMrfjGgFkl+zfxn74gnkPr6by1QyMAoTzmeUkalPLAIqd+uHtFom9e3K633BQtX7zVPZ5XQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/credential-provider-env": "3.226.0",
+                "@aws-sdk/credential-provider-imds": "3.226.0",
+                "@aws-sdk/credential-provider-process": "3.226.0",
+                "@aws-sdk/credential-provider-sso": "3.245.0",
+                "@aws-sdk/credential-provider-web-identity": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-node": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.245.0.tgz",
+            "integrity": "sha512-Dwv8zmRLTDLeEkGrK/sLNFZSC+ahXZxr07CuID054QKACIdUEvkqYlnalRiTeXngiHGQ54u8wU7f0D32R2oL0g==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/credential-provider-env": "3.226.0",
+                "@aws-sdk/credential-provider-imds": "3.226.0",
+                "@aws-sdk/credential-provider-ini": "3.245.0",
+                "@aws-sdk/credential-provider-process": "3.226.0",
+                "@aws-sdk/credential-provider-sso": "3.245.0",
+                "@aws-sdk/credential-provider-web-identity": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-process": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz",
+            "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-sso": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.245.0.tgz",
+            "integrity": "sha512-txWrJc0WNBhXMi7q+twjx7cs/qzgTfbQ+vbag5idRmdoUeiR8rfLvihCab2NaGg50xhh+TaoUCXrgJp3E/XjYQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-sso": "3.245.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/token-providers": "3.245.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-provider-web-identity": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz",
+            "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/credential-providers": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.245.0.tgz",
+            "integrity": "sha512-6Uhsxk6MOuWplejhPJf7XDhegHmcZfj8hwnF4mXFJ6u4b2RxWPQCnqPcA0+VoAzIMUqbjqvkSzmVjQelGFtjNg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-cognito-identity": "3.245.0",
+                "@aws-sdk/client-sso": "3.245.0",
+                "@aws-sdk/client-sts": "3.245.0",
+                "@aws-sdk/credential-provider-cognito-identity": "3.245.0",
+                "@aws-sdk/credential-provider-env": "3.226.0",
+                "@aws-sdk/credential-provider-imds": "3.226.0",
+                "@aws-sdk/credential-provider-ini": "3.245.0",
+                "@aws-sdk/credential-provider-node": "3.245.0",
+                "@aws-sdk/credential-provider-process": "3.226.0",
+                "@aws-sdk/credential-provider-sso": "3.245.0",
+                "@aws-sdk/credential-provider-web-identity": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/fetch-http-handler": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz",
+            "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/querystring-builder": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-base64": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/hash-node": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz",
+            "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/invalid-dependency": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz",
+            "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/is-array-buffer": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz",
+            "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-content-length": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz",
+            "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-endpoint": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz",
+            "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/middleware-serde": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/signature-v4": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/util-config-provider": "3.208.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-host-header": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz",
+            "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-logger": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz",
+            "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-recursion-detection": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz",
+            "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-retry": {
+            "version": "3.235.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz",
+            "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/service-error-classification": "3.229.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-retry": "3.229.0",
+                "tslib": "^2.3.1",
+                "uuid": "^8.3.2"
+            }
+        },
+        "@aws-sdk/middleware-sdk-sts": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz",
+            "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/middleware-signing": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/signature-v4": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-serde": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz",
+            "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-signing": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz",
+            "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/signature-v4": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-stack": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz",
+            "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/middleware-user-agent": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz",
+            "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/node-config-provider": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz",
+            "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/node-http-handler": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz",
+            "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/abort-controller": "3.226.0",
+                "@aws-sdk/protocol-http": "3.226.0",
+                "@aws-sdk/querystring-builder": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/property-provider": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz",
+            "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/protocol-http": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz",
+            "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/querystring-builder": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz",
+            "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/querystring-parser": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz",
+            "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/service-error-classification": {
+            "version": "3.229.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.229.0.tgz",
+            "integrity": "sha512-dnzWWQ0/NoWMUZ5C0DW3dPm0wC1O76Y/SpKbuJzWPkx1EYy6r8p32Ly4D9vUzrKDbRGf48YHIF2kOkBmu21CLg==",
+            "optional": true
+        },
+        "@aws-sdk/shared-ini-file-loader": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz",
+            "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/signature-v4": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz",
+            "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/util-hex-encoding": "3.201.0",
+                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-uri-escape": "3.201.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/smithy-client": {
+            "version": "3.234.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz",
+            "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/middleware-stack": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/token-providers": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.245.0.tgz",
+            "integrity": "sha512-m/spXR/vEXGb+zMqRUMQYVMwFZSTdK5RkddYqamYkNhIoLm60EYeRu57JsMMs5djKi8dBRSKiXwVHx0l2rXMjg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/client-sso-oidc": "3.245.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/shared-ini-file-loader": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/types": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz",
+            "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/url-parser": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz",
+            "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/querystring-parser": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-base64": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz",
+            "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-body-length-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+            "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-body-length-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz",
+            "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-buffer-from": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz",
+            "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/is-array-buffer": "3.201.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-config-provider": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz",
+            "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-defaults-mode-browser": {
+            "version": "3.234.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz",
+            "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-defaults-mode-node": {
+            "version": "3.234.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz",
+            "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/config-resolver": "3.234.0",
+                "@aws-sdk/credential-provider-imds": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/property-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-endpoints": {
+            "version": "3.245.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.245.0.tgz",
+            "integrity": "sha512-UNOFquB1tKx+8RT8n82Zb5tIwDyZHVPBg/m0LB0RsLETjr6krien5ASpqWezsXKIR1hftN9uaxN4bvf2dZrWHg==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-hex-encoding": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz",
+            "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-locate-window": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz",
+            "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-middleware": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz",
+            "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-retry": {
+            "version": "3.229.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.229.0.tgz",
+            "integrity": "sha512-0zKTqi0P1inD0LzIMuXRIYYQ/8c1lWMg/cfiqUcIAF1TpatlpZuN7umU0ierpBFud7S+zDgg0oemh+Nj8xliJw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/service-error-classification": "3.229.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-uri-escape": {
+            "version": "3.201.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz",
+            "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-user-agent-browser": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz",
+            "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/types": "3.226.0",
+                "bowser": "^2.11.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-user-agent-node": {
+            "version": "3.226.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz",
+            "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/node-config-provider": "3.226.0",
+                "@aws-sdk/types": "3.226.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-utf8-browser": {
+            "version": "3.188.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz",
+            "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==",
+            "optional": true,
+            "requires": {
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-utf8-node": {
+            "version": "3.208.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz",
+            "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
+                "tslib": "^2.3.1"
+            }
+        },
         "@azure/abort-controller": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
@@ -19610,6 +21808,48 @@
             "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
             "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
         },
+        "@redis/bloom": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz",
+            "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ=="
+        },
+        "@redis/client": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz",
+            "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==",
+            "requires": {
+                "cluster-key-slot": "1.1.1",
+                "generic-pool": "3.9.0",
+                "yallist": "4.0.0"
+            },
+            "dependencies": {
+                "yallist": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+                }
+            }
+        },
+        "@redis/graph": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
+            "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg=="
+        },
+        "@redis/json": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+            "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw=="
+        },
+        "@redis/search": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz",
+            "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ=="
+        },
+        "@redis/time-series": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
+            "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng=="
+        },
         "@sideway/address": {
             "version": "4.1.4",
             "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -19949,6 +22189,20 @@
             "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
             "dev": true
         },
+        "@types/webidl-conversions": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+            "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+        },
+        "@types/whatwg-url": {
+            "version": "8.2.2",
+            "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+            "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+            "requires": {
+                "@types/node": "*",
+                "@types/webidl-conversions": "*"
+            }
+        },
         "@types/yargs": {
             "version": "16.0.5",
             "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz",
@@ -20866,6 +23120,12 @@
             "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
             "dev": true
         },
+        "bowser": {
+            "version": "2.11.0",
+            "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+            "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+            "optional": true
+        },
         "brace-expansion": {
             "version": "1.1.11",
             "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -20929,6 +23189,14 @@
                 "node-int64": "^0.4.0"
             }
         },
+        "bson": {
+            "version": "4.7.2",
+            "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
+            "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
+            "requires": {
+                "buffer": "^5.6.0"
+            }
+        },
         "buffer": {
             "version": "5.7.1",
             "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -21212,6 +23480,11 @@
                 "is-regexp": "^2.0.0"
             }
         },
+        "cluster-key-slot": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
+            "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw=="
+        },
         "co": {
             "version": "4.6.0",
             "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -23017,6 +25290,15 @@
             "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
             "dev": true
         },
+        "fast-xml-parser": {
+            "version": "4.0.11",
+            "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+            "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+            "optional": true,
+            "requires": {
+                "strnum": "^1.0.5"
+            }
+        },
         "fastest-levenshtein": {
             "version": "1.0.16",
             "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -23328,6 +25610,11 @@
                 "is-property": "^1.0.2"
             }
         },
+        "generic-pool": {
+            "version": "3.9.0",
+            "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
+            "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="
+        },
         "gensync": {
             "version": "1.0.0-beta.2",
             "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -26169,6 +28456,12 @@
             "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
             "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
         },
+        "memory-pager": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+            "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+            "optional": true
+        },
         "meow": {
             "version": "9.0.0",
             "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
@@ -26333,6 +28626,51 @@
             "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
             "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         },
+        "mongodb": {
+            "version": "4.13.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
+            "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
+            "requires": {
+                "@aws-sdk/credential-providers": "^3.186.0",
+                "bson": "^4.7.0",
+                "mongodb-connection-string-url": "^2.5.4",
+                "saslprep": "^1.0.3",
+                "socks": "^2.7.1"
+            }
+        },
+        "mongodb-connection-string-url": {
+            "version": "2.6.0",
+            "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
+            "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
+            "requires": {
+                "@types/whatwg-url": "^8.2.1",
+                "whatwg-url": "^11.0.0"
+            },
+            "dependencies": {
+                "tr46": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+                    "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+                    "requires": {
+                        "punycode": "^2.1.1"
+                    }
+                },
+                "webidl-conversions": {
+                    "version": "7.0.0",
+                    "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+                    "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
+                },
+                "whatwg-url": {
+                    "version": "11.0.0",
+                    "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+                    "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+                    "requires": {
+                        "tr46": "^3.0.0",
+                        "webidl-conversions": "^7.0.0"
+                    }
+                }
+            }
+        },
         "mqemitter": {
             "version": "4.5.0",
             "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-4.5.0.tgz",
@@ -27750,6 +30088,19 @@
                 "strip-indent": "^3.0.0"
             }
         },
+        "redis": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz",
+            "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==",
+            "requires": {
+                "@redis/bloom": "1.1.0",
+                "@redis/client": "1.4.2",
+                "@redis/graph": "1.1.0",
+                "@redis/json": "1.0.4",
+                "@redis/search": "1.1.0",
+                "@redis/time-series": "1.0.4"
+            }
+        },
         "regenerate": {
             "version": "1.4.2",
             "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -28168,6 +30519,15 @@
             "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
+        "saslprep": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+            "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+            "optional": true,
+            "requires": {
+                "sparse-bitfield": "^3.0.3"
+            }
+        },
         "sass": {
             "version": "1.42.1",
             "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz",
@@ -28435,6 +30795,15 @@
             "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
             "dev": true
         },
+        "sparse-bitfield": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+            "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+            "optional": true,
+            "requires": {
+                "memory-pager": "^1.0.2"
+            }
+        },
         "spawn-command": {
             "version": "0.0.2-1",
             "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
@@ -28636,6 +31005,12 @@
             "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
             "dev": true
         },
+        "strnum": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+            "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+            "optional": true
+        },
         "style-search": {
             "version": "0.1.0",
             "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",

From 6961b1bdd26877614c5aeab4b7b33083b4da80b3 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Wed, 18 Jan 2023 09:53:04 +0800
Subject: [PATCH 470/803] Fix: Use default timeout & CachebleDnsHttpsAgent

---
 server/model/monitor.js | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index e5e911af..28fae9e6 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -495,13 +495,17 @@ class Monitor extends BeanModel {
 
                     const options = {
                         url: `/containers/${this.docker_container}/json`,
+                        timeout: this.interval * 1000 * 0.8,
                         headers: {
                             "Accept": "*/*",
                             "User-Agent": "Uptime-Kuma/" + version,
                         },
-                        httpsAgent: new https.Agent({
+                        httpsAgent: CacheableDnsHttpAgent.getHttpsAgent({
                             maxCachedSessions: 0,      // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940)
-                            rejectUnauthorized: ! this.getIgnoreTls(),
+                            rejectUnauthorized: !this.getIgnoreTls(),
+                        }),
+                        httpAgent: CacheableDnsHttpAgent.getHttpAgent({
+                            maxCachedSessions: 0,
                         }),
                     };
 

From 86bcb85e9bd6004609a5fc519fd26ac2af6fb88e Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 18 Jan 2023 16:38:55 +0000
Subject: [PATCH 471/803] Perform sanity check on uptime for status page

Fixes #2628
A sanity check is performed when calculating the uptime of a monitor on
status page. If it is greater than 100%, we just show 100%. This hasn't
been implemented on the dashboard at the request of @louislam due to
concerns it would make debugging more difficult in future if changes
were made to the uptime calculation.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/components/Uptime.vue | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index 7b5f48bb..09a531a5 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -33,7 +33,13 @@ export default {
             let key = this.monitor.id + "_" + this.type;
 
             if (this.$root.uptimeList[key] !== undefined) {
-                return Math.round(this.$root.uptimeList[key] * 10000) / 100 + "%";
+                let result = Math.round(this.$root.uptimeList[key] * 10000) / 100;
+                // Only perform sanity check on status page. See louislam/uptime-kuma#2628
+                if (this.$route.path.startsWith("/status")) {
+                    return result > 100 ? "100%" : result + "%";
+                } else {
+                    return result + "%";
+                }
             }
 
             return this.$t("notAvailableShort");

From 6cd6a2edf0f5889f619b75dc17ec2594894fa3c1 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 19 Jan 2023 02:16:07 +0800
Subject: [PATCH 472/803] Fix ping issue on Windows #2636

---
 package-lock.json | 18 +++++++++---------
 package.json      |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index fbfcebe6..33ce6af7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,16 +1,16 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.4",
+    "version": "1.19.5",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.4",
+            "version": "1.19.5",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
-                "@louislam/ping": "~0.4.2-mod.0",
+                "@louislam/ping": "~0.4.2-mod.1",
                 "@louislam/sqlite3": "15.1.2",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
@@ -3133,9 +3133,9 @@
             "integrity": "sha512-oTFmkyv5MhgkHdZhoe5lwRoKW0t4njPvK3g7ODvK/prkoC5bwylKcyQJMsmjvgHBXoy4u5iLnB5yQ7AljouHAA=="
         },
         "node_modules/@louislam/ping": {
-            "version": "0.4.2-mod.0",
-            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.0.tgz",
-            "integrity": "sha512-cyHnJHsMkC+sFU32GBzX5SlwdTb+BIBlwsdwsDm+AS9jcS1sz7JPBrdCStqpNkVn5lUUQZ7Ak5DRwlWuwJOYAg==",
+            "version": "0.4.2-mod.1",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.1.tgz",
+            "integrity": "sha512-KkRDo8qcF9kzzR0Hh8Iqz+XNnzKOdobUquP7UyBYrjxAB1jNT3qO0gvAZeDUknF28LXBPSzkiVlf1NG+tb/iyQ==",
             "dependencies": {
                 "command-exists": "~1.2.9",
                 "q": "1.x",
@@ -19360,9 +19360,9 @@
             "integrity": "sha512-oTFmkyv5MhgkHdZhoe5lwRoKW0t4njPvK3g7ODvK/prkoC5bwylKcyQJMsmjvgHBXoy4u5iLnB5yQ7AljouHAA=="
         },
         "@louislam/ping": {
-            "version": "0.4.2-mod.0",
-            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.0.tgz",
-            "integrity": "sha512-cyHnJHsMkC+sFU32GBzX5SlwdTb+BIBlwsdwsDm+AS9jcS1sz7JPBrdCStqpNkVn5lUUQZ7Ak5DRwlWuwJOYAg==",
+            "version": "0.4.2-mod.1",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.1.tgz",
+            "integrity": "sha512-KkRDo8qcF9kzzR0Hh8Iqz+XNnzKOdobUquP7UyBYrjxAB1jNT3qO0gvAZeDUknF28LXBPSzkiVlf1NG+tb/iyQ==",
             "requires": {
                 "command-exists": "~1.2.9",
                 "q": "1.x",
diff --git a/package.json b/package.json
index bfd03b33..d9646efc 100644
--- a/package.json
+++ b/package.json
@@ -67,7 +67,7 @@
     },
     "dependencies": {
         "@grpc/grpc-js": "~1.7.3",
-        "@louislam/ping": "~0.4.2-mod.0",
+        "@louislam/ping": "~0.4.2-mod.1",
         "@louislam/sqlite3": "15.1.2",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",

From 2b57b3e863954c9d9cf7911b76f600bb8de4c41b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 19 Jan 2023 02:17:17 +0800
Subject: [PATCH 473/803] Update to 1.19.6

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

diff --git a/package.json b/package.json
index d9646efc..55c8c436 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.5",
+    "version": "1.19.6",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -39,7 +39,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.19.5 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.19.6 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 316599210da6452a98b7a70d478fd8e551d0657d Mon Sep 17 00:00:00 2001
From: Abdulrahman Mustafa <123008422+amworx@users.noreply.github.com>
Date: Wed, 18 Jan 2023 19:03:04 +0000
Subject: [PATCH 474/803] =?UTF-8?q?Arabic=20language=20support=20is=20now?=
 =?UTF-8?q?=20in=20action=20=E2=9C=8C=EF=B8=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/i18n.js            |   3 +-
 src/languages/ar-SY.js | 684 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 686 insertions(+), 1 deletion(-)
 create mode 100644 src/languages/ar-SY.js

diff --git a/src/i18n.js b/src/i18n.js
index aff60c75..89e9ab1c 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -2,6 +2,7 @@ import { createI18n } from "vue-i18n/dist/vue-i18n.esm-browser.prod.js";
 import en from "./languages/en";
 
 const languageList = {
+    "ar-SY": "العربية",
     "cs-CZ": "Čeština",
     "zh-HK": "繁體中文 (香港)",
     "bg-BG": "Български",
@@ -48,7 +49,7 @@ for (let lang in languageList) {
     };
 }
 
-const rtlLangs = [ "fa" ];
+const rtlLangs = [ "fa" , "ar-SY"];
 
 export const currentLocale = () => localStorage.locale
     || languageList[navigator.language] && navigator.language
diff --git a/src/languages/ar-SY.js b/src/languages/ar-SY.js
new file mode 100644
index 00000000..55f3cbf6
--- /dev/null
+++ b/src/languages/ar-SY.js
@@ -0,0 +1,684 @@
+export default {
+    languageName: "إنجليزي",
+    checkEverySecond: "تحقق من كل {0} ثانية",
+    retryCheckEverySecond: "أعد محاولة كل {0} ثانية",
+    resendEveryXTimes: "إعادة تقديم كل {0} مرات",
+    resendDisabled: "إعادة الالتزام بالتعطيل",
+    retriesDescription: "الحد الأقصى لإعادة المحاولة قبل تمييز الخدمة على أنها لأسفل وإرسال إشعار",
+    ignoreTLSError: "تجاهل خطأ TLS/SSL لمواقع HTTPS",
+    upsideDownModeDescription: "اقلب الحالة رأسًا على عقب. إذا كانت الخدمة قابلة للوصول إلى أسفل.",
+    maxRedirectDescription: "الحد الأقصى لعدد إعادة التوجيه لمتابعة. ضبط على 0 لتعطيل إعادة التوجيه.",
+    enableGRPCTls: "السماح لإرسال طلب GRPC مع اتصال TLS",
+    grpcMethodDescription: "يتم تحويل اسم الطريقة إلى تنسيق Cammelcase مثل Sayhello Check وما إلى ذلك.",
+    acceptedStatusCodesDescription: "حدد رموز الحالة التي تعتبر استجابة ناجحة.",
+    Maintenance: "صيانة",
+    statusMaintenance: "صيانة",
+    "Schedule maintenance": "جدولة الصيانة",
+    "Affected Monitors": "الشاشات المتأثرة",
+    "Pick Affected Monitors...": "اختيار الشاشات المتأثرة ...",
+    "Start of maintenance": "بداية الصيانة",
+    "All Status Pages": "جميع صفحات الحالة",
+    "Select status pages...": "حدد صفحات الحالة ...",
+    recurringIntervalMessage: "ركض مرة واحدة كل يوم | قم بالتشغيل مرة واحدة كل يوم {0}",
+    affectedMonitorsDescription: "حدد المراقبين المتأثرة بالصيانة الحالية",
+    affectedStatusPages: "إظهار رسالة الصيانة هذه على صفحات الحالة المحددة",
+    atLeastOneMonitor: "حدد شاشة واحدة على الأقل من المتأثرين",
+    passwordNotMatchMsg: "كلمة المرور المتكررة لا تتطابق.",
+    notificationDescription: "يجب تعيين الإخطارات إلى شاشة للعمل.",
+    keywordDescription: "ابحث في الكلمة الرئيسية في استجابة HTML العادية أو JSON. البحث حساس للحالة.",
+    pauseDashboardHome: "وقفة",
+    deleteMonitorMsg: "هل أنت متأكد من حذف هذا الشاشة؟",
+    deleteMaintenanceMsg: "هل أنت متأكد من حذف هذه الصيانة؟",
+    deleteNotificationMsg: "هل أنت متأكد من حذف هذا الإشعار لجميع الشاشات؟",
+    dnsPortDescription: "منفذ خادم DNS. الافتراضيات إلى 53. يمكنك تغيير المنفذ في أي وقت.",
+    resolverserverDescription: "CloudFlare هو الخادم الافتراضي. يمكنك تغيير خادم المحوّل في أي وقت.",
+    rrtypeDescription: "حدد نوع RR الذي تريد مراقبته",
+    pauseMonitorMsg: "هل أنت متأكد من أن تتوقف مؤقتًا؟",
+    enableDefaultNotificationDescription: "سيتم تمكين هذا الإشعار افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الإخطار بشكل منفصل لكل شاشة.",
+    clearEventsMsg: "هل أنت متأكد من حذف جميع الأحداث لهذا الشاشة؟",
+    clearHeartbeatsMsg: "هل أنت متأكد من حذف جميع دقات القلب لهذا الشاشة؟",
+    confirmClearStatisticsMsg: "هل أنت متأكد من أنك تريد حذف جميع الإحصائيات؟",
+    importHandleDescription: "اختر 'تخطي موجود' إذا كنت تريد تخطي كل شاشة أو إشعار بنفس الاسم. 'الكتابة فوق' سوف يحذف كل شاشة وإخطار موجود.",
+    confirmImportMsg: "هل أنت متأكد من أنك تريد استيراد النسخ الاحتياطي؟ يرجى التحقق من أنك حددت خيار الاستيراد الصحيح.",
+    twoFAVerifyLabel: "الرجاء إدخال الرمز المميز الخاص بك للتحقق من 2FA",
+    tokenValidSettingsMsg: "الرمز المميز صالح! يمكنك الآن حفظ إعدادات 2FA.",
+    confirmEnableTwoFAMsg: "هل أنت متأكد من أنك تريد تمكين 2FA؟",
+    confirmDisableTwoFAMsg: "هل أنت متأكد من أنك تريد تعطيل 2FA؟",
+    Settings: "إعدادات",
+    Dashboard: "لوحة التحكم",
+    "New Update": "تحديث جديد",
+    Language: "لغة",
+    Appearance: "مظهر",
+    Theme: "سمة",
+    General: "عام",
+    "Primary Base URL": "عنوان URL الأساسي",
+    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.": "تصدير الشهادة",
+    Monitor: "مراقب | مراقبات",
+    day: "يوم | أيام",
+    "-day": "-يوم",
+    hour: "ساعة",
+    "-hour": "-ساعة",
+    Response: "استجاية",
+    Ping: "بينغ",
+    "Monitor Type": "نوع المراقب",
+    Keyword: "كلمة مفتاحية",
+    "Friendly Name": "اسم معروف",
+    URL: "عنوان URL",
+    Hostname: "اسم المضيف",
+    Port: "المنفذ",
+    "Heartbeat Interval": "فاصل نبضات القلب",
+    Retries: "يحاول مجدداً",
+    "Heartbeat Retry Interval": "الفاصل الزمني لإعادة محاكمة نبضات القلب",
+    "Resend Notification if Down X times consequently": "إعادة تقديم الإخطار إذا انخفض x مرات بالتالي",
+    Advanced: "متقدم",
+    "Upside Down Mode": "وضع أسفل أسفل",
+    "Max. Redirects": "الأعلى. إعادة التوجيه",
+    "Accepted Status Codes": "رموز الحالة المقبولة",
+    "Push URL": "دفع عنوان URL",
+    needPushEvery: "يجب عليك استدعاء عنوان URL هذا كل ثانية.",
+    pushOptionalParams: "المعلمات الاختيارية",
+    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": "تمكين المصادقة",
+    "disableauth.message1": "هل أنت متأكد من أن <strong> تعطيل المصادقة </strong>؟",
+    "disableauth.message2": "تم تصميمه للسيناريوهات <strong> حيث تنوي تنفيذ مصادقة الطرف الثالث </strong> أمام كوما في وقت التشغيل مثل CloudFlare Access Authelia أو آليات المصادقة الأخرى.",
+    "Please use this option carefully!": "الرجاء استخدام هذا الخيار بعناية!",
+    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": "اعد كلمة السر",
+    "Import Backup": "استيراد النسخ الاحتياطي",
+    "Export Backup": "النسخ الاحتياطي تصدير",
+    Export: "يصدّر",
+    Import: "يستورد",
+    respTime: "resp. الوقت (MS)",
+    notAvailableShort: "ن/أ",
+    "Default enabled": "التمكين الافتراضي",
+    "Apply on all existing monitors": "تنطبق على جميع الشاشات الحالية",
+    Create: "خلق",
+    "Clear Data": "امسح البيانات",
+    Events: "الأحداث",
+    Heartbeats: "نبضات القلب",
+    "Auto Get": "الحصول على السيارات",
+    backupDescription: "يمكنك النسخ الاحتياطي لجميع الشاشات والإشعارات في ملف JSON.",
+    backupDescription2: "ملحوظة",
+    backupDescription3: "يتم تضمين البيانات الحساسة مثل الرموز الإخطار في ملف التصدير ؛ يرجى تخزين التصدير بشكل آمن.",
+    alertNoFile: "الرجاء تحديد ملف للاستيراد.",
+    alertWrongFileType: "الرجاء تحديد ملف JSON.",
+    "Clear all statistics": "مسح جميع الإحصاءات",
+    "Skip existing": "تخطي الموجود",
+    Overwrite: "الكتابة فوق",
+    Options: "خيارات",
+    "Keep both": "احتفظ بكليهما",
+    "Verify Token": "تحقق من الرمز المميز",
+    "Setup 2FA": "الإعداد 2FA",
+    "Enable 2FA": "تمكين 2FA",
+    "Disable 2FA": "تعطيل 2FA",
+    "2FA Settings": "2FA إعدادات",
+    "Two Factor Authentication": "توثيق ذو عاملين",
+    Active: "نشيط",
+    Inactive: "غير نشط",
+    Token: "رمز",
+    "Show URI": "أظهر URI",
+    Tags: "العلامات",
+    "Add New below or Select...": "أضف جديدًا أدناه أو حدد ...",
+    "Tag with this name already exist.": "علامة مع هذا الاسم موجود بالفعل.",
+    "Tag with this value already exist.": "علامة مع هذه القيمة موجودة بالفعل.",
+    color: "اللون",
+    "value (optional)": "القيمة (اختياري)",
+    Gray: "رمادي",
+    Red: "أحمر",
+    Orange: "البرتقالي",
+    Green: "لون أخضر",
+    Blue: "أزرق",
+    Indigo: "النيلي",
+    Purple: "نفسجي",
+    Pink: "لون القرنفل",
+    Custom: "العادة",
+    "Search...": "يبحث...",
+    "Avg. Ping": "متوسط. بينغ",
+    "Avg. Response": "متوسط. إجابة",
+    "Entry Page": "صفحة الدخول",
+    statusPageNothing: "لا شيء هنا الرجاء إضافة مجموعة أو شاشة.",
+    "No Services": "لا توجد خدمات",
+    "All Systems Operational": "جميع الأنظمة التشغيلية",
+    "Partially Degraded Service": "الخدمة المتدهورة جزئيا",
+    "Degraded Service": "خدمة متدهورة",
+    "Add Group": "أضف مجموعة",
+    "Add a monitor": "إضافة شاشة",
+    "Edit Status Page": "تحرير صفحة الحالة",
+    "Go to Dashboard": "الذهاب إلى لوحة القيادة",
+    "Status Page": "صفحة الحالة",
+    "Status Pages": "صفحات الحالة",
+    defaultNotificationName: "تنبيه {الإخطار} ({number})",
+    here: "هنا",
+    Required: "مطلوب",
+    telegram: "برقية",
+    "ZohoCliq": "Zohocliq",
+    "Bot Token": "رمز الروبوت",
+    wayToGetTelegramToken: "يمكنك الحصول على رمز من {0}.",
+    "Chat ID": "معرف الدردشة",
+    supportTelegramChatID: "دعم الدردشة المباشرة / معرف الدردشة للقناة",
+    wayToGetTelegramChatID: "يمكنك الحصول على معرف الدردشة الخاص بك عن طريق إرسال رسالة إلى الروبوت والانتقال إلى عنوان URL هذا لعرض Chat_id",
+    "YOUR BOT TOKEN HERE": "رمز الروبوت الخاص بك هنا",
+    chatIDNotFound: "لم يتم العثور على معرف الدردشة ؛ الرجاء إرسال رسالة إلى هذا الروبوت أولاً",
+    webhook: "webhook",
+    "Post URL": "بعد عنوان URL",
+    "Content Type": "نوع المحتوى",
+    webhookJsonDesc: "{0} مفيد لأي خوادم HTTP الحديثة مثل Express.js",
+    webhookFormDataDesc: "{multipart} مفيد لـ PHP. سيحتاج JSON إلى تحليل {decodefunction}",
+    webhookAdditionalHeadersTitle: "رؤوس إضافية",
+    webhookAdditionalHeadersDesc: "يحدد رؤوس إضافية مرسلة مع webhook.",
+    smtp: "البريد الإلكتروني (SMTP)",
+    secureOptionNone: "لا شيء / startTls (25 587)",
+    secureOptionTLS: "TLS (465)",
+    "Ignore TLS Error": "تجاهل خطأ TLS",
+    "From Email": "من البريد الإلكترونى",
+    emailCustomSubject: "موضوع مخصص",
+    "To Email": "للبريد الإلكتروني",
+    smtpCC: "نسخة",
+    smtpBCC: "BCC",
+    discord: "خلاف",
+    "Discord Webhook URL": "Discord Webhook URL",
+    wayToGetDiscordURL: "يمكنك الحصول على هذا عن طريق الانتقال إلى إعدادات الخادم -> التكامل -> إنشاء WebHook",
+    "Bot Display Name": "اسم عرض الروبوت",
+    "Prefix Custom Message": "بادئة رسالة مخصصة",
+    "Hello @everyone is...": "مرحبًا {'@'} الجميع ...",
+    teams: "فرق Microsoft",
+    "Webhook URL": "Webhook URL",
+    wayToGetTeamsURL: "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
+    wayToGetZohoCliqURL: "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
+    signal: "الإشارة",
+    Number: "رقم",
+    Recipients: "المستلمين",
+    needSignalAPI: "تحتاج إلى وجود عميل إشارة مع REST API.",
+    wayToCheckSignalURL: "يمكنك التحقق من عنوان URL هذا لعرض كيفية إعداد واحد",
+    signalImportant: "مهم",
+    gotify: "gotify",
+    "Application Token": "رمز التطبيق",
+    "Server URL": "عنوان URL الخادم",
+    Priority: "أولوية",
+    slack: "تثاقل",
+    "Icon Emoji": "أيقونة الرموز التعبيرية",
+    "Channel Name": "اسم القناة",
+    "Uptime Kuma URL": "UPTIME KUMA URL",
+    aboutWebhooks: "مزيد من المعلومات حول Webhooks ON",
+    aboutChannelName: "أدخل اسم القناة في حقل اسم القناة {0} إذا كنت تريد تجاوز قناة WebHook. السابق",
+    aboutKumaURL: "إذا تركت حقل URL في وقت التشغيل KUMA فارغًا ، فسيتم افتراضيًا إلى صفحة GitHub Project.",
+    emojiCheatSheet: "ورقة الغش في الرموز التعبيرية",
+    "rocket.chat": "صاروخ",
+    pushover: "مهمة سهلة",
+    pushy: "انتهازي \ متغطرس",
+    PushByTechulus: "دفع بواسطة Techulus",
+    octopush: "أوكتوبوش",
+    promosms: "الترويجيات",
+    clicksendsms: "نقرات SMS",
+    lunasea: "لوناسيا",
+    apprise: "إبلاغ (دعم 50+ خدمات الإخطار)",
+    GoogleChat: "دردشة Google (مساحة عمل Google فقط)",
+    pushbullet: "حماس",
+    Kook: "كوك",
+    wayToGetKookBotToken: "قم بإنشاء تطبيق واحصل على رمز الروبوت الخاص بك على {0}",
+    wayToGetKookGuildID: "قم بتشغيل 'وضع المطور' في إعداد Kook وانقر بزر الماوس الأيمن على النقابة للحصول على معرفه",
+    "Guild ID": "معرف النقابة",
+    line: "خط رسول",
+    mattermost: "المادة",
+    "User Key": "مفتاح المستخدم",
+    Device: "جهاز",
+    "Message Title": "عنوان الرسالة",
+    "Notification Sound": "صوت الإشعار",
+    "More info on": "مزيد من المعلومات حول",
+    pushoverDesc1: "أولوية الطوارئ (2) لها مهلة افتراضية 30 ثانية بين إعادة المحاولة وستنتهي صلاحيتها بعد ساعة واحدة.",
+    pushoverDesc2: "إذا كنت ترغب في إرسال إشعارات إلى أجهزة مختلفة ، قم بملء حقل الجهاز.",
+    "SMS Type": "نوع الرسائل القصيرة",
+    octopushTypePremium: "قسط (سريع - موصى به للتنبيه)",
+    octopushTypeLowCost: "التكلفة المنخفضة (بطيئة - تم حظرها أحيانًا بواسطة المشغل)",
+    checkPrice: "تحقق من الأسعار {0}",
+    apiCredentials: "بيانات اعتماد API",
+    octopushLegacyHint: "هل تستخدم الإصدار القديم من Octopush (2011-2020) أو الإصدار الجديد؟",
+    "Check octopush prices": "تحقق من أسعار Octopush {0}.",
+    octopushPhoneNumber: "رقم الهاتف (تنسيق intl على سبيل المثال",
+    octopushSMSSender: "اسم مرسل الرسائل القصيرة",
+    "LunaSea Device ID": "معرف جهاز Lunasea",
+    "Apprise URL": "إبلاغ عنوان URL",
+    "Example": "مثال",
+    "Read more": "قراءة المزيد",
+    "Status": "حالة",
+    "Read more": "قراءة المزيد",
+    appriseInstalled: "تم تثبيت Prosise.",
+    appriseNotInstalled: "الإبرام غير مثبت. {0}",
+    "Access Token": "رمز وصول",
+    "Channel access token": "قناة الوصول إلى الرمز",
+    "Line Developers Console": "تحكم المطورين",
+    lineDevConsoleTo: "وحدة المطورين Line Console - {0}",
+    "Basic Settings": "الإعدادات الأساسية",
+    "User ID": "معرف المستخدم",
+    "Messaging API": "واجهة برمجة تطبيقات المراسلة",
+    wayToGetLineChannelToken: "قم أولاً بالوصول إلى {0} إنشاء مزود وقناة (واجهة برمجة تطبيقات المراسلة) ، ثم يمكنك الحصول على رمز الوصول إلى القناة ومعرف المستخدم من عناصر القائمة المذكورة أعلاه.",
+    "Icon URL": "url url icon",
+    aboutIconURL: "يمكنك توفير رابط لصورة في url url \ icon لتجاوز صورة الملف الشخصي الافتراضي. لن يتم استخدامه إذا تم تعيين رمز رمز رمز.",
+    aboutMattermostChannelName: "يمكنك تجاوز القناة الافتراضية التي تنشرها WebHook من خلال إدخال اسم القناة في \ channel name \ الحقل. يجب تمكين هذا في إعدادات Webhook Mattern. السابق",
+    matrix: "مصفوفة",
+    promosmsTypeEco: "SMS Eco - رخيصة ولكن بطيئة وغالبًا ما تكون محملة. يقتصر فقط على المستفيدين البولنديين.",
+    promosmsTypeFlash: "SMS Flash - سيتم عرض الرسالة تلقائيًا على جهاز المستلم. يقتصر فقط على المستفيدين البولنديين.",
+    promosmsTypeFull: "SMS Full - Tier Premium SMS يمكنك استخدام اسم المرسل الخاص بك (تحتاج إلى تسجيل الاسم أولاً). موثوقة للتنبيهات.",
+    promosmsTypeSpeed: "سرعة الرسائل القصيرة - أولوية قصوى في النظام. سريع وموثوق للغاية ولكنه مكلف (حوالي مرتين من الرسائل القصيرة السعر الكامل).",
+    promosmsPhoneNumber: "رقم الهاتف (للمستلم البولندي ، يمكنك تخطي رموز المنطقة)",
+    promosmsSMSSender: "اسم مرسل الرسائل القصيرة",
+    promosmsAllowLongSMS: "السماح الرسائل القصيرة الطويلة",
+    "Feishu WebHookUrl": "Feishu Webhookurl",
+    matrixHomeserverURL: "عنوان URL HomeServer (مع HTTP (S)",
+    "Internal Room Id": "معرف الغرفة الداخلية",
+    matrixDesc1: "يمكنك العثور على معرف الغرفة الداخلي من خلال البحث في القسم المتقدم من إعدادات الغرفة في عميل Matrix الخاص بك. يجب أن تبدو مثل! QMDRCPUIFLWSFJXYE6",
+    matrixDesc2: "يوصى بشدة بإنشاء مستخدم جديد ولا تستخدم رمز الوصول إلى مستخدم Matrix الخاص بك لأنه سيتيح الوصول الكامل إلى حسابك وجميع الغرف التي انضمت إليها. بدلاً من ذلك ، قم بإنشاء مستخدم جديد ودعوته فقط إلى الغرفة التي تريد تلقيها الإشعار فيها. يمكنك الحصول على رمز الوصول عن طريق تشغيل {0}",
+    Method: "طريقة",
+    Body: "الجسم",
+    Headers: "الرؤوس",
+    PushUrl: "دفع عنوان URL",
+    HeadersInvalidFormat: "رؤوس الطلبات غير صالحة JSON",
+    BodyInvalidFormat: "هيئة الطلب غير صالحة JSON",
+    "Monitor History": "مراقبة التاريخ",
+    clearDataOlderThan: "الحفاظ على بيانات سجل المراقبة للأيام {0}.",
+    PasswordsDoNotMatch: "كلمة المرور غير مطابقة.",
+    records: "السجلات",
+    "One record": "سجل واحد",
+    steamApiKeyDescription: "لمراقبة خادم لعبة Steam ، تحتاج إلى مفتاح Steam Web-API. يمكنك تسجيل مفتاح API الخاص بك هنا",
+    "Current User": "المستخدم الحالي",
+    topic: "عنوان",
+    topicExplanation: "موضوع MQTT لرصد",
+    successMessage: "نجاح رسالة",
+    successMessageExplanation: "رسالة MQTT التي ستعتبر نجاحًا",
+    recent: "الأخيرة",
+    Done: "فعله",
+    Info: "معلومات",
+    Security: "حماية",
+    "Steam API Key": "مفتاح API Steam",
+    "Shrink Database": "تقلص قاعدة البيانات",
+    "Pick a RR-Type...": "اختر نوع RR ...",
+    "Pick Accepted Status Codes...": "اختيار رموز الحالة المقبولة ...",
+    Default: "تقصير",
+    "HTTP Options": "خيارات HTTP",
+    "Create Incident": "إنشاء حادث",
+    Title: "لقب",
+    Content: "المحتوى",
+    Style: "أسلوب",
+    info: "معلومات",
+    warning: "تحذير",
+    danger: "خطر",
+    error: "خطأ",
+    critical: "شديد الأهمية",
+    primary: "الأولية",
+    light: "نور",
+    dark: "ظلام",
+    Post: "بريد",
+    "Please input title and content": "الرجاء إدخال العنوان والمحتوى",
+    Created: "مخلوق",
+    "Last Updated": "التحديث الاخير",
+    Unpin: "إلغاء",
+    "Switch to Light Theme": "التبديل إلى موضوع الضوء",
+    "Switch to Dark Theme": "التبديل إلى موضوع الظلام",
+    "Show Tags": "أضهر العلامات",
+    "Hide Tags": "إخفاء العلامات",
+    Description: "وصف",
+    "No monitors available.": "لا شاشات المتاحة.",
+    "Add one": "أضف واحدا",
+    "No Monitors": "لا شاشات",
+    "Untitled Group": "مجموعة بلا عنوان",
+    Services: "خدمات",
+    Discard: "تجاهل",
+    Cancel: "يلغي",
+    "Powered by": "مشغل بواسطة",
+    shrinkDatabaseDescription: "تشغيل فراغ قاعدة البيانات لـ SQLite. إذا تم إنشاء قاعدة البيانات الخاصة بك بعد تمكين 1.10.0 AUTO_VACUUM بالفعل ولا يلزم هذا الإجراء.",
+    serwersms: "Serwersms.pl",
+    serwersmsAPIUser: "اسم مستخدم API (بما في ذلك بادئة WebAPI_)",
+    serwersmsAPIPassword: "كلمة مرور API",
+    serwersmsPhoneNumber: "رقم الهاتف",
+    serwersmsSenderName: "اسم مرسل الرسائل القصيرة (مسجل عبر بوابة العملاء)",
+    smseagle: "smseagle",
+    smseagleTo: "أرقام الهواتف)",
+    smseagleGroup: "اسم مجموعة كتب الهاتف (S)",
+    smseagleContact: "كتاب الاتصال اسم (S)",
+    smseagleRecipientType: "نوع المستلم",
+    smseagleRecipient: "المتلقي (المتلقيين) (يجب فصل المتعددة مع فاصلة)",
+    smseagleToken: "API وصول الرمز المميز",
+    smseagleUrl: "عنوان URL لجهاز SMSEGLE الخاص بك",
+    smseagleEncoding: "إرسال Unicode",
+    smseaglePriority: "أولوية الرسالة (0-9 افتراضي = 0)",
+    stackfield: "Stackfield",
+    Customize: "يعدل أو يكيف",
+    "Custom Footer": "تذييل مخصص",
+    "Custom CSS": "لغة تنسيق ويب حسب الطلب",
+    smtpDkimSettings: "إعدادات DKIM",
+    smtpDkimDesc: "يرجى الرجوع إلى Nodemailer dkim {0} للاستخدام.",
+    documentation: "توثيق",
+    smtpDkimDomain: "اسم النطاق",
+    smtpDkimKeySelector: "المحدد الرئيسي",
+    smtpDkimPrivateKey: "مفتاح سري",
+    smtpDkimHashAlgo: "خوارزمية التجزئة (اختياري)",
+    smtpDkimheaderFieldNames: "مفاتيح الرأس للتوقيع (اختياري)",
+    smtpDkimskipFields: "مفاتيح الرأس لا توقيع (اختياري)",
+    wayToGetPagerDutyKey: "يمكنك الحصول على هذا عن طريق الانتقال إلى الخدمة -> دليل الخدمة -> (حدد خدمة) -> تكامل -> إضافة التكامل. هنا يمكنك البحث عن \ events API V2 \. مزيد من المعلومات {0}",
+    "Integration Key": "مفتاح التكامل",
+    "Integration URL": "URL تكامل",
+    "Auto resolve or acknowledged": "حل السيارات أو الاعتراف به",
+    "do nothing": "لا تفعل شيئا",
+    "auto acknowledged": "اعترف السيارات",
+    "auto resolve": "عزم السيارات",
+    gorush: "جورش",
+    alerta: "أليتا",
+    alertaApiEndpoint: "نقطة نهاية API",
+    alertaEnvironment: "بيئة",
+    alertaApiKey: "مفتاح API",
+    alertaAlertState: "حالة التنبيه",
+    alertaRecoverState: "استعادة الدولة",
+    deleteStatusPageMsg: "هل أنت متأكد من حذف صفحة الحالة هذه؟",
+    Proxies: "وكلاء",
+    default: "تقصير",
+    enabled: "تمكين",
+    setAsDefault: "تعيين كافتراضي",
+    deleteProxyMsg: "هل أنت متأكد من حذف هذا الوكيل لجميع الشاشات؟",
+    proxyDescription: "يجب تعيين الوكلاء إلى شاشة للعمل.",
+    enableProxyDescription: "لن يؤثر هذا الوكيل على طلبات الشاشة حتى يتم تنشيطه. يمكنك التحكم مؤقتًا في تعطيل الوكيل من جميع الشاشات حسب حالة التنشيط.",
+    setAsDefaultProxyDescription: "سيتم تمكين هذا الوكيل افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الوكيل بشكل منفصل لكل شاشة.",
+    "Certificate Chain": "سلسلة الشهادة",
+    Valid: "صالح",
+    Invalid: "غير صالح",
+    AccessKeyId: "معرف AccessKey",
+    SecretAccessKey: "Accesskey Secret",
+    PhoneNumbers: "أرقام الهواتف",
+    TemplateCode: "TemplateCode",
+    SignName: "اسم تسجيل الدخول",
+    "Sms template must contain parameters: ": "يجب أن يحتوي قالب الرسائل القصيرة على معلمات:",
+    "Bark Endpoint": "نقطة نهاية اللحاء",
+    "Bark Group": "مجموعة اللحاء",
+    "Bark Sound": "صوت اللحاء",
+    WebHookUrl: "webhookurl",
+    SecretKey: "Secretkey",
+    "For safety, must use secret key": "للسلامة يجب استخدام المفتاح السري",
+    "Device Token": "رمز الجهاز",
+    Platform: "منصة",
+    iOS: "iOS",
+    Android: "ذكري المظهر",
+    Huawei: "هواوي",
+    High: "عالٍ",
+    Retry: "إعادة المحاولة",
+    Topic: "عنوان",
+    "WeCom Bot Key": "WECOM BOT KEY",
+    "Setup Proxy": "وكيل الإعداد",
+    "Proxy Protocol": "بروتوكول الوكيل",
+    "Proxy Server": "مخدم بروكسي",
+    "Proxy server has authentication": "خادم الوكيل لديه مصادقة",
+    User: "المستعمل",
+    Installed: "المثبتة",
+    "Not installed": "غير مثبت",
+    Running: "جري",
+    "Not running": "لا يعمل",
+    "Remove Token": "إزالة الرمز المميز",
+    Start: "بداية",
+    Stop: "قف",
+    "Uptime Kuma": "وقت التشغيل كوما",
+    "Add New Status Page": "أضف صفحة حالة جديدة",
+    Slug: "سبيكة",
+    "Accept characters": "قبول الشخصيات",
+    startOrEndWithOnly: "ابدأ أو ينتهي بـ {0} فقط",
+    "No consecutive dashes": "لا شرطات متتالية",
+    Next: "التالي",
+    "The slug is already taken. Please choose another slug.": "تم أخذ سبيكة بالفعل. الرجاء اختيار سبيكة أخرى.",
+    "No Proxy": "لا الوكيل",
+    Authentication: "المصادقة",
+    "HTTP Basic Auth": "HTTP الأساسي Auth",
+    "New Status Page": "صفحة حالة جديدة",
+    "Page Not Found": "الصفحة غير موجودة",
+    "Reverse Proxy": "وكيل عكسي",
+    Backup: "دعم",
+    About: "عن",
+    wayToGetCloudflaredURL: "(قم بتنزيل CloudFlared من {0})",
+    cloudflareWebsite: "موقع CloudFlare",
+    "Message": "رسالة",
+    "Don't know how to get the token? Please read the guide": "لا أعرف كيف تحصل على الرمز المميز؟ يرجى قراءة الدليل",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "قد يضيع الاتصال الحالي إذا كنت تتصل حاليًا عبر نفق CloudFlare. هل أنت متأكد تريد إيقافها؟ اكتب كلمة المرور الحالية لتأكيدها.",
+    "HTTP Headers": "رؤوس HTTP",
+    "Trust Proxy": "الوكيل الثقة",
+    "Other Software": "برامج أخرى",
+    "For example: nginx, Apache and Traefik.": "على سبيل المثال: nginx و Apache و Traefik.",
+    "Please read": "يرجى القراءة",
+    "Subject": "موضوع",
+    "Valid To": "صالحة ل",
+    "Days Remaining": "الأيام المتبقية",
+    "Issuer": "المصدر",
+    "Fingerprint": "بصمة",
+    "No status pages": "لا صفحات الحالة",
+    "Domain Name Expiry Notification": "اسم النطاق إشعار انتهاء الصلاحية",
+    Proxy: "الوكيل",
+    "Date Created": "تاريخ الإنشاء",
+    HomeAssistant: "مساعد المنزل",
+    onebotHttpAddress: "OneBot HTTP عنوان",
+    onebotMessageType: "نوع رسالة OneBot",
+    onebotGroupMessage: "مجموعة",
+    onebotPrivateMessage: "خاص",
+    onebotUserOrGroupId: "معرف المجموعة/المستخدم",
+    onebotSafetyTips: "للسلامة يجب ضبط الرمز المميز للوصول",
+    "PushDeer Key": "مفتاح PushDeer",
+    "Footer Text": "نص تذييل",
+    "Show Powered By": "عرض مدعوم من قبل",
+    "Domain Names": "أسماء المجال",
+    signedInDisp: "وقعت في {0}",
+    signedInDispDisabled: "معاق المصادقة.",
+    RadiusSecret: "سر نصف القطر",
+    RadiusSecretDescription: "السر المشترك بين العميل والخادم",
+    RadiusCalledStationId: "يسمى معرف المحطة",
+    RadiusCalledStationIdDescription: "معرف الجهاز المتصل",
+    RadiusCallingStationId: "معرف محطة الاتصال",
+    RadiusCallingStationIdDescription: "معرف جهاز الاتصال",
+    "Certificate Expiry Notification": "إشعار انتهاء الصلاحية",
+    "API Username": "اسم المستخدم API",
+    "API Key": "مفتاح API",
+    "Recipient Number": "رقم المستلم",
+    "From Name/Number": "من الاسم/الرقم",
+    "Leave blank to use a shared sender number.": "اترك فارغًا لاستخدام رقم المرسل المشترك.",
+    "Octopush API Version": "إصدار Octopush API",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    endpoint: "نقطة النهاية",
+    octopushAPIKey: "\ api key \ from HTTP API بيانات اعتماد في لوحة التحكم",
+    octopushLogin: "\ login \ من بيانات اعتماد API HTTP في لوحة التحكم",
+    promosmsLogin: "اسم تسجيل الدخول API",
+    promosmsPassword: "كلمة مرور API",
+    "pushoversounds pushover": "سداد (افتراضي)",
+    "pushoversounds bike": "دراجة هوائية",
+    "pushoversounds bugle": "بوق",
+    "pushoversounds cashregister": "ماكينة تسجيل المدفوعات النقدية",
+    "pushoversounds classical": "كلاسيكي",
+    "pushoversounds cosmic": "كونية",
+    "pushoversounds falling": "هبوط",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "واردة",
+    "pushoversounds intermission": "استراحة",
+    "pushoversounds magic": "سحر",
+    "pushoversounds mechanical": "ميكانيكي",
+    "pushoversounds pianobar": "شريط البيانو",
+    "pushoversounds siren": "صفارة إنذار",
+    "pushoversounds spacealarm": "إنذار الفضاء",
+    "pushoversounds tugboat": "قارب السحب",
+    "pushoversounds alien": "إنذار أجنبي (طويل)",
+    "pushoversounds climb": "تسلق (طويل)",
+    "pushoversounds persistent": "مستمر (طويل)",
+    "pushoversounds echo": "صدى مهووس (طويل)",
+    "pushoversounds updown": "صعودا (طويلة)",
+    "pushoversounds vibrate": "يهتز فقط",
+    "pushoversounds none": "لا شيء (صامت)",
+    pushyAPIKey: "مفتاح API السري",
+    pushyToken: "رمز الجهاز",
+    "Show update if available": "عرض التحديث إذا كان ذلك متاحًا",
+    "Also check beta release": "تحقق أيضًا من الإصدار التجريبي",
+    "Using a Reverse Proxy?": "باستخدام وكيل عكسي؟",
+    "Check how to config it for WebSocket": "تحقق من كيفية تكوينه لـ WebSocket",
+    "Steam Game Server": "خادم لعبة البخار",
+    "Most likely causes": "الأسباب المرجحة",
+    "The resource is no longer available.": "لم يعد المورد متاحًا.",
+    "There might be a typing error in the address.": "قد يكون هناك خطأ مطبعي في العنوان.",
+    "What you can try": "ماذا تستطيع أن تجرب",
+    "Retype the address.": "اعد كتابة العنوان.",
+    "Go back to the previous page.": "عد للصفحة السابقة.",
+    "Coming Soon": "قريبا",
+    wayToGetClickSendSMSToken: "يمكنك الحصول على اسم مستخدم API ومفتاح API من {0}.",
+    "Connection String": "سلسلة الاتصال",
+    Query: "استفسار",
+    settingsCertificateExpiry: "شهادة TLS انتهاء الصلاحية",
+    certificationExpiryDescription: "شاشات HTTPS تضيء عندما تنتهي شهادة TLS في",
+    "Setup Docker Host": "إعداد مضيف Docker",
+    "Connection Type": "نوع الاتصال",
+    "Docker Daemon": "Docker Daemon",
+    deleteDockerHostMsg: "هل أنت متأكد من حذف مضيف Docker لجميع الشاشات؟",
+    socket: "قابس كهرباء",
+    tcp: "TCP / HTTP",
+    "Docker Container": "حاوية Docker",
+    "Container Name / ID": "اسم الحاوية / معرف",
+    "Docker Host": "مضيف Docker",
+    "Docker Hosts": "مضيفي Docker",
+    "ntfy Topic": "موضوع ntfy",
+    Domain: "اِختِصاص",
+    Workstation: "محطة العمل",
+    disableCloudflaredNoAuthMsg: "أنت في وضع مصادقة لا توجد كلمة مرور غير مطلوبة.",
+    trustProxyDescription: "الثقة 'x-forward-*'. إذا كنت ترغب في الحصول على IP العميل الصحيح وكوما في الوقت المناسب مثل Nginx أو Apache ، فيجب عليك تمكين ذلك.",
+    wayToGetLineNotifyToken: "يمكنك الحصول على رمز الوصول من {0}",
+    Examples: "أمثلة",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "الرمز المميز للوصول منذ فترة طويلة",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "يمكن إنشاء رمز الوصول منذ فترة طويلة عن طريق النقر على اسم ملف التعريف الخاص بك (أسفل اليسار) والتمرير إلى الأسفل ثم انقر فوق إنشاء الرمز المميز.",
+    "Notification Service": "خدمة الإخطار",
+    "default": "إخطار جميع الأجهزة",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "يمكن العثور على قائمة بخدمات الإخطار في Home Assistant ضمن \ Adviewer Tools> Services \ Search \ Notification \ للعثور على اسم جهازك/هاتفك.",
+    "Automations can optionally be triggered in Home Assistant": "يمكن أن يتم تشغيل الأتمتة اختياريًا في مساعد المنزل",
+    "Trigger type": "نوع الزناد",
+    "Event type": "نوع الحدث",
+    "Event data": "بيانات الحدث",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "ثم اختر إجراءً على سبيل المثال قم بتبديل المشهد إلى حيث يكون ضوء RGB أحمر.",
+    "Frontend Version": "إصدار الواجهة الأمامية",
+    "Frontend Version do not match backend version!": "إصدار Frontend لا يتطابق مع الإصدار الخلفي!",
+    "Base URL": "عنوان URL الأساسي",
+    goAlertInfo: "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}",
+    goAlertIntegrationKeyInfo: "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \ aaaaaaaa-bbbb-ccccccccccccc-eeeeeeeeee \ عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
+    goAlert: "المرمى",
+    backupOutdatedWarning: "إهمال",
+    backupRecommend: "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.",
+    Optional: "اختياري",
+    squadcast: "القاء فريقي",
+    SendKey: "Sendkey",
+    "SMSManager API Docs": "مستندات SMSManager API",
+    "Gateway Type": "نوع البوابة",
+    SMSManager: "smsmanager",
+    "You can divide numbers with": "يمكنك تقسيم الأرقام مع",
+    or: "أو",
+    recurringInterval: "فترة",
+    Recurring: "يتكرر",
+    strategyManual: "نشط/غير نشط يدويًا",
+    warningTimezone: "إنه يستخدم المنطقة الزمنية للخادم",
+    weekdayShortMon: "الاثنين",
+    weekdayShortTue: "الثلاثاء",
+    weekdayShortWed: "تزوج",
+    weekdayShortThu: "الخميس",
+    weekdayShortFri: "الجمعة",
+    weekdayShortSat: "جلس",
+    weekdayShortSun: "شمس",
+    dayOfWeek: "يوم من الأسبوع",
+    dayOfMonth: "يوم من الشهر",
+    lastDay: "بالأمس",
+    lastDay1: "آخر يوم من الشهر",
+    lastDay2: "الثاني في اليوم الأخير من الشهر",
+    lastDay3: "الثالث في اليوم الأخير من الشهر",
+    lastDay4: "الرابع في اليوم الأخير من الشهر",
+    "No Maintenance": "لا صيانة",
+    pauseMaintenanceMsg: "هل أنت متأكد من أن تتوقف مؤقتًا؟",
+    "maintenanceStatus-under-maintenance": "تحت الصيانة",
+    "maintenanceStatus-inactive": "غير نشط",
+    "maintenanceStatus-scheduled": "المقرر",
+    "maintenanceStatus-ended": "انتهى",
+    "maintenanceStatus-unknown": "مجهول",
+    "Display Timezone": "عرض المنطقة الزمنية",
+    "Server Timezone": "المنطقة الزمنية الخادم",
+    statusPageMaintenanceEndDate: "نهاية",
+    IconUrl: "url url icon",
+    "Enable DNS Cache": "تمكين ذاكرة التخزين المؤقت DNS",
+    Enable: "يُمكَِن",
+    Disable: "إبطال",
+    dnsCacheDescription: "قد لا يعمل في بعض بيئات IPv6 تعطيله إذا واجهت أي مشكلات.",
+    "Single Maintenance Window": "نافذة صيانة واحدة",
+    "Maintenance Time Window of a Day": "نافذة وقت الصيانة لليوم",
+    "Effective Date Range": "نطاق التاريخ السريع",
+    "Schedule Maintenance": "جدولة الصيانة",
+    "Date and Time": "التاريخ و الوقت",
+    "DateTime Range": "نطاق DateTime",
+    Strategy: "إستراتيجية",
+    "Free Mobile User Identifier": "معرف مستخدم الهاتف المحمول المجاني",
+    "Free Mobile API Key": "مفتاح واجهة برمجة تطبيقات مجانية للهاتف المحمول",
+    "Enable TLS": "تمكين TLS",
+    "Proto Service Name": "اسم خدمة البروتو",
+    "Proto Method": "طريقة البروتو",
+    "Proto Content": "محتوى proto",
+    Economy: "اقتصاد",
+    Lowcost: "تكلفة منخفضة",
+    high: "عالي",
+    "General Monitor Type": "نوع الشاشة العامة",
+    "Passive Monitor Type": "نوع الشاشة السلبي",
+    "Specific Monitor Type": "نوع شاشة محدد",
+    dataRetentionTimeError: "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
+    infiniteRetention: "ضبط على 0 للاحتفاظ لا نهائي.",
+    confirmDeleteTagMsg: "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة.",
+    };
\ No newline at end of file

From aef85078eb5fbb0e48db31cd40f5d7eaf6c06792 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Fri, 20 Jan 2023 12:29:56 +0300
Subject: [PATCH 475/803] reorder fix

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index c0721c48..ec56ba45 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -290,9 +290,9 @@ class Monitor extends BeanModel {
                         headers: {
                             "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
                             "User-Agent": "Uptime-Kuma/" + version,
-                            ...(this.headers ? JSON.parse(this.headers) : {}),
+                            ...(contentType ? { "Content-Type": contentType } : {}),
                             ...(basicAuthHeader),
-                            ...(contentType ? { "Content-Type": contentType } : {})
+                            ...(this.headers ? JSON.parse(this.headers) : {})
                         },
                         maxRedirects: this.maxredirects,
                         validateStatus: (status) => {

From fa23e7ad19e68e3e68df0832750132d77fd29cc4 Mon Sep 17 00:00:00 2001
From: alejandrohernandezrosales <ahernandezr@gmail.com>
Date: Fri, 20 Jan 2023 23:59:11 -0600
Subject: [PATCH 476/803] Removed superflous Message prefix

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

diff --git a/server/notification-providers/pushover.js b/server/notification-providers/pushover.js
index bafde56e..e4f0ddb8 100644
--- a/server/notification-providers/pushover.js
+++ b/server/notification-providers/pushover.js
@@ -10,7 +10,7 @@ class Pushover extends NotificationProvider {
         let pushoverlink = "https://api.pushover.net/1/messages.json";
 
         let data = {
-            "message": "<b>Message</b>:" + msg,
+            "message": msg,
             "user": notification.pushoveruserkey,
             "token": notification.pushoverapptoken,
             "sound": notification.pushoversounds,

From 1197f881a150a1e38ced4a0584995836cef166ed Mon Sep 17 00:00:00 2001
From: Abdulrahman Mustafa <123008422+amworx@users.noreply.github.com>
Date: Sun, 22 Jan 2023 21:31:02 +0000
Subject: [PATCH 477/803] Checked with eslint, with no errors

---
 src/languages/ar-SY.js | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/languages/ar-SY.js b/src/languages/ar-SY.js
index 55f3cbf6..8c6bcf9d 100644
--- a/src/languages/ar-SY.js
+++ b/src/languages/ar-SY.js
@@ -1,5 +1,5 @@
 export default {
-    languageName: "إنجليزي",
+    languageName: "العربية",
     checkEverySecond: "تحقق من كل {0} ثانية",
     retryCheckEverySecond: "أعد محاولة كل {0} ثانية",
     resendEveryXTimes: "إعادة تقديم كل {0} مرات",
@@ -265,20 +265,20 @@ export default {
     emojiCheatSheet: "ورقة الغش في الرموز التعبيرية",
     "rocket.chat": "صاروخ",
     pushover: "مهمة سهلة",
-    pushy: "انتهازي \ متغطرس",
+    pushy: "انتهازي",
     PushByTechulus: "دفع بواسطة Techulus",
     octopush: "أوكتوبوش",
     promosms: "الترويجيات",
     clicksendsms: "نقرات SMS",
     lunasea: "لوناسيا",
     apprise: "إبلاغ (دعم 50+ خدمات الإخطار)",
-    GoogleChat: "دردشة Google (مساحة عمل Google فقط)",
+    GoogleChat: "دردشة Google",
     pushbullet: "حماس",
-    Kook: "كوك",
+    Kook: "كووك",
     wayToGetKookBotToken: "قم بإنشاء تطبيق واحصل على رمز الروبوت الخاص بك على {0}",
     wayToGetKookGuildID: "قم بتشغيل 'وضع المطور' في إعداد Kook وانقر بزر الماوس الأيمن على النقابة للحصول على معرفه",
     "Guild ID": "معرف النقابة",
-    line: "خط رسول",
+    line: "خط",
     mattermost: "المادة",
     "User Key": "مفتاح المستخدم",
     Device: "جهاز",
@@ -299,8 +299,8 @@ export default {
     "LunaSea Device ID": "معرف جهاز Lunasea",
     "Apprise URL": "إبلاغ عنوان URL",
     "Example": "مثال",
-    "Read more": "قراءة المزيد",
-    "Status": "حالة",
+    "Read more:": "{0} :قراءة المزيد",
+    "Status:": "{0} :حالة",
     "Read more": "قراءة المزيد",
     appriseInstalled: "تم تثبيت Prosise.",
     appriseNotInstalled: "الإبرام غير مثبت. {0}",
@@ -313,8 +313,8 @@ export default {
     "Messaging API": "واجهة برمجة تطبيقات المراسلة",
     wayToGetLineChannelToken: "قم أولاً بالوصول إلى {0} إنشاء مزود وقناة (واجهة برمجة تطبيقات المراسلة) ، ثم يمكنك الحصول على رمز الوصول إلى القناة ومعرف المستخدم من عناصر القائمة المذكورة أعلاه.",
     "Icon URL": "url url icon",
-    aboutIconURL: "يمكنك توفير رابط لصورة في url url \ icon لتجاوز صورة الملف الشخصي الافتراضي. لن يتم استخدامه إذا تم تعيين رمز رمز رمز.",
-    aboutMattermostChannelName: "يمكنك تجاوز القناة الافتراضية التي تنشرها WebHook من خلال إدخال اسم القناة في \ channel name \ الحقل. يجب تمكين هذا في إعدادات Webhook Mattern. السابق",
+    aboutIconURL: "يمكنك توفير رابط لصورة في \"Icon URL\" لتجاوز صورة الملف الشخصي الافتراضي. لن يتم استخدامه إذا تم تعيين رمز رمز رمز.",
+    aboutMattermostChannelName: "يمكنك تجاوز القناة الافتراضية التي تنشرها WebHook من خلال إدخال اسم القناة في \"Channel Name\" الحقل. يجب تمكين هذا في إعدادات Webhook Mattern. السابق",
     matrix: "مصفوفة",
     promosmsTypeEco: "SMS Eco - رخيصة ولكن بطيئة وغالبًا ما تكون محملة. يقتصر فقط على المستفيدين البولنديين.",
     promosmsTypeFlash: "SMS Flash - سيتم عرض الرسالة تلقائيًا على جهاز المستلم. يقتصر فقط على المستفيدين البولنديين.",
@@ -414,7 +414,7 @@ export default {
     smtpDkimHashAlgo: "خوارزمية التجزئة (اختياري)",
     smtpDkimheaderFieldNames: "مفاتيح الرأس للتوقيع (اختياري)",
     smtpDkimskipFields: "مفاتيح الرأس لا توقيع (اختياري)",
-    wayToGetPagerDutyKey: "يمكنك الحصول على هذا عن طريق الانتقال إلى الخدمة -> دليل الخدمة -> (حدد خدمة) -> تكامل -> إضافة التكامل. هنا يمكنك البحث عن \ events API V2 \. مزيد من المعلومات {0}",
+    wayToGetPagerDutyKey: "يمكنك الحصول على هذا عن طريق الانتقال إلى الخدمة -> دليل الخدمة -> (حدد خدمة) -> تكامل -> إضافة التكامل. هنا يمكنك البحث عن \"Events API V2\". مزيد من المعلومات {0}",
     "Integration Key": "مفتاح التكامل",
     "Integration URL": "URL تكامل",
     "Auto resolve or acknowledged": "حل السيارات أو الاعتراف به",
@@ -491,7 +491,7 @@ export default {
     About: "عن",
     wayToGetCloudflaredURL: "(قم بتنزيل CloudFlared من {0})",
     cloudflareWebsite: "موقع CloudFlare",
-    "Message": "رسالة",
+    "Message:": ":رسالة",
     "Don't know how to get the token? Please read the guide": "لا أعرف كيف تحصل على الرمز المميز؟ يرجى قراءة الدليل",
     "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "قد يضيع الاتصال الحالي إذا كنت تتصل حاليًا عبر نفق CloudFlare. هل أنت متأكد تريد إيقافها؟ اكتب كلمة المرور الحالية لتأكيدها.",
     "HTTP Headers": "رؤوس HTTP",
@@ -536,8 +536,8 @@ export default {
     "Octopush API Version": "إصدار Octopush API",
     "Legacy Octopush-DM": "Legacy Octopush-DM",
     endpoint: "نقطة النهاية",
-    octopushAPIKey: "\ api key \ from HTTP API بيانات اعتماد في لوحة التحكم",
-    octopushLogin: "\ login \ من بيانات اعتماد API HTTP في لوحة التحكم",
+    octopushAPIKey: "\"API key\" from HTTP API بيانات اعتماد في لوحة التحكم",
+    octopushLogin: "\"Login\" من بيانات اعتماد API HTTP في لوحة التحكم",
     promosmsLogin: "اسم تسجيل الدخول API",
     promosmsPassword: "كلمة مرور API",
     "pushoversounds pushover": "سداد (افتراضي)",
@@ -603,8 +603,8 @@ export default {
     "Long-Lived Access Token": "الرمز المميز للوصول منذ فترة طويلة",
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "يمكن إنشاء رمز الوصول منذ فترة طويلة عن طريق النقر على اسم ملف التعريف الخاص بك (أسفل اليسار) والتمرير إلى الأسفل ثم انقر فوق إنشاء الرمز المميز.",
     "Notification Service": "خدمة الإخطار",
-    "default": "إخطار جميع الأجهزة",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "يمكن العثور على قائمة بخدمات الإخطار في Home Assistant ضمن \ Adviewer Tools> Services \ Search \ Notification \ للعثور على اسم جهازك/هاتفك.",
+    "default: notify all devices": "الافتراضي: إخطار جميع الأجهزة",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "يمكن العثور على قائمة بخدمات الإخطار في المساعد المنزلي ضمن \"Developer Tools > Services\" ابحث عن \"notification\" للعثور على اسم جهازك/هاتفك.",
     "Automations can optionally be triggered in Home Assistant": "يمكن أن يتم تشغيل الأتمتة اختياريًا في مساعد المنزل",
     "Trigger type": "نوع الزناد",
     "Event type": "نوع الحدث",
@@ -614,7 +614,7 @@ export default {
     "Frontend Version do not match backend version!": "إصدار Frontend لا يتطابق مع الإصدار الخلفي!",
     "Base URL": "عنوان URL الأساسي",
     goAlertInfo: "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}",
-    goAlertIntegrationKeyInfo: "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \ aaaaaaaa-bbbb-ccccccccccccc-eeeeeeeeee \ عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
+    goAlertIntegrationKeyInfo: "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
     goAlert: "المرمى",
     backupOutdatedWarning: "إهمال",
     backupRecommend: "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.",
@@ -681,4 +681,4 @@ export default {
     dataRetentionTimeError: "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
     infiniteRetention: "ضبط على 0 للاحتفاظ لا نهائي.",
     confirmDeleteTagMsg: "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة.",
-    };
\ No newline at end of file
+};

From b288d7153503f9802ba413255a7f18b9b0d6c3b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Buchti=C4=8D?= <martin.buchta@gmail.com>
Date: Mon, 23 Jan 2023 10:20:22 +0100
Subject: [PATCH 478/803] Update cs-CZ.js

---
 src/languages/cs-CZ.js | 74 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 66 insertions(+), 8 deletions(-)

diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
index 3396e97b..04fb24c8 100644
--- a/src/languages/cs-CZ.js
+++ b/src/languages/cs-CZ.js
@@ -8,12 +8,27 @@ export default {
     ignoreTLSError: "Ignorovat TLS/SSL chyby na HTTPS stránkách",
     upsideDownModeDescription: "Pomocí této možnosti změníte způsob vyhodnocování stavu. Pokud je služba dosažitelná, je NEDOSTUPNÁ.",
     maxRedirectDescription: "Maximální počet přesměrování, která se mají následovat. Nastavením hodnoty 0 zakážete přesměrování.",
+    enableGRPCTls: "Umožnit odeslání gRPC žádosti během TLS spojení",
+    grpcMethodDescription: "Název metody se převede do cammelCase formátu jako je sayHello, check, aj.",
     acceptedStatusCodesDescription: "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
+    Maintenance: "Údržba",
+    statusMaintenance: "Údržba",
+    "Schedule maintenance": "Naplánovat údržbu",
+    "Affected Monitors": "Dotčené dohledy",
+    "Pick Affected Monitors...": "Vyberte dotčené dohledy…",
+    "Start of maintenance": "Zahájit údržbu",
+    "All Status Pages": "Všechny stavové stránky",
+    "Select status pages...": "Vyberte stavovou stránku…",
+    recurringIntervalMessage: "Spustit jednou každý den | Spustit jednou každých {0} dní",
+    affectedMonitorsDescription: "Vyberte dohledy, které budou ovlivněny touto údržbou",
+    affectedStatusPages: "Zobrazit tuto zprávu o údržbě na vybraných stavových stránkách",
+    atLeastOneMonitor: "Vyberte alespoň jeden dotčený dohled",
     passwordNotMatchMsg: "Hesla se neshodují",
     notificationDescription: "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.",
     keywordDescription: "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
-    pauseDashboardHome: "Pozastavit",
+    pauseDashboardHome: "Pozastaveno",
     deleteMonitorMsg: "Opravdu chcete odstranit tento dohled?",
+    deleteMaintenanceMsg: "Opravdu chcete odstranit tuto údržbu?",
     deleteNotificationMsg: "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
     dnsPortDescription: "Port DNS serveru. Standardně běží na portu 53. V případě potřeby jej můžete kdykoli změnit.",
     resolverserverDescription: "Cloudflare je výchozí server. V případě potřeby můžete Resolver server kdykoli změnit.",
@@ -47,7 +62,7 @@ export default {
     Down: "Nedostupný",
     Pending: "Čekám",
     Unknown: "Neznámý",
-    Pause: "Pozastaveno",
+    Pause: "Pozastavit",
     Name: "Název",
     Status: "Stav",
     DateTime: "Časové razítko",
@@ -59,6 +74,7 @@ export default {
     Current: "Aktuální",
     Uptime: "Doba provozu",
     "Cert Exp.": "Platnost certifikátu",
+    Monitor: "Dohled | Dohledy",
     day: "den | dny/í",
     "-day": "-dní",
     hour: "hodina",
@@ -175,6 +191,7 @@ export default {
     Indigo: "Indigo",
     Purple: "Purpurová",
     Pink: "Růžová",
+    Custom: "Vlastní",
     "Search...": "Hledat…",
     "Avg. Ping": "Průměr Ping",
     "Avg. Response": "Průměr Odpověď",
@@ -194,6 +211,7 @@ export default {
     here: "sem",
     Required: "Vyžadováno",
     telegram: "Telegram",
+    "ZohoCliq": "ZohoCliq",
     "Bot Token": "Token robota",
     wayToGetTelegramToken: "Token můžete získat od {0}.",
     "Chat ID": "ID chatu",
@@ -206,6 +224,8 @@ export default {
     "Content Type": "Typ obsahu",
     webhookJsonDesc: "{0} je vhodný pro všechny moderní servery HTTP, jako je Express.js",
     webhookFormDataDesc: "{multipart} je vhodné pro PHP. JSON bude nutné analyzovat prostřednictvím {decodeFunction}",
+    webhookAdditionalHeadersTitle: "Dodatečné hlavičky",
+    webhookAdditionalHeadersDesc: "Nastavte dodatečné hlavičky, které se odešlou společně s webhookem.",
     smtp: "E-mail (SMTP)",
     secureOptionNone: "Žádné / STARTTLS (25, 587)",
     secureOptionTLS: "TLS (465)",
@@ -223,7 +243,8 @@ export default {
     "Hello @everyone is...": "Dobrý den, {'@'}všichni jsou…",
     teams: "Microsoft Teams",
     "Webhook URL": "URL adresa webhooku",
-    wayToGetTeamsURL: "Informace o tom, jak vytvořit URL adresu webhooku naleznete {0}.",
+    wayToGetTeamsURL: "Informace o tom, jak vytvořit URL adresu webhooku naleznete na {0}.",
+    wayToGetZohoCliqURL: "Informace o tom, jak vytvořit URL adresu webhooku naleznete na {0}.",
     signal: "Signal",
     Number: "Číslo",
     Recipients: "Příjemci",
@@ -253,6 +274,10 @@ export default {
     apprise: "Apprise (podpora více než 50 oznamovacích služeb)",
     GoogleChat: "Google Chat (pouze Google Workspace)",
     pushbullet: "Pushbullet",
+    Kook: "Kook",
+    wayToGetKookBotToken: "Aplikaci vytvoříte a token bota získáte na {0}",
+    wayToGetKookGuildID: "V nastavení Kook aktivujte 'Vývojářský režim' a kliknutím pravým tlačítkem na guild získejte jeho ID",
+    "Guild ID": "Guild ID",
     line: "Line Messenger",
     mattermost: "Mattermost",
     "User Key": "Klíč uživatele",
@@ -297,6 +322,7 @@ export default {
     promosmsTypeSpeed: "SMS SPEED – nejvyšší priorita v systému. Velmi rychlé a spolehlivé, ale nákladné (přibližně dvojnásobek ceny SMS FULL).",
     promosmsPhoneNumber: "Telefonní číslo (polští příjemci mohou vynechat telefonní předvolbu)",
     promosmsSMSSender: "Odesílatel SMS: Předem zaregistrovaný název nebo jeden z výchozích: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    promosmsAllowLongSMS: "Povolit dlouhé SMS",
     "Feishu WebHookUrl": "Feishu WebHookURL",
     matrixHomeserverURL: "URL adresa domácího serveru (s http(s):// a volitelně portem)",
     "Internal Room Id": "ID interní místnosti",
@@ -365,6 +391,16 @@ export default {
     serwersmsAPIPassword: "API heslo",
     serwersmsPhoneNumber: "Telefonní číslo",
     serwersmsSenderName: "Odesílatel SMS (registrováno prostřednictvím zákaznického portálu)",
+    smseagle: "SMSEagle",
+    smseagleTo: "Telefonní číslo(a)",
+    smseagleGroup: "Název skupiny v adresáři",
+    smseagleContact: "Název kontaktu v adresáři",
+    smseagleRecipientType: "Typ příjemce",
+    smseagleRecipient: "Příjemce(i) (více záznamů oddělte čárkou)",
+    smseagleToken: "API přístupový token",
+    smseagleUrl: "URL vašeho SMSEagle zařízení",
+    smseagleEncoding: "Odeslat v Unicode",
+    smseaglePriority: "Priorita zprávy (0-9, výchozí = 0)",
     "stackfield": "Stackfield",
     Customize: "Přizpůsobit",
     "Custom Footer": "Vlastní patička",
@@ -588,11 +624,11 @@ export default {
     "SMSManager API Docs": "SMSManager API Docs ",
     "Gateway Type": "Gateway Typ",
     SMSManager: "SMSManager",
-    "You can divide numbers with": "Čísla můžete dělit pomocí",
+    "You can divide numbers with": "Čísla můžete oddělit pomocí",
     "or": "nebo",
     recurringInterval: "Interval",
     "Recurring": "Opakující se",
-    strategyManual: "Aktivní/Neaktivní Ručně",
+    strategyManual: "Ruční spuštění/vypnutí",
     warningTimezone: "Používá se časové pásmo serveru",
     weekdayShortMon: "Po",
     weekdayShortTue: "Út",
@@ -608,8 +644,8 @@ export default {
     lastDay2: "2. poslední den v měsíci",
     lastDay3: "3. poslední den v měsíci",
     lastDay4: "4. poslední den v měsíci",
-    "No Maintenance": "Žádna údržba",
-    pauseMaintenanceMsg: "Jsi si jistý, že chceš pozastavit údržbu?",
+    "No Maintenance": "Žádná údržba",
+    pauseMaintenanceMsg: "Opravdu chcete pozastavit údržbu?",
     "maintenanceStatus-under-maintenance": "Údržba",
     "maintenanceStatus-inactive": "Neaktivní",
     "maintenanceStatus-scheduled": "Naplánováno",
@@ -622,5 +658,27 @@ export default {
     "Enable DNS Cache": "Povolit DNS Cache",
     "Enable": "Povolit",
     "Disable": "Zakázat",
-    dnsCacheDescription: "V některých prostředích IPv6 nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej.",
+    dnsCacheDescription: "V některých IPv6 prostředích nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej.",
+    "Single Maintenance Window": "Konkrétní časové okno pro údržbu",
+    "Maintenance Time Window of a Day": "Časové okno pro údržbu v daný den",
+    "Effective Date Range": "Časové období",
+    "Schedule Maintenance": "Naplánovat údržbu",
+    "Date and Time": "Datum a čas",
+    "DateTime Range": "Rozsah data a času",
+    Strategy: "Strategie",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "Povolit TLS",
+    "Proto Service Name": "Proto Service Name",
+    "Proto Method": "Proto Method",
+    "Proto Content": "Proto Content",
+    Economy: "Úsporná",
+    Lowcost: "Nízkonákladová",
+    high: "high",
+    "General Monitor Type": "Obecný typ dohledu",
+    "Passive Monitor Type": "Pasivní typ dohledu",
+    "Specific Monitor Type": "Konkrétní typ dohledu",
+    dataRetentionTimeError: "Doba pro uchování musí být větší nebo rovna 0",
+    infiniteRetention: "Pro nekonečný záznam zadejte 0.",
+    confirmDeleteTagMsg: "Opravdu chcete odstranit tento štíte? Provedením této akce nedojde k odstranění dohledů, které jej mají přiřazeny.",
 };

From 5683896910a129c6e2d5e2467f99d9c0a6b0099c Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Fri, 20 Jan 2023 12:34:05 +0800
Subject: [PATCH 479/803] docs: prepare for weblate

---
 .github/PULL_REQUEST_TEMPLATE.md |  2 +-
 README.md                        |  2 +-
 src/languages/README.md          | 15 ++-------------
 3 files changed, 4 insertions(+), 15 deletions(-)

diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 4d2105d4..6bbbf1fd 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -16,7 +16,7 @@ Please delete any options that are not relevant.
 - User interface (UI)
 - New feature (non-breaking change which adds functionality)
 - Breaking change (fix or feature that would cause existing functionality to not work as expected)
-- Translation update
+- ~Translation update~ (Do not accept now, as migration to [Weblate](https://weblate.kuma.pet) is WIP, see #2611)
 - Other
 - This change requires a documentation update
 
diff --git a/README.md b/README.md
index b1a0928c..1bb9b02a 100644
--- a/README.md
+++ b/README.md
@@ -171,7 +171,7 @@ Check out the latest beta release here: https://github.com/louislam/uptime-kuma/
 If you want to report a bug or request a new feature, feel free to open a [new issue](https://github.com/louislam/uptime-kuma/issues).
 
 ### Translations
-If you want to translate Uptime Kuma into your language, please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages
+If you want to translate Uptime Kuma into your language, please visit [Weblate](https://weblate.kuma.pet) (WIP, see #2611).
 
 Feel free to correct my grammar in this README, source code, or wiki, as my mother language is not English and my grammar is not that great.
 
diff --git a/src/languages/README.md b/src/languages/README.md
index c217ea0f..cf3aedbc 100644
--- a/src/languages/README.md
+++ b/src/languages/README.md
@@ -1,14 +1,3 @@
-# How to translate
+# Note
 
-1. Fork this repo.
-2. Run `npm install`
-3. Run `npm run update-language-files --language=<code>` where `<code>`
-   is a valid ISO language code:
-   http://www.lingoes.net/en/translator/langcode.htm. You can also use
-   this command to check if there are new strings to
-   translate for your language.
-4. Your language file should be filled in. You can translate now.
-5. Add it into `languageList` constant.
-6. 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 [the issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
+Translation in this folder is not in use. We are migrating translation workflow to [Weblate](https://weblate.kuma.pet) (WIP, see #2611).

From e9044ae95659f0fdf928e0cba0abef30835f808d Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Mon, 23 Jan 2023 18:10:45 +0000
Subject: [PATCH 480/803] Removed repetitiion of %

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/components/Uptime.vue | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index 09a531a5..afb82fa5 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -35,8 +35,8 @@ export default {
             if (this.$root.uptimeList[key] !== undefined) {
                 let result = Math.round(this.$root.uptimeList[key] * 10000) / 100;
                 // Only perform sanity check on status page. See louislam/uptime-kuma#2628
-                if (this.$route.path.startsWith("/status")) {
-                    return result > 100 ? "100%" : result + "%";
+                if (this.$route.path.startsWith("/status") && result > 100) {
+                    return "100%";
                 } else {
                     return result + "%";
                 }

From 8ade7120ff7094bade164e86d01160fb4c173907 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 24 Jan 2023 13:24:42 +0800
Subject: [PATCH 481/803] Update src/i18n.js

Co-authored-by: 401Unauthorized <redme@live.cn>
---
 src/i18n.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/i18n.js b/src/i18n.js
index 89e9ab1c..939946b0 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -49,7 +49,7 @@ for (let lang in languageList) {
     };
 }
 
-const rtlLangs = [ "fa" , "ar-SY"];
+const rtlLangs = [ "fa", "ar-SY" ];
 
 export const currentLocale = () => localStorage.locale
     || languageList[navigator.language] && navigator.language

From ae0ef79060e30a4d674d874d9d79d727676b8fcf Mon Sep 17 00:00:00 2001
From: Cyril59310 <70776486+cyril59310@users.noreply.github.com>
Date: Tue, 24 Jan 2023 08:16:18 +0100
Subject: [PATCH 482/803] Update french translation  (#2634)

---
 src/components/TagEditDialog.vue |  2 +-
 src/languages/en.js              |  2 +-
 src/languages/fr-FR.js           | 14 +++++++++-----
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/components/TagEditDialog.vue b/src/components/TagEditDialog.vue
index 2f6afbed..80ca32bb 100644
--- a/src/components/TagEditDialog.vue
+++ b/src/components/TagEditDialog.vue
@@ -16,7 +16,7 @@
                         </div>
 
                         <div class="mb-3">
-                            <label for="tag-color" class="form-label">{{ $t("Color") }}</label>
+                            <label for="tag-color" class="form-label">{{ $t("color") }}</label>
                             <div class="d-flex">
                                 <div class="col-8 pe-1">
                                     <vue-multiselect
diff --git a/src/languages/en.js b/src/languages/en.js
index 34dc45ab..8fadfdfb 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -181,7 +181,7 @@ export default {
     "Add New below or Select...": "Add New below or Select...",
     "Tag with this name already exist.": "Tag with this name already exists.",
     "Tag with this value already exist.": "Tag with this value already exists.",
-    color: "color",
+    color: "Color",
     "value (optional)": "value (optional)",
     Gray: "Gray",
     Red: "Red",
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
index ca61bbdc..379e818f 100644
--- a/src/languages/fr-FR.js
+++ b/src/languages/fr-FR.js
@@ -209,7 +209,7 @@ export default {
     here: "ici",
     Required: "Requis",
     telegram: "Telegram",
-    "ZohoCliq": "ZohoCliq",
+    ZohoCliq: "ZohoCliq",
     "Bot Token": "Jeton du robot",
     wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.",
     "Chat ID": "Chat ID",
@@ -308,7 +308,7 @@ export default {
     lineDevConsoleTo: "Console développeurs Line - {0}",
     "Basic Settings": "Paramètres de base",
     "User ID": "Identifiant utilisateur",
-    "Messaging API": "Messaging API", // Ne pas traduire, il s'agit du type de salon affiché sur la console développeurs Line
+    "Messaging API": "Messaging API",
     wayToGetLineChannelToken: "Premièrement accédez à {0}, créez un <i>provider</i> et définissez un type de salon à « Messaging API ». Vous pourrez alors avoir  puis vous pourrez avoir le jeton d'accès du salon et l'identifiant utilisateur demandés.",
     "Icon URL": "URL vers l'icône",
     aboutIconURL: "Vous pouvez mettre un lien vers une image dans « URL vers l'icône » pour remplacer l'image de profil par défaut. Elle ne sera utilisé que si « Icône émoji » n'est pas défini.",
@@ -669,12 +669,16 @@ export default {
     "Proto Service Name": "Nom du service proto",
     "Proto Method": "Méthode Proto",
     "Proto Content": "Contenu proto",
-    "Economy": "Économique",
-    "Lowcost": "Faible coût",
-    "high": "Haute",
+    Economy: "Économique",
+    Lowcost: "Faible coût",
+    high: "Haute",
     "General Monitor Type": "Type de sonde générale",
     "Passive Monitor Type": "Type de sonde passive",
     "Specific Monitor Type": "Type de sonde spécifique",
     dataRetentionTimeError: "La durée de conservation doit être supérieure ou égale à 0",
     infiniteRetention: "Définissez la valeur à 0 pour une durée de conservation infinie.",
+    Monitor: "Sonde | Sondes",
+    Custom: "Personnalisé",
+    confirmDeleteTagMsg: "Voulez-vous vraiment supprimer cette étiquettes ? Les moniteurs associés ne seront pas supprimés.",
+    promosmsAllowLongSMS: "Autoriser les longs SMS",
 };

From 9c4b03aee2945f9bf01dec6e3da62d756cd80099 Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Tue, 24 Jan 2023 15:18:30 +0800
Subject: [PATCH 483/803] sync language changes from upstream

---
 src/lang/ar-SY.json | 684 ++++++++++++++++++++++++++++++++++++++++++++
 src/lang/cs-CZ.json |  74 ++++-
 src/lang/en.json    |   3 +-
 src/lang/fr-FR.json |   6 +-
 src/lang/pl.json    |   1 +
 5 files changed, 758 insertions(+), 10 deletions(-)
 create mode 100644 src/lang/ar-SY.json

diff --git a/src/lang/ar-SY.json b/src/lang/ar-SY.json
new file mode 100644
index 00000000..a961c205
--- /dev/null
+++ b/src/lang/ar-SY.json
@@ -0,0 +1,684 @@
+{
+    "languageName": "العربية",
+    "checkEverySecond": "تحقق من كل {0} ثانية",
+    "retryCheckEverySecond": "أعد محاولة كل {0} ثانية",
+    "resendEveryXTimes": "إعادة تقديم كل {0} مرات",
+    "resendDisabled": "إعادة الالتزام بالتعطيل",
+    "retriesDescription": "الحد الأقصى لإعادة المحاولة قبل تمييز الخدمة على أنها لأسفل وإرسال إشعار",
+    "ignoreTLSError": "تجاهل خطأ TLS/SSL لمواقع HTTPS",
+    "upsideDownModeDescription": "اقلب الحالة رأسًا على عقب. إذا كانت الخدمة قابلة للوصول إلى أسفل.",
+    "maxRedirectDescription": "الحد الأقصى لعدد إعادة التوجيه لمتابعة. ضبط على 0 لتعطيل إعادة التوجيه.",
+    "enableGRPCTls": "السماح لإرسال طلب GRPC مع اتصال TLS",
+    "grpcMethodDescription": "يتم تحويل اسم الطريقة إلى تنسيق Cammelcase مثل Sayhello Check وما إلى ذلك.",
+    "acceptedStatusCodesDescription": "حدد رموز الحالة التي تعتبر استجابة ناجحة.",
+    "Maintenance": "صيانة",
+    "statusMaintenance": "صيانة",
+    "Schedule maintenance": "جدولة الصيانة",
+    "Affected Monitors": "الشاشات المتأثرة",
+    "Pick Affected Monitors...": "اختيار الشاشات المتأثرة ...",
+    "Start of maintenance": "بداية الصيانة",
+    "All Status Pages": "جميع صفحات الحالة",
+    "Select status pages...": "حدد صفحات الحالة ...",
+    "recurringIntervalMessage": "ركض مرة واحدة كل يوم | قم بالتشغيل مرة واحدة كل يوم {0}",
+    "affectedMonitorsDescription": "حدد المراقبين المتأثرة بالصيانة الحالية",
+    "affectedStatusPages": "إظهار رسالة الصيانة هذه على صفحات الحالة المحددة",
+    "atLeastOneMonitor": "حدد شاشة واحدة على الأقل من المتأثرين",
+    "passwordNotMatchMsg": "كلمة المرور المتكررة لا تتطابق.",
+    "notificationDescription": "يجب تعيين الإخطارات إلى شاشة للعمل.",
+    "keywordDescription": "ابحث في الكلمة الرئيسية في استجابة HTML العادية أو JSON. البحث حساس للحالة.",
+    "pauseDashboardHome": "وقفة",
+    "deleteMonitorMsg": "هل أنت متأكد من حذف هذا الشاشة؟",
+    "deleteMaintenanceMsg": "هل أنت متأكد من حذف هذه الصيانة؟",
+    "deleteNotificationMsg": "هل أنت متأكد من حذف هذا الإشعار لجميع الشاشات؟",
+    "dnsPortDescription": "منفذ خادم DNS. الافتراضيات إلى 53. يمكنك تغيير المنفذ في أي وقت.",
+    "resolverserverDescription": "CloudFlare هو الخادم الافتراضي. يمكنك تغيير خادم المحوّل في أي وقت.",
+    "rrtypeDescription": "حدد نوع RR الذي تريد مراقبته",
+    "pauseMonitorMsg": "هل أنت متأكد من أن تتوقف مؤقتًا؟",
+    "enableDefaultNotificationDescription": "سيتم تمكين هذا الإشعار افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الإخطار بشكل منفصل لكل شاشة.",
+    "clearEventsMsg": "هل أنت متأكد من حذف جميع الأحداث لهذا الشاشة؟",
+    "clearHeartbeatsMsg": "هل أنت متأكد من حذف جميع دقات القلب لهذا الشاشة؟",
+    "confirmClearStatisticsMsg": "هل أنت متأكد من أنك تريد حذف جميع الإحصائيات؟",
+    "importHandleDescription": "اختر 'تخطي موجود' إذا كنت تريد تخطي كل شاشة أو إشعار بنفس الاسم. 'الكتابة فوق' سوف يحذف كل شاشة وإخطار موجود.",
+    "confirmImportMsg": "هل أنت متأكد من أنك تريد استيراد النسخ الاحتياطي؟ يرجى التحقق من أنك حددت خيار الاستيراد الصحيح.",
+    "twoFAVerifyLabel": "الرجاء إدخال الرمز المميز الخاص بك للتحقق من 2FA",
+    "tokenValidSettingsMsg": "الرمز المميز صالح! يمكنك الآن حفظ إعدادات 2FA.",
+    "confirmEnableTwoFAMsg": "هل أنت متأكد من أنك تريد تمكين 2FA؟",
+    "confirmDisableTwoFAMsg": "هل أنت متأكد من أنك تريد تعطيل 2FA؟",
+    "Settings": "إعدادات",
+    "Dashboard": "لوحة التحكم",
+    "New Update": "تحديث جديد",
+    "Language": "لغة",
+    "Appearance": "مظهر",
+    "Theme": "سمة",
+    "General": "عام",
+    "Primary Base URL": "عنوان URL الأساسي",
+    "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.": "تصدير الشهادة",
+    "Monitor": "مراقب | مراقبات",
+    "day": "يوم | أيام",
+    "-day": "-يوم",
+    "hour": "ساعة",
+    "-hour": "-ساعة",
+    "Response": "استجاية",
+    "Ping": "بينغ",
+    "Monitor Type": "نوع المراقب",
+    "Keyword": "كلمة مفتاحية",
+    "Friendly Name": "اسم معروف",
+    "URL": "عنوان URL",
+    "Hostname": "اسم المضيف",
+    "Port": "المنفذ",
+    "Heartbeat Interval": "فاصل نبضات القلب",
+    "Retries": "يحاول مجدداً",
+    "Heartbeat Retry Interval": "الفاصل الزمني لإعادة محاكمة نبضات القلب",
+    "Resend Notification if Down X times consequently": "إعادة تقديم الإخطار إذا انخفض x مرات بالتالي",
+    "Advanced": "متقدم",
+    "Upside Down Mode": "وضع أسفل أسفل",
+    "Max. Redirects": "الأعلى. إعادة التوجيه",
+    "Accepted Status Codes": "رموز الحالة المقبولة",
+    "Push URL": "دفع عنوان URL",
+    "needPushEvery": "يجب عليك استدعاء عنوان URL هذا كل ثانية.",
+    "pushOptionalParams": "المعلمات الاختيارية",
+    "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": "تمكين المصادقة",
+    "disableauth.message1": "هل أنت متأكد من أن <strong> تعطيل المصادقة </strong>؟",
+    "disableauth.message2": "تم تصميمه للسيناريوهات <strong> حيث تنوي تنفيذ مصادقة الطرف الثالث </strong> أمام كوما في وقت التشغيل مثل CloudFlare Access Authelia أو آليات المصادقة الأخرى.",
+    "Please use this option carefully!": "الرجاء استخدام هذا الخيار بعناية!",
+    "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": "اعد كلمة السر",
+    "Import Backup": "استيراد النسخ الاحتياطي",
+    "Export Backup": "النسخ الاحتياطي تصدير",
+    "Export": "يصدّر",
+    "Import": "يستورد",
+    "respTime": "resp. الوقت (MS)",
+    "notAvailableShort": "ن/أ",
+    "Default enabled": "التمكين الافتراضي",
+    "Apply on all existing monitors": "تنطبق على جميع الشاشات الحالية",
+    "Create": "خلق",
+    "Clear Data": "امسح البيانات",
+    "Events": "الأحداث",
+    "Heartbeats": "نبضات القلب",
+    "Auto Get": "الحصول على السيارات",
+    "backupDescription": "يمكنك النسخ الاحتياطي لجميع الشاشات والإشعارات في ملف JSON.",
+    "backupDescription2": "ملحوظة",
+    "backupDescription3": "يتم تضمين البيانات الحساسة مثل الرموز الإخطار في ملف التصدير ؛ يرجى تخزين التصدير بشكل آمن.",
+    "alertNoFile": "الرجاء تحديد ملف للاستيراد.",
+    "alertWrongFileType": "الرجاء تحديد ملف JSON.",
+    "Clear all statistics": "مسح جميع الإحصاءات",
+    "Skip existing": "تخطي الموجود",
+    "Overwrite": "الكتابة فوق",
+    "Options": "خيارات",
+    "Keep both": "احتفظ بكليهما",
+    "Verify Token": "تحقق من الرمز المميز",
+    "Setup 2FA": "الإعداد 2FA",
+    "Enable 2FA": "تمكين 2FA",
+    "Disable 2FA": "تعطيل 2FA",
+    "2FA Settings": "2FA إعدادات",
+    "Two Factor Authentication": "توثيق ذو عاملين",
+    "Active": "نشيط",
+    "Inactive": "غير نشط",
+    "Token": "رمز",
+    "Show URI": "أظهر URI",
+    "Tags": "العلامات",
+    "Add New below or Select...": "أضف جديدًا أدناه أو حدد ...",
+    "Tag with this name already exist.": "علامة مع هذا الاسم موجود بالفعل.",
+    "Tag with this value already exist.": "علامة مع هذه القيمة موجودة بالفعل.",
+    "color": "اللون",
+    "value (optional)": "القيمة (اختياري)",
+    "Gray": "رمادي",
+    "Red": "أحمر",
+    "Orange": "البرتقالي",
+    "Green": "لون أخضر",
+    "Blue": "أزرق",
+    "Indigo": "النيلي",
+    "Purple": "نفسجي",
+    "Pink": "لون القرنفل",
+    "Custom": "العادة",
+    "Search...": "يبحث...",
+    "Avg. Ping": "متوسط. بينغ",
+    "Avg. Response": "متوسط. إجابة",
+    "Entry Page": "صفحة الدخول",
+    "statusPageNothing": "لا شيء هنا الرجاء إضافة مجموعة أو شاشة.",
+    "No Services": "لا توجد خدمات",
+    "All Systems Operational": "جميع الأنظمة التشغيلية",
+    "Partially Degraded Service": "الخدمة المتدهورة جزئيا",
+    "Degraded Service": "خدمة متدهورة",
+    "Add Group": "أضف مجموعة",
+    "Add a monitor": "إضافة شاشة",
+    "Edit Status Page": "تحرير صفحة الحالة",
+    "Go to Dashboard": "الذهاب إلى لوحة القيادة",
+    "Status Page": "صفحة الحالة",
+    "Status Pages": "صفحات الحالة",
+    "defaultNotificationName": "تنبيه {الإخطار} ({number})",
+    "here": "هنا",
+    "Required": "مطلوب",
+    "telegram": "برقية",
+    "ZohoCliq": "Zohocliq",
+    "Bot Token": "رمز الروبوت",
+    "wayToGetTelegramToken": "يمكنك الحصول على رمز من {0}.",
+    "Chat ID": "معرف الدردشة",
+    "supportTelegramChatID": "دعم الدردشة المباشرة / معرف الدردشة للقناة",
+    "wayToGetTelegramChatID": "يمكنك الحصول على معرف الدردشة الخاص بك عن طريق إرسال رسالة إلى الروبوت والانتقال إلى عنوان URL هذا لعرض Chat_id",
+    "YOUR BOT TOKEN HERE": "رمز الروبوت الخاص بك هنا",
+    "chatIDNotFound": "لم يتم العثور على معرف الدردشة ؛ الرجاء إرسال رسالة إلى هذا الروبوت أولاً",
+    "webhook": "webhook",
+    "Post URL": "بعد عنوان URL",
+    "Content Type": "نوع المحتوى",
+    "webhookJsonDesc": "{0} مفيد لأي خوادم HTTP الحديثة مثل Express.js",
+    "webhookFormDataDesc": "{multipart} مفيد لـ PHP. سيحتاج JSON إلى تحليل {decodefunction}",
+    "webhookAdditionalHeadersTitle": "رؤوس إضافية",
+    "webhookAdditionalHeadersDesc": "يحدد رؤوس إضافية مرسلة مع webhook.",
+    "smtp": "البريد الإلكتروني (SMTP)",
+    "secureOptionNone": "لا شيء / startTls (25 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "تجاهل خطأ TLS",
+    "From Email": "من البريد الإلكترونى",
+    "emailCustomSubject": "موضوع مخصص",
+    "To Email": "للبريد الإلكتروني",
+    "smtpCC": "نسخة",
+    "smtpBCC": "BCC",
+    "discord": "خلاف",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "يمكنك الحصول على هذا عن طريق الانتقال إلى إعدادات الخادم -> التكامل -> إنشاء WebHook",
+    "Bot Display Name": "اسم عرض الروبوت",
+    "Prefix Custom Message": "بادئة رسالة مخصصة",
+    "Hello @everyone is...": "مرحبًا {'@'} الجميع ...",
+    "teams": "فرق Microsoft",
+    "Webhook URL": "Webhook URL",
+    "wayToGetTeamsURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
+    "wayToGetZohoCliqURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
+    "signal": "الإشارة",
+    "Number": "رقم",
+    "Recipients": "المستلمين",
+    "needSignalAPI": "تحتاج إلى وجود عميل إشارة مع REST API.",
+    "wayToCheckSignalURL": "يمكنك التحقق من عنوان URL هذا لعرض كيفية إعداد واحد",
+    "signalImportant": "مهم",
+    "gotify": "gotify",
+    "Application Token": "رمز التطبيق",
+    "Server URL": "عنوان URL الخادم",
+    "Priority": "أولوية",
+    "slack": "تثاقل",
+    "Icon Emoji": "أيقونة الرموز التعبيرية",
+    "Channel Name": "اسم القناة",
+    "Uptime Kuma URL": "UPTIME KUMA URL",
+    "aboutWebhooks": "مزيد من المعلومات حول Webhooks ON",
+    "aboutChannelName": "أدخل اسم القناة في حقل اسم القناة {0} إذا كنت تريد تجاوز قناة WebHook. السابق",
+    "aboutKumaURL": "إذا تركت حقل URL في وقت التشغيل KUMA فارغًا ، فسيتم افتراضيًا إلى صفحة GitHub Project.",
+    "emojiCheatSheet": "ورقة الغش في الرموز التعبيرية",
+    "rocket.chat": "صاروخ",
+    "pushover": "مهمة سهلة",
+    "pushy": "انتهازي",
+    "PushByTechulus": "دفع بواسطة Techulus",
+    "octopush": "أوكتوبوش",
+    "promosms": "الترويجيات",
+    "clicksendsms": "نقرات SMS",
+    "lunasea": "لوناسيا",
+    "apprise": "إبلاغ (دعم 50+ خدمات الإخطار)",
+    "GoogleChat": "دردشة Google",
+    "pushbullet": "حماس",
+    "Kook": "كووك",
+    "wayToGetKookBotToken": "قم بإنشاء تطبيق واحصل على رمز الروبوت الخاص بك على {0}",
+    "wayToGetKookGuildID": "قم بتشغيل 'وضع المطور' في إعداد Kook وانقر بزر الماوس الأيمن على النقابة للحصول على معرفه",
+    "Guild ID": "معرف النقابة",
+    "line": "خط",
+    "mattermost": "المادة",
+    "User Key": "مفتاح المستخدم",
+    "Device": "جهاز",
+    "Message Title": "عنوان الرسالة",
+    "Notification Sound": "صوت الإشعار",
+    "More info on": "مزيد من المعلومات حول",
+    "pushoverDesc1": "أولوية الطوارئ (2) لها مهلة افتراضية 30 ثانية بين إعادة المحاولة وستنتهي صلاحيتها بعد ساعة واحدة.",
+    "pushoverDesc2": "إذا كنت ترغب في إرسال إشعارات إلى أجهزة مختلفة ، قم بملء حقل الجهاز.",
+    "SMS Type": "نوع الرسائل القصيرة",
+    "octopushTypePremium": "قسط (سريع - موصى به للتنبيه)",
+    "octopushTypeLowCost": "التكلفة المنخفضة (بطيئة - تم حظرها أحيانًا بواسطة المشغل)",
+    "checkPrice": "تحقق من الأسعار {0}",
+    "apiCredentials": "بيانات اعتماد API",
+    "octopushLegacyHint": "هل تستخدم الإصدار القديم من Octopush (2011-2020) أو الإصدار الجديد؟",
+    "Check octopush prices": "تحقق من أسعار Octopush {0}.",
+    "octopushPhoneNumber": "رقم الهاتف (تنسيق intl على سبيل المثال",
+    "octopushSMSSender": "اسم مرسل الرسائل القصيرة",
+    "LunaSea Device ID": "معرف جهاز Lunasea",
+    "Apprise URL": "إبلاغ عنوان URL",
+    "Example": "مثال",
+    "Read more:": "{0} :قراءة المزيد",
+    "Status:": "{0} :حالة",
+    "Read more": "قراءة المزيد",
+    "appriseInstalled": "تم تثبيت Prosise.",
+    "appriseNotInstalled": "الإبرام غير مثبت. {0}",
+    "Access Token": "رمز وصول",
+    "Channel access token": "قناة الوصول إلى الرمز",
+    "Line Developers Console": "تحكم المطورين",
+    "lineDevConsoleTo": "وحدة المطورين Line Console - {0}",
+    "Basic Settings": "الإعدادات الأساسية",
+    "User ID": "معرف المستخدم",
+    "Messaging API": "واجهة برمجة تطبيقات المراسلة",
+    "wayToGetLineChannelToken": "قم أولاً بالوصول إلى {0} إنشاء مزود وقناة (واجهة برمجة تطبيقات المراسلة) ، ثم يمكنك الحصول على رمز الوصول إلى القناة ومعرف المستخدم من عناصر القائمة المذكورة أعلاه.",
+    "Icon URL": "url url icon",
+    "aboutIconURL": "يمكنك توفير رابط لصورة في \"Icon URL\" لتجاوز صورة الملف الشخصي الافتراضي. لن يتم استخدامه إذا تم تعيين رمز رمز رمز.",
+    "aboutMattermostChannelName": "يمكنك تجاوز القناة الافتراضية التي تنشرها WebHook من خلال إدخال اسم القناة في \"Channel Name\" الحقل. يجب تمكين هذا في إعدادات Webhook Mattern. السابق",
+    "matrix": "مصفوفة",
+    "promosmsTypeEco": "SMS Eco - رخيصة ولكن بطيئة وغالبًا ما تكون محملة. يقتصر فقط على المستفيدين البولنديين.",
+    "promosmsTypeFlash": "SMS Flash - سيتم عرض الرسالة تلقائيًا على جهاز المستلم. يقتصر فقط على المستفيدين البولنديين.",
+    "promosmsTypeFull": "SMS Full - Tier Premium SMS يمكنك استخدام اسم المرسل الخاص بك (تحتاج إلى تسجيل الاسم أولاً). موثوقة للتنبيهات.",
+    "promosmsTypeSpeed": "سرعة الرسائل القصيرة - أولوية قصوى في النظام. سريع وموثوق للغاية ولكنه مكلف (حوالي مرتين من الرسائل القصيرة السعر الكامل).",
+    "promosmsPhoneNumber": "رقم الهاتف (للمستلم البولندي ، يمكنك تخطي رموز المنطقة)",
+    "promosmsSMSSender": "اسم مرسل الرسائل القصيرة",
+    "promosmsAllowLongSMS": "السماح الرسائل القصيرة الطويلة",
+    "Feishu WebHookUrl": "Feishu Webhookurl",
+    "matrixHomeserverURL": "عنوان URL HomeServer (مع HTTP (S)",
+    "Internal Room Id": "معرف الغرفة الداخلية",
+    "matrixDesc1": "يمكنك العثور على معرف الغرفة الداخلي من خلال البحث في القسم المتقدم من إعدادات الغرفة في عميل Matrix الخاص بك. يجب أن تبدو مثل! QMDRCPUIFLWSFJXYE6",
+    "matrixDesc2": "يوصى بشدة بإنشاء مستخدم جديد ولا تستخدم رمز الوصول إلى مستخدم Matrix الخاص بك لأنه سيتيح الوصول الكامل إلى حسابك وجميع الغرف التي انضمت إليها. بدلاً من ذلك ، قم بإنشاء مستخدم جديد ودعوته فقط إلى الغرفة التي تريد تلقيها الإشعار فيها. يمكنك الحصول على رمز الوصول عن طريق تشغيل {0}",
+    "Method": "طريقة",
+    "Body": "الجسم",
+    "Headers": "الرؤوس",
+    "PushUrl": "دفع عنوان URL",
+    "HeadersInvalidFormat": "رؤوس الطلبات غير صالحة JSON",
+    "BodyInvalidFormat": "هيئة الطلب غير صالحة JSON",
+    "Monitor History": "مراقبة التاريخ",
+    "clearDataOlderThan": "الحفاظ على بيانات سجل المراقبة للأيام {0}.",
+    "PasswordsDoNotMatch": "كلمة المرور غير مطابقة.",
+    "records": "السجلات",
+    "One record": "سجل واحد",
+    "steamApiKeyDescription": "لمراقبة خادم لعبة Steam ، تحتاج إلى مفتاح Steam Web-API. يمكنك تسجيل مفتاح API الخاص بك هنا",
+    "Current User": "المستخدم الحالي",
+    "topic": "عنوان",
+    "topicExplanation": "موضوع MQTT لرصد",
+    "successMessage": "نجاح رسالة",
+    "successMessageExplanation": "رسالة MQTT التي ستعتبر نجاحًا",
+    "recent": "الأخيرة",
+    "Done": "فعله",
+    "Info": "معلومات",
+    "Security": "حماية",
+    "Steam API Key": "مفتاح API Steam",
+    "Shrink Database": "تقلص قاعدة البيانات",
+    "Pick a RR-Type...": "اختر نوع RR ...",
+    "Pick Accepted Status Codes...": "اختيار رموز الحالة المقبولة ...",
+    "Default": "تقصير",
+    "HTTP Options": "خيارات HTTP",
+    "Create Incident": "إنشاء حادث",
+    "Title": "لقب",
+    "Content": "المحتوى",
+    "Style": "أسلوب",
+    "info": "معلومات",
+    "warning": "تحذير",
+    "danger": "خطر",
+    "error": "خطأ",
+    "critical": "شديد الأهمية",
+    "primary": "الأولية",
+    "light": "نور",
+    "dark": "ظلام",
+    "Post": "بريد",
+    "Please input title and content": "الرجاء إدخال العنوان والمحتوى",
+    "Created": "مخلوق",
+    "Last Updated": "التحديث الاخير",
+    "Unpin": "إلغاء",
+    "Switch to Light Theme": "التبديل إلى موضوع الضوء",
+    "Switch to Dark Theme": "التبديل إلى موضوع الظلام",
+    "Show Tags": "أضهر العلامات",
+    "Hide Tags": "إخفاء العلامات",
+    "Description": "وصف",
+    "No monitors available.": "لا شاشات المتاحة.",
+    "Add one": "أضف واحدا",
+    "No Monitors": "لا شاشات",
+    "Untitled Group": "مجموعة بلا عنوان",
+    "Services": "خدمات",
+    "Discard": "تجاهل",
+    "Cancel": "يلغي",
+    "Powered by": "مشغل بواسطة",
+    "shrinkDatabaseDescription": "تشغيل فراغ قاعدة البيانات لـ SQLite. إذا تم إنشاء قاعدة البيانات الخاصة بك بعد تمكين 1.10.0 AUTO_VACUUM بالفعل ولا يلزم هذا الإجراء.",
+    "serwersms": "Serwersms.pl",
+    "serwersmsAPIUser": "اسم مستخدم API (بما في ذلك بادئة WebAPI_)",
+    "serwersmsAPIPassword": "كلمة مرور API",
+    "serwersmsPhoneNumber": "رقم الهاتف",
+    "serwersmsSenderName": "اسم مرسل الرسائل القصيرة (مسجل عبر بوابة العملاء)",
+    "smseagle": "smseagle",
+    "smseagleTo": "أرقام الهواتف)",
+    "smseagleGroup": "اسم مجموعة كتب الهاتف (S)",
+    "smseagleContact": "كتاب الاتصال اسم (S)",
+    "smseagleRecipientType": "نوع المستلم",
+    "smseagleRecipient": "المتلقي (المتلقيين) (يجب فصل المتعددة مع فاصلة)",
+    "smseagleToken": "API وصول الرمز المميز",
+    "smseagleUrl": "عنوان URL لجهاز SMSEGLE الخاص بك",
+    "smseagleEncoding": "إرسال Unicode",
+    "smseaglePriority": "أولوية الرسالة (0-9 افتراضي = 0)",
+    "stackfield": "Stackfield",
+    "Customize": "يعدل أو يكيف",
+    "Custom Footer": "تذييل مخصص",
+    "Custom CSS": "لغة تنسيق ويب حسب الطلب",
+    "smtpDkimSettings": "إعدادات DKIM",
+    "smtpDkimDesc": "يرجى الرجوع إلى Nodemailer dkim {0} للاستخدام.",
+    "documentation": "توثيق",
+    "smtpDkimDomain": "اسم النطاق",
+    "smtpDkimKeySelector": "المحدد الرئيسي",
+    "smtpDkimPrivateKey": "مفتاح سري",
+    "smtpDkimHashAlgo": "خوارزمية التجزئة (اختياري)",
+    "smtpDkimheaderFieldNames": "مفاتيح الرأس للتوقيع (اختياري)",
+    "smtpDkimskipFields": "مفاتيح الرأس لا توقيع (اختياري)",
+    "wayToGetPagerDutyKey": "يمكنك الحصول على هذا عن طريق الانتقال إلى الخدمة -> دليل الخدمة -> (حدد خدمة) -> تكامل -> إضافة التكامل. هنا يمكنك البحث عن \"Events API V2\". مزيد من المعلومات {0}",
+    "Integration Key": "مفتاح التكامل",
+    "Integration URL": "URL تكامل",
+    "Auto resolve or acknowledged": "حل السيارات أو الاعتراف به",
+    "do nothing": "لا تفعل شيئا",
+    "auto acknowledged": "اعترف السيارات",
+    "auto resolve": "عزم السيارات",
+    "gorush": "جورش",
+    "alerta": "أليتا",
+    "alertaApiEndpoint": "نقطة نهاية API",
+    "alertaEnvironment": "بيئة",
+    "alertaApiKey": "مفتاح API",
+    "alertaAlertState": "حالة التنبيه",
+    "alertaRecoverState": "استعادة الدولة",
+    "deleteStatusPageMsg": "هل أنت متأكد من حذف صفحة الحالة هذه؟",
+    "Proxies": "وكلاء",
+    "default": "تقصير",
+    "enabled": "تمكين",
+    "setAsDefault": "تعيين كافتراضي",
+    "deleteProxyMsg": "هل أنت متأكد من حذف هذا الوكيل لجميع الشاشات؟",
+    "proxyDescription": "يجب تعيين الوكلاء إلى شاشة للعمل.",
+    "enableProxyDescription": "لن يؤثر هذا الوكيل على طلبات الشاشة حتى يتم تنشيطه. يمكنك التحكم مؤقتًا في تعطيل الوكيل من جميع الشاشات حسب حالة التنشيط.",
+    "setAsDefaultProxyDescription": "سيتم تمكين هذا الوكيل افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الوكيل بشكل منفصل لكل شاشة.",
+    "Certificate Chain": "سلسلة الشهادة",
+    "Valid": "صالح",
+    "Invalid": "غير صالح",
+    "AccessKeyId": "معرف AccessKey",
+    "SecretAccessKey": "Accesskey Secret",
+    "PhoneNumbers": "أرقام الهواتف",
+    "TemplateCode": "TemplateCode",
+    "SignName": "اسم تسجيل الدخول",
+    "Sms template must contain parameters: ": "يجب أن يحتوي قالب الرسائل القصيرة على معلمات:",
+    "Bark Endpoint": "نقطة نهاية اللحاء",
+    "Bark Group": "مجموعة اللحاء",
+    "Bark Sound": "صوت اللحاء",
+    "WebHookUrl": "webhookurl",
+    "SecretKey": "Secretkey",
+    "For safety, must use secret key": "للسلامة يجب استخدام المفتاح السري",
+    "Device Token": "رمز الجهاز",
+    "Platform": "منصة",
+    "iOS": "iOS",
+    "Android": "ذكري المظهر",
+    "Huawei": "هواوي",
+    "High": "عالٍ",
+    "Retry": "إعادة المحاولة",
+    "Topic": "عنوان",
+    "WeCom Bot Key": "WECOM BOT KEY",
+    "Setup Proxy": "وكيل الإعداد",
+    "Proxy Protocol": "بروتوكول الوكيل",
+    "Proxy Server": "مخدم بروكسي",
+    "Proxy server has authentication": "خادم الوكيل لديه مصادقة",
+    "User": "المستعمل",
+    "Installed": "المثبتة",
+    "Not installed": "غير مثبت",
+    "Running": "جري",
+    "Not running": "لا يعمل",
+    "Remove Token": "إزالة الرمز المميز",
+    "Start": "بداية",
+    "Stop": "قف",
+    "Uptime Kuma": "وقت التشغيل كوما",
+    "Add New Status Page": "أضف صفحة حالة جديدة",
+    "Slug": "سبيكة",
+    "Accept characters": "قبول الشخصيات",
+    "startOrEndWithOnly": "ابدأ أو ينتهي بـ {0} فقط",
+    "No consecutive dashes": "لا شرطات متتالية",
+    "Next": "التالي",
+    "The slug is already taken. Please choose another slug.": "تم أخذ سبيكة بالفعل. الرجاء اختيار سبيكة أخرى.",
+    "No Proxy": "لا الوكيل",
+    "Authentication": "المصادقة",
+    "HTTP Basic Auth": "HTTP الأساسي Auth",
+    "New Status Page": "صفحة حالة جديدة",
+    "Page Not Found": "الصفحة غير موجودة",
+    "Reverse Proxy": "وكيل عكسي",
+    "Backup": "دعم",
+    "About": "عن",
+    "wayToGetCloudflaredURL": "(قم بتنزيل CloudFlared من {0})",
+    "cloudflareWebsite": "موقع CloudFlare",
+    "Message:": ":رسالة",
+    "Don't know how to get the token? Please read the guide": "لا أعرف كيف تحصل على الرمز المميز؟ يرجى قراءة الدليل",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "قد يضيع الاتصال الحالي إذا كنت تتصل حاليًا عبر نفق CloudFlare. هل أنت متأكد تريد إيقافها؟ اكتب كلمة المرور الحالية لتأكيدها.",
+    "HTTP Headers": "رؤوس HTTP",
+    "Trust Proxy": "الوكيل الثقة",
+    "Other Software": "برامج أخرى",
+    "For example: nginx, Apache and Traefik.": "على سبيل المثال: nginx و Apache و Traefik.",
+    "Please read": "يرجى القراءة",
+    "Subject": "موضوع",
+    "Valid To": "صالحة ل",
+    "Days Remaining": "الأيام المتبقية",
+    "Issuer": "المصدر",
+    "Fingerprint": "بصمة",
+    "No status pages": "لا صفحات الحالة",
+    "Domain Name Expiry Notification": "اسم النطاق إشعار انتهاء الصلاحية",
+    "Proxy": "الوكيل",
+    "Date Created": "تاريخ الإنشاء",
+    "HomeAssistant": "مساعد المنزل",
+    "onebotHttpAddress": "OneBot HTTP عنوان",
+    "onebotMessageType": "نوع رسالة OneBot",
+    "onebotGroupMessage": "مجموعة",
+    "onebotPrivateMessage": "خاص",
+    "onebotUserOrGroupId": "معرف المجموعة/المستخدم",
+    "onebotSafetyTips": "للسلامة يجب ضبط الرمز المميز للوصول",
+    "PushDeer Key": "مفتاح PushDeer",
+    "Footer Text": "نص تذييل",
+    "Show Powered By": "عرض مدعوم من قبل",
+    "Domain Names": "أسماء المجال",
+    "signedInDisp": "وقعت في {0}",
+    "signedInDispDisabled": "معاق المصادقة.",
+    "RadiusSecret": "سر نصف القطر",
+    "RadiusSecretDescription": "السر المشترك بين العميل والخادم",
+    "RadiusCalledStationId": "يسمى معرف المحطة",
+    "RadiusCalledStationIdDescription": "معرف الجهاز المتصل",
+    "RadiusCallingStationId": "معرف محطة الاتصال",
+    "RadiusCallingStationIdDescription": "معرف جهاز الاتصال",
+    "Certificate Expiry Notification": "إشعار انتهاء الصلاحية",
+    "API Username": "اسم المستخدم API",
+    "API Key": "مفتاح API",
+    "Recipient Number": "رقم المستلم",
+    "From Name/Number": "من الاسم/الرقم",
+    "Leave blank to use a shared sender number.": "اترك فارغًا لاستخدام رقم المرسل المشترك.",
+    "Octopush API Version": "إصدار Octopush API",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "endpoint": "نقطة النهاية",
+    "octopushAPIKey": "\"API key\" from HTTP API بيانات اعتماد في لوحة التحكم",
+    "octopushLogin": "\"Login\" من بيانات اعتماد API HTTP في لوحة التحكم",
+    "promosmsLogin": "اسم تسجيل الدخول API",
+    "promosmsPassword": "كلمة مرور API",
+    "pushoversounds pushover": "سداد (افتراضي)",
+    "pushoversounds bike": "دراجة هوائية",
+    "pushoversounds bugle": "بوق",
+    "pushoversounds cashregister": "ماكينة تسجيل المدفوعات النقدية",
+    "pushoversounds classical": "كلاسيكي",
+    "pushoversounds cosmic": "كونية",
+    "pushoversounds falling": "هبوط",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "واردة",
+    "pushoversounds intermission": "استراحة",
+    "pushoversounds magic": "سحر",
+    "pushoversounds mechanical": "ميكانيكي",
+    "pushoversounds pianobar": "شريط البيانو",
+    "pushoversounds siren": "صفارة إنذار",
+    "pushoversounds spacealarm": "إنذار الفضاء",
+    "pushoversounds tugboat": "قارب السحب",
+    "pushoversounds alien": "إنذار أجنبي (طويل)",
+    "pushoversounds climb": "تسلق (طويل)",
+    "pushoversounds persistent": "مستمر (طويل)",
+    "pushoversounds echo": "صدى مهووس (طويل)",
+    "pushoversounds updown": "صعودا (طويلة)",
+    "pushoversounds vibrate": "يهتز فقط",
+    "pushoversounds none": "لا شيء (صامت)",
+    "pushyAPIKey": "مفتاح API السري",
+    "pushyToken": "رمز الجهاز",
+    "Show update if available": "عرض التحديث إذا كان ذلك متاحًا",
+    "Also check beta release": "تحقق أيضًا من الإصدار التجريبي",
+    "Using a Reverse Proxy?": "باستخدام وكيل عكسي؟",
+    "Check how to config it for WebSocket": "تحقق من كيفية تكوينه لـ WebSocket",
+    "Steam Game Server": "خادم لعبة البخار",
+    "Most likely causes": "الأسباب المرجحة",
+    "The resource is no longer available.": "لم يعد المورد متاحًا.",
+    "There might be a typing error in the address.": "قد يكون هناك خطأ مطبعي في العنوان.",
+    "What you can try": "ماذا تستطيع أن تجرب",
+    "Retype the address.": "اعد كتابة العنوان.",
+    "Go back to the previous page.": "عد للصفحة السابقة.",
+    "Coming Soon": "قريبا",
+    "wayToGetClickSendSMSToken": "يمكنك الحصول على اسم مستخدم API ومفتاح API من {0}.",
+    "Connection String": "سلسلة الاتصال",
+    "Query": "استفسار",
+    "settingsCertificateExpiry": "شهادة TLS انتهاء الصلاحية",
+    "certificationExpiryDescription": "شاشات HTTPS تضيء عندما تنتهي شهادة TLS في",
+    "Setup Docker Host": "إعداد مضيف Docker",
+    "Connection Type": "نوع الاتصال",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "هل أنت متأكد من حذف مضيف Docker لجميع الشاشات؟",
+    "socket": "قابس كهرباء",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "حاوية Docker",
+    "Container Name / ID": "اسم الحاوية / معرف",
+    "Docker Host": "مضيف Docker",
+    "Docker Hosts": "مضيفي Docker",
+    "ntfy Topic": "موضوع ntfy",
+    "Domain": "اِختِصاص",
+    "Workstation": "محطة العمل",
+    "disableCloudflaredNoAuthMsg": "أنت في وضع مصادقة لا توجد كلمة مرور غير مطلوبة.",
+    "trustProxyDescription": "الثقة 'x-forward-*'. إذا كنت ترغب في الحصول على IP العميل الصحيح وكوما في الوقت المناسب مثل Nginx أو Apache ، فيجب عليك تمكين ذلك.",
+    "wayToGetLineNotifyToken": "يمكنك الحصول على رمز الوصول من {0}",
+    "Examples": "أمثلة",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "الرمز المميز للوصول منذ فترة طويلة",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "يمكن إنشاء رمز الوصول منذ فترة طويلة عن طريق النقر على اسم ملف التعريف الخاص بك (أسفل اليسار) والتمرير إلى الأسفل ثم انقر فوق إنشاء الرمز المميز.",
+    "Notification Service": "خدمة الإخطار",
+    "default: notify all devices": "الافتراضي: إخطار جميع الأجهزة",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "يمكن العثور على قائمة بخدمات الإخطار في المساعد المنزلي ضمن \"Developer Tools > Services\" ابحث عن \"notification\" للعثور على اسم جهازك/هاتفك.",
+    "Automations can optionally be triggered in Home Assistant": "يمكن أن يتم تشغيل الأتمتة اختياريًا في مساعد المنزل",
+    "Trigger type": "نوع الزناد",
+    "Event type": "نوع الحدث",
+    "Event data": "بيانات الحدث",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "ثم اختر إجراءً على سبيل المثال قم بتبديل المشهد إلى حيث يكون ضوء RGB أحمر.",
+    "Frontend Version": "إصدار الواجهة الأمامية",
+    "Frontend Version do not match backend version!": "إصدار Frontend لا يتطابق مع الإصدار الخلفي!",
+    "Base URL": "عنوان URL الأساسي",
+    "goAlertInfo": "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}",
+    "goAlertIntegrationKeyInfo": "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
+    "goAlert": "المرمى",
+    "backupOutdatedWarning": "إهمال",
+    "backupRecommend": "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.",
+    "Optional": "اختياري",
+    "squadcast": "القاء فريقي",
+    "SendKey": "Sendkey",
+    "SMSManager API Docs": "مستندات SMSManager API",
+    "Gateway Type": "نوع البوابة",
+    "SMSManager": "smsmanager",
+    "You can divide numbers with": "يمكنك تقسيم الأرقام مع",
+    "or": "أو",
+    "recurringInterval": "فترة",
+    "Recurring": "يتكرر",
+    "strategyManual": "نشط/غير نشط يدويًا",
+    "warningTimezone": "إنه يستخدم المنطقة الزمنية للخادم",
+    "weekdayShortMon": "الاثنين",
+    "weekdayShortTue": "الثلاثاء",
+    "weekdayShortWed": "تزوج",
+    "weekdayShortThu": "الخميس",
+    "weekdayShortFri": "الجمعة",
+    "weekdayShortSat": "جلس",
+    "weekdayShortSun": "شمس",
+    "dayOfWeek": "يوم من الأسبوع",
+    "dayOfMonth": "يوم من الشهر",
+    "lastDay": "بالأمس",
+    "lastDay1": "آخر يوم من الشهر",
+    "lastDay2": "الثاني في اليوم الأخير من الشهر",
+    "lastDay3": "الثالث في اليوم الأخير من الشهر",
+    "lastDay4": "الرابع في اليوم الأخير من الشهر",
+    "No Maintenance": "لا صيانة",
+    "pauseMaintenanceMsg": "هل أنت متأكد من أن تتوقف مؤقتًا؟",
+    "maintenanceStatus-under-maintenance": "تحت الصيانة",
+    "maintenanceStatus-inactive": "غير نشط",
+    "maintenanceStatus-scheduled": "المقرر",
+    "maintenanceStatus-ended": "انتهى",
+    "maintenanceStatus-unknown": "مجهول",
+    "Display Timezone": "عرض المنطقة الزمنية",
+    "Server Timezone": "المنطقة الزمنية الخادم",
+    "statusPageMaintenanceEndDate": "نهاية",
+    "IconUrl": "url url icon",
+    "Enable DNS Cache": "تمكين ذاكرة التخزين المؤقت DNS",
+    "Enable": "يُمكَِن",
+    "Disable": "إبطال",
+    "dnsCacheDescription": "قد لا يعمل في بعض بيئات IPv6 تعطيله إذا واجهت أي مشكلات.",
+    "Single Maintenance Window": "نافذة صيانة واحدة",
+    "Maintenance Time Window of a Day": "نافذة وقت الصيانة لليوم",
+    "Effective Date Range": "نطاق التاريخ السريع",
+    "Schedule Maintenance": "جدولة الصيانة",
+    "Date and Time": "التاريخ و الوقت",
+    "DateTime Range": "نطاق DateTime",
+    "Strategy": "إستراتيجية",
+    "Free Mobile User Identifier": "معرف مستخدم الهاتف المحمول المجاني",
+    "Free Mobile API Key": "مفتاح واجهة برمجة تطبيقات مجانية للهاتف المحمول",
+    "Enable TLS": "تمكين TLS",
+    "Proto Service Name": "اسم خدمة البروتو",
+    "Proto Method": "طريقة البروتو",
+    "Proto Content": "محتوى proto",
+    "Economy": "اقتصاد",
+    "Lowcost": "تكلفة منخفضة",
+    "high": "عالي",
+    "General Monitor Type": "نوع الشاشة العامة",
+    "Passive Monitor Type": "نوع الشاشة السلبي",
+    "Specific Monitor Type": "نوع شاشة محدد",
+    "dataRetentionTimeError": "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
+    "infiniteRetention": "ضبط على 0 للاحتفاظ لا نهائي.",
+    "confirmDeleteTagMsg": "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة."
+}
\ No newline at end of file
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index 2e2e52f7..e94a38f6 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -8,12 +8,27 @@
     "ignoreTLSError": "Ignorovat TLS/SSL chyby na HTTPS stránkách",
     "upsideDownModeDescription": "Pomocí této možnosti změníte způsob vyhodnocování stavu. Pokud je služba dosažitelná, je NEDOSTUPNÁ.",
     "maxRedirectDescription": "Maximální počet přesměrování, která se mají následovat. Nastavením hodnoty 0 zakážete přesměrování.",
+    "enableGRPCTls": "Umožnit odeslání gRPC žádosti během TLS spojení",
+    "grpcMethodDescription": "Název metody se převede do cammelCase formátu jako je sayHello, check, aj.",
     "acceptedStatusCodesDescription": "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
+    "Maintenance": "Údržba",
+    "statusMaintenance": "Údržba",
+    "Schedule maintenance": "Naplánovat údržbu",
+    "Affected Monitors": "Dotčené dohledy",
+    "Pick Affected Monitors...": "Vyberte dotčené dohledy…",
+    "Start of maintenance": "Zahájit údržbu",
+    "All Status Pages": "Všechny stavové stránky",
+    "Select status pages...": "Vyberte stavovou stránku…",
+    "recurringIntervalMessage": "Spustit jednou každý den | Spustit jednou každých {0} dní",
+    "affectedMonitorsDescription": "Vyberte dohledy, které budou ovlivněny touto údržbou",
+    "affectedStatusPages": "Zobrazit tuto zprávu o údržbě na vybraných stavových stránkách",
+    "atLeastOneMonitor": "Vyberte alespoň jeden dotčený dohled",
     "passwordNotMatchMsg": "Hesla se neshodují",
     "notificationDescription": "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.",
     "keywordDescription": "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
-    "pauseDashboardHome": "Pozastavit",
+    "pauseDashboardHome": "Pozastaveno",
     "deleteMonitorMsg": "Opravdu chcete odstranit tento dohled?",
+    "deleteMaintenanceMsg": "Opravdu chcete odstranit tuto údržbu?",
     "deleteNotificationMsg": "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
     "dnsPortDescription": "Port DNS serveru. Standardně běží na portu 53. V případě potřeby jej můžete kdykoli změnit.",
     "resolverserverDescription": "Cloudflare je výchozí server. V případě potřeby můžete Resolver server kdykoli změnit.",
@@ -47,7 +62,7 @@
     "Down": "Nedostupný",
     "Pending": "Čekám",
     "Unknown": "Neznámý",
-    "Pause": "Pozastaveno",
+    "Pause": "Pozastavit",
     "Name": "Název",
     "Status": "Stav",
     "DateTime": "Časové razítko",
@@ -59,6 +74,7 @@
     "Current": "Aktuální",
     "Uptime": "Doba provozu",
     "Cert Exp.": "Platnost certifikátu",
+    "Monitor": "Dohled | Dohledy",
     "day": "den | dny/í",
     "-day": "-dní",
     "hour": "hodina",
@@ -175,6 +191,7 @@
     "Indigo": "Indigo",
     "Purple": "Purpurová",
     "Pink": "Růžová",
+    "Custom": "Vlastní",
     "Search...": "Hledat…",
     "Avg. Ping": "Průměr Ping",
     "Avg. Response": "Průměr Odpověď",
@@ -194,6 +211,7 @@
     "here": "sem",
     "Required": "Vyžadováno",
     "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
     "Bot Token": "Token robota",
     "wayToGetTelegramToken": "Token můžete získat od {0}.",
     "Chat ID": "ID chatu",
@@ -206,6 +224,8 @@
     "Content Type": "Typ obsahu",
     "webhookJsonDesc": "{0} je vhodný pro všechny moderní servery HTTP, jako je Express.js",
     "webhookFormDataDesc": "{multipart} je vhodné pro PHP. JSON bude nutné analyzovat prostřednictvím {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "Dodatečné hlavičky",
+    "webhookAdditionalHeadersDesc": "Nastavte dodatečné hlavičky, které se odešlou společně s webhookem.",
     "smtp": "E-mail (SMTP)",
     "secureOptionNone": "Žádné / STARTTLS (25, 587)",
     "secureOptionTLS": "TLS (465)",
@@ -223,7 +243,8 @@
     "Hello @everyone is...": "Dobrý den, {'@'}všichni jsou…",
     "teams": "Microsoft Teams",
     "Webhook URL": "URL adresa webhooku",
-    "wayToGetTeamsURL": "Informace o tom, jak vytvořit URL adresu webhooku naleznete {0}.",
+    "wayToGetTeamsURL": "Informace o tom, jak vytvořit URL adresu webhooku naleznete na {0}.",
+    "wayToGetZohoCliqURL": "Informace o tom, jak vytvořit URL adresu webhooku naleznete na {0}.",
     "signal": "Signal",
     "Number": "Číslo",
     "Recipients": "Příjemci",
@@ -253,6 +274,10 @@
     "apprise": "Apprise (podpora více než 50 oznamovacích služeb)",
     "GoogleChat": "Google Chat (pouze Google Workspace)",
     "pushbullet": "Pushbullet",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Aplikaci vytvoříte a token bota získáte na {0}",
+    "wayToGetKookGuildID": "V nastavení Kook aktivujte 'Vývojářský režim' a kliknutím pravým tlačítkem na guild získejte jeho ID",
+    "Guild ID": "Guild ID",
     "line": "Line Messenger",
     "mattermost": "Mattermost",
     "User Key": "Klíč uživatele",
@@ -297,6 +322,7 @@
     "promosmsTypeSpeed": "SMS SPEED – nejvyšší priorita v systému. Velmi rychlé a spolehlivé, ale nákladné (přibližně dvojnásobek ceny SMS FULL).",
     "promosmsPhoneNumber": "Telefonní číslo (polští příjemci mohou vynechat telefonní předvolbu)",
     "promosmsSMSSender": "Odesílatel SMS: Předem zaregistrovaný název nebo jeden z výchozích: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "promosmsAllowLongSMS": "Povolit dlouhé SMS",
     "Feishu WebHookUrl": "Feishu WebHookURL",
     "matrixHomeserverURL": "URL adresa domácího serveru (s http(s):// a volitelně portem)",
     "Internal Room Id": "ID interní místnosti",
@@ -365,6 +391,16 @@
     "serwersmsAPIPassword": "API heslo",
     "serwersmsPhoneNumber": "Telefonní číslo",
     "serwersmsSenderName": "Odesílatel SMS (registrováno prostřednictvím zákaznického portálu)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Telefonní číslo(a)",
+    "smseagleGroup": "Název skupiny v adresáři",
+    "smseagleContact": "Název kontaktu v adresáři",
+    "smseagleRecipientType": "Typ příjemce",
+    "smseagleRecipient": "Příjemce(i) (více záznamů oddělte čárkou)",
+    "smseagleToken": "API přístupový token",
+    "smseagleUrl": "URL vašeho SMSEagle zařízení",
+    "smseagleEncoding": "Odeslat v Unicode",
+    "smseaglePriority": "Priorita zprávy (0-9, výchozí = 0)",
     "stackfield": "Stackfield",
     "Customize": "Přizpůsobit",
     "Custom Footer": "Vlastní patička",
@@ -588,11 +624,11 @@
     "SMSManager API Docs": "SMSManager API Docs ",
     "Gateway Type": "Gateway Typ",
     "SMSManager": "SMSManager",
-    "You can divide numbers with": "Čísla můžete dělit pomocí",
+    "You can divide numbers with": "Čísla můžete oddělit pomocí",
     "or": "nebo",
     "recurringInterval": "Interval",
     "Recurring": "Opakující se",
-    "strategyManual": "Aktivní/Neaktivní Ručně",
+    "strategyManual": "Ruční spuštění/vypnutí",
     "warningTimezone": "Používá se časové pásmo serveru",
     "weekdayShortMon": "Po",
     "weekdayShortTue": "Út",
@@ -608,8 +644,8 @@
     "lastDay2": "2. poslední den v měsíci",
     "lastDay3": "3. poslední den v měsíci",
     "lastDay4": "4. poslední den v měsíci",
-    "No Maintenance": "Žádna údržba",
-    "pauseMaintenanceMsg": "Jsi si jistý, že chceš pozastavit údržbu?",
+    "No Maintenance": "Žádná údržba",
+    "pauseMaintenanceMsg": "Opravdu chcete pozastavit údržbu?",
     "maintenanceStatus-under-maintenance": "Údržba",
     "maintenanceStatus-inactive": "Neaktivní",
     "maintenanceStatus-scheduled": "Naplánováno",
@@ -622,5 +658,27 @@
     "Enable DNS Cache": "Povolit DNS Cache",
     "Enable": "Povolit",
     "Disable": "Zakázat",
-    "dnsCacheDescription": "V některých prostředích IPv6 nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej."
+    "dnsCacheDescription": "V některých IPv6 prostředích nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej.",
+    "Single Maintenance Window": "Konkrétní časové okno pro údržbu",
+    "Maintenance Time Window of a Day": "Časové okno pro údržbu v daný den",
+    "Effective Date Range": "Časové období",
+    "Schedule Maintenance": "Naplánovat údržbu",
+    "Date and Time": "Datum a čas",
+    "DateTime Range": "Rozsah data a času",
+    "Strategy": "Strategie",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "Povolit TLS",
+    "Proto Service Name": "Proto Service Name",
+    "Proto Method": "Proto Method",
+    "Proto Content": "Proto Content",
+    "Economy": "Úsporná",
+    "Lowcost": "Nízkonákladová",
+    "high": "high",
+    "General Monitor Type": "Obecný typ dohledu",
+    "Passive Monitor Type": "Pasivní typ dohledu",
+    "Specific Monitor Type": "Konkrétní typ dohledu",
+    "dataRetentionTimeError": "Doba pro uchování musí být větší nebo rovna 0",
+    "infiniteRetention": "Pro nekonečný záznam zadejte 0.",
+    "confirmDeleteTagMsg": "Opravdu chcete odstranit tento štíte? Provedením této akce nedojde k odstranění dohledů, které jej mají přiřazeny."
 }
\ No newline at end of file
diff --git a/src/lang/en.json b/src/lang/en.json
index e919a537..22f61f1b 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -181,7 +181,7 @@
     "Add New below or Select...": "Add New below or Select...",
     "Tag with this name already exist.": "Tag with this name already exists.",
     "Tag with this value already exist.": "Tag with this value already exists.",
-    "color": "color",
+    "color": "Color",
     "value (optional)": "value (optional)",
     "Gray": "Gray",
     "Red": "Red",
@@ -322,6 +322,7 @@
     "promosmsTypeSpeed": "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
     "promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes)",
     "promosmsSMSSender": "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "promosmsAllowLongSMS": "Allow long SMS",
     "Feishu WebHookUrl": "Feishu WebHookURL",
     "matrixHomeserverURL": "Homeserver URL (with http(s):// and optionally port)",
     "Internal Room Id": "Internal Room ID",
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 4a3feb63..3decd987 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -676,5 +676,9 @@
     "Passive Monitor Type": "Type de sonde passive",
     "Specific Monitor Type": "Type de sonde spécifique",
     "dataRetentionTimeError": "La durée de conservation doit être supérieure ou égale à 0",
-    "infiniteRetention": "Définissez la valeur à 0 pour une durée de conservation infinie."
+    "infiniteRetention": "Définissez la valeur à 0 pour une durée de conservation infinie.",
+    "Monitor": "Sonde | Sondes",
+    "Custom": "Personnalisé",
+    "confirmDeleteTagMsg": "Voulez-vous vraiment supprimer cette étiquettes ? Les moniteurs associés ne seront pas supprimés.",
+    "promosmsAllowLongSMS": "Autoriser les longs SMS"
 }
\ No newline at end of file
diff --git a/src/lang/pl.json b/src/lang/pl.json
index 5dd163ed..88123547 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -284,6 +284,7 @@
     "promosmsTypeSpeed": "SMS SPEED - wysyłka priorytetowa, ma wszystkie zalety SMS FULL",
     "promosmsPhoneNumber": "Numer odbiorcy",
     "promosmsSMSSender": "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)",
+    "promosmsAllowLongSMS": "Zezwól na długie SMSy",
     "Primary Base URL": "Główny URL",
     "Push URL": "Push URL",
     "needPushEvery": "Powinieneś wywoływać ten URL co {0} sekund",

From ea83af3404eec3d7054e909fe8646aa86cadf51f Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Tue, 24 Jan 2023 16:00:51 +0800
Subject: [PATCH 484/803] clean up codes

---
 extra/convert-language-files/.gitignore   |   3 -
 extra/convert-language-files/index.js     |  29 -
 extra/convert-language-files/package.json |  12 -
 src/languages/README.md                   |   3 -
 src/languages/ar-SY.js                    | 684 ----------------------
 src/languages/bg-BG.js                    | 678 ---------------------
 src/languages/cs-CZ.js                    | 684 ----------------------
 src/languages/da-DK.js                    | 355 -----------
 src/languages/de-CH.js                    | 634 --------------------
 src/languages/de-DE.js                    | 641 --------------------
 src/languages/el-GR.js                    | 587 -------------------
 src/languages/en.js                       | 684 ----------------------
 src/languages/es-ES.js                    | 209 -------
 src/languages/et-EE.js                    | 209 -------
 src/languages/eu.js                       | 541 -----------------
 src/languages/fa.js                       | 208 -------
 src/languages/fr-FR.js                    | 684 ----------------------
 src/languages/he-IL.js                    | 672 ---------------------
 src/languages/hr-HR.js                    | 581 ------------------
 src/languages/hu.js                       | 376 ------------
 src/languages/id-ID.js                    | 585 ------------------
 src/languages/it-IT.js                    | 367 ------------
 src/languages/ja.js                       | 201 -------
 src/languages/ko-KR.js                    | 531 -----------------
 src/languages/nb-NO.js                    | 285 ---------
 src/languages/nl-NL.js                    | 531 -----------------
 src/languages/pl.js                       | 645 --------------------
 src/languages/pt-BR.js                    | 203 -------
 src/languages/pt-PT.js                    | 203 -------
 src/languages/ru-RU.js                    | 581 ------------------
 src/languages/sl-SI.js                    | 357 -----------
 src/languages/sr-latn.js                  | 204 -------
 src/languages/sr.js                       | 204 -------
 src/languages/sv-SE.js                    | 110 ----
 src/languages/th-TH.js                    | 580 ------------------
 src/languages/tr-TR.js                    | 678 ---------------------
 src/languages/uk-UA.js                    | 530 -----------------
 src/languages/vi-VN.js                    | 469 ---------------
 src/languages/zh-CN.js                    | 683 ---------------------
 src/languages/zh-HK.js                    | 388 ------------
 src/languages/zh-TW.js                    | 672 ---------------------
 41 files changed, 17481 deletions(-)
 delete mode 100644 extra/convert-language-files/.gitignore
 delete mode 100644 extra/convert-language-files/index.js
 delete mode 100644 extra/convert-language-files/package.json
 delete mode 100644 src/languages/README.md
 delete mode 100644 src/languages/ar-SY.js
 delete mode 100644 src/languages/bg-BG.js
 delete mode 100644 src/languages/cs-CZ.js
 delete mode 100644 src/languages/da-DK.js
 delete mode 100644 src/languages/de-CH.js
 delete mode 100644 src/languages/de-DE.js
 delete mode 100644 src/languages/el-GR.js
 delete mode 100644 src/languages/en.js
 delete mode 100644 src/languages/es-ES.js
 delete mode 100644 src/languages/et-EE.js
 delete mode 100644 src/languages/eu.js
 delete mode 100644 src/languages/fa.js
 delete mode 100644 src/languages/fr-FR.js
 delete mode 100644 src/languages/he-IL.js
 delete mode 100644 src/languages/hr-HR.js
 delete mode 100644 src/languages/hu.js
 delete mode 100644 src/languages/id-ID.js
 delete mode 100644 src/languages/it-IT.js
 delete mode 100644 src/languages/ja.js
 delete mode 100644 src/languages/ko-KR.js
 delete mode 100644 src/languages/nb-NO.js
 delete mode 100644 src/languages/nl-NL.js
 delete mode 100644 src/languages/pl.js
 delete mode 100644 src/languages/pt-BR.js
 delete mode 100644 src/languages/pt-PT.js
 delete mode 100644 src/languages/ru-RU.js
 delete mode 100644 src/languages/sl-SI.js
 delete mode 100644 src/languages/sr-latn.js
 delete mode 100644 src/languages/sr.js
 delete mode 100644 src/languages/sv-SE.js
 delete mode 100644 src/languages/th-TH.js
 delete mode 100644 src/languages/tr-TR.js
 delete mode 100644 src/languages/uk-UA.js
 delete mode 100644 src/languages/vi-VN.js
 delete mode 100644 src/languages/zh-CN.js
 delete mode 100644 src/languages/zh-HK.js
 delete mode 100644 src/languages/zh-TW.js

diff --git a/extra/convert-language-files/.gitignore b/extra/convert-language-files/.gitignore
deleted file mode 100644
index 410c913c..00000000
--- a/extra/convert-language-files/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-package-lock.json
-test.js
-languages/
diff --git a/extra/convert-language-files/index.js b/extra/convert-language-files/index.js
deleted file mode 100644
index 3082d32e..00000000
--- a/extra/convert-language-files/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Need to use ES6 to read language files
-
-import fs from "fs";
-import rmSync from "../fs-rmSync.js";
-
-async function convent(langCode) {
-    fs.copyFileSync(`../../src/languages/${langCode}.js`, `./languages/${langCode}.js`);
-    const lang = (await import(`./languages/${langCode}.js`)).default;
-    // console.log(JSON.stringify(lang));
-    fs.writeFile(`../../src/lang/${langCode}.json`, JSON.stringify(lang, null, 4), function (err) {
-        if (err) {
-            throw err;
-        }
-        console.log(`Convent success for ${langCode}`);
-    });
-}
-
-if (fs.existsSync("./languages")) {
-    rmSync("./languages", { recursive: true });
-}
-fs.mkdirSync("./languages");
-
-let files = fs.readdirSync("../../src/languages/");
-console.log(files);
-files.forEach(async (filename) => {
-    if (filename !== "README.md") {
-        await convent(filename.replace(".js", ""));
-    }
-});
diff --git a/extra/convert-language-files/package.json b/extra/convert-language-files/package.json
deleted file mode 100644
index 81493aa3..00000000
--- a/extra/convert-language-files/package.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "name": "convert-language-files",
-    "type": "module",
-    "version": "1.0.0",
-    "description": "",
-    "main": "index.js",
-    "scripts": {
-        "test": "echo \"Error: no test specified\" && exit 1"
-    },
-    "author": "",
-    "license": "ISC"
-}
diff --git a/src/languages/README.md b/src/languages/README.md
deleted file mode 100644
index cf3aedbc..00000000
--- a/src/languages/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Note
-
-Translation in this folder is not in use. We are migrating translation workflow to [Weblate](https://weblate.kuma.pet) (WIP, see #2611).
diff --git a/src/languages/ar-SY.js b/src/languages/ar-SY.js
deleted file mode 100644
index 8c6bcf9d..00000000
--- a/src/languages/ar-SY.js
+++ /dev/null
@@ -1,684 +0,0 @@
-export default {
-    languageName: "العربية",
-    checkEverySecond: "تحقق من كل {0} ثانية",
-    retryCheckEverySecond: "أعد محاولة كل {0} ثانية",
-    resendEveryXTimes: "إعادة تقديم كل {0} مرات",
-    resendDisabled: "إعادة الالتزام بالتعطيل",
-    retriesDescription: "الحد الأقصى لإعادة المحاولة قبل تمييز الخدمة على أنها لأسفل وإرسال إشعار",
-    ignoreTLSError: "تجاهل خطأ TLS/SSL لمواقع HTTPS",
-    upsideDownModeDescription: "اقلب الحالة رأسًا على عقب. إذا كانت الخدمة قابلة للوصول إلى أسفل.",
-    maxRedirectDescription: "الحد الأقصى لعدد إعادة التوجيه لمتابعة. ضبط على 0 لتعطيل إعادة التوجيه.",
-    enableGRPCTls: "السماح لإرسال طلب GRPC مع اتصال TLS",
-    grpcMethodDescription: "يتم تحويل اسم الطريقة إلى تنسيق Cammelcase مثل Sayhello Check وما إلى ذلك.",
-    acceptedStatusCodesDescription: "حدد رموز الحالة التي تعتبر استجابة ناجحة.",
-    Maintenance: "صيانة",
-    statusMaintenance: "صيانة",
-    "Schedule maintenance": "جدولة الصيانة",
-    "Affected Monitors": "الشاشات المتأثرة",
-    "Pick Affected Monitors...": "اختيار الشاشات المتأثرة ...",
-    "Start of maintenance": "بداية الصيانة",
-    "All Status Pages": "جميع صفحات الحالة",
-    "Select status pages...": "حدد صفحات الحالة ...",
-    recurringIntervalMessage: "ركض مرة واحدة كل يوم | قم بالتشغيل مرة واحدة كل يوم {0}",
-    affectedMonitorsDescription: "حدد المراقبين المتأثرة بالصيانة الحالية",
-    affectedStatusPages: "إظهار رسالة الصيانة هذه على صفحات الحالة المحددة",
-    atLeastOneMonitor: "حدد شاشة واحدة على الأقل من المتأثرين",
-    passwordNotMatchMsg: "كلمة المرور المتكررة لا تتطابق.",
-    notificationDescription: "يجب تعيين الإخطارات إلى شاشة للعمل.",
-    keywordDescription: "ابحث في الكلمة الرئيسية في استجابة HTML العادية أو JSON. البحث حساس للحالة.",
-    pauseDashboardHome: "وقفة",
-    deleteMonitorMsg: "هل أنت متأكد من حذف هذا الشاشة؟",
-    deleteMaintenanceMsg: "هل أنت متأكد من حذف هذه الصيانة؟",
-    deleteNotificationMsg: "هل أنت متأكد من حذف هذا الإشعار لجميع الشاشات؟",
-    dnsPortDescription: "منفذ خادم DNS. الافتراضيات إلى 53. يمكنك تغيير المنفذ في أي وقت.",
-    resolverserverDescription: "CloudFlare هو الخادم الافتراضي. يمكنك تغيير خادم المحوّل في أي وقت.",
-    rrtypeDescription: "حدد نوع RR الذي تريد مراقبته",
-    pauseMonitorMsg: "هل أنت متأكد من أن تتوقف مؤقتًا؟",
-    enableDefaultNotificationDescription: "سيتم تمكين هذا الإشعار افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الإخطار بشكل منفصل لكل شاشة.",
-    clearEventsMsg: "هل أنت متأكد من حذف جميع الأحداث لهذا الشاشة؟",
-    clearHeartbeatsMsg: "هل أنت متأكد من حذف جميع دقات القلب لهذا الشاشة؟",
-    confirmClearStatisticsMsg: "هل أنت متأكد من أنك تريد حذف جميع الإحصائيات؟",
-    importHandleDescription: "اختر 'تخطي موجود' إذا كنت تريد تخطي كل شاشة أو إشعار بنفس الاسم. 'الكتابة فوق' سوف يحذف كل شاشة وإخطار موجود.",
-    confirmImportMsg: "هل أنت متأكد من أنك تريد استيراد النسخ الاحتياطي؟ يرجى التحقق من أنك حددت خيار الاستيراد الصحيح.",
-    twoFAVerifyLabel: "الرجاء إدخال الرمز المميز الخاص بك للتحقق من 2FA",
-    tokenValidSettingsMsg: "الرمز المميز صالح! يمكنك الآن حفظ إعدادات 2FA.",
-    confirmEnableTwoFAMsg: "هل أنت متأكد من أنك تريد تمكين 2FA؟",
-    confirmDisableTwoFAMsg: "هل أنت متأكد من أنك تريد تعطيل 2FA؟",
-    Settings: "إعدادات",
-    Dashboard: "لوحة التحكم",
-    "New Update": "تحديث جديد",
-    Language: "لغة",
-    Appearance: "مظهر",
-    Theme: "سمة",
-    General: "عام",
-    "Primary Base URL": "عنوان URL الأساسي",
-    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.": "تصدير الشهادة",
-    Monitor: "مراقب | مراقبات",
-    day: "يوم | أيام",
-    "-day": "-يوم",
-    hour: "ساعة",
-    "-hour": "-ساعة",
-    Response: "استجاية",
-    Ping: "بينغ",
-    "Monitor Type": "نوع المراقب",
-    Keyword: "كلمة مفتاحية",
-    "Friendly Name": "اسم معروف",
-    URL: "عنوان URL",
-    Hostname: "اسم المضيف",
-    Port: "المنفذ",
-    "Heartbeat Interval": "فاصل نبضات القلب",
-    Retries: "يحاول مجدداً",
-    "Heartbeat Retry Interval": "الفاصل الزمني لإعادة محاكمة نبضات القلب",
-    "Resend Notification if Down X times consequently": "إعادة تقديم الإخطار إذا انخفض x مرات بالتالي",
-    Advanced: "متقدم",
-    "Upside Down Mode": "وضع أسفل أسفل",
-    "Max. Redirects": "الأعلى. إعادة التوجيه",
-    "Accepted Status Codes": "رموز الحالة المقبولة",
-    "Push URL": "دفع عنوان URL",
-    needPushEvery: "يجب عليك استدعاء عنوان URL هذا كل ثانية.",
-    pushOptionalParams: "المعلمات الاختيارية",
-    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": "تمكين المصادقة",
-    "disableauth.message1": "هل أنت متأكد من أن <strong> تعطيل المصادقة </strong>؟",
-    "disableauth.message2": "تم تصميمه للسيناريوهات <strong> حيث تنوي تنفيذ مصادقة الطرف الثالث </strong> أمام كوما في وقت التشغيل مثل CloudFlare Access Authelia أو آليات المصادقة الأخرى.",
-    "Please use this option carefully!": "الرجاء استخدام هذا الخيار بعناية!",
-    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": "اعد كلمة السر",
-    "Import Backup": "استيراد النسخ الاحتياطي",
-    "Export Backup": "النسخ الاحتياطي تصدير",
-    Export: "يصدّر",
-    Import: "يستورد",
-    respTime: "resp. الوقت (MS)",
-    notAvailableShort: "ن/أ",
-    "Default enabled": "التمكين الافتراضي",
-    "Apply on all existing monitors": "تنطبق على جميع الشاشات الحالية",
-    Create: "خلق",
-    "Clear Data": "امسح البيانات",
-    Events: "الأحداث",
-    Heartbeats: "نبضات القلب",
-    "Auto Get": "الحصول على السيارات",
-    backupDescription: "يمكنك النسخ الاحتياطي لجميع الشاشات والإشعارات في ملف JSON.",
-    backupDescription2: "ملحوظة",
-    backupDescription3: "يتم تضمين البيانات الحساسة مثل الرموز الإخطار في ملف التصدير ؛ يرجى تخزين التصدير بشكل آمن.",
-    alertNoFile: "الرجاء تحديد ملف للاستيراد.",
-    alertWrongFileType: "الرجاء تحديد ملف JSON.",
-    "Clear all statistics": "مسح جميع الإحصاءات",
-    "Skip existing": "تخطي الموجود",
-    Overwrite: "الكتابة فوق",
-    Options: "خيارات",
-    "Keep both": "احتفظ بكليهما",
-    "Verify Token": "تحقق من الرمز المميز",
-    "Setup 2FA": "الإعداد 2FA",
-    "Enable 2FA": "تمكين 2FA",
-    "Disable 2FA": "تعطيل 2FA",
-    "2FA Settings": "2FA إعدادات",
-    "Two Factor Authentication": "توثيق ذو عاملين",
-    Active: "نشيط",
-    Inactive: "غير نشط",
-    Token: "رمز",
-    "Show URI": "أظهر URI",
-    Tags: "العلامات",
-    "Add New below or Select...": "أضف جديدًا أدناه أو حدد ...",
-    "Tag with this name already exist.": "علامة مع هذا الاسم موجود بالفعل.",
-    "Tag with this value already exist.": "علامة مع هذه القيمة موجودة بالفعل.",
-    color: "اللون",
-    "value (optional)": "القيمة (اختياري)",
-    Gray: "رمادي",
-    Red: "أحمر",
-    Orange: "البرتقالي",
-    Green: "لون أخضر",
-    Blue: "أزرق",
-    Indigo: "النيلي",
-    Purple: "نفسجي",
-    Pink: "لون القرنفل",
-    Custom: "العادة",
-    "Search...": "يبحث...",
-    "Avg. Ping": "متوسط. بينغ",
-    "Avg. Response": "متوسط. إجابة",
-    "Entry Page": "صفحة الدخول",
-    statusPageNothing: "لا شيء هنا الرجاء إضافة مجموعة أو شاشة.",
-    "No Services": "لا توجد خدمات",
-    "All Systems Operational": "جميع الأنظمة التشغيلية",
-    "Partially Degraded Service": "الخدمة المتدهورة جزئيا",
-    "Degraded Service": "خدمة متدهورة",
-    "Add Group": "أضف مجموعة",
-    "Add a monitor": "إضافة شاشة",
-    "Edit Status Page": "تحرير صفحة الحالة",
-    "Go to Dashboard": "الذهاب إلى لوحة القيادة",
-    "Status Page": "صفحة الحالة",
-    "Status Pages": "صفحات الحالة",
-    defaultNotificationName: "تنبيه {الإخطار} ({number})",
-    here: "هنا",
-    Required: "مطلوب",
-    telegram: "برقية",
-    "ZohoCliq": "Zohocliq",
-    "Bot Token": "رمز الروبوت",
-    wayToGetTelegramToken: "يمكنك الحصول على رمز من {0}.",
-    "Chat ID": "معرف الدردشة",
-    supportTelegramChatID: "دعم الدردشة المباشرة / معرف الدردشة للقناة",
-    wayToGetTelegramChatID: "يمكنك الحصول على معرف الدردشة الخاص بك عن طريق إرسال رسالة إلى الروبوت والانتقال إلى عنوان URL هذا لعرض Chat_id",
-    "YOUR BOT TOKEN HERE": "رمز الروبوت الخاص بك هنا",
-    chatIDNotFound: "لم يتم العثور على معرف الدردشة ؛ الرجاء إرسال رسالة إلى هذا الروبوت أولاً",
-    webhook: "webhook",
-    "Post URL": "بعد عنوان URL",
-    "Content Type": "نوع المحتوى",
-    webhookJsonDesc: "{0} مفيد لأي خوادم HTTP الحديثة مثل Express.js",
-    webhookFormDataDesc: "{multipart} مفيد لـ PHP. سيحتاج JSON إلى تحليل {decodefunction}",
-    webhookAdditionalHeadersTitle: "رؤوس إضافية",
-    webhookAdditionalHeadersDesc: "يحدد رؤوس إضافية مرسلة مع webhook.",
-    smtp: "البريد الإلكتروني (SMTP)",
-    secureOptionNone: "لا شيء / startTls (25 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "تجاهل خطأ TLS",
-    "From Email": "من البريد الإلكترونى",
-    emailCustomSubject: "موضوع مخصص",
-    "To Email": "للبريد الإلكتروني",
-    smtpCC: "نسخة",
-    smtpBCC: "BCC",
-    discord: "خلاف",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "يمكنك الحصول على هذا عن طريق الانتقال إلى إعدادات الخادم -> التكامل -> إنشاء WebHook",
-    "Bot Display Name": "اسم عرض الروبوت",
-    "Prefix Custom Message": "بادئة رسالة مخصصة",
-    "Hello @everyone is...": "مرحبًا {'@'} الجميع ...",
-    teams: "فرق Microsoft",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
-    wayToGetZohoCliqURL: "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
-    signal: "الإشارة",
-    Number: "رقم",
-    Recipients: "المستلمين",
-    needSignalAPI: "تحتاج إلى وجود عميل إشارة مع REST API.",
-    wayToCheckSignalURL: "يمكنك التحقق من عنوان URL هذا لعرض كيفية إعداد واحد",
-    signalImportant: "مهم",
-    gotify: "gotify",
-    "Application Token": "رمز التطبيق",
-    "Server URL": "عنوان URL الخادم",
-    Priority: "أولوية",
-    slack: "تثاقل",
-    "Icon Emoji": "أيقونة الرموز التعبيرية",
-    "Channel Name": "اسم القناة",
-    "Uptime Kuma URL": "UPTIME KUMA URL",
-    aboutWebhooks: "مزيد من المعلومات حول Webhooks ON",
-    aboutChannelName: "أدخل اسم القناة في حقل اسم القناة {0} إذا كنت تريد تجاوز قناة WebHook. السابق",
-    aboutKumaURL: "إذا تركت حقل URL في وقت التشغيل KUMA فارغًا ، فسيتم افتراضيًا إلى صفحة GitHub Project.",
-    emojiCheatSheet: "ورقة الغش في الرموز التعبيرية",
-    "rocket.chat": "صاروخ",
-    pushover: "مهمة سهلة",
-    pushy: "انتهازي",
-    PushByTechulus: "دفع بواسطة Techulus",
-    octopush: "أوكتوبوش",
-    promosms: "الترويجيات",
-    clicksendsms: "نقرات SMS",
-    lunasea: "لوناسيا",
-    apprise: "إبلاغ (دعم 50+ خدمات الإخطار)",
-    GoogleChat: "دردشة Google",
-    pushbullet: "حماس",
-    Kook: "كووك",
-    wayToGetKookBotToken: "قم بإنشاء تطبيق واحصل على رمز الروبوت الخاص بك على {0}",
-    wayToGetKookGuildID: "قم بتشغيل 'وضع المطور' في إعداد Kook وانقر بزر الماوس الأيمن على النقابة للحصول على معرفه",
-    "Guild ID": "معرف النقابة",
-    line: "خط",
-    mattermost: "المادة",
-    "User Key": "مفتاح المستخدم",
-    Device: "جهاز",
-    "Message Title": "عنوان الرسالة",
-    "Notification Sound": "صوت الإشعار",
-    "More info on": "مزيد من المعلومات حول",
-    pushoverDesc1: "أولوية الطوارئ (2) لها مهلة افتراضية 30 ثانية بين إعادة المحاولة وستنتهي صلاحيتها بعد ساعة واحدة.",
-    pushoverDesc2: "إذا كنت ترغب في إرسال إشعارات إلى أجهزة مختلفة ، قم بملء حقل الجهاز.",
-    "SMS Type": "نوع الرسائل القصيرة",
-    octopushTypePremium: "قسط (سريع - موصى به للتنبيه)",
-    octopushTypeLowCost: "التكلفة المنخفضة (بطيئة - تم حظرها أحيانًا بواسطة المشغل)",
-    checkPrice: "تحقق من الأسعار {0}",
-    apiCredentials: "بيانات اعتماد API",
-    octopushLegacyHint: "هل تستخدم الإصدار القديم من Octopush (2011-2020) أو الإصدار الجديد؟",
-    "Check octopush prices": "تحقق من أسعار Octopush {0}.",
-    octopushPhoneNumber: "رقم الهاتف (تنسيق intl على سبيل المثال",
-    octopushSMSSender: "اسم مرسل الرسائل القصيرة",
-    "LunaSea Device ID": "معرف جهاز Lunasea",
-    "Apprise URL": "إبلاغ عنوان URL",
-    "Example": "مثال",
-    "Read more:": "{0} :قراءة المزيد",
-    "Status:": "{0} :حالة",
-    "Read more": "قراءة المزيد",
-    appriseInstalled: "تم تثبيت Prosise.",
-    appriseNotInstalled: "الإبرام غير مثبت. {0}",
-    "Access Token": "رمز وصول",
-    "Channel access token": "قناة الوصول إلى الرمز",
-    "Line Developers Console": "تحكم المطورين",
-    lineDevConsoleTo: "وحدة المطورين Line Console - {0}",
-    "Basic Settings": "الإعدادات الأساسية",
-    "User ID": "معرف المستخدم",
-    "Messaging API": "واجهة برمجة تطبيقات المراسلة",
-    wayToGetLineChannelToken: "قم أولاً بالوصول إلى {0} إنشاء مزود وقناة (واجهة برمجة تطبيقات المراسلة) ، ثم يمكنك الحصول على رمز الوصول إلى القناة ومعرف المستخدم من عناصر القائمة المذكورة أعلاه.",
-    "Icon URL": "url url icon",
-    aboutIconURL: "يمكنك توفير رابط لصورة في \"Icon URL\" لتجاوز صورة الملف الشخصي الافتراضي. لن يتم استخدامه إذا تم تعيين رمز رمز رمز.",
-    aboutMattermostChannelName: "يمكنك تجاوز القناة الافتراضية التي تنشرها WebHook من خلال إدخال اسم القناة في \"Channel Name\" الحقل. يجب تمكين هذا في إعدادات Webhook Mattern. السابق",
-    matrix: "مصفوفة",
-    promosmsTypeEco: "SMS Eco - رخيصة ولكن بطيئة وغالبًا ما تكون محملة. يقتصر فقط على المستفيدين البولنديين.",
-    promosmsTypeFlash: "SMS Flash - سيتم عرض الرسالة تلقائيًا على جهاز المستلم. يقتصر فقط على المستفيدين البولنديين.",
-    promosmsTypeFull: "SMS Full - Tier Premium SMS يمكنك استخدام اسم المرسل الخاص بك (تحتاج إلى تسجيل الاسم أولاً). موثوقة للتنبيهات.",
-    promosmsTypeSpeed: "سرعة الرسائل القصيرة - أولوية قصوى في النظام. سريع وموثوق للغاية ولكنه مكلف (حوالي مرتين من الرسائل القصيرة السعر الكامل).",
-    promosmsPhoneNumber: "رقم الهاتف (للمستلم البولندي ، يمكنك تخطي رموز المنطقة)",
-    promosmsSMSSender: "اسم مرسل الرسائل القصيرة",
-    promosmsAllowLongSMS: "السماح الرسائل القصيرة الطويلة",
-    "Feishu WebHookUrl": "Feishu Webhookurl",
-    matrixHomeserverURL: "عنوان URL HomeServer (مع HTTP (S)",
-    "Internal Room Id": "معرف الغرفة الداخلية",
-    matrixDesc1: "يمكنك العثور على معرف الغرفة الداخلي من خلال البحث في القسم المتقدم من إعدادات الغرفة في عميل Matrix الخاص بك. يجب أن تبدو مثل! QMDRCPUIFLWSFJXYE6",
-    matrixDesc2: "يوصى بشدة بإنشاء مستخدم جديد ولا تستخدم رمز الوصول إلى مستخدم Matrix الخاص بك لأنه سيتيح الوصول الكامل إلى حسابك وجميع الغرف التي انضمت إليها. بدلاً من ذلك ، قم بإنشاء مستخدم جديد ودعوته فقط إلى الغرفة التي تريد تلقيها الإشعار فيها. يمكنك الحصول على رمز الوصول عن طريق تشغيل {0}",
-    Method: "طريقة",
-    Body: "الجسم",
-    Headers: "الرؤوس",
-    PushUrl: "دفع عنوان URL",
-    HeadersInvalidFormat: "رؤوس الطلبات غير صالحة JSON",
-    BodyInvalidFormat: "هيئة الطلب غير صالحة JSON",
-    "Monitor History": "مراقبة التاريخ",
-    clearDataOlderThan: "الحفاظ على بيانات سجل المراقبة للأيام {0}.",
-    PasswordsDoNotMatch: "كلمة المرور غير مطابقة.",
-    records: "السجلات",
-    "One record": "سجل واحد",
-    steamApiKeyDescription: "لمراقبة خادم لعبة Steam ، تحتاج إلى مفتاح Steam Web-API. يمكنك تسجيل مفتاح API الخاص بك هنا",
-    "Current User": "المستخدم الحالي",
-    topic: "عنوان",
-    topicExplanation: "موضوع MQTT لرصد",
-    successMessage: "نجاح رسالة",
-    successMessageExplanation: "رسالة MQTT التي ستعتبر نجاحًا",
-    recent: "الأخيرة",
-    Done: "فعله",
-    Info: "معلومات",
-    Security: "حماية",
-    "Steam API Key": "مفتاح API Steam",
-    "Shrink Database": "تقلص قاعدة البيانات",
-    "Pick a RR-Type...": "اختر نوع RR ...",
-    "Pick Accepted Status Codes...": "اختيار رموز الحالة المقبولة ...",
-    Default: "تقصير",
-    "HTTP Options": "خيارات HTTP",
-    "Create Incident": "إنشاء حادث",
-    Title: "لقب",
-    Content: "المحتوى",
-    Style: "أسلوب",
-    info: "معلومات",
-    warning: "تحذير",
-    danger: "خطر",
-    error: "خطأ",
-    critical: "شديد الأهمية",
-    primary: "الأولية",
-    light: "نور",
-    dark: "ظلام",
-    Post: "بريد",
-    "Please input title and content": "الرجاء إدخال العنوان والمحتوى",
-    Created: "مخلوق",
-    "Last Updated": "التحديث الاخير",
-    Unpin: "إلغاء",
-    "Switch to Light Theme": "التبديل إلى موضوع الضوء",
-    "Switch to Dark Theme": "التبديل إلى موضوع الظلام",
-    "Show Tags": "أضهر العلامات",
-    "Hide Tags": "إخفاء العلامات",
-    Description: "وصف",
-    "No monitors available.": "لا شاشات المتاحة.",
-    "Add one": "أضف واحدا",
-    "No Monitors": "لا شاشات",
-    "Untitled Group": "مجموعة بلا عنوان",
-    Services: "خدمات",
-    Discard: "تجاهل",
-    Cancel: "يلغي",
-    "Powered by": "مشغل بواسطة",
-    shrinkDatabaseDescription: "تشغيل فراغ قاعدة البيانات لـ SQLite. إذا تم إنشاء قاعدة البيانات الخاصة بك بعد تمكين 1.10.0 AUTO_VACUUM بالفعل ولا يلزم هذا الإجراء.",
-    serwersms: "Serwersms.pl",
-    serwersmsAPIUser: "اسم مستخدم API (بما في ذلك بادئة WebAPI_)",
-    serwersmsAPIPassword: "كلمة مرور API",
-    serwersmsPhoneNumber: "رقم الهاتف",
-    serwersmsSenderName: "اسم مرسل الرسائل القصيرة (مسجل عبر بوابة العملاء)",
-    smseagle: "smseagle",
-    smseagleTo: "أرقام الهواتف)",
-    smseagleGroup: "اسم مجموعة كتب الهاتف (S)",
-    smseagleContact: "كتاب الاتصال اسم (S)",
-    smseagleRecipientType: "نوع المستلم",
-    smseagleRecipient: "المتلقي (المتلقيين) (يجب فصل المتعددة مع فاصلة)",
-    smseagleToken: "API وصول الرمز المميز",
-    smseagleUrl: "عنوان URL لجهاز SMSEGLE الخاص بك",
-    smseagleEncoding: "إرسال Unicode",
-    smseaglePriority: "أولوية الرسالة (0-9 افتراضي = 0)",
-    stackfield: "Stackfield",
-    Customize: "يعدل أو يكيف",
-    "Custom Footer": "تذييل مخصص",
-    "Custom CSS": "لغة تنسيق ويب حسب الطلب",
-    smtpDkimSettings: "إعدادات DKIM",
-    smtpDkimDesc: "يرجى الرجوع إلى Nodemailer dkim {0} للاستخدام.",
-    documentation: "توثيق",
-    smtpDkimDomain: "اسم النطاق",
-    smtpDkimKeySelector: "المحدد الرئيسي",
-    smtpDkimPrivateKey: "مفتاح سري",
-    smtpDkimHashAlgo: "خوارزمية التجزئة (اختياري)",
-    smtpDkimheaderFieldNames: "مفاتيح الرأس للتوقيع (اختياري)",
-    smtpDkimskipFields: "مفاتيح الرأس لا توقيع (اختياري)",
-    wayToGetPagerDutyKey: "يمكنك الحصول على هذا عن طريق الانتقال إلى الخدمة -> دليل الخدمة -> (حدد خدمة) -> تكامل -> إضافة التكامل. هنا يمكنك البحث عن \"Events API V2\". مزيد من المعلومات {0}",
-    "Integration Key": "مفتاح التكامل",
-    "Integration URL": "URL تكامل",
-    "Auto resolve or acknowledged": "حل السيارات أو الاعتراف به",
-    "do nothing": "لا تفعل شيئا",
-    "auto acknowledged": "اعترف السيارات",
-    "auto resolve": "عزم السيارات",
-    gorush: "جورش",
-    alerta: "أليتا",
-    alertaApiEndpoint: "نقطة نهاية API",
-    alertaEnvironment: "بيئة",
-    alertaApiKey: "مفتاح API",
-    alertaAlertState: "حالة التنبيه",
-    alertaRecoverState: "استعادة الدولة",
-    deleteStatusPageMsg: "هل أنت متأكد من حذف صفحة الحالة هذه؟",
-    Proxies: "وكلاء",
-    default: "تقصير",
-    enabled: "تمكين",
-    setAsDefault: "تعيين كافتراضي",
-    deleteProxyMsg: "هل أنت متأكد من حذف هذا الوكيل لجميع الشاشات؟",
-    proxyDescription: "يجب تعيين الوكلاء إلى شاشة للعمل.",
-    enableProxyDescription: "لن يؤثر هذا الوكيل على طلبات الشاشة حتى يتم تنشيطه. يمكنك التحكم مؤقتًا في تعطيل الوكيل من جميع الشاشات حسب حالة التنشيط.",
-    setAsDefaultProxyDescription: "سيتم تمكين هذا الوكيل افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الوكيل بشكل منفصل لكل شاشة.",
-    "Certificate Chain": "سلسلة الشهادة",
-    Valid: "صالح",
-    Invalid: "غير صالح",
-    AccessKeyId: "معرف AccessKey",
-    SecretAccessKey: "Accesskey Secret",
-    PhoneNumbers: "أرقام الهواتف",
-    TemplateCode: "TemplateCode",
-    SignName: "اسم تسجيل الدخول",
-    "Sms template must contain parameters: ": "يجب أن يحتوي قالب الرسائل القصيرة على معلمات:",
-    "Bark Endpoint": "نقطة نهاية اللحاء",
-    "Bark Group": "مجموعة اللحاء",
-    "Bark Sound": "صوت اللحاء",
-    WebHookUrl: "webhookurl",
-    SecretKey: "Secretkey",
-    "For safety, must use secret key": "للسلامة يجب استخدام المفتاح السري",
-    "Device Token": "رمز الجهاز",
-    Platform: "منصة",
-    iOS: "iOS",
-    Android: "ذكري المظهر",
-    Huawei: "هواوي",
-    High: "عالٍ",
-    Retry: "إعادة المحاولة",
-    Topic: "عنوان",
-    "WeCom Bot Key": "WECOM BOT KEY",
-    "Setup Proxy": "وكيل الإعداد",
-    "Proxy Protocol": "بروتوكول الوكيل",
-    "Proxy Server": "مخدم بروكسي",
-    "Proxy server has authentication": "خادم الوكيل لديه مصادقة",
-    User: "المستعمل",
-    Installed: "المثبتة",
-    "Not installed": "غير مثبت",
-    Running: "جري",
-    "Not running": "لا يعمل",
-    "Remove Token": "إزالة الرمز المميز",
-    Start: "بداية",
-    Stop: "قف",
-    "Uptime Kuma": "وقت التشغيل كوما",
-    "Add New Status Page": "أضف صفحة حالة جديدة",
-    Slug: "سبيكة",
-    "Accept characters": "قبول الشخصيات",
-    startOrEndWithOnly: "ابدأ أو ينتهي بـ {0} فقط",
-    "No consecutive dashes": "لا شرطات متتالية",
-    Next: "التالي",
-    "The slug is already taken. Please choose another slug.": "تم أخذ سبيكة بالفعل. الرجاء اختيار سبيكة أخرى.",
-    "No Proxy": "لا الوكيل",
-    Authentication: "المصادقة",
-    "HTTP Basic Auth": "HTTP الأساسي Auth",
-    "New Status Page": "صفحة حالة جديدة",
-    "Page Not Found": "الصفحة غير موجودة",
-    "Reverse Proxy": "وكيل عكسي",
-    Backup: "دعم",
-    About: "عن",
-    wayToGetCloudflaredURL: "(قم بتنزيل CloudFlared من {0})",
-    cloudflareWebsite: "موقع CloudFlare",
-    "Message:": ":رسالة",
-    "Don't know how to get the token? Please read the guide": "لا أعرف كيف تحصل على الرمز المميز؟ يرجى قراءة الدليل",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "قد يضيع الاتصال الحالي إذا كنت تتصل حاليًا عبر نفق CloudFlare. هل أنت متأكد تريد إيقافها؟ اكتب كلمة المرور الحالية لتأكيدها.",
-    "HTTP Headers": "رؤوس HTTP",
-    "Trust Proxy": "الوكيل الثقة",
-    "Other Software": "برامج أخرى",
-    "For example: nginx, Apache and Traefik.": "على سبيل المثال: nginx و Apache و Traefik.",
-    "Please read": "يرجى القراءة",
-    "Subject": "موضوع",
-    "Valid To": "صالحة ل",
-    "Days Remaining": "الأيام المتبقية",
-    "Issuer": "المصدر",
-    "Fingerprint": "بصمة",
-    "No status pages": "لا صفحات الحالة",
-    "Domain Name Expiry Notification": "اسم النطاق إشعار انتهاء الصلاحية",
-    Proxy: "الوكيل",
-    "Date Created": "تاريخ الإنشاء",
-    HomeAssistant: "مساعد المنزل",
-    onebotHttpAddress: "OneBot HTTP عنوان",
-    onebotMessageType: "نوع رسالة OneBot",
-    onebotGroupMessage: "مجموعة",
-    onebotPrivateMessage: "خاص",
-    onebotUserOrGroupId: "معرف المجموعة/المستخدم",
-    onebotSafetyTips: "للسلامة يجب ضبط الرمز المميز للوصول",
-    "PushDeer Key": "مفتاح PushDeer",
-    "Footer Text": "نص تذييل",
-    "Show Powered By": "عرض مدعوم من قبل",
-    "Domain Names": "أسماء المجال",
-    signedInDisp: "وقعت في {0}",
-    signedInDispDisabled: "معاق المصادقة.",
-    RadiusSecret: "سر نصف القطر",
-    RadiusSecretDescription: "السر المشترك بين العميل والخادم",
-    RadiusCalledStationId: "يسمى معرف المحطة",
-    RadiusCalledStationIdDescription: "معرف الجهاز المتصل",
-    RadiusCallingStationId: "معرف محطة الاتصال",
-    RadiusCallingStationIdDescription: "معرف جهاز الاتصال",
-    "Certificate Expiry Notification": "إشعار انتهاء الصلاحية",
-    "API Username": "اسم المستخدم API",
-    "API Key": "مفتاح API",
-    "Recipient Number": "رقم المستلم",
-    "From Name/Number": "من الاسم/الرقم",
-    "Leave blank to use a shared sender number.": "اترك فارغًا لاستخدام رقم المرسل المشترك.",
-    "Octopush API Version": "إصدار Octopush API",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "نقطة النهاية",
-    octopushAPIKey: "\"API key\" from HTTP API بيانات اعتماد في لوحة التحكم",
-    octopushLogin: "\"Login\" من بيانات اعتماد API HTTP في لوحة التحكم",
-    promosmsLogin: "اسم تسجيل الدخول API",
-    promosmsPassword: "كلمة مرور API",
-    "pushoversounds pushover": "سداد (افتراضي)",
-    "pushoversounds bike": "دراجة هوائية",
-    "pushoversounds bugle": "بوق",
-    "pushoversounds cashregister": "ماكينة تسجيل المدفوعات النقدية",
-    "pushoversounds classical": "كلاسيكي",
-    "pushoversounds cosmic": "كونية",
-    "pushoversounds falling": "هبوط",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "واردة",
-    "pushoversounds intermission": "استراحة",
-    "pushoversounds magic": "سحر",
-    "pushoversounds mechanical": "ميكانيكي",
-    "pushoversounds pianobar": "شريط البيانو",
-    "pushoversounds siren": "صفارة إنذار",
-    "pushoversounds spacealarm": "إنذار الفضاء",
-    "pushoversounds tugboat": "قارب السحب",
-    "pushoversounds alien": "إنذار أجنبي (طويل)",
-    "pushoversounds climb": "تسلق (طويل)",
-    "pushoversounds persistent": "مستمر (طويل)",
-    "pushoversounds echo": "صدى مهووس (طويل)",
-    "pushoversounds updown": "صعودا (طويلة)",
-    "pushoversounds vibrate": "يهتز فقط",
-    "pushoversounds none": "لا شيء (صامت)",
-    pushyAPIKey: "مفتاح API السري",
-    pushyToken: "رمز الجهاز",
-    "Show update if available": "عرض التحديث إذا كان ذلك متاحًا",
-    "Also check beta release": "تحقق أيضًا من الإصدار التجريبي",
-    "Using a Reverse Proxy?": "باستخدام وكيل عكسي؟",
-    "Check how to config it for WebSocket": "تحقق من كيفية تكوينه لـ WebSocket",
-    "Steam Game Server": "خادم لعبة البخار",
-    "Most likely causes": "الأسباب المرجحة",
-    "The resource is no longer available.": "لم يعد المورد متاحًا.",
-    "There might be a typing error in the address.": "قد يكون هناك خطأ مطبعي في العنوان.",
-    "What you can try": "ماذا تستطيع أن تجرب",
-    "Retype the address.": "اعد كتابة العنوان.",
-    "Go back to the previous page.": "عد للصفحة السابقة.",
-    "Coming Soon": "قريبا",
-    wayToGetClickSendSMSToken: "يمكنك الحصول على اسم مستخدم API ومفتاح API من {0}.",
-    "Connection String": "سلسلة الاتصال",
-    Query: "استفسار",
-    settingsCertificateExpiry: "شهادة TLS انتهاء الصلاحية",
-    certificationExpiryDescription: "شاشات HTTPS تضيء عندما تنتهي شهادة TLS في",
-    "Setup Docker Host": "إعداد مضيف Docker",
-    "Connection Type": "نوع الاتصال",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "هل أنت متأكد من حذف مضيف Docker لجميع الشاشات؟",
-    socket: "قابس كهرباء",
-    tcp: "TCP / HTTP",
-    "Docker Container": "حاوية Docker",
-    "Container Name / ID": "اسم الحاوية / معرف",
-    "Docker Host": "مضيف Docker",
-    "Docker Hosts": "مضيفي Docker",
-    "ntfy Topic": "موضوع ntfy",
-    Domain: "اِختِصاص",
-    Workstation: "محطة العمل",
-    disableCloudflaredNoAuthMsg: "أنت في وضع مصادقة لا توجد كلمة مرور غير مطلوبة.",
-    trustProxyDescription: "الثقة 'x-forward-*'. إذا كنت ترغب في الحصول على IP العميل الصحيح وكوما في الوقت المناسب مثل Nginx أو Apache ، فيجب عليك تمكين ذلك.",
-    wayToGetLineNotifyToken: "يمكنك الحصول على رمز الوصول من {0}",
-    Examples: "أمثلة",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "الرمز المميز للوصول منذ فترة طويلة",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "يمكن إنشاء رمز الوصول منذ فترة طويلة عن طريق النقر على اسم ملف التعريف الخاص بك (أسفل اليسار) والتمرير إلى الأسفل ثم انقر فوق إنشاء الرمز المميز.",
-    "Notification Service": "خدمة الإخطار",
-    "default: notify all devices": "الافتراضي: إخطار جميع الأجهزة",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "يمكن العثور على قائمة بخدمات الإخطار في المساعد المنزلي ضمن \"Developer Tools > Services\" ابحث عن \"notification\" للعثور على اسم جهازك/هاتفك.",
-    "Automations can optionally be triggered in Home Assistant": "يمكن أن يتم تشغيل الأتمتة اختياريًا في مساعد المنزل",
-    "Trigger type": "نوع الزناد",
-    "Event type": "نوع الحدث",
-    "Event data": "بيانات الحدث",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "ثم اختر إجراءً على سبيل المثال قم بتبديل المشهد إلى حيث يكون ضوء RGB أحمر.",
-    "Frontend Version": "إصدار الواجهة الأمامية",
-    "Frontend Version do not match backend version!": "إصدار Frontend لا يتطابق مع الإصدار الخلفي!",
-    "Base URL": "عنوان URL الأساسي",
-    goAlertInfo: "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}",
-    goAlertIntegrationKeyInfo: "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
-    goAlert: "المرمى",
-    backupOutdatedWarning: "إهمال",
-    backupRecommend: "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.",
-    Optional: "اختياري",
-    squadcast: "القاء فريقي",
-    SendKey: "Sendkey",
-    "SMSManager API Docs": "مستندات SMSManager API",
-    "Gateway Type": "نوع البوابة",
-    SMSManager: "smsmanager",
-    "You can divide numbers with": "يمكنك تقسيم الأرقام مع",
-    or: "أو",
-    recurringInterval: "فترة",
-    Recurring: "يتكرر",
-    strategyManual: "نشط/غير نشط يدويًا",
-    warningTimezone: "إنه يستخدم المنطقة الزمنية للخادم",
-    weekdayShortMon: "الاثنين",
-    weekdayShortTue: "الثلاثاء",
-    weekdayShortWed: "تزوج",
-    weekdayShortThu: "الخميس",
-    weekdayShortFri: "الجمعة",
-    weekdayShortSat: "جلس",
-    weekdayShortSun: "شمس",
-    dayOfWeek: "يوم من الأسبوع",
-    dayOfMonth: "يوم من الشهر",
-    lastDay: "بالأمس",
-    lastDay1: "آخر يوم من الشهر",
-    lastDay2: "الثاني في اليوم الأخير من الشهر",
-    lastDay3: "الثالث في اليوم الأخير من الشهر",
-    lastDay4: "الرابع في اليوم الأخير من الشهر",
-    "No Maintenance": "لا صيانة",
-    pauseMaintenanceMsg: "هل أنت متأكد من أن تتوقف مؤقتًا؟",
-    "maintenanceStatus-under-maintenance": "تحت الصيانة",
-    "maintenanceStatus-inactive": "غير نشط",
-    "maintenanceStatus-scheduled": "المقرر",
-    "maintenanceStatus-ended": "انتهى",
-    "maintenanceStatus-unknown": "مجهول",
-    "Display Timezone": "عرض المنطقة الزمنية",
-    "Server Timezone": "المنطقة الزمنية الخادم",
-    statusPageMaintenanceEndDate: "نهاية",
-    IconUrl: "url url icon",
-    "Enable DNS Cache": "تمكين ذاكرة التخزين المؤقت DNS",
-    Enable: "يُمكَِن",
-    Disable: "إبطال",
-    dnsCacheDescription: "قد لا يعمل في بعض بيئات IPv6 تعطيله إذا واجهت أي مشكلات.",
-    "Single Maintenance Window": "نافذة صيانة واحدة",
-    "Maintenance Time Window of a Day": "نافذة وقت الصيانة لليوم",
-    "Effective Date Range": "نطاق التاريخ السريع",
-    "Schedule Maintenance": "جدولة الصيانة",
-    "Date and Time": "التاريخ و الوقت",
-    "DateTime Range": "نطاق DateTime",
-    Strategy: "إستراتيجية",
-    "Free Mobile User Identifier": "معرف مستخدم الهاتف المحمول المجاني",
-    "Free Mobile API Key": "مفتاح واجهة برمجة تطبيقات مجانية للهاتف المحمول",
-    "Enable TLS": "تمكين TLS",
-    "Proto Service Name": "اسم خدمة البروتو",
-    "Proto Method": "طريقة البروتو",
-    "Proto Content": "محتوى proto",
-    Economy: "اقتصاد",
-    Lowcost: "تكلفة منخفضة",
-    high: "عالي",
-    "General Monitor Type": "نوع الشاشة العامة",
-    "Passive Monitor Type": "نوع الشاشة السلبي",
-    "Specific Monitor Type": "نوع شاشة محدد",
-    dataRetentionTimeError: "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
-    infiniteRetention: "ضبط على 0 للاحتفاظ لا نهائي.",
-    confirmDeleteTagMsg: "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة.",
-};
diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js
deleted file mode 100644
index d8a789f3..00000000
--- a/src/languages/bg-BG.js
+++ /dev/null
@@ -1,678 +0,0 @@
-export default {
-    languageName: "Български",
-    checkEverySecond: "Ще се извършва на всеки {0} секунди",
-    retryCheckEverySecond: "Ще се извършва на всеки {0} секунди",
-    retriesDescription: "Максимален брой опити преди маркиране на услугата като недостъпна и изпращане на известие",
-    ignoreTLSError: "Игнорирай TLS/SSL грешки за HTTPS уеб сайтове",
-    upsideDownModeDescription: "Обръща статуса от достъпен на недостъпен. Ако услугата е достъпна, ще се вижда като НЕДОСТЪПНА.",
-    maxRedirectDescription: "Максимален брой пренасочвания, които да бъдат следвани. Въведете 0 за да изключите пренасочване.",
-    acceptedStatusCodesDescription: "Изберете статус кодове, които да се считат за успешен отговор.",
-    passwordNotMatchMsg: "Повторената парола не съвпада.",
-    notificationDescription: "Моля, задайте известието към монитор(и), за да функционира.",
-    keywordDescription: "Търси ключова дума в чист html или JSON отговор - чувствителна е към регистъра",
-    pauseDashboardHome: "Пауза",
-    deleteMonitorMsg: "Наистина ли желаете да изтриете този монитор?",
-    deleteNotificationMsg: "Наистина ли желаете да изтриете това известие за всички монитори?",
-    resolverserverDescription: "Cloudflare е сървърът по подразбиране, но можете да го промените по всяко време.",
-    rrtypeDescription: "Изберете ресурсния запис, който желаете да наблюдавате",
-    pauseMonitorMsg: "Наистина ли желаете да поставите в режим пауза?",
-    enableDefaultNotificationDescription: "За всеки нов монитор това известие ще бъде активирано по подразбиране. Можете да го изключите за всеки отделен монитор.",
-    clearEventsMsg: "Наистина ли желаете да изтриете всички събития за този монитор?",
-    clearHeartbeatsMsg: "Наистина ли желаете да изтриете всички записи за честотни проверки на този монитор?",
-    confirmClearStatisticsMsg: "Наистина ли желаете да изтриете всички статистически данни?",
-    importHandleDescription: "Изберете 'Пропусни съществуващите', ако желаете да пропуснете всеки монитор или известие със същото име. 'Презапис' ще изтрие всеки съществуващ монитор и известие.",
-    confirmImportMsg: "Сигурни ли сте, че желаете импортирането на архива? Моля, уверете се, че сте избрали правилната опция за импортиране.",
-    twoFAVerifyLabel: "Моля, въведете вашия токен код, за да проверите дали 2FA работи",
-    tokenValidSettingsMsg: "Токен кодът е валиден! Вече можете да запазите настройките за 2FA.",
-    confirmEnableTwoFAMsg: "Сигурни ли сте, че желаете да активирате 2FA?",
-    confirmDisableTwoFAMsg: "Сигурни ли сте, че желаете да изключите 2FA?",
-    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.": "Вал. сертификат",
-    day: "ден | дни",
-    "-day": "-дни",
-    hour: "час",
-    "-hour": "-часa",
-    Response: "Отговор",
-    Ping: "Пинг",
-    "Monitor Type": "Монитор тип",
-    Keyword: "Ключова дума",
-    "Friendly Name": "Псевдоним",
-    URL: "URL Адрес",
-    Hostname: "Име на хост",
-    Port: "Порт",
-    "Heartbeat Interval": "Честота на проверка",
-    Retries: "Повторни опити",
-    "Heartbeat Retry Interval": "Честота на повторните опити",
-    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": "Активирай удостоверяване",
-    "disableauth.message1": "Сигурни ли сте, че желаете да <strong>изключите удостоверяването</strong>?",
-    "disableauth.message2": "Използва се в случаите, когато <strong>има настроен алтернативен метод за удостоверяване</strong> преди Uptime Kuma, например Cloudflare Access, Authelia или друг механизъм за удостоверяване.",
-    "Please use this option carefully!": "Моля, използвайте с повишено внимание.",
-    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": "Повторете паролата",
-    "Import Backup": "Импорт на архив",
-    "Export Backup": "Експорт на архив",
-    Export: "Експорт",
-    Import: "Импорт",
-    respTime: "Време за отговор (ms)",
-    notAvailableShort: "Няма",
-    "Default enabled": "Активирано по подразбиране",
-    "Apply on all existing monitors": "Приложи върху всички съществуващи монитори",
-    Create: "Създай",
-    "Clear Data": "Изтрий данни",
-    Events: "Събития",
-    Heartbeats: "Проверки",
-    "Auto Get": "Авт. попълване",
-    backupDescription: "Можете да архивирате всички монитори и всички известия в JSON файл.",
-    backupDescription2: "PS: Имайте предвид, че данните за история и събития няма да бъдат включени.",
-    backupDescription3: "Чувствителни данни, като токен кодове за известия, се съдържат в експортирания файл. Моля, бъдете внимателни с неговото съхранение.",
-    alertNoFile: "Моля, изберете файл за импортиране.",
-    alertWrongFileType: "Моля, изберете JSON файл.",
-    "Clear all statistics": "Изтрий цялата статистика",
-    "Skip existing": "Пропусни съществуващите",
-    Overwrite: "Презапиши",
-    Options: "Опции",
-    "Keep both": "Запази двете",
-    "Verify Token": "Провери токен код",
-    "Setup 2FA": "Настройка 2FA",
-    "Enable 2FA": "Активирай 2FA",
-    "Disable 2FA": "Деактивирай 2FA",
-    "2FA Settings": "Настройка за 2FA",
-    "Two Factor Authentication": "Двуфакторно удостоверяване",
-    Active: "Активно",
-    Inactive: "Неактивно",
-    Token: "Токен код",
-    "Show URI": "Покажи URI",
-    Tags: "Етикети",
-    "Add New below or Select...": "Добавете нов по-долу или изберете...",
-    "Tag with this name already exist.": "Етикет с това име вече съществува.",
-    "Tag with this value already exist.": "Етикет с тази стойност вече съществува.",
-    color: "цвят",
-    "value (optional)": "стойност (по желание)",
-    Gray: "Сиво",
-    Red: "Червено",
-    Orange: "Оранжево",
-    Green: "Зелено",
-    Blue: "Синьо",
-    Indigo: "Индиго",
-    Purple: "Лилаво",
-    Pink: "Розово",
-    "Search...": "Търси...",
-    "Avg. Ping": "Ср. пинг",
-    "Avg. Response": "Ср. отговор",
-    "Entry Page": "Основна страница",
-    statusPageNothing: "Все още няма нищо тук. Моля, добавете група или монитор.",
-    "No Services": "Няма Услуги",
-    "All Systems Operational": "Всички услуги са достъпни",
-    "Partially Degraded Service": "Част от услугите са недостъпни",
-    "Degraded Service": "Всички услуги са недостъпни",
-    "Add Group": "Добави група",
-    "Add a monitor": "Добави монитор",
-    "Edit Status Page": "Редактиране Статус страница",
-    "Go to Dashboard": "Към Таблото",
-    telegram: "Telegram",
-    webhook: "Уеб кука",
-    smtp: "Имейл (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Поддържа 50+ услуги за известяване)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Status Page": "Статус страница",
-    "Status Pages": "Статус страници",
-    "Primary Base URL": "Основен базов URL адрес",
-    "Push URL": "Генериран Push URL адрес",
-    needPushEvery: "Необходимо е да извършвате заявка към този URL адрес на всеки {0} секунди",
-    pushOptionalParams: "Допълнителни, но не задължителни параметри: {0}",
-    defaultNotificationName: "Моето {notification} известие ({number})",
-    here: "тук",
-    Required: "Задължително поле",
-    "Bot Token": "Бот токен",
-    wayToGetTelegramToken: "Можете да получите токен от {0}.",
-    "Chat ID": "Чат ID",
-    supportTelegramChatID: "Поддържа Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "Можете да получите вашето чат ID, като изпратите съобщение на бота, след което е нужно да посетите този URL адрес за да го видите:",
-    "YOUR BOT TOKEN HERE": "ВАШИЯТ БОТ ТОКЕН ТУК",
-    chatIDNotFound: "Чат ID не е намерено. Моля, първо изпратете съобщение до този бот",
-    "Post URL": "Post URL адрес",
-    "Content Type": "Тип съдържание",
-    webhookJsonDesc: "{0} е подходящ за всички съвременни http сървъри, като например express.js",
-    webhookFormDataDesc: "{multipart} е подходящ за PHP, нужно е да анализирате json чрез {decodeFunction}",
-    secureOptionNone: "Няма (25) / STARTTLS (587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Игнорирай TLS грешките",
-    "From Email": "От имейл адрес",
-    emailCustomSubject: "Модифициране на тема",
-    "To Email": "Получател имейл адрес",
-    smtpCC: "Явно копие до имейл адрес:",
-    smtpBCC: "Скрито копие до имейл адрес:",
-    "Discord Webhook URL": "Discord URL адрес на уеб кука",
-    wayToGetDiscordURL: "Може да създадете, от меню \"Настройки на сървъра\" -> \"Интеграции\" -> \"Уеб куки\" -> \"Нова уеб кука\"",
-    "Bot Display Name": "Име на бота, което да се показва",
-    "Prefix Custom Message": "Модифицирано обръщение",
-    "Hello @everyone is...": "Здравейте, {'@'}everyone е...",
-    "Webhook URL": "Уеб кука URL адрес",
-    wayToGetTeamsURL: "Можете да научите как се създава URL адрес за уеб кука {0}.",
-    Number: "Номер",
-    Recipients: "Получатели",
-    needSignalAPI: "Необходимо е да разполагате със Signal клиент с REST API.",
-    wayToCheckSignalURL: "Може да посетите този URL адрес, ако се нуждаете от помощ при настройването:",
-    signalImportant: "ВАЖНО: Не може да смесвате \"Групи\" и \"Номера\" в поле \"Получатели\"!",
-    "Application Token": "Токен код за приложението",
-    "Server URL": "URL адрес на сървъра",
-    Priority: "Приоритет",
-    "Icon Emoji": "Иконка Емотикон",
-    "Channel Name": "Канал име",
-    "Uptime Kuma URL": "Uptime Kuma URL адрес",
-    aboutWebhooks: "Повече информация относно уеб куки на: {0}",
-    aboutChannelName: "Въведете името на канала в поле {0} \"Канал име\", ако желаете да заобиколите канала от уеб куката. Например: #other-channel",
-    aboutKumaURL: "Ако оставите празно полето \"Uptime Kuma URL адрес\", по подразбиране ще се използва GitHub страницата на проекта.",
-    emojiCheatSheet: "Подсказки за емотикони: {0}",
-    "User Key": "Потребителски ключ",
-    Device: "Устройство",
-    "Message Title": "Заглавие на съобщението",
-    "Notification Sound": "Звуков сигнал",
-    "More info on:": "Повече информация на: {0}",
-    pushoverDesc1: "Приоритет Спешно (2) по подразбиране изчаква 30 секунди между повторните опити и изтича след 1 час.",
-    pushoverDesc2: "Ако желаете да изпратите известия до различни устройства, попълнете полето Устройство.",
-    "SMS Type": "SMS тип",
-    octopushTypePremium: "Премиум (Бърз - препоръчителен в случай на тревога)",
-    octopushTypeLowCost: "Евтин (Бавен - понякога бива блокиран от оператора)",
-    checkPrice: "Тарифни планове на {0}:",
-    octopushLegacyHint: "Дали използвате съвместима версия на Octopush (2011-2020) или нова версия?",
-    "Check octopush prices": "Тарифни планове на octopush {0}.",
-    octopushPhoneNumber: "Телефонен номер (в международен формат, например: +33612345678) ",
-    octopushSMSSender: "SMS подател Име: 3-11 знака - букви, цифри и интервал (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea ID на устройство",
-    "Apprise URL": "Apprise URL адрес",
-    "Example:": "Пример: {0}",
-    "Read more:": "Научете повече: {0}",
-    "Status:": "Статус: {0}",
-    "Read more": "Научете повече",
-    appriseInstalled: "Apprise е инсталиран.",
-    appriseNotInstalled: "Apprise не е инсталиран. {0}",
-    "Access Token": "Токен код за достъп",
-    "Channel access token": "Канал токен код",
-    "Line Developers Console": "Line - Конзола за разработчици",
-    lineDevConsoleTo: "Line - Конзола за разработчици - {0}",
-    "Basic Settings": "Основни настройки",
-    "User ID": "Потребител ID",
-    "Messaging API": "API за съобщаване",
-    wayToGetLineChannelToken: "Необходимо е първо да посетите {0}, за да създадете (Messaging API) за доставчик и канал, след което може да вземете токен кода за канал и потребителско ID от споменатите по-горе елементи на менюто.",
-    "Icon URL": "URL адрес за иконка",
-    aboutIconURL: "Може да предоставите линк към картинка в поле \"URL Адрес за иконка\" за да отмените картинката на профила по подразбиране. Няма да се използва, ако вече сте настроили емотикон.",
-    aboutMattermostChannelName: "Може да замените канала по подразбиране, към който публикува уеб куката, като въведете името на канала в полето \"Канал име\". Трябва да бъде активирано в настройките за уеб кука на Mattermost. Например: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - евтин, но бавен. Често е претоварен. Само за получатели от Полша.",
-    promosmsTypeFlash: "SMS FLASH - Съобщението автоматично се показва на устройството на получателя. Само за получатели от Полша.",
-    promosmsTypeFull: "SMS FULL - Високо ниво на SMS услуга. Може да използвате Вашето име като подател (Необходимо е първо да регистрирате името). Надежден метод за съобщения тип тревога.",
-    promosmsTypeSpeed: "SMS SPEED - Най-висок приоритет в системата. Много бърза и надеждна, но същевременно скъпа услуга. (Около два пъти по-висока цена в сравнение с SMS FULL).",
-    promosmsPhoneNumber: "Телефонен номер (за получатели от Полша, може да пропуснете въвеждането на код за населено място)",
-    promosmsSMSSender: "SMS Подател име: Предварително регистрирано име или някое от имената по подразбиране: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu URL адрес за уеб кука",
-    matrixHomeserverURL: "Сървър URL адрес (започва с http(s):// и порт по желание)",
-    "Internal Room Id": "ID на вътрешна стая",
-    matrixDesc1: "Може да намерите \"ID на вътрешна стая\" в разширените настройки на стаята във вашия Matrix клиент. Примерен изглед: !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Силно препоръчваме да създадете НОВ потребител и да НЕ използвате токен кодът на вашия личен Matrix потребител, т.к. той позволява пълен достъп до вашия акаунт и всички стаи към които сте се присъединили. Вместо това създайте нов потребител и го поканете само в стаята, където желаете да получавате известията. Токен код за достъп ще получите изпълнявайки {0}",
-    Method: "Метод",
-    Body: "Съобщение",
-    Headers: "Хедъри",
-    PushUrl: "Push URL адрес",
-    HeadersInvalidFormat: "Заявените хедъри не са валидни JSON: ",
-    BodyInvalidFormat: "Заявеното съобщение не е валиден JSON: ",
-    "Monitor History": "История на мониторите",
-    clearDataOlderThan: "Ще се съхранява за {0} дни.",
-    records: "записа",
-    "One record": "Един запис",
-    steamApiKeyDescription: "За да мониторирате Steam Gameserver се нуждаете от Steam Web-API ключ. Може да регистрирате Вашия API ключ тук: ",
-    clicksendsms: "ClickSend SMS",
-    apiCredentials: "API удостоверяване",
-    PasswordsDoNotMatch: "Паролите не съвпадат.",
-    "Current User": "Текущ потребител",
-    recent: "Скорошни",
-    shrinkDatabaseDescription: "Инициира \"VACUUM\" за \"SQLite\" база данни. Ако Вашата база данни е създадена след версия 1.10.0, \"AUTO_VACUUM\" функцията е активна и това действие не е нужно.",
-    Done: "Готово",
-    Info: "Информация",
-    Security: "Сигурност",
-    "Steam API Key": "Steam API ключ",
-    "Shrink Database": "Редуцирай базата данни",
-    "Pick a RR-Type...": "Изберете вида на ресурсния запис за мониториране...",
-    "Pick Accepted Status Codes...": "Изберете статус кодове, които да се считат за успешен отговор...",
-    Default: "По подразбиране",
-    "HTTP Options": "HTTP Опции",
-    "Create Incident": "Създаване на инцидент",
-    Title: "Заглавие",
-    Content: "Съдържание",
-    Style: "Стил",
-    info: "информация",
-    warning: "предупреждение",
-    danger: "опасност",
-    primary: "основен",
-    light: "светъл",
-    dark: "тъмен",
-    Post: "Публикувай",
-    "Please input title and content": "Моля, въведете заглавие и съдържание",
-    Created: "Създаден",
-    "Last Updated": "Последно обновен",
-    Unpin: "Откачи",
-    "Switch to Light Theme": "Превключи към светла тема",
-    "Switch to Dark Theme": "Превключи към тъмна тема",
-    "Show Tags": "Покажи етикети",
-    "Hide Tags": "Скрий етикети",
-    Description: "Описание",
-    "No monitors available.": "Няма налични монитори.",
-    "Add one": "Добави един",
-    "No Monitors": "Няма монитори",
-    "Untitled Group": "Група без заглавие",
-    Services: "Услуги",
-    Discard: "Отмени",
-    Cancel: "Отмени",
-    "Powered by": "Създадено чрез",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Потребителско име (вкл. webapi_ prefix)",
-    serwersmsAPIPassword: "API Парола",
-    serwersmsPhoneNumber: "Телефон номер",
-    serwersmsSenderName: "SMS Подател име (регистриран през клиентския портал)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM Настройки",
-    smtpDkimDesc: "Моля, вижте {0} на Nodemailer DKIM за инструкции.",
-    documentation: "документацията",
-    smtpDkimDomain: "Домейн",
-    smtpDkimKeySelector: "Селектор на ключ",
-    smtpDkimPrivateKey: "Частен ключ",
-    smtpDkimHashAlgo: "Хеш алгоритъм (по желание)",
-    smtpDkimheaderFieldNames: "Хедър ключове за подписване (по желание)",
-    smtpDkimskipFields: "Хедър ключове, които да не се подписват (по желание)",
-    PushByTechulus: "Push от Techulus",
-    GoogleChat: "Google Chat (Само за работното пространство на Google)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Крайна точка на API",
-    alertaEnvironment: "Среда",
-    alertaApiKey: "API Ключ",
-    alertaAlertState: "Състояние на тревога",
-    alertaRecoverState: "Състояние на възстановяване",
-    deleteStatusPageMsg: "Сигурни ли сте, че желаете да изтриете тази статус страница?",
-    Proxies: "Прокси",
-    default: "По подразбиране",
-    enabled: "Активирано",
-    setAsDefault: "Зададен по подразбиране",
-    deleteProxyMsg: "Сигурни ли сте, че желаете да изтриете това прокси за всички монитори?",
-    proxyDescription: "За да функционират трябва да бъдат зададени към монитор.",
-    enableProxyDescription: "Това прокси няма да има ефект върху заявките за мониторинг, докато не бъде активирано. Може да контролирате временното деактивиране на проксито от всички монитори чрез статуса на активиране.",
-    setAsDefaultProxyDescription: "Това прокси ще бъде активно по подразбиране за новите монитори. Може да го изключите по отделно за всеки един монитор.",
-    "Certificate Chain": "Верига на сертификата",
-    Valid: "Валиден",
-    Invalid: "Невалиден",
-    AccessKeyId: "ID на ключ за достъп",
-    SecretAccessKey: "Тайна на ключа за достъп",
-    PhoneNumbers: "Телефонни номера",
-    TemplateCode: "Шаблон Код",
-    SignName: "Знак име",
-    "Sms template must contain parameters: ": "SMS шаблонът трябва да съдържа следните параметри: ",
-    "Bark Endpoint": "Bark крайна точка",
-    WebHookUrl: "URL адрес на уеб кука",
-    SecretKey: "Таен ключ",
-    "For safety, must use secret key": "За сигурност, трябва да се използва таен ключ",
-    "Device Token": "Токен за устройство",
-    Platform: "Платформа",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Висок",
-    Retry: "Повтори",
-    Topic: "Тема",
-    "WeCom Bot Key": "WeCom бот ключ",
-    "Setup Proxy": "Настрой прокси",
-    "Proxy Protocol": "Прокси протокол",
-    "Proxy Server": "Прокси сървър",
-    "Proxy server has authentication": "Прокси сървърът е с удостоверяване",
-    User: "Потребител",
-    Installed: "Инсталиран",
-    "Not installed": "Не е инсталиран",
-    Running: "Работи",
-    "Not running": "Не работи",
-    "Remove Token": "Премахни токен",
-    Start: "Стартирай",
-    Stop: "Спри",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Добави нова статус страница",
-    Slug: "Слъг",
-    "Accept characters:": "Приеми символи:",
-    startOrEndWithOnly: "Започва или завършва само с {0}",
-    "No consecutive dashes": "Без последователни тирета",
-    Next: "Следващ",
-    "The slug is already taken. Please choose another slug.": "Този слъг вече се използва. Моля изберете друг.",
-    "No Proxy": "Без прокси",
-    Authentication: "Удостоверяване",
-    "HTTP Basic Auth": "HTTP основно удостоверяване",
-    "New Status Page": "Нова статус страница",
-    "Page Not Found": "Страницата не е открита",
-    "Reverse Proxy": "Ревърс прокси",
-    Backup: "Архивиране",
-    About: "Относно",
-    wayToGetCloudflaredURL: "(Свалете \"cloudflared\" от {0})",
-    cloudflareWebsite: "Cloudflare уеб сайт",
-    "Message:": "Съобщение:",
-    "Don't know how to get the token? Please read the guide:": "Не знаете как да вземете токен? Моля, прочетете ръководството:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Текущата връзка може да прекъсне ако в момента сте свързани чрез \"Cloudflare Tunnel\". Сигурни ли сте, че желаете да го спрете? Въведете Вашата текуща парола за да потвърдите.",
-    "Other Software": "Друг софтуер",
-    "For example: nginx, Apache and Traefik.": "Например: Nginx, Apache и Traefik.",
-    "Please read": "Моля, прочетете",
-    "Subject:": "Тема:",
-    "Valid To:": "Валиден до:",
-    "Days Remaining:": "Оставащи дни:",
-    "Issuer:": "Издател:",
-    "Fingerprint:": "Пръстов отпечатък:",
-    "No status pages": "Няма статус страници",
-    topic: "Тема",
-    topicExplanation: "MQTT тема за мониториране",
-    successMessage: "Съобщение при успех",
-    successMessageExplanation: "MQTT съобщение, което ще бъде считано за успех",
-    Customize: "Персонализирай",
-    "Custom Footer": "Персонализиран долен колонтитул",
-    "Custom CSS": "Потребителски CSS",
-    "Domain Name Expiry Notification": "Известие при изтичащ домейн",
-    Proxy: "Прокси",
-    "Date Created": "Дата на създаване",
-    onebotHttpAddress: "OneBot HTTP адрес",
-    onebotMessageType: "OneBot тип съобщение",
-    onebotGroupMessage: "Група",
-    onebotPrivateMessage: "Лично",
-    onebotUserOrGroupId: "Група/Потребител ID",
-    onebotSafetyTips: "С цел безопасност трябва да зададете токен код за достъп",
-    "PushDeer Key": "PushDeer ключ",
-    "Footer Text": "Текст долен колонтитул",
-    "Show Powered By": "Покажи \"Създадено чрез\"",
-    "Domain Names": "Домейни",
-    signedInDisp: "Вписан като {0}",
-    signedInDispDisabled: "Удостоверяването е изключено.",
-    "Certificate Expiry Notification": "Известие за изтичане валидността на сертификата",
-    "API Username": "API Потребител",
-    "API Key": "API Ключ",
-    "Recipient Number": "Номер на получателя",
-    "From Name/Number": "От Име/Номер",
-    "Leave blank to use a shared sender number.": "Оставете празно, за да използвате споделен номер на подател.",
-    "Octopush API Version": "Octopush API версия",
-    "Legacy Octopush-DM": "Octopush-DM старa версия",
-    endpoint: "крайна точка",
-    octopushAPIKey: "\"API ключ\" от HTTP API удостоверяване в контролния панел",
-    octopushLogin: "\"Вписване\" от HTTP API удостоверяване в контролния панел",
-    promosmsLogin: "API Потребителско име",
-    promosmsPassword: "API Парола",
-    "pushoversounds pushover": "Pushover (по подразбиране)",
-    "pushoversounds bike": "Велосипед",
-    "pushoversounds bugle": "Тромпет",
-    "pushoversounds cashregister": "Касов апарат",
-    "pushoversounds classical": "Класическа музика",
-    "pushoversounds cosmic": "Космически",
-    "pushoversounds falling": "Падащ",
-    "pushoversounds gamelan": "Игра в мрежа",
-    "pushoversounds incoming": "Входящ",
-    "pushoversounds intermission": "Прекъсване",
-    "pushoversounds magic": "Магия",
-    "pushoversounds mechanical": "Механичен",
-    "pushoversounds pianobar": "Пиано бар",
-    "pushoversounds siren": "Сирена",
-    "pushoversounds spacealarm": "Космическа аларма",
-    "pushoversounds tugboat": "Буксир",
-    "pushoversounds alien": "Извънземна аларма (дълъг)",
-    "pushoversounds climb": "Изкачване (дълъг)",
-    "pushoversounds persistent": "Постоянен (дълъг)",
-    "pushoversounds echo": "Pushover ехо (дълъг)",
-    "pushoversounds updown": "Горе долу (дълъг)",
-    "pushoversounds vibrate": "Само вибрация",
-    "pushoversounds none": "Без (тих)",
-    pushyAPIKey: "Таен API ключ",
-    pushyToken: "Токен на устройство",
-    "Show update if available": "Покажи актуализация, ако е налична",
-    "Also check beta release": "Проверявай и за бета версии",
-    "Using a Reverse Proxy?": "Използвате ревърс прокси?",
-    "Check how to config it for WebSocket": "Проверете как да го конфигурирате за WebSocket",
-    "Steam Game Server": "Steam Game сървър",
-    "Most likely causes:": "Най-вероятни причини:",
-    "The resource is no longer available.": "Ресурсът вече не е наличен.",
-    "There might be a typing error in the address.": "Възможно е да е допусната грешка при изписването на адреса.",
-    "What you can try:": "Може да опитате:",
-    "Retype the address.": "Повторно въвеждане на адреса.",
-    "Go back to the previous page.": "Да се върнете към предишната страница.",
-    "Coming Soon": "Очаквайте скоро",
-    wayToGetClickSendSMSToken: "Може да получите API потребителско име и API ключ от {0} .",
-    dnsPortDescription: "DNS порт на сървъра. По подразбиране е 53, но може да бъде променен по всяко време.",
-    error: "грешка",
-    critical: "критично",
-    wayToGetPagerDutyKey: "Може да го получите като посетите Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тук трябва да потърсите \"Events API V2\". Повече информация {0}",
-    "Integration Key": "Ключ за интегриране",
-    "Integration URL": "URL адрес за интеграция",
-    "Auto resolve or acknowledged": "Автоматично разрешаване или потвърждаване",
-    "do nothing": "не прави нищо",
-    "auto acknowledged": "автоматично потвърждаване",
-    "auto resolve": "автоматично разрешаване",
-    "Connection String": "Стринг за връзка",
-    Query: "Заявка",
-    settingsCertificateExpiry: "Изтичане валидността на TLS сертификата",
-    certificationExpiryDescription: "HTTPS мониторите ще задействат известие, ако е наличен изтичащ TLS сертификат, през следващите:",
-    "ntfy Topic": "ntfy Тема",
-    Domain: "Домейн",
-    Workstation: "Работна станция",
-    disableCloudflaredNoAuthMsg: "Тъй като сте в режим \"No Auth mode\", парола не се изисква.",
-    wayToGetLineNotifyToken: "Може да получите токен код за достъп от {0}",
-    resendEveryXTimes: "Изпращай повторно на всеки {0} пъти",
-    resendDisabled: "Повторното изпращане е изключено",
-    "Resend Notification if Down X times consequently": "Повторно изпращане на известие, ако е недостъпен X пъти последователно",
-    "Bark Group": "Bark група",
-    "Bark Sound": "Bark звук",
-    "HTTP Headers": "HTTP хедъри",
-    "Trust Proxy": "Trust Proxy",
-    HomeAssistant: "Home Assistant",
-    RadiusSecret: "Radius таен код",
-    RadiusSecretDescription: "Споделен таен код между клиент и сървър",
-    RadiusCalledStationId: "Повиквана станция ID",
-    RadiusCalledStationIdDescription: "Идентификатор на повикваното устройство",
-    RadiusCallingStationId: "Повикваща станция ID",
-    RadiusCallingStationIdDescription: "Идентификатор на повикващото устройство",
-    "Setup Docker Host": "Настройка на Docker хост",
-    "Connection Type": "Тип свързване",
-    "Docker Daemon": "Docker демон",
-    deleteDockerHostMsg: "Сигурни ли сте, че желаете да изтриете този Docker хост за всички монитори?",
-    socket: "Сокет",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker контейнер",
-    "Container Name / ID": "Име на контейнер / ID",
-    "Docker Host": "Docker хост",
-    "Docker Hosts": "Docker хостове",
-    trustProxyDescription: "Trust 'X-Forwarded-*' headers.  Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
-    Examples: "Примери",
-    "Home Assistant URL": "Home Assistant URL адрес",
-    "Long-Lived Access Token": "Long-Lived Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token можете да създадете, като кликнете върху името на профила си (долу ляво) и превъртите до най-долу, след това кликнете върху Създаване на токен. ",
-    "Notification Service": "Услуга за известяване",
-    "default: notify all devices": "по подразбиране: извести всички устройства",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Списък с услугите за известяване може да бъде намерен в Home Assistant под \"Developer Tools > Services\", там потърсете \"notification\", за да намерите името на вашето устройство/телефон.",
-    "Automations can optionally be triggered in Home Assistant:": "Автоматизациите могат да се задействат при нужда в Home Assistant:",
-    "Trigger type:": "Задействане тип:",
-    "Event type:": "Събитие тип:",
-    "Event data:": "Събитие данни:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "След което изберете действие, например да превключите сцената, където RGB светлината е червена.",
-    "Frontend Version": "Фронтенд версия",
-    "Frontend Version do not match backend version!": "Фронтенд версията не съвпада с Бекенд версията!",
-    "Base URL": "Базов  URL адрес",
-    goAlertInfo: "GoAlert е приложение с отворен код за планиране на повиквания, автоматизирани ескалации и известия (като SMS или гласови повиквания). Автоматично ангажирайте точния човек, по точния начин и в точното време! {0}",
-    goAlertIntegrationKeyInfo: "Вземете общ API интеграционен ключ за услугата във формат \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обикновено стойността на параметъра token на копирания URL адрес.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Отпаднало: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
-    backupRecommend: "Моля, архивирайте дяла или папката (./data/) директно вместо това.",
-    Maintenance: "Поддръжка",
-    statusMaintenance: "Поддръжка",
-    "Schedule maintenance": "Планиране на поддръжка",
-    "Affected Monitors": "Засегнати монитори",
-    "Pick Affected Monitors...": "Изберете засегнати монитори...",
-    "Start of maintenance": "Стартирай поддръжка",
-    "All Status Pages": "Всички статус страници",
-    "Select status pages...": "Изберете статус страници...",
-    recurringIntervalMessage: "Изпълнявай ежедневно | Изпълнявай всеки {0} дни",
-    affectedMonitorsDescription: "Изберете монитори, засегнати от текущата поддръжка",
-    affectedStatusPages: "Покажи това съобщение за поддръжка на избрани статус страници",
-    atLeastOneMonitor: "Изберете поне един засегнат монитор",
-    deleteMaintenanceMsg: "Сигурни ли сте, че желаете да изтриете тази поддръжка?",
-    Optional: "По желание",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Документация ",
-    "Gateway Type": "Тип на шлюза",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Може да разделяте числата с",
-    or: "или",
-    recurringInterval: "Интервал",
-    Recurring: "Повтаряне",
-    strategyManual: "Активен/Неактивен ръчно",
-    warningTimezone: "Използва се часовата зона на сървъра",
-    weekdayShortMon: "Пон",
-    weekdayShortTue: "Вт",
-    weekdayShortWed: "Ср",
-    weekdayShortThu: "Чет",
-    weekdayShortFri: "Пет",
-    weekdayShortSat: "Съб",
-    weekdayShortSun: "Нед",
-    dayOfWeek: "Ден",
-    dayOfMonth: "Дата",
-    lastDay: "Последен ден",
-    lastDay1: "Последен ден от месеца",
-    lastDay2: "2-ри последен ден на месеца",
-    lastDay3: "3-ти последен ден на месеца",
-    lastDay4: "4-ти последен ден на месеца",
-    "No Maintenance": "Няма поддръжка",
-    pauseMaintenanceMsg: "Сигурни ли сте, че желаете да направите пауза?",
-    "maintenanceStatus-under-maintenance": "В режим поддръжка",
-    "maintenanceStatus-inactive": "Неактивна",
-    "maintenanceStatus-scheduled": "Планирана",
-    "maintenanceStatus-ended": "Приключена",
-    "maintenanceStatus-unknown": "Неизвестна",
-    "Display Timezone": "Покажи часова зона",
-    "Server Timezone": "Часова зона на сървъра",
-    statusPageMaintenanceEndDate: "Край",
-    enableGRPCTls: "Разреши изпращане на gRPC заявка с TLS връзка",
-    grpcMethodDescription: "Името на метода се форматира в \"cammelCase\", например sayHello, check, и т.н.",
-    smseagle: "SMSEagle",
-    smseagleTo: "Тел. номер(а)",
-    smseagleGroup: "Име на група/и от тел. указател",
-    smseagleContact: "Име(на) от тел. указател",
-    smseagleRecipientType: "Получател тип",
-    smseagleRecipient: "Получател(и) (при повече от един разделете със запетая)",
-    smseagleToken: "API токен за достъп",
-    smseagleUrl: "Вашият SMSEagle URL на устройството",
-    smseagleEncoding: "Изпрати като Unicode",
-    smseaglePriority: "Приоритет на съобщението (0-9, по подразбиране = 0)",
-    IconUrl: "Икона URL адрес",
-    webhookAdditionalHeadersTitle: "Допълнителни хедъри",
-    webhookAdditionalHeadersDesc: "Задава допълнителни хедъри, изпратени с уеб куката.",
-    "Enable DNS Cache": "Активирай DNS кеширане",
-    Enable: "Активирай",
-    Disable: "Деактивирай",
-    dnsCacheDescription: "Възможно е да не работи в IPv6 среда - деактивирайте, ако срещнете проблеми.",
-    "Single Maintenance Window": "Единичен времеви интервал за поддръжка",
-    "Maintenance Time Window of a Day": "Времеви интервал от деня за поддръжка",
-    "Effective Date Range": "Интервал от дни на влизане в сила",
-    "Schedule Maintenance": "Планирай поддръжка",
-    "Date and Time": "Дата и час",
-    "DateTime Range": "Изтрий времеви интервал",
-    Strategy: "Стратегия",
-    "Free Mobile User Identifier": "Free Mobile потребителски идентификатор",
-    "Free Mobile API Key": "Free Mobile API ключ",
-    "Enable TLS": "Активирай TLS",
-    "Proto Service Name": "Proto име на услугата",
-    "Proto Method": "Proto метод",
-    "Proto Content": "Proto съдържание",
-    Economy: "Икономичен",
-    Lowcost: "Евтин",
-    high: "висок",
-    "General Monitor Type": "Общ тип монитор",
-    "Passive Monitor Type": "Пасивет тип монитор",
-    "Specific Monitor Type": "Специфичен тип монитор",
-    ZohoCliq: "ZohoCliq",
-    wayToGetZohoCliqURL: "Можете да научите как се създава URL адрес за уеб кука {0}.",
-    Kook: "Kook",
-    wayToGetKookBotToken: "Създайте приложение и вземете вашия бот токен на {0}",
-    wayToGetKookGuildID: "Превключете в 'Developer Mode' в 'Kook' настройките, след което десен клик върху 'guild' за да вземете неговото 'ID'",
-    "Guild ID": "Guild ID",
-};
diff --git a/src/languages/cs-CZ.js b/src/languages/cs-CZ.js
deleted file mode 100644
index 04fb24c8..00000000
--- a/src/languages/cs-CZ.js
+++ /dev/null
@@ -1,684 +0,0 @@
-export default {
-    languageName: "Czech",
-    checkEverySecond: "Kontrolovat každých {0} sekund",
-    retryCheckEverySecond: "Opakovat každých {0} sekund",
-    resendEveryXTimes: "Znovu zaslat {0}krát",
-    resendDisabled: "Opakované zasílání je vypnuté",
-    retriesDescription: "Maximální počet pokusů před označením služby jako nedostupné a odesláním oznámení",
-    ignoreTLSError: "Ignorovat TLS/SSL chyby na HTTPS stránkách",
-    upsideDownModeDescription: "Pomocí této možnosti změníte způsob vyhodnocování stavu. Pokud je služba dosažitelná, je NEDOSTUPNÁ.",
-    maxRedirectDescription: "Maximální počet přesměrování, která se mají následovat. Nastavením hodnoty 0 zakážete přesměrování.",
-    enableGRPCTls: "Umožnit odeslání gRPC žádosti během TLS spojení",
-    grpcMethodDescription: "Název metody se převede do cammelCase formátu jako je sayHello, check, aj.",
-    acceptedStatusCodesDescription: "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
-    Maintenance: "Údržba",
-    statusMaintenance: "Údržba",
-    "Schedule maintenance": "Naplánovat údržbu",
-    "Affected Monitors": "Dotčené dohledy",
-    "Pick Affected Monitors...": "Vyberte dotčené dohledy…",
-    "Start of maintenance": "Zahájit údržbu",
-    "All Status Pages": "Všechny stavové stránky",
-    "Select status pages...": "Vyberte stavovou stránku…",
-    recurringIntervalMessage: "Spustit jednou každý den | Spustit jednou každých {0} dní",
-    affectedMonitorsDescription: "Vyberte dohledy, které budou ovlivněny touto údržbou",
-    affectedStatusPages: "Zobrazit tuto zprávu o údržbě na vybraných stavových stránkách",
-    atLeastOneMonitor: "Vyberte alespoň jeden dotčený dohled",
-    passwordNotMatchMsg: "Hesla se neshodují",
-    notificationDescription: "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.",
-    keywordDescription: "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
-    pauseDashboardHome: "Pozastaveno",
-    deleteMonitorMsg: "Opravdu chcete odstranit tento dohled?",
-    deleteMaintenanceMsg: "Opravdu chcete odstranit tuto údržbu?",
-    deleteNotificationMsg: "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
-    dnsPortDescription: "Port DNS serveru. Standardně běží na portu 53. V případě potřeby jej můžete kdykoli změnit.",
-    resolverserverDescription: "Cloudflare je výchozí server. V případě potřeby můžete Resolver server kdykoli změnit.",
-    rrtypeDescription: "Vyberte typ záznamu o prostředku, který chcete monitorovat",
-    pauseMonitorMsg: "Opravdu chcete dohled pozastavit?",
-    enableDefaultNotificationDescription: "Toto oznámení bude standardně aktivní pro nové dohledy. V případě potřeby můžete oznámení stále zakázat na úrovni jednotlivých dohledů.",
-    clearEventsMsg: "Opravdu chcete odstranit všechny události pro tento dohled?",
-    clearHeartbeatsMsg: "Opravdu chcete odstranit všechny heartbeaty pro tento dohled?",
-    confirmClearStatisticsMsg: "Opravdu chcete smazat VŠECHNY statistiky?",
-    importHandleDescription: "Možnost 'Přeskočit existující' vyberte v případě, že chcete přeskočit všechny dohledy nebo oznámení se stejným názvem. Vybráním možnosti 'Přepsat' dojde k odstranění všech existujících dohledů a oznámení.",
-    confirmImportMsg: "Opravdu chcete importovat zálohu? Prosím ověřte, zda jste vybrali správnou možnost importu.",
-    twoFAVerifyLabel: "Prosím, zadejte svůj token pro ověření 2FA:",
-    tokenValidSettingsMsg: "Token je platný! Nyní můžete uložit nastavení 2FA.",
-    confirmEnableTwoFAMsg: "Opravdu chcete zapnout 2FA?",
-    confirmDisableTwoFAMsg: "Opravdu chcete deaktivovat 2FA?",
-    Settings: "Nastavení",
-    Dashboard: "Nástěnka",
-    "New Update": "Nová aktualizace",
-    Language: "Jazyk",
-    Appearance: "Vzhled",
-    Theme: "Motiv",
-    General: "Obecné",
-    "Primary Base URL": "Primární URL adresa",
-    Version: "Verze",
-    "Check Update On GitHub": "Zkontrolovat aktualizace na GitHubu",
-    List: "Seznam",
-    Add: "Přidat",
-    "Add New Monitor": "Přidat nový dohled",
-    "Quick Stats": "Rychlé statistiky",
-    Up: "Běží",
-    Down: "Nedostupný",
-    Pending: "Čekám",
-    Unknown: "Neznámý",
-    Pause: "Pozastavit",
-    Name: "Název",
-    Status: "Stav",
-    DateTime: "Časové razítko",
-    Message: "Zpráva",
-    "No important events": "Žádné důležité události",
-    Resume: "Pokračovat",
-    Edit: "Změnit",
-    Delete: "Vymazat",
-    Current: "Aktuální",
-    Uptime: "Doba provozu",
-    "Cert Exp.": "Platnost certifikátu",
-    Monitor: "Dohled | Dohledy",
-    day: "den | dny/í",
-    "-day": "-dní",
-    hour: "hodina",
-    "-hour": "-hodin",
-    Response: "Odpověď",
-    Ping: "Ping",
-    "Monitor Type": "Typ dohledu",
-    Keyword: "Klíčové slovo",
-    "Friendly Name": "Obecný název",
-    URL: "URL",
-    Hostname: "Adresa serveru",
-    Port: "Port",
-    "Heartbeat Interval": "Heartbeat interval",
-    Retries: "Počet pokusů",
-    "Heartbeat Retry Interval": "Interval opakování heartbeatu",
-    "Resend Notification if Down X times consequently": "Znovu zaslat oznámení, pokud je služba nedostupná Xkrát za sebou",
-    Advanced: "Rozšířené",
-    "Upside Down Mode": "Inverzní režim",
-    "Max. Redirects": "Max. přesměrování",
-    "Accepted Status Codes": "Akceptované stavové kódy",
-    "Push URL": "Push URL",
-    needPushEvery: "Tuto URL adresu byste měli volat každých {0} sekund.",
-    pushOptionalParams: "Volitelné parametry: {0}",
-    Save: "Uložit",
-    Notifications: "Oznámení",
-    "Not available, please setup.": "Není k dispozici, prosím nastavte.",
-    "Setup Notification": "Nastavení oznámení",
-    Light: "Světlý",
-    Dark: "Tmavý",
-    Auto: "Automaticky",
-    "Theme - Heartbeat Bar": "Motiv – Heartbeat panel",
-    Normal: "Normální",
-    Bottom: "Dole",
-    None: "Žádné",
-    Timezone: "Časové pásmo",
-    "Search Engine Visibility": "Viditelnost pro vyhledávače",
-    "Allow indexing": "Povolit indexování",
-    "Discourage search engines from indexing site": "Zabránit vyhledávačům v indexování stránky",
-    "Change Password": "Změnit heslo",
-    "Current Password": "Aktuální heslo",
-    "New Password": "Nové heslo",
-    "Repeat New Password": "Znovu zadat nové heslo",
-    "Update Password": "Aktualizovat heslo",
-    "Disable Auth": "Deaktivovat ověřování",
-    "Enable Auth": "Povolit ověřování",
-    "disableauth.message1": "Opravdu chcete <strong>deaktivovat autentifikaci</strong>?",
-    "disableauth.message2": "Tato možnost je určena pro případy, kdy <strong>máte autentifikaci zajištěnou třetí stranou</strong> ještě před přístupem do Uptime Kuma, například prostřednictvím Cloudflare Access.",
-    "Please use this option carefully!": "Používejte ji prosím s rozmyslem.",
-    Logout: "Odhlásit",
-    Leave: "Odejít",
-    "I understand, please disable": "Rozumím, chci ji deaktivovat",
-    Confirm: "Potvrzení",
-    Yes: "Ano",
-    No: "Ne",
-    Username: "Uživatelské jméno",
-    Password: "Heslo",
-    "Remember me": "Zapamatovat si mě",
-    Login: "Přihlášení",
-    "No Monitors, please": "Žádné dohledy, prosím",
-    "add one": "přidat jeden",
-    "Notification Type": "Typ oznámení",
-    Email: "E-mail",
-    Test: "Test",
-    "Certificate Info": "Informace o certifikátu",
-    "Resolver Server": "Resolver Server",
-    "Resource Record Type": "Typ záznamu o prostředku",
-    "Last Result": "Poslední výsledek",
-    "Create your admin account": "Vytvořit účet administrátora",
-    "Repeat Password": "Znovu zadat heslo",
-    "Import Backup": "Importovat zálohu",
-    "Export Backup": "Exportovat zálohu",
-    Export: "Exportovat",
-    Import: "Importovat",
-    respTime: "Doba odezvy (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Standardně povoleno",
-    "Apply on all existing monitors": "Použít pro všechny existující dohledy",
-    Create: "Vytvořit",
-    "Clear Data": "Vymazat data",
-    Events: "Události",
-    Heartbeats: "Heartbeaty",
-    "Auto Get": "Získat automaticky",
-    backupDescription: "Všechny dohledy a oznámení můžete zálohovat do souboru ve formátu JSON.",
-    backupDescription2: "Poznámka: Nezahrnuje historii a data událostí.",
-    backupDescription3: "Součástí exportovaného souboru jsou citlivá data jako tokeny oznámení; export si prosím bezpečně uložte.",
-    alertNoFile: "Vyberte soubor, který chcete importovat.",
-    alertWrongFileType: "Vyberte soubor ve formátu JSON.",
-    "Clear all statistics": "Vymazat všechny statistiky",
-    "Skip existing": "Přeskočit existující",
-    Overwrite: "Přepsat",
-    Options: "Možnosti",
-    "Keep both": "Ponechat obojí",
-    "Verify Token": "Ověřit token",
-    "Setup 2FA": "Nastavení 2FA",
-    "Enable 2FA": "Povolit 2FA",
-    "Disable 2FA": "Deaktivovat 2FA",
-    "2FA Settings": "Nastavení 2FA",
-    "Two Factor Authentication": "Dvoufaktorová autentifikace",
-    Active: "Zapnuto",
-    Inactive: "Neaktivní",
-    Token: "Token",
-    "Show URI": "Zobrazit URI",
-    Tags: "Štítky",
-    "Add New below or Select...": "Níže přidejte nový nebo vyberte existující…",
-    "Tag with this name already exist.": "Štítek s tímto názvem již existuje.",
-    "Tag with this value already exist.": "Štítek touto hodnotou již existuje.",
-    color: "barva",
-    "value (optional)": "hodnota (volitelné)",
-    Gray: "Šedá",
-    Red: "Červená",
-    Orange: "Oranžová",
-    Green: "Zelená",
-    Blue: "Modrá",
-    Indigo: "Indigo",
-    Purple: "Purpurová",
-    Pink: "Růžová",
-    Custom: "Vlastní",
-    "Search...": "Hledat…",
-    "Avg. Ping": "Průměr Ping",
-    "Avg. Response": "Průměr Odpověď",
-    "Entry Page": "Vstupní stránka",
-    statusPageNothing: "Nic tady není, přidejte prosím skupinu nebo dohled.",
-    "No Services": "Žádné služby",
-    "All Systems Operational": "Všechny systémy běží",
-    "Partially Degraded Service": "Částečně zhoršená služba",
-    "Degraded Service": "Zhoršená služba",
-    "Add Group": "Přidat skupinu",
-    "Add a monitor": "Přidání dohledu",
-    "Edit Status Page": "Upravit stavovou stránku",
-    "Go to Dashboard": "Přejít na nástěnku",
-    "Status Page": "Stavová stránka",
-    "Status Pages": "Stavová stránka",
-    defaultNotificationName: "Moje {notification} upozornění ({číslo})",
-    here: "sem",
-    Required: "Vyžadováno",
-    telegram: "Telegram",
-    "ZohoCliq": "ZohoCliq",
-    "Bot Token": "Token robota",
-    wayToGetTelegramToken: "Token můžete získat od {0}.",
-    "Chat ID": "ID chatu",
-    supportTelegramChatID: "Podpora přímého chatu / skupiny / ID chatu kanálu",
-    wayToGetTelegramChatID: "ID chatu můžete získat tak, že robotovi zašlete zprávu a přejdete na tuto adresu URL, kde zobrazíte chat_id:",
-    "YOUR BOT TOKEN HERE": "SEM ZADEJTE TOKEN VAŠEHO CHATBOTA",
-    chatIDNotFound: "ID chatu nebylo nalezeno; nejprve tomuto robotovi zašlete zprávu",
-    webhook: "Webhook",
-    "Post URL": "URL adresa příspěvku",
-    "Content Type": "Typ obsahu",
-    webhookJsonDesc: "{0} je vhodný pro všechny moderní servery HTTP, jako je Express.js",
-    webhookFormDataDesc: "{multipart} je vhodné pro PHP. JSON bude nutné analyzovat prostřednictvím {decodeFunction}",
-    webhookAdditionalHeadersTitle: "Dodatečné hlavičky",
-    webhookAdditionalHeadersDesc: "Nastavte dodatečné hlavičky, které se odešlou společně s webhookem.",
-    smtp: "E-mail (SMTP)",
-    secureOptionNone: "Žádné / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignorovat chybu TLS",
-    "From Email": "Odesílatel",
-    emailCustomSubject: "Vlastní předmět",
-    "To Email": "Příjemce",
-    smtpCC: "Kopie",
-    smtpBCC: "Skrytá kopie",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Získáte tak, že přejdete do Nastavení serveru - > Integrace - > Vytvořit Webhook",
-    "Bot Display Name": "Zobrazované jméno robota",
-    "Prefix Custom Message": "Předpona vlastní zprávy",
-    "Hello @everyone is...": "Dobrý den, {'@'}všichni jsou…",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL adresa webhooku",
-    wayToGetTeamsURL: "Informace o tom, jak vytvořit URL adresu webhooku naleznete na {0}.",
-    wayToGetZohoCliqURL: "Informace o tom, jak vytvořit URL adresu webhooku naleznete na {0}.",
-    signal: "Signal",
-    Number: "Číslo",
-    Recipients: "Příjemci",
-    needSignalAPI: "Musíte mít Signal klienta s REST API.",
-    wayToCheckSignalURL: "Pro zobrazení instrukcí, jak službu nastavit, přejděte na následující adresu:",
-    signalImportant: "Důležité V seznamu příjemců není možné současně použít skupiny a čísla!",
-    gotify: "Gotify",
-    "Application Token": "Token aplikace",
-    "Server URL": "URL adresa serveru",
-    Priority: "Priorita",
-    slack: "Slack",
-    "Icon Emoji": "Ikona smajlíka",
-    "Channel Name": "Název kanálu",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Více informací o Webhoocích naleznete na adrese: {0}",
-    aboutChannelName: "Pro vynechání Webhook kanálu zadejte jeho název do pole Název kanálu {0}. Příklad: #jiny-kanal",
-    aboutKumaURL: "Pokud ponecháte pole URL adresa Uptime Kuma prázdné, použije se domovská stránka GitHub projektu.",
-    emojiCheatSheet: "Tahák smajlíků: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (podpora více než 50 oznamovacích služeb)",
-    GoogleChat: "Google Chat (pouze Google Workspace)",
-    pushbullet: "Pushbullet",
-    Kook: "Kook",
-    wayToGetKookBotToken: "Aplikaci vytvoříte a token bota získáte na {0}",
-    wayToGetKookGuildID: "V nastavení Kook aktivujte 'Vývojářský režim' a kliknutím pravým tlačítkem na guild získejte jeho ID",
-    "Guild ID": "Guild ID",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Klíč uživatele",
-    Device: "Zařízení",
-    "Message Title": "Nadpis zprávy",
-    "Notification Sound": "Zvuk oznámení",
-    "More info on:": "Více informací naleznete na adrese: {0}",
-    pushoverDesc1: "Výchozí časový limit pro emergency prioritu (2) je 30 sekund mezi opakovanými pokusy a vyprší po 1 hodině.",
-    pushoverDesc2: "Pokud chcete odesílat oznámení do různých zařízení, vyplňte pole Zařízení.",
-    "SMS Type": "Typ SMS",
-    octopushTypePremium: "Premium (rychlé – doporučeno pro upozornění)",
-    octopushTypeLowCost: "Nízké náklady (pomalé – někdy blokované operátorem)",
-    checkPrice: "Ceny {0} zjistíte na adrese:",
-    apiCredentials: "API přihlašovací údaje",
-    octopushLegacyHint: "Používáte starší verzi Octopush (2011-2020) nebo novou verzi?",
-    "Check octopush prices": "Ceny octopush naleznete na adrese {0}.",
-    octopushPhoneNumber: "Telefonní číslo (v mezinárodním formátu, např: +42012345678) ",
-    octopushSMSSender: "Odesílatel SMS: 3-11 alfanumerických znaků a mezera (a-zA-Z0-9)",
-    "LunaSea Device ID": "ID zařízení LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Příklad: {0}",
-    "Read more:": "Více informací: {0}",
-    "Status:": "Stav: {0}",
-    "Read more": "Více informací",
-    appriseInstalled: "Apprise je nainstalován.",
-    appriseNotInstalled: "Apprise není nainstalován. {0}",
-    "Access Token": "Přístupový token",
-    "Channel access token": "Přístupový token ke kanálu",
-    "Line Developers Console": "Konzole Line Developers",
-    lineDevConsoleTo: "Konzole Line Developers - {0}",
-    "Basic Settings": "Obecné nastavení",
-    "User ID": "ID uživatele",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Nejprve otevřete {0}, vytvořte poskytovatele a kanál (Messaging API). Poté můžete získat přístupový token ke kanálu a ID uživatele, v sekci uvedené výše.",
-    "Icon URL": "URL adresa ikony",
-    aboutIconURL: "Pro přepsání výchozího profilového obrázku můžete do pole \"URL adresa ikony\" zadat odkaz na obrázek. Nebude použito, pokud je nastavena ikona smajlíka.",
-    aboutMattermostChannelName: "Výchozí kanál, do kterého jsou zasílány Webhook příspěvky, můžete přepsat zadáním názvu kanálu do pole \"Název kanálu\". Tato možnost musí být povolena v nastavení Mattermost Webhooku. Příklad: #jiny-kanal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO – levné, ale pomalé a často přetížené. Omezeno pouze na polské příjemce.",
-    promosmsTypeFlash: "SMS FLASH –zpráva se automaticky zobrazí na zařízení příjemce. Omezeno pouze na polské příjemce.",
-    promosmsTypeFull: "SMS FULL – prémiová úroveň SMS. Můžete definovat odesílatele (vyžadována registrace jména). Spolehlivý pro výstrahy.",
-    promosmsTypeSpeed: "SMS SPEED – nejvyšší priorita v systému. Velmi rychlé a spolehlivé, ale nákladné (přibližně dvojnásobek ceny SMS FULL).",
-    promosmsPhoneNumber: "Telefonní číslo (polští příjemci mohou vynechat telefonní předvolbu)",
-    promosmsSMSSender: "Odesílatel SMS: Předem zaregistrovaný název nebo jeden z výchozích: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    promosmsAllowLongSMS: "Povolit dlouhé SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "URL adresa domácího serveru (s http(s):// a volitelně portem)",
-    "Internal Room Id": "ID interní místnosti",
-    matrixDesc1: "ID interní místnosti naleznete v Matrix klientovi v rozšířeném nastavení místnosti. Mělo by být ve tvaru !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Důrazně doporučujeme vytvořit nového uživatele a nepoužívat váš vlastní přístupový token uživatele Matrix. Pomocí něj je možné získat přístup k vašemu účtu a všem místnostem, ke kterým jste se připojili. Místo toho vytvořte nového uživatele a pozvěte jej pouze do místnosti, do které chcete oznámení dostávat. Přístupový token můžete získat spuštěním {0}",
-    Method: "Metoda",
-    Body: "Tělo",
-    Headers: "Hlavičky",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Hlaviča žádosti není platný JSON: ",
-    BodyInvalidFormat: "Text žádosti není platný JSON: ",
-    "Monitor History": "Historie dohledu",
-    clearDataOlderThan: "Historie dohledu bude uchovávána po dobu {0} dní.",
-    PasswordsDoNotMatch: "Hesla se neshodují.",
-    records: "záznamů",
-    "One record": "Jeden záznam",
-    steamApiKeyDescription: "Pro monitorování Steam Game Serveru je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
-    "Current User": "Aktuálně přihlášený uživatel",
-    topic: "Topic",
-    topicExplanation: "MQTT topic, který chcete sledovat",
-    successMessage: "Zpráva o úspěchu",
-    successMessageExplanation: "MQTT zpráva považovaná za úspěšnou",
-    recent: "Poslední",
-    Done: "Hotovo",
-    Info: "Informace",
-    Security: "Bezpečnost",
-    "Steam API Key": "API klíč služby Steam",
-    "Shrink Database": "Zmenšit databázi",
-    "Pick a RR-Type...": "Vyberte typ záznamu o prostředku…",
-    "Pick Accepted Status Codes...": "Vyberte stavové kódy, které chcete akceptovat…",
-    Default: "Výchozí",
-    "HTTP Options": "Možnosti protokolu HTTP",
-    "Create Incident": "Vytvořit incident",
-    Title: "Předmět",
-    Content: "Obsah",
-    Style: "Styl",
-    info: "informace",
-    warning: "upozornění",
-    danger: "riziko",
-    error: "chyba",
-    critical: "kritické",
-    primary: "primární",
-    light: "světlý",
-    dark: "tmavý",
-    Post: "Publikovat",
-    "Please input title and content": "Zadejte prosím název a obsah",
-    Created: "Vytvořen",
-    "Last Updated": "Poslední aktualizace",
-    Unpin: "Odepnout",
-    "Switch to Light Theme": "Přepnout na světlý motiv",
-    "Switch to Dark Theme": "Přepnout na tmavý motiv",
-    "Show Tags": "Zobrazit štítky",
-    "Hide Tags": "Skrýt štítky",
-    Description: "Popis",
-    "No monitors available.": "Není dostupný žádný dohled.",
-    "Add one": "Přidat jeden",
-    "No Monitors": "Žádný dohled",
-    "Untitled Group": "Skupina bez názvu",
-    Services: "Služby",
-    Discard: "Zahodit",
-    Cancel: "Zrušit",
-    "Powered by": "Poskytuje",
-    shrinkDatabaseDescription: "Pomocí této možnosti provedete příkaz VACUUM nad SQLite databází. Pokud byla databáze vytvořena po vydání verze 1.10.0, AUTO_VACUUM je již povolena a tato akce není vyžadována.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API uživatelské jméno (včetně předpony webapi_)",
-    serwersmsAPIPassword: "API heslo",
-    serwersmsPhoneNumber: "Telefonní číslo",
-    serwersmsSenderName: "Odesílatel SMS (registrováno prostřednictvím zákaznického portálu)",
-    smseagle: "SMSEagle",
-    smseagleTo: "Telefonní číslo(a)",
-    smseagleGroup: "Název skupiny v adresáři",
-    smseagleContact: "Název kontaktu v adresáři",
-    smseagleRecipientType: "Typ příjemce",
-    smseagleRecipient: "Příjemce(i) (více záznamů oddělte čárkou)",
-    smseagleToken: "API přístupový token",
-    smseagleUrl: "URL vašeho SMSEagle zařízení",
-    smseagleEncoding: "Odeslat v Unicode",
-    smseaglePriority: "Priorita zprávy (0-9, výchozí = 0)",
-    "stackfield": "Stackfield",
-    Customize: "Přizpůsobit",
-    "Custom Footer": "Vlastní patička",
-    "Custom CSS": "Vlastní CSS",
-    smtpDkimSettings: "Nastavení DKIM",
-    smtpDkimDesc: "Informace o použití naleznete v {0} Nodemailer DKIM.",
-    documentation: "dokumentaci",
-    smtpDkimDomain: "Název domény",
-    smtpDkimKeySelector: "Selektor klíče",
-    smtpDkimPrivateKey: "Privátní klíč",
-    smtpDkimHashAlgo: "Hashovací algoritmus (volitelné)",
-    smtpDkimheaderFieldNames: "Podepisovat tyto hlavičky (volitelné)",
-    smtpDkimskipFields: "Nepodepisovat tyto hlavičky (volitelné)",
-    wayToGetPagerDutyKey: "Získat jej můžete v sekci Service -> Service Directory -> (vyberte službu) -> Integrations -> Add integration. Následně vyhledejte \"Events API V2\". Více informace naleznete na adrese {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
-    "do nothing": "do nothing",
-    "auto acknowledged": "auto acknowledged",
-    "auto resolve": "auto resolve",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Prostředí",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Stav upozornění",
-    alertaRecoverState: "Stav obnovení",
-    deleteStatusPageMsg: "Opravdu chcete odstranit tuto stavovou stránku?",
-    Proxies: "Proxy",
-    default: "Výchozí",
-    enabled: "Zapnuto",
-    setAsDefault: "Nastavit jako výchozí",
-    deleteProxyMsg: "Opravdu chcete odstranit tuto proxy ze všech dohledů?",
-    proxyDescription: "Pro zajištění funkčnosti musí být proxy přiřazena dohledům.",
-    enableProxyDescription: "Tato proxy neovlivní žádosti dohledu do doby, než ji aktivujete. Změnou tohoto nastavení dočasně zakážete použití proxy ve všech dohledech.",
-    setAsDefaultProxyDescription: "Tato proxy se použije pro všechny nové dohledy. V případě potřeby můžete její využívání zakázat v konkrétním dohledu.",
-    "Certificate Chain": "Řetězec certifikátu",
-    Valid: "Platný",
-    Invalid: "Neplatný",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Z důvodu bezpečnosti použijte secret key",
-    "Device Token": "Token zařízení",
-    Platform: "Platforma",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Vysoký",
-    Retry: "Opakovat",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Nastavit proxy",
-    "Proxy Protocol": "Protokol proxy",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Proxy server vyžaduje ověření",
-    User: "Uživatel",
-    Installed: "Nainstalováno",
-    "Not installed": "Nenainstalováno",
-    Running: "Běží",
-    "Not running": "Neběží",
-    "Remove Token": "Odstranit token",
-    Start: "Spustit",
-    Stop: "Zastavit",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Přidat novou stavovou stránku",
-    Slug: "Slug",
-    "Accept characters:": "Přípustné znaky:",
-    startOrEndWithOnly: "Počáteční a koncový znak může být pouze {0}",
-    "No consecutive dashes": "Nesmí se opakovat pomlčky",
-    Next: "Další",
-    "The slug is already taken. Please choose another slug.": "Slug s tímto názvem již existuje. Prosím, zadejte jiný název.",
-    "No Proxy": "Žádná proxy",
-    Authentication: "Ověření",
-    "HTTP Basic Auth": "HTTP Basic ověření",
-    "New Status Page": "Nová stavová stránka",
-    "Page Not Found": "Stránka nenalezena",
-    "Reverse Proxy": "Reverzní proxy",
-    Backup: "Záloha",
-    About: "O programu",
-    wayToGetCloudflaredURL: "(Stáhnout cloudflared z {0})",
-    cloudflareWebsite: "Webová stránka Cloudflare",
-    "Message:": "Zpráva:",
-    "Don't know how to get the token? Please read the guide:": "Nevíte jak získat? Prosím, přečtěte si tuto příručku:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Stávající připojení mohlo být ztraceno, pokud jste připojeni prostřednictvím Cloudflare tunelu. Opravdu jej chcete zastavit? Pro potvrzení zadejte své současné heslo.",
-    "HTTP Headers": "HTTP hlavičky",
-    "Trust Proxy": "Důvěryhodná proxy",
-    "Other Software": "Jiný software",
-    "For example: nginx, Apache and Traefik.": "Například nginx, Apache nebo Traefik.",
-    "Please read": "Prosím, přečtěte si informace na adrese",
-    "Subject:": "Předmět:",
-    "Valid To:": "Platnost do:",
-    "Days Remaining:": "Počet zbývajících dní:",
-    "Issuer:": "Vydavatel:",
-    "Fingerprint:": "Otisk:",
-    "No status pages": "Žádná stavová stránka",
-    "Domain Name Expiry Notification": "Oznámení na blížící se konec platnosti doménového jména",
-    Proxy: "Proxy",
-    "Date Created": "Datum vytvoření",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP adresa",
-    onebotMessageType: "Typ OneBot zprávy",
-    onebotGroupMessage: "Skupinová",
-    onebotPrivateMessage: "Soukromá",
-    onebotUserOrGroupId: "ID skupiny/uživatele",
-    onebotSafetyTips: "Z důvodu bezpečnosti je nutné zadat přístupový token",
-    "PushDeer Key": "PushDeer klíč",
-    "Footer Text": "Text v patičce",
-    "Show Powered By": "Zobrazit \"Poskytuje\"",
-    "Domain Names": "Názvy domén",
-    signedInDisp: "Přihlášen jako {0}",
-    signedInDispDisabled: "Ověření je vypnuté.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Sdílený tajný klíč mezi klientem a serverem",
-    RadiusCalledStationId: "ID volaného zařízení",
-    RadiusCalledStationIdDescription: "Identifikátor volaného zařízení",
-    RadiusCallingStationId: "ID volajícího zařízení",
-    RadiusCallingStationIdDescription: "Identifikátor volajícího zařízení",
-    "Certificate Expiry Notification": "Oznámení na blížící se konec platnosti certifikátu",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "Číslo příjemce",
-    "From Name/Number": "Jméno/číslo odesílatele",
-    "Leave blank to use a shared sender number.": "Ponechte prázdné, pokud chcete použít číslo sdíleného příjemce.",
-    "Octopush API Version": "Octopush API verze",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" ze sekce HTTP API credentials na nástěnce",
-    octopushLogin: "\"Login\" ze sekce HTTP API credentials na nástěnce",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (výchozí)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (dlouhý)",
-    "pushoversounds climb": "Climb (dlouhý)",
-    "pushoversounds persistent": "Persistent (dlouhý)",
-    "pushoversounds echo": "Pushover Echo (dlouhý)",
-    "pushoversounds updown": "Up Down (dlouhý)",
-    "pushoversounds vibrate": "Pouze vibrace",
-    "pushoversounds none": "Žádný (ticho)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Token zařízení",
-    "Show update if available": "Upozornit na aktualizace, pokud jsou k dispozici",
-    "Also check beta release": "Kontrolovat také dostupnost beta verzí",
-    "Using a Reverse Proxy?": "Používáte reverzní proxy?",
-    "Check how to config it for WebSocket": "Zjistěte, jak ji nakonfigurovat pro WebSockety",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Nejčastější důvody:",
-    "The resource is no longer available.": "Zdroj již není k dispozici.",
-    "There might be a typing error in the address.": "Při zadávání adresy jste udělali chybu.",
-    "What you can try:": "Co můžete vyzkoušet:",
-    "Retype the address.": "Znovu zadat adresu.",
-    "Go back to the previous page.": "Vrátit se na předchozí stránku.",
-    "Coming Soon": "Připravujeme",
-    wayToGetClickSendSMSToken: "API Username a API Key získáte na adrese {0} .",
-    "Connection String": "Connection String",
-    Query: "Dotaz",
-    settingsCertificateExpiry: "Platnost TLS certifikátu",
-    certificationExpiryDescription: "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:",
-    "Setup Docker Host": "Nastavit Docker hostitele",
-    "Connection Type": "Typ připojení",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Opravdu chcete odstranit tohoto docker hostitele ze všech dohledů?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker kontejner",
-    "Container Name / ID": "ID / název kontejneru",
-    "Docker Host": "Docker hostitel",
-    "Docker Hosts": "Docker hostitelé",
-    "ntfy Topic": "ntfy Topic",
-    "Domain": "Doména",
-    "Workstation": "Pracovní stanice",
-    disableCloudflaredNoAuthMsg: "Používáte režim bez ověření, heslo není vyžadováno.",
-    trustProxyDescription: "Důvěřovat 'X-Forwarded-*' hlavičkám. Pokud chcete získat správnou IP adresu klientů a vaše instance Uptime Kuma je schována za Nginx nebo Apache, měli byste tuto možnost zapnout.",
-    wayToGetLineNotifyToken: "Přístupový token můžete získat na adrese {0}",
-    Examples: "Příklady",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Dlouhodobý přístupový token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Pro vytvoření dlouhodobého přístupový tokenu klikněte na název svého profilu (v levém dolním rohu) a následně v dolní části stránky klikněte na tlačítko Create Token. ",
-    "Notification Service": "Oznamovací služba",
-    "default: notify all devices": "výchozí: upozornit všechny zařízení",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Seznam dostupných oznamovacích služeb naleznete v Home Assistant v sekci \"Developer Tools > Services\", kde vyhledejte \"notification\" pro zjištění názvu zařízení.",
-    "Automations can optionally be triggered in Home Assistant:": "Automatizaci můžete volitelně aktivovat prostřednictvím Home Assistant:",
-    "Trigger type:": "Typ podmínky spuštění:",
-    "Event type:": "Typ události:",
-    "Event data:": "Data události:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Následně vyberte akci, například přepnutí scény z RGB světla na červenou.",
-    "Frontend Version": "Verze frontendu",
-    "Frontend Version do not match backend version!": "Verze frontendu neodpovídá verzi backendu!",
-    "Base URL": "Primární URL adresa",
-    goAlertInfo: "GoAlert je aplikace s otevřeným zdrojovým kódem pro plánování hovorů, automatické eskalace a upozornění (jako jsou SMS nebo hlasové hovory). Automaticky zapojte správnou osobu, správným způsobem a ve správný čas! {0}",
-    goAlertIntegrationKeyInfo: "Obecný API integrační klíč pro danou službu ve formátu \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" se obvykle nachází ve zkopírované URL jako hodnota parametru token.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Zastaralé: V poslední době byla funkčnost aplikace značně rozšířena, nicméně součást pro zálohování nepokrývá všechny možnosti. Z tohoto důvodu není možné vygenerovat úplnou zálohu a zajistit obnovení všech dat.",
-    backupRecommend: "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
-    "Optional": "Volitelný",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Docs ",
-    "Gateway Type": "Gateway Typ",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Čísla můžete oddělit pomocí",
-    "or": "nebo",
-    recurringInterval: "Interval",
-    "Recurring": "Opakující se",
-    strategyManual: "Ruční spuštění/vypnutí",
-    warningTimezone: "Používá se časové pásmo serveru",
-    weekdayShortMon: "Po",
-    weekdayShortTue: "Út",
-    weekdayShortWed: "St",
-    weekdayShortThu: "Čt",
-    weekdayShortFri: "Pá",
-    weekdayShortSat: "So",
-    weekdayShortSun: "Ne",
-    dayOfWeek: "Den v týdnu",
-    dayOfMonth: "Den v měsíci",
-    lastDay: "Poslední den",
-    lastDay1: "1. poslední den v měsíci",
-    lastDay2: "2. poslední den v měsíci",
-    lastDay3: "3. poslední den v měsíci",
-    lastDay4: "4. poslední den v měsíci",
-    "No Maintenance": "Žádná údržba",
-    pauseMaintenanceMsg: "Opravdu chcete pozastavit údržbu?",
-    "maintenanceStatus-under-maintenance": "Údržba",
-    "maintenanceStatus-inactive": "Neaktivní",
-    "maintenanceStatus-scheduled": "Naplánováno",
-    "maintenanceStatus-ended": "Ukončeno",
-    "maintenanceStatus-unknown": "Neznámý",
-    "Display Timezone": "Zobrazit časové pásmo",
-    "Server Timezone": "Časové pásmo serveru",
-    statusPageMaintenanceEndDate: "Konec",
-    IconUrl: "Adresa URL ikony",
-    "Enable DNS Cache": "Povolit DNS Cache",
-    "Enable": "Povolit",
-    "Disable": "Zakázat",
-    dnsCacheDescription: "V některých IPv6 prostředích nemusí fungovat. Pokud narazíte na nějaké problémy, vypněte jej.",
-    "Single Maintenance Window": "Konkrétní časové okno pro údržbu",
-    "Maintenance Time Window of a Day": "Časové okno pro údržbu v daný den",
-    "Effective Date Range": "Časové období",
-    "Schedule Maintenance": "Naplánovat údržbu",
-    "Date and Time": "Datum a čas",
-    "DateTime Range": "Rozsah data a času",
-    Strategy: "Strategie",
-    "Free Mobile User Identifier": "Free Mobile User Identifier",
-    "Free Mobile API Key": "Free Mobile API Key",
-    "Enable TLS": "Povolit TLS",
-    "Proto Service Name": "Proto Service Name",
-    "Proto Method": "Proto Method",
-    "Proto Content": "Proto Content",
-    Economy: "Úsporná",
-    Lowcost: "Nízkonákladová",
-    high: "high",
-    "General Monitor Type": "Obecný typ dohledu",
-    "Passive Monitor Type": "Pasivní typ dohledu",
-    "Specific Monitor Type": "Konkrétní typ dohledu",
-    dataRetentionTimeError: "Doba pro uchování musí být větší nebo rovna 0",
-    infiniteRetention: "Pro nekonečný záznam zadejte 0.",
-    confirmDeleteTagMsg: "Opravdu chcete odstranit tento štíte? Provedením této akce nedojde k odstranění dohledů, které jej mají přiřazeny.",
-};
diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js
deleted file mode 100644
index 83cd97ba..00000000
--- a/src/languages/da-DK.js
+++ /dev/null
@@ -1,355 +0,0 @@
-export default {
-    languageName: "Danish (Danmark)",
-    Settings: "Indstillinger",
-    Dashboard: "Betjeningspanel",
-    "New Update": "Opdatering tilgængelig",
-    Language: "Sprog",
-    Appearance: "Udseende",
-    Theme: "Tema",
-    General: "Generelt",
-    Version: "Version",
-    "Check Update On GitHub": "Tjek efter opdateringer på Github",
-    List: "Liste",
-    Add: "Tilføj",
-    "Add New Monitor": "Tilføj ny Overvåger",
-    "Quick Stats": "Oversigt",
-    Up: "Aktiv",
-    Down: "Inaktiv",
-    Pending: "Afventer",
-    Unknown: "Ukendt",
-    Pause: "Stands",
-    pauseDashboardHome: "Standset",
-    Name: "Navn",
-    Status: "Status",
-    DateTime: "Dato / Tid",
-    Message: "Beskeder",
-    "No important events": "Inden vigtige begivenheder",
-    Resume: "Fortsæt",
-    Edit: "Rediger",
-    Delete: "Slet",
-    Current: "Aktuelt",
-    Uptime: "Oppetid",
-    "Cert Exp.": "Certifikatets udløb",
-    day: "Dag | Dage",
-    "-day": "-Dage",
-    hour: "Timer",
-    "-hour": "-Timer",
-    checkEverySecond: "Tjek hvert {0} sekund",
-    Response: "Respons",
-    Ping: "Ping",
-    "Monitor Type": "Overvåger Type",
-    Keyword: "Nøgleord",
-    "Friendly Name": "Visningsnavn",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Taktinterval",
-    Retries: "Gentagelser",
-    retriesDescription: "Maksimalt antal gentagelser, før tjenesten markeres som inaktiv og sender en meddelelse.",
-    Advanced: "Avanceret",
-    ignoreTLSError: "Ignorere TLS/SSL web fejl",
-    "Upside Down Mode": "Omvendt tilstand",
-    upsideDownModeDescription: "Håndter tilstanden omvendt. Hvis tjenesten er tilgængelig, vises den som inaktiv.",
-    "Max. Redirects": "Maks. Omdirigeringer",
-    maxRedirectDescription: "Maksimalt antal omdirigeringer, der skal følges. Indstil til 0 for at deaktivere omdirigeringer.",
-    "Accepted Status Codes": "Tilladte HTTP-Statuskoder",
-    acceptedStatusCodesDescription: "Vælg de statuskoder, der stadig skal vurderes som vellykkede.",
-    Save: "Gem",
-    Notifications: "Underretninger",
-    "Not available, please setup.": "Ikke tilgængelige, opsæt venligst.",
-    "Setup Notification": "Opsæt underretninger",
-    Light: "Lys",
-    Dark: "Mørk",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Tema - Tidslinje",
-    Normal: "Normal",
-    Bottom: "Bunden",
-    None: "Ingen",
-    Timezone: "Tidszone",
-    "Search Engine Visibility": "Søgemaskine synlighed",
-    "Allow indexing": "Tillad indeksering",
-    "Discourage search engines from indexing site": "Frabed søgemaskiner at indeksere webstedet",
-    "Change Password": "Ændre adgangskode",
-    "Current Password": "Nuværende adgangskode",
-    "New Password": "Ny adgangskode",
-    "Repeat New Password": "Gentag den nye adgangskode",
-    passwordNotMatchMsg: "Adgangskoderne er ikke ens.",
-    "Update Password": "Opdater adgangskode",
-    "Disable Auth": "Deaktiver autentificering",
-    "Enable Auth": "Aktiver autentificering",
-    Logout: "Log ud",
-    notificationDescription: "Tildel underretninger til Overvåger(e), så denne funktion træder i kraft.",
-    Leave: "Verlassen",
-    "I understand, please disable": "Jeg er indforstået, deaktiver venligst",
-    Confirm: "Bekræft",
-    Yes: "Ja",
-    No: "Nej",
-    Username: "Brugernavn",
-    Password: "Adgangskode",
-    "Remember me": "Husk mig",
-    Login: "Log ind",
-    "No Monitors, please": "Ingen Overvågere",
-    "add one": "tilføj en",
-    "Notification Type": "Underretningstype",
-    Email: "E-Mail",
-    Test: "Test",
-    "Certificate Info": "Certifikatoplysninger",
-    keywordDescription: "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.",
-    deleteMonitorMsg: "Er du sikker på, at du vil slette overvågeren?",
-    deleteNotificationMsg: "Er du sikker på, at du vil slette denne underretning for alle overvågere? ",
-    resolverserverDescription: "Cloudflare er standardserveren, den kan til enhver tid ændres.",
-    "Resolver Server": "Navne-server",
-    rrtypeDescription: "Vælg den type RR, du vil overvåge.",
-    "Last Result": "Seneste resultat",
-    pauseMonitorMsg: "Er du sikker på, at du vil standse Overvågeren?",
-    "Create your admin account": "Opret din administratorkonto",
-    "Repeat Password": "Gentag adgangskoden",
-    "Resource Record Type": "Resource Record Type",
-    respTime: "Resp. Tid (ms)",
-    notAvailableShort: "N/A",
-    Create: "Opret",
-    clearEventsMsg: "Er du sikker på vil slette alle events for denne Overvåger?",
-    clearHeartbeatsMsg: "Er du sikker på vil slette alle hjerteslag for denne Overvåger?",
-    confirmClearStatisticsMsg: "Vil du helt sikkert slette ALLE statistikker?",
-    "Clear Data": "Ryd Data",
-    Events: "Events",
-    Heartbeats: "Hjerteslag",
-    "Auto Get": "Auto-hent",
-    enableDefaultNotificationDescription: "For hver ny overvåger aktiveres denne underretning som standard. Du kan stadig deaktivere underretningen separat for hver skærm.",
-    "Default enabled": "Standard aktiveret",
-    "Also apply to existing monitors": "Anvend også på eksisterende overvågere",
-    Export: "Eksport",
-    Import: "Import",
-    backupDescription: "Du kan sikkerhedskopiere alle Overvågere og alle underretninger til en JSON-fil.",
-    backupDescription2: "PS: Historik og hændelsesdata er ikke inkluderet.",
-    backupDescription3: "Følsom data, f.eks. underretnings-tokener, er inkluderet i eksportfilen. Gem den sikkert.",
-    alertNoFile: "Vælg en fil der skal importeres.",
-    alertWrongFileType: "Vælg venligst en JSON-fil.",
-    twoFAVerifyLabel: "Indtast venligst dit token for at bekræfte, at 2FA fungerer",
-    tokenValidSettingsMsg: "Token er gyldigt! Du kan nu gemme 2FA -indstillingerne.",
-    confirmEnableTwoFAMsg: "Er du sikker på at du vil aktivere 2FA?",
-    confirmDisableTwoFAMsg: "Er du sikker på at du vil deaktivere 2FA?",
-    "Apply on all existing monitors": "Anvend på alle eksisterende overvågere",
-    "Verify Token": "Verificere Token",
-    "Setup 2FA": "Opsæt 2FA",
-    "Enable 2FA": "Aktiver 2FA",
-    "Disable 2FA": "Deaktiver 2FA",
-    "2FA Settings": "2FA Indstillinger",
-    "Two Factor Authentication": "To-Faktor Autentificering",
-    Active: "Aktive",
-    Inactive: "Inaktive",
-    Token: "Token",
-    "Show URI": "Vis URI",
-    "Clear all statistics": "Ryd alle Statistikker",
-    retryCheckEverySecond: "Prøv igen hvert {0} sekund.",
-    importHandleDescription: "Vælg 'Spring over eksisterende', hvis du vil springe over hver overvåger eller underretning med samme navn. 'Overskriv' sletter alle eksisterende overvågere og underretninger.",
-    confirmImportMsg: "Er du sikker på at importere sikkerhedskopien? Sørg for, at du har valgt den rigtige importindstilling.",
-    "Heartbeat Retry Interval": "Hjerteslag Gentagelsesinterval",
-    "Import Backup": "Importer Backup",
-    "Export Backup": "Eksporter Backup",
-    "Skip existing": "Spring over eksisterende",
-    Overwrite: "Overskriv",
-    Options: "Valgmuligheder",
-    "Keep both": "Behold begge",
-    Tags: "Etiketter",
-    "Add New below or Select...": "Tilføj Nyt nedenfor eller Vælg ...",
-    "Tag with this name already exist.": "Et Tag med dette navn findes allerede.",
-    "Tag with this value already exist.": "Et Tag med denne værdi findes allerede.",
-    color: "farve",
-    "value (optional)": "værdi (valgfri)",
-    Gray: "Grå",
-    Red: "Rød",
-    Orange: "Orange",
-    Green: "Grøn",
-    Blue: "Blå",
-    Indigo: "Indigo",
-    Purple: "Lilla",
-    Pink: "Pink",
-    "Search...": "Søg...",
-    "Avg. Ping": "Gns. Ping",
-    "Avg. Response": "Gns. Respons",
-    "Entry Page": "Entry Side",
-    statusPageNothing: "Intet her, tilføj venligst en Gruppe eller en Overvåger.",
-    "No Services": "Ingen Tjenester",
-    "All Systems Operational": "Alle Systemer i Drift",
-    "Partially Degraded Service": "Delvist Forringet Service",
-    "Degraded Service": "Forringet Service",
-    "Add Group": "Tilføj Gruppe",
-    "Add a monitor": "Tilføj en Overvåger",
-    "Edit Status Page": "Rediger Statusside",
-    "Go to Dashboard": "Gå til Betjeningspanel",
-    "Status Page": "Statusside",
-    "Status Pages": "Statusside",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Understøtter 50+ Notifikationstjenester)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Primær Basis-URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Du bør kalde denne webadresse hvert {0} sekund.",
-    pushOptionalParams: "Valgfrie parametre: {0}",
-    defaultNotificationName: "Min {notification} Advarsel ({number})",
-    here: "her",
-    Required: "Påkrævet",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Du kan få et token fra {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "Du kan få dit chat-ID ved at sende en besked til bot'en og gå til denne URL for at se chat_id'et:",
-    "YOUR BOT TOKEN HERE": "DIT BOT TOKEN HER",
-    chatIDNotFound: "Chat-ID blev ikke fundet; send venligst en besked til denne bot først ",
-    "Post URL": "Post URL",
-    "Content Type": "Indholdstype",
-    webhookJsonDesc: "{0} er god til alle moderne HTTP-servere som f.eks Express.js",
-    webhookFormDataDesc: "{multipart} er god til PHP. JSON'en skal parses med {decodeFunction}",
-    secureOptionNone: "Ingen / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignorer TLS-fejl",
-    "From Email": "Afsender Email",
-    emailCustomSubject: "Brugerdefineret Emne",
-    "To Email": "Modtager Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Du kan få dette ved at gå til Serverindstillinger -> Integrationer -> Opret webhook ",
-    "Bot Display Name": "Bot Visningsnavn",
-    "Prefix Custom Message": "Præfiks Brugerdefineret Besked",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Du kan lære, hvordan du laver en webhook URL {0}.",
-    Number: "Nummer",
-    Recipients: "Modtagere",
-    needSignalAPI: "Du skal have en Signal-klient med REST API.",
-    wayToCheckSignalURL: "Du kan tjekke denne URL for at se, hvordan du konfigurerer en:",
-    signalImportant: "VIGTIGT: Du kan ikke blande grupper og numre i modtagere!",
-    "Application Token": "Program Token",
-    "Server URL": "Server URL",
-    Priority: "Prioritet",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Kanalnavn",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Mere info om Webhooks på: {0}",
-    aboutChannelName: "Indtast kanalnavnet i {0} Kanalnavn feltet, hvis du vil omgå Webhook-kanalen. Eks: #anden-kanal",
-    aboutKumaURL: "Hvis du efterlader Uptime Kuma URL-feltet tomt, vil det som standard gå til projektets GitHub-siden.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    clicksendsms: "ClickSend SMS",
-    "User Key": "Bruger-Nøgle",
-    Device: "Enhed",
-    "Message Title": "Besked Titel",
-    "Notification Sound": "Notifikationslyd",
-    "More info on:": "Mere info på: {0}",
-    pushoverDesc1: "Nødprioritet (2) har som standard 30 sekunders timeout mellem genforsøg og udløber efter 1 time.",
-    pushoverDesc2: "Hvis du vil sende meddelelser til forskellige enheder, skal du udfylde feltet Enhed.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Hurtig - anbefales til advarsel)",
-    octopushTypeLowCost: "Lavpris (Langsom - nogle gange blokeret af operatøren)",
-    checkPrice: "Tjek {0} priser:",
-    apiCredentials: "API legitimationsoplysninger",
-    octopushLegacyHint: "Bruger du den ældre version af Octopush (2011-2020) eller den nye version?",
-    "Check octopush prices": "Tjek octopush priser {0}.",
-    octopushPhoneNumber: "Telefonnummer (intl format, f.eks : +4512345678) ",
-    octopushSMSSender: "SMS Afsender Navn : 3-11 alfanumeriske tegn og mellemrum (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Enhed-ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Eksempel: {0}",
-    "Read more:": "Læs mere: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Læs mere",
-    appriseInstalled: "Apprise er installeret.",
-    appriseNotInstalled: "Apprise er ikke installeret. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "kanaladgangstoken",
-    "Line Developers Console": "Line Udviklerkonsol",
-    lineDevConsoleTo: "Line Udviklerkonsol - {0}",
-    "Basic Settings": "Basisindstillinger",
-    "User ID": "Bruger-ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Tilgå først {0}, opret en udbyder og kanal (Messaging API), så kan du få kanaladgangstoken'et og bruger-ID'et fra de ovennævnte menupunkter.",
-    "Icon URL": "Ikon URL",
-    aboutIconURL: "Du kan angive et link til et billede i \"Ikon URL\" for at tilsidesætte standardprofilbilledet. Vil ikke blive brugt, hvis Ikon Emoji er angivet.",
-    aboutMattermostChannelName: "Du kan tilsidesætte standardkanalen, som Webhoo'en sender til ved at indtaste kanalnavnet i feltet \"Kanalnavn\". Dette skal aktiveres i Mattermost Webhook-indstillingerne. Eks: #anden-kanal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - billig, men langsom og ofte overbelastet. Begrænset kun til polske modtagere.",
-    promosmsTypeFlash: "SMS FLASH - Beskeden vises automatisk på modtagerenheden. Begrænset kun til polske modtagere.",
-    promosmsTypeFull: "SMS FULL - Premium-niveau af SMS, Du kan bruge dit \"Sender Name\" (Du skal først registrere navn). Pålidelig til advarsler.",
-    promosmsTypeSpeed: "SMS SPEED - Højeste prioritet i systemet. Meget hurtig og pålidelig, men dyr (ca. to gange af SMS FULL pris).",
-    promosmsPhoneNumber: "Telefonnummer (polske numre behøver ikke angive områdenumre)",
-    promosmsSMSSender: "SMS Sender Name : Forudregistreret navn eller en af standarderne: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Hjemmeserver-URL (med http(s):// og eventuel port)",
-    "Internal Room Id": "Intern Rum-ID",
-    matrixDesc1: "Du kan finde det interne rum-ID ved at se i det avancerede afsnit af rumindstillingerne i din Matrix-klient. Det skulle ligne !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Det anbefales stærkt, at du opretter en ny bruger og ikke bruger din egen Matrix-brugers adgangstoken, da det giver fuld adgang til din konto og alle de rum, du har tilsluttet dig. I stedet skal du oprette en ny bruger og kun invitere den til det rum, du vil modtage meddelelsen i. Du kan få adgangstokenet ved at køre {0}",
-    Method: "Metode",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "\"request headers\"-erne er ikke gyldige JSON: ",
-    BodyInvalidFormat: "\"request body\"-en er ikke gyldige JSON: ",
-    "Monitor History": "Overvåger Historik",
-    clearDataOlderThan: "Gem overvågningshistorikdata i {0} dage.",
-    PasswordsDoNotMatch: "Adgangskoderne stemmer ikke overens.",
-    records: "forekomster",
-    "One record": "Én forekomst",
-    steamApiKeyDescription: "For at overvåge en Steam Game Server skal du bruge en Steam Web-API nøgle. Du kan registrere din API-nøgle her: ",
-    "Current User": "Nuværende Bruger",
-    recent: "Seneste",
-    Done: "Færdig",
-    Info: "Info",
-    Security: "Sikkerhed",
-    "Steam API Key": "Steam API-nøgle",
-    "Shrink Database": "Krymp Database",
-    "Pick a RR-Type...": "Vælg en RR-Type...",
-    "Pick Accepted Status Codes...": "Vælg Accepterede Statuskoder...",
-    Default: "Standard",
-    "HTTP Options": "HTTP Valgmuligheder",
-    "Create Incident": "Opret Annoncering",
-    Title: "Titel",
-    Content: "Indhold",
-    Style: "Type",
-    info: "info",
-    warning: "advarsel",
-    danger: "fare",
-    primary: "primær",
-    light: "lys",
-    dark: "mørk",
-    Post: "Udgiv",
-    "Please input title and content": "Indtast venligst titel og indhold",
-    Created: "Oprettet",
-    "Last Updated": "Sidst Opdateret",
-    Unpin: "Frigør",
-    "Switch to Light Theme": "Skift til Lys Tema",
-    "Switch to Dark Theme": "Skift til Mørkt Tema",
-    "Show Tags": "Vis Etiketter",
-    "Hide Tags": "Skjul Etiketter",
-    Description: "Beskrivelse",
-    "No monitors available.": "No monitors available.",
-    "Add one": "Tilføj en",
-    "No Monitors": "Ingen Overvågere",
-    "Untitled Group": "Unavngivet Gruppe",
-    Services: "Tjenester",
-    Discard: "Kassér",
-    Cancel: "Annullér",
-    "Powered by": "Drevet af",
-    shrinkDatabaseDescription: "Udfør database VACUUM for SQLite. Hvis din database er oprettet efter 1.10.0, er AUTO_VACUUM allerede aktiveret, og denne handling er ikke nødvendig.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Brugernavn (inkl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Adgangskode",
-    serwersmsPhoneNumber: "Telefonnummer",
-    serwersmsSenderName: "SMS Afsender Navn (registreret via kundeportal)",
-    stackfield: "Stackfield",
-};
diff --git a/src/languages/de-CH.js b/src/languages/de-CH.js
deleted file mode 100644
index 922657d0..00000000
--- a/src/languages/de-CH.js
+++ /dev/null
@@ -1,634 +0,0 @@
-export default {
-    languageName: "Deutsch (Schweiz)",
-    Settings: "Einstellungen",
-    Dashboard: "Dashboard",
-    "New Update": "Update verfügbar",
-    Language: "Sprache",
-    Appearance: "Erscheinungsbild",
-    Theme: "Erscheinungsbild",
-    General: "Allgemein",
-    Version: "Version",
-    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
-    List: "Liste",
-    Add: "Hinzufügen",
-    "Add New Monitor": "Neuen Monitor hinzufügen",
-    "Quick Stats": "Übersicht",
-    Up: "Aktiv",
-    Down: "Inaktiv",
-    Pending: "Ausstehend",
-    Unknown: "Unbekannt",
-    Pause: "Pausieren",
-    pauseDashboardHome: "Pausiert",
-    Name: "Name",
-    Status: "Status",
-    DateTime: "Datum / Uhrzeit",
-    Message: "Nachricht",
-    "No important events": "Keine wichtigen Ereignisse",
-    Resume: "Fortsetzen",
-    Edit: "Bearbeiten",
-    Delete: "Löschen",
-    Current: "Aktuell",
-    Uptime: "Verfügbarkeit",
-    "Cert Exp.": "Zertifikatsablauf",
-    day: "Tag | Tage",
-    "-day": "-Tage",
-    hour: "Stunde",
-    "-hour": "-Stunden",
-    checkEverySecond: "Überprüfe alle {0} Sekunden",
-    Response: "Antwortzeit",
-    Ping: "Ping",
-    "Monitor Type": "Monitor-Typ",
-    Keyword: "Suchwort",
-    "Friendly Name": "Anzeigename",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Prüfintervall",
-    Retries: "Wiederholungen",
-    retriesDescription: "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
-    Advanced: "Erweitert",
-    ignoreTLSError: "Ignoriere TLS-/SSL-Fehler von Webseiten",
-    "Upside Down Mode": "Umgekehrter Modus",
-    upsideDownModeDescription: "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
-    "Max. Redirects": "Max. Weiterleitungen",
-    maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
-    "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
-    acceptedStatusCodesDescription: "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
-    Save: "Speichern",
-    Notifications: "Benachrichtigungen",
-    "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
-    "Setup Notification": "Benachrichtigung einrichten",
-    Light: "Hell",
-    Dark: "Dunkel",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
-    Normal: "Normal",
-    Bottom: "Unten",
-    None: "Keine",
-    Timezone: "Zeitzone",
-    "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
-    "Allow indexing": "Indizierung zulassen",
-    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
-    "Change Password": "Passwort ändern",
-    "Current Password": "Aktuelles Passwort",
-    "New Password": "Neues Passwort",
-    "Repeat New Password": "Neues Passwort wiederholen",
-    passwordNotMatchMsg: "Passwörter stimmen nicht überein.",
-    "Update Password": "Passwort aktualisieren",
-    "Disable Auth": "Authentifizierung deaktivieren",
-    "Enable Auth": "Authentifizierung aktivieren",
-    "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
-    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
-    "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
-    Logout: "Ausloggen",
-    notificationDescription: "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
-    Leave: "Verlassen",
-    "I understand, please disable": "Ich verstehe, bitte deaktivieren",
-    Confirm: "Bestätigen",
-    Yes: "Ja",
-    No: "Nein",
-    Username: "Benutzername",
-    Password: "Passwort",
-    "Remember me": "Angemeldet bleiben",
-    Login: "Einloggen",
-    "No Monitors, please": "Keine Monitore, bitte",
-    "add one": "hinzufügen",
-    "Notification Type": "Benachrichtigungsdienst",
-    Email: "E-Mail",
-    Test: "Test",
-    "Certificate Info": "Zertifikatsinformation",
-    keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Gross-/Kleinschreibung unterschieden.",
-    deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
-    deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
-    resolverserverDescription: "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
-    "Resolver Server": "Auflösungsserver",
-    rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
-    "Last Result": "Letztes Ergebnis",
-    pauseMonitorMsg: "Bist du sicher, dass du den Monitor pausieren möchtest?",
-    clearEventsMsg: "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
-    clearHeartbeatsMsg: "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
-    "Clear Data": "Lösche Daten",
-    Events: "Ereignisse",
-    Heartbeats: "Statistiken",
-    confirmClearStatisticsMsg: "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
-    "Create your admin account": "Erstelle dein Admin-Konto",
-    "Repeat Password": "Passwort erneut eingeben",
-    "Resource Record Type": "Ressourcen Record Typ",
-    Export: "Export",
-    Import: "Import",
-    respTime: "Antw.-Zeit (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Standardmässig aktiviert",
-    "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
-    enableDefaultNotificationDescription: "Für jeden neuen Monitor wird diese Benachrichtigung standardmässig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.",
-    Create: "Erstellen",
-    "Auto Get": "Auto Get",
-    backupDescription: "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
-    backupDescription2: "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
-    backupDescription3: "Sensible Daten wie Benachrichtigungs-Token sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
-    alertNoFile: "Bitte wähle eine Datei zum Importieren aus.",
-    alertWrongFileType: "Bitte wähle eine JSON-Datei aus.",
-    "Clear all statistics": "Lösche alle Statistiken",
-    importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
-    "Skip existing": "Vorhandene überspringen",
-    Overwrite: "Überschreiben",
-    Options: "Optionen",
-    confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
-    "Keep both": "Beide behalten",
-    twoFAVerifyLabel: "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
-    "Verify Token": "Token verifizieren",
-    "Setup 2FA": "2FA einrichten",
-    "Enable 2FA": "2FA aktivieren",
-    "Disable 2FA": "2FA deaktivieren",
-    "2FA Settings": "2FA-Einstellungen",
-    confirmEnableTwoFAMsg: "Bist du sicher, dass du 2FA aktivieren möchtest?",
-    confirmDisableTwoFAMsg: "Bist du sicher, dass du 2FA deaktivieren möchtest?",
-    tokenValidSettingsMsg: "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
-    "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
-    Active: "Aktiv",
-    Inactive: "Inaktiv",
-    Token: "Token",
-    "Show URI": "URI anzeigen",
-    Tags: "Tags",
-    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
-    "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
-    "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
-    color: "Farbe",
-    "value (optional)": "Wert (optional)",
-    Gray: "Grau",
-    Red: "Rot",
-    Orange: "Orange",
-    Green: "Grün",
-    Blue: "Blau",
-    Indigo: "Indigo",
-    Purple: "Lila",
-    Pink: "Pink",
-    "Search...": "Suchen...",
-    "Heartbeat Retry Interval": "Überprüfungsintervall",
-    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
-    retryCheckEverySecond: "Alle {0} Sekunden neu versuchen",
-    resendEveryXTimes: "Erneut versenden alle {0} mal",
-    resendDisabled: "Erneut versenden deaktiviert",
-    "Import Backup": "Backup importieren",
-    "Export Backup": "Backup exportieren",
-    "Avg. Ping": "Ping ø",
-    "Avg. Response": "Antwortzeit ø",
-    "Entry Page": "Einstiegsseite",
-    statusPageNothing: "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
-    "No Services": "Keine Dienste",
-    "All Systems Operational": "Alle Systeme betriebsbereit",
-    "Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
-    "Degraded Service": "Eingeschränkter Dienst",
-    "Add Group": "Gruppe hinzufügen",
-    "Add a monitor": "Monitor hinzufügen",
-    "Edit Status Page": "Bearbeite Status-Seite",
-    "Go to Dashboard": "Gehe zum Dashboard",
-    "Status Page": "Status-Seite",
-    "Status Pages": "Status-Seiten",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "E-Mail (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
-    GoogleChat: "Google Chat (nur Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Primär URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Du solltest diese URL alle {0} Sekunden aufrufen",
-    pushOptionalParams: "Optionale Parameter: {0}",
-    defaultNotificationName: "Mein {notification} Alarm ({number})",
-    here: "hier",
-    Required: "Erforderlich",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Hier kannst du einen Token erhalten {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
-    wayToGetTelegramChatID: "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
-    "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
-    chatIDNotFound: "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
-    webhookFormDataDesc: "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
-    secureOptionNone: "Keine / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS-Fehler ignorieren",
-    "From Email": "Absender E-Mail",
-    emailCustomSubject: "Benutzerdefinierter Betreff",
-    "To Email": "Empfänger E-Mail",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
-    "Bot Display Name": "Bot-Anzeigename",
-    "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
-    "Hello @everyone is...": "Hallo {'@'}everyone ist...",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
-    Number: "Nummer",
-    Recipients: "Empfänger",
-    needSignalAPI: "Es wird ein Signal Client mit REST-API benötigt.",
-    wayToCheckSignalURL: "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
-    signalImportant: "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
-    "Application Token": "Anwendungstoken",
-    "Server URL": "Server URL",
-    Priority: "Priorität",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Kanalname",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Weitere Informationen zu Webhooks auf: {0}",
-    aboutChannelName: "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
-    aboutKumaURL: "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmässig die GitHub Projekt Seite verwendet.",
-    emojiCheatSheet: "Emoji Cheat Sheet: {0}",
-    "User Key": "Benutzerschlüssel",
-    Device: "Gerät",
-    "Message Title": "Nachrichtentitel",
-    "Notification Sound": "Benachrichtigungston",
-    "More info on:": "Mehr Infos auf: {0}",
-    pushoverDesc1: "Notfallpriorität (2) hat standardmässig 30 Sekunden Auszeit zwischen den Versuchen und läuft nach 1 Stunde ab.",
-    pushoverDesc2: "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
-    "SMS Type": "SMS Typ",
-    octopushTypePremium: "Premium (Schnell - zur Benachrichtigung empfohlen)",
-    octopushTypeLowCost: "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
-    checkPrice: "Prüfe {0} Preise:",
-    octopushLegacyHint: "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
-    "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
-    octopushPhoneNumber: "Telefonnummer (Internationales Format, z.B : +49612345678) ",
-    octopushSMSSender: "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Geräte ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Beispiel: {0}",
-    "Read more:": "Weiterlesen: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Weiterlesen",
-    appriseInstalled: "Apprise ist installiert.",
-    appriseNotInstalled: "Apprise ist nicht installiert. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Basic Settings",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
-    aboutMattermostChannelName: "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
-    promosmsTypeFlash: "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
-    promosmsTypeFull: "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.",
-    promosmsTypeSpeed: "SMS SPEED - Höchste Priorität im System. Sehr schnell und zuverlässig, aber teuer (Ungefähr das doppelte von SMS FULL).",
-    promosmsPhoneNumber: "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
-    promosmsSMSSender: "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu Webhook URL",
-    matrixHomeserverURL: "Heimserver URL (mit http(s):// und optionalen Ports)",
-    "Internal Room Id": "Interne Raum-ID",
-    matrixDesc1: "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Der Header ist kein gültiges JSON: ",
-    BodyInvalidFormat: "Der Body ist kein gültiges JSON: ",
-    "Monitor History": "Monitor Verlauf",
-    clearDataOlderThan: "Bewahre die Aufzeichnungsdaten für {0} Tage auf.",
-    PasswordsDoNotMatch: "Passwörter stimmen nicht überein.",
-    records: "Einträge",
-    "One record": "Ein Eintrag",
-    steamApiKeyDescription: "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
-    "Current User": "Aktueller Benutzer",
-    recent: "Letzte",
-    Done: "Fertig",
-    Info: "Info",
-    Security: "Sicherheit",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Datenbank verkleinern",
-    "Pick a RR-Type...": "Wähle ein RR-Typ aus...",
-    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
-    Default: "Standard",
-    "HTTP Options": "HTTP Optionen",
-    "Create Incident": "Vorfall erstellen",
-    Title: "Titel",
-    Content: "Inhalt",
-    Style: "Stil",
-    info: "info",
-    warning: "warnung",
-    danger: "gefahr",
-    primary: "primär",
-    light: "hell",
-    dark: "dunkel",
-    Post: "Eintrag",
-    "Please input title and content": "Bitte Titel und Inhalt eingeben",
-    Created: "Erstellt",
-    "Last Updated": "Zuletzt aktualisiert",
-    Unpin: "Loslösen",
-    "Switch to Light Theme": "Zu hellem Thema wechseln",
-    "Switch to Dark Theme": "Zum dunklen Thema wechseln",
-    "Show Tags": "Tags anzeigen",
-    "Hide Tags": "Tags ausblenden",
-    Description: "Beschreibung",
-    "No monitors available.": "Keine Monitore verfügbar.",
-    "Add one": "Hinzufügen",
-    "No Monitors": "Keine Monitore",
-    "Untitled Group": "Gruppe ohne Titel",
-    Services: "Dienste",
-    Discard: "Verwerfen",
-    Cancel: "Abbrechen",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Benutzername (inkl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Passwort",
-    serwersmsPhoneNumber: "Telefonnummer",
-    serwersmsSenderName: "Name des SMS-Absenders (über Kundenportal registriert)",
-    stackfield: "Stackfield",
-    clicksendsms: "ClickSend SMS",
-    apiCredentials: "API Zugangsdaten",
-    smtpDkimSettings: "DKIM Einstellungen",
-    smtpDkimDesc: "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
-    documentation: "Dokumentation",
-    smtpDkimDomain: "Domain Name",
-    smtpDkimKeySelector: "Schlüssel Auswahl",
-    smtpDkimPrivateKey: "Privater Schlüssel",
-    smtpDkimHashAlgo: "Hash-Algorithmus (Optional)",
-    smtpDkimheaderFieldNames: "Zu validierende Header-Schlüssel (optional)",
-    smtpDkimskipFields: "Zu ignorierende Header Schlüssel (optional)",
-    PushByTechulus: "Push by Techulus",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpunkt",
-    alertaEnvironment: "Umgebung",
-    alertaApiKey: "API Schlüssel",
-    alertaAlertState: "Alarmstatus",
-    alertaRecoverState: "Wiederherstellungsstatus",
-    deleteStatusPageMsg: "Bist du sicher, dass du diese Status-Seite löschen willst?",
-    Proxies: "Proxies",
-    default: "Standard",
-    enabled: "Aktiviert",
-    setAsDefault: "Als Standard setzen",
-    deleteProxyMsg: "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
-    proxyDescription: "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
-    enableProxyDescription: "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
-    setAsDefaultProxyDescription: "Dieser Proxy wird standardmässig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
-    "Certificate Chain": "Zertifikatskette",
-    Valid: "Gültig",
-    Invalid: "Ungültig",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "Telefonnummern",
-    TemplateCode: "Vorlagencode",
-    SignName: "Signaturname",
-    "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
-    "Bark Endpoint": "Bark Endpunkt",
-    WebHookUrl: "Webhook URL",
-    SecretKey: "Geheimer Schlüssel",
-    "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
-    "Device Token": "Gerätetoken",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Hoch",
-    Retry: "Wiederholungen",
-    Topic: "Thema",
-    "WeCom Bot Key": "WeCom Bot Schlüssel",
-    "Setup Proxy": "Proxy einrichten",
-    "Proxy Protocol": "Proxy Protokoll",
-    "Proxy Server": "Proxy-Server",
-    "Proxy server has authentication": "Proxy-Server hat Authentifizierung",
-    User: "Benutzer",
-    Installed: "Installiert",
-    "Not installed": "Nicht installiert",
-    Running: "Läuft",
-    "Not running": "Gestoppt",
-    "Remove Token": "Token entfernen",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Neue Status-Seite hinzufügen",
-    Slug: "Slug",
-    "Accept characters:": "Akzeptierte Zeichen:",
-    startOrEndWithOnly: "Nur mit {0} anfangen und enden",
-    "No consecutive dashes": "Keine aufeinanderfolgenden Bindestriche",
-    Next: "Weiter",
-    "The slug is already taken. Please choose another slug.": "Der Slug ist bereits in Verwendung. Bitte wähle einen anderen.",
-    "No Proxy": "Kein Proxy",
-    Authentication: "Authentifizierung",
-    "HTTP Basic Auth": "HTTP Basisauthentifizierung",
-    "New Status Page": "Neue Status-Seite",
-    "Page Not Found": "Seite nicht gefunden",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Sicherung",
-    About: "Über",
-    wayToGetCloudflaredURL: "(Lade Cloudflare von {0} herunter)",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Nachricht:",
-    "Don't know how to get the token? Please read the guide:": "Du weisst nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Die aktuelle Verbindung kann unterbrochen werden, wenn du aktuell über Cloudflare Tunnel verbunden bist. Bist du sicher, dass du es stoppen willst? Gib zur Bestätigung dein aktuelles Passwort ein.",
-    "Other Software": "Andere Software",
-    "For example: nginx, Apache and Traefik.": "Zum Beispiel: nginx, Apache und Traefik.",
-    "Please read": "Bitte lesen",
-    "Subject:": "Betreff:",
-    "Valid To:": "Gültig bis:",
-    "Days Remaining:": "Tage verbleibend:",
-    "Issuer:": "Aussteller:",
-    "Fingerprint:": "Fingerabdruck:",
-    "No status pages": "Keine Status-Seiten",
-    "Domain Name Expiry Notification": "Benachrichtigung bei Ablauf des Domainnamens",
-    Customize: "Anpassen",
-    "Custom Footer": "Eigener Footer",
-    "Custom CSS": "Eigenes CSS",
-    "Footer Text": "Fusszeile",
-    "Show Powered By": "Zeige 'Powered By'",
-    "Date Created": "Erstellt am",
-    "Domain Names": "Domainnamen",
-    signedInDisp: "Angemeldet als {0}",
-    signedInDispDisabled: "Authentifizierung deaktiviert.",
-    dnsPortDescription: "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
-    topic: "Thema",
-    topicExplanation: "MQTT Thema für den monitor",
-    successMessage: "Erfolgsnachricht",
-    successMessageExplanation: "MQTT Nachricht, die als Erfolg angesehen wird",
-    error: "Fehler",
-    critical: "kritisch",
-    wayToGetPagerDutyKey: "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
-    "Integration Key": "Schlüssel der Integration",
-    "Integration URL": "URL der Integration",
-    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
-    "do nothing": "nichts tun",
-    "auto acknowledged": "automatisch bestätigen",
-    "auto resolve": "automatisch lösen",
-    "Bark Group": "Bark Gruppe",
-    "Bark Sound": "Bark Klang",
-    "HTTP Headers": "HTTP Kopfzeilen",
-    "Trust Proxy": "Vertrauenswürdiger Proxy",
-    Proxy: "Proxy",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Adresse",
-    onebotMessageType: "OneBot Nachrichtentyp",
-    onebotGroupMessage: "Gruppe",
-    onebotPrivateMessage: "Privat",
-    onebotUserOrGroupId: "Gruppe/Nutzer ID",
-    onebotSafetyTips: "Zur Sicherheit ein access token setzen",
-    "PushDeer Key": "PushDeer Schlüssel",
-    RadiusSecret: "Radius Geheimnis",
-    RadiusSecretDescription: "Geteiltes Geheimnis zwischen Client und Server",
-    RadiusCalledStationId: "ID der angesprochenen Station",
-    RadiusCalledStationIdDescription: "Identifikation des angesprochenen Geräts",
-    RadiusCallingStationId: "ID der ansprechenden Station",
-    RadiusCallingStationIdDescription: "Identifikation des ansprechenden Geräts",
-    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
-    "API Username": "API Nutzername",
-    "API Key": "API Schlüssel",
-    "Recipient Number": "Empfängernummer",
-    "From Name/Number": "Von Name/Nummer",
-    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "Endpunkt",
-    octopushAPIKey: "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
-    octopushLogin: "\"Login\" der HTTP API Zugangsdaten im control panel",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (Standard)",
-    "pushoversounds bike": "Fahrrad",
-    "pushoversounds bugle": "Signalhorn",
-    "pushoversounds cashregister": "Kasse",
-    "pushoversounds classical": "Klassisch",
-    "pushoversounds cosmic": "Kosmisch",
-    "pushoversounds falling": "Abfallend",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Eingang",
-    "pushoversounds intermission": "Pause",
-    "pushoversounds magic": "Magisch",
-    "pushoversounds mechanical": "Mechanisch",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Sirene",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Schlepper Horn",
-    "pushoversounds alien": "Ausserirdisch (lang)",
-    "pushoversounds climb": "Ansteigende (lang)",
-    "pushoversounds persistent": "Hartnäckig (lang)",
-    "pushoversounds echo": "Pushover Echo (lang)",
-    "pushoversounds updown": "Auf und Ab (lang)",
-    "pushoversounds vibrate": "Nur vibrieren",
-    "pushoversounds none": "Nichts (Stille)",
-    pushyAPIKey: "Geheimer API Schlüssel",
-    pushyToken: "Gerätetoken",
-    "Show update if available": "Verfügbare Updates anzeigen",
-    "Also check beta release": "Auch nach beta Versionen schauen",
-    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
-    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Wahrscheinliche Ursachen:",
-    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
-    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
-    "What you can try:": "Was du versuchen kannst:",
-    "Retype the address.": "Schreibe die Adresse erneut.",
-    "Go back to the previous page.": "Gehe zur vorigen Seite.",
-    "Coming Soon": "Kommt bald",
-    wayToGetClickSendSMSToken: "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
-    "Connection String": "Verbindungstext",
-    Query: "Abfrage",
-    settingsCertificateExpiry: "TLS Zertifikatsablauf",
-    certificationExpiryDescription: "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
-    "Setup Docker Host": "Docker Host einrichten",
-    "Connection Type": "Verbindungstyp",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Bist du sicher diesen docker host für alle Monitore zu löschen?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Thema",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
-    trustProxyDescription: "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
-    wayToGetLineNotifyToken: "Du kannst hier ein Token erhalten: {0}",
-    Examples: "Beispiele",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Lange gültiges Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
-    "Notification Service": "Benachrichtigungsdienst",
-    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
-    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
-    "Trigger type:": "Auslöser:",
-    "Event type:": "Ereignistyp:",
-    "Event data:": "Ereignis daten:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
-    "Frontend Version": "Frontend Version",
-    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
-    Maintenance: "Wartung",
-    statusMaintenance: "Wartung",
-    "Schedule maintenance": "Geplante Wartung",
-    "Affected Monitors": "Betroffene Monitore",
-    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
-    "Start of maintenance": "Beginn der Wartung",
-    "All Status Pages": "Alle Status Seiten",
-    "Select status pages...": "Wähle Status Seiten...",
-    recurringIntervalMessage: "einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
-    affectedMonitorsDescription: "Wähle alle Monitore die von der Wartung betroffen sind",
-    affectedStatusPages: "Zeige diese Nachricht auf ausgewählten Status Seiten",
-    atLeastOneMonitor: "Wähle mindestens einen Monitor",
-    deleteMaintenanceMsg: "Möchtest du diese Wartung löschen?",
-    "Base URL": "Basis URL",
-    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
-    goAlertIntegrationKeyInfo: "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
-    backupRecommend: "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
-    Optional: "Optional",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Dokumente",
-    "Gateway Type": "Gateway Type",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Du kannst Zahlen teilen mit",
-    or: "oder",
-    recurringInterval: "Intervall",
-    Recurring: "Wiederkehrend",
-    strategyManual: "Active/Inactive Manually",
-    warningTimezone: "Es wird die Zeitzone des Servers genutzt",
-    weekdayShortMon: "Mo",
-    weekdayShortTue: "Di",
-    weekdayShortWed: "Mi",
-    weekdayShortThu: "Do",
-    weekdayShortFri: "Fr",
-    weekdayShortSat: "Sa",
-    weekdayShortSun: "So",
-    dayOfWeek: "Tag der Woche",
-    dayOfMonth: "Tag im Monat",
-    lastDay: "Letzter Tag",
-    lastDay1: "Letzter Tag im Monat",
-    lastDay2: "Vorletzer Tag im Monat",
-    lastDay3: "3. letzter Tag im Monat",
-    lastDay4: "4. letzter Tag im Monat",
-    "No Maintenance": "Keine Wartung",
-    pauseMaintenanceMsg: "Möchtest du wirklich pausieren?",
-    "maintenanceStatus-under-maintenance": "Unter Wartung",
-    "maintenanceStatus-inactive": "Inaktiv",
-    "maintenanceStatus-scheduled": "Geplant",
-    "maintenanceStatus-ended": "Ende",
-    "maintenanceStatus-unknown": "Unbekannt",
-    "Display Timezone": "Zeitzone anzeigen",
-    "Server Timezone": "Server Zeitzone",
-    statusPageMaintenanceEndDate: "Ende",
-};
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
deleted file mode 100644
index 6d4bf05f..00000000
--- a/src/languages/de-DE.js
+++ /dev/null
@@ -1,641 +0,0 @@
-export default {
-    languageName: "Deutsch (Deutschland)",
-    Settings: "Einstellungen",
-    Dashboard: "Dashboard",
-    "New Update": "Update verfügbar",
-    Language: "Sprache",
-    Appearance: "Erscheinungsbild",
-    Theme: "Erscheinungsbild",
-    General: "Allgemein",
-    Version: "Version",
-    "Check Update On GitHub": "Auf GitHub nach Updates suchen",
-    List: "Liste",
-    Add: "Hinzufügen",
-    "Add New Monitor": "Neuen Monitor hinzufügen",
-    "Quick Stats": "Übersicht",
-    Up: "Aktiv",
-    Down: "Inaktiv",
-    Pending: "Ausstehend",
-    Unknown: "Unbekannt",
-    Pause: "Pausieren",
-    pauseDashboardHome: "Pausiert",
-    Name: "Name",
-    Status: "Status",
-    DateTime: "Datum / Uhrzeit",
-    Message: "Nachricht",
-    "No important events": "Keine wichtigen Ereignisse",
-    Resume: "Fortsetzen",
-    Edit: "Bearbeiten",
-    Delete: "Löschen",
-    Current: "Aktuell",
-    Uptime: "Verfügbarkeit",
-    "Cert Exp.": "Zertifikatsablauf",
-    day: "Tag | Tage",
-    "-day": "-Tage",
-    hour: "Stunde",
-    "-hour": "-Stunden",
-    checkEverySecond: "Überprüfe alle {0} Sekunden",
-    Response: "Antwortzeit",
-    Ping: "Ping",
-    "Monitor Type": "Monitor-Typ",
-    Keyword: "Suchwort",
-    "Friendly Name": "Anzeigename",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Prüfintervall",
-    Retries: "Wiederholungen",
-    retriesDescription: "Maximale Anzahl von Wiederholungen, bevor der Dienst als inaktiv markiert und eine Benachrichtigung gesendet wird.",
-    Advanced: "Erweitert",
-    ignoreTLSError: "Ignoriere TLS-/SSL-Fehler von Webseiten",
-    "Upside Down Mode": "Umgekehrter Modus",
-    upsideDownModeDescription: "Im umgekehrten Modus wird der Dienst als inaktiv angezeigt, wenn er erreichbar ist.",
-    "Max. Redirects": "Max. Weiterleitungen",
-    maxRedirectDescription: "Maximale Anzahl von Weiterleitungen, denen gefolgt werden soll. Auf 0 setzen, um Weiterleitungen zu deaktivieren.",
-    "Accepted Status Codes": "Erlaubte HTTP-Statuscodes",
-    acceptedStatusCodesDescription: "Statuscodes auswählen, die als erfolgreiche Verbindung gelten sollen.",
-    Save: "Speichern",
-    Notifications: "Benachrichtigungen",
-    "Not available, please setup.": "Nicht verfügbar, bitte einrichten.",
-    "Setup Notification": "Benachrichtigung einrichten",
-    Light: "Hell",
-    Dark: "Dunkel",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Erscheinungsbild - Zeitleiste",
-    Normal: "Normal",
-    Bottom: "Unten",
-    None: "Keine",
-    Timezone: "Zeitzone",
-    "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
-    "Allow indexing": "Indizierung zulassen",
-    "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
-    "Change Password": "Passwort ändern",
-    "Current Password": "Aktuelles Passwort",
-    "New Password": "Neues Passwort",
-    "Repeat New Password": "Neues Passwort wiederholen",
-    passwordNotMatchMsg: "Passwörter stimmen nicht überein.",
-    "Update Password": "Passwort aktualisieren",
-    "Disable Auth": "Authentifizierung deaktivieren",
-    "Enable Auth": "Authentifizierung aktivieren",
-    "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
-    "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
-    "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
-    Logout: "Ausloggen",
-    notificationDescription: "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
-    Leave: "Verlassen",
-    "I understand, please disable": "Ich verstehe, bitte deaktivieren",
-    Confirm: "Bestätigen",
-    Yes: "Ja",
-    No: "Nein",
-    Username: "Benutzername",
-    Password: "Passwort",
-    "Remember me": "Angemeldet bleiben",
-    Login: "Einloggen",
-    "No Monitors, please": "Keine Monitore, bitte",
-    "add one": "hinzufügen",
-    "Notification Type": "Benachrichtigungsdienst",
-    Email: "E-Mail",
-    Test: "Test",
-    "Certificate Info": "Zertifikatsinformation",
-    keywordDescription: "Ein Suchwort in der HTML- oder JSON-Ausgabe finden. Bitte beachte: es wird zwischen Groß-/Kleinschreibung unterschieden.",
-    deleteMonitorMsg: "Bist du sicher, dass du den Monitor löschen möchtest?",
-    deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
-    resolverserverDescription: "Cloudflare ist als der Standardserver festgelegt. Dieser kann jederzeit geändert werden.",
-    "Resolver Server": "Auflösungsserver",
-    rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
-    "Last Result": "Letztes Ergebnis",
-    pauseMonitorMsg: "Bist du sicher, dass du den Monitor pausieren möchtest?",
-    clearEventsMsg: "Bist du sicher, dass du alle Ereignisse für diesen Monitor löschen möchtest?",
-    clearHeartbeatsMsg: "Bist du sicher, dass du alle Statistiken für diesen Monitor löschen möchtest?",
-    "Clear Data": "Lösche Daten",
-    Events: "Ereignisse",
-    Heartbeats: "Statistiken",
-    confirmClearStatisticsMsg: "Bist du dir sicher, dass du ALLE Statistiken löschen möchtest?",
-    "Create your admin account": "Erstelle dein Admin-Konto",
-    "Repeat Password": "Passwort erneut eingeben",
-    "Resource Record Type": "Ressourcen Record Typ",
-    Export: "Export",
-    Import: "Import",
-    respTime: "Antw.-Zeit (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Standardmäßig aktiviert",
-    "Apply on all existing monitors": "Auf alle existierenden Monitore anwenden",
-    enableDefaultNotificationDescription: "Für jeden neuen Monitor wird diese Benachrichtigung standardmäßig aktiviert. Die Benachrichtigung kann weiterhin für jeden Monitor separat deaktiviert werden.",
-    Create: "Erstellen",
-    "Auto Get": "Auto Get",
-    backupDescription: "Es können alle Monitore und Benachrichtigungen in einer JSON-Datei gesichert werden.",
-    backupDescription2: "PS: Verlaufs- und Ereignisdaten sind nicht enthalten.",
-    backupDescription3: "Sensible Daten wie Benachrichtigungstoken sind in der Exportdatei enthalten, bitte bewahre sie sorgfältig auf.",
-    alertNoFile: "Bitte wähle eine Datei zum Importieren aus.",
-    alertWrongFileType: "Bitte wähle eine JSON-Datei aus.",
-    "Clear all statistics": "Lösche alle Statistiken",
-    importHandleDescription: "Wähle 'Vorhandene überspringen' aus, wenn jeder Monitor oder jede Benachrichtigung mit demselben Namen übersprungen werden soll. 'Überschreiben' löscht jeden vorhandenen Monitor sowie Benachrichtigungen.",
-    "Skip existing": "Vorhandene überspringen",
-    Overwrite: "Überschreiben",
-    Options: "Optionen",
-    confirmImportMsg: "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
-    "Keep both": "Beide behalten",
-    twoFAVerifyLabel: "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
-    "Verify Token": "Token verifizieren",
-    "Setup 2FA": "2FA einrichten",
-    "Enable 2FA": "2FA aktivieren",
-    "Disable 2FA": "2FA deaktivieren",
-    "2FA Settings": "2FA-Einstellungen",
-    confirmEnableTwoFAMsg: "Bist du sicher, dass du 2FA aktivieren möchtest?",
-    confirmDisableTwoFAMsg: "Bist du sicher, dass du 2FA deaktivieren möchtest?",
-    tokenValidSettingsMsg: "Token gültig! Du kannst jetzt die 2FA-Einstellungen speichern.",
-    "Two Factor Authentication": "Zwei-Faktor-Authentifizierung",
-    Active: "Aktiv",
-    Inactive: "Inaktiv",
-    Token: "Token",
-    "Show URI": "URI anzeigen",
-    Tags: "Tags",
-    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
-    "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
-    "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
-    color: "Farbe",
-    "value (optional)": "Wert (optional)",
-    Gray: "Grau",
-    Red: "Rot",
-    Orange: "Orange",
-    Green: "Grün",
-    Blue: "Blau",
-    Indigo: "Indigo",
-    Purple: "Lila",
-    Pink: "Pink",
-    "Search...": "Suchen...",
-    "Heartbeat Retry Interval": "Überprüfungsintervall",
-    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
-    retryCheckEverySecond: "Alle {0} Sekunden neu versuchen",
-    resendEveryXTimes: "Erneut versenden alle {0} mal",
-    resendDisabled: "Erneut versenden deaktiviert",
-    "Import Backup": "Backup importieren",
-    "Export Backup": "Backup exportieren",
-    "Avg. Ping": "Durchschn. Ping",
-    "Avg. Response": "Durchschn. Antwort",
-    "Entry Page": "Einstiegsseite",
-    statusPageNothing: "Noch ist hier nichts. Bitte füge eine Gruppe oder einen Monitor hinzu.",
-    "No Services": "Keine Dienste",
-    "All Systems Operational": "Alle Systeme betriebsbereit",
-    "Partially Degraded Service": "Teilweise beeinträchtigter Dienst",
-    "Degraded Service": "Eingeschränkter Dienst",
-    "Add Group": "Gruppe hinzufügen",
-    "Add a monitor": "Monitor hinzufügen",
-    "Edit Status Page": "Statusseite bearbeiten",
-    "Go to Dashboard": "Gehe zum Dashboard",
-    "Status Page": "Status-Seite",
-    "Status Pages": "Status-Seiten",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "E-Mail (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Unterstützung für 50+ Benachrichtigungsdienste)",
-    GoogleChat: "Google Chat (nur Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Primäre Basis-URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Du solltest diese URL alle {0} Sekunden aufrufen",
-    pushOptionalParams: "Optionale Parameter: {0}",
-    defaultNotificationName: "Mein {notification} Alarm ({number})",
-    here: "hier",
-    Required: "Erforderlich",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Hier kannst du einen Token erhalten {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
-    wayToGetTelegramChatID: "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
-    "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
-    chatIDNotFound: "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} ist gut für alle modernen HTTP-Server, wie z.B. Express.js, geeignet",
-    webhookFormDataDesc: "{multipart} ist gut für PHP. Das JSON muss mit {decodeFunction} verarbeitet werden",
-    secureOptionNone: "Keine / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS-Fehler ignorieren",
-    "From Email": "Absender E-Mail",
-    emailCustomSubject: "Benutzerdefinierter Betreff",
-    "To Email": "Empfänger E-Mail",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
-    "Bot Display Name": "Bot-Anzeigename",
-    "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
-    "Hello @everyone is...": "Hallo {'@'}everyone ist...",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
-    Number: "Nummer",
-    Recipients: "Empfänger",
-    needSignalAPI: "Es wird ein Signal Client mit REST-API benötigt.",
-    wayToCheckSignalURL: "Du kannst diese URL aufrufen, um zu sehen, wie du eine einrichtest:",
-    signalImportant: "WICHTIG: Gruppen und Nummern können in Empfängern nicht gemischt werden!",
-    "Application Token": "Anwendungs Token",
-    "Server URL": "Server URL",
-    Priority: "Priorität",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Kanalname",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Weitere Informationen zu Webhooks auf: {0}",
-    aboutChannelName: "Gebe den Kanalnamen ein in {0} Feld Kanalname, falls du den Webhook-Kanal umgehen möchtest. Ex: #other-channel",
-    aboutKumaURL: "Wenn das Feld für die Uptime Kuma URL leer gelassen wird, wird standardmäßig die GitHub Projekt Seite verwendet.",
-    emojiCheatSheet: "Emoji Cheat Sheet: {0}",
-    "User Key": "Benutzerschlüssel",
-    Device: "Gerät",
-    "Message Title": "Nachrichtentitel",
-    "Notification Sound": "Benachrichtigungston",
-    "More info on:": "Mehr Infos auf: {0}",
-    pushoverDesc1: "Notfallpriorität (2) hat standardmäßig 30 Sekunden Auszeit zwischen den Versuchen und läuft nach 1 Stunde ab.",
-    pushoverDesc2: "Fülle das Geräte Feld aus, wenn du Benachrichtigungen an verschiedene Geräte senden möchtest.",
-    "SMS Type": "SMS Typ",
-    octopushTypePremium: "Premium (Schnell - zur Benachrichtigung empfohlen)",
-    octopushTypeLowCost: "Kostengünstig (Langsam - manchmal vom Betreiber gesperrt)",
-    checkPrice: "Prüfe {0} Preise:",
-    octopushLegacyHint: "Verwendest du die Legacy-Version von Octopush (2011-2020) oder die neue Version?",
-    "Check octopush prices": "Vergleiche die Oktopush Preise {0}.",
-    octopushPhoneNumber: "Telefonnummer (Internationales Format, z.B : +49612345678) ",
-    octopushSMSSender: "Name des SMS-Absenders : 3-11 alphanumerische Zeichen und Leerzeichen (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Geräte ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Beispiel: {0}",
-    "Read more:": "Weiterlesen: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Weiterlesen",
-    appriseInstalled: "Apprise ist installiert.",
-    appriseNotInstalled: "Apprise ist nicht installiert. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Basic Settings",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Du kannst einen Link zu einem Bild in 'Icon URL' übergeben um das Standardprofilbild zu überschreiben. Wird nicht verwendet, wenn ein Icon Emoji gesetzt ist.",
-    aboutMattermostChannelName: "Du kannst den Standardkanal, auf dem der Webhook gesendet wird überschreiben, indem der Kanalnamen in das Feld 'Channel Name' eingeben wird. Dies muss in den Mattermost Webhook-Einstellungen aktiviert werden. Ex: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - billig, aber langsam und oft überladen. Auf polnische Empfänger beschränkt.",
-    promosmsTypeFlash: "SMS FLASH - Die Nachricht wird automatisch auf dem Empfängergerät angezeigt. Auf polnische Empfänger beschränkt.",
-    promosmsTypeFull: "SMS FULL - Premium Stufe von SMS, es kann der Absendernamen verwendet werden (Der Name musst zuerst registriert werden). Zuverlässig für Warnungen.",
-    promosmsTypeSpeed: "SMS SPEED - Höchste Priorität im System. Sehr schnell und zuverlässig, aber teuer (Ungefähr das doppelte von SMS FULL).",
-    promosmsPhoneNumber: "Telefonnummer (für polnische Empfänger können die Vorwahlen übersprungen werden)",
-    promosmsSMSSender: "Name des SMS-Absenders : vorregistrierter Name oder einer der Standardwerte: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu Webhook URL",
-    matrixHomeserverURL: "Heimserver URL (mit http(s):// und optionalen Ports)",
-    "Internal Room Id": "Interne Raum-ID",
-    matrixDesc1: "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Der Header ist kein gültiges JSON: ",
-    BodyInvalidFormat: "Der Body ist kein gültiges JSON: ",
-    "Monitor History": "Monitor Verlauf",
-    clearDataOlderThan: "Bewahre die Monitor-Verlaufsdaten für {0} Tage auf.",
-    PasswordsDoNotMatch: "Passwörter stimmen nicht überein.",
-    records: "Einträge",
-    "One record": "Ein Eintrag",
-    steamApiKeyDescription: "Um einen Steam Game Server zu überwachen, wird ein Steam Web-API-Schlüssel benötigt. Dieser kann hier registriert werden: ",
-    "Current User": "Aktueller Benutzer",
-    recent: "Letzte",
-    Done: "Fertig",
-    Info: "Info",
-    Security: "Sicherheit",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Datenbank verkleinern",
-    "Pick a RR-Type...": "Wähle ein RR-Typ aus...",
-    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
-    Default: "Standard",
-    "HTTP Options": "HTTP Optionen",
-    "Create Incident": "Vorfall erstellen",
-    Title: "Titel",
-    Content: "Inhalt",
-    Style: "Stil",
-    info: "info",
-    warning: "warnung",
-    danger: "gefahr",
-    primary: "primär",
-    light: "hell",
-    dark: "dunkel",
-    Post: "Eintrag",
-    "Please input title and content": "Bitte Titel und Inhalt eingeben",
-    Created: "Erstellt",
-    "Last Updated": "Zuletzt aktualisiert",
-    Unpin: "Loslösen",
-    "Switch to Light Theme": "Zu hellem Thema wechseln",
-    "Switch to Dark Theme": "Zum dunklen Thema wechseln",
-    "Show Tags": "Tags anzeigen",
-    "Hide Tags": "Tags ausblenden",
-    Description: "Beschreibung",
-    "No monitors available.": "Keine Monitore verfügbar.",
-    "Add one": "Hinzufügen",
-    "No Monitors": "Keine Monitore",
-    "Untitled Group": "Gruppe ohne Titel",
-    Services: "Dienste",
-    Discard: "Verwerfen",
-    Cancel: "Abbrechen",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Benutzername (inkl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Passwort",
-    serwersmsPhoneNumber: "Telefonnummer",
-    serwersmsSenderName: "Name des SMS-Absenders (über Kundenportal registriert)",
-    stackfield: "Stackfield",
-    clicksendsms: "ClickSend SMS",
-    apiCredentials: "API Zugangsdaten",
-    smtpDkimSettings: "DKIM Einstellungen",
-    smtpDkimDesc: "Details zur Konfiguration sind in der Nodemailer DKIM {0} zu finden.",
-    documentation: "Dokumentation",
-    smtpDkimDomain: "Domain Name",
-    smtpDkimKeySelector: "Schlüssel Auswahl",
-    smtpDkimPrivateKey: "Privater Schlüssel",
-    smtpDkimHashAlgo: "Hash-Algorithmus (Optional)",
-    smtpDkimheaderFieldNames: "Zu validierende Header-Schlüssel (optional)",
-    smtpDkimskipFields: "Zu ignorierende Header Schlüssel (optional)",
-    PushByTechulus: "Push by Techulus",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpunkt",
-    alertaEnvironment: "Umgebung",
-    alertaApiKey: "API Schlüssel",
-    alertaAlertState: "Alarmstatus",
-    alertaRecoverState: "Wiederherstellungsstatus",
-    deleteStatusPageMsg: "Bist du sicher, dass du diese Status-Seite löschen willst?",
-    Proxies: "Proxies",
-    default: "Standard",
-    enabled: "Aktiviert",
-    setAsDefault: "Als Standard setzen",
-    deleteProxyMsg: "Bist du sicher, dass du diesen Proxy für alle Monitore löschen willst?",
-    proxyDescription: "Proxies müssen einem Monitor zugewiesen werden, um zu funktionieren.",
-    enableProxyDescription: "Dieser Proxy wird keinen Effekt auf Monitor-Anfragen haben, bis er aktiviert ist. Du kannst ihn temporär von allen Monitoren nach Aktivierungsstatus deaktivieren.",
-    setAsDefaultProxyDescription: "Dieser Proxy wird standardmäßig für alle neuen Monitore aktiviert sein. Du kannst den Proxy immer noch für jeden Monitor einzeln deaktivieren.",
-    "Certificate Chain": "Zertifikatskette",
-    Valid: "Gültig",
-    Invalid: "Ungültig",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "Telefonnummern",
-    TemplateCode: "Vorlagencode",
-    SignName: "Signaturname",
-    "Sms template must contain parameters: ": "SMS Vorlage muss folgende Parameter enthalten: ",
-    "Bark Endpoint": "Bark Endpunkt",
-    WebHookUrl: "Webhook URL",
-    SecretKey: "Geheimer Schlüssel",
-    "For safety, must use secret key": "Zur Sicherheit muss ein geheimer Schlüssel verwendet werden",
-    "Device Token": "Gerätetoken",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Hoch",
-    Retry: "Wiederholungen",
-    Topic: "Thema",
-    "WeCom Bot Key": "WeCom Bot Schlüssel",
-    "Setup Proxy": "Proxy einrichten",
-    "Proxy Protocol": "Proxy Protokoll",
-    "Proxy Server": "Proxy-Server",
-    "Proxy server has authentication": "Proxy-Server hat Authentifizierung",
-    User: "Benutzer",
-    Installed: "Installiert",
-    "Not installed": "Nicht installiert",
-    Running: "Läuft",
-    "Not running": "Gestoppt",
-    "Remove Token": "Token entfernen",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Neue Status-Seite hinzufügen",
-    Slug: "Slug",
-    "Accept characters:": "Akzeptierte Zeichen:",
-    startOrEndWithOnly: "Nur mit {0} anfangen und enden",
-    "No consecutive dashes": "Keine aufeinanderfolgenden Bindestriche",
-    Next: "Weiter",
-    "The slug is already taken. Please choose another slug.": "Der Slug ist bereits in Verwendung. Bitte wähle einen anderen.",
-    "No Proxy": "Kein Proxy",
-    Authentication: "Authentifizierung",
-    "HTTP Basic Auth": "HTTP Basisauthentifizierung",
-    "New Status Page": "Neue Status-Seite",
-    "Page Not Found": "Seite nicht gefunden",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Sicherung",
-    About: "Über",
-    wayToGetCloudflaredURL: "(Lade cloudflared von {0} herunter)",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Nachricht:",
-    "Don't know how to get the token? Please read the guide:": "Du weißt nicht, wie man den Token bekommt? Lies die Anleitung dazu:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Die aktuelle Verbindung kann unterbrochen werden, wenn du aktuell über Cloudflare Tunnel verbunden bist. Bist du sicher, dass du es stoppen willst? Gib zur Bestätigung dein aktuelles Passwort ein.",
-    "Other Software": "Andere Software",
-    "For example: nginx, Apache and Traefik.": "Zum Beispiel: nginx, Apache und Traefik.",
-    "Please read": "Bitte lesen",
-    "Subject:": "Betreff:",
-    "Valid To:": "Gültig bis:",
-    "Days Remaining:": "Tage verbleibend:",
-    "Issuer:": "Aussteller:",
-    "Fingerprint:": "Fingerabdruck:",
-    "No status pages": "Keine Status-Seiten",
-    "Domain Name Expiry Notification": "Benachrichtigung bei Ablauf des Domainnamens",
-    Customize: "Anpassen",
-    "Custom Footer": "Eigener Footer",
-    "Custom CSS": "Eigenes CSS",
-    "Footer Text": "Fußzeile",
-    "Show Powered By": "Zeige 'Powered By'",
-    "Date Created": "Erstellt am",
-    "Domain Names": "Domainnamen",
-    signedInDisp: "Angemeldet als {0}",
-    signedInDispDisabled: "Authentifizierung deaktiviert.",
-    dnsPortDescription: "DNS server port. Standard ist 53. Der Port kann jederzeit geändert werden.",
-    topic: "Thema",
-    topicExplanation: "MQTT Thema für den monitor",
-    successMessage: "Erfolgsnachricht",
-    successMessageExplanation: "MQTT Nachricht, die als Erfolg angesehen wird",
-    error: "Fehler",
-    critical: "kritisch",
-    wayToGetPagerDutyKey: "Dieser kann unter Service -> Service Directory -> (Select a service) -> Integrations -> Add integration gefunden werden. Hier muss nach \"Events API V2\" gesucht werden. Mehr informationen {0}",
-    "Integration Key": "Schlüssel der Integration",
-    "Integration URL": "URL der Integration",
-    "Auto resolve or acknowledged": "Automatisch lösen oder bestätigen",
-    "do nothing": "nichts tun",
-    "auto acknowledged": "automatisch bestätigen",
-    "auto resolve": "automatisch lösen",
-    "Bark Group": "Bark Gruppe",
-    "Bark Sound": "Bark Klang",
-    "HTTP Headers": "HTTP Kopfzeilen",
-    "Trust Proxy": "Vertrauenswürdiger Proxy",
-    Proxy: "Proxy",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Adresse",
-    onebotMessageType: "OneBot Nachrichtentyp",
-    onebotGroupMessage: "Gruppe",
-    onebotPrivateMessage: "Privat",
-    onebotUserOrGroupId: "Gruppe/Nutzer ID",
-    onebotSafetyTips: "Zur Sicherheit ein access token setzen",
-    "PushDeer Key": "PushDeer Schlüssel",
-    RadiusSecret: "Radius Geheimnis",
-    RadiusSecretDescription: "Geteiltes Geheimnis zwischen Client und Server",
-    RadiusCalledStationId: "ID der angesprochenen Station",
-    RadiusCalledStationIdDescription: "Identifikation des angesprochenen Geräts",
-    RadiusCallingStationId: "ID der ansprechenden Station",
-    RadiusCallingStationIdDescription: "Identifikation des ansprechenden Geräts",
-    "Certificate Expiry Notification": "Benachrichtigung ablaufendes Zertifikat",
-    "API Username": "API Nutzername",
-    "API Key": "API Schlüssel",
-    "Recipient Number": "Empfängernummer",
-    "From Name/Number": "Von Name/Nummer",
-    "Leave blank to use a shared sender number.": "Leer lassen um eine geteilte Absendernummer zu nutzen.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "Endpunkt",
-    octopushAPIKey: "\"API Schlüssel\" der HTTP API Zugangsdaten im control panel",
-    octopushLogin: "\"Login\" der HTTP API Zugangsdaten im control panel",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (Standard)",
-    "pushoversounds bike": "Fahrrad",
-    "pushoversounds bugle": "Signalhorn",
-    "pushoversounds cashregister": "Kasse",
-    "pushoversounds classical": "Klassisch",
-    "pushoversounds cosmic": "Kosmisch",
-    "pushoversounds falling": "Abfallend",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Eingang",
-    "pushoversounds intermission": "Pause",
-    "pushoversounds magic": "Magisch",
-    "pushoversounds mechanical": "Mechanisch",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Sirene",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Schlepper Horn",
-    "pushoversounds alien": "Außerirdisch (lang)",
-    "pushoversounds climb": "Ansteigende (lang)",
-    "pushoversounds persistent": "Hartnäckig (lang)",
-    "pushoversounds echo": "Pushover Echo (lang)",
-    "pushoversounds updown": "Auf und Ab (lang)",
-    "pushoversounds vibrate": "Nur vibrieren",
-    "pushoversounds none": "Nichts (Stille)",
-    pushyAPIKey: "Geheimer API Schlüssel",
-    pushyToken: "Gerätetoken",
-    "Show update if available": "Verfügbare Updates anzeigen",
-    "Also check beta release": "Auch nach Beta Versionen schauen",
-    "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
-    "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Wahrscheinliche Ursachen:",
-    "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
-    "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
-    "What you can try:": "Was du versuchen kannst:",
-    "Retype the address.": "Schreibe die Adresse erneut.",
-    "Go back to the previous page.": "Gehe zur vorigen Seite.",
-    "Coming Soon": "Kommt bald",
-    wayToGetClickSendSMSToken: "Du kannst einen API Nutzernamen und Schlüssel unter {0} erhalten.",
-    "Connection String": "Verbindungstext",
-    Query: "Abfrage",
-    settingsCertificateExpiry: "TLS Zertifikatsablauf",
-    certificationExpiryDescription: "HTTPS Monitore senden eine Benachrichtigung, wenn das Zertifikat abläuft in:",
-    "Setup Docker Host": "Docker Host einrichten",
-    "Connection Type": "Verbindungstyp",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Bist du sicher diesen docker host für alle Monitore zu löschen?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Thema",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
-    trustProxyDescription: "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
-    wayToGetLineNotifyToken: "Du kannst hier ein Token erhalten: {0}",
-    Examples: "Beispiele",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Lange gültiges Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
-    "Notification Service": "Benachrichtigungsdienst",
-    "default: notify all devices": "standard: Alle Geräte benachrichtigen",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
-    "Automations can optionally be triggered in Home Assistant:": "Automatisierungen können optional im Home Assistant ausgelöst werden:",
-    "Trigger type:": "Auslöser:",
-    "Event type:": "Ereignistyp:",
-    "Event data:": "Ereignis daten:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
-    "Frontend Version": "Frontend Version",
-    "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
-    Maintenance: "Wartung",
-    statusMaintenance: "Wartung",
-    "Schedule maintenance": "Geplante Wartung",
-    "Affected Monitors": "Betroffene Monitore",
-    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
-    "Start of maintenance": "Beginn der Wartung",
-    "All Status Pages": "Alle Status Seiten",
-    "Select status pages...": "Statusseiten auswählen...",
-    recurringIntervalMessage: "Einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
-    affectedMonitorsDescription: "Wähle Monitore aus, die von der aktuellen Wartung betroffen sind",
-    affectedStatusPages: "Diese Wartungsmeldung auf ausgewählten Statusseiten anzeigen",
-    atLeastOneMonitor: "Wähle mindestens einen Monitor",
-    deleteMaintenanceMsg: "Möchtest du diese Wartung löschen?",
-    "Base URL": "Basis URL",
-    goAlertInfo: "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
-    goAlertIntegrationKeyInfo: "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Veraltet: Da viele Funktionen hinzugefügt wurden und diese Sicherungsfunktion nicht mehr gepflegt wird, kann sie keine vollständige Sicherung erstellen oder wiederherstellen.",
-    backupRecommend: "Bitte sichere stattdessen das Volume oder den Datenordner (./data/) direkt.",
-    Optional: "Optional",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Dokumente",
-    "Gateway Type": "Gateway Type",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Du kannst Zahlen teilen mit",
-    or: "oder",
-    recurringInterval: "Intervall",
-    Recurring: "Wiederkehrend",
-    "Single Maintenance Window": "Einzigartiges Wartungsfenster",
-    "Maintenance Time Window of a Day": "Zeitfenster für die Wartung",
-    "Effective Date Range": "Bereich der Wirksamkeitsdaten",
-    strategyManual: "Aktiv/Inaktiv Manuell",
-    warningTimezone: "Es wird die Zeitzone des Servers verwendet",
-    weekdayShortMon: "Mo",
-    weekdayShortTue: "Di",
-    weekdayShortWed: "Mi",
-    weekdayShortThu: "Do",
-    weekdayShortFri: "Fr",
-    weekdayShortSat: "Sa",
-    weekdayShortSun: "So",
-    dayOfWeek: "Tag der Woche",
-    dayOfMonth: "Tag im Monat",
-    lastDay: "Letzter Tag",
-    lastDay1: "Letzter Tag im Monat",
-    lastDay2: "Vorletzer Tag im Monat",
-    lastDay3: "3. letzter Tag im Monat",
-    lastDay4: "4. letzter Tag im Monat",
-    "No Maintenance": "Keine Wartung",
-    "Schedule Maintenance": "Wartung planen",
-    pauseMaintenanceMsg: "Möchtest du wirklich pausieren?",
-    "maintenanceStatus-under-maintenance": "Unter Wartung",
-    "maintenanceStatus-inactive": "Inaktiv",
-    "maintenanceStatus-scheduled": "Geplant",
-    "maintenanceStatus-ended": "Ende",
-    "maintenanceStatus-unknown": "Unbekannt",
-    "Display Timezone": "Zeitzone anzeigen",
-    "Server Timezone": "Server Zeitzone",
-    "Date and Time": "Datum und Zeit",
-    "DateTime Range": "Datums- und Zeitbereich",
-    Strategy: "Strategie",
-    statusPageMaintenanceEndDate: "Ende",
-};
diff --git a/src/languages/el-GR.js b/src/languages/el-GR.js
deleted file mode 100644
index 9b7c4cfb..00000000
--- a/src/languages/el-GR.js
+++ /dev/null
@@ -1,587 +0,0 @@
-export default {
-    languageName: "Ελληνικά",
-    checkEverySecond: "Έλεγχος κάθε {0} δευτερόλεπτα",
-    retryCheckEverySecond: "Επανάληψη κάθε {0} δευτερόλεπτα",
-    resendEveryXTimes: "Επανάληψη αποστολής ειδοποίησης κάθε {0} φορές",
-    resendDisabled: "Η επανάληψη αποστολής ειδοποίησης είναι απενεργοποιημένη",
-    retriesDescription: "Μέγιστες επαναλήψεις προτού η υπηρεσία επισημανθεί ως κατω και σταλεί μια ειδοποίηση",
-    ignoreTLSError: "Παράβλεψη σφάλματος TLS/SSL για ιστότοπους HTTPS",
-    upsideDownModeDescription: "Αναποδογυρίστε την κατάσταση. Εάν η υπηρεσία είναι προσβάσιμη, είναι ΚΑΤΩ.",
-    maxRedirectDescription: "Μέγιστος αριθμός redirect που θα ακολουθήσουν. Ρυθμίστε το 0 για να απενεργοποιήσετε τα redirect.",
-    acceptedStatusCodesDescription: "Επιλέξτε κωδικούς κατάστασης που θεωρούνται επιτυχή.",
-    passwordNotMatchMsg: "Ο κωδικός δεν ταιριάζει.",
-    notificationDescription: "Οι ειδοποιήσεις πρέπει να εκχωρηθούν σε μια παρακολούθηση για να λειτουργήσουν.",
-    keywordDescription: "Αναζήτηση λέξης-κλειδιού σε απλή απόκριση HTML ή JSON. Η αναζήτηση είναι διάκριση πεζών-κεφαλαίων.",
-    pauseDashboardHome: "Παύση",
-    deleteMonitorMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την παρακολούθηση;",
-    deleteNotificationMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την ειδοποίηση για όλες τις παρακολούθησης?",
-    dnsPortDescription: "Θύρα διακομιστή DNS. Προεπιλογή σε 53. Μπορείτε να αλλάξετε τη θύρα ανά πάσα στιγμή.",
-    resolverserverDescription: "Το Cloudflare είναι ο προεπιλεγμένος διακομιστής. Μπορείτε να αλλάξετε τον διακομιστή επίλυσης ανά πάσα στιγμήhe default server. You can change the resolver server anytime.",
-    rrtypeDescription: "Επιλέξτε τον τύπο RR που θέλετε να παρακολουθήσετε",
-    pauseMonitorMsg: "Είστε βέβαιοι ότι θέλετε να κάνετε παύση;",
-    enableDefaultNotificationDescription: "Αυτή η ειδοποίηση θα είναι ενεργοποιημένη από προεπιλογή για νέες παρακολούθησης. Μπορείτε ακόμα να απενεργοποιήσετε την ειδοποίηση ξεχωριστά για κάθε παρακολούθηση.",
-    clearEventsMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα συμβάντα για αυτήν την παρακολούθηση;",
-    clearHeartbeatsMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλους τους καρδιακούς παλμούς για αυτήν την παρακολούθηση;",
-    confirmClearStatisticsMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε ΟΛΑ τα στατιστικά στοιχεία;?",
-    importHandleDescription: "Επιλέξτε «Παράλειψη υπάρχοντος» εάν θέλετε να παραλείψετε κάθε παρακολούθηση ή ειδοποίηση με το ίδιο όνομα. Το 'Overwrite' θα διαγράψει κάθε υπάρχουσα παρακολούθηση και ειδοποίηση.",
-    confirmImportMsg: "Είστε βέβαιοι ότι θέλετε να εισαγάγετε το αντίγραφο ασφαλείας; Επαληθεύστε ότι έχετε επιλέξει τη σωστή επιλογή.",
-    twoFAVerifyLabel: "Εισαγάγετε το 2FA κωδικό για να επαληθεύσετε: ",
-    tokenValidSettingsMsg: "Ο κωδικός 2FA είναι έγκυρο! Τώρα μπορείτε να αποθηκεύσετε τις ρυθμίσεις 2FA",
-    confirmEnableTwoFAMsg: "Είστε βέβαιοι ότι θέλετε να ενεργοποιήσετε το 2FA;",
-    confirmDisableTwoFAMsg: "Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε το 2FA;",
-    Settings: "Ρυθμίσεις",
-    Dashboard: "Πίνακας",
-    "New Update": "Νέα αναβάθμιση",
-    Language: "Γλώσσα",
-    Appearance: "Εμφάνιση",
-    Theme: "Θέμα",
-    General: "Γενικά",
-    "Primary Base URL": "Κύρια βασική διεύθυνση URL",
-    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: "Current",
-    Uptime: "Χρόνος λειτουργίας",
-    "Cert Exp.": "Cert Exp.",
-    day: "ημέρα | ημέρες",
-    "-day": "-ημέρα",
-    hour: "ώρα",
-    "-hour": "-ώρα",
-    Response: "Απάντηση",
-    Ping: "Ping",
-    "Monitor Type": "Τύπος παρακολούθησης",
-    Keyword: "Λέξη-κλειδί",
-    "Friendly Name": "Φιλικό όνομα",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Διάστημα καρδιακών παλμών",
-    Retries: "Επαναλήψεις",
-    "Heartbeat Retry Interval": "Διάστημα επανάληψης παλμών καρδιάς",
-    "Resend Notification if Down X times consequently": "Αποστολή νέας ειδοποίησης εάν κατω X φορές κατά συνέχεια",
-    Advanced: "Προχωρημένα",
-    "Upside Down Mode": "Ανάποδη λειτουργία",
-    "Max. Redirects": "Μέγιστη. Ανακατευθύνσεις",
-    "Accepted Status Codes": "Αποδεκτοί Κωδικοί Κατάστασης",
-    "Push URL": "Push URL",
-    needPushEvery: "Θα πρέπει να καλείτε αυτήν τη διεύθυνση URL κάθε {0} δευτερόλεπτα.",
-    pushOptionalParams: "Προαιρετικές παράμετροι: {0}",
-    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": "Ενεργοποίηση ελέγχου ταυτότητας",
-    "disableauth.message1": "Είστε βέβαιοι ότι θέλετε να <strong>απενεργοποιήσετε τον έλεγχο ταυτότητας</strong>;",
-    "disableauth.message2": "Έχει σχεδιαστεί για σενάρια <strong>όπου σκοπεύετε να εφαρμόσετε έλεγχο ταυτότητας τρίτου μέρους</strong> μπροστά από το Uptime Kuma, όπως το Cloudflare Access, Authelia ή άλλους μηχανισμούς ελέγχου ταυτότητας.",
-    "Please use this option carefully!": "Χρησιμοποιήστε αυτή την επιλογή προσεκτικά!",
-    Logout: "Αποσύνδεση",
-    Leave: "Φύγετε",
-    "I understand, please disable": "Καταλαβαίνω, απενεργοποιήστε",
-    Confirm: "Επιβεβαίωση",
-    Yes: "Ναί",
-    No: "Οχι",
-    Username: "Όνομα χρήστη",
-    Password: "Κωδικός πρόσβασης",
-    "Remember me": "Θυμήσου με",
-    Login: "Σύνδεση",
-    "No Monitors, please": "Δεν υπάρχουν παρακολούθησης παρακαλώ",
-    "add one": "προσθέστε ένα",
-    "Notification Type": "Είδος ειδοποίησης",
-    Email: "Email",
-    Test: "Δοκιμή",
-    "Certificate Info": "Πληροφορίες πιστοποιητικού",
-    "Resolver Server": "Διακομιστής επίλυσης",
-    "Resource Record Type": "Τύπος εγγραφής πόρων",
-    "Last Result": "Τελευταίο Αποτέλεσμα",
-    "Create your admin account": "Δημιουργήστε τον λογαριασμό διαχειριστή σας",
-    "Repeat Password": "Επαναλάβετε τον κωδικό πρόσβασης",
-    "Import Backup": "Εισαγωγή αντιγράφων ασφαλείας",
-    "Export Backup": "Εξαγωγή αντιγράφων ασφαλείας",
-    Export: "Εξαγωγή",
-    Import: "Εισαγωγή",
-    respTime: "Χρόν. Aπό (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Προεπιλογή ενεργοποιημένη",
-    "Apply on all existing monitors": "Εφαρμόστε σε όλες τις υπάρχουσες παρακολούθησης",
-    Create: "Δημιουργία",
-    "Clear Data": "Καθαρισμός δεδομένων",
-    Events: "Γεγονότα",
-    Heartbeats: "Παλμοι καρδιας",
-    "Auto Get": "Αυτόματη λήψη",
-    backupDescription: "Μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας γία ολλες της παρακολούθησης και ειδοποιήσης σε ένα αρχείο JSON.",
-    backupDescription2: "Σημείωση: δεν περιλαμβάνονται δεδομένα ιστορικού και συμβάντων.",
-    backupDescription3: "Στο αρχείο εξαγωγής περιλαμβάνονται ευαίσθητα δεδομένα, όπως token ειδοποιήσεων. Aποθηκεύστε την εξαγωγή με ασφάλεια.",
-    alertNoFile: "Επιλέξτε ένα αρχείο για εισαγωγή.",
-    alertWrongFileType: "Επιλέξτε ένα αρχείο JSON.",
-    "Clear all statistics": "Εκκαθάριση όλων των στατιστικών",
-    "Skip existing": "Παράβλεψη υπάρχοντος",
-    Overwrite: "Αντικατάσταση",
-    Options: "Επιλογές",
-    "Keep both": "Κράτα και τα δύο",
-    "Verify Token": "Επαλήθευση Token",
-    "Setup 2FA": "Ρύθμιση 2FA",
-    "Enable 2FA": "Ενεργοποίηση 2FA",
-    "Disable 2FA": "Απενεργοποίηση 2FA",
-    "2FA Settings": "Ρυθμίσεις 2FA",
-    "Two Factor Authentication": "Έλεγχος ταυτότητας δύο παραγόντων",
-    Active: "Ενεργός",
-    Inactive: "Ανενεργό",
-    Token: "Token",
-    "Show URI": "Εμφάνιση URI",
-    Tags: "Ετικέτες",
-    "Add New below or Select...": "Προσθήκη νέου παρακάτω ή Επιλέξτε...",
-    "Tag with this name already exist.": "Υπάρχει ήδη η ετικέτα με αυτό το όνομα.",
-    "Tag with this value already exist.": "Υπάρχει ήδη ετικέτα με αυτό το value.",
-    color: "χρώμα",
-    "value (optional)": "value (optional)",
-    Gray: "Γκρί",
-    Red: "Κόκκινο",
-    Orange: "Πορτοκάλι",
-    Green: "Πράσινο",
-    Blue: "Μπλε",
-    Indigo: "Indigo",
-    Purple: "Μωβ",
-    Pink: "Ροζ",
-    "Search...": "Αναζήτηση...",
-    "Avg. Ping": "Μέσo.Ping",
-    "Avg. Response": "Μέσo. Aπάντηση",
-    "Entry Page": "Σελίδα εισαγωγής",
-    statusPageNothing: "Δεν υπάρχει τίποτα εδώ, προσθέστε μια ομάδα ή μια παρακολούθηση.",
-    "No Services": "Δεν υπάρχουν υπηρεσίες",
-    "All Systems Operational": "Όλα τα συστήματα λειτουργούν",
-    "Partially Degraded Service": "Μερικώς υποβαθμισμένη υπηρεσία",
-    "Degraded Service": "Υποβαθμισμένη υπηρεσία",
-    "Add Group": "Προσθήκη γρουπ",
-    "Add a monitor": "Προσθήκη παρακολούθησης",
-    "Edit Status Page": "Επεξεργασία σελίδας κατάστασης",
-    "Go to Dashboard": "Μεταβείτε στον Πίνακα ελέγχου",
-    "Status Page": "Σελίδα κατάστασης",
-    "Status Pages": "Σελίδες κατάστασης",
-    defaultNotificationName: "Η ειδοποίηση μου {notification} ({number})",
-    here: "εδώ",
-    Required: "Απαιτείται",
-    telegram: "Telegram",
-    "ZohoCliq": "ZohoCliq",
-    "Bot Token": "Διακριτικό Bot",
-    wayToGetTelegramToken: "Μπορείτε να πάρετε ένα διακριτικό από {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "Μπορείτε να λάβετε το αναγνωριστικό συνομιλίας σας στέλνοντας ένα μήνυμα στο bot και μεταβαίνοντας σε αυτήν τη διεύθυνση URL για να προβάλετε το chat_id:",
-    "YOUR BOT TOKEN HERE": "ΤΟ BOT ΣΑΣ ΔΙΑΚΡΙΤΙΚΌ ΕΔΩ",
-    chatIDNotFound: "Το Chat ID δεν βρέθηκε. Στείλτε πρώτα ένα μήνυμα σε αυτό το bot",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Τύπος περιεχομένου",
-    webhookJsonDesc: "{0} είναι καλό για οποιονδήποτε σύγχρονο διακομιστή HTTP όπως το Express.js",
-    webhookFormDataDesc: "{multipart} είναι καλό για την PHP. Το JSON θα πρέπει να αναλυθεί με {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Παράβλεψη σφάλματος TLS",
-    "From Email": "Από Email",
-    emailCustomSubject: "Προσαρμοσμένο θέμα",
-    "To Email": "Προς Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Μπορείτε να το αποκτήσετε μεταβαίνοντας στις Ρυθμίσεις διακομιστή -> Ενσωματώσεις -> Δημιουργία Webhook",
-    "Bot Display Name": "Εμφανιζόμενο όνομα bot",
-    "Prefix Custom Message": "Προσαρμοσμένο μήνυμα",
-    "Hello @everyone is...": "Γεια {'@'}everyone ειναι...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
-    wayToGetZohoCliqURL: "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
-    signal: "Signal",
-    Number: "Αριθμός",
-    Recipients: "Αποδέκτες",
-    needSignalAPI: "Πρέπει να έχετε ένα signal client με REST API..",
-    wayToCheckSignalURL: "Μπορείτε να ελέγξετε αυτό το URL για να δείτε πώς να ρυθμίσετε ένα:",
-    signalImportant: "ΣΗΜΑΝΤΙΚΟ: Δεν μπορείτε να συνδυάσετε ομάδες και αριθμούς στους παραλήπτες!",
-    gotify: "Gotify",
-    "Application Token": "Token εφαρμογής",
-    "Server URL": "URL διακομιστή",
-    Priority: "Προτεραιότητα",
-    slack: "Slack",
-    "Icon Emoji": "Εικονίδιο Emoji",
-    "Channel Name": "Όνομα καναλιού",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Περισσότερες πληροφορίες σχετικά με τα Webhooks στο: {0}",
-    aboutChannelName: "Εισαγάγετε το όνομα του καναλιού στο {0} Όνομα καναλιού εάν θέλετε να παρακάμψετε το κανάλι Webhook. Π.χ.: #other-channel",
-    aboutKumaURL: "Εάν αφήσετε κενό το πεδίο URL Uptime Kuma, θα είναι προεπιλεγμένο στη σελίδα Project GitHub..",
-    emojiCheatSheet: "Φύλλο εξαπάτησης emoji: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Κλειδί χρήστη",
-    Device: "Συσκευή",
-    "Message Title": "Τίτλος μηνύματος",
-    "Notification Sound": "Ήχος ειδοποίησης",
-    "More info on:": "Περισσότερες πληροφορίες στο: {0}",
-    pushoverDesc1: "Η προτεραιότητα έκτακτης ανάγκης (2) έχει προεπιλεγμένο χρονικό όριο 30 δευτερολέπτων μεταξύ των επαναλήψεων και θα λήξει μετά από 1 ώρα.",
-    pushoverDesc2: "Εάν θέλετε να στέλνετε ειδοποιήσεις σε διαφορετικές συσκευές, συμπληρώστε το πεδίο Συσκευή.",
-    "SMS Type": "Τύπος SMS",
-    octopushTypePremium: "Premium (Γρήγορη - συνιστάται για ειδοποίηση)",
-    octopushTypeLowCost: "Χαμηλό κόστος (Αργό - μερικές φορές μπλοκάρεται από τον χειριστή)",
-    checkPrice: "Ελέγξτε τις τιμές {0}:",
-    apiCredentials: "API credentials",
-    octopushLegacyHint: "Χρησιμοποιείτε την παλαιού τύπου έκδοση του Octopush (2011-2020) ή τη νέα έκδοση;",
-    "Check octopush prices": "Ελέγξτε τις τιμές OctoPush {0}.",
-    octopushPhoneNumber: "Αριθμός τηλεφώνου (διεθνής μορφή, π.χ.: +30694345678)",
-    octopushSMSSender: "Όνομα αποστολέα SMS: 3-11 αλφαριθμητικοί χαρακτήρες και διάστημα (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Παράδειγμα: {0}",
-    "Read more:": "Διαβάστε περισσότερα: {0}",
-    "Status:": "Κατάσταση: {0}",
-    "Read more": "Διαβάστε περισσότερα",
-    appriseInstalled: "Το Apprise έχει εγκατασταθεί.",
-    appriseNotInstalled: "Το Apprise δεν έχει εγκατασταθεί. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel Access Token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Βασικές ρυθμίσεις",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Πρώτα αποκτήστε πρόσβαση στο {0}, δημιουργήστε έναν πάροχο και ένα κανάλι (Messanging API) και, στη συνέχεια, μπορείτε να λάβετε το channel access token και το user ID από τα παραπάνω στοιχεία μενού.",
-    "Icon URL": "Διεύθυνση URL εικονιδίου",
-    aboutIconURL: "Μπορείτε να παρέχετε έναν σύνδεσμο προς μια εικόνα στο \"Icon URL\" για να παρακάμψετε την προεπιλεγμένη εικόνα προφίλ. Δεν θα χρησιμοποιηθεί εάν έχει οριστεί το εικονίδιο Emoji.",
-    aboutMattermostChannelName: "Μπορείτε να παρακάμψετε το προεπιλεγμένο κανάλι στο οποίο δημοσιεύει το Webhook εισάγοντας το όνομα του καναλιού στο πεδίο \"Όνομα καναλιού\". Αυτό πρέπει να ενεργοποιηθεί στις ρυθμίσεις του Mattermost Webhook. Π.χ.: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - φθηνό αλλά αργό και συχνά υπερφορτωμένο. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
-    promosmsTypeFlash: "SMS FLASH - Το μήνυμα θα εμφανίζεται αυτόματα στη συσκευή του παραλήπτη. Περιορίζεται μόνο σε Πολωνούς παραλήπτες.",
-    promosmsTypeFull: "SMS FULL - Premium επίπεδο SMS, Μπορείτε να χρησιμοποιήσετε το Όνομα Αποστολέα σας (Πρέπει πρώτα να καταχωρήσετε το όνομα). Αξιόπιστο για ειδοποιήσεις.",
-    promosmsTypeSpeed: "SMS SPEED - Υψηλότερη προτεραιότητα στο σύστημα. Πολύ γρήγορο και αξιόπιστο αλλά ακριβό (περίπου διπλάσια τιμή SMS FULL).",
-    promosmsPhoneNumber: "Αριθμός τηλεφώνου (για πολωνούς παραλήπτες Μπορείτε να παραλείψετε τους κωδικούς περιοχής)",
-    promosmsSMSSender: "Όνομα αποστολέα SMS: Προεγγεγραμμένο όνομα ή ένα από τα προεπιλεγμένα: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (με http(s):// και προαιρετικά θύρα)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "Μπορείτε να βρείτε το internal room ID ανατρέχοντας στην ενότητα για προχωρημένους των ρυθμίσεων δωματίου στο πρόγραμμα-πελάτη Matrix. Θα πρέπει να μοιάζει με !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Συνιστάται ανεπιφύλακτα να δημιουργήσετε έναν νέο χρήστη και να μην χρησιμοποιήσετε το διακριτικό πρόσβασης του χρήστη Matrix, καθώς θα επιτρέψει την πλήρη πρόσβαση στον λογαριασμό σας και σε όλα τα δωμάτια στα οποία συμμετέχετε. Αντίθετα, δημιουργήστε έναν νέο χρήστη και προσκαλέστε τον μόνο στο δωμάτιο στο οποίο θέλετε να λαμβάνετε την ειδοποίηση. Μπορείτε να λάβετε το access token εκτελώντας {0}",
-    Method: "Μέθοδος",
-    Body: "Σώμα",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "The request headers are not valid JSON: ",
-    BodyInvalidFormat: "The request body is not valid JSON: ",
-    "Monitor History": "Ιστορικο Παρακολούθησης",
-    clearDataOlderThan: "Διατηρήστε τα δεδομένα ιστορικού παρακολούθησης για {0} ημέρες.",
-    PasswordsDoNotMatch: "Οι κωδικοί πρόσβασης δεν ταιριάζουν.",
-    records: "εγγραφές",
-    "One record": "Μία εγγραφή",
-    steamApiKeyDescription: "Για την παρακολούθηση ενός διακομιστή παιχνιδιών Steam χρειάζεστε ένα κλειδί Steam Web-API. Μπορείτε να καταχωρήσετε το κλειδί API σας εδώ: ",
-    "Current User": "Τρέχων χρήστης",
-    topic: "Θέμα",
-    topicExplanation: "Θέμα MQTT προς παρακολούθηση",
-    successMessage: "Μήνυμα επιτυχίας",
-    successMessageExplanation: "Μήνυμα MQTT που θα θεωρηθεί επιτυχές",
-    recent: "Πρόσφατος",
-    Done: "Ολοκληρώθηκε",
-    Info: "Πληροφορίες",
-    Security: "Ασφάλεια",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Συρρίκνωση βάσης δεδομένων",
-    "Pick a RR-Type...": "Επιλέξτε έναν τύπο RR...",
-    "Pick Accepted Status Codes...": "Επιλέξτε Αποδεκτούς κωδικούς κατάστασης...",
-    Default: "Προκαθορισμένο",
-    "HTTP Options": "Επιλογές HTTP",
-    "Create Incident": "Δημιουργία περιστατικού",
-    Title: "Τίτλος",
-    Content: "Περιεχόμενο",
-    Style: "Στυλ",
-    info: "πληροφορίες",
-    warning: "προειδοποίηση",
-    danger: "κίνδυνος",
-    error: "σφάλμα",
-    critical: "κριτικό",
-    primary: "primary",
-    light: "light",
-    dark: "dark",
-    Post: "Δημοσίευση",
-    "Please input title and content": "Παρακαλούμε εισαγάγετε τίτλο και περιεχόμενο",
-    Created: "Δημιουργήθηκε",
-    "Last Updated": "Τελευταία ενημέρωση",
-    Unpin: "Ξεκαρφιτσώστε",
-    "Switch to Light Theme": "Μετάβαση σε Ανιχτό θέμα",
-    "Switch to Dark Theme": "Μετάβαση σε Σκούρο θέμα",
-    "Show Tags": "Εμφάνιση ετικετών",
-    "Hide Tags": "Απόκρυψη ετικετών",
-    Description: "Περιγραφή",
-    "No monitors available.": "Δεν υπάρχουν διαθέσιμες παρακολουθήσεις.",
-    "Add one": "Προσθέστε ένα",
-    "No Monitors": "Χωρίς παρακολουθήσεις",
-    "Untitled Group": "Ομάδα χωρίς τίτλο",
-    Services: "Υπηρεσίες",
-    Discard: "Απορρίψει",
-    Cancel: "Ακυρο",
-    "Powered by": "Με την υποστήριξη του",
-    shrinkDatabaseDescription: "Ενεργοποίηση βάσης δεδομένων VACUUM για SQLite. Εάν η βάση δεδομένων σας έχει δημιουργηθεί μετά την έκδοση 1.10.0, το AUTO_VACUUM είναι ήδη ενεργοποιημένο και αυτή η ενέργεια δεν χρειάζεται.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API κωδικός πρόσβασης",
-    serwersmsPhoneNumber: "Αριθμός τηλεφώνου",
-    serwersmsSenderName: "Όνομα αποστολέα SMS (καταχωρήθηκε μέσω της πύλης πελατών)",
-    stackfield: "Stackfield",
-    Customize: "Προσαρμογή",
-    "Custom Footer": "Προσαρμογή Footer",
-    "Custom CSS": "Προσαρμογή CSS",
-    smtpDkimSettings: "Ρυθμίσεις DKIM",
-    smtpDkimDesc: "Ανατρέξτε στο Nodemailer DKIM {0} για χρήση.",
-    documentation: "documentation",
-    smtpDkimDomain: "Domain Name",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "Hash Algorithm (Optional)",
-    smtpDkimheaderFieldNames: "Header Keys to sign (Optional)",
-    smtpDkimskipFields: "Header Keys not to sign (Optional)",
-    wayToGetPagerDutyKey: "Μπορείτε να το λάβετε μεταβαίνοντας στο Service -> Service Directory -> (Επιλέξτε μια υπηρεσία) -> Integrations -> Add integration. Εδώ μπορείτε να κάνετε αναζήτηση για \"Events API V2\". Περισσότερες πληροφορίες {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Αυτόματη επίλυση ή αναγνώριση",
-    "do nothing": "μην κάνεις τίποτα",
-    "auto acknowledged": "αυτόματη αναγνώριση",
-    "auto resolve": "αυτόματη επίλυση",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Alert State",
-    alertaRecoverState: "Recover State",
-    deleteStatusPageMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν τη σελίδα κατάστασης?",
-    Proxies: "Proxies",
-    default: "Προκαθορισμένο",
-    enabled: "Ενεργοποιημένο",
-    setAsDefault: "Ορίσετε ως προεπιλογή",
-    deleteProxyMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το proxy για όλες τις παρακολουθήσεις;",
-    proxyDescription: "Πρέπει να εκχωρηθούν proxies σε μια οθπαρακολουθή για να λειτουργήσουν..",
-    enableProxyDescription: "Το proxy δεν θα επηρεάσει τα αιτήματα της παρακολουθήσεις μέχρι να ενεργοποιηθεί. Μπορείτε να ελέγξετε την προσωρινή απενεργοποίηση του proxy από όλες τις παρακολουθήσεις βάσει κατάστασης ενεργοποίησης.",
-    setAsDefaultProxyDescription: "Αυτός το proxy θα είναι ενεργοποιημένο από προεπιλογή για νέες παρακολουθήσεις. Μπορείτε ακόμα να απενεργοποιήσετε το proxy ξεχωριστά για κάθε οθόνη.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Εγκυρο",
-    Invalid: "Μη έγκυρο",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Το πρότυπο SMS πρέπει να περιέχει παραμέτρους: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Ομάδα",
-    "Bark Sound": "Bark Ήχος",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Για ασφάλεια, πρέπει να χρησιμοποιήσετε secret key",
-    "Device Token": "Device Token",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Ξαναδοκιμάσετε",
-    Topic: "Θέμα",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Ρύθμιση Proxy",
-    "Proxy Protocol": "Πρωτόκολλο Proxy",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Το Proxy διαθέτει έλεγχο ταυτότητας",
-    User: "Χρήστης",
-    Installed: "Εγκατεστημένο",
-    "Not installed": "Μη εγκατεστημενο",
-    Running: "Τρέχη",
-    "Not running": "Δεν τρεχη",
-    "Remove Token": "Κατάργηση Token",
-    Start: "Αρχή",
-    Stop: "Στάση",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Προσθήκη νέας σελίδας κατάστασης",
-    Slug: "Slug",
-    "Accept characters:": "Αποδοχή χαρακτήρων:",
-    startOrEndWithOnly: "Ξεκινήστε ή τελειώστε μόνο με {0}",
-    "No consecutive dashes": "Χωρίς διαδοχικές παύλες",
-    Next: "Επόμενο",
-    "The slug is already taken. Please choose another slug.": "Ο slug έχει ήδη πιαστεί. Επιλέξτε άλλο slug.",
-    "No Proxy": "Οχι Proxy",
-    Authentication: "Authentication",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "Νέας Σελίδα κατάστασης",
-    "Page Not Found": "Η σελίδα δεν βρέθηκε",
-    "Reverse Proxy": "Αντίστροφο Proxy",
-    Backup: "Αντιγράφων ασφαλείας",
-    About: "Σχετικά με το Uptime Kuma",
-    wayToGetCloudflaredURL: "(Λήψη cloudflared από {0})",
-    cloudflareWebsite: "Ιστοσελίδα Cloudflare",
-    "Message:": "Μήνυμα:",
-    "Don't know how to get the token? Please read the guide:": "Δεν ξέρετε πώς να αποκτήσετε το token; Διαβάστε τον οδηγό:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Η τρέχουσα σύνδεση μπορεί να χαθεί εάν αυτή τη στιγμή συνδέεστε μέσω του Cloudflare Tunnel. Θέλετε σίγουρα να το σταματήσετε; Πληκτρολογήστε τον τρέχοντα κωδικό πρόσβασής σας για να τον επιβεβαιώσετε.",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Εμπιστοσύνη του Proxy",
-    "Other Software": "Other Software",
-    "For example: nginx, Apache and Traefik.": "Για παράδειγμα: nginx, Apache και Traefik.",
-    "Please read": "Παρακαλώ διαβάστε",
-    "Subject:": "Θέμα:",
-    "Valid To:": "Εγκυρο για:",
-    "Days Remaining:": "Ημέρες που απομένουν:",
-    "Issuer:": "Εκδότης:",
-    "Fingerprint:": "Δακτυλικό αποτύπωμα:",
-    "No status pages": "Δεν υπάρχουν σελίδες κατάστασης",
-    "Domain Name Expiry Notification": "Ειδοποίηση λήξης ονόματος τομέα",
-    Proxy: "Proxy",
-    "Date Created": "Ημερομηνία Δημιουργίας",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Address",
-    onebotMessageType: "OneBot Message Type",
-    onebotGroupMessage: "Group",
-    onebotPrivateMessage: "Private",
-    onebotUserOrGroupId: "Group/User ID",
-    onebotSafetyTips: "Για ασφάλεια, πρέπει να ορίσετε το acess token",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Κείμενο υποσέλιδου",
-    "Show Powered By": "Εμφάνιση Powered By",
-    "Domain Names": "Ονόματα Τομέα",
-    signedInDisp: "Συνδεθήκατε ως {0}",
-    signedInDispDisabled: "Εξουσιοδότηση είναι απενεργοποιημένη.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Shared Secret μεταξύ client και το server",
-    RadiusCalledStationId: "Called Station Id",
-    RadiusCalledStationIdDescription: "Identifier της καλούμενης συσκευής",
-    RadiusCallingStationId: "Calling Station Id",
-    RadiusCallingStationIdDescription: "Identifier oτης συσκευής κλήσης",
-    "Certificate Expiry Notification": "Ειδοποίηση Λήξης Πιστοποιητικού",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "Αριθμός Παραλήπτη",
-    "From Name/Number": "Από Όνομα/Αριθμός",
-    "Leave blank to use a shared sender number.": "Αφήστε το κενό για να χρησιμοποιήσετε έναν κοινόχρηστο αριθμό αποστολέα.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" από το HTTP API credentials στον πίνακα ελέγχου",
-    octopushLogin: "\"Login\" από το HTTP API credentials στον πίνακα ελέγχου",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Μυστικό API Key",
-    pushyToken: "Τoken Συσκευής",
-    "Show update if available": "Εμφάνιση ενημέρωσης εάν είναι διαθέσιμη",
-    "Also check beta release": "Ελέγξτε επίσης την έκδοση beta",
-    "Using a Reverse Proxy?": "Χρησιμοποιείτε reverse proxy;",
-    "Check how to config it for WebSocket": "Ελέγξτε πώς να το ρυθμίσετε για το WebSocket",
-    "Steam Game Server": "Διακομιστής παιχνιδιών Steam",
-    "Most likely causes:": "Πιο πιθανές αιτίες:",
-    "The resource is no longer available.": "Ο πόρος δεν είναι πλέον διαθέσιμος.",
-    "There might be a typing error in the address.": "Μπορεί να υπάρχει σφάλμα πληκτρολόγησης στη διεύθυνση.",
-    "What you can try:": "Τι μπορείτε να δοκιμάσετε:",
-    "Retype the address.": "Πληκτρολογήστε ξανά τη διεύθυνση.",
-    "Go back to the previous page.": "Επιστρέψτε στην προηγούμενη σελίδα.",
-    "Coming Soon": "Ερχεται σύντομα",
-    wayToGetClickSendSMSToken: "Μπορείτε να πάρετε το API Username και API Key απο {0} .",
-    "Connection String": "Connection String",
-    Query: "Query",
-    settingsCertificateExpiry: "Λήξη πιστοποιητικού TLS",
-    certificationExpiryDescription: "Οι παρακολουθήσεις HTTPS ενεργοποιούν ειδοποίηση όταν λήξει το πιστοποιητικό TLS σε:",
-    "Setup Docker Host": "Ρύθμιση Docker Host",
-    "Connection Type": "Τύπος σύνδεσης",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον κεντρικό υπολογιστή βάσης για όλες τις παρακολουθήσεις;",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Βρίσκεστε σε λειτουργία No Auth, δεν απαιτείται κωδικός πρόσβασης.",
-    trustProxyDescription: "Εμπιστευτείτε τις κεφαλίδες 'X-Forwarded-*'. Εάν θέλετε να λάβετε τη σωστή IP πελάτη και το Uptime Kuma σας βρίσκεται πίσω το Nginx ή το Apache, θα πρέπει να το ενεργοποιήσετε.",
-    wayToGetLineNotifyToken: "Μπορείτε να λάβετε ένα access token από το {0}",
-    Examples: "Παραδείγματα",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Long-Lived Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token μπορεί να δημιουργηθεί κάνοντας κλικ στο όνομα του προφίλ σας (κάτω αριστερά) και κάνοντας κύλιση προς τα κάτω και, στη συνέχεια, κάντε κλικ στο Create Token. ",
-    "Notification Service": "Υπηρεσία ειδοποιήσεων",
-    "default: notify all devices": "προεπιλογή: ειδοποίηση όλων των συσκευών",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Μπορείτε να βρείτε μια λίστα με τις Υπηρεσίες ειδοποιήσεων στον Home assistant στην περιοχή \"Developer Tools > Services\" αναζήτηση για \"notification\" για να βρείτε το όνομα της συσκευής/τηλεφώνου σας.",
-    "Automations can optionally be triggered in Home Assistant:": "Οι αυτοματισμοί μπορούν προαιρετικά να ενεργοποιηθούν στο Home Assistant:",
-    "Trigger type:": "Τύπος ενεργοποίησης:",
-    "Event type:": "Τύπος συμβάντος:",
-    "Event data:": "Δεδομένα συμβάντος:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Στη συνέχεια, επιλέξτε μια ενέργεια, για παράδειγμα αλλάξτε τη σκηνή στο σημείο όπου ένα φως RGB είναι κόκκινο.",
-    "Frontend Version": "Έκδοση Frontend",
-    "Frontend Version do not match backend version!": "Η Frontend έκδοση δεν ταιριάζει με την έκδοση backend!",
-    "Base URL": "Βασική διεύθυνση URL",
-    goAlertInfo: "Το GoAlert είναι μια εφαρμογή ανοιχτού κώδικα για προγραμματισμό κλήσεων, αυτοματοποιημένες κλιμακώσεις και ειδοποιήσεις (όπως SMS ή φωνητικές κλήσεις). Αλληλεπιδράστε αυτόματα με το σωστό άτομο, με τον σωστό τρόπο και τη σωστή στιγμή! {0}",
-    goAlertIntegrationKeyInfo: "Λάβετε το generic API integration key για την υπηρεσία σε αυτήν τη μορφή \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" συνήθως την τιμή της παραμέτρου διακριτικού της αντιγραμμένης διεύθυνσης URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται πολη, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
-    backupRecommend: "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του volume ή του φακέλου δεδομένων (./data/) απευθείας.",
-};
diff --git a/src/languages/en.js b/src/languages/en.js
deleted file mode 100644
index 8fadfdfb..00000000
--- a/src/languages/en.js
+++ /dev/null
@@ -1,684 +0,0 @@
-export default {
-    languageName: "English",
-    checkEverySecond: "Check every {0} seconds",
-    retryCheckEverySecond: "Retry every {0} seconds",
-    resendEveryXTimes: "Resend every {0} times",
-    resendDisabled: "Resend disabled",
-    retriesDescription: "Maximum retries before the service is marked as down and a notification is sent",
-    ignoreTLSError: "Ignore TLS/SSL error for HTTPS websites",
-    upsideDownModeDescription: "Flip the status upside down. If the service is reachable, it is DOWN.",
-    maxRedirectDescription: "Maximum number of redirects to follow. Set to 0 to disable redirects.",
-    enableGRPCTls: "Allow to send gRPC request with TLS connection",
-    grpcMethodDescription: "Method name is convert to cammelCase format such as sayHello, check, etc.",
-    acceptedStatusCodesDescription: "Select status codes which are considered as a successful response.",
-    Maintenance: "Maintenance",
-    statusMaintenance: "Maintenance",
-    "Schedule maintenance": "Schedule maintenance",
-    "Affected Monitors": "Affected Monitors",
-    "Pick Affected Monitors...": "Pick Affected Monitors...",
-    "Start of maintenance": "Start of maintenance",
-    "All Status Pages": "All Status Pages",
-    "Select status pages...": "Select status pages...",
-    recurringIntervalMessage: "Run once every day | Run once every {0} days",
-    affectedMonitorsDescription: "Select monitors that are affected by current maintenance",
-    affectedStatusPages: "Show this maintenance message on selected status pages",
-    atLeastOneMonitor: "Select at least one affected monitor",
-    passwordNotMatchMsg: "The repeat password does not match.",
-    notificationDescription: "Notifications must be assigned to a monitor to function.",
-    keywordDescription: "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
-    pauseDashboardHome: "Pause",
-    deleteMonitorMsg: "Are you sure want to delete this monitor?",
-    deleteMaintenanceMsg: "Are you sure want to delete this maintenance?",
-    deleteNotificationMsg: "Are you sure want to delete this notification for all monitors?",
-    dnsPortDescription: "DNS server port. Defaults to 53. You can change the port at any time.",
-    resolverserverDescription: "Cloudflare is the default server. You can change the resolver server anytime.",
-    rrtypeDescription: "Select the RR type you want to monitor",
-    pauseMonitorMsg: "Are you sure want to pause?",
-    enableDefaultNotificationDescription: "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
-    clearEventsMsg: "Are you sure want to delete all events for this monitor?",
-    clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
-    confirmClearStatisticsMsg: "Are you sure you want to delete ALL statistics?",
-    importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    confirmImportMsg: "Are you sure you want to import the backup? Please verify you've selected the correct import option.",
-    twoFAVerifyLabel: "Please enter your token to verify 2FA:",
-    tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
-    confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    Settings: "Settings",
-    Dashboard: "Dashboard",
-    "New Update": "New Update",
-    Language: "Language",
-    Appearance: "Appearance",
-    Theme: "Theme",
-    General: "General",
-    "Primary Base URL": "Primary Base URL",
-    Version: "Version",
-    "Check Update On GitHub": "Check Update On GitHub",
-    List: "List",
-    Add: "Add",
-    "Add New Monitor": "Add New Monitor",
-    "Quick Stats": "Quick Stats",
-    Up: "Up",
-    Down: "Down",
-    Pending: "Pending",
-    Unknown: "Unknown",
-    Pause: "Pause",
-    Name: "Name",
-    Status: "Status",
-    DateTime: "DateTime",
-    Message: "Message",
-    "No important events": "No important events",
-    Resume: "Resume",
-    Edit: "Edit",
-    Delete: "Delete",
-    Current: "Current",
-    Uptime: "Uptime",
-    "Cert Exp.": "Cert Exp.",
-    Monitor: "Monitor | Monitors",
-    day: "day | days",
-    "-day": "-day",
-    hour: "hour",
-    "-hour": "-hour",
-    Response: "Response",
-    Ping: "Ping",
-    "Monitor Type": "Monitor Type",
-    Keyword: "Keyword",
-    "Friendly Name": "Friendly Name",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Heartbeat Interval",
-    Retries: "Retries",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Resend Notification if Down X times consequently": "Resend Notification if Down X times consequently",
-    Advanced: "Advanced",
-    "Upside Down Mode": "Upside Down Mode",
-    "Max. Redirects": "Max. Redirects",
-    "Accepted Status Codes": "Accepted Status Codes",
-    "Push URL": "Push URL",
-    needPushEvery: "You should call this URL every {0} seconds.",
-    pushOptionalParams: "Optional parameters: {0}",
-    Save: "Save",
-    Notifications: "Notifications",
-    "Not available, please setup.": "Not available, please setup.",
-    "Setup Notification": "Setup Notification",
-    Light: "Light",
-    Dark: "Dark",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
-    Normal: "Normal",
-    Bottom: "Bottom",
-    None: "None",
-    Timezone: "Timezone",
-    "Search Engine Visibility": "Search Engine Visibility",
-    "Allow indexing": "Allow indexing",
-    "Discourage search engines from indexing site": "Discourage search engines from indexing site",
-    "Change Password": "Change Password",
-    "Current Password": "Current Password",
-    "New Password": "New Password",
-    "Repeat New Password": "Repeat New Password",
-    "Update Password": "Update Password",
-    "Disable Auth": "Disable Auth",
-    "Enable Auth": "Enable Auth",
-    "disableauth.message1": "Are you sure want to <strong>disable authentication</strong>?",
-    "disableauth.message2": "It is designed for scenarios <strong>where you intend to implement third-party authentication</strong> in front of Uptime Kuma such as Cloudflare Access, Authelia or other authentication mechanisms.",
-    "Please use this option carefully!": "Please use this option carefully!",
-    Logout: "Logout",
-    Leave: "Leave",
-    "I understand, please disable": "I understand, please disable",
-    Confirm: "Confirm",
-    Yes: "Yes",
-    No: "No",
-    Username: "Username",
-    Password: "Password",
-    "Remember me": "Remember me",
-    Login: "Login",
-    "No Monitors, please": "No Monitors, please",
-    "add one": "add one",
-    "Notification Type": "Notification Type",
-    Email: "Email",
-    Test: "Test",
-    "Certificate Info": "Certificate Info",
-    "Resolver Server": "Resolver Server",
-    "Resource Record Type": "Resource Record Type",
-    "Last Result": "Last Result",
-    "Create your admin account": "Create your admin account",
-    "Repeat Password": "Repeat Password",
-    "Import Backup": "Import Backup",
-    "Export Backup": "Export Backup",
-    Export: "Export",
-    Import: "Import",
-    respTime: "Resp. Time (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Default enabled",
-    "Apply on all existing monitors": "Apply on all existing monitors",
-    Create: "Create",
-    "Clear Data": "Clear Data",
-    Events: "Events",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    backupDescription: "You can backup all monitors and notifications into a JSON file.",
-    backupDescription2: "Note: history and event data is not included.",
-    backupDescription3: "Sensitive data such as notification tokens are included in the export file; please store export securely.",
-    alertNoFile: "Please select a file to import.",
-    alertWrongFileType: "Please select a JSON file.",
-    "Clear all statistics": "Clear all Statistics",
-    "Skip existing": "Skip existing",
-    Overwrite: "Overwrite",
-    Options: "Options",
-    "Keep both": "Keep both",
-    "Verify Token": "Verify Token",
-    "Setup 2FA": "Setup 2FA",
-    "Enable 2FA": "Enable 2FA",
-    "Disable 2FA": "Disable 2FA",
-    "2FA Settings": "2FA Settings",
-    "Two Factor Authentication": "Two Factor Authentication",
-    Active: "Active",
-    Inactive: "Inactive",
-    Token: "Token",
-    "Show URI": "Show URI",
-    Tags: "Tags",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exists.",
-    "Tag with this value already exist.": "Tag with this value already exists.",
-    color: "Color",
-    "value (optional)": "value (optional)",
-    Gray: "Gray",
-    Red: "Red",
-    Orange: "Orange",
-    Green: "Green",
-    Blue: "Blue",
-    Indigo: "Indigo",
-    Purple: "Purple",
-    Pink: "Pink",
-    Custom: "Custom",
-    "Search...": "Search...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. Response",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Nothing here, please add a group or a monitor.",
-    "No Services": "No Services",
-    "All Systems Operational": "All Systems Operational",
-    "Partially Degraded Service": "Partially Degraded Service",
-    "Degraded Service": "Degraded Service",
-    "Add Group": "Add Group",
-    "Add a monitor": "Add a monitor",
-    "Edit Status Page": "Edit Status Page",
-    "Go to Dashboard": "Go to Dashboard",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    defaultNotificationName: "My {notification} Alert ({number})",
-    here: "here",
-    Required: "Required",
-    telegram: "Telegram",
-    "ZohoCliq": "ZohoCliq",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "You can get a token from {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
-    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
-    chatIDNotFound: "Chat ID is not found; please send a message to this bot first",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} is good for any modern HTTP servers such as Express.js",
-    webhookFormDataDesc: "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
-    webhookAdditionalHeadersTitle: "Additional Headers",
-    webhookAdditionalHeadersDesc: "Sets additional headers sent with the webhook.",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignore TLS Error",
-    "From Email": "From Email",
-    emailCustomSubject: "Custom Subject",
-    "To Email": "To Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "Bot Display Name",
-    "Prefix Custom Message": "Prefix Custom Message",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "You can learn how to create a webhook URL {0}.",
-    wayToGetZohoCliqURL: "You can learn how to create a webhook URL {0}.",
-    signal: "Signal",
-    Number: "Number",
-    Recipients: "Recipients",
-    needSignalAPI: "You need to have a signal client with REST API.",
-    wayToCheckSignalURL: "You can check this URL to view how to set one up:",
-    signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
-    gotify: "Gotify",
-    "Application Token": "Application Token",
-    "Server URL": "Server URL",
-    Priority: "Priority",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Channel Name",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "More info about Webhooks on: {0}",
-    aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
-    aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    pushbullet: "Pushbullet",
-    Kook: "Kook",
-    wayToGetKookBotToken: "Create application and get your bot token at {0}",
-    wayToGetKookGuildID: "Switch on 'Developer Mode' in Kook setting, and right click the guild to get its ID",
-    "Guild ID": "Guild ID",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "User Key",
-    Device: "Device",
-    "Message Title": "Message Title",
-    "Notification Sound": "Notification Sound",
-    "More info on:": "More info on: {0}",
-    pushoverDesc1: "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
-    pushoverDesc2: "If you want to send notifications to different devices, fill out Device field.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Fast - recommended for alerting)",
-    octopushTypeLowCost: "Low Cost (Slow - sometimes blocked by operator)",
-    checkPrice: "Check {0} prices:",
-    apiCredentials: "API credentials",
-    octopushLegacyHint: "Do you use the legacy version of Octopush (2011-2020) or the new version?",
-    "Check octopush prices": "Check octopush prices {0}.",
-    octopushPhoneNumber: "Phone number (intl format, eg : +33612345678) ",
-    octopushSMSSender: "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Example: {0}",
-    "Read more:": "Read more: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Read more",
-    appriseInstalled: "Apprise is installed.",
-    appriseNotInstalled: "Apprise is not installed. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Basic Settings",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
-    aboutMattermostChannelName: "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
-    promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
-    promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
-    promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
-    promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
-    promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    promosmsAllowLongSMS: "Allow long SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (with http(s):// and optionally port)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "The request headers are not valid JSON: ",
-    BodyInvalidFormat: "The request body is not valid JSON: ",
-    "Monitor History": "Monitor History",
-    clearDataOlderThan: "Keep monitor history data for {0} days.",
-    PasswordsDoNotMatch: "Passwords do not match.",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
-    "Current User": "Current User",
-    topic: "Topic",
-    topicExplanation: "MQTT topic to monitor",
-    successMessage: "Success Message",
-    successMessageExplanation: "MQTT message that will be considered as success",
-    recent: "Recent",
-    Done: "Done",
-    Info: "Info",
-    Security: "Security",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Shrink Database",
-    "Pick a RR-Type...": "Pick a RR-Type...",
-    "Pick Accepted Status Codes...": "Pick Accepted Status Codes...",
-    Default: "Default",
-    "HTTP Options": "HTTP Options",
-    "Create Incident": "Create Incident",
-    Title: "Title",
-    Content: "Content",
-    Style: "Style",
-    info: "info",
-    warning: "warning",
-    danger: "danger",
-    error: "error",
-    critical: "critical",
-    primary: "primary",
-    light: "light",
-    dark: "dark",
-    Post: "Post",
-    "Please input title and content": "Please input title and content",
-    Created: "Created",
-    "Last Updated": "Last Updated",
-    Unpin: "Unpin",
-    "Switch to Light Theme": "Switch to Light Theme",
-    "Switch to Dark Theme": "Switch to Dark Theme",
-    "Show Tags": "Show Tags",
-    "Hide Tags": "Hide Tags",
-    Description: "Description",
-    "No monitors available.": "No monitors available.",
-    "Add one": "Add one",
-    "No Monitors": "No Monitors",
-    "Untitled Group": "Untitled Group",
-    Services: "Services",
-    Discard: "Discard",
-    Cancel: "Cancel",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Password",
-    serwersmsPhoneNumber: "Phone number",
-    serwersmsSenderName: "SMS Sender Name (registered via customer portal)",
-    smseagle: "SMSEagle",
-    smseagleTo: "Phone number(s)",
-    smseagleGroup: "Phonebook group name(s)",
-    smseagleContact: "Phonebook contact name(s)",
-    smseagleRecipientType: "Recipient type",
-    smseagleRecipient: "Recipient(s) (multiple must be separated with comma)",
-    smseagleToken: "API Access token",
-    smseagleUrl: "Your SMSEagle device URL",
-    smseagleEncoding: "Send as Unicode",
-    smseaglePriority: "Message priority (0-9, default = 0)",
-    stackfield: "Stackfield",
-    Customize: "Customize",
-    "Custom Footer": "Custom Footer",
-    "Custom CSS": "Custom CSS",
-    smtpDkimSettings: "DKIM Settings",
-    smtpDkimDesc: "Please refer to the Nodemailer DKIM {0} for usage.",
-    documentation: "documentation",
-    smtpDkimDomain: "Domain Name",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "Hash Algorithm (Optional)",
-    smtpDkimheaderFieldNames: "Header Keys to sign (Optional)",
-    smtpDkimskipFields: "Header Keys not to sign (Optional)",
-    wayToGetPagerDutyKey: "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
-    "do nothing": "do nothing",
-    "auto acknowledged": "auto acknowledged",
-    "auto resolve": "auto resolve",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Alert State",
-    alertaRecoverState: "Recover State",
-    deleteStatusPageMsg: "Are you sure want to delete this status page?",
-    Proxies: "Proxies",
-    default: "Default",
-    enabled: "Enabled",
-    setAsDefault: "Set As Default",
-    deleteProxyMsg: "Are you sure want to delete this proxy for all monitors?",
-    proxyDescription: "Proxies must be assigned to a monitor to function.",
-    enableProxyDescription: "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
-    setAsDefaultProxyDescription: "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Valid",
-    Invalid: "Invalid",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "For safety, must use secret key",
-    "Device Token": "Device Token",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Retry",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Setup Proxy",
-    "Proxy Protocol": "Proxy Protocol",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Proxy server has authentication",
-    User: "User",
-    Installed: "Installed",
-    "Not installed": "Not installed",
-    Running: "Running",
-    "Not running": "Not running",
-    "Remove Token": "Remove Token",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Add New Status Page",
-    Slug: "Slug",
-    "Accept characters:": "Accept characters:",
-    startOrEndWithOnly: "Start or end with {0} only",
-    "No consecutive dashes": "No consecutive dashes",
-    Next: "Next",
-    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
-    "No Proxy": "No Proxy",
-    Authentication: "Authentication",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "New Status Page",
-    "Page Not Found": "Page Not Found",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Backup",
-    About: "About",
-    wayToGetCloudflaredURL: "(Download cloudflared from {0})",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Message:",
-    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Trust Proxy",
-    "Other Software": "Other Software",
-    "For example: nginx, Apache and Traefik.": "For example: nginx, Apache and Traefik.",
-    "Please read": "Please read",
-    "Subject:": "Subject:",
-    "Valid To:": "Valid To:",
-    "Days Remaining:": "Days Remaining:",
-    "Issuer:": "Issuer:",
-    "Fingerprint:": "Fingerprint:",
-    "No status pages": "No status pages",
-    "Domain Name Expiry Notification": "Domain Name Expiry Notification",
-    Proxy: "Proxy",
-    "Date Created": "Date Created",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Address",
-    onebotMessageType: "OneBot Message Type",
-    onebotGroupMessage: "Group",
-    onebotPrivateMessage: "Private",
-    onebotUserOrGroupId: "Group/User ID",
-    onebotSafetyTips: "For safety, must set access token",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Footer Text",
-    "Show Powered By": "Show Powered By",
-    "Domain Names": "Domain Names",
-    signedInDisp: "Signed in as {0}",
-    signedInDispDisabled: "Auth Disabled.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Shared Secret between client and server",
-    RadiusCalledStationId: "Called Station Id",
-    RadiusCalledStationIdDescription: "Identifier of the called device",
-    RadiusCallingStationId: "Calling Station Id",
-    RadiusCallingStationIdDescription: "Identifier of the calling device",
-    "Certificate Expiry Notification": "Certificate Expiry Notification",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "Recipient Number",
-    "From Name/Number": "From Name/Number",
-    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" from HTTP API credentials in control panel",
-    octopushLogin: "\"Login\" from HTTP API credentials in control panel",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Device token",
-    "Show update if available": "Show update if available",
-    "Also check beta release": "Also check beta release",
-    "Using a Reverse Proxy?": "Using a Reverse Proxy?",
-    "Check how to config it for WebSocket": "Check how to config it for WebSocket",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Most likely causes:",
-    "The resource is no longer available.": "The resource is no longer available.",
-    "There might be a typing error in the address.": "There might be a typing error in the address.",
-    "What you can try:": "What you can try:",
-    "Retype the address.": "Retype the address.",
-    "Go back to the previous page.": "Go back to the previous page.",
-    "Coming Soon": "Coming Soon",
-    wayToGetClickSendSMSToken: "You can get API Username and API Key from {0} .",
-    "Connection String": "Connection String",
-    Query: "Query",
-    settingsCertificateExpiry: "TLS Certificate Expiry",
-    certificationExpiryDescription: "HTTPS Monitors trigger notification when TLS certificate expires in:",
-    "Setup Docker Host": "Setup Docker Host",
-    "Connection Type": "Connection Type",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Are you sure want to delete this docker host for all monitors?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "You are in No Auth mode, a password is not required.",
-    trustProxyDescription: "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
-    wayToGetLineNotifyToken: "You can get an access token from {0}",
-    Examples: "Examples",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Long-Lived Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
-    "Notification Service": "Notification Service",
-    "default: notify all devices": "default: notify all devices",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
-    "Automations can optionally be triggered in Home Assistant:": "Automations can optionally be triggered in Home Assistant:",
-    "Trigger type:": "Trigger type:",
-    "Event type:": "Event type:",
-    "Event data:": "Event data:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
-    "Frontend Version": "Frontend Version",
-    "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
-    "Base URL": "Base URL",
-    goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
-    goAlertIntegrationKeyInfo: "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
-    backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
-    Optional: "Optional",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Docs ",
-    "Gateway Type": "Gateway Type",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "You can divide numbers with",
-    or: "or",
-    recurringInterval: "Interval",
-    Recurring: "Recurring",
-    strategyManual: "Active/Inactive Manually",
-    warningTimezone: "It is using the server's timezone",
-    weekdayShortMon: "Mon",
-    weekdayShortTue: "Tue",
-    weekdayShortWed: "Wed",
-    weekdayShortThu: "Thu",
-    weekdayShortFri: "Fri",
-    weekdayShortSat: "Sat",
-    weekdayShortSun: "Sun",
-    dayOfWeek: "Day of Week",
-    dayOfMonth: "Day of Month",
-    lastDay: "Last Day",
-    lastDay1: "Last Day of Month",
-    lastDay2: "2nd Last Day of Month",
-    lastDay3: "3rd Last Day of Month",
-    lastDay4: "4th Last Day of Month",
-    "No Maintenance": "No Maintenance",
-    pauseMaintenanceMsg: "Are you sure want to pause?",
-    "maintenanceStatus-under-maintenance": "Under Maintenance",
-    "maintenanceStatus-inactive": "Inactive",
-    "maintenanceStatus-scheduled": "Scheduled",
-    "maintenanceStatus-ended": "Ended",
-    "maintenanceStatus-unknown": "Unknown",
-    "Display Timezone": "Display Timezone",
-    "Server Timezone": "Server Timezone",
-    statusPageMaintenanceEndDate: "End",
-    IconUrl: "Icon URL",
-    "Enable DNS Cache": "Enable DNS Cache",
-    Enable: "Enable",
-    Disable: "Disable",
-    dnsCacheDescription: "It may be not working in some IPv6 environments, disable it if you encounter any issues.",
-    "Single Maintenance Window": "Single Maintenance Window",
-    "Maintenance Time Window of a Day": "Maintenance Time Window of a Day",
-    "Effective Date Range": "Effective Date Range",
-    "Schedule Maintenance": "Schedule Maintenance",
-    "Date and Time": "Date and Time",
-    "DateTime Range": "DateTime Range",
-    Strategy: "Strategy",
-    "Free Mobile User Identifier": "Free Mobile User Identifier",
-    "Free Mobile API Key": "Free Mobile API Key",
-    "Enable TLS": "Enable TLS",
-    "Proto Service Name": "Proto Service Name",
-    "Proto Method": "Proto Method",
-    "Proto Content": "Proto Content",
-    Economy: "Economy",
-    Lowcost: "Lowcost",
-    high: "high",
-    "General Monitor Type": "General Monitor Type",
-    "Passive Monitor Type": "Passive Monitor Type",
-    "Specific Monitor Type": "Specific Monitor Type",
-    dataRetentionTimeError: "Retention period must be 0 or greater",
-    infiniteRetention: "Set to 0 for infinite retention.",
-    confirmDeleteTagMsg: "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
-};
diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js
deleted file mode 100644
index 51327740..00000000
--- a/src/languages/es-ES.js
+++ /dev/null
@@ -1,209 +0,0 @@
-export default {
-    languageName: "Español",
-    checkEverySecond: "Comprobar cada {0} segundos.",
-    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 asigna una notificación a el/los monitor(es) para hacerlos funcional(es).",
-    keywordDescription: "Palabra clave en HTML plano o respuesta JSON, es sensible a mayúsculas",
-    pauseDashboardHome: "Pausado",
-    deleteMonitorMsg: "¿Seguro que quieres eliminar este monitor?",
-    deleteNotificationMsg: "¿Seguro que quieres eliminar esta notificación para todos los monitores?",
-    resolverserverDescription: "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": "Nueva 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: "Desconocido",
-    Pause: "Pausar",
-    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.",
-    day: "día | días",
-    "-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": "Redirecciones máximas",
-    "Accepted Status Codes": "Códigos de estado aceptados",
-    Save: "Guardar",
-    Notifications: "Notificaciones",
-    "Not available, please setup.": "No disponible, por favor configúralo.",
-    "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",
-    "disableauth.message1": "Seguro que deseas <strong>deshabilitar la autenticación</strong>?",
-    "disableauth.message2": "Es para <strong>quien implementa autenticación de terceros</strong> ante Uptime Kuma como por ejemplo Cloudflare Access.",
-    "Please use this option carefully!": "Por favor usar con cuidado.",
-    Logout: "Cerrar sesión",
-    Leave: "Salir",
-    "I understand, please disable": "Entiendo, 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",
-    Create: "Crear",
-    clearEventsMsg: "¿Estás seguro de que deseas eliminar todos los eventos de este monitor?",
-    clearHeartbeatsMsg: "¿Estás seguro de que deseas eliminar todos los latidos de este monitor?",
-    confirmClearStatisticsMsg: "¿Estás seguro de que deseas eliminar TODAS las estadísticas?",
-    "Clear Data": "Borrar datos",
-    Events: "Eventos",
-    Heartbeats: "Latidos",
-    "Auto Get": "Obtener automáticamente",
-    enableDefaultNotificationDescription: "Para cada nuevo monitor, esta notificación estará habilitada de forma predeterminada. Aún puedes deshabilitar la notificación por separado para cada monitor.",
-    "Default enabled": "Habilitado por defecto",
-    "Also apply to existing monitors": "También se aplica a monitores existentes",
-    Export: "Exportar",
-    Import: "Importar",
-    backupDescription: "Puedes hacer una copia de seguridad de todos los monitores y todas las notificaciones en un archivo JSON.",
-    backupDescription2: "PD: el historial y los datos de eventos no están incluidos.",
-    backupDescription3: "Los datos confidenciales, como los tokens de notificación, se incluyen en el archivo de exportación. Guárdalo con cuidado.",
-    alertNoFile: "Selecciona un archivo para importar.",
-    alertWrongFileType: "Selecciona un archivo JSON.",
-    twoFAVerifyLabel: "Ingresa tu token para verificar que 2FA está funcionando",
-    tokenValidSettingsMsg: "¡El token es válido! Ahora puedes guardar la configuración de 2FA.",
-    confirmEnableTwoFAMsg: "¿Estás seguro de que quieres habilitar 2FA?",
-    confirmDisableTwoFAMsg: "¿Estás seguro de que quieres desactivar 2FA?",
-    "Apply on all existing monitors": "Aplicar en todos los monitores existentes",
-    "Verify Token": "Verificar token",
-    "Setup 2FA": "Configurar 2FA",
-    "Enable 2FA": "Habilitar 2FA",
-    "Disable 2FA": "Desactivar 2FA",
-    "2FA Settings": "Ajustes 2FA",
-    "Two Factor Authentication": "Autenticación de dos factores",
-    Active: "Activo",
-    Inactive: "Inactivo",
-    Token: "Token",
-    "Show URI": "Mostrar URI",
-    "Clear all statistics": "Borrar todas las estadísticas",
-    retryCheckEverySecond: "Reintentar cada {0} segundo.",
-    importHandleDescription: "Elige 'Omitir existente' si deseas omitir todos los monitores o notificaciones con el mismo nombre. 'Sobrescribir' eliminará todos los monitores y notificaciones existentes.",
-    confirmImportMsg: "¿Estás seguro de importar la copia de seguridad? Asegúrate de haber seleccionado la opción de importación correcta.",
-    "Heartbeat Retry Interval": "Intervalo de reintento de latido",
-    "Import Backup": "Importar copia de seguridad",
-    "Export Backup": "Exportar copia de seguridad",
-    "Skip existing": "Omitir existente",
-    Overwrite: "Sobrescribir",
-    Options: "Opciones",
-    "Keep both": "Manténer ambos",
-    Tags: "Etiquetas",
-    "Add New below or Select...": "Agregar nuevo a continuación o seleccionar...",
-    "Tag with this name already exist.": "Una etiqueta con este nombre ya existe.",
-    "Tag with this value already exist.": "Una etiqueta con este valor ya existe.",
-    color: "color",
-    "value (optional)": "valor (opcional)",
-    Gray: "Gris",
-    Red: "Rojo",
-    Orange: "Naranja",
-    Green: "Verde",
-    Blue: "Azul",
-    Indigo: "Índigo",
-    Purple: "Morado",
-    Pink: "Rosa",
-    "Search...": "Buscar...",
-    "Avg. Ping": "Ping promedio",
-    "Avg. Response": "Respuesta promedio",
-    "Entry Page": "Página de entrada",
-    statusPageNothing: "No hay nada aquí, agrega un grupo o un monitor.",
-    "No Services": "Sin servicio",
-    "All Systems Operational": "Todos los sistemas están operativos",
-    "Partially Degraded Service": "Servicio parcialmente degradado",
-    "Degraded Service": "Servicio degradado",
-    "Add Group": "Agregar grupo",
-    "Add a monitor": "Agregar un monitor",
-    "Edit Status Page": "Editar página de estado",
-    "Go to Dashboard": "Ir al panel de control",
-    "Status Page": "Página de estado",
-    "Status Pages": "Páginas de estado",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Admite más de 50 servicios de notificación)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Monitor History": "Historial de monitor",
-    clearDataOlderThan: "Mantener los datos del historial del monitor durante {0} días.",
-    records: "registros",
-    "One record": "Un registro",
-    steamApiKeyDescription: "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: ",
-};
diff --git a/src/languages/et-EE.js b/src/languages/et-EE.js
deleted file mode 100644
index f581a699..00000000
--- a/src/languages/et-EE.js
+++ /dev/null
@@ -1,209 +0,0 @@
-export default {
-    languageName: "eesti",
-    retryCheckEverySecond: "Kontrolli {0} sekundilise vahega.",
-    retriesDescription: "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus.",
-    ignoreTLSError: "Eira TLS/SSL viga HTTPS veebisaitidel.",
-    upsideDownModeDescription: "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.",
-    maxRedirectDescription: "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi ",
-    acceptedStatusCodesDescription: "Vali välja HTTP koodid, mida arvestada kõlblikuks.",
-    passwordNotMatchMsg: "Salasõnad ei kattu.",
-    notificationDescription: "Teavitusteenuse kasutamiseks seo see seirega.",
-    keywordDescription: "Jälgi võtmesõna HTML või JSON vastustes. (tõstutundlik)",
-    pauseDashboardHome: "Seisatud",
-    deleteMonitorMsg: "Kas soovid eemaldada seire?",
-    deleteNotificationMsg: "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?",
-    resolverserverDescription: "Cloudflare on vaikimisi pöördserver.",
-    rrtypeDescription: "Vali kirje tüüp, mida soovid jälgida.",
-    pauseMonitorMsg: "Kas soovid peatada seire?",
-    Settings: "Seaded",
-    "Status Page": "Ülevaade",
-    "Status Pages": "Ülevaated",
-    Dashboard: "Töölaud",
-    "New Update": "Uuem tarkvara versioon on saadaval.",
-    Language: "Keel",
-    Appearance: "Välimus",
-    Theme: "Teema",
-    General: "Üldine",
-    Version: "Versioon",
-    "Check Update On GitHub": "Otsi uuendusi GitHub'ist",
-    List: "Nimekiri",
-    Add: "Lisa",
-    "Add New Monitor": "Lisa seire",
-    "Add a monitor": "Lisa seire",
-    "Quick Stats": "Ülevaade",
-    Up: "Töökorras",
-    Down: "Rikkis",
-    Pending: "Määramisel",
-    Unknown: "Kahtlast",
-    Pause: "Seiska",
-    Name: "Nimi",
-    Status: "Olek",
-    DateTime: "Kuupäev",
-    Message: "Tulemus",
-    "No important events": "Märkimisväärsed juhtumid puuduvad.",
-    Resume: "Taasta",
-    Edit: "Muuda",
-    Delete: "Eemalda",
-    Current: "Hetkeseisund",
-    Uptime: "Eluiga",
-    "Cert Exp.": "Sert. aegumine",
-    day: "päev | päeva",
-    "-day": "-päev",
-    hour: "tund",
-    "-hour": "-tund",
-    Response: "Reaktsiooniaeg",
-    Ping: "Ping",
-    "Monitor Type": "Seire tüüp",
-    Keyword: "Võtmesõna",
-    "Friendly Name": "Sõbralik nimi",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Tukse sagedus",
-    Retries: "Korduskatsed",
-    Advanced: "Rohkem",
-    "Upside Down Mode": "Tagurpidi seire",
-    "Max. Redirects": "Max. ümbersuunamine",
-    "Accepted Status Codes": "Kõlblikud HTTP koodid",
-    Save: "Salvesta",
-    Notifications: "Teavitused",
-    "Not available, please setup.": "Ühtegi teavitusteenust pole saadaval.",
-    "Setup Notification": "Lisa teavitusteenus",
-    Light: "hele",
-    Dark: "tume",
-    Auto: "automaatne",
-    "Theme - Heartbeat Bar": "Teemasäte — tuksete riba",
-    Normal: "tavaline",
-    Bottom: "all",
-    None: "puudub",
-    Timezone: "Ajatsoon",
-    "Search Engine Visibility": "Otsimootorite ligipääs",
-    "Allow indexing": "Luba indekseerimine",
-    "Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt",
-    "Change Password": "Muuda parooli",
-    "Current Password": "praegune parool",
-    "New Password": "uus parool",
-    "Repeat New Password": "korda salasõna",
-    "Update Password": "Uuenda salasõna",
-    "Disable Auth": "Lülita autentimine välja",
-    "Enable Auth": "Lülita autentimine sisse",
-    "disableauth.message1": "Kas soovid <strong>lülitada autentimise välja</strong>?",
-    "disableauth.message2": "Kastuamiseks <strong>välise autentimispakkujaga</strong>, näiteks Cloudflare Access.",
-    "Please use this option carefully!": "Palun kasuta vastutustundlikult.",
-    Logout: "Logi välja",
-    Leave: "Lahku",
-    "I understand, please disable": "Olen tutvunud riskidega, lülita välja",
-    Confirm: "Kinnita",
-    Yes: "Jah",
-    No: "Ei",
-    Username: "kasutajanimi",
-    Password: "parool",
-    "Remember me": "Mäleta mind",
-    Login: "Logi sisse",
-    "No Monitors, please": "Seired puuduvad.",
-    "add one": "Lisa esimene",
-    "Notification Type": "Teavituse tüüp",
-    Email: "e-posti aadress",
-    Test: "Saada prooviteavitus",
-    "Certificate Info": "Sertifikaadi teave",
-    "Resolver Server": "Server, mis vastab DNS päringutele.",
-    "Resource Record Type": "DNS kirje tüüp",
-    "Last Result": "Viimane",
-    "Create your admin account": "Admininstraatori konto loomine",
-    "Repeat Password": "korda salasõna",
-    respTime: "Reageerimisaeg (ms)",
-    notAvailableShort: "N/A",
-    enableDefaultNotificationDescription: "Kõik järgnevalt lisatud seired kasutavad seda teavitusteenuset. Seiretelt võib teavitusteenuse ühekaupa eemaldada.",
-    clearEventsMsg: "Kas soovid seire kõik sündmused kustutada?",
-    clearHeartbeatsMsg: "Kas soovid seire kõik tuksed kustutada?",
-    confirmClearStatisticsMsg: "Kas soovid TERVE ajaloo kustutada?",
-    Export: "Eksport",
-    Import: "Import",
-    "Default enabled": "Kasuta vaikimisi",
-    "Apply on all existing monitors": "Kõik praegused seired hakkavad kasutama seda teavitusteenust",
-    Create: "Loo konto",
-    "Clear Data": "Eemalda andmed",
-    Events: "Sündmused",
-    Heartbeats: "Tuksed",
-    "Auto Get": "Hangi automaatselt",
-    backupDescription: "Varunda kõik seired ja teavitused JSON faili.",
-    backupDescription2: "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.",
-    backupDescription3: "Varukoopiad sisaldavad teavitusteenusete pääsuvõtmeid.",
-    alertNoFile: "Palun lisa fail, mida importida.",
-    alertWrongFileType: "Palun lisa JSON-formaadis fail.",
-    twoFAVerifyLabel: "2FA kinnitamiseks sisesta pääsukood",
-    tokenValidSettingsMsg: "Kood õige. Akna võib sulgeda.",
-    confirmEnableTwoFAMsg: "Kas soovid 2FA sisse lülitada?",
-    confirmDisableTwoFAMsg: "Kas soovid 2FA välja lülitada?",
-    "Verify Token": "Kontrolli",
-    "Setup 2FA": "Kaksikautentimise seadistamine",
-    "Enable 2FA": "Seadista 2FA",
-    "Disable 2FA": "Lülita 2FA välja",
-    "2FA Settings": "2FA seaded",
-    "Two Factor Authentication": "Kaksikautentimine",
-    Active: "kasutusel",
-    Inactive: "seadistamata",
-    Token: "kaksikautentimise kood",
-    "Show URI": "Näita URId",
-    "Clear all statistics": "Tühjenda ajalugu",
-    importHandleDescription: "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.",
-    confirmImportMsg: "Käkerdistest hoidumiseks lae enne taastamist alla uus varukoopia. Kas soovid taastada üles laetud?",
-    "Heartbeat Retry Interval": "Korduskatsete intervall",
-    "Import Backup": "Varukoopia importimine",
-    "Export Backup": "Varukoopia eksportimine",
-    "Skip existing": "lisa praegustele",
-    Overwrite: "asenda",
-    Options: "Mestimisviis",
-    "Keep both": "kombineeri",
-    Tags: "Sildid",
-    "Add New below or Select...": "Leia või lisa all uus…",
-    "Tag with this name already exist.": "Selle nimega silt on juba olemas.",
-    "Tag with this value already exist.": "Selle väärtusega silt on juba olemas.",
-    color: "värvus",
-    "value (optional)": "väärtus (fakultatiivne)",
-    Gray: "hall",
-    Red: "punane",
-    Orange: "oranž",
-    Green: "roheline",
-    Blue: "sinine",
-    Indigo: "indigo",
-    Purple: "lilla",
-    Pink: "roosa",
-    "Search...": "Otsi…",
-    "Avg. Ping": "Keskmine ping",
-    "Avg. Response": "Keskmine reaktsiooniaeg",
-    "Entry Page": "Avaleht",
-    statusPageNothing: "Kippu ega kõppu; siia saab lisada seireid või -gruppe.",
-    "No Services": "Teenused puuduvad.",
-    "All Systems Operational": "Kõik töökorras",
-    "Partially Degraded Service": "Teenuse töö osaliselt häiritud",
-    "Degraded Service": "Teenuse töö häiritud",
-    "Add Group": "Lisa grupp",
-    "Edit Status Page": "Muuda lehte",
-    "Go to Dashboard": "Töölauale",
-    checkEverySecond: "Kontrolli peale tõrget {0} sekundilise vahega.",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "elektronpost (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (vahendab üle 65 teavitusteenust)",
-    pushbullet: "Pushbullet",
-    line: "LINE",
-    mattermost: "Mattermost",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API otsik",
-    alertaEnvironment: "Keskkond",
-    alertaApiKey: "API võti",
-    alertaAlertState: "Häireseisund",
-    alertaRecoverState: "Taasta algolek",
-};
diff --git a/src/languages/eu.js b/src/languages/eu.js
deleted file mode 100644
index a491c872..00000000
--- a/src/languages/eu.js
+++ /dev/null
@@ -1,541 +0,0 @@
-export default {
-    languageName: "Euskara",
-    checkEverySecond: "Egiaztatu {0} segunduro",
-    retryCheckEverySecond: "Errepikatu {0} segunduro",
-    retriesDescription: "Zerbitzua erorita markatu eta jakinarazpena bidali aurretik egindako saiakera kopuru maximoa",
-    ignoreTLSError: "Ezikusiarena egin TLS/SSL erroreei HTTPS webguneetan",
-    upsideDownModeDescription: "Alderantzizkatu erortze egoera. Zerbitzua martxan badago, ERORITA markatuko du.",
-    maxRedirectDescription: "Jarraitu beharreko berbideratze kopuru maximoa. Jarri 0 berbideratzeak desgaitzeko.",
-    acceptedStatusCodesDescription: "Hautatu erantzun ona kontsideratzen diren egoera kodeak.",
-    passwordNotMatchMsg: "Errepikatutako pasahitza ez dator bat.",
-    notificationDescription: "Jakinarazpenak monitorizazio funtzio bati asignatu behar zaizkio.",
-    keywordDescription: "Bilatu gako-hitza HTML edo JSON erantzunean. Bilaketan maiuskulak kontuan hartzen dira.",
-    pauseDashboardHome: "Gelditu",
-    deleteMonitorMsg: "Ziur zaude monitorizazio hau ezabatu nahi duzula?",
-    deleteNotificationMsg: "Ziur zaude jakinarazpen hau monitorizazio guztientzat ezabatu nahi duzula?",
-    dnsPortDescription: "DNS zerbitzari portua. Defektuz 53. Nahi duzunean aldatu dezakezu portua.",
-    resolverserverDescription: "Cloudflare zerbitzari lehenetsia da. Edozein unetan alda dezakezu ebazteko zerbitzaria.",
-    rrtypeDescription: "Hautatu kontrolatu nahi duzun RR mota",
-    enableDefaultNotificationDescription: "Jakinarazpen hau monitore berrientzat gaituko da defektuz. Baina monitorizazio bakoitzarentzat jakinarazpena desgaitu dezakezu.",
-    pauseMonitorMsg: "Ziur zaude gelditu egin nahi duzula?",
-    clearEventsMsg: "Ziur zaude monitorizazio honen gertaera guztiak ezabatu nahi dituzula?",
-    clearHeartbeatsMsg: "Ziur zaude monitorizazio honen pultsu guztiak ezabatu nahi dituzula?",
-    confirmClearStatisticsMsg: "Ziur zaude estatistika GUZTIAK ezabatu nahi dituzula?",
-    importHandleDescription: "Aukeratu 'existitzen bada', izen bereko monitore edo jakinarazpen bakoitza saltatu nahi baduzu. Lehendik dauden kontrol eta jakinarazpen guztiak ezabatuko ditu 'Gainidatzi' aukerak.",
-    confirmImportMsg: "Ziur zaude segurtasun-kopia inportatu nahi duzula? Egiaztatu inportatzeko aukera zuzena hautatu duzula.",
-    twoFAVerifyLabel: "Sartu zure tokena 2FA egiaztatzeko:",
-    tokenValidSettingsMsg: "Tokenak balio du! Orain 2FA konfigurazioa gorde dezakezu.",
-    confirmEnableTwoFAMsg: "Ziur zaude 2FA gaitu nahi duzula?",
-    confirmDisableTwoFAMsg: "Ziur zaude 2FA desgaitu nahi duzula?",
-    Settings: "Ezarpenak",
-    Dashboard: "Arbela",
-    "New Update": "Eguneraketa berria",
-    Language: "Hizkuntza",
-    Appearance: "Itxura",
-    Theme: "Gaia",
-    General: "Orokorra",
-    "Primary Base URL": "Oinarrizkoa URL",
-    Version: "Bertsioa",
-    "Check Update On GitHub": "Egiaztatu eguneraketa GitHuben",
-    List: "Zerrenda",
-    Add: "Gehitu",
-    "Add New Monitor": "Gehitu monitorizazio berria",
-    "Quick Stats": "Estatistika azkarrak",
-    Up: "Erabilgarri",
-    Down: "Erorita",
-    Pending: "Zain",
-    Unknown: "Ezezaguna",
-    Pause: "Gelditu",
-    Name: "Izena",
-    Status: "Egoera",
-    DateTime: "Data eta ordua",
-    Message: "Mezua",
-    "No important events": "Gertaera garrantzitsurik ez",
-    Resume: "Jarraitu",
-    Edit: "Editatu",
-    Delete: "Ezabatu",
-    Current: "Unekoa",
-    Uptime: "Martxan",
-    "Cert Exp.": "Ziurtagiri iraun.",
-    day: "egun | egun",
-    "-day": "-egun",
-    hour: "ordua",
-    "-hour": "-ordu",
-    Response: "Erantzuna",
-    Ping: "Ping",
-    "Monitor Type": "Monitorizazio mota",
-    Keyword: "Gakohitza",
-    "Friendly Name": "Izen xumea",
-    URL: "URLa",
-    Hostname: "Ostalari izena",
-    Port: "Portua",
-    "Heartbeat Interval": "Pultsu interbaloak",
-    Retries: "Errepikapenak",
-    "Heartbeat Retry Interval": "Pultsu errepikatze interbaloak",
-    Advanced: "Aurreratua",
-    "Upside Down Mode": "Alderantzizkako modua",
-    "Max. Redirects": "Berbideratze max.",
-    "Accepted Status Codes": "Onartutako egoera kodeak",
-    "Push URL": "Push URLa",
-    needPushEvery: "URL hau {0} segunduro deitu beharko zenuke.",
-    pushOptionalParams: "Hautazko parametroak: {0}",
-    Save: "Gorde",
-    Notifications: "Jakinarazpenak",
-    "Not available, please setup.": "Ez dago eskuragarri, ezarri mesedez.",
-    "Setup Notification": "Ezarri jakinarazpenak",
-    Light: "Argia",
-    Dark: "Iluna",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Gaia - Pultsu barra",
-    Normal: "Normala",
-    Bottom: "Behean",
-    None: "Bat ere ez",
-    Timezone: "Timezone",
-    "Search Engine Visibility": "Bilatzaile ikurgarritasuna",
-    "Allow indexing": "Onartu indexatzea",
-    "Discourage search engines from indexing site": "Discourage search engines from indexing site",
-    "Change Password": "Aldatu pasahitza",
-    "Current Password": "Uneko pasahitza",
-    "New Password": "Pasahitz berria",
-    "Repeat New Password": "Errepikatu pasahitz berria",
-    "Update Password": "Eguneratu pasahitza",
-    "Disable Auth": "Desgaitu Auth",
-    "Enable Auth": "Gaitu Auth",
-    "disableauth.message1": "Ziur zaude <strong>autentifikazioa desgaitu</strong> nahi duzula?",
-    "disableauth.message2": "Egoera jakin batzuetarako diseinatuta dago, Uptime Kumaren <strong>aurrean hirugarrengo autentifikazio batzuek jartzeko</strong> (Cloudflare Access, Authelia edo beste autentifikazio-mekanismo batzuk).",
-    "Please use this option carefully!": "Mesedez, kontuz erabili aukera hau!",
-    Logout: "Saioa amaitu",
-    Leave: "Utzi",
-    "I understand, please disable": "Ulertzen dut, mesedez desgaitu",
-    Confirm: "Baieztatu",
-    Yes: "Bai",
-    No: "Ez",
-    Username: "Erabiltzailea",
-    Password: "Pasahitza",
-    "Remember me": "Gogora nazazu",
-    Login: "Saioa hasi",
-    "No Monitors, please": "Monitorizaziorik ez, mesedez",
-    "add one": "gehitu bat",
-    "Notification Type": "Jakinarazpen mota",
-    Email: "Emaila",
-    Test: "Testa",
-    "Certificate Info": "Ziurtagiri informazioa",
-    "Resolver Server": "Ebazpen-zerbitzaria",
-    "Resource Record Type": "Baliabideen erregistro mota",
-    "Last Result": "Azken emaitza",
-    "Create your admin account": "Sortu zure admin kontua",
-    "Repeat Password": "Errepikatu pasahitza",
-    "Import Backup": "segurtasun-kopia inportatu",
-    "Export Backup": "segurtasun-kopia esportatu",
-    Export: "Esportatu",
-    Import: "Inportatu",
-    respTime: "Erantz. denbora (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Lehenetsia gaituta",
-    "Apply on all existing monitors": "Aplikatu existitzen diren monitorizazio guztietan",
-    Create: "Sortu",
-    "Clear Data": "Garbitu datuak",
-    Events: "Gertaerak",
-    Heartbeats: "Pultsuak",
-    "Auto Get": "Auto Get",
-    backupDescription: "Monitore eta jakinarazpen guztien segurtasun-kopiak egin ditzakezu JSON fitxategi batean.",
-    backupDescription2: "Oharra: ez dira historia eta gertaeren datuak sartzen.",
-    backupDescription3: "Datu sentikorrak, hala nola jakinarazpen tokenak, esportazio-fitxategian sartzen dira; mesedez, gorde esportazioa modu seguruan.",
-    alertNoFile: "Mesedez hautatu inportatzeko fitxategia.",
-    alertWrongFileType: "Mesedez hautatu JSON fitxategia.",
-    "Clear all statistics": "Garbitu estatistika guztiak",
-    "Skip existing": "Saltatu existitzen bada",
-    Overwrite: "Gainidatzi",
-    Options: "Aukerak",
-    "Keep both": "Biak mantendu",
-    "Verify Token": "Egiaztatu Tokena",
-    "Setup 2FA": "Ezarri 2FA",
-    "Enable 2FA": "Gaitu 2FA",
-    "Disable 2FA": "Desgaitu 2FA",
-    "2FA Settings": "2FA ezarpenak",
-    "Two Factor Authentication": "Bi aldetako autentifikazioa (2FA)",
-    Active: "Aktibo",
-    Inactive: "Inaktibo",
-    Token: "Tokena",
-    "Show URI": "Erakutsi URIa",
-    Tags: "Etiketak",
-    "Add New below or Select...": "Gehitu beste bat behean edo hautatu...",
-    "Tag with this name already exist.": "Izen hau duen etiketa dagoeneko badago.",
-    "Tag with this value already exist.": "Balio hau duen etiketa dagoeneko badago.",
-    color: "kolorea",
-    "value (optional)": "balioa (hautazkoa)",
-    Gray: "Grisa",
-    Red: "Gorria",
-    Orange: "Naranja",
-    Green: "Berdea",
-    Blue: "Urdina",
-    Indigo: "Indigo",
-    Purple: "Morea",
-    Pink: "Arrosa",
-    "Search...": "Bilatu...",
-    "Avg. Ping": "Batazbesteko Pinga",
-    "Avg. Response": "Batazbesteko erantzuna",
-    "Entry Page": "Sarrera orria",
-    statusPageNothing: "Ezer ere ez hemen, mesedez gehitu taldea edo monitorizazioa.",
-    "No Services": "Zerbitzurik ez",
-    "All Systems Operational": "Sistema guztiak martxan",
-    "Partially Degraded Service": "Zerbitzu partzialki degradatua",
-    "Degraded Service": "Zerbitzu degradatua",
-    "Add Group": "Gehitu taldea",
-    "Add a monitor": "Gehitu monitorizazioa",
-    "Edit Status Page": "Editatu egoera orria",
-    "Go to Dashboard": "Joan arbelera",
-    "Status Page": "Egoera orria",
-    "Status Pages": "Egoera orriak",
-    defaultNotificationName: "Nire {notification} Alerta ({number})",
-    here: "Hemen",
-    Required: "Beharrezkoa",
-    telegram: "Telegram",
-    "ZohoCliq": "ZohoCliq",
-    "Bot Token": "Bot Tokena",
-    wayToGetTelegramToken: "You can get a token from {0}.",
-    "Chat ID": "Txat IDa",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
-    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
-    chatIDNotFound: "Chat ID is not found; please send a message to this bot first",
-    webhook: "Webhook",
-    "Post URL": "Bidalketa URLa",
-    "Content Type": "Eduki mota",
-    webhookJsonDesc: "{0} is good for any modern HTTP servers such as Express.js",
-    webhookFormDataDesc: "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
-    smtp: "Emaila (SMTP)",
-    secureOptionNone: "Bat ere ez / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignore TLS Error",
-    "From Email": "Email honetatik",
-    emailCustomSubject: "Pertsonalizatutako gaia",
-    "To Email": "Email honetara",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "Bot Display Name",
-    "Prefix Custom Message": "Prefix Custom Message",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "You can learn how to create a webhook URL {0}.",
-    wayToGetZohoCliqURL: "You can learn how to create a webhook URL {0}.",
-    signal: "Signal",
-    Number: "Zenbakia",
-    Recipients: "Recipients",
-    needSignalAPI: "You need to have a signal client with REST API.",
-    wayToCheckSignalURL: "You can check this URL to view how to set one up:",
-    signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
-    gotify: "Gotify",
-    "Application Token": "Aplikazio tokena",
-    "Server URL": "Zerbitzari URLa",
-    Priority: "Lehentasuna",
-    slack: "Slack",
-    "Icon Emoji": "Emoji ikonoa",
-    "Channel Name": "Kanalaren izena",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "More info about Webhooks on: {0}",
-    aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
-    aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Erabiltzaile gakoa",
-    Device: "Gailua",
-    "Message Title": "Mezuaren izenburua",
-    "Notification Sound": "Jakinarazpen soinua",
-    "More info on:": "More info on: {0}",
-    pushoverDesc1: "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
-    pushoverDesc2: "If you want to send notifications to different devices, fill out Device field.",
-    "SMS Type": "SMS mota",
-    octopushTypePremium: "Premium (Fast - recommended for alerting)",
-    octopushTypeLowCost: "Low Cost (Slow - sometimes blocked by operator)",
-    checkPrice: "Check {0} prices:",
-    apiCredentials: "API credentials",
-    octopushLegacyHint: "Do you use the legacy version of Octopush (2011-2020) or the new version?",
-    "Check octopush prices": "Check octopush prices {0}.",
-    octopushPhoneNumber: "Phone number (intl format, eg : +33612345678) ",
-    octopushSMSSender: "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Adibidez: {0}",
-    "Read more:": "Irakurri gehiago: {0}",
-    "Status:": "Egoera: {0}",
-    "Read more": "Irakurri gehiago",
-    appriseInstalled: "Apprise instalatuta.",
-    appriseNotInstalled: "Apprise ez dago instalatuta. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Oinarrizko ezarpenak",
-    "User ID": "Erabiltzaile ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
-    "Icon URL": "Ikono URL",
-    aboutIconURL: "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
-    aboutMattermostChannelName: "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
-    promosmsTypeFlash: "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
-    promosmsTypeFull: "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
-    promosmsTypeSpeed: "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
-    promosmsPhoneNumber: "Phone number (for Polish recipient You can skip area codes)",
-    promosmsSMSSender: "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Hasiera zerbitzari URL (with http(s):// and optionally port)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
-    Method: "Metodoa",
-    Body: "Gorputza",
-    Headers: "Goiburuak",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "The request headers are not valid JSON: ",
-    BodyInvalidFormat: "The request body is not valid JSON: ",
-    "Monitor History": "Monitorizazio Historia",
-    clearDataOlderThan: "Keep monitor history data for {0} days.",
-    PasswordsDoNotMatch: "Pasahitzak ez datoz bat.",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ",
-    "Current User": "Uneko erabiltzailea",
-    topic: "Topic",
-    topicExplanation: "MQTT topic to monitor",
-    successMessage: "Arrakasta mezua",
-    successMessageExplanation: "MQTT message that will be considered as success",
-    recent: "Duela gutxikoa",
-    Done: "Egina",
-    Info: "Info",
-    Security: "Segurtasuna",
-    "Steam API Key": "Steam API Giltza",
-    "Shrink Database": "Shrink Datubasea",
-    "Pick a RR-Type...": "Pick a RR-Type...",
-    "Pick Accepted Status Codes...": "Hautatu onartutako egoera kodeak...",
-    Default: "Lehenetsia",
-    "HTTP Options": "HTTP Aukerak",
-    "Create Incident": "Sortu inzidentzia",
-    Title: "Titulua",
-    Content: "Edukia",
-    Style: "Estiloa",
-    info: "info",
-    warning: "kontuz",
-    danger: "arriskua",
-    error: "errorea",
-    critical: "kritikoa",
-    primary: "oinarrizkoa",
-    light: "argia",
-    dark: "iluna",
-    Post: "Post",
-    "Please input title and content": "Mesedez sartu titulua eta edukia",
-    Created: "Sortuta",
-    "Last Updated": "Azken eguneratzea",
-    Unpin: "Unpin",
-    "Switch to Light Theme": "Aldatu gai argira",
-    "Switch to Dark Theme": "Aldatu gai ilunera",
-    "Show Tags": "Erakutsi etiketak",
-    "Hide Tags": "Ezkutatu etiketak",
-    Description: "Deskribapena",
-    "No monitors available.": "Monitorizaziorik eskuragarri ez.",
-    "Add one": "Gehitu bat",
-    "No Monitors": "Monitorizaziorik ez",
-    "Untitled Group": "Titulurik gabeko taldea",
-    Services: "Zerbitzuak",
-    Discard: "Baztertu",
-    Cancel: "Ezeztatu",
-    "Powered by": "Honekin egina:",
-    shrinkDatabaseDescription: "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API erabiltzailea (webapi_ aurre-hizkia barne)",
-    serwersmsAPIPassword: "API pasahitza",
-    serwersmsPhoneNumber: "Telefono zenbakia",
-    serwersmsSenderName: "SMS bidaltzaile izena (registered via customer portal)",
-    stackfield: "Stackfield",
-    Customize: "Pertsonalizatu",
-    "Custom Footer": "Oin pertsonalizatua",
-    "Custom CSS": "CSS pertsonalizatua",
-    smtpDkimSettings: "DKIM ezarpenak",
-    smtpDkimDesc: "Please refer to the Nodemailer DKIM {0} for usage.",
-    documentation: "dokumentazioa",
-    smtpDkimDomain: "Domeinu izena",
-    smtpDkimKeySelector: "Gako hautatzailea",
-    smtpDkimPrivateKey: "Gako pribatua",
-    smtpDkimHashAlgo: "Hash algoritmoa (hautazkoa)",
-    smtpDkimheaderFieldNames: "Header Keys to sign (Optional)",
-    smtpDkimskipFields: "Header Keys not to sign (Optional)",
-    wayToGetPagerDutyKey: "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integrazio URLa",
-    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
-    "do nothing": "ez egin ezer",
-    "auto acknowledged": "auto acknowledged",
-    "auto resolve": "auto resolve",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Ingurunea",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Alerta egoera",
-    alertaRecoverState: "Berreskuratze egoera",
-    deleteStatusPageMsg: "Ziur zaude egoera orri hau ezabatu nahi duzula?",
-    Proxies: "Proxiak",
-    default: "Lehenetsia",
-    enabled: "Gaituta",
-    setAsDefault: "Ezarri lehenetsitzat",
-    deleteProxyMsg: "Are you sure want to delete this proxy for all monitors?",
-    proxyDescription: "Proxies must be assigned to a monitor to function.",
-    enableProxyDescription: "This proxy will not effect on monitor requests until it is activated. You can control temporarily disable the proxy from all monitors by activation status.",
-    setAsDefaultProxyDescription: "This proxy will be enabled by default for new monitors. You can still disable the proxy separately for each monitor.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Baliozkoa",
-    Invalid: "Baliogabea",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "TelefonoZenbakiak",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms txantiloiak parametroak eduki behar ditu: ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "For safety, must use secret key",
-    "Device Token": "Gailu tokena",
-    Platform: "Plataforma",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Altua",
-    Retry: "Errepikatu",
-    Topic: "Gaia",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Ezarri Proxya",
-    "Proxy Protocol": "Proxy protokoloa",
-    "Proxy Server": "Proxy zerbitzaria",
-    "Proxy server has authentication": "Proxy zerbitzariak autentifikazioa dauka",
-    User: "Erabiltzailea",
-    Installed: "Instalatuta",
-    "Not installed": "Instalatu gabe",
-    Running: "Martxan",
-    "Not running": "Ez martxan",
-    "Remove Token": "Ezabatu Tokena",
-    Start: "Hasi",
-    Stop: "Gelditu",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Gehitu egoera orri berria",
-    Slug: "Sluga",
-    "Accept characters:": "Onartu karaktereak:",
-    startOrEndWithOnly: "Start or end with {0} only",
-    "No consecutive dashes": "No consecutive dashes",
-    Next: "Hurrengoa",
-    "The slug is already taken. Please choose another slug.": "Sluga dagoeneko hartuta dago. Mesedez beste bat hautatu.",
-    "No Proxy": "Proxyrik ez",
-    Authentication: "Authentication",
-    "HTTP Basic Auth": "HTTP oinarrizko Auth",
-    "New Status Page": "Egoera orri berria",
-    "Page Not Found": "Orria ez da aurkitu",
-    "Reverse Proxy": "Alderantzizkako Proxya",
-    Backup: "Backup",
-    About: "Honi buruz",
-    wayToGetCloudflaredURL: "(Download cloudflared from {0})",
-    cloudflareWebsite: "Cloudflare webgunea",
-    "Message:": "Mezua:",
-    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
-    "Other Software": "Beste softwarea",
-    "For example: nginx, Apache and Traefik.": "Adibidez: nginx, Apache and Traefik.",
-    "Please read": "Mesedez irakurri",
-    "Subject:": "Gaia:",
-    "Valid To:": "Balio-epea:",
-    "Days Remaining:": "Egun faltan:",
-    "Issuer:": "Issuer:",
-    "Fingerprint:": "Hatzmarka:",
-    "No status pages": "Egoera orririk ez",
-    "Domain Name Expiry Notification": "Domeinu izen iraungitze jakinarazpena",
-    Proxy: "Proxya",
-    "Date Created": "Data sortuta",
-    onebotHttpAddress: "OneBot HTTP helbidea",
-    onebotMessageType: "OneBot mezu mota",
-    onebotGroupMessage: "Taldea",
-    onebotPrivateMessage: "Pribatua",
-    onebotUserOrGroupId: "Talde/Erabiltzaile IDa",
-    onebotSafetyTips: "For safety, must set access token",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Oineko testua",
-    "Show Powered By": "Erakutsi Honekin egina:",
-    "Domain Names": "Domeinu izenak",
-    signedInDisp: "Signed in as {0}",
-    signedInDispDisabled: "Auth desgaituta.",
-    "Certificate Expiry Notification": "Zertifikatu iraungitze jakinarazpena",
-    "API Username": "API Erabiltzailea",
-    "API Key": "API Gakoa",
-    "Recipient Number": "Recipient Number",
-    "From Name/Number": "From Name/Number",
-    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" from HTTP API credentials in control panel",
-    octopushLogin: "\"Login\" from HTTP API credentials in control panel",
-    promosmsLogin: "API Saio haste izena",
-    promosmsPassword: "API Pasahitza",
-    "pushoversounds pushover": "Pushover (defektuz)",
-    "pushoversounds bike": "Bizikleta",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Klasikoa",
-    "pushoversounds cosmic": "Kosmikoa",
-    "pushoversounds falling": "Erortzen",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magia",
-    "pushoversounds mechanical": "Mekanikoa",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Sirena",
-    "pushoversounds spacealarm": "Espazio Alarma",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Bibrazioa soilik",
-    "pushoversounds none": "Bat ere ez (isilik)",
-    pushyAPIKey: "Secret API giltza",
-    pushyToken: "Gailu tokena",
-    "Show update if available": "Erakutsi eguneratzea eskuragarri badago",
-    "Also check beta release": "Beta bertsioak ere egiaztatu",
-    "Using a Reverse Proxy?": "Proxy alderantzizkako zerbitzaria erabiltzen?",
-    "Check how to config it for WebSocket": "Check how to config it for WebSocket",
-    "Steam Game Server": "Steam joko zerbitzaria",
-    "Most likely causes:": "Arrazoi probableenak:",
-    "The resource is no longer available.": "Baliabidea ez dago erabilgarri.",
-    "There might be a typing error in the address.": "Idazketa-akats bat egon daiteke helbidean.",
-    "What you can try:": "Probatu dezakezuna:",
-    "Retype the address.": "Berridatzi helbidea.",
-    "Go back to the previous page.": "Itzuli aurreko orrialdera",
-    "Coming Soon": "Laster",
-    wayToGetClickSendSMSToken: "API erabiltzailea and API giltza hemendik lortu ditzakezu: {0} .",
-    "Connection String": "Konexio katea",
-    Query: "Kontsulta",
-    settingsCertificateExpiry: "TLS irungitze zertifikatua",
-    certificationExpiryDescription: "HTTPS Monitorizazio jakinarazpena martxan jarri TLS zertifikatua iraungitzeko hau falta denean:",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domeinua",
-    Workstation: "Lan gunea",
-    disableCloudflaredNoAuthMsg: "Ez Auth moduan zaude, pasahitza ez da beharrezkoa.",
-};
diff --git a/src/languages/fa.js b/src/languages/fa.js
deleted file mode 100644
index 52845192..00000000
--- a/src/languages/fa.js
+++ /dev/null
@@ -1,208 +0,0 @@
-export default {
-    languageName: "Farsi",
-    checkEverySecond: "بررسی هر {0} ثانیه.",
-    retryCheckEverySecond: "تکرار مجدد هر {0} ثانیه.",
-    retriesDescription: "حداکثر تعداد تکرار پیش از علامت گذاری وب‌سایت بعنوان خارج از دسترس و ارسال اطلاع‌رسانی.",
-    ignoreTLSError: "بی‌خیال ارور TLS/SSL برای سایت‌های HTTPS",
-    upsideDownModeDescription: "نتیجه وضعیت را برعکس کن، مثلا اگر سرویس در دسترس بود فرض کن که سرویس پایین است!",
-    maxRedirectDescription: "حداکثر تعداد ریدایرکتی که سرویس پشتیبانی کند. برای اینکه ری‌دایرکت‌ها پشتیبانی نشوند، عدد 0 را وارد کنید.",
-    acceptedStatusCodesDescription: "لطفا HTTP Status Code هایی که میخواهید به عنوان پاسخ موفقیت آمیز در نظر گرفته شود را انتخاب کنید.",
-    passwordNotMatchMsg: "تکرار رمز عبور مطابقت ندارد!",
-    notificationDescription: "برای اینکه سرویس اطلاع‌رسانی کار کند، آنرا به یکی از مانیتور‌ها متصل کنید.",
-    keywordDescription: "در نتیجه درخواست (اهمیتی ندارد پاسخ JSON است یا HTML) بدنبال این کلمه بگرد (حساس به کوچک/بزرگ بودن حروف).",
-    pauseDashboardHome: "متوقف شده",
-    deleteMonitorMsg: "آیا از حذف این مانیتور مطمئن هستید؟",
-    deleteNotificationMsg: "آیا مطمئن هستید که میخواهید این سرویس اطلاع‌رسانی را برای تمامی مانیتورها حذف کنید؟",
-    resolverserverDescription: "سرویس CloudFlare به عنوان سرور پیش‌فرض استفاده می‌شود، شما میتوانید آنرا به هر سرور دیگری بعدا تغییر دهید.",
-    rrtypeDescription: "لطفا نوع Resource Record را انتخاب کنید.",
-    pauseMonitorMsg: "آیا مطمئن هستید که میخواهید این مانیتور را متوقف کنید ؟",
-    enableDefaultNotificationDescription: "برای هر مانیتور جدید، این سرویس اطلاع‌رسانی به صورت پیش‌فرض فعال خواهد شد. البته که شما میتوانید به صورت دستی آنرا برای هر مانیتور به صورت جداگانه غیر فعال کنید.",
-    clearEventsMsg: "آیا از اینکه تمامی تاریخچه رویداد‌های این مانیتور حذف شود مطمئن هستید؟",
-    clearHeartbeatsMsg: "آیا از اینکه تاریخچه تمامی Heartbeat های این مانیتور حذف شود مطمئن هستید؟ ",
-    confirmClearStatisticsMsg: "آیا از حذف تمامی آمار و ارقام مطمئن هستید؟",
-    importHandleDescription: " اگر که میخواهید بیخیال مانیتورها و یا سرویس‌های اطلاع‌رسانی که با نام مشابه از قبل موجود هستند شوید، گزینه 'بی‌خیال موارد ..' را انتخاب کنید. توجه کنید که گزینه 'بازنویسی' تمامی موارد موجود با نام مشابه را از بین خواهد برد.",
-    confirmImportMsg: "آیا از بازگردانی بک آپ مطمئن هستید؟ لطفا از اینکه نوع بازگردانی درستی را انتخاب کرده‌اید اطمینان حاصل کنید!",
-    twoFAVerifyLabel: "لطفا جهت اطمینان از عملکرد احراز هویت دو مرحله‌ای توکن خود را وارد کنید!",
-    tokenValidSettingsMsg: "توکن شما معتبر است، هم اکنون میتوانید احراز هویت دو مرحله‌ای را فعال کنید!",
-    confirmEnableTwoFAMsg: " آیا از فعال سازی احراز هویت دو مرحله‌ای مطمئن هستید؟",
-    confirmDisableTwoFAMsg: "آیا از غیرفعال سازی احراز هویت دومرحله‌ای مطمئن هستید؟",
-    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.": "تاریخ انقضای SSL",
-    day: "روز",
-    "-day": "-روز",
-    hour: "ساعت",
-    "-hour": "-ساعت",
-    Response: "پاسخ",
-    Ping: "Ping",
-    "Monitor Type": "نوع مانیتور",
-    Keyword: "کلمه کلیدی",
-    "Friendly Name": "عنوان",
-    URL: "آدرس (URL)",
-    Hostname: "نام میزبان (Hostname)",
-    Port: "پورت",
-    "Heartbeat Interval": "فاصله هر Heartbeat",
-    Retries: "تلاش مجدد",
-    "Heartbeat Retry Interval": "فاصله تلاش مجدد برایHeartbeat",
-    Advanced: "پیشرفته",
-    "Upside Down Mode": "حالت بر عکس",
-    "Max. Redirects": "حداکثر تعداد ری‌دایرکت",
-    "Accepted Status Codes": "وضعیت‌های (Status Code) های قابل قبول",
-    Save: "ذخیره",
-    Notifications: "اطلاع‌رسانی‌ها",
-    "Not available, please setup.": "هیچ موردی موجود نیست، اولین مورد را راه اندازی کنید!",
-    "Setup Notification": "راه اندازی اطلاع‌رسانی‌",
-    Light: "روشن",
-    Dark: "تاریک",
-    Auto: "اتوماتیک",
-    "Theme - Heartbeat Bar": "ظاهر نوار Heartbeat",
-    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": "فعال سازی تایید هویت",
-    "disableauth.message1": "آیا مطمئن هستید که میخواهید <strong>احراز هویت را غیر فعال کنید</strong>?",
-    "disableauth.message2": "این ویژگی برای کسانی است که <strong> لایه امنیتی شخص ثالث دیگر بر روی این آدرس فعال کرده‌اند</strong>، مانند Cloudflare Access.",
-    "Please use this option carefully!": "لطفا از این امکان با دقت استفاده کنید.",
-    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": "نوع رکورد (Resource Record Type)",
-    "Last Result": "آخرین نتیجه",
-    "Create your admin account": "ایجاد حساب کاربری مدیر",
-    "Repeat Password": "تکرار رمز عبور",
-    "Import Backup": "بازگردانی فایل پشتیبان",
-    "Export Backup": "ذخیره فایل پشتیبان",
-    Export: "استخراج اطلاعات",
-    Import: "ورود اطلاعات",
-    respTime: "زمان پاسخگویی (میلی‌ثانیه)",
-    notAvailableShort: "ناموجود",
-    "Default enabled": "به صورت پیش‌فرض فعال باشد.",
-    "Apply on all existing monitors": "بر روی تمامی مانیتور‌های فعلی اعمال شود.",
-    Create: "ایجاد",
-    "Clear Data": "پاکسازی داده‌ها",
-    Events: "رخداد‌ها",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    backupDescription: "شما میتوانید تمامی مانیتورها و تنظیمات اطلاع‌رسانی‌ها را در قالب یه فایل JSON دریافت کنید.",
-    backupDescription2: "البته تاریخچه رخدادها دراین فایل قرار نخواهند داشت.",
-    backupDescription3: "توجه داشته باشید که تمامی اطلاعات حساس شما مانند توکن‌ها نیز در این فایل وجود خواهد داشت ، پس از این فایل به خوبی مراقبت کنید.",
-    alertNoFile: "لطفا یک فایل برای «ورود اطلاعات» انتخاب کنید..",
-    alertWrongFileType: "یک فایل JSON انتخاب کنید.",
-    "Clear all statistics": "پاکسازی تمامی آمار و ارقام",
-    "Skip existing": "بی‌خیال مواردی که از قبل موجود است",
-    Overwrite: "بازنویسی",
-    Options: "تنظیمات",
-    "Keep both": "هر دو را نگه‌ دار",
-    "Verify Token": "تایید توکن",
-    "Setup 2FA": "تنظیمات احراز دو مرحله‌ای",
-    "Enable 2FA": "فعال سازی احراز 2 مرحله‌ای",
-    "Disable 2FA": "غیر فعال کردن احراز 2 مرحله‌ای",
-    "2FA Settings": "تنظیمات احراز 2 مرحله‌ای",
-    "Two Factor Authentication": "احراز هویت دومرحله‌ای",
-    Active: "فعال",
-    Inactive: "غیرفعال",
-    Token: "توکن",
-    "Show URI": "نمایش آدرس (URI) ",
-    Tags: "برچسب‌ها",
-    "Add New below or Select...": "یک مورد جدید اضافه کنید و یا از لیست انتخاب کنید...",
-    "Tag with this name already exist.": "یک برچسب با این «نام» از قبل وجود دارد",
-    "Tag with this value already exist.": "یک برچسب با این «مقدار» از قبل وجود دارد.",
-    color: "رنگ",
-    "value (optional)": "مقدار (اختیاری)",
-    Gray: "خاکستری",
-    Red: "قرمز",
-    Orange: "نارنجی",
-    Green: "سبز",
-    Blue: "آبی",
-    Indigo: "نیلی",
-    Purple: "بنفش",
-    Pink: "صورتی",
-    "Search...": "جستجو...",
-    "Avg. Ping": "متوسط پینگ",
-    "Avg. Response": "متوسط زمان پاسخ",
-    "Entry Page": "صفحه ورودی",
-    statusPageNothing: "چیزی اینجا نیست، لطفا یک گروه و یا یک مانیتور اضافه کنید!",
-    "No Services": "هیچ سرویسی موجود نیست",
-    "All Systems Operational": "تمامی سیستم‌ها عملیاتی هستند!",
-    "Partially Degraded Service": "افت نسبی کیفیت سرویس",
-    "Degraded Service": "افت کامل کیفیت سرویس",
-    "Add Group": "اضافه کردن گروه",
-    "Add a monitor": "اضافه کردن مانیتور",
-    "Edit Status Page": "ویرایش صفحه وضعیت",
-    "Status Page": "صفحه وضعیت",
-    "Status Pages": "صفحه وضعیت",
-    "Go to Dashboard": "رفتن به پیشخوان",
-    "Uptime Kuma": "آپتایم کوما",
-    records: "مورد",
-    "One record": "یک مورد",
-    Info: "اطلاعات",
-    "Powered by": "نیرو گرفته از",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/fr-FR.js b/src/languages/fr-FR.js
deleted file mode 100644
index 379e818f..00000000
--- a/src/languages/fr-FR.js
+++ /dev/null
@@ -1,684 +0,0 @@
-export default {
-    languageName: "Français",
-    checkEverySecond: "Vérifier toutes les {0} secondes",
-    retryCheckEverySecond: "Réessayer toutes les {0} secondes",
-    resendEveryXTimes: "Renvoyez toutes les {0} fois",
-    resendDisabled: "Renvoi désactivé",
-    retriesDescription: "Nombre d'essais avant que le service ne soit déclaré hors ligne et qu'une notification soit envoyée.",
-    ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS",
-    upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors ligne et vice-versa.",
-    maxRedirectDescription: "Nombre maximal de redirections avant que le service ne soit marqué comme hors ligne.",
-    enableGRPCTls: "Autoriser l'envoi d'une requête gRPC avec une connexion TLS",
-    grpcMethodDescription: "Le nom de la méthode est converti au format CamelCase tel que sayHello, check, etc.",
-    acceptedStatusCodesDescription: "Codes HTTP qui considèrent le service comme étant disponible.",
-    Maintenance: "Maintenance",
-    statusMaintenance: "Maintenance",
-    "Schedule maintenance": "Planifier la maintenance",
-    "Affected Monitors": "Sondes concernées",
-    "Pick Affected Monitors...": "Sélectionner les sondes concernées...",
-    "Start of maintenance": "Début de la maintenance",
-    "All Status Pages": "Toutes les pages d'état",
-    "Select status pages...": "Sélectionner les pages d'état...",
-    recurringIntervalMessage: "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
-    affectedMonitorsDescription: "Sélectionnez les sondes concernées par la maintenance en cours",
-    affectedStatusPages: "Afficher ce message de maintenance sur les pages d'état sélectionnées",
-    atLeastOneMonitor: "Sélectionnez au moins une sonde concernée",
-    passwordNotMatchMsg: "Les mots de passe ne correspondent pas",
-    notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
-    keywordDescription: "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
-    pauseDashboardHome: "En pause",
-    deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
-    deleteMaintenanceMsg: "Voulez-vous vraiment supprimer cette maintenance ?",
-    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.",
-    dnsPortDescription: "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
-    resolverserverDescription: "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
-    rrtypeDescription: "Veuillez sélectionner un type d'enregistrement DNS",
-    pauseMonitorMsg: "Êtes-vous sûr de vouloir mettre en pause cette sonde ?",
-    enableDefaultNotificationDescription: "Pour chaque nouvelle sonde, cette notification sera activée par défaut. Vous pouvez toujours désactiver la notification séparément pour chaque sonde.",
-    clearEventsMsg: "Êtes-vous sûr de vouloir supprimer tous les événements pour cette sonde ?",
-    clearHeartbeatsMsg: "Êtes-vous sûr de vouloir supprimer toutes les vérifications pour cette sonde ?",
-    confirmClearStatisticsMsg: "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
-    importHandleDescription: "Choisissez « Ignorer l'existant » si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option « Écraser » supprime toutes les sondes et notifications existantes.",
-    confirmImportMsg: "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
-    twoFAVerifyLabel: "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
-    tokenValidSettingsMsg: "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres de double authentification (2FA).",
-    confirmEnableTwoFAMsg: "Êtes-vous sûr de vouloir activer la double authentification (2FA) ?",
-    confirmDisableTwoFAMsg: "Êtes-vous sûr de vouloir désactiver la double authentification (2FA) ?",
-    Settings: "Paramètres",
-    Dashboard: "Tableau de bord",
-    "New Update": "Mise à jour disponible",
-    Language: "Langue",
-    Appearance: "Apparence",
-    Theme: "Thème",
-    General: "Général",
-    "Primary Base URL": "URL principale",
-    Version: "Version",
-    "Check Update On GitHub": "Consulter les mises à jour sur GitHub",
-    List: "Lister",
-    Add: "Ajouter",
-    "Add New Monitor": "Ajouter une nouvelle sonde",
-    "Quick Stats": "Résumé",
-    Up: "En ligne",
-    Down: "Hors ligne",
-    Pending: "En attente",
-    Unknown: "Inconnu",
-    Pause: "En pause",
-    Name: "Nom",
-    Status: "État",
-    DateTime: "Heure",
-    Message: "Messages",
-    "No important events": "Aucun évènement important",
-    Resume: "Reprendre",
-    Edit: "Modifier",
-    Delete: "Supprimer",
-    Current: "Actuellement",
-    Uptime: "Disponibilité",
-    "Cert Exp.": "Expiration SSL",
-    day: "jour | jours",
-    "-day": " jours",
-    hour: "heure",
-    "-hour": " heure",
-    Response: "Temps de réponse",
-    Ping: "Ping",
-    "Monitor Type": "Type de sonde",
-    Keyword: "Mot-clé",
-    "Friendly Name": "Nom d'affichage",
-    URL: "URL",
-    Hostname: "Nom d'hôte / adresse IP",
-    Port: "Port",
-    "Heartbeat Interval": "Intervalle de vérification",
-    Retries: "Essais",
-    "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
-    "Resend Notification if Down X times consequently": "Renvoyer une notification si hors ligne X fois",
-    Advanced: "Avancé",
-    "Upside Down Mode": "Mode inversé",
-    "Max. Redirects": "Nombre maximum de redirections",
-    "Accepted Status Codes": "Codes HTTP acceptés",
-    "Push URL": "Push URL",
-    needPushEvery: "Vous devez appeler cette URL toutes les {0} secondes.",
-    pushOptionalParams: "Paramètres facultatifs : {0}",
-    Save: "Sauvegarder",
-    Notifications: "Notifications",
-    "Not available, please setup.": "Non disponible, merci de le configurer.",
-    "Setup Notification": "Créer une notification",
-    Light: "Clair",
-    Dark: "Sombre",
-    Auto: "Automatique",
-    "Theme - Heartbeat Bar": "Thème - barres d'état",
-    Normal: "Normal",
-    Bottom: "En dessous",
-    None: "Aucun",
-    Timezone: "Fuseau horaire",
-    "Search Engine Visibility": "Visibilité par les moteurs de recherche",
-    "Allow indexing": "Autoriser l'indexation",
-    "Discourage search engines from indexing site": "Refuser l'indexation",
-    "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",
-    "Update Password": "Mettre à jour le mot de passe",
-    "Disable Auth": "Désactiver l'authentification",
-    "Enable Auth": "Activer l'authentification",
-    "disableauth.message1": "Voulez-vous vraiment <strong>désactiver l'authentification</strong> ?",
-    "disableauth.message2": "Cette fonctionnalité est conçue pour les scénarios <strong>où vous avez l'intention d'implémenter une authentification tierce</strong> devant Uptime Kuma, comme Cloudflare Access, Authelia ou d'autres mécanismes d'authentification.",
-    "Please use this option carefully!": "Veuillez utiliser cette option avec précaution !",
-    Logout: "Déconnexion",
-    Leave: "Quitter",
-    "I understand, please disable": "Je comprends, désactivez-la",
-    Confirm: "Confirmer",
-    Yes: "Oui",
-    No: "Non",
-    Username: "Nom d'utilisateur",
-    Password: "Mot de passe",
-    "Remember me": "Se souvenir de moi",
-    Login: "Connexion",
-    "No Monitors, please": "Pas de sondes, veuillez",
-    "add one": "en ajouter une",
-    "Notification Type": "Type de notification",
-    Email: "Courriel",
-    Test: "Tester",
-    "Certificate Info": "Informations sur le certificat SSL",
-    "Resolver Server": "Serveur DNS utilisé",
-    "Resource Record Type": "Type d'enregistrement DNS recherché",
-    "Last Result": "Dernier résultat",
-    "Create your admin account": "Créer votre compte administrateur",
-    "Repeat Password": "Répéter le mot de passe",
-    "Import Backup": "Importation de la sauvegarde",
-    "Export Backup": "Exportation de la sauvegarde",
-    Export: "Exporter",
-    Import: "Importer",
-    respTime: "Temps de réponse (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Activé par défaut",
-    "Apply on all existing monitors": "Appliquer sur toutes les sondes existantes",
-    Create: "Créer",
-    "Clear Data": "Effacer les données",
-    Events: "Événements",
-    Heartbeats: "Vérifications",
-    "Auto Get": "Récupérer automatiquement",
-    backupDescription: "Vous pouvez sauvegarder toutes les sondes et toutes les notifications dans un fichier JSON.",
-    backupDescription2: "PS : Les données relatives à l'historique et aux événements ne sont pas incluses.",
-    backupDescription3: "Les données sensibles telles que les jetons de notification sont incluses dans le fichier d'exportation, veuillez les conserver soigneusement.",
-    alertNoFile: "Veuillez sélectionner un fichier à importer.",
-    alertWrongFileType: "Veuillez sélectionner un fichier JSON à importer.",
-    "Clear all statistics": "Effacer toutes les statistiques",
-    "Skip existing": "Sauter l'existant",
-    Overwrite: "Écraser",
-    Options: "Options",
-    "Keep both": "Garder les deux",
-    "Verify Token": "Vérifier le jeton",
-    "Setup 2FA": "Configurer la double authentification (2FA)",
-    "Enable 2FA": "Activer la double authentification (2FA)",
-    "Disable 2FA": "Désactiver la double authentification (2FA)",
-    "2FA Settings": "Paramètres de la la double authentification (2FA)",
-    "Two Factor Authentication": "Double authentification",
-    Active: "Actif",
-    Inactive: "Inactif",
-    Token: "Jeton",
-    "Show URI": "Afficher l'URI",
-    Tags: "Étiquettes",
-    "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici...",
-    "Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
-    "Tag with this value already exist.": "Une étiquette avec cette valeur existe déjà.",
-    color: "Couleur",
-    "value (optional)": "Valeur (facultatif)",
-    Gray: "Gris",
-    Red: "Rouge",
-    Orange: "Orange",
-    Green: "Vert",
-    Blue: "Bleu",
-    Indigo: "Indigo",
-    Purple: "Violet",
-    Pink: "Rose",
-    "Search...": "Rechercher...",
-    "Avg. Ping": "Ping moyen",
-    "Avg. Response": "Réponse moyenne",
-    "Entry Page": "Page d'accueil",
-    statusPageNothing: "Rien ici, veuillez ajouter un groupe ou une sonde.",
-    "No Services": "Aucun service",
-    "All Systems Operational": "Tous les systèmes sont opérationnels",
-    "Partially Degraded Service": "Service partiellement dégradé",
-    "Degraded Service": "Service dégradé",
-    "Add Group": "Ajouter un groupe",
-    "Add a monitor": "Ajouter une sonde",
-    "Edit Status Page": "Modifier la page de statut",
-    "Go to Dashboard": "Accéder au tableau de bord",
-    "Status Page": "Page de statut",
-    "Status Pages": "Pages de statut",
-    defaultNotificationName: "Ma notification {notification} numéro ({number})",
-    here: "ici",
-    Required: "Requis",
-    telegram: "Telegram",
-    ZohoCliq: "ZohoCliq",
-    "Bot Token": "Jeton du robot",
-    wayToGetTelegramToken: "Vous pouvez obtenir un token depuis {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Prend en charge les messages privés / messages de groupe / l'ID d'un salon",
-    wayToGetTelegramChatID: "Vous pouvez obtenir le Chat ID en envoyant un message avec le robot puis en récupérant l'URL pour voir l'ID du salon :",
-    "YOUR BOT TOKEN HERE": "VOTRE JETON ROBOT ICI",
-    chatIDNotFound: "ID du salon introuvable, envoyez un message via le robot avant",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Type de contenu",
-    webhookJsonDesc: "{0} est bien pour tous les serveurs HTTP modernes comme Express.js",
-    webhookFormDataDesc: "{multipart} est bien pour du PHP. Le JSON aura besoin d'être parsé avec {decodeFunction}",
-    webhookAdditionalHeadersTitle: "En-têtes supplémentaires",
-    webhookAdditionalHeadersDesc: "Définit des en-têtes supplémentaires envoyés avec le webhook.",
-    smtp: "Courriel (SMTP)",
-    secureOptionNone: "Aucun / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignorer les erreurs TLS",
-    "From Email": "Depuis l'adresse",
-    emailCustomSubject: "Objet personnalisé",
-    "To Email": "Vers l'adresse",
-    smtpCC: "CC",
-    smtpBCC: "CCI",
-    discord: "Discord",
-    "Discord Webhook URL": "URL vers le webhook Discord",
-    wayToGetDiscordURL: "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Créer un Webhook »",
-    "Bot Display Name": "Nom du robot (affiché)",
-    "Prefix Custom Message": "Préfixe du message personnalisé",
-    "Hello @everyone is...": "Bonjour {'@'}everyone il...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL vers le webhook",
-    wayToGetTeamsURL: "Vous pouvez apprendre comment créer une URL Webhook {0}.",
-    wayToGetZohoCliqURL: "Vous pouvez apprendre comment créer une URL Webhook {0}.",
-    signal: "Signal",
-    Number: "Numéro",
-    Recipients: "Destinataires",
-    needSignalAPI: "Vous avez besoin d'un client Signal avec l'API REST.",
-    wayToCheckSignalURL: "Vous pouvez regarder l'URL suivante pour savoir comment la mettre en place :",
-    signalImportant: "IMPORTANT : Vous ne pouvez pas mixer les groupes et les numéros en destinataires !",
-    gotify: "Gotify",
-    "Application Token": "Jeton d'application",
-    "Server URL": "URL du serveur",
-    Priority: "Priorité",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Nom du salon",
-    "Uptime Kuma URL": "URL vers Uptime Kuma",
-    aboutWebhooks: "Plus d'informations sur les webhooks ici : {0}",
-    aboutChannelName: "Mettez le nom du salon dans {0} dans « Nom du salon » si vous voulez contourner le salon webhook. Ex. : #autre-salon",
-    aboutKumaURL: "Si vous laissez l'URL d'Uptime Kuma vierge, elle redirigera vers la page du projet GitHub.",
-    emojiCheatSheet: "Aide sur les émojis : {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (prend en charge plus de 50 services de notification)",
-    GoogleChat: "Google Chat (Google Workspace uniquement)",
-    pushbullet: "Pushbullet",
-    Kook: "Kook",
-    wayToGetKookBotToken: "Créez une application et récupérer le jeton de robot à l'addresse {0}",
-    wayToGetKookGuildID: "Passez en « mode développeur » dans les paramètres de Kook, et cliquez droit sur le Guild pour obtenir son identifiant",
-    "Guild ID": "Identifiant de Guild",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Clé d'utilisateur",
-    Device: "Appareil",
-    "Message Title": "Titre du message",
-    "Notification Sound": "Son de notification",
-    "More info on:": "Plus d'informations sur : {0}",
-    pushoverDesc1: "Priorité d'urgence (2) a un délai par défaut de 30 secondes entre les tentatives et expire après une heure.",
-    pushoverDesc2: "Si vous voulez envoyer des notifications sur différents appareils, remplissez le champ « Appareil ».",
-    "SMS Type": "Type de SMS",
-    octopushTypePremium: "Premium (rapide - recommandé pour les alertes)",
-    octopushTypeLowCost: "Économique (lent, bloqué de temps en temps par l'opérateur)",
-    checkPrice: "Vérification {0} tarifs :",
-    apiCredentials: "Identifiants de l'API",
-    octopushLegacyHint: "Voulez-vous utiliser l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
-    "Check octopush prices": "Vérifier les prix d'Octopush {0}.",
-    octopushPhoneNumber: "Numéro de téléphone (format international, ex. : +33612345678)",
-    octopushSMSSender: "Nom de l'expéditeur : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
-    "LunaSea Device ID": "Identifiant d'appareil LunaSea",
-    "Apprise URL": "URL d'Apprise",
-    "Example:": "Exemple : {0}",
-    "Read more:": "En savoir plus : {0}",
-    "Status:": "État : {0}",
-    "Read more": "En savoir plus",
-    appriseInstalled: "Apprise est installé.",
-    appriseNotInstalled: "Apprise n'est pas installé. {0}",
-    "Access Token": "Jeton d'accès",
-    "Channel access token": "Jeton d'accès au canal",
-    "Line Developers Console": "Console développeurs Line",
-    lineDevConsoleTo: "Console développeurs Line - {0}",
-    "Basic Settings": "Paramètres de base",
-    "User ID": "Identifiant utilisateur",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Premièrement accédez à {0}, créez un <i>provider</i> et définissez un type de salon à « Messaging API ». Vous pourrez alors avoir  puis vous pourrez avoir le jeton d'accès du salon et l'identifiant utilisateur demandés.",
-    "Icon URL": "URL vers l'icône",
-    aboutIconURL: "Vous pouvez mettre un lien vers une image dans « URL vers l'icône » pour remplacer l'image de profil par défaut. Elle ne sera utilisé que si « Icône émoji » n'est pas défini.",
-    aboutMattermostChannelName: "Vous pouvez remplacer le salon par défaut que le webhook utilise en mettant le nom du salon dans le champ « Nom du salon ». Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex. : #autre-salon",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - Bon marché mais lent et souvent surchargé. Limité uniquement aux destinataires polonais.",
-    promosmsTypeFlash: "SMS FLASH - Le message sera automatiquement affiché sur l'appareil du destinataire. Limité uniquement aux destinataires Polonais.",
-    promosmsTypeFull: "SMS FULL - Version premium des SMS. Vous pouvez mettre le nom de l'expéditeur (vous devez l'enregistrer au préalable). Fiable pour les alertes.",
-    promosmsTypeSpeed: "SMS SPEED - Priorité élevée pour le système. Très rapide et fiable mais coûteux (environ le double du prix d'un SMS FULL).",
-    promosmsPhoneNumber: "Numéro de téléphone (pour les destinataires polonais, vous pouvez ignorer l'indicatif international)",
-    promosmsSMSSender: "Nom de l'expéditeur du SMS : Nom pré-enregistré ou l'un de base : InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "L'URL du serveur (avec http(s):// et le port de manière facultative)",
-    "Internal Room Id": "ID de la salle interne",
-    matrixDesc1: "Vous pouvez trouver l'ID de salle interne en regardant dans la section avancée des paramètres dans le client Matrix. C'est censé ressembler à !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Il est fortement recommandé de créer un nouvel utilisateur et de ne pas utiliser le jeton d'accès de votre propre utilisateur Matrix, car il vous donnera un accès complet à votre compte et à toutes les salles que vous avez rejointes. Pour cela, créez un nouvel utilisateur et invitez-le uniquement dans la salle dans laquelle vous souhaitez recevoir la notification. Vous pouvez obtenir le jeton d'accès en exécutant {0}",
-    Method: "Méthode",
-    Body: "Corps",
-    Headers: "En-têtes",
-    PushUrl: "URL Push",
-    HeadersInvalidFormat: "Les en-têtes de la requête ne sont pas dans un format JSON valide : ",
-    BodyInvalidFormat: "Le corps de la requête n'est pas dans un format JSON valide : ",
-    "Monitor History": "Historique de la sonde",
-    clearDataOlderThan: "Conserver l'historique des données de la sonde durant {0} jours.",
-    PasswordsDoNotMatch: "Les mots de passe ne correspondent pas.",
-    records: "enregistrements",
-    "One record": "Un enregistrement",
-    steamApiKeyDescription: "Pour surveiller un serveur Steam, vous avez besoin d'une clé Steam Web-API. Vous pouvez enregistrer votre clé ici : ",
-    "Current User": "Utilisateur actuel",
-    topic: "Topic",
-    topicExplanation: "Topic MQTT à surveiller",
-    successMessage: "Message de réussite",
-    successMessageExplanation: "Message MQTT qui sera considéré comme un succès",
-    recent: "Récent",
-    Done: "Fait",
-    Info: "Info",
-    Security: "Sécurité",
-    "Steam API Key": "Clé d'API Steam",
-    "Shrink Database": "Réduire la base de données",
-    "Pick a RR-Type...": "Choisissez un type d'enregistrement...",
-    "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés...",
-    Default: "Défaut",
-    "HTTP Options": "Options HTTP",
-    "Create Incident": "Créer un incident",
-    Title: "Titre",
-    Content: "Contenu",
-    Style: "Style",
-    info: "Info",
-    warning: "Attention",
-    danger: "Danger",
-    error: "Erreur",
-    critical: "Critique",
-    primary: "Primaire",
-    light: "Blanc",
-    dark: "Noir",
-    Post: "Post",
-    "Please input title and content": "Veuillez saisir le titre et le contenu",
-    Created: "Créé",
-    "Last Updated": "Dernière mise à jour",
-    Unpin: "Retirer",
-    "Switch to Light Theme": "Passer au thème clair",
-    "Switch to Dark Theme": "Passer au thème sombre",
-    "Show Tags": "Afficher les étiquettes",
-    "Hide Tags": "Masquer les étiquettes",
-    Description: "Description",
-    "No monitors available.": "Aucune sonde disponible.",
-    "Add one": "En rajouter une",
-    "No Monitors": "Aucune sonde",
-    "Untitled Group": "Groupe sans titre",
-    Services: "Services",
-    Discard: "Abandonner",
-    Cancel: "Annuler",
-    "Powered by": "Propulsé par",
-    shrinkDatabaseDescription: "Déclenche la commande VACUUM pour SQLite. Si votre base de données a été créée après la version 1.10.0, AUTO_VACUUM est déjà activé et cette action n'est pas nécessaire.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "Nom d'utilisateur de l'API (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "Mot de passe API",
-    serwersmsPhoneNumber: "Numéro de téléphone",
-    serwersmsSenderName: "Nom de l'expéditeur du SMS (enregistré via le portail client)",
-    smseagle: "SMSEagle",
-    smseagleTo: "Numéro(s) de téléphone",
-    smseagleGroup: "Nom(s) de groupe(s) de répertoire",
-    smseagleContact: "Nom(s) de contact du répertoire",
-    smseagleRecipientType: "Type de destinataire",
-    smseagleRecipient: "Destinataire(s) (les multiples doivent être séparés par une virgule)",
-    smseagleToken: "Jeton d'accès à l'API",
-    smseagleUrl: "L'URL de votre appareil SMSEagle",
-    smseagleEncoding: "Envoyer en Unicode",
-    smseaglePriority: "Priorité des messages (0-9, par défaut = 0)",
-    stackfield: "Stackfield",
-    Customize: "Personnaliser",
-    "Custom Footer": "Pied de page personnalisé",
-    "Custom CSS": "CSS personnalisé",
-    smtpDkimSettings: "Paramètres DKIM",
-    smtpDkimDesc: "Veuillez vous référer au Nodemailer DKIM {0} pour l'utilisation.",
-    documentation: "documentation",
-    smtpDkimDomain: "Nom de domaine",
-    smtpDkimKeySelector: "Sélecteur de clé",
-    smtpDkimPrivateKey: "Clé privée",
-    smtpDkimHashAlgo: "Algorithme de hachage (facultatif)",
-    smtpDkimheaderFieldNames: "Clés d'en-tête à signer (facultatif)",
-    smtpDkimskipFields: "Clés d'en-tête à ne pas signer (facultatif)",
-    wayToGetPagerDutyKey: "Vous pouvez l'obtenir en allant dans Service -> Annuaire des services -> (sélectionner un service) -> Intégrations -> Ajouter une intégration. Ici, vous pouvez rechercher \"Events API V2\". Plus d'infos {0}",
-    "Integration Key": "Clé d'intégration",
-    "Integration URL": "URL d'intégration",
-    "Auto resolve or acknowledged": "Résolution automatique ou accusé de réception",
-    "do nothing": "ne fais rien",
-    "auto acknowledged": "accusé de réception automatique",
-    "auto resolve": "résolution automatique",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environnement",
-    alertaApiKey: "Clé de l'API",
-    alertaAlertState: "État de l'alerte",
-    alertaRecoverState: "État de récupération",
-    deleteStatusPageMsg: "Voulez-vous vraiment supprimer cette page d'état ?",
-    Proxies: "Proxies",
-    default: "Défaut",
-    enabled: "Activé",
-    setAsDefault: "Définir par défaut",
-    deleteProxyMsg: "Voulez-vous vraiment supprimer ce proxy pour toutes les sondes ?",
-    proxyDescription: "Les proxies doivent être affectés à une sonde pour fonctionner.",
-    enableProxyDescription: "Ce proxy n'aura pas d'effet sur les demandes de sonde tant qu'il n'est pas activé. Vous pouvez contrôler la désactivation temporaire du proxy de toutes les sondes en fonction de l'état d'activation.",
-    setAsDefaultProxyDescription: "Ce proxy sera activé par défaut pour les nouvelles sondes. Vous pouvez toujours désactiver le proxy séparément pour chaque sonde.",
-    "Certificate Chain": "Chaîne de certificats",
-    Valid: "Valide",
-    Invalid: "Non valide",
-    AccessKeyId: "ID de clé d'accès",
-    SecretAccessKey: "Clé secrète d'accès",
-    PhoneNumbers: "Numéros de téléphone",
-    TemplateCode: "Modèle de code",
-    SignName: "Signature",
-    "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
-    "Bark Endpoint": "Endpoint Bark",
-    "Bark Group": "Groupe Bark",
-    "Bark Sound": "Son Bark",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "Clé secrète",
-    "For safety, must use secret key": "Par sécurité, utilisation obligatoire de la clé secrète",
-    "Device Token": "Jeton d'appareil",
-    Platform: "Plateforme",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Haute",
-    Retry: "Recommencez",
-    Topic: "Topic",
-    "WeCom Bot Key": "Clé de robot WeCom",
-    "Setup Proxy": "Configurer le proxy",
-    "Proxy Protocol": "Protocole proxy",
-    "Proxy Server": "Serveur proxy",
-    "Proxy server has authentication": "Une authentification est nécessaire pour le serveur proxy",
-    User: "Utilisateur",
-    Installed: "Installé",
-    "Not installed": "Non installé",
-    Running: "Fonctionne",
-    "Not running": "Ne fonctionne pas",
-    "Remove Token": "Supprimer le jeton",
-    Start: "Démarrer",
-    Stop: "Arrêter",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Ajouter une page de statut",
-    Slug: "Chemin",
-    "Accept characters:": "Caractères acceptés : ",
-    startOrEndWithOnly: "Commence uniquement par {0}",
-    "No consecutive dashes": "Pas de double tirets",
-    Next: "Continuer",
-    "The slug is already taken. Please choose another slug.": "Un chemin existe déjà. Veuillez en choisir un autre.",
-    "No Proxy": "Pas de proxy",
-    Authentication: "Authentification",
-    "HTTP Basic Auth": "Authentification de base HTTP",
-    "New Status Page": "Nouvelle page de statut",
-    "Page Not Found": "Page non trouvée",
-    "Reverse Proxy": "Proxy inverse",
-    Backup: "Sauvegarde",
-    About: "À propos",
-    wayToGetCloudflaredURL: "(télécharger cloudflared depuis {0})",
-    cloudflareWebsite: "Site web de Cloudflare",
-    "Message:": "Message : ",
-    "Don't know how to get the token? Please read the guide:": "Vous ne savez pas comment obtenir le jeton ? Lisez le guide :",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexion actuelle peut être perdue si vous vous connectez actuellement via un tunnel Cloudflare. Êtes-vous sûr de vouloir l'arrêter ? Tapez votre mot de passe actuel pour le confirmer.",
-    "HTTP Headers": "En-têtes HTTP",
-    "Trust Proxy": "Proxy de confiance",
-    "Other Software": "Autres logiciels",
-    "For example: nginx, Apache and Traefik.": "Par exemple : nginx, Apache et Traefik.",
-    "Please read": "Veuillez lire",
-    "Subject:": "Objet : ",
-    "Valid To:": "Valable jusqu'au : ",
-    "Days Remaining:": "Jours restants : ",
-    "Issuer:": "Émetteur : ",
-    "Fingerprint:": "Empreinte : ",
-    "No status pages": "Aucune page de statut.",
-    "Domain Name Expiry Notification": "Notification d'expiration du nom de domaine",
-    Proxy: "Proxy",
-    "Date Created": "Date de création",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "Adresse HTTP OneBot",
-    onebotMessageType: "Type de message OneBot",
-    onebotGroupMessage: "Groupe",
-    onebotPrivateMessage: "Privé",
-    onebotUserOrGroupId: "ID de groupe/utilisateur",
-    onebotSafetyTips: "Pour des raisons de sécurité, vous devez définir un jeton d'accès",
-    "PushDeer Key": "Clé PushDeer",
-    "Footer Text": "Texte de pied de page",
-    "Show Powered By": "Afficher « Propulsé par »",
-    "Domain Names": "Noms de domaine",
-    signedInDisp: "Connecté en tant que {0}",
-    signedInDispDisabled: "Authentification désactivée.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Secret partagé entre le client et le serveur",
-    RadiusCalledStationId: "Identifiant de la station appelée",
-    RadiusCalledStationIdDescription: "Identifiant de l'appareil appelé",
-    RadiusCallingStationId: "Identifiant de la station appelante",
-    RadiusCallingStationIdDescription: "Identifiant de l'appareil appelant",
-    "Certificate Expiry Notification": "Notification d'expiration du certificat",
-    "API Username": "Nom d'utilisateur de l'API",
-    "API Key": "Clé API",
-    "Recipient Number": "Numéro du destinataire",
-    "From Name/Number": "De nom/numéro",
-    "Leave blank to use a shared sender number.": "Laisser vide pour utiliser un numéro d'expéditeur partagé.",
-    "Octopush API Version": "Version de l'API Octopush",
-    "Legacy Octopush-DM": "Ancien Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"Clé API\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
-    octopushLogin: "\"Identifiant\" à partir des informations d'identification de l'API HTTP dans le panneau de configuration",
-    promosmsLogin: "Nom de connexion API",
-    promosmsPassword: "Mot de passe API",
-    "pushoversounds pushover": "Pushover (par défaut)",
-    "pushoversounds bike": "Vélo",
-    "pushoversounds bugle": "Clairon",
-    "pushoversounds cashregister": "Caisse enregistreuse",
-    "pushoversounds classical": "Classique",
-    "pushoversounds cosmic": "Cosmique",
-    "pushoversounds falling": "Chute",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Arrivée",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magique",
-    "pushoversounds mechanical": "Mécanique",
-    "pushoversounds pianobar": "Piano-bar",
-    "pushoversounds siren": "Sirène",
-    "pushoversounds spacealarm": "Alarme spatiale",
-    "pushoversounds tugboat": "Remorqueur",
-    "pushoversounds alien": "Alarme alienne (version longue)",
-    "pushoversounds climb": "Escalade (version longue)",
-    "pushoversounds persistent": "Persistent (version longue)",
-    "pushoversounds echo": "Pushover Echo (version longue)",
-    "pushoversounds updown": "Up Down (version longue)",
-    "pushoversounds vibrate": "Vibration seulement",
-    "pushoversounds none": "Aucun (silencieux)",
-    pushyAPIKey: "Clé API secrète",
-    pushyToken: "Jeton d'appareil",
-    "Show update if available": "Afficher la mise à jour si disponible",
-    "Also check beta release": "Vérifiez également la version bêta",
-    "Using a Reverse Proxy?": "Utiliser un proxy inverse ?",
-    "Check how to config it for WebSocket": "Vérifier comment le configurer pour WebSocket",
-    "Steam Game Server": "Serveur de jeu Steam",
-    "Most likely causes:": "Causes les plus probables : ",
-    "The resource is no longer available.": "La ressource n'est plus disponible.",
-    "There might be a typing error in the address.": "Il se peut qu'il y ait une erreur de frappe dans l'adresse.",
-    "What you can try:": "Ce que vous pouvez essayer :",
-    "Retype the address.": "Retaper l'adresse.",
-    "Go back to the previous page.": "Retourner à la page précédente.",
-    "Coming Soon": "Prochainement",
-    wayToGetClickSendSMSToken: "Vous pouvez obtenir le nom d'utilisateur API et la clé API à partir de {0} .",
-    "Connection String": "Chaîne de connexion",
-    Query: "Requête",
-    settingsCertificateExpiry: "Expiration du certificat TLS",
-    certificationExpiryDescription: "Les sondes HTTPS émettent une notification lorsque le certificat TLS expire dans :",
-    "Setup Docker Host": "Configurer l'hôte Docker",
-    "Connection Type": "Type de connexion",
-    "Docker Daemon": "Deamon Docker",
-    deleteDockerHostMsg: "Voulez-vous vraiment supprimer cet hôte Docker pour toutes les sondes ?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Conteneur Docker",
-    "Container Name / ID": "Nom / ID du conteneur",
-    "Docker Host": "Hôte Docker",
-    "Docker Hosts": "Hôtes Docker",
-    "ntfy Topic": "Topic ntfy",
-    Domain: "Domaine",
-    Workstation: "Poste de travail",
-    disableCloudflaredNoAuthMsg: "Vous êtes en mode No Auth, un mot de passe n'est pas nécessaire.",
-    trustProxyDescription: "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière (nginx ou Apache) vous devez l'activer.",
-    wayToGetLineNotifyToken: "Vous pouvez obtenir un jeton d'accès auprès de {0}",
-    Examples: "Exemples",
-    "Home Assistant URL": "URL vers Home Assistant",
-    "Long-Lived Access Token": "Jeton d'accès de longue durée",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
-    "Notification Service": "Service de notifications",
-    "default: notify all devices": "par défaut: notifier tous les appareils",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
-    "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant : ",
-    "Trigger type:": "Type de déclencheur : ",
-    "Event type:": "Type d'événement : ",
-    "Event data:": "Données d'événement : ",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ensuite, choisissez une action, par exemple basculer la scène là où une lumière RVB est rouge.",
-    "Frontend Version": "Version frontend",
-    "Frontend Version do not match backend version!": "La version frontend ne correspond pas à la version backend !",
-    "Base URL": "URL de base",
-    goAlertInfo: "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Impliquez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
-    goAlertIntegrationKeyInfo: "Obtenez la clé d'intégration d'API générique pour le service dans ce format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" généralement la valeur du paramètre de jeton de l'URL copiée.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
-    backupRecommend: "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
-    Optional: "Optionnel",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "Documentations de l'API SMSManager ",
-    "Gateway Type": "Type de passerelle",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Vous pouvez diviser des nombres avec",
-    or: "ou",
-    recurringInterval: "Intervalle",
-    Recurring: "Récurrent",
-    strategyManual: "Activer/désactiver manuellement",
-    warningTimezone: "Utilisation du fuseau horaire du serveur",
-    weekdayShortMon: "Lun",
-    weekdayShortTue: "Mar",
-    weekdayShortWed: "Mer",
-    weekdayShortThu: "Jeu",
-    weekdayShortFri: "Ven",
-    weekdayShortSat: "Sam",
-    weekdayShortSun: "Dim",
-    dayOfWeek: "Jour de la semaine",
-    dayOfMonth: "Jour du mois",
-    lastDay: "Dernier jour",
-    lastDay1: "Dernier jour du mois",
-    lastDay2: "Avant-dernier jour du mois",
-    lastDay3: "3ème dernier jour du mois",
-    lastDay4: "4ème dernier jour du mois",
-    "No Maintenance": "Aucune maintenance",
-    pauseMaintenanceMsg: "Voulez-vous vraiment mettre en pause ?",
-    "maintenanceStatus-under-maintenance": "En maintenance",
-    "maintenanceStatus-inactive": "Inactif",
-    "maintenanceStatus-scheduled": "Programmé",
-    "maintenanceStatus-ended": "Terminé",
-    "maintenanceStatus-unknown": "Inconnue",
-    "Display Timezone": "Afficher le fuseau horaire",
-    "Server Timezone": "Fuseau horaire du serveur",
-    statusPageMaintenanceEndDate: "Fin",
-    IconUrl: "URL vers l'icône",
-    "Enable DNS Cache": "Activer le cache DNS",
-    Enable: "Activer",
-    Disable: "Désactiver",
-    dnsCacheDescription: "Il peut ne pas fonctionner dans certains environnements IPv6, désactivez-le si vous rencontrez des problèmes.",
-    "Single Maintenance Window": "Créneau de maintenance unique",
-    "Maintenance Time Window of a Day": "Créneau de la maintenance",
-    "Effective Date Range": "Plage de dates d'effet",
-    "Schedule Maintenance": "Créer une maintenance",
-    "Date and Time": "Date et heure",
-    "DateTime Range": "Plage de dates et d'heures",
-    Strategy: "Stratégie",
-    "Free Mobile User Identifier": "Identifiant d'utilisateur Free Mobile",
-    "Free Mobile API Key": "Clé d'API Free Mobile",
-    "Enable TLS": "Activer le TLS",
-    "Proto Service Name": "Nom du service proto",
-    "Proto Method": "Méthode Proto",
-    "Proto Content": "Contenu proto",
-    Economy: "Économique",
-    Lowcost: "Faible coût",
-    high: "Haute",
-    "General Monitor Type": "Type de sonde générale",
-    "Passive Monitor Type": "Type de sonde passive",
-    "Specific Monitor Type": "Type de sonde spécifique",
-    dataRetentionTimeError: "La durée de conservation doit être supérieure ou égale à 0",
-    infiniteRetention: "Définissez la valeur à 0 pour une durée de conservation infinie.",
-    Monitor: "Sonde | Sondes",
-    Custom: "Personnalisé",
-    confirmDeleteTagMsg: "Voulez-vous vraiment supprimer cette étiquettes ? Les moniteurs associés ne seront pas supprimés.",
-    promosmsAllowLongSMS: "Autoriser les longs SMS",
-};
diff --git a/src/languages/he-IL.js b/src/languages/he-IL.js
deleted file mode 100644
index d98b063d..00000000
--- a/src/languages/he-IL.js
+++ /dev/null
@@ -1,672 +0,0 @@
-export default {
-    languageName: "עברית",
-    checkEverySecond: "בדוק כל {0} שניות",
-    retryCheckEverySecond: "נסה שוב כל {0} שניות",
-    resendEveryXTimes: "התראה שוב כל {0} פעמים",
-    resendDisabled: "השליחה מחדש מושבתת",
-    retriesDescription: "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ונשלחת התראה",
-    ignoreTLSError: "התעלם משגיאת TLS/SSL עבור אתרי HTTPS",
-    upsideDownModeDescription: "הפוך את הסטטוס על הפוך. אם ניתן להגיע לשירות, הוא לא פעיל.",
-    maxRedirectDescription: "המספר המרבי של הפניות מחדש לעקוב. הגדר ל-0 כדי להשבית הפניות מחדש.",
-    enableGRPCTls: "אפשר לשלוח בקשת gRPC עם חיבור TLS",
-    grpcMethodDescription: "שם השיטה מומר לפורמט cammelCase כגון sayHello, check וכו.",
-    acceptedStatusCodesDescription: "בחר קודי סטטוס שנחשבים לתגובה מוצלחת.",
-    Maintenance: "תחזוקה",
-    statusMaintenance: "תחזוקה",
-    "Schedule maintenance": "תחזוקה מתוכננת",
-    "Affected Monitors": "מוניטורים מושפעים",
-    "Pick Affected Monitors...": "בחר המוניטרים מושפעים...",
-    "Start of maintenance": "תחילת תחזוקה",
-    "All Status Pages": "כל דפי הסטטוס",
-    "Select status pages...": "בחר דפי סטטוס...",
-    recurringIntervalMessage: "רוץ פעם ביום | הפעל אחת ל-{0} ימים",
-    affectedMonitorsDescription: "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית",
-    affectedStatusPages: "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו",
-    atLeastOneMonitor: "בחר לפחות מוניטור אחד מושפע",
-    passwordNotMatchMsg: "הסיסמאות לא תואמות",
-    notificationDescription: "יש להקצות התראות למוניטור כדי שהן יעבדו.",
-    keywordDescription: "חפש מילת מפתח בתגובת HTML או JSON רגילה. החיפוש תלוי רישיות.",
-    pauseDashboardHome: "עצור",
-    deleteMonitorMsg: "האם אתה בטוח שברצונך למחוק את המוניטור הזה?",
-    deleteMaintenanceMsg: "האם אתה בטוח שברצונך למחוק את התחזוקה הזו?",
-    deleteNotificationMsg: "האם אתה בטוח שברצונך למחוק את ההודעה הזו עבור כל מוניטרים?",
-    dnsPortDescription: "יציאת שרת DNS. ברירת המחדל היא 53. אתה יכול לשנות את היציאה בכל עת.",
-    resolverserverDescription: "Cloudflare הוא שרת ברירת המחדל. אתה יכול לשנות את שרת הפותר בכל עת.",
-    rrtypeDescription: "בחר את סוג ה-RR שברצונך לפקח עליו",
-    pauseMonitorMsg: "האם אתה בטוח רוצה להשהות?",
-    enableDefaultNotificationDescription: "הודעה זו תופעל כברירת מחדל עבור מוניטרים חדשים. אתה עדיין יכול להשבית את ההודעה בנפרד עבור כל מוניטור.",
-    clearEventsMsg: "האם אתה בטוח שברצונך למחוק את כל האירועים עבור המוניטור הזה?",
-    clearHeartbeatsMsg: "האם אתה בטוח שברצונך למחוק את כל פעימות הלב עבור המוניטור הזה?",
-    confirmClearStatisticsMsg: "האם אתה בטוח שברצונך למחוק את כל הנתונים הסטטיסטיים?",
-    importHandleDescription: "בחר 'דלג על קיים' אם ברצונך לדלג על כל מוניטור או התראה באותו שם. 'החלף' ימחק כל מוניטור והתראה קיימים.",
-    confirmImportMsg: "האם אתה בטוח שברצונך לייבא את הגיבוי? אנא ודא שבחרת באפשרות הייבוא הנכונה.",
-    twoFAVerifyLabel: "אנא הזן את האסימון שלך כדי לאמת מערכת אדוש:",
-    tokenValidSettingsMsg: "האסימון תקף! כעת אתה יכול לשמור את הגדרות האדוש.",
-    confirmEnableTwoFAMsg: "האם אתה בטוח שברצונך להפעיל את מערכת אדוש?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    Settings: "הגדרות",
-    Dashboard: "פאנל ניהול",
-    "New Update": "עדכון חדש",
-    Language: "שפה",
-    Appearance: "נראות",
-    Theme: "ערכת נושא",
-    General: "כללי",
-    "Primary Base URL": "כתובת האתר הראשית של הבסיס",
-    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.": "Cert Exp.",
-    day: "יום | ימים",
-    "-day": "-יום",
-    hour: "שעה",
-    "-hour": "-שעה",
-    Response: "תגובה",
-    Ping: "פינג",
-    "Monitor Type": "סוג מוניטור",
-    Keyword: "מילת מפתח",
-    "Friendly Name": "שם ידידותי",
-    URL: "כתובת אתר",
-    Hostname: "שם המארח",
-    Port: "פורט",
-    "Heartbeat Interval": "מרווח פעימות",
-    Retries: "נסיונות חוזרים",
-    "Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות",
-    "Resend Notification if Down X times consequently": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך",
-    Advanced: "מתקדם",
-    "Upside Down Mode": "מצב הפוך",
-    "Max. Redirects": "מקסימום הפניות מחדש",
-    "Accepted Status Codes": "קודי סטטוס מקובלים",
-    "Push URL": "דחף כתובת URL",
-    needPushEvery: "עליך להתקשר לכתובת האתר הזו כל {0} שניות.",
-    pushOptionalParams: "פרמטרים אופציונליים: {0}",
-    Save: "שמירה",
-    Notifications: "התראות",
-    "Not available, please setup.": "לא זמין, אנא הגדר.",
-    "Setup Notification": "הודעת הגדרה",
-    Light: "בהיר",
-    Dark: "חושך",
-    Auto: "אוטומטי",
-    "Theme - Heartbeat Bar": "ערכת נושא - 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": "הפעלת אבטחה",
-    "disableauth.message1": "האם אתה בטוח שברצונך <strong>להשבית את האבטחה</strong>?",
-    "disableauth.message2": "הוא מיועד לתרחישים <strong>שבהם אתה מתכוון ליישם אימות של צד שלישי</strong> מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.",
-    "Please use this option carefully!": "אנא השתמש באפשרות זו בזהירות!",
-    Logout: "התנתקות",
-    Leave: "יציאה",
-    "I understand, please disable": "אני מבין, אני רוצה להשבית",
-    Confirm: "אישור",
-    Yes: "כן",
-    No: "לא",
-    Username: "שם משתמש",
-    Password: "סיסמה",
-    "Remember me": "זכור אותי",
-    Login: "התחברות",
-    "No Monitors, please": "בלי מוניטורים, בבקשה",
-    "add one": "להוסיף אחד",
-    "Notification Type": "סוג התראה",
-    Email: "אימייל",
-    Test: "Test",
-    "Certificate Info": "פרטי תעודת אבטחה",
-    "Resolver Server": "שרת פותר",
-    "Resource Record Type": "סוג רשומת משאבים",
-    "Last Result": "תוצאה אחרונה",
-    "Create your admin account": "צור את חשבון הניהול שלך",
-    "Repeat Password": "חזור על הסיסמה",
-    "Import Backup": "ייבוא גיבוי",
-    "Export Backup": "ייצוא גיבוי",
-    Export: "ייצוא",
-    Import: "ייבוא",
-    respTime: "רפ. זמן (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "ברירת המחדל מופעלת",
-    "Apply on all existing monitors": "החל על כל המסכים הקיימים",
-    Create: "ליצור",
-    "Clear Data": "נקה נתונים",
-    Events: "אירועים",
-    Heartbeats: "פעימות לב",
-    "Auto Get": "קבל אוטומטי",
-    backupDescription: "אתה יכול לגבות את כל המסכים וההתראות לקובץ JSON.",
-    backupDescription2: "הערה: היסטוריה ונתוני אירועים אינם כלולים.",
-    backupDescription3: "נתונים רגישים כגון אסימוני הודעה כלולים בקובץ הייצוא; נא לאחסן יצוא בצורה מאובטחת.",
-    alertNoFile: "אנא בחר קובץ לייבוא.",
-    alertWrongFileType: "אנא בחר קובץ JSON.",
-    "Clear all statistics": "נקה את כל הנתונים הסטטיסטיים",
-    "Skip existing": "דילוג על הקיים",
-    Overwrite: "החלף",
-    Options: "אפשרויות",
-    "Keep both": "שמור את שניהם",
-    "Verify Token": "אמת את האסימון",
-    "Setup 2FA": "הגדרת מערכת אדוש",
-    "Enable 2FA": "הפעלת אדוש",
-    "Disable 2FA": "כיבוי אדוש",
-    "2FA Settings": "הגדרות אדוש",
-    "Two Factor Authentication": "אימות דו-שלבי (מערכת אדוש)",
-    Active: "מופעל",
-    Inactive: "קבוי",
-    Token: "אסימון",
-    "Show URI": "הצג URI",
-    Tags: "תגים",
-    "Add New below or Select...": "הוסף חדש למטה או בחר...",
-    "Tag with this name already exist.": "תג בשם זה כבר קיים.",
-    "Tag with this value already exist.": "תג עם ערך זה כבר קיים.",
-    color: "צבע",
-    "value (optional)": "ערך (אופציונלי)",
-    Gray: "אפור",
-    Red: "אדום",
-    Orange: "כתום",
-    Green: "ירוק",
-    Blue: "כחול",
-    Indigo: "כחול כהה",
-    Purple: "סגול",
-    Pink: "כתום",
-    "Search...": "לחפש...",
-    "Avg. Ping": "פינג ממוצע",
-    "Avg. Response": "ממוצע תגובה",
-    "Entry Page": "דף כניסה",
-    statusPageNothing: "אין כאן שום דבר, בבקשה הוסף קבוצה או מוניטור.",
-    "No Services": "אין שירותים",
-    "All Systems Operational": "כל המערכות עובדות",
-    "Partially Degraded Service": "שירות פגום חלקית",
-    "Degraded Service": "שירות פגום",
-    "Add Group": "הוסף קבוצה",
-    "Add a monitor": "הוסף מוניטור",
-    "Edit Status Page": "ערוך דף סטטוס",
-    "Go to Dashboard": "מעבר לפאנל",
-    "Status Page": "דף סטטוס",
-    "Status Pages": "דפי סטטוס",
-    defaultNotificationName: "התראת {notification} שלי ({number})",
-    here: "פה",
-    Required: "נדרש",
-    telegram: "טלגרם",
-    "Bot Token": "אסימון בוט",
-    wayToGetTelegramToken: "אתה יכול לקבל אסימון מ-{0}.",
-    "Chat ID": "מזהה צ'אט",
-    supportTelegramChatID: "תמיכה בצ'אט ישיר / קבוצה / מזהה הצ'אט של הערוץ",
-    wayToGetTelegramChatID: "אתה יכול לקבל את מזהה הצ'אט שלך על ידי שליחת הודעה לבוט ומעבר לכתובת האתר הזו כדי להציג את ה-chat_id:",
-    "YOUR BOT TOKEN HERE": "אסימון הבוט שלך כאן",
-    chatIDNotFound: "מזהה צ'אט לא נמצא; אנא שלח הודעה לבוט זה תחילה",
-    webhook: "Webhook",
-    "Post URL": "כתובת אתר של פוסט",
-    "Content Type": "סוג התוכן",
-    webhookJsonDesc: "{0} מתאים לכל שרתי HTTP מודרניים כגון Express.js",
-    webhookFormDataDesc: "{multipart} טוב ל-PHP. יהיה צורך לנתח את ה-JSON באמצעות {decodeFunction}",
-    webhookAdditionalHeadersTitle: "כותרות נוספות",
-    webhookAdditionalHeadersDesc: "מגדיר כותרות נוספות שנשלחות עם ה-webhook.",
-    smtp: "אימייל (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "התעלם משגיאת TLS",
-    "From Email": "אמייל שולח",
-    emailCustomSubject: "נושא מותאם אישית",
-    "To Email": "למייל",
-    smtpCC: "עותק",
-    smtpBCC: "עותק מוסתר",
-    discord: "דיסקורד",
-    "Discord Webhook URL": "כתובת אתר של Discord Webhook",
-    wayToGetDiscordURL: "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> צור Webhook",
-    "Bot Display Name": "שם תצוגה של בוט",
-    "Prefix Custom Message": "קידומת הודעה מותאמת אישית",
-    "Hello @everyone is...": "שלום {'@'}כולם...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "כתובת האתר של Webhook",
-    wayToGetTeamsURL: "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
-    signal: "אוֹת",
-    Number: "מספר",
-    Recipients: "נמענים",
-    needSignalAPI: "אתה צריך שיהיה לך לקוח איתות עם REST API.",
-    wayToCheckSignalURL: "אתה יכול לבדוק את כתובת האתר הזו כדי לראות כיצד להגדיר אחת:",
-    signalImportant: "חשוב: לא ניתן לערבב קבוצות ומספרים בנמענים!",
-    gotify: "Gotify",
-    "Application Token": "אסימון אפליקציה",
-    "Server URL": "כתובת האתר של השרת",
-    Priority: "עדיפות",
-    slack: "Slack",
-    "Icon Emoji": "אייקון אימוג'י",
-    "Channel Name": "שם הערוץ",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "מידע נוסף על Webhooks ב: {0}",
-    aboutChannelName: "הזן את שם הערוץ בשדה {0} שם ערוץ אם ברצונך לעקוף את ערוץ Webhook. לדוגמה: #ערוץ אחר",
-    aboutKumaURL: "אם תשאיר את השדה Uptime Kuma URL ריק, הוא יעבור כברירת מחדל לעמוד Project GitHub.",
-    emojiCheatSheet: "גיליון הונאה של אמוג'י: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (תומך ב-50+ שירותי התראות)",
-    GoogleChat: "Google Chat (Google Workspace בלבד)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "מפתח משתמש",
-    Device: "התקן",
-    "Message Title": "כותרת ההודעה",
-    "Notification Sound": "צליל התראה",
-    "More info on:": "מידע נוסף על: {0}",
-    pushoverDesc1: "לעדיפות חירום (2) יש פסק זמן של 30 שניות ברירת מחדל בין ניסיונות חוזרים, והיא תפוג לאחר שעה.",
-    pushoverDesc2: "אם ברצונך לשלוח התראות למכשירים שונים, מלא את שדה התקן.",
-    "SMS Type": "סוג SMS",
-    octopushTypePremium: "פרימיום (מהיר - מומלץ להתראה)",
-    octopushTypeLowCost: "עלות נמוכה (איטית - לפעמים חסומה על ידי המפעיל)",
-    checkPrice: "בדוק מחירים של {0}:",
-    apiCredentials: "אישורי API",
-    octopushLegacyHint: "האם אתה משתמש בגרסה הישנה של Octopush (2011-2020) או בגרסה החדשה?",
-    "Check octopush prices": "בדוק מחירי תמנון {0}.",
-    octopushPhoneNumber: "מספר טלפון (פורמט אינטלי, למשל: +33612345678)",
-    octopushSMSSender: "שם שולח SMS: 3-11 תווים אלפאנומריים ורווח (a-zA-Z0-9)",
-    "LunaSea Device ID": "מזהה מכשיר LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "דוגמה: {0}",
-    "Read more:": "קרא עוד: {0}",
-    "Status:": "סטטוס: {0}",
-    "Read more": "קרא עוד",
-    appriseInstalled: "Apprise מותקן.",
-    appriseNotInstalled: "Apprise אינו מותקן. {0}",
-    "Access Token": "אסימון גישה",
-    "Channel access token": "אסימון גישה לערוץ",
-    "Line Developers Console": "קונסולת מפתחים",
-    lineDevConsoleTo: "קו מפתחי קונסולת - {0}",
-    "Basic Settings": "הגדרות בסיסיות",
-    "User ID": "תעודת זהות של משתמש",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "תחילה גש ל-{0}, צור ספק וערוץ (Messaging API), לאחר מכן תוכל לקבל את אסימון הגישה לערוץ ומזהה המשתמש מפריטי התפריט שהוזכרו לעיל.",
-    "Icon URL": "כתובת אתר של סמל",
-    aboutIconURL: "אתה יכול לספק קישור לתמונה ב\"כתובת URL של סמל\" כדי לעקוף את תמונת הפרופיל המוגדרת כברירת מחדל. לא ישמש אם Icon Emoji מוגדר.",
-    aboutMattermostChannelName: "אתה יכול לעקוף את ערוץ ברירת המחדל שאליו ה-Webhook מפרסם על ידי הזנת שם הערוץ בשדה \"שם ערוץ\". זה צריך להיות מופעל בהגדרות Mattermos Webhook. לדוגמה: #ערוץ אחר",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - זול אך איטי ולעיתים עמוס מדי. מוגבל רק לנמענים פולנים.",
-    promosmsTypeFlash: "SMS FLASH - ההודעה תוצג אוטומטית במכשיר הנמען. מוגבל לנמענים פולנים בלבד.",
-    promosmsTypeFull: "SMS FULL - שכבת פרימיום של SMS, אתה יכול להשתמש בשם השולח שלך (עליך לרשום את השם תחילה). אמין להתראות.",
-    promosmsTypeSpeed: "SMS SPEED - העדיפות הגבוהה ביותר במערכת. מאוד מהיר ואמין אבל יקר (בערך פי שניים ממחיר מלא של SMS).",
-    promosmsPhoneNumber: "מספר טלפון (לנמען פולני ניתן לדלג על אזורי חיוג)",
-    promosmsSMSSender: "שם שולח SMS: שם רשום מראש או אחת מברירות המחדל: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "כתובת האתר של שרת הבית (עם http(s):// ויציאה אופציונלית)",
-    "Internal Room Id": "מזהה חדר פנימי",
-    matrixDesc1: "אתה יכול למצוא את מזהה החדר הפנימי על ידי עיון בחלק המתקדם של לקוח Matrix שלך בהגדרות החדר. זה צריך להיראות כמו !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "מומלץ מאוד ליצור משתמש חדש ולא להשתמש באסימון הגישה של משתמש מטריקס משלך שכן הוא יאפשר גישה מלאה לחשבון שלך ולכל החדרים שהצטרפת אליהם. במקום זאת, צור משתמש חדש והזמן אותו רק לחדר שבו תרצה לקבל את ההתראה. תוכל לקבל את אסימון הגישה על ידי הפעלת {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "כותרות הבקשה אינן JSON חוקיות:",
-    BodyInvalidFormat: "גוף הבקשה אינו JSON חוקי:",
-    "Monitor History": "מעקב אחר היסטוריה",
-    clearDataOlderThan: "שמור את נתוני היסטוריית הצג למשך {0} ימים.",
-    PasswordsDoNotMatch: "סיסמאות לא תואמות.",
-    records: "רשומות",
-    "One record": "שיא אחד",
-    steamApiKeyDescription: "לניטור שרת משחקי Steam אתה צריך מפתח Steam Web-API. אתה יכול לרשום את מפתח ה-API שלך כאן:",
-    "Current User": "משתמש נוכחי",
-    topic: "נושא",
-    topicExplanation: "נושא MQTT למעקב",
-    successMessage: "הודעת הצלחה",
-    successMessageExplanation: "הודעת MQTT שתיחשב כהצלחה",
-    recent: "לאחרונה",
-    Done: "בוצע",
-    Info: "מידע",
-    Security: "אבטחה",
-    "Steam API Key": "מפתח API Steam",
-    "Shrink Database": "מסד נתונים מכווץ",
-    "Pick a RR-Type...": "בחר סוג RR ...",
-    "Pick Accepted Status Codes...": "בחר קודי סטטוס מקובלים ...",
-    Default: "בְּרִירַת מֶחדָל",
-    "HTTP Options": "אפשרויות HTTP",
-    "Create Incident": "ליצור אירוע",
-    Title: "כותרת",
-    Content: "תוֹכֶן",
-    Style: "Style",
-    info: "מידע",
-    warning: "אַזהָרָה",
-    danger: "סַכָּנָה",
-    error: "שְׁגִיאָה",
-    critical: "קריטי",
-    primary: "יְסוֹדִי",
-    light: "אוֹר",
-    dark: "אפל",
-    Post: "הודעה",
-    "Please input title and content": "אנא הזן כותרת ותוכן",
-    Created: "נוצר",
-    "Last Updated": "עודכן לאחרונה",
-    Unpin: "ענן חוף",
-    "Switch to Light Theme": "לעבור לנושא האור",
-    "Switch to Dark Theme": "לעבור לנושא אפל",
-    "Show Tags": "Show Tags",
-    "Hide Tags": "הסתר תגיות",
-    Description: "תיאור",
-    "No monitors available.": "אין צגים זמינים.",
-    "Add one": "הוסף אחד",
-    "No Monitors": "אין צגים",
-    "Untitled Group": "קבוצה ללא כותרת",
-    Services: "שירותים",
-    Discard: "להשליך",
-    Cancel: "לְבַטֵל",
-    "Powered by": "פועל על",
-    shrinkDatabaseDescription: "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "סיסמת API",
-    serwersmsPhoneNumber: "מספר טלפון",
-    serwersmsSenderName: "שם שולח SMS (רשום באמצעות פורטל לקוחות)",
-    smseagle: "SMSEagle",
-    smseagleTo: "מספרי טלפון)",
-    smseagleGroup: "שם קבוצת ספר טלפונים",
-    smseagleContact: "שם איש קשר בספר הטלפונים",
-    smseagleRecipientType: "Rסוג הנמען",
-    smseagleRecipient: "נמענים (ים) (יש להפריד בין מרובים לפסיק)",
-    smseagleToken: "API Access Token",
-    smseagleUrl: "כתובת האתר של מכשיר ה- SMSeagege שלך",
-    smseagleEncoding: "שלח כ- Unicode",
-    smseaglePriority: "עדיפות הודעה (0-9, ברירת מחדל = 0)",
-    stackfield: "סטאקפילד",
-    Customize: "התאמה אישית",
-    "Custom Footer": "כותרת תחתונה מותאמת אישית",
-    "Custom CSS": "CSS מותאם אישית",
-    smtpDkimSettings: "הגדרות DKIM",
-    smtpDkimDesc: "אנא עיין ב- NodeMailer DKIM {0} לשימוש.",
-    documentation: "ווקיפדיית מדריכים",
-    smtpDkimDomain: "שם דומיין",
-    smtpDkimKeySelector: "בורר מפתח",
-    smtpDkimPrivateKey: "טוראי של פרטיy",
-    smtpDkimHashAlgo: "אלגוריתם hash (אופציונלי)",
-    smtpDkimheaderFieldNames: "מפתחות כותרת לחתום (אופציונלי)",
-    smtpDkimskipFields: "מפתחות כותרת לא לחתום (אופציונלי)",
-    wayToGetPagerDutyKey: "אתה יכול להשיג זאת על ידי מעבר לשירות -> ספריית שירות -> (בחר שירות) -> אינטגרציות -> הוסף אינטגרציה.כאן תוכלו לחפש \"אירועים API v2 \".מידע נוסף {0}",
-    "Integration Key": "מפתח אינטגרציה",
-    "Integration URL": "URL אינטגרציה",
-    "Auto resolve or acknowledged": "פיתרון אוטומטי או הודה",
-    "do nothing": "לעשות כלום",
-    "auto acknowledged": "Auto הודה",
-    "auto resolve": "פתרון אוטומטי",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "נקודת קצה של API",
-    alertaEnvironment: "סביבה",
-    alertaApiKey: "מפתח API",
-    alertaAlertState: "מצב התראה",
-    alertaRecoverState: "לשחזר מדינה",
-    deleteStatusPageMsg: "האם אתה בטוח רוצה למחוק את דף הסטטוס הזה?",
-    Proxies: "Proxies",
-    default: "בְּרִירַת מֶחדָל",
-    enabled: "מופעל",
-    setAsDefault: "נקבע כברירת מחדל",
-    deleteProxyMsg: "האם אתה בטוח רוצה למחוק את הפרוקסי הזה לכל המסכים?",
-    proxyDescription: "Proxies must be assigned to a monitor to function.",
-    enableProxyDescription: "פרוקסי זה לא ישפיע על בקשות צג עד שהוא יופעל.אתה יכול לשלוט באופן זמני להשבית את ה- Proxy מכל המסכים לפי מצב ההפעלה.",
-    setAsDefaultProxyDescription: "פרוקסי זה יופעל כברירת מחדל עבור צגים חדשים.אתה עדיין יכול להשבית את ה- Proxy בנפרד עבור כל צג.",
-    "Certificate Chain": "שרשרת אישורים",
-    Valid: "תָקֵף",
-    Invalid: "לא חוקי",
-    AccessKeyId: "מזהה AccessKey",
-    SecretAccessKey: "גישהלמפתחסוד",
-    PhoneNumbers: "מספר טלפוןs",
-    TemplateCode: "TemplateCode",
-    SignName: "שם שם",
-    "Sms template must contain parameters: ": "תבנית SMS חייבת להכיל פרמטרים: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "מפתח סודי",
-    "For safety, must use secret key": "לבטיחות, חייב להשתמש במפתח סודיy",
-    "Device Token": "אסימון מכשיר",
-    Platform: "פּלַטפוֹרמָה",
-    iOS: "iOS",
-    Android: "דְמוּי אָדָם",
-    Huawei: "huawei",
-    High: "High",
-    Retry: "נסה שוב",
-    Topic: "נוֹשֵׂא",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "הגדרת פרוקסי",
-    "Proxy Protocol": "פרוטוקול פרוקסי",
-    "Proxy Server": "שרת פרוקסי",
-    "Proxy server has authentication": "לשרת ה- Proxy יש אימות",
-    User: "מִשׁתַמֵשׁ",
-    Installed: "מוּתקָן",
-    "Not installed": "לא מותקן",
-    Running: "רץ",
-    "Not running": "לא רץ",
-    "Remove Token": "הסר אסימון",
-    Start: "הַתחָלָה",
-    Stop: "תפסיק",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "הוסף דף סטטוס חדש",
-    Slug: "Slug",
-    "Accept characters:": "קבל תווים:",
-    startOrEndWithOnly: "התחל או סוף עם {0} בלבד",
-    "No consecutive dashes": "אין מקפים רצופים",
-    Next: "הַבָּא",
-    "The slug is already taken. Please choose another slug.": "השבלול כבר נלקח.אנא בחר שבלול נוסף.",
-    "No Proxy": "אין פרוקסי",
-    Authentication: "אבטחה",
-    "HTTP Basic Auth": "HTTP בסיסי Auth",
-    "New Status Page": "דף סטטוס חדש",
-    "Page Not Found": "הדף לא נמצא",
-    "Reverse Proxy": "פרוקסי הפוך",
-    Backup: "גיבוי",
-    About: "אודות",
-    wayToGetCloudflaredURL: "(הורד את CloudFlared מ- {0})",
-    cloudflareWebsite: "אתר CloudFlare",
-    "Message:": "הוֹדָעָה:",
-    "Don't know how to get the token? Please read the guide:": "לא יודע איך להשיג את האסימון?אנא קרא את המדריך:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "החיבור הנוכחי עשוי ללכת לאיבוד אם אתה מתחבר כרגע באמצעות מנהרת CloudFlare.האם אתה בטוח רוצה לעצור את זה?הקלד את הסיסמה הנוכחית שלך כדי לאשר אותה.",
-    "HTTP Headers": "כותרות HTTP",
-    "Trust Proxy": "אמון בפרוקסי",
-    "Other Software": "תוכנה אחרת",
-    "For example: nginx, Apache and Traefik.": "למשל: Nginx, Apache ו- Traefik.",
-    "Please read": "בבקשה תקרא",
-    "Subject:": "נושא:",
-    "Valid To:": "תקף ל:",
-    "Days Remaining:": "ימים שנותרו:",
-    "Issuer:": "המנפיק:",
-    "Fingerprint:": "טביעת אצבע:",
-    "No status pages": "אין דפי סטטוס",
-    "Domain Name Expiry Notification": "הודעה על תום שם תחום",
-    Proxy: "פרוקסי",
-    "Date Created": "תאריך יצירה",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "כתובת HTTP של OneBot ",
-    onebotMessageType: "סוג ההודעה OneBot",
-    onebotGroupMessage: "קְבוּצָה",
-    onebotPrivateMessage: "פְּרָטִי",
-    onebotUserOrGroupId: "מזהה קבוצה/משתמש ",
-    onebotSafetyTips: "לבטיחות, חייב לקבוע אסימון גישה ",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "טקסט כותרת תחתונה ",
-    "Show Powered By": "הצג מופעל על ידי ",
-    "Domain Names": "שמות דומיין ",
-    signedInDisp: "חתום כ- {0} ",
-    signedInDispDisabled: "Auth מושבת.",
-    RadiusSecret: "רדיוס סוד",
-    RadiusSecretDescription: "סוד משותף בין לקוח לשרת",
-    RadiusCalledStationId: "נקרא מזהה תחנה",
-    RadiusCalledStationIdDescription: "מזהה של המכשיר הנקרא ",
-    RadiusCallingStationId: "מזהה תחנת שיחה ",
-    RadiusCallingStationIdDescription: "מזהה של מכשיר השיחה ",
-    "Certificate Expiry Notification": "הודעת תפוגה של אישור",
-    "API Username": "שם משתמש API",
-    "API Key": "מפתח API",
-    "Recipient Number": "מספר הנמען",
-    "From Name/Number": "משם/מספר",
-    "Leave blank to use a shared sender number.": "השאר ריק כדי להשתמש במספר שולח משותף.",
-    "Octopush API Version": "גרסת API של תמנון",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "נקודת קצה",
-    octopushAPIKey: "\"מפתח API \" מתוך תעודות API של HTTP בלוח הבקרה",
-    octopushLogin: "\"כניסה \" מתעודות API של HTTP בלוח הבקרה",
-    promosmsLogin: "שם כניסה של API",
-    promosmsPassword: "סיסמת API",
-    "pushoversounds pushover": "Pushover (ברירת מחדל)",
-    "pushoversounds bike": "אופניים",
-    "pushoversounds bugle": "חֲצוֹצְרָה",
-    "pushoversounds cashregister": "קופה רושמת",
-    "pushoversounds classical": "קלַאסִי",
-    "pushoversounds cosmic": "קוֹסמִי",
-    "pushoversounds falling": "נופל",
-    "pushoversounds gamelan": "gamelan",
-    "pushoversounds incoming": "נִכנָס",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "קֶסֶם",
-    "pushoversounds mechanical": "מֵכָנִי",
-    "pushoversounds pianobar": "בר פסנתר",
-    "pushoversounds siren": "סִירֶנָה",
-    "pushoversounds spacealarm": "אזעקת חלל",
-    "pushoversounds tugboat": "סירת משיכה",
-    "pushoversounds alien": "אזעקת חייזרים (ארוכה)",
-    "pushoversounds climb": "לטפס (ארוך)",
-    "pushoversounds persistent": "מתמיד (ארוך)",
-    "pushoversounds echo": "הד Pushover (ארוך)",
-    "pushoversounds updown": "למעלה (ארוך)",
-    "pushoversounds vibrate": "לרטוט בלבד",
-    "pushoversounds none": "אף אחד (שקט)",
-    pushyAPIKey: "מפתח API סודי",
-    pushyToken: "אסימון מכשיר",
-    "Show update if available": "הצג עדכון אם זמין",
-    "Also check beta release": "בדוק גם את שחרור הבטא",
-    "Using a Reverse Proxy?": "באמצעות פרוקסי הפוך?",
-    "Check how to config it for WebSocket": "בדוק כיצד להגדיר אותו ל- WebSocket",
-    "Steam Game Server": "שרת משחק קיטור",
-    "Most likely causes:": "ככל הנראה גורם:",
-    "The resource is no longer available.": "המשאב כבר לא זמין.",
-    "There might be a typing error in the address.": "יתכן שיש שגיאת הקלדה בכתובת.",
-    "What you can try:": "מה שאתה יכול לנסות:",
-    "Retype the address.": "הקלד מחדש את הכתובת.",
-    "Go back to the previous page.": "חזור לדף הקודם.",
-    "Coming Soon": "בקרוב",
-    wayToGetClickSendSMSToken: "אתה יכול לקבל שם משתמש API ומפתח API מ- {0}.",
-    "Connection String": "מחרוזת חיבור",
-    Query: "שאילתא",
-    settingsCertificateExpiry: "תפוגת תעודת TLS",
-    certificationExpiryDescription: "HTTPS עוקב אחר התראה על התראה כאשר תעודת TLS פגה ב:",
-    "Setup Docker Host": "הגדרת מארח Docker",
-    "Connection Type": "סוג חיבור",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "האם אתה בטוח רוצה למחוק את המארח של Docker לכל המוניטורים?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "מיכל Docker",
-    "Container Name / ID": "שם מכולה / מזהה",
-    "Docker Host": "מארח דוקר",
-    "Docker Hosts": "מארחי Docker",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "תְחוּם",
-    Workstation: "עמדת עבודה",
-    disableCloudflaredNoAuthMsg: "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.",
-    trustProxyDescription: "סמוך על כותרות 'x-forwarded-*'.אם אתה רוצה להשיג את ה- IP של הלקוח הנכון וה- Uptime Kuma שלך מאחור כמו Nginx או Apache, עליך לאפשר זאת.",
-    wayToGetLineNotifyToken: "אתה יכול לקבל אסימון גישה מ- {0}",
-    Examples: "דוגמאות",
-    "Home Assistant URL": "כתובת URL עוזרת ביתית",
-    "Long-Lived Access Token": "אסימון גישה ארוכת שנים",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "ניתן ליצור אסימון גישה לאורך זמן על ידי לחיצה על שם הפרופיל שלך (שמאל למטה) וגלילה לתחתית ואז לחץ על צור אסימון. ",
-    "Notification Service": "Notification Service",
-    "default: notify all devices": "default: notify all devices",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "רשימה של שירותי הודעה ניתן למצוא בעוזר הבית תחת \"כלי מפתחים> שירותים \" חפש \"הודעה \" כדי למצוא את שם המכשיר/טלפון שלך.",
-    "Automations can optionally be triggered in Home Assistant:": "אוטומציות יכולות להיות מופעלות באופן אופציונלי לעוזר הבית:",
-    "Trigger type:": "סוג ההדק:",
-    "Event type:": "סוג אירוע:",
-    "Event data:": "נתוני אירועים:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "ואז בחר פעולה, למשל העבר את הסצינה למקום בו אור RGB הוא אדום.",
-    "Frontend Version": "גרסת Frontend",
-    "Frontend Version do not match backend version!": "גרסת Frontend לא תואמת את גרסת Backend!",
-    "Base URL": "Base URL",
-    goAlertInfo: "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}",
-    goAlertIntegrationKeyInfo: "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "מיושם: מכיוון שהרבה תכונות שנוספו ותכונת הגיבוי הזו מעט לא מצומצמת, היא לא יכולה לייצר או לשחזר גיבוי שלם.",
-    backupRecommend: "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.",
-    Optional: "אופציונאלי",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "מסמכי API של SmsManager ",
-    "Gateway Type": "סוג שער",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "אתה יכול לחלק מספרים עם",
-    or: "אוֹ",
-    recurringInterval: "הפסקה",
-    Recurring: "מחזורי",
-    strategyManual: "פעיל/לא פעיל באופן ידני",
-    warningTimezone: "זה משתמש באזור הזמן של השרת",
-    weekdayShortMon: "שני",
-    weekdayShortTue: "שלישי",
-    weekdayShortWed: "רביעי",
-    weekdayShortThu: "חמישי",
-    weekdayShortFri: "שישי",
-    weekdayShortSat: "שבת",
-    weekdayShortSun: "ראשון",
-    dayOfWeek: "יום בשבוע",
-    dayOfMonth: "יום בחודש",
-    lastDay: "Last Day",
-    lastDay1: "היום האחרון של החודש",
-    lastDay2: "יום שני האחרון של החודש",
-    lastDay3: "יום 3 האחרון של החודש",
-    lastDay4: "היום הרביעי האחרון בחודש",
-    "No Maintenance": "אין תחזוקה",
-    pauseMaintenanceMsg: "האם אתה בטוח רוצה להשהות?",
-    "maintenanceStatus-under-maintenance": "מתבצעות עבודות תחזוקה",
-    "maintenanceStatus-inactive": "לא פעיל",
-    "maintenanceStatus-scheduled": "מתוזמן",
-    "maintenanceStatus-ended": "הסתיים",
-    "maintenanceStatus-unknown": "לא ידוע",
-    "Display Timezone": "הצג אזור זמן",
-    "Server Timezone": "אזור זמן של שרת",
-    statusPageMaintenanceEndDate: "סוך",
-    IconUrl: "קישור לתמונת אייקון",
-    "Enable DNS Cache": "הפעל מטמון DNS",
-    Enable: "הפעל",
-    Disable: "השבת",
-    dnsCacheDescription: "ייתכן שהוא לא עובד בסביבות IPv6 מסוימות, השבת אותו אם אתה נתקל בבעיות כלשהן.",
-    "Single Maintenance Window": "חלון תחזוקה בודד",
-    "Maintenance Time Window of a Day": "חלון זמן תחזוקה ביום",
-    "Effective Date Range": "טווח תאריכים אפקטיבי",
-    "Schedule Maintenance": "לוח זמנים לתחזוקה",
-    "Date and Time": "תאריך ושעה",
-    "DateTime Range": "טווח תאריכים וזמן",
-    Strategy: "אסטרטגיה",
-    "Free Mobile User Identifier": "מזהה משתמש נייד בחינם",
-    "Free Mobile API Key": "מפתח API חינם לנייד",
-    "Enable TLS": "אפשר TLS",
-    "Proto Service Name": "שם שירות פרוטו",
-    "Proto Method": "שיטת פרוטו",
-    "Proto Content": "תוכן פרוטו",
-    Economy: "חיסכון",
-    Lowcost: "זול",
-    high: "גבוהה",
-    "General Monitor Type": "מוניטור כללי",
-    "Passive Monitor Type": "מוניטור פסיבי",
-    "Specific Monitor Type": "סוג מוניטור ספציפי",
-};
diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js
deleted file mode 100644
index 0c73e1d9..00000000
--- a/src/languages/hr-HR.js
+++ /dev/null
@@ -1,581 +0,0 @@
-export default {
-    languageName: "Hrvatski",
-    checkEverySecond: "Provjera svake {0} sekunde",
-    retryCheckEverySecond: "Ponovni pokušaj svake {0} sekunde",
-    retriesDescription: "Broj ponovnih pokušaja prije nego će se servis označiti kao nedostupan te poslati obavijest",
-    ignoreTLSError: "Ignoriraj TLS/SSL pogreške za HTTPS web stranice",
-    upsideDownModeDescription: "Preokreni logiku statusa. Ako se primi pozitivan odgovor, smatra se da je usluga nedostupna.",
-    maxRedirectDescription: "Maksimalan broj preusmjeravanja. Postaviti na 0 kako bi se preusmjeravanja onemogućila.",
-    acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspješnim odgovorom.",
-    passwordNotMatchMsg: "Lozinke se ne poklapaju.",
-    notificationDescription: "Obavijesti će funkcionirati samo ako su dodijeljene monitoru.",
-    keywordDescription: "Ključna riječ za pretragu, u obliku običnog HTML-a ili u JSON formatu. Pretraga je osjetljiva na velika i mala slova.",
-    deleteMonitorMsg: "Jeste li sigurni da želite izbrisati monitor?",
-    deleteNotificationMsg: "Jeste li sigurni da želite izbrisati ovu obavijest za sve monitore?",
-    resolverserverDescription: "Cloudflare je zadani DNS poslužitelj. Možete to promijeniti u bilo kojem trenutku.",
-    rrtypeDescription: "Odaberite vrstu DNS zapisa o resursu kojeg želite pratiti",
-    pauseMonitorMsg: "Jeste li sigurni da želite pauzirati?",
-    enableDefaultNotificationDescription: "Ova će obavijesti biti omogućena za sve nove monitore. Možete ju ručno onemogućiti za pojedini monitor.",
-    clearEventsMsg: "Jeste li sigurni da želite izbrisati sve zapise o događajima za ovaj monitor?",
-    clearHeartbeatsMsg: "Jeste li sigurni da želite izbrisati sve zapise o provjerama za ovaj monitor?",
-    confirmClearStatisticsMsg: "Jeste li sigurni da želite izbrisati SVE statistike?",
-    importHandleDescription: "Odaberite opciju \"Preskoči postojeće\" ako želite preskočiti uvoz postojećih monitora i obavijesti ako dođe do poklapanja u imenu. Opcija \"Prepiši\" će izbrisati postojeće monitore i obavijesti.",
-    confirmImportMsg: "Jeste li sigurni da želite pokrenuti uvoz? Provjerite jeste li odabrali ispravnu opciju uvoza.",
-    twoFAVerifyLabel: "Unesite svoj 2FA token:",
-    tokenValidSettingsMsg: "Token je važeći! Sada možete spremiti postavke dvofaktorske autentikacije.",
-    confirmEnableTwoFAMsg: "Želite li omogućiti dvofaktorsku autentikaciju?",
-    confirmDisableTwoFAMsg: "Jeste li sigurni da želite onemogućiti dvofaktorsku autentikaciju?",
-    Settings: "Postavke",
-    Dashboard: "Kontrolna ploča",
-    "New Update": "Novo ažuriranje",
-    Language: "Jezik",
-    Appearance: "Izgled",
-    Theme: "Tema",
-    General: "Općenito",
-    "Primary Base URL": "Osnovni URL",
-    Version: "Inačica",
-    "Check Update On GitHub": "Provjeri dostupnost nove inačice na GitHubu",
-    List: "Popis",
-    Add: "Dodaj",
-    "Add New Monitor": "Dodaj novi Monitor",
-    "Quick Stats": "Statistika",
-    Up: "Dostupno",
-    Down: "Nedostupno",
-    Pending: "U tijeku",
-    Unknown: "Nepoznato",
-    pauseDashboardHome: "Pauzirano",
-    Name: "Naziv",
-    Status: "Status",
-    DateTime: "Vremenska oznaka",
-    Message: "Izvještaj",
-    "No important events": "Nema važnih događaja",
-    Pause: "Pauziraj",
-    Resume: "Nastavi",
-    Edit: "Uredi",
-    Delete: "Obriši",
-    Current: "Trenutno",
-    Uptime: "Dostupnost",
-    "Cert Exp.": "Istek cert.",
-    day: "dan | dana",
-    "-day": "-dnevno",
-    hour: "sat",
-    "-hour": "-satno",
-    Response: "Odgovor",
-    Ping: "Odziv",
-    "Monitor Type": "Vrsta Monitora",
-    Keyword: "Ključna riječ",
-    "Friendly Name": "Prilagođen naziv",
-    URL: "URL",
-    Hostname: "Domaćin",
-    Port: "Port",
-    "Heartbeat Interval": "Interval provjere",
-    Retries: "Broj ponovnih pokušaja",
-    "Heartbeat Retry Interval": "Interval ponovnih pokušaja",
-    Advanced: "Napredne postavke",
-    "Upside Down Mode": "Obrnuti način",
-    "Max. Redirects": "Maksimalan broj preusmjeravanja",
-    "Accepted Status Codes": "Prihvaćeni statusni kodovi",
-    "Push URL": "Push URL",
-    needPushEvery: "Potrebno je slati zahtjeve na URL svakih {0} sekundi.",
-    pushOptionalParams: "Neobavezni parametri: {0}",
-    Save: "Spremi",
-    Notifications: "Obavijesti",
-    "Not available, please setup.": "Nije dostupno, potrebno je dodati novu stavku.",
-    "Setup Notification": "Dodaj obavijest",
-    Light: "Svijetli način",
-    Dark: "Tamni način",
-    Auto: "Automatski",
-    "Theme - Heartbeat Bar": "Tema za traku dostupnosti",
-    Normal: "Normalno",
-    Bottom: "Ispod",
-    None: "Isključeno",
-    Timezone: "Vremenska zona",
-    "Search Engine Visibility": "Vidljivost tražilicama",
-    "Allow indexing": "Dopusti indeksiranje",
-    "Discourage search engines from indexing site": "Sprječavanje indeksiranja",
-    "Change Password": "Promjena lozinke",
-    "Current Password": "Trenutna lozinka",
-    "New Password": "Nova lozinka",
-    "Repeat New Password": "Potvrdite novu lozinku",
-    "Update Password": "Spremi novu lozinku",
-    "Disable Auth": "Onemogući autentikaciju",
-    "Enable Auth": "Omogući autentikaciju",
-    "disableauth.message1": "Jeste li sigurni da želite <strong>isključiti autentikaciju</strong>?",
-    "disableauth.message2": "To je za <strong>korisnike koji imaju vanjsku autentikaciju stranice</strong> ispred Uptime Kume, poput usluge Cloudflare Access.",
-    "Please use this option carefully!": "Pažljivo koristite ovu opciju.",
-    Logout: "Odjava",
-    Leave: "Poništi",
-    "I understand, please disable": "Razumijem, svejedno onemogući",
-    Confirm: "Potvrda",
-    Yes: "Da",
-    No: "Ne",
-    Username: "Korisničko ime",
-    Password: "Lozinka",
-    "Remember me": "Zapamti me",
-    Login: "Prijava",
-    "No Monitors, please": "Nema monitora, ",
-    "add one": "dodaj jedan",
-    "Notification Type": "Tip obavijesti",
-    Email: "E-pošta",
-    Test: "Testiraj",
-    "Certificate Info": "Informacije o certifikatu",
-    "Resolver Server": "DNS poslužitelj",
-    "Resource Record Type": "Vrsta DNS zapisa",
-    "Last Result": "Posljednji rezultat",
-    "Create your admin account": "Stvori administratorski račun",
-    "Repeat Password": "Potvrda lozinke",
-    "Import Backup": "Uvoz sigurnosne kopije",
-    "Export Backup": "Izvoz sigurnosne kopije",
-    Export: "Izvoz",
-    Import: "Uvoz",
-    respTime: "Vrijeme odgovora (ms)",
-    notAvailableShort: "ne postoji",
-    "Default enabled": "Omogući za nove monitore",
-    "Apply on all existing monitors": "Primijeni na postojeće monitore",
-    Create: "Kreiraj",
-    "Clear Data": "Obriši podatke",
-    Events: "Događaji",
-    Heartbeats: "Provjere",
-    "Auto Get": "Automatski dohvat",
-    backupDescription: "Moguće je napraviti sigurnosnu kopiju svih monitora i obavijesti koja će biti spremljena kao JSON datoteka.",
-    backupDescription2: "Napomena: povijest i podaci o događajima nisu uključeni u sigurnosnu kopiju.",
-    backupDescription3: "Osjetljivi podaci poput tokena za obavijesti uključeni su u sigurnosnu kopiju. Zato je potrebno čuvati izvoz na sigurnom mjestu.",
-    alertNoFile: "Datoteka za uvoz nije odabrana.",
-    alertWrongFileType: "Datoteka za uvoz nije u JSON formatu.",
-    "Clear all statistics": "Obriši sve statistike",
-    "Skip existing": "Preskoči postojeće",
-    Overwrite: "Prepiši",
-    Options: "Opcije",
-    "Keep both": "Zadrži sve",
-    "Verify Token": "Provjeri Token",
-    "Setup 2FA": "Postavi dvofaktorsku autentikaciju",
-    "Enable 2FA": "Omogući dvofaktorsku autentikaciju",
-    "Disable 2FA": "Onemogući dvofaktorsku autentikaciju",
-    "2FA Settings": "Postavke 2FA",
-    "Two Factor Authentication": "Dvofaktorska autentikacija",
-    Active: "Aktivna",
-    Inactive: "Neaktivno",
-    Token: "Token",
-    "Show URI": "Pokaži URI",
-    Tags: "Oznake",
-    "Add New below or Select...": "Dodajte novu oznaku ispod ili odaberite...",
-    "Tag with this name already exist.": "Oznaka s tim nazivom već postoji",
-    "Tag with this value already exist.": "Oznaka s tom vrijednošću već postoji.",
-    color: "Boja",
-    "value (optional)": "Vrijednost (neobavezno)",
-    Gray: "Siva",
-    Red: "Crvena",
-    Orange: "Narančasta",
-    Green: "Zelena",
-    Blue: "Plava",
-    Indigo: "Indigo",
-    Purple: "Ljubičasta",
-    Pink: "Ružičasta",
-    "Search...": "Pretraga...",
-    "Avg. Ping": "Prosječni odziv",
-    "Avg. Response": "Prosječni odgovor",
-    "Entry Page": "Početna stranica",
-    statusPageNothing: "Ovdje nema ničega, dodajte grupu ili monitor.",
-    "No Services": "Nema usluga",
-    "All Systems Operational": "Svi sustavi su operativni",
-    "Partially Degraded Service": "Usluga djelomično nedostupna",
-    "Degraded Service": "Usluga nedostupna",
-    "Add Group": "Dodaj grupu",
-    "Add a monitor": "Dodaj monitor",
-    "Edit Status Page": "Uredi Statusnu stranicu",
-    "Go to Dashboard": "Na Kontrolnu ploču",
-    "Status Page": "Statusna stranica",
-    "Status Pages": "Statusne stranice",
-    defaultNotificationName: "Moja {number}. {notification} obavijest",
-    here: "ovdje",
-    Required: "Potrebno",
-    telegram: "Telegram",
-    "Bot Token": "Token bota",
-    wayToGetTelegramToken: "Token možete nabaviti preko {0}.",
-    "Chat ID": "ID razgovora",
-    supportTelegramChatID: "Podržani su ID-jevi izravnih razgovora, grupa i kanala",
-    wayToGetTelegramChatID: "ID razgovora možete saznati tako da botu pošaljete poruku te odete na ovaj URL:",
-    "YOUR BOT TOKEN HERE": "OVDJE IDE TOKEN BOTA",
-    chatIDNotFound: "ID razgovora nije pronađen; prvo morate poslati poruku botu",
-    webhook: "Webhook",
-    "Post URL": "URL Post zahtjeva",
-    "Content Type": "Tip sadržaja (Content Type)",
-    webhookJsonDesc: "{0} je dobra opcija za moderne HTTP poslužitelje poput Express.js-a",
-    webhookFormDataDesc: "{multipart} je moguća alternativa za PHP, samo je potrebno parsirati JSON koristeći {decodeFunction}",
-    smtp: "E-mail (SMTP)",
-    secureOptionNone: "Bez sigurnosti / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignoriraj greške TLS-a",
-    "From Email": "Adresa za \"From\" polje",
-    emailCustomSubject: "Prilagođeno \"Subject\" polje",
-    "To Email": "Odredišne adrese e-pošte",
-    smtpCC: "Cc",
-    smtpBCC: "Bcc",
-    discord: "Discord",
-    "Discord Webhook URL": "URL Discord webhooka",
-    wayToGetDiscordURL: "Ovo možete dobiti tako da odete na Postavke servera -> Integracije -> Napravi webhook",
-    "Bot Display Name": "Nadimak Bota unutar servera",
-    "Prefix Custom Message": "Prefiks prilagođene poruke",
-    "Hello @everyone is...": "Pozdrav {'@'}everyone...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL webhooka",
-    wayToGetTeamsURL: "Više informacija o Teams webhookovima možete pročitati {0}.",
-    signal: "Signal",
-    Number: "Broj",
-    Recipients: "Primatelji",
-    needSignalAPI: "Potreban je klijent s REST sučeljem.",
-    wayToCheckSignalURL: "Više informacija o postavljanju Signal klijenta:",
-    signalImportant: "VAŽNO: Grupe i brojevi se ne mogu istovremeno koristiti kao primatelji!",
-    gotify: "Gotify",
-    "Application Token": "Token Aplikacije",
-    "Server URL": "URL poslužitelja",
-    Priority: "Prioritet",
-    slack: "Slack",
-    "Icon Emoji": "Emotikon",
-    "Channel Name": "Naziv kanala",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Dodatne informacije o webhookovima su dostupne na: {0}",
-    aboutChannelName: "Unesite ime {0} kanala u polju Naziv kanala ako želite zaobići webhook kanal. Primjerice: #neki-kanal",
-    aboutKumaURL: "Ako je polje \"Uptime Kuma URL\" prazno, koristi se zadana vrijednost koja vodi na GitHub stranicu projekta.",
-    emojiCheatSheet: "Popis emotikona: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Podržava preko 50 usluga za obavijesti)",
-    pushbullet: "Pushbullet",
-    line: "LINE",
-    mattermost: "Mattermost",
-    "User Key": "Korisnički ključ",
-    Device: "Uređaji",
-    "Message Title": "Naslov poruke",
-    "Notification Sound": "Zvuk obavijesti",
-    "More info on:": "Više informacija na: {0}",
-    pushoverDesc1: "Hitni prioritet (2) ima zadani istek vremena od 30 sekundi između ponovnih pokušaja te će isteći nakon 1 sata.",
-    pushoverDesc2: "Ako želite slati obavijesti na više uređaja, ispunite polje \"Uređaji\".",
-    "SMS Type": "Tip SMS-a",
-    octopushTypePremium: "Premium (Brzo - preporučeno za obavijesti)",
-    octopushTypeLowCost: "Low Cost (Sporo - mobilni operateri ponekad blokiraju ove poruke)",
-    checkPrice: "Provjerite {0} cijene:",
-    apiCredentials: "Vjerodajnice za API",
-    octopushLegacyHint: "Koristite li staru inačicu usluge Octopush (2011-2020) ili noviju inačicu?",
-    "Check octopush prices": "Provjerite cijene usluge Octopush {0}.",
-    octopushPhoneNumber: "Telefonski broj (međunarodni format, primjerice: +38512345678) ",
-    octopushSMSSender: "Naziv SMS pošiljatelja : 3-11 alfanumeričkih znakova i razmak (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea ID Uređaja",
-    "Apprise URL": "URL usluge Apprise",
-    "Example:": "Primjerice: {0}",
-    "Read more:": "Pročitajte više: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Pročitaj više",
-    appriseInstalled: "Apprise je instaliran.",
-    appriseNotInstalled: "Apprise nije instaliran. {0}",
-    "Access Token": "Pristupni token",
-    "Channel access token": "Token za pristup kanalu",
-    "Line Developers Console": "LINE razvojnoj konzoli",
-    lineDevConsoleTo: "LINE razvojna konzola - {0}",
-    "Basic Settings": "Osnovne Postavke",
-    "User ID": "Korisnički ID",
-    "Messaging API": "API za razmjenu poruka",
-    wayToGetLineChannelToken: "Prvo, pristupite {0}, kreirajte pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti token za pristup kanalu te korisnički ID za polja iznad.",
-    "Icon URL": "URL slike",
-    aboutIconURL: "Možete postaviti poveznicu na sliku u polju \"URL slike\" kako biste spriječili korištenje zadane slike. Ovo se polje neće koristiti ako je postavljeno polje \"Emotikon\".",
-    aboutMattermostChannelName: "Možete promijeniti kanal u kojeg webhook šalje tako da ispunite polje \"Naziv kanala\". Ta opcija mora biti omogućena unutar Mattermost postavki za webhook. Primjerice: #neki-kanal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - jeftina, ali spora opcija koja je često preopterećena. Ograničeno samo na primatelje unutar Poljske.",
-    promosmsTypeFlash: "SMS FLASH - Poruka se automatski pojavljuje na uređaju primatelja. Ograničeno samo na primatelje unutar Poljske.",
-    promosmsTypeFull: "SMS FULL - Premium razina usluge, dozvoljava postavljanje naziva SMS pošiljatelja (Naziv mora biti registriran). Usluga pouzdana za obavijesti.",
-    promosmsTypeSpeed: "SMS SPEED - Usluga najvećeg prioriteta. Brza i pouzdana, ali skupa (otprilike dvostruko skuplja od cijene usluge SMS FULL).",
-    promosmsPhoneNumber: "Telefonski broj (za primatelje unutar Poljske nije potrebno navoditi pozivni broj države)",
-    promosmsSMSSender: "Naziv SMS pošiljatelja: Registriran naziv ili jedan od zadanih: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu URL webhooka",
-    matrixHomeserverURL: "URL Matrix homeservera (uključujući http(s):// te port, ako je potrebno)",
-    "Internal Room Id": "Interni ID sobe",
-    matrixDesc1: "Interni ID sobe se može pronaći u naprednim postavkama sobe unutar Matrix klijenta. ID sobe nalikuje idućem zapisu: !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Preporučuje se stvaranje novog korisnika te suzdržavanje od korištenja pristupnog tokena vlastitog Matrix korisnika. Novog korisnika potrebno je dodati u sobe u kojima želite primati obavijesti. Pristupni token možete dobiti pokretanjem naredbe {0}",
-    Method: "Metoda",
-    Body: "Tijelo",
-    Headers: "Zaglavlja",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Zaglavlja nisu nije valjani JSON: ",
-    BodyInvalidFormat: "Tijelo zahtjeva nije valjani JSON: ",
-    "Monitor History": "Povijest monitora",
-    clearDataOlderThan: "Podaci o povijesti monitora čuvaju se {0} dana.",
-    PasswordsDoNotMatch: "Lozinke se ne poklapaju.",
-    records: "zapisa",
-    "One record": "Jedan zapis",
-    "Showing {from} to {to} of {count} records": "Prikaz zapisa {from}-{to} od sveukupno {count}",
-    steamApiKeyDescription: "Za praćenje Steam poslužitelja za igru, potrebno je imati Steam Web-API ključ. Možete registrirati vlastiti ključ ovdje: ",
-    "Current User": "Trenutni korisnik",
-    recent: "Nedavno",
-    Done: "Gotovo",
-    Info: "Informacije",
-    Security: "Sigurnost",
-    "Shrink Database": "Smanji bazu podataka",
-    "Pick a RR-Type...": "Odaberite vrstu DNS zapisa od navedenih...",
-    "Pick Accepted Status Codes...": "Odaberite HTTP statusne kodove koji će biti prihvaćeni...",
-    "Steam API Key": "Steam API ključ",
-    Default: "Zadano",
-    "HTTP Options": "HTTP Postavke",
-    "Create Incident": "Novi izvještaj o incidentu",
-    Title: "Naslov",
-    Content: "Sadržaj",
-    Style: "Stil",
-    info: "informacija",
-    warning: "upozorenje",
-    danger: "opasnost",
-    primary: "primarno",
-    light: "svijetlo",
-    dark: "tamno",
-    Post: "Objavi",
-    Created: "Stvoreno",
-    "Last Updated": "Uređeno",
-    "Please input title and content": "Naslov i sadržaj ne mogu biti prazni",
-    Unpin: "Ukloni",
-    "Switch to Light Theme": "Prebaci na svijetli način",
-    "Switch to Dark Theme": "Prebaci na tamni način",
-    "Show Tags": "Pokaži oznake",
-    "Hide Tags": "Sakrij oznake",
-    Description: "Opis",
-    "No monitors available.": "Nema dostupnih monitora.",
-    "Add one": "Stvori jednog",
-    "No Monitors": "Bez monitora",
-    "Untitled Group": "Bezimena grupa",
-    Services: "Usluge",
-    Discard: "Odbaci",
-    Cancel: "Otkaži",
-    "Powered by": "Pokreće",
-    Saved: "Spremljeno",
-    PushByTechulus: "Push by Techulus",
-    GoogleChat: "Google Chat (preko platforme Google Workspace)",
-    shrinkDatabaseDescription: "Pokreni VACUUM operaciju za SQLite. Ako je baza podataka kreirana nakon inačice 1.10.0, AUTO_VACUUM opcija već je uključena te ova akcija nije nužna.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API korisničko ime (uključujući webapi_ prefiks)",
-    serwersmsAPIPassword: "API lozinka",
-    serwersmsPhoneNumber: "Broj telefona",
-    serwersmsSenderName: "Ime SMS pošiljatelja (registrirano preko korisničkog portala)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM postavke",
-    smtpDkimDesc: "Za više informacija, postoji Nodemailer DKIM {0}.",
-    documentation: "dokumentacija",
-    smtpDkimDomain: "Domena",
-    smtpDkimKeySelector: "Odabir ključa",
-    smtpDkimPrivateKey: "Privatni ključ",
-    smtpDkimHashAlgo: "Hash algoritam (neobavezno)",
-    smtpDkimheaderFieldNames: "Ključevi zaglavlja za potpis (neobavezno)",
-    smtpDkimskipFields: "Ključevi zaglavlja koji se neće potpisati (neobavezno)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Krajnja točka API-ja (Endpoint)",
-    alertaEnvironment: "Okruženje (Environment)",
-    alertaApiKey: "API ključ",
-    alertaAlertState: "Stanje upozorenja",
-    alertaRecoverState: "Stanje oporavka",
-    deleteStatusPageMsg: "Sigurno želite obrisati ovu statusnu stranicu?",
-    resendEveryXTimes: "Ponovno pošalji svakih {0} puta",
-    resendDisabled: "Ponovno slanje je onemogućeno",
-    dnsPortDescription: "Port DNS poslužitelja. Zadana vrijednost je 53. Moguće je promijeniti ga u svakom trenutku.",
-    "Resend Notification if Down X times consequently": "Ponovno pošalji obavijest ako je usluga nedostupna više puta zaredom",
-    topic: "Tema",
-    topicExplanation: "MQTT tema koja će se monitorirati",
-    successMessage: "Poruka o uspjehu",
-    successMessageExplanation: "MQTT poruka koja se smatra uspješnom",
-    error: "greška",
-    critical: "kritično",
-    Customize: "Customize",
-    "Custom Footer": "Prilagođeno podnožje",
-    "Custom CSS": "Prilagođeni CSS",
-    wayToGetPagerDutyKey: "Ključ možete dobiti odlaskom na \"Service -> Service Directory -> (Odabrani servis) -> Integrations -> Add integration\". Ovdje pretražite za \"Events API V2\". Više informacija {0}",
-    "Integration Key": "Ključ integracije",
-    "Integration URL": "URL integracije",
-    "Auto resolve or acknowledged": "Automatsko razrješavanje i priznavanje",
-    "do nothing": "Ne radi ništa",
-    "auto acknowledged": "Automatsko priznavanje",
-    "auto resolve": "Automatsko razrješavanje",
-    Proxies: "Proxy poslužitelji",
-    default: "Zadano",
-    enabled: "Omogućeno",
-    setAsDefault: "Postavi kao zadano",
-    deleteProxyMsg: "Sigurno želite obrisati ovaj proxy za sve monitore?",
-    proxyDescription: "Proxy poslužitelji moraju biti dodijeljni monitoru kako bi funkcionirali.",
-    enableProxyDescription: "Onemogućeni proxy poslužitelj neće imati učinak na zahtjeve monitora. Možete privremeno onemogućiti proxy poslužitelja za sve monitore.",
-    setAsDefaultProxyDescription: "Ovaj proxy poslužitelj bit će odmah omogućen za nove monitore. I dalje ga možete onemogućiti za svaki monitor zasebno.",
-    "Certificate Chain": "Lanac certifikata",
-    Valid: "Važeći",
-    Invalid: "Nevažeći",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey tajni ključ",
-    PhoneNumbers: "Telefonski brojevi",
-    TemplateCode: "Predložak koda",
-    SignName: "Potpis",
-    "Sms template must contain parameters: ": "SMS predložak mora sadržavati parametre: ",
-    "Bark Endpoint": "Bark krajnja točka (endpoint)",
-    "Bark Group": "Bark grupa",
-    "Bark Sound": "Bark zvuk",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "Tajni ključ",
-    "For safety, must use secret key": "Korištenje tajnog ključa je obavezno",
-    "Device Token": "Token uređaja",
-    Platform: "Platforma",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Visoko",
-    Retry: "Ponovnih pokušaja",
-    Topic: "Tema",
-    "WeCom Bot Key": "WeCom ključ Bota",
-    "Setup Proxy": "Dodaj proxy poslužitelj",
-    "Proxy Protocol": "Protokol",
-    "Proxy Server": "Proxy poslužitelj",
-    "Proxy server has authentication": "Proxy poslužitelj ima autentikaciju",
-    User: "Korisnik",
-    Installed: "Instalirano",
-    "Not installed": "Nije instalirano",
-    Running: "Pokrenuto",
-    "Not running": "Nije pokrenuto",
-    "Remove Token": "Ukloni Token",
-    Start: "Pokreni",
-    Stop: "Zaustavi",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Dodaj novu statusnu stranicu",
-    Slug: "Slug",
-    "Accept characters:": "Dozvoljeni znakovi:",
-    startOrEndWithOnly: "Započinje ili završava znakovima {0}",
-    "No consecutive dashes": "Bez uzastopnih povlaka",
-    Next: "Sljedeće",
-    "The slug is already taken. Please choose another slug.": "Slug je zauzet. Odaberite novi slug.",
-    "No Proxy": "Bez proxy poslužitelja",
-    Authentication: "Autentikacija",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "Dodaj statusnu stranicu",
-    "Page Not Found": "Stranica nije pronađena",
-    "Reverse Proxy": "Reverzni proxy",
-    Backup: "Sigurnosno kopiranje",
-    About: "O Uptime Kumi",
-    wayToGetCloudflaredURL: "(Preuzmite cloudflared s {0})",
-    cloudflareWebsite: "Cloudflare web stranice",
-    "Message:": "Poruka:",
-    "Don't know how to get the token? Please read the guide:": "Ne znate kako doći do tokena? Pročitajte vodič:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Trenutna veza možda bude prekinuta jer se koristi Cloudflare tuneliranje. Sigurno želite zaustaviti? Unesite lozinku za potvrdu.",
-    "HTTP Headers": "HTTP zaglavlja",
-    "Trust Proxy": "Vjeruj proxy poslužitelju",
-    "Other Software": "Ostali programi",
-    "For example: nginx, Apache and Traefik.": "Primjerice: nginx, Apache ili Traefik.",
-    "Please read": "Molimo pročitajte",
-    "Subject:": "Predmet:",
-    "Valid To:": "Valjano do:",
-    "Days Remaining:": "Preostalo dana:",
-    "Issuer:": "Izdavatelj:",
-    "Fingerprint:": "Fingerprint:",
-    "No status pages": "Nema statusnih stranica",
-    "Domain Name Expiry Notification": "Obavijest za istek domena",
-    Proxy: "Proxy",
-    "Date Created": "Datum stvaranja",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP adresa",
-    onebotMessageType: "OneBot tip poruke",
-    onebotGroupMessage: "Grupna",
-    onebotPrivateMessage: "Privatna",
-    onebotUserOrGroupId: "ID korisnika/grupe",
-    onebotSafetyTips: "Pristupni token mora biti postavljen",
-    "PushDeer Key": "PushDeer ključ",
-    "Footer Text": "Tekst podnožja",
-    "Show Powered By": "Pokaži natpis 'Pokreće...'",
-    "Domain Names": "Domene",
-    signedInDisp: "Prijavljeni ste kao {0}",
-    signedInDispDisabled: "Autentikacija onemogućena.",
-    RadiusSecret: "Radius Tajna",
-    RadiusSecretDescription: "Dijeljena Tajna između klijenta i poslužitelja",
-    RadiusCalledStationId: "Called Station ID",
-    RadiusCalledStationIdDescription: "Identifikator pozivne stanice",
-    RadiusCallingStationId: "Calling Station ID",
-    RadiusCallingStationIdDescription: "Identifikator pozivajuće stanice",
-    "Certificate Expiry Notification": "Obavijest za istek certifikata",
-    "API Username": "API korisničko ime",
-    "API Key": "API ključ",
-    "Recipient Number": "Broj primatelja",
-    "From Name/Number": "Naziv/broj pošiljatelja",
-    "Leave blank to use a shared sender number.": "Ostaviti prazno za korištenje dijeljenog broja pošiljatelja.",
-    "Octopush API Version": "Octopush verzija API-ja",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "krajnja točka (endpoint)",
-    octopushAPIKey: "\"API ključ\" iz HTTP API postavki",
-    octopushLogin: "\"Korisničko ime\" iz HTTP API postavki",
-    promosmsLogin: "API korisničko ime",
-    promosmsPassword: "API lozinka",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Tajni API ključ",
-    pushyToken: "Token uređaja",
-    "Show update if available": "Pokaži moguću nadogradnju",
-    "Also check beta release": "Provjeravaj i za beta izdanja",
-    "Using a Reverse Proxy?": "Koristi li se reverzni proxy?",
-    "Check how to config it for WebSocket": "Provjerite kako se konfigurira za WebSocket protokol",
-    "Steam Game Server": "Steam poslužitelj igre",
-    "Most likely causes:": "Najvjerojatniji uzroci:",
-    "The resource is no longer available.": "Resurs više nije dostupan.",
-    "There might be a typing error in the address.": "Možda je nastala greška pri upisu adrese.",
-    "What you can try:": "Što možete pokušati:",
-    "Retype the address.": "Ponovno napišite adresu.",
-    "Go back to the previous page.": "Vratite se na prethodnu stranicu.",
-    "Coming Soon": "Dolazi uskoro",
-    wayToGetClickSendSMSToken: "Možete dobiti API korisničko ime i API ključ sa {0}.",
-    "Connection String": "Tekst veze",
-    Query: "Upit",
-    settingsCertificateExpiry: "TLS istek certifikata",
-    certificationExpiryDescription: "HTTPS monitori će obavijesiti kada je istek TLS certifikata za:",
-    "Setup Docker Host": "Dodaj Docker domaćina",
-    "Connection Type": "Tip veze",
-    "Docker Daemon": "Docker daemon",
-    deleteDockerHostMsg: "Sigurno želite izbrisati ovog Docker domaćina za sve monitore?",
-    socket: "Docker socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker kontejner",
-    "Container Name / ID": "Naziv / ID kontejnera",
-    "Docker Host": "Docker domaćin",
-    "Docker Hosts": "Docker domaćini",
-    "ntfy Topic": "ntfy tema",
-    Domain: "Domena",
-    Workstation: "Radna stanica",
-    disableCloudflaredNoAuthMsg: "Lozinka nije nužna dok je isključena autentikacija.",
-    trustProxyDescription: "Vjeruj 'X-Forwarded-*' zaglavljima. Ako želite dobiti ispravnu IP adresu klijenta i Uptime Kuma je iza reverznog proxy poslužitelja, trebate omogućiti ovo.",
-    wayToGetLineNotifyToken: "Možete dobiti pristupni token sa {0}",
-    Examples: "Primjeri",
-    "Home Assistant URL": "URL Home Assistanta",
-    "Long-Lived Access Token": "Dugotrajni pristupni token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Dugotrajni pristupni token može se kreirati klikom na korisničko ime (dolje lijevo) u Home Assistantu, pomicanjem do dna, te klikom na 'Create Token'. ",
-    "Notification Service": "Notification Service",
-    "default: notify all devices": "zadano ponašanje: obavijesti sve uređaje",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Popis servisa za obavijesti u Home Assistantu nalaze se pod \"Developer Tools > Services\" te pretražiti \"notification\".",
-    "Automations can optionally be triggered in Home Assistant:": "Automacije se mogu okinuti u Home Assistantu:",
-    "Trigger type:": "Tip triggera:",
-    "Event type:": "Tip eventa:",
-    "Event data:": "Podaci eventa:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Potrebno je i odabrati akciju za izvođenje na Home Assistantu.",
-    "Frontend Version": "Inačica sučelja",
-    "Frontend Version do not match backend version!": "Inačica sučelja ne odgovara poslužitelju!",
-};
diff --git a/src/languages/hu.js b/src/languages/hu.js
deleted file mode 100644
index e6118c9e..00000000
--- a/src/languages/hu.js
+++ /dev/null
@@ -1,376 +0,0 @@
-export default {
-    languageName: "Magyar",
-    checkEverySecond: "Ellenőrzés {0} másodpercenként",
-    retryCheckEverySecond: "Újrapróbál {0} másodpercenként.",
-    retriesDescription: "Maximális próbálkozás mielőtt a szolgáltatás 'Leállt' jelölést kap és értesítés kerül kiküldésre",
-    ignoreTLSError: "TLS/SSL hibák figyelmen kívül hagyása HTTPS weboldalaknál",
-    upsideDownModeDescription: "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.",
-    maxRedirectDescription: "Az átirányítások maximális száma. állítsa 0-ra az átirányítás tiltásához.",
-    acceptedStatusCodesDescription: "Válassza ki az állapot kódokat amelyek sikeres válasznak fognak számítani.",
-    passwordNotMatchMsg: "A megismételt jelszó nem egyezik.",
-    notificationDescription: "Kérem, rendeljen egy értesítést a figyeléshez, hogy működjön.",
-    keywordDescription: "Kulcsszó keresése a HTML-ben vagy a JSON válaszban. (kis-nagybetű érzékeny)",
-    pauseDashboardHome: "Szünetel",
-    deleteMonitorMsg: "Biztos, hogy törölni akarja ezt a figyelőt?",
-    deleteNotificationMsg: "Biztos, hogy törölni akarja ezt az értesítést az összes figyelőnél?",
-    resolverserverDescription: "A Cloudflare az alapértelmezett szerver, bármikor meg tudja változtatni a resolver server-t.",
-    rrtypeDescription: "Válassza ki az RR-típust a figyelőhöz",
-    pauseMonitorMsg: "Biztos, hogy szüneteltetni akarja?",
-    enableDefaultNotificationDescription: "Minden új figyelőhöz ez az értesítés engedélyezett lesz alapértelmezetten. Kikapcsolhatja az értesítést külön minden figyelőnél.",
-    clearEventsMsg: "Biztos, hogy törölni akar miden eseményt ennél a figyelnél?",
-    clearHeartbeatsMsg: "Biztos, hogy törölni akar minden életjelet ennél a figyelőnél?",
-    confirmClearStatisticsMsg: "Biztos, hogy törölni akar MINDEN statisztikát?",
-    importHandleDescription: "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.",
-    confirmImportMsg: "Biztos, hogy importálja a mentést? Győződjön meg róla, hogy jól választotta ki az importálás opciót.",
-    twoFAVerifyLabel: "Kérem, adja meg a token-t, hogy a 2FA működését ellenőrizzük",
-    tokenValidSettingsMsg: "A token érvényes! El tudja menteni a 2FA beállításait.",
-    confirmEnableTwoFAMsg: "Biztosan engedélyezi a 2FA-t?",
-    confirmDisableTwoFAMsg: "Biztosan letiltja a 2FA-t?",
-    Settings: "Beállítások",
-    Dashboard: "Irányítópult",
-    "New Update": "Új frissítés",
-    Language: "Nyelv",
-    Appearance: "Megjelenés",
-    Theme: "Téma",
-    General: "Általános",
-    Version: "Verzió",
-    "Check Update On GitHub": "Frissítések keresése a GitHub-on",
-    List: "Lista",
-    Add: "Hozzáadás",
-    "Add New Monitor": "Új figyelő hozzáadása",
-    "Quick Stats": "Gyors statisztikák",
-    Up: "Működik",
-    Down: "Leállt",
-    Pending: "Függőben",
-    Unknown: "Ismeretlen",
-    Pause: "Szünet",
-    Name: "Név",
-    Status: "Állapot",
-    DateTime: "Időpont",
-    Message: "Üzenet",
-    "No important events": "Nincs fontos esemény",
-    Resume: "Folytatás",
-    Edit: "Szerkesztés",
-    Delete: "Törlés",
-    Current: "Aktuális",
-    Uptime: "Uptime",
-    "Cert Exp.": "SSL lejárat",
-    day: "nap",
-    "-day": " nap",
-    hour: "óra",
-    "-hour": " óra",
-    Response: "Válasz",
-    Ping: "Ping",
-    "Monitor Type": "Figyelő típusa",
-    Keyword: "Kulcsszó",
-    "Friendly Name": "Rövid név",
-    URL: "URL",
-    Hostname: "Hosztnév",
-    Port: "Port",
-    "Heartbeat Interval": "Életjel időköz",
-    Retries: "Újrapróbálkozás",
-    "Heartbeat Retry Interval": "Életjel újrapróbálkozások időköze",
-    Advanced: "Haladó",
-    "Upside Down Mode": "Fordított mód",
-    "Max. Redirects": "Max. átirányítás",
-    "Accepted Status Codes": "Elfogadott állapot kódok",
-    Save: "Mentés",
-    Notifications: "Értesítések",
-    "Not available, please setup.": "Nem elérhető, állítsa be.",
-    "Setup Notification": "Értesítés beállítása",
-    Light: "Világos",
-    Dark: "Sötét",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Téma - Életjel sáv",
-    Normal: "Normál",
-    Bottom: "Nyomógomb",
-    None: "Nincs",
-    Timezone: "Időzóna",
-    "Search Engine Visibility": "Látható a keresőmotoroknak",
-    "Allow indexing": "Indexelés engedélyezése",
-    "Discourage search engines from indexing site": "Keresőmotorok elriasztása az oldal indexelésétől",
-    "Change Password": "Jelszó változtatása",
-    "Current Password": "Jelenlegi jelszó",
-    "New Password": "Új jelszó",
-    "Repeat New Password": "Ismételje meg az új jelszót",
-    "Update Password": "Jelszó módosítása",
-    "Disable Auth": "Hitelesítés tiltása",
-    "Enable Auth": "Hitelesítés engedélyezése",
-    "disableauth.message1": "Biztos benne, hogy <strong>kikapcsolja a hitelesítést</strong>?",
-    "disableauth.message2": "Akkor érdemes, ha <strong>van 3rd-party hitelesítés</strong> az Uptime Kuma-t megelőzően mint a Cloudflare Access.",
-    "Please use this option carefully!": "Használja megfontoltan!",
-    Logout: "Kijelentkezés",
-    Leave: "Elhagy",
-    "I understand, please disable": "Megértettem, kérem tiltsa le",
-    Confirm: "Megerősítés",
-    Yes: "Igen",
-    No: "Nem",
-    Username: "Felhasználónév",
-    Password: "Jelszó",
-    "Remember me": "Emlékezzen rám",
-    Login: "Bejelentkezés",
-    "No Monitors, please": "Nincs figyelő, kérem",
-    "add one": "adjon hozzá egyet",
-    "Notification Type": "Értesítés típusa",
-    Email: "Email",
-    Test: "Teszt",
-    "Certificate Info": "Tanúsítvány információk",
-    "Resolver Server": "DNS szerver",
-    "Resource Record Type": "Resource Record típusa",
-    "Last Result": "Utolsó eredmény",
-    "Create your admin account": "Hozza létre az adminisztrátor felhasználót",
-    "Repeat Password": "Jelszó ismétlése",
-    "Import Backup": "Mentés importálása",
-    "Export Backup": "Mentés exportálása",
-    Export: "Exportálás",
-    Import: "Importálás",
-    respTime: "Válaszidő (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Alapértelmezetten engedélyezett",
-    "Apply on all existing monitors": "Alkalmazza az összes figyelőre",
-    Create: "Létrehozás",
-    "Clear Data": "Adatok törlése",
-    Events: "Események",
-    Heartbeats: "Életjelek",
-    "Auto Get": "Auto lekérd.",
-    backupDescription: "Mentheti az összes figyelőt és értesítést egy JSON fájlba.",
-    backupDescription2: "Megj: Történeti és esemény adatokat nem tartalmaz.",
-    backupDescription3: "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyeljen erre!",
-    alertNoFile: "Válaszzon ki egy fájlt az importáláshoz.",
-    alertWrongFileType: "Válasszon egy JSON fájlt.",
-    "Clear all statistics": "Összes statisztika törlése",
-    "Skip existing": "Meglévő kihagyása",
-    Overwrite: "Felülírás",
-    Options: "Opciók",
-    "Keep both": "Mindegyiket tartsa meg",
-    "Verify Token": "Token ellenőrzése",
-    "Setup 2FA": "2FA beállítása",
-    "Enable 2FA": "2FA engedélyezése",
-    "Disable 2FA": "2FA tiltása",
-    "2FA Settings": "2FA beállítások",
-    "Two Factor Authentication": "Kétfaktoros hitelesítés",
-    Active: "Aktív",
-    Inactive: "Inaktív",
-    Token: "Token",
-    "Show URI": "URI megmutatása",
-    Tags: "Címkék",
-    "Add New below or Select...": "Adjon hozzá lentre vagy válasszon...",
-    "Tag with this name already exist.": "Ilyen nevű címke már létezik.",
-    "Tag with this value already exist.": "Ilyen értékű címke már létezik.",
-    color: "szín",
-    "value (optional)": "érték (opcionális)",
-    Gray: "Szürke",
-    Red: "Piros",
-    Orange: "Narancs",
-    Green: "Zöld",
-    Blue: "Kék",
-    Indigo: "Indigó",
-    Purple: "Lila",
-    Pink: "Rózsaszín",
-    "Search...": "Keres...",
-    "Avg. Ping": "Átl. ping",
-    "Avg. Response": "Átl. válasz",
-    "Entry Page": "Nyitólap",
-    statusPageNothing: "Semmi nincs itt. Adjon hozzá egy vagy több figyelőt.",
-    "No Services": "Nincs szolgáltatás",
-    "All Systems Operational": "Minden rendszer működik",
-    "Partially Degraded Service": "Részlegesen leállt szolgáltatás",
-    "Degraded Service": "Leállt szolgáltatás",
-    "Add Group": "Csoport hozzáadása",
-    "Add a monitor": "Figyelő hozzáadása",
-    "Edit Status Page": "Státusz oldal szerkesztése",
-    "Go to Dashboard": "Irányítópulthoz",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (50+ értesítési szolgáltatás)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Status Page": "Státusz oldal",
-    "Status Pages": "Státusz oldalak",
-    "Primary Base URL": "Elsődleges URL",
-    "Push URL": "Meghívandó URL",
-    needPushEvery: "Ezt az URL-t kell meghívni minden {0} másodpercben.",
-    pushOptionalParams: "Opcionális paraméterek: {0}",
-    defaultNotificationName: "{notification} értesítésem ({number})",
-    here: "itt",
-    Required: "Kötelező",
-    "Bot Token": "BOT token",
-    wayToGetTelegramToken: "Innen kaphat token-t: {0}.",
-    "Chat ID": "Csevegés ID",
-    supportTelegramChatID: "Támogatja a közvetlen csevegést, csoportnak küldést és csatona ID-t is",
-    wayToGetTelegramChatID: "A csevegés ID-t kinyerheti azzal, hogy küld egy üzenetet a bot-nak és erre az URL-re ellátogat, ahol láthatja a chat_id:-t",
-    "YOUR BOT TOKEN HERE": "AZ ÖN BOT TOKENJE ITT",
-    chatIDNotFound: "Csevegés ID nem található, küldjön egy első üzenetet a bot-nak",
-    "Post URL": "Cél URL (Post)",
-    "Content Type": "Tartalom típus (Content Type)",
-    webhookJsonDesc: "{0} ideális a moderh HTTP szerverekhez, mint az Express.js",
-    webhookFormDataDesc: "{multipart} ideális a PHP-hez. A JSON értelmezhető ezzel: {decodeFunction}",
-    secureOptionNone: "Nincs / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS hiba figyelmen kívül hagyása",
-    "From Email": "Feladó email",
-    emailCustomSubject: "Egyedi tárgy",
-    "To Email": "Cél email",
-    smtpCC: "Másolat",
-    smtpBCC: "Titkos másolat",
-    "Discord Webhook URL": "Discord cím (webhook URL)",
-    wayToGetDiscordURL: "Kaphat egy ilyet, ha ellátogat a Server Settings -> Integrations -> Create Webhook oldalra",
-    "Bot Display Name": "Bot megjelenő neve",
-    "Prefix Custom Message": "Egyedi előtét üzenet",
-    "Hello @everyone is...": "Hello {'@'}mindenki...",
-    "Webhook URL": "Cím (webhook URL)",
-    wayToGetTeamsURL: "Itt megnézheti, hogy kell ilyen URL-t készíteni: {0}.",
-    Number: "Szám",
-    Recipients: "Címzettek",
-    needSignalAPI: "Egy Signal kliensre van szüksége, amihez REST API tartozik.",
-    wayToCheckSignalURL: "Itt megnézheti, hogy hozhat létre egyet:",
-    signalImportant: "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél.",
-    "Application Token": "Alkalmazás token",
-    "Server URL": "Szerver URL",
-    Priority: "Prioritás",
-    "Icon Emoji": "Emoji ikonok",
-    "Channel Name": "Csatorna neve",
-    "Uptime Kuma URL": "Uptime Kuma cím",
-    aboutWebhooks: "Webhook-okról több info: {0}",
-    aboutChannelName: "Adja meg a {0} csatorna nevét ha szeretné elkerülni a webhook-ot. Pl: #masik-csatorna",
-    aboutKumaURL: "Ha üresen hagyja a Uptime Kuma cím mezőt, akkor a projekt GitHub oldala lesz az alapértelmezett.",
-    emojiCheatSheet: "Emoji csalás: {0}",
-    clicksendsms: "ClickSend SMS",
-    "User Key": "Felhasználói kulcs",
-    Device: "Eszköz",
-    "Message Title": "Üzenet címe",
-    "Notification Sound": "Értesítési hang",
-    "More info on:": "További információ: {0}",
-    pushoverDesc1: "A vészhelyzeti prioritásnak (2) 30 másodperc az újrapróbálkozási alapértéke és egy óra után lejár.",
-    pushoverDesc2: "Ha különböző eszközökre szeretne értesítést küldeni, töltse ki az Eszköz mezőt.",
-    "SMS Type": "SMS típusa",
-    octopushTypePremium: "Premium (Fast - recommended for alerting)",
-    octopushTypeLowCost: "Low Cost (Slow - sometimes blocked by operator)",
-    checkPrice: "Nézze meg az {0} féle árat:",
-    apiCredentials: "API kulcsok",
-    octopushLegacyHint: "Az Octopush régi (2011-2020) verzióját használja vagy az újat?",
-    "Check octopush prices": "Nézze meg az Octopush {0} féle árát.",
-    octopushPhoneNumber: "Telefonszám (nemz. formátum, pl : +36705554433) ",
-    octopushSMSSender: "SMS küldő neve : 3-11 betű/szám (a-zA-Z0-9) vagy szóköz",
-    "LunaSea Device ID": "LunaSea eszköz ID",
-    "Apprise URL": "Apprise cím (URL)",
-    "Example:": "Például: {0}",
-    "Read more:": "Itt olvashat róla: {0}",
-    "Status:": "Állapot: {0}",
-    "Read more": "Tovább olvasom",
-    appriseInstalled: "Apprise telepítve.",
-    appriseNotInstalled: "Apprise nincs telepítve. {0}",
-    "Access Token": "Elérési token",
-    "Channel access token": "Csatorna elérési token",
-    "Line Developers Console": "Line Developers konzol",
-    lineDevConsoleTo: "Line Developers konzol - {0}",
-    "Basic Settings": "Alap beállítások",
-    "User ID": "Felhasználó ID",
-    "Messaging API": "Üzenet API",
-    wayToGetLineChannelToken: "{0} első eléréséhez készítsen egy Provider-t és csatornát (Messaging API), utána kaphatja meg a csatorna elérési token-t és felhasználó ID-t az alábbi menüpontban.",
-    "Icon URL": "Ikon cím (URL)",
-    aboutIconURL: "Megadhat egy webcímet az Ikon cím mezőben, ezzel felülírva az alapértelmezet képet. Nem kerül felhasználásra, ha az Emoji-k be vannak állítva.",
-    aboutMattermostChannelName: "Felülírhatja az alapértelmezett csatornát, ahova a webhook az adatokat küldi. Ehhez töltse ki a \"Csatorna neve\" mezőt (pl: #egyeb-csatorna). A Mattermost webhook beállításaiban további engedélyek szükségesek",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - olcsó, de lassú, gyakran túlterhelt. Csak lengyel címzettekhez.",
-    promosmsTypeFlash: "SMS FLASH - Az üzenet automatikusan megjelenik a fogadó eszközön. Csak lengyel címzettekhez.",
-    promosmsTypeFull: "SMS FULL - Prémium szintje az SMS-nek. Megadható a feladó neve, de előtte jóváhagyás szükséges. Ideális értesítésekhez.",
-    promosmsTypeSpeed: "SMS SPEED - A legmagasabb prioritás a rendszerben. Nagyon gyors és pontos, de költséges (kb. duplája a hagyományos SMS-nek).",
-    promosmsPhoneNumber: "Telefonszám (lengyel címzett esetén az országkód elhagyható)",
-    promosmsSMSSender: "SMS feladónév: Előre beállított név vagy az alábbiak egyike: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu webhook cím (URL)",
-    matrixHomeserverURL: "Homeserver cím (URL http(s):// előtaggal és opcionálisan port-tal)",
-    "Internal Room Id": "Belső Szoba ID",
-    matrixDesc1: "A belső szoba ID-t a szpbák speciális beállítások között találja meg a Matrix kliens programban. Így kell kinéznie: !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Erősen ajánlott készíteni egy új felhasználót és nem a teljes joggal rendelkező felhasználót használni. Az új felhasználó létrehozása után csak azokba a szobákba kell megjhívni a felhasználót, ahol értesítéseket szeretne kapni. Ezzel a művelettel lehet elérési token-t kérni: {0}",
-    Method: "Metódus",
-    Body: "Törzs",
-    Headers: "Fejlécek",
-    PushUrl: "Push cím (URL)",
-    HeadersInvalidFormat: "A kérés fejléc nem egy valós JSON: ",
-    BodyInvalidFormat: "A kérés törzse nem egy valós JSON: ",
-    "Monitor History": "Vizsgálatok előzményei",
-    clearDataOlderThan: "Előzmények megtartása {0} napig.",
-    PasswordsDoNotMatch: "Jelszó nem egyezik.",
-    records: "sorok",
-    "One record": "Egy sor",
-    steamApiKeyDescription: "Steam Game Server ellenőrzéséhez szükséges egy Steam Web-API kulcs. Itt létrehozhat egy API kulcsot: ",
-    "Current User": "Felhasználó",
-    recent: "Legújabb",
-    Done: "Kész",
-    Info: "Infó",
-    Security: "Biztonság",
-    "Steam API Key": "Steam API kulcs",
-    "Shrink Database": "Adatbázis tömörítése",
-    "Pick a RR-Type...": "Válasszon egy RR-típust...",
-    "Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít...",
-    Default: "Alapért.",
-    "HTTP Options": "HTTP beállítások",
-    "Create Incident": "Incidens létrehozása",
-    Title: "Cím",
-    Content: "Tartalom",
-    Style: "Stílus",
-    info: "info",
-    warning: "warning",
-    danger: "danger",
-    primary: "primary",
-    light: "light",
-    dark: "dark",
-    Post: "Bejegyzés",
-    "Please input title and content": "Adjon meg címet és tartalmat",
-    Created: "Létrehozva",
-    "Last Updated": "Utolsó mód.",
-    Unpin: "Leválaszt",
-    "Switch to Light Theme": "Világos témára váltás",
-    "Switch to Dark Theme": "Sötét témára váltás",
-    "Show Tags": "Címkék mutatása",
-    "Hide Tags": "Címkék elrejtése",
-    Description: "Leírás",
-    "No monitors available.": "Nincs még figyelő beállítva.",
-    "Add one": "Adjon hozzá egyet",
-    "No Monitors": "Nincs figyelő",
-    "Untitled Group": "Névtelen csoport",
-    Services: "Szolgáltatások",
-    Discard: "Elvet",
-    Cancel: "Mégsem",
-    "Powered by": "A megoldást szállítja az",
-    shrinkDatabaseDescription: "VACUUM futtatása az SQLite-on. Ha az adatbázisod 1.10.0-nál újabb, akkor az AUTO_VACUUM engedélyezve van, nincs szükség a műveletre.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API felhasználónév (webapi_ előtaggal együtt)",
-    serwersmsAPIPassword: "API jelszó",
-    serwersmsPhoneNumber: "Telefonszám",
-    serwersmsSenderName: "SMS feladó neve (regisztrált név az oldalon)",
-    GoogleChat: "Google Chat (csak Google Workspace)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM beállítások",
-    smtpDkimDesc: "Nézze meg a Nodemailer DKIM {0} használati szabályokat.",
-    documentation: "dokumentáció",
-    smtpDkimDomain: "Domain név",
-    smtpDkimKeySelector: "Kulcs választó",
-    smtpDkimPrivateKey: "Privát kulcs",
-    smtpDkimHashAlgo: "Hash algoritmus (nem kötelező)",
-    smtpDkimheaderFieldNames: "Fejléc kulcsok a bejelentkezéshez (nem kötelező)",
-    smtpDkimskipFields: "Fejléc kulcsok egyéb esetben (nem kötelező)",
-    PushByTechulus: "Techulus push",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API végpont",
-    alertaEnvironment: "Környezet",
-    alertaApiKey: "API kulcs",
-    alertaAlertState: "Figyelmeztetési állapot",
-    alertaRecoverState: "Visszaállási állapot",
-    deleteStatusPageMsg: "Biztos, hogy törölni akarja a státusz oldalt?",
-};
diff --git a/src/languages/id-ID.js b/src/languages/id-ID.js
deleted file mode 100644
index 3a716392..00000000
--- a/src/languages/id-ID.js
+++ /dev/null
@@ -1,585 +0,0 @@
-export default {
-    languageName: "Bahasa Indonesia (Indonesian)",
-    checkEverySecond: "Cek Setiap {0} detik.",
-    retryCheckEverySecond: "Coba lagi setiap {0} detik.",
-    resendEveryXTimes: "Kirim ulang setiap {0} kali",
-    resendDisabled: "Kirim ulang dinonaktifkan",
-    retriesDescription: "Percobaan ulang maksimum sebelum layanan dinyatakan tidak aktif dan notifikasi dikirim",
-    ignoreTLSError: "Abaikan kesalahan TLS/SSL untuk situs web HTTPS",
-    upsideDownModeDescription: "Balikkan statusnya. Jika layanan dapat dijangkau, TIDAK AKTIF.",
-    maxRedirectDescription: "Jumlah maksimum pengalihan untuk diikuti. Setel ke 0 untuk menonaktifkan pengalihan.",
-    acceptedStatusCodesDescription: "Pilih kode status yang dianggap sebagai tanggapan yang berhasil.",
-    passwordNotMatchMsg: "Kata sandi kedua tidak cocok.",
-    notificationDescription: "Harap atur notifikasi ke monitor agar berfungsi.",
-    keywordDescription: "Cari kata kunci dalam code html atau JSON huruf besar-kecil berpengaruh",
-    pauseDashboardHome: "Jeda",
-    deleteMonitorMsg: "Apakah Anda mau menghapus monitor ini?",
-    deleteNotificationMsg: "Apakah Anda mau menghapus notifikasi untuk semua monitor?",
-    dnsPortDescription: "Port server DNS. Bawaan menggunakan 53. Anda dapat mengubah port kapan saja.",
-    resolverserverDescription: "Cloudflare adalah server bawaan, Anda dapat mengubah server resolver kapan saja.",
-    rrtypeDescription: "Pilih RR-Type yang mau Anda monitor",
-    pauseMonitorMsg: "Apakah Anda yakin mau menjeda?",
-    enableDefaultNotificationDescription: "Untuk setiap monitor baru, notifikasi ini akan diaktifkan secara bawaan. Anda masih dapat menonaktifkan notifikasi secara terpisah untuk setiap monitor.",
-    clearEventsMsg: "Apakah Anda yakin mau menghapus semua event di monitor ini?",
-    clearHeartbeatsMsg: "Apakah Anda yakin mau menghapus semua heartbeats di monitor ini?",
-    confirmClearStatisticsMsg: "Apakah Anda yakin mau menghapus semua statistik?",
-    importHandleDescription: "Pilih 'Lewati yang ada' jika Anda ingin melewati setiap monitor atau notifikasi dengan nama yang sama. 'Timpa' akan menghapus setiap monitor dan notifikasi yang ada.",
-    confirmImportMsg: "Apakah Anda yakin untuk mengimpor cadangan? Pastikan Anda telah memilih opsi impor yang tepat.",
-    twoFAVerifyLabel: "Silakan ketik token Anda untuk memverifikasi bahwa 2FA berfungsi",
-    tokenValidSettingsMsg: "Token benar! Anda sekarang dapat menyimpan pengaturan 2FA.",
-    confirmEnableTwoFAMsg: "Apakah Anda yakin ingin mengaktifkan 2FA?",
-    confirmDisableTwoFAMsg: "Apakah Anda yakin ingin menonaktifkan 2FA?",
-    Settings: "Pengaturan",
-    Dashboard: "Dasbor",
-    "New Update": "Pembaruan Baru",
-    Language: "Bahasa",
-    Appearance: "Tampilan",
-    Theme: "Tema",
-    General: "Umum",
-    "Primary Base URL": "URL Dasar Utama",
-    Version: "Versi",
-    "Check Update On GitHub": "Cek Pembaruan di GitHub",
-    List: "Daftar",
-    Add: "Tambah",
-    "Add New Monitor": "Tambah Monitor Baru",
-    "Quick Stats": "Statistik",
-    Up: "Aktif",
-    Down: "Tidak Aktif",
-    Pending: "Tertunda",
-    Unknown: "Tidak diketahui",
-    Pause: "Jeda",
-    Name: "Nama",
-    Status: "Status",
-    DateTime: "Tanggal Waktu",
-    Message: "Pesan",
-    "No important events": "Tidak ada peristiwa penting",
-    Resume: "Lanjut",
-    Edit: "Ubah",
-    Delete: "Hapus",
-    Current: "Saat ini",
-    Uptime: "Waktu aktif",
-    "Cert Exp.": "Batas kedaluwarsa SSL",
-    day: "hari | hari-hari",
-    "-day": "-hari",
-    hour: "Jam",
-    "-hour": "-Jam",
-    Response: "Tanggapan",
-    Ping: "Ping",
-    "Monitor Type": "Tipe Monitor",
-    Keyword: "Kata Kunci",
-    "Friendly Name": "Nama yang Ramah",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Jarak Waktu Heartbeat ",
-    Retries: "Coba lagi",
-    "Heartbeat Retry Interval": "Jarak Waktu Heartbeat Mencoba kembali ",
-    "Resend Notification if Down X times consequently": "Kirim Ulang Notifikasi jika Tidak Aktif X kali",
-    Advanced: "Tingkat Lanjut",
-    "Upside Down Mode": "Mode Terbalik",
-    "Max. Redirects": "Maksimal Pengalihan",
-    "Accepted Status Codes": "Kode Status yang Diterima",
-    "Push URL": "Push URL",
-    needPushEvery: "Anda harus memanggil URL berikut setiap {0} detik..",
-    pushOptionalParams: "Parameter tambahan: {0}",
-    Save: "Simpan",
-    Notifications: "Notifikasi",
-    "Not available, please setup.": "Tidak tersedia, silakan atur.",
-    "Setup Notification": "Setel Notifikasi",
-    Light: "Terang",
-    Dark: "Gelap",
-    Auto: "Otomatis",
-    "Theme - Heartbeat Bar": "Tema - Heartbeat Bar",
-    Normal: "Normal",
-    Bottom: "Bawah",
-    None: "Tidak ada",
-    Timezone: "Zona Waktu",
-    "Search Engine Visibility": "Visibilitas Mesin Pencari",
-    "Allow indexing": "Mengizinkan untuk diindex",
-    "Discourage search engines from indexing site": "Mencegah mesin pencari untuk mengindex situs",
-    "Change Password": "Ganti Sandi",
-    "Current Password": "Sandi Lama",
-    "New Password": "Sandi Baru",
-    "Repeat New Password": "Ulangi Sandi Baru",
-    "Update Password": "Perbarui Kata Sandi",
-    "Disable Auth": "Nonaktifkan Autentikasi",
-    "Enable Auth": "Aktifkan Autentikasi",
-    "disableauth.message1": "Apakah Anda yakin ingin <strong>menonaktifkan autentikasi</strong>?",
-    "disableauth.message2": "Ini untuk <strong>mereka yang memiliki autentikasi pihak ketiga</strong> diletakkan di depan Uptime Kuma, misalnya akses Cloudflare.",
-    "Please use this option carefully!": "Gunakan dengan hati-hati.",
-    Logout: "Keluar",
-    Leave: "Pergi",
-    "I understand, please disable": "Saya mengerti, silakan dinonaktifkan",
-    Confirm: "Konfirmasi",
-    Yes: "Ya",
-    No: "Tidak",
-    Username: "Nama Pengguna",
-    Password: "Sandi",
-    "Remember me": "Ingat saya",
-    Login: "Masuk",
-    "No Monitors, please": "Tidak ada monitor, silakan",
-    "add one": "tambahkan satu",
-    "Notification Type": "Tipe Notifikasi",
-    Email: "Surel",
-    Test: "Tes",
-    "Certificate Info": "Info Sertifikasi",
-    "Resolver Server": "Resolver Server",
-    "Resource Record Type": "Resource Record Type",
-    "Last Result": "Hasil Terakhir",
-    "Create your admin account": "Buat akun admin Anda",
-    "Repeat Password": "Ulangi Sandi",
-    "Import Backup": "Impor Cadangan",
-    "Export Backup": "Ekspor Cadangan",
-    Export: "Ekspor",
-    Import: "Impor",
-    respTime: "Tanggapan. Waktu (milidetik)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Bawaan diaktifkan",
-    "Apply on all existing monitors": "Terapkan pada semua monitor yang ada",
-    Create: "Buat",
-    "Clear Data": "Bersihkan Data",
-    Events: "Peristiwa",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Ambil Otomatis",
-    backupDescription: "Anda dapat mencadangkan semua monitor dan semua notifikasi ke dalam berkas JSON.",
-    backupDescription2: "Catatan: Data sejarah dan peristiwa tidak disertakan.",
-    backupDescription3: "Data sensitif seperti notifikasi token disertakan dalam berkas ekspor, harap simpan dengan hati-hati.",
-    alertNoFile: "Silakan pilih berkas untuk diimpor.",
-    alertWrongFileType: "Silakan pilih berkas JSON.",
-    "Clear all statistics": "Hapus semua statistik",
-    "Skip existing": "Lewati yang ada",
-    Overwrite: "Timpa",
-    Options: "Opsi",
-    "Keep both": "Simpan keduanya",
-    "Verify Token": "Verifikasi Token",
-    "Setup 2FA": "Pengaturan 2FA",
-    "Enable 2FA": "Aktifkan 2FA",
-    "Disable 2FA": "Nonaktifkan 2FA",
-    "2FA Settings": "Pengaturan 2FA",
-    "Two Factor Authentication": "Autentikasi Dua Faktor",
-    Active: "Aktif",
-    Inactive: "Tidak Aktif",
-    Token: "Token",
-    "Show URI": "Lihat URI",
-    Tags: "Tanda",
-    "Add New below or Select...": "Tambahkan Baru di bawah atau Pilih...",
-    "Tag with this name already exist.": "Tanda dengan nama ini sudah ada.",
-    "Tag with this value already exist.": "Tanda dengan nilai ini sudah ada.",
-    color: "warna",
-    "value (optional)": "nilai (harus diisi)",
-    Gray: "Abu-abu",
-    Red: "Merah",
-    Orange: "Jingga",
-    Green: "Hijau",
-    Blue: "Biru",
-    Indigo: "Biru Tua",
-    Purple: "Ungu",
-    Pink: "Merah Muda",
-    "Search...": "Cari...",
-    "Avg. Ping": "Rata-rata Ping",
-    "Avg. Response": "Rata-rata Tanggapan",
-    "Entry Page": "Halaman Masuk",
-    statusPageNothing: "Tidak ada di sini, silakan tambahkan grup atau monitor.",
-    "No Services": "Tidak ada Layanan",
-    "All Systems Operational": "Semua Sistem Berfungsi",
-    "Partially Degraded Service": "Layanan Terdegradasi Sebagian",
-    "Degraded Service": "Layanan Terdegradasi",
-    "Add Group": "Tambah Grup",
-    "Add a monitor": "Tambah monitor",
-    "Edit Status Page": "Edit Halaman Status",
-    "Go to Dashboard": "Pergi ke Dasbor",
-    "Status Page": "Halaman Status",
-    "Status Pages": "Halaman Status",
-    defaultNotificationName: "{notification} saya Peringatan ({number})",
-    here: "di sini",
-    Required: "Wajib",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Anda dapat mendapatkan token dari {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Mendukung Obrolan Langsung / Grup / Channel Chat ID",
-    wayToGetTelegramChatID: "Anda bisa mendapatkan chat id Anda dengan mengirim pesan ke bot dan pergi ke url ini untuk melihat chat_id:",
-    "YOUR BOT TOKEN HERE": "BOT TOKEN ANDA DI SINI",
-    chatIDNotFound: "Chat ID tidak ditemukan, tolong kirim pesan ke bot ini dulu",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Tipe konten",
-    webhookJsonDesc: "{0} bagus untuk peladen http modern seperti express.js",
-    webhookFormDataDesc: "{multipart} bagus untuk PHP, Anda hanya perlu mengurai json dengan {decodeFunction}",
-    smtp: "Surel (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Abaikan Kesalahan TLS",
-    "From Email": "Dari Email",
-    emailCustomSubject: "Subjek",
-    "To Email": "Ke Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Anda bisa mendapatkan ini dengan pergi ke Server Pengaturan -> Integrasi -> Buat Webhook",
-    "Bot Display Name": "Nama Bot",
-    "Prefix Custom Message": "Awalan Pesan",
-    "Hello @everyone is...": "Halo {'@'}everyone is...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Anda dapat mempelajari cara membuat url webhook {0}.",
-    signal: "Sinyal",
-    Number: "Nomer",
-    Recipients: "Penerima",
-    needSignalAPI: "Anda harus memiliki klien sinyal dengan REST API.",
-    wayToCheckSignalURL: "Anda dapat memeriksa url ini untuk melihat cara menyiapkannya:",
-    signalImportant: "PENTING: Anda tidak dapat mencampur grup dan nomor di penerima!",
-    gotify: "Gotify",
-    "Application Token": "Token Aplikasi",
-    "Server URL": "URL Server",
-    Priority: "Prioritas",
-    slack: "Slack",
-    "Icon Emoji": "Ikon Emoji",
-    "Channel Name": "Nama Saluran",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Info lain tentang webhook: {0}",
-    aboutChannelName: "Masukan nama saluran di {0} Kolom Nama Saluran jika Anda ingin melewati saluran webhook. Contoh: #saluran-lain",
-    aboutKumaURL: "Jika Anda membiarkan bidang URL Uptime Kuma kosong, itu akan menjadi bawaan ke halaman Proyek Github.",
-    emojiCheatSheet: "Lembar contekan emoji: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Mendukung 50+ layanan notifikasi)",
-    GoogleChat: "Google Chat (hanya Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Kunci pengguna",
-    Device: "Perangkat",
-    "Message Title": "Judul Pesan",
-    "Notification Sound": "Suara Nofifikasi",
-    "More info on:": "Info lebih lanjut tentang: {0}",
-    pushoverDesc1: "Prioritas darurat (2) memiliki batas waktu bawaan 30 detik antara percobaan ulang dan akan kadaluwarsa setelah 1 jam.",
-    pushoverDesc2: "Jika Anda ingin mengirim pemberitahuan ke perangkat yang berbeda, isi kolom Perangkat.",
-    "SMS Type": "Tipe SMS",
-    octopushTypePremium: "Premium (Cepat - direkomendasikan untuk mengingatkan)",
-    octopushTypeLowCost: "Low Cost (Lambat, terkadang diblokir oleh operator)",
-    checkPrice: "Check {0} prices:",
-    apiCredentials: "Kredensial API",
-    octopushLegacyHint: "Apakah Anda menggunakan Octopush versi lama (2011-2020) atau versi baru?",
-    "Check octopush prices": "Cek harga octopush {0}.",
-    octopushPhoneNumber: "Nomer Telpon/HP (format internasional, contoh : +33612345678) ",
-    octopushSMSSender: "Nama Pengirim SMS : 3-11 karakter alfanumerik dan spasi (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Contoh: {0}",
-    "Read more:": "Baca lebih lanjut: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Baca lebih lanjut",
-    appriseInstalled: "Apprise diinstall.",
-    appriseNotInstalled: "Apprise tidak diinstall. {0}",
-    "Access Token": "Token Akses",
-    "Channel access token": "Token akses saluran",
-    "Line Developers Console": "Konsol Pengembang Line",
-    lineDevConsoleTo: "Konsol Pengembang Line - {0}",
-    "Basic Settings": "Pengaturan Dasar",
-    "User ID": "ID User",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Pertama akses {0}, buat penyedia dan saluran (Messaging API), lalu Anda bisa mendapatkan token akses saluran dan id pengguna dari item menu yang disebutkan di atas.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Anda dapat memberikan tautan ke gambar di \"Icon URL\" untuk mengganti gambar profil bawaan. Tidak akan digunakan jika Ikon Emoji diset.",
-    aboutMattermostChannelName: "Anda dapat mengganti saluran bawaan tujuan posting webhook dengan memasukkan nama saluran ke dalam Kolom \"Channel Name\". Ini perlu diaktifkan di pengaturan webhook Mattermost. contoh: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - murah tapi lambat dan sering kelebihan beban. Terbatas hanya untuk penerima Polandia.",
-    promosmsTypeFlash: "SMS FLASH - Pesan akan otomatis muncul di perangkat penerima. Terbatas hanya untuk penerima Polandia.",
-    promosmsTypeFull: "SMS FULL - SMS tingkat premium, Anda dapat menggunakan Nama Pengirim Anda (Anda harus mendaftarkan nama terlebih dahulu). Dapat diandalkan untuk peringatan.",
-    promosmsTypeSpeed: "SMS SPEED - Prioritas tertinggi dalam sistem. Sangat cepat dan dapat diandalkan tetapi mahal (sekitar dua kali lipat dari harga SMS FULL).",
-    promosmsPhoneNumber: "Nomor telepon (untuk penerima Polandia Anda dapat melewati kode area)",
-    promosmsSMSSender: "Nama Pengirim SMS : Nama pra-registrasi atau salah satu bawaan: InfoSMS, Info SMS, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookUrl",
-    matrixHomeserverURL: "Homeserver URL (dengan http(s):// dan port tambahan)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "Kamu dapat menemukan Internal Room ID dengan melihat di bagian konfigurasi ruang di Matrix. Seharusnya berbentuk seperti !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Sangat direkomendasikan kepada Anda untuk membuat akun baru dan jangan menggunakan token atas akun terkini yang memiliki token akses secara penuh terhadap akun dan seluruh ruang yang terdaftar. Alih - alih, buat akun baru dan undang akun tsb ke ruang tempat anda ingin menerima notifikasi. Untuk mendapatkan token akses anda dapat menjalankan {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Request Headers memiliki format JSON yang tidak sesuai: ",
-    BodyInvalidFormat: "Request Body memiliki format JSON yang tidak sesuai: ",
-    "Monitor History": "Riyawat Monitor",
-    clearDataOlderThan: "Simpan data riwayat monitoring selama {0} hari.",
-    PasswordsDoNotMatch: "Password tidak sama.",
-    records: "catatan",
-    "One record": "Satu catatan",
-    steamApiKeyDescription: "Untuk monitoring Steam Game Server Anda membutuhkan kunci Steam Web-API. Anda dapat mendaftarkan Kunci API Anda melalui: ",
-    "Current User": "Pengguna Saat Ini",
-    topic: "Topic",
-    topicExplanation: "MQTT topic untuk dimonitor",
-    successMessage: "Pesan Berhasil",
-    successMessageExplanation: "Pesan MQTT yang akan dianggap berhasil",
-    recent: "Baru saja",
-    Done: "Selesai",
-    Info: "Info",
-    Security: "Keamanan",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Shrink Database",
-    "Pick a RR-Type...": "Pilih RR-Type...",
-    "Pick Accepted Status Codes...": "Pilih Kode Status yang Diterima...",
-    Default: "Default",
-    "HTTP Options": "Opsi HTTP",
-    "Create Incident": "Buat Incident",
-    Title: "Judul",
-    Content: "Konten",
-    Style: "Gaya",
-    info: "info",
-    warning: "peringatan",
-    danger: "bahaya",
-    error: "kesalahan",
-    critical: "kritis",
-    primary: "utama",
-    light: "terang",
-    dark: "gelap",
-    Post: "Post",
-    "Please input title and content": "Masukkan judul dan konten",
-    Created: "Dibuat",
-    "Last Updated": "Terakhir Diperbarui",
-    Unpin: "Lepaskan Semat",
-    "Switch to Light Theme": "Ubah ke Tema Terang",
-    "Switch to Dark Theme": "Ubah ke Tema Gelap",
-    "Show Tags": "Tampilkan Tags",
-    "Hide Tags": "Sembunyikan Tags",
-    Description: "Deskripsi",
-    "No monitors available.": "Tidak ada monitor yang tersedia.",
-    "Add one": "Tambahkan",
-    "No Monitors": "Tidak ada monitor",
-    "Untitled Group": "Group Tanpa Judul",
-    Services: "Layanan",
-    Discard: "Buang",
-    Cancel: "Batal",
-    "Powered by": "Dipersembahkan oleh",
-    shrinkDatabaseDescription: "Trigger database VACUUM untuk SQLite. Jika database Anda dibuat setelah 1.10.0, AUTO_VACUUM sudah otomatis diaktifkan dan aksi berikut tidak dibutuhkan.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "Nama Pengguna API ( termamsuk awalan webapi_ )",
-    serwersmsAPIPassword: "Kata Sandi API",
-    serwersmsPhoneNumber: "Nomor Telepon",
-    serwersmsSenderName: "Nama Pengirim SMS (didaftarkan melalui portal pelanggan)",
-    stackfield: "Stackfield",
-    Customize: "Kustomisasi",
-    "Custom Footer": "Tambahan Footer",
-    "Custom CSS": "Tambahan CSS",
-    smtpDkimSettings: "Pengaturan DKIM",
-    smtpDkimDesc: "Silakan merujuk ke Nodemailer DKIM {0} untuk penggunaan.",
-    documentation: "dokumentasi",
-    smtpDkimDomain: "Nama Domain",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "Algoritma Hash (Opsional)",
-    smtpDkimheaderFieldNames: "Header Keys untuk ditambahkan (Optional)",
-    smtpDkimskipFields: "Header Keys not untuk ditambahkan (Optional)",
-    wayToGetPagerDutyKey: "Anda dapat menambahkan melalui Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Lalu Anda dapat menjadi dengan kata kunci \"Events API V2\". Informasi tambahan {0}",
-    "Integration Key": "Kunci Integrasi",
-    "Integration URL": "URL Integrasi",
-    "Auto resolve or acknowledged": "Penyelesaian otomatis atau diakui",
-    "do nothing": "tidak melakukan apapun",
-    "auto acknowledged": "otomatis diakui",
-    "auto resolve": "otomatis terselesaikan",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Lingkungan",
-    alertaApiKey: "Kunci API",
-    alertaAlertState: "Status Siaga",
-    alertaRecoverState: "Status Pemulihan",
-    deleteStatusPageMsg: "Apakah Anda yakin untuk menghapus halaman status berikut?",
-    Proxies: "Proxy",
-    default: "Bawaan",
-    enabled: "Diaktifkan",
-    setAsDefault: "Tetapkan sebagai bawaan",
-    deleteProxyMsg: "Apakah Anda yakin ingin menghapus proxy berikut untuk seluruh monitor?",
-    proxyDescription: "Proxy harus ditambahkan ke monitor agar berfungsi.",
-    enableProxyDescription: "Proxy berikut tidak akan berdampak ke monitor hingga diaktifkan. Anda dapat mengontrol menonaktifkan sementara proxy dari semua monitor dengan status aktivasi.",
-    setAsDefaultProxyDescription: "Proxy berikut akan diaktifkan sebagai bawaan untuk monitor baru. Anda masih dapat menonaktifkan proxy secara terpisah untuk setiap monitor.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Valid",
-    Invalid: "Tidak Valid",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "Nomor Telepon",
-    TemplateCode: "Kode Template",
-    SignName: "Nama Tanda",
-    "Sms template must contain parameters: ": "Template SMS harus berisi parameter: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Untuk keamaan Anda harus menggunakan kunci rahasia",
-    "Device Token": "Token Perangkat",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Tinggi",
-    Retry: "Ulang",
-    Topic: "Topik",
-    "WeCom Bot Key": "Kunci WeCom Bot",
-    "Setup Proxy": "Siapkan Proxy",
-    "Proxy Protocol": "Protokol Proxy",
-    "Proxy Server": "Server Proxy",
-    "Proxy server has authentication": "Server Proxy memiliki autentikasi",
-    User: "Pengguna",
-    Installed: "Terpasang",
-    "Not installed": "Tidak terpasang",
-    Running: "Berjalan",
-    "Not running": "Tidak berjalan",
-    "Remove Token": "Hapus Token",
-    Start: "Mulai",
-    Stop: "Berhenti",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Tambahkan Halaman Status Baru",
-    Slug: "Slug",
-    "Accept characters:": "Terima karakter:",
-    startOrEndWithOnly: "Mulai atau akhiri hanya dengan {0}",
-    "No consecutive dashes": "Tanda hubung tidak berurutan",
-    Next: "Selanjutnya",
-    "The slug is already taken. Please choose another slug.": "Slug telah digunakan. Silakan pilih slug lain.",
-    "No Proxy": "Tidak ada Proxy",
-    Authentication: "Autentikasi",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "Halaman Status Baru",
-    "Page Not Found": "Halaman Tidak Ditemukan",
-    "Reverse Proxy": "Proxy Terbalik",
-    Backup: "Cadangan",
-    About: "Tentang",
-    wayToGetCloudflaredURL: "(Unduh cloudflared dari {0})",
-    cloudflareWebsite: "Situs Cloudflare",
-    "Message:": "Pesan:",
-    "Don't know how to get the token? Please read the guide:": "Tidak tahu cara mendapatkan token? Silakan baca panduannya:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Koneksi saat ini mungkin hilang jika Anda saat ini terhubung melalui Cloudflare Tunel. Apakah Anda yakin ingin menghentikannya? Ketik kata sandi Anda saat ini untuk mengonfirmasinya.",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Proxy Terpercaya",
-    "Other Software": "Perangkat Lunak lainnya",
-    "For example: nginx, Apache and Traefik.": "Sebagai contoh: nginx, Apache and Traefik.",
-    "Please read": "Harap dibaca",
-    "Subject:": "Subjek:",
-    "Valid To:": "Berlaku Untuk:",
-    "Days Remaining:": "Hari Tersisa:",
-    "Issuer:": "Penerbit:",
-    "Fingerprint:": "Sidik jari:",
-    "No status pages": "Tidak ada halaman status",
-    "Domain Name Expiry Notification": "Pemberitahuan Kedaluwarsa Nama Domain",
-    Proxy: "Proxy",
-    "Date Created": "Tanggal Dibuat",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "Alamat HTTP OneBot",
-    onebotMessageType: "Jenis Pesan OneBot",
-    onebotGroupMessage: "Grup",
-    onebotPrivateMessage: "Pribadi",
-    onebotUserOrGroupId: "Grup/Pengguna ID",
-    onebotSafetyTips: "Untuk keamanan, harus mengatur token akses",
-    "PushDeer Key": "Kunci PushDeer",
-    "Footer Text": "Tulisan Footer",
-    "Show Powered By": "Tampilkan Dipersembahkan oleh",
-    "Domain Names": "Nama Domain",
-    signedInDisp: "Masuk sebagai {0}",
-    signedInDispDisabled: "Autentikasi dinonaktifkan.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "Shared Secret antara klien dan server",
-    RadiusCalledStationId: "Called Station Id",
-    RadiusCalledStationIdDescription: "Pengenal perangkat yang dipanggil",
-    RadiusCallingStationId: "Calling Station Id",
-    RadiusCallingStationIdDescription: "Pengenal perangkat panggilan",
-    "Certificate Expiry Notification": "Pemberitahuan Kedaluwarsa Sertifikat",
-    "API Username": "Nama Pengguna API",
-    "API Key": "Kunci API",
-    "Recipient Number": "Nomor Penerima",
-    "From Name/Number": "Dari Nama/Nomor",
-    "Leave blank to use a shared sender number.": "Biarkan kosong untuk menggunakan nomor pengirim bersama.",
-    "Octopush API Version": "Versi API Octopush",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" dari kredensial HTTP API di panel kontrol",
-    octopushLogin: "\"Login\" dari kredensial HTTP API di panel kontrol",
-    promosmsLogin: "Nama Masuk API",
-    promosmsPassword: "Kata Sandi API",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Device token",
-    "Show update if available": "Tampilkan pembaruan jika tersedia",
-    "Also check beta release": "Periksa juga rilis beta",
-    "Using a Reverse Proxy?": "Menggunakan Proxy Terbalik?",
-    "Check how to config it for WebSocket": "Periksa cara mengonfigurasinya untuk A WebSocket",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Kemungkinan besar penyebabnya:",
-    "The resource is no longer available.": "Sumber daya tidak lagi tersedia.",
-    "There might be a typing error in the address.": "Mungkin ada kesalahan pengetikan di alamat.",
-    "What you can try:": "Apa yang dapat kamu coba:",
-    "Retype the address.": "Ketik ulang alamat.",
-    "Go back to the previous page.": "Kembali ke halaman sebelumnya.",
-    "Coming Soon": "Segera",
-    wayToGetClickSendSMSToken: "Anda bisa mendapatkan Nama Pengguna API dan Kunci API dari {0} .",
-    "Connection String": "String Koneksi",
-    Query: "Query",
-    settingsCertificateExpiry: "Sertifikat TLS Kadaluarsa",
-    certificationExpiryDescription: "Monitor HTTPS memicu pemberitahuan saat sertifikat TLS kedaluwarsa dalam:",
-    "Setup Docker Host": "Siapkan Host Docker",
-    "Connection Type": "Jenis Koneksi",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Apakah Anda yakin ingin menghapus host docker berikut untuk semua monitor?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domain",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Anda berada dalam mode Tanpa Otentikasi, kata sandi tidak diperlukan.",
-    trustProxyDescription: "Trust 'X-Forwarded-*' headers. Jika Anda ingin mendapatkan IP klien yang benar dan Uptime Kuma Anda dibalik layanan seperti Nginxor Apache, Anda harus mengaktifkan ini.",
-    wayToGetLineNotifyToken: "Anda bisa mendapatkan token akses dari {0}",
-    Examples: "Contoh",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Token Akses Berumur Panjang",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token Akses Berumur Panjang dapat dibuat dengan mengklik nama profil Anda (kiri bawah) dan menggulir ke bawah lalu klik Buat Token. ",
-    "Notification Service": "Layanan Pemberitahuan",
-    "default: notify all devices": "bawaan: notifikasi seluruh perangkat",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Daftar Layanan Pemberitahuan dapat ditemukan di Home Assistant pada \"Developer Tools > Services\" cari \"notification\" lalu cari nama perangkat Anda.",
-    "Automations can optionally be triggered in Home Assistant:": "Otomatisasi dapat dipicu secara opsional di Home Assistant:",
-    "Trigger type:": "Tipe Trigger/Pemicu:",
-    "Event type:": "Tipe event:",
-    "Event data:": "Data event:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Kemudian pilih tindakan, misalnya alihkan ke tempat dimana lampu RGB berwarna merah.",
-    "Frontend Version": "Versi Frontend",
-    "Frontend Version do not match backend version!": "Versi Frontend tidak sama dengan versi backend!",
-    "Base URL": "URL Dasar",
-    goAlertInfo: "GoAlert adalah aplikasi open source untuk penjadwalan panggilan, eskalasi otomatis dan pemberitahuan (seperti SMS atau panggilan suara). Secara otomatis melibatkan orang yang tepat, dengan cara yang benar, dan pada waktu yang tepat! {0}",
-    goAlertIntegrationKeyInfo: "Dapatkan kunci integrasi API generik untuk layanan dalam format ini \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biasanya nilai parameter token dari URL yang disalin.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Tidak digunakan lagi: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
-    backupRecommend: "Harap cadangkan volume atau folder data (./data/) secara langsung.",
-};
diff --git a/src/languages/it-IT.js b/src/languages/it-IT.js
deleted file mode 100644
index cd065597..00000000
--- a/src/languages/it-IT.js
+++ /dev/null
@@ -1,367 +0,0 @@
-export default {
-    languageName: "Italiano (Italian)",
-    checkEverySecond: "controlla ogni {0} secondi",
-    retryCheckEverySecond: "Riprova ogni {0} secondi.",
-    retriesDescription: "Tentativi prima che il servizio venga marcato come \"DOWN\" e che una notifica venga inviata.",
-    ignoreTLSError: "Ignora gli errori TLS/SSL per i siti HTTPS.",
-    upsideDownModeDescription: "Se il servizio risulta raggiungibile viene marcato come \"DOWN\".",
-    maxRedirectDescription: "Numero massimo di redirezionamenti consentito. Per disabilitare, impostare \"0\".",
-    acceptedStatusCodesDescription: "Elenco di codici di stato HTTP che sono considerati validi.",
-    passwordNotMatchMsg: "La password non corrisponde.",
-    notificationDescription: "Assegnare la notifica a uno o più oggetti monitorati per metterla in funzione.",
-    keywordDescription: "Cerca la parola chiave nella risposta in html o JSON e fai distinzione tra maiuscole e minuscole",
-    pauseDashboardHome: "In Pausa",
-    deleteMonitorMsg: "Sei sicuro di voler eliminare questo oggetto monitorato?",
-    deleteNotificationMsg: "Sei sicuro di voler eliminare questa notifica per tutti gli oggetti monitorati?",
-    resolverserverDescription: "Cloudflare è il server predefinito ma è possibile cambiare il server DNS.",
-    rrtypeDescription: "Scegliere il tipo di RR che si vuole monitorare",
-    pauseMonitorMsg: "Sei sicuro di voler mettere in pausa?",
-    enableDefaultNotificationDescription: "Per ogni nuovo monitor questa notifica sarà abilitata di default. È comunque possibile disabilitare la notifica singolarmente.",
-    clearEventsMsg: "Sei sicuro di voler eliminare tutti gli eventi per questo servizio?",
-    clearHeartbeatsMsg: "Sei sicuro di voler eliminare tutti gli intervalli di controllo per questo servizio?",
-    confirmClearStatisticsMsg: "Sei sicuro di voler eliminare TUTTE le statistiche?",
-    importHandleDescription: "Selezionare \"Ignora esistenti\" se si vuole ignorare l'importazione dei monitor o delle notifiche con lo stesso nome. \"Sovrascrivi\" rimpiazzerà tutti i monitor e le notifiche presenti con quelli nel backup.",
-    confirmImportMsg: "Sei sicuro di voler importare il backup? Controlla di aver selezionato l'opzione corretta di importazione.",
-    twoFAVerifyLabel: "Digita il token per verificare che l'autenticazione a due fattori funzioni correttamente:",
-    tokenValidSettingsMsg: "Il token è valido! È ora possibile salvare le impostazioni.",
-    confirmEnableTwoFAMsg: "Sei sicuro di voler abilitare l'autenticazione a due fattori?",
-    confirmDisableTwoFAMsg: "Sei sicuro di voler disabilitare l'autenticazione a due fattori?",
-    Settings: "Impostazioni",
-    Dashboard: "Dashboard",
-    "New Update": "Nuovo aggiornamento disponibile!",
-    Language: "Lingua",
-    Appearance: "Aspetto",
-    Theme: "Tema",
-    General: "Generale",
-    "Primary Base URL": "URL base primario",
-    Version: "Versione",
-    "Check Update On GitHub": "Controlla aggiornamenti su GitHub",
-    List: "Lista",
-    Add: "Aggiungi",
-    "Add New Monitor": "Aggiungi nuovo monitor",
-    "Quick Stats": "Statistiche rapide",
-    Up: "Up",
-    Down: "Down",
-    Pending: "In attesa",
-    Unknown: "Sconosciuti",
-    Pause: "Metti in pausa",
-    Name: "Nome",
-    Status: "Stato",
-    DateTime: "Data e Ora",
-    Message: "Messaggio",
-    "No important events": "Nessun evento importante",
-    Resume: "Riprendi",
-    Edit: "Modifica",
-    Delete: "Elimina",
-    Current: "Corrente",
-    Uptime: "Tempo di attività",
-    "Cert Exp.": "Scadenza certificato",
-    day: "giorno | giorni",
-    "-day": "-giorni",
-    hour: "ora",
-    "-hour": "-ore",
-    Response: "Risposta",
-    Ping: "Ping",
-    "Monitor Type": "Modalità di monitoraggio",
-    Keyword: "Parola chiave",
-    "Friendly Name": "Nome",
-    URL: "URL",
-    Hostname: "Nome Host",
-    Port: "Porta",
-    "Heartbeat Interval": "Intervallo di controllo",
-    Retries: "Tentativi",
-    "Heartbeat Retry Interval": "Intervallo tra i tentativo di controllo",
-    Advanced: "Avanzate",
-    "Upside Down Mode": "Modalità invertita",
-    "Max. Redirects": "Reindirizzamenti massimi",
-    "Accepted Status Codes": "Codici di stato accettati",
-    "Push URL": "Push URL",
-    needPushEvery: "Notificare questo URL ogni {0} secondi.",
-    pushOptionalParams: "Parametri aggiuntivi: {0}",
-    Save: "Salva",
-    Notifications: "Notifiche",
-    "Not available, please setup.": "Non disponibili, da configurare.",
-    "Setup Notification": "Configura le notifiche",
-    Light: "Chiaro",
-    Dark: "Scuro",
-    Auto: "Automatico",
-    "Theme - Heartbeat Bar": "Tema (barra di stato)",
-    Normal: "Normale",
-    Bottom: "Sotto",
-    None: "Nessuna",
-    Timezone: "Fuso Orario",
-    "Search Engine Visibility": "Visibilità ai motori di ricerca",
-    "Allow indexing": "Consenti l'indicizzazione",
-    "Discourage search engines from indexing site": "Evita l'indicizzazione ai motori di ricerca",
-    "Change Password": "Cambia password",
-    "Current Password": "Password corrente",
-    "New Password": "Nuova password",
-    "Repeat New Password": "Ripeti nuova password",
-    "Update Password": "Modifica password",
-    "Disable Auth": "Disabilita autenticazione",
-    "Enable Auth": "Abilita autenticazione",
-    "disableauth.message1": "<strong>Disabilitare l'autenticazione?</strong>",
-    "disableauth.message2": "<strong>Questa opzione è per chi un sistema di autenticazione gestito da terze parti</strong> messo davanti ad Uptime Kuma, ad esempio Cloudflare Access.",
-    "Please use this option carefully!": "Utilizzare con attenzione!",
-    Logout: "Esci",
-    Leave: "Annulla",
-    "I understand, please disable": "Lo capisco, disabilitare l'autenticazione.",
-    Confirm: "Conferma",
-    Yes: "Sì",
-    No: "No",
-    Username: "Nome utente",
-    Password: "Password",
-    "Remember me": "Ricorda credenziali",
-    Login: "Accesso",
-    "No Monitors, please": "Nessun monitor presente,",
-    "add one": "aggiungine uno!",
-    "Notification Type": "Servizio di notifica",
-    Email: "E-mail",
-    Test: "Fai una prova",
-    "Certificate Info": "Informazioni sul certificato",
-    "Resolver Server": "Server DNS",
-    "Resource Record Type": "Tipo di Resource Record",
-    "Last Result": "Ultimo risultato",
-    "Create your admin account": "Crea l'account amministratore",
-    "Repeat Password": "Ripeti password",
-    "Import Backup": "Importa backup",
-    "Export Backup": "Esporta backup",
-    Export: "Esporta",
-    Import: "Importa",
-    respTime: "Tempo di risposta (ms)",
-    notAvailableShort: "N/D",
-    "Default enabled": "Abilitato di default",
-    "Apply on all existing monitors": "Applica su tutti i monitoraggi",
-    Create: "Crea",
-    "Clear Data": "Cancella dati",
-    Events: "Eventi",
-    Heartbeats: "Controlli",
-    "Auto Get": "Rileva",
-    backupDescription: "È possibile fare il backup di tutti i monitoraggi e di tutte le notifiche in un file JSON.",
-    backupDescription2: "NOTA: lo storico e i dati relativi agli eventi non saranno inclusi nel backup",
-    backupDescription3: "Dati sensibili come i token di autenticazione saranno inclusi nel backup, custodisci il file in un luogo sicuro!",
-    alertNoFile: "Selezionare il file da importare.",
-    alertWrongFileType: "Selezionare un file JSON.",
-    "Clear all statistics": "Cancella tutte le statistiche",
-    "Skip existing": "Ignora esistenti",
-    Overwrite: "Sovrascrivi",
-    Options: "Opzioni",
-    "Keep both": "Mantieni entrambi",
-    "Verify Token": "Verifica token",
-    "Setup 2FA": "Configura 2FA",
-    "Enable 2FA": "Abilita 2FA",
-    "Disable 2FA": "Disabilita 2FA",
-    "2FA Settings": "Gestisci l'autenticazione a due fattori",
-    "Two Factor Authentication": "Autenticazione a due fattori (2FA)",
-    Active: "Attivata",
-    Inactive: "Disattivata",
-    Token: "Token",
-    "Show URI": "Mostra URI",
-    Tags: "Etichette",
-    "Add New below or Select...": "Aggiungi oppure scegli...",
-    "Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
-    "Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
-    color: "colore",
-    "value (optional)": "descrizione (opzionale)",
-    Gray: "Grigio",
-    Red: "Rosso",
-    Orange: "Arancione",
-    Green: "Verde",
-    Blue: "Blu",
-    Indigo: "Indaco",
-    Purple: "Viola",
-    Pink: "Rosa",
-    "Search...": "Cerca...",
-    "Avg. Ping": "Tempo medio di risposta al ping",
-    "Avg. Response": "Tempo medio di risposta",
-    "Entry Page": "Pagina Principale",
-    statusPageNothing: "Non c'è nulla qui, aggiungi un gruppo oppure un monitor.",
-    "No Services": "Nessun servizio",
-    "All Systems Operational": "Tutti i sistemi sono funzionali",
-    "Partially Degraded Service": "Servizio parzialmente degradato",
-    "Degraded Service": "Servizio degradato",
-    "Add Group": "Aggiungi gruppo",
-    "Add a monitor": "Aggiungi monitor",
-    "Edit Status Page": "Modifica pagina di stato",
-    "Go to Dashboard": "Vai alla dashboard",
-    "Status Page": "Pagina di stato",
-    "Status Pages": "Pagina di stato",
-    defaultNotificationName: "Notifica {notification} ({number})",
-    here: "qui",
-    Required: "Obbligatorio",
-    telegram: "Telegram",
-    "Bot Token": "Token del bot",
-    wayToGetTelegramToken: "Puoi ottenere il token da {0}.",
-    "Chat ID": "ID Chat",
-    supportTelegramChatID: "Supporta chat private, gruppi e canali.",
-    wayToGetTelegramChatID: "È possibile ricereve l'ID chat mandando un messaggio al bot e poi andando in questo URL per visualizzare il chat_id:",
-    "YOUR BOT TOKEN HERE": "QUI IL TOKEN DEL BOT",
-    chatIDNotFound: "Non trovo l'ID chat. Prima bisogna mandare un messaggio al bot",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} va bene per qualsiasi server HTTP moderno ad esempio express.js",
-    webhookFormDataDesc: "{multipart} va bene per PHP, c'è solo bisogno di analizzare il json con {decodeFunction}",
-    smtp: "E-mail (SMTP)",
-    secureOptionNone: "Nessuno / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignora gli errori TLS",
-    "From Email": "Mittente",
-    emailCustomSubject: "Oggetto personalizzato",
-    "To Email": "Destinatario",
-    smtpCC: "CC",
-    smtpBCC: "CCn",
-    discord: "Discord",
-    "Discord Webhook URL": "URL Webhook di Discord",
-    wayToGetDiscordURL: "È possibile recuperarlo da Impostazioni server -> Integrazioni -> Creare Webhook",
-    "Bot Display Name": "Nome del Bot",
-    "Prefix Custom Message": "Prefisso per il messaggio personalizzato",
-    "Hello @everyone is...": "Ciao a {'@'}everyone ...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL Webhook",
-    wayToGetTeamsURL: "È possibile imparare a creare un URL Webhook {0}.",
-    signal: "Signal",
-    Number: "Numero",
-    Recipients: "Destinatari",
-    needSignalAPI: "È necessario avere un client Signal con le API REST.",
-    wayToCheckSignalURL: "Controllare questo url per capire come impostarne uno:",
-    signalImportant: "IMPORTANTE: Non è possibile mischiare gruppi e numeri all'interno dei destinatari!",
-    gotify: "Gotify",
-    "Application Token": "Token Applicazione",
-    "Server URL": "URL Server",
-    Priority: "Priorità",
-    slack: "Slack",
-    "Icon Emoji": "Icona Emoji",
-    "Channel Name": "Nome Canale",
-    "Uptime Kuma URL": "Indirizzo Uptime Kuma",
-    aboutWebhooks: "Maggiori informazioni riguardo ai webhooks su: {0}",
-    aboutChannelName: "Inserire il nome del canale nel campo \"Nome Canale\" {0} se si vuole bypassare il canale webhook. Ad esempio: #altro-canale",
-    aboutKumaURL: "Se si lascia bianco il campo Indirizzo Uptime Kuma, la pagina GitHub sarà il valore predefinito.",
-    emojiCheatSheet: "Lista Emoji: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Supporta più di 50 servizi di notifica)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Chiave Utente",
-    Device: "Dispositivo",
-    "Message Title": "Titolo Messaggio",
-    "Notification Sound": "Suono di Notifica",
-    "More info on:": "Maggiori informazioni su: {0}",
-    pushoverDesc1: "Priorità di Emergenza (2) ha 30 secondi di timeout tra un tentativo e l'altro e scadrà dopo un'ora.",
-    pushoverDesc2: "Se si vuole inviare la notifica a dispositivi differenti, riempire il campo Dispositivi.",
-    "SMS Type": "Tipo di SMS",
-    octopushTypePremium: "Premium (Veloce - raccomandato per allertare)",
-    octopushTypeLowCost: "A Basso Costo (Lento - talvolta bloccato dall'operatore)",
-    checkPrice: "Controlla {0} prezzi:",
-    apiCredentials: "Credenziali API",
-    octopushLegacyHint: "Si vuole utilizzare la vecchia versione (2011-2020) oppure la nuova versione di Octopush?",
-    "Check octopush prices": "Controlla i prezzi di Octopush {0}.",
-    octopushPhoneNumber: "Numero di telefono (formato internazionale (p.e.): +33612345678) ",
-    octopushSMSSender: "Nome del mittente: 3-11 caratteri alfanumerici e spazi (a-zA-Z0-9)",
-    "LunaSea Device ID": "ID dispositivo LunaSea",
-    "Apprise URL": "URL Apprise",
-    "Example:": "Esempio: {0}",
-    "Read more:": "Maggiori informazioni: {0}",
-    "Status:": "Stato: {0}",
-    "Read more": "Maggiori informazioni",
-    appriseInstalled: "Apprise è installato.",
-    appriseNotInstalled: "Apprise non è installato. {0}",
-    "Access Token": "Token di accesso",
-    "Channel access token": "Token di accesso al canale",
-    "Line Developers Console": "Console sviluppatori Line",
-    lineDevConsoleTo: "Console sviluppatori Line - {0}",
-    "Basic Settings": "Impostazioni Base",
-    "User ID": "ID Utente",
-    "Messaging API": "API di Messaggistica",
-    wayToGetLineChannelToken: "Prima accedi a {0}, crea un provider e un canale (API di Messaggistica), dopodiché puoi avere il token di accesso e l'id utente dal menù sopra.",
-    "Icon URL": "URL Icona",
-    aboutIconURL: "È possibile impostare un collegameno a una immagine in \"URL Icona\" per modificare l'immagine di profilo. Non verrà utilizzata se è impostata l'Icona Emoji.",
-    aboutMattermostChannelName: "È possibile modificare il canale predefinito che dove il webhook manda messaggi immettendo il nome del canale nel campo \"Nome Canale\". Questo va abilitato nelle impostazioni webhook di Mattermost webhook. P.E.: #altro-canale",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - economico, ma lento e spesso sovraccarico. Limitato solamente a destinatari Polacchi.",
-    promosmsTypeFlash: "SMS FLASH - Il messaggio sarà automaticamente mostrato sul dispositivo dei destinatari. Limitato solo a destinatari Polacchi.",
-    promosmsTypeFull: "SMS FULL - Premium, È possibile utilizzare il proprio come come mittente (è necessario prima registrare il nome). Affidabile per gli allarmi.",
-    promosmsTypeSpeed: "SMS SPEED - Maggior priorità. Rapido, affidabile, ma costoso (costa il doppio di SMS FULL).",
-    promosmsPhoneNumber: "Numero di Telefono (per destinatari Polacchi si può omettere il codice area)",
-    promosmsSMSSender: "Mittente SMS : Nome preregistrato oppure uno dei seguenti: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "URL WebHook di Feishu",
-    matrixHomeserverURL: "URL Server (con http(s):// e opzionalmente la porta)",
-    "Internal Room Id": "ID Stanza Interna",
-    matrixDesc1: "È possibile recuperare l'ID della stanza all'interno delle impostazioni avanzate della stanza nel client Matrix. Dovrebbe essere simile a !QMdRCpUIfLwsfjxye6:server.di.casa.",
-    matrixDesc2: "È altamente raccomandata la creazione di un nuovo utente e di non utilizare il proprio token di accesso Matrix poiché darà pieno controllo al proprio account e a tutte le stanze in cui si ha accesso. Piuttosto, si crei un nuovo utente per invitarlo nella stanza dove si vuole ricevere le notifiche. Si può accedere al token eseguendo {0}",
-    Method: "Metodo",
-    Body: "Body",
-    Headers: "Intestazioni",
-    PushUrl: "URL di Push",
-    HeadersInvalidFormat: "L'intestazione di richiesta non è un JSON valido: ",
-    BodyInvalidFormat: "Il corpo di richiesta non è un JSON valido: ",
-    "Monitor History": "Storico monitor",
-    clearDataOlderThan: "Mantieni lo storico per {0} giorni.",
-    PasswordsDoNotMatch: "Le password non corrispondono!",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "Per monitorare un server di gioco Steam è necessaria una Web-API Key di Steam. È possibile registrarne una qui: ",
-    "Current User": "Utente corrente",
-    recent: "Recenti",
-    Done: "Fatto",
-    Info: "Info",
-    Security: "Sicurezza",
-    "Steam API Key": "API Key di Steam",
-    "Shrink Database": "Comprimi database",
-    "Pick a RR-Type...": "Scegli un tipo di RR...",
-    "Pick Accepted Status Codes...": "Scegli i codici di Stato Accettati...",
-    Default: "Predefinito",
-    "HTTP Options": "Opzioni HTTP",
-    "Create Incident": "Segnala incidente",
-    Title: "Titolo",
-    Content: "Contenuto",
-    Style: "Stile",
-    info: "informativo",
-    warning: "attenzione",
-    danger: "critico",
-    primary: "predefinito",
-    light: "chiaro",
-    dark: "scuro",
-    Post: "Posta",
-    "Please input title and content": "Inserire il titolo e il contenuto",
-    Created: "Creato",
-    "Last Updated": "Ultima modifica",
-    Unpin: "Rimuovi",
-    "Switch to Light Theme": "Utilizza il tema chiaro",
-    "Switch to Dark Theme": "Utilizza il tema scuro",
-    "Show Tags": "Mostra etichette",
-    "Hide Tags": "Nascondi etichette",
-    Description: "Descrizione",
-    "No monitors available.": "Nessun monitor disponibile.",
-    "Add one": "Aggiungine uno!",
-    "No Monitors": "Nessun monitor presente.",
-    "Untitled Group": "Gruppo senza titolo",
-    Services: "Servizi",
-    Discard: "Scarta modifiche",
-    Cancel: "Annulla",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Lancia il comando \"VACUUM\" sul database SQLite. Se il database è stato creato dopo la versione 1.10.0, la funzione \"AUTO_VACUUM\" è già abilitata di default e quindi questa azione non è necessaria.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "Nome utente API (incl. prefisso webapi_)",
-    serwersmsAPIPassword: "Password API",
-    serwersmsPhoneNumber: "Numero di Telefono",
-    serwersmsSenderName: "Nome del mittente SMS (registrato via portale cliente)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "Impostazioni DKIM",
-    smtpDkimDesc: "Fare riferimento a Nodemailer DKIM {0} per l'utilizzo.",
-    documentation: "documentazione",
-    smtpDkimDomain: "Dominio",
-    smtpDkimKeySelector: "Selettore Chiave",
-    smtpDkimPrivateKey: "Chiave Privata",
-    smtpDkimHashAlgo: "Algoritmo di hashing (opzionale)",
-    smtpDkimheaderFieldNames: "Campi Intestazione da firmare (opzionale)",
-    smtpDkimskipFields: "Campi Intestazione da non firmare (opzionale)",
-    GoogleChat: "Google Chat (solo per Google Workspace)",
-};
diff --git a/src/languages/ja.js b/src/languages/ja.js
deleted file mode 100644
index 187ade0c..00000000
--- a/src/languages/ja.js
+++ /dev/null
@@ -1,201 +0,0 @@
-export default {
-    languageName: "日本語",
-    checkEverySecond: "{0}秒ごとにチェックします。",
-    retriesDescription: "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数",
-    ignoreTLSError: "HTTPS ウェブサイトの TLS/SSL エラーを無視する",
-    upsideDownModeDescription: "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。",
-    maxRedirectDescription: "フォローするリダイレクトの最大数。リダイレクトを無効にするには0を設定する。",
-    acceptedStatusCodesDescription: "成功した応答とみなされるステータスコードを選択する。",
-    passwordNotMatchMsg: "繰り返しのパスワードが一致しません。",
-    notificationDescription: "監視を機能させるには、監視に通知を割り当ててください。",
-    keywordDescription: "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します",
-    pauseDashboardHome: "一時停止",
-    deleteMonitorMsg: "この監視を削除してよろしいですか?",
-    deleteNotificationMsg: "全ての監視のこの通知を削除してよろしいですか?",
-    resolverserverDescription: "Cloudflareがデフォルトのサーバーですが、いつでもリゾルバサーバーを変更できます。",
-    rrtypeDescription: "監視するRRタイプを選択します",
-    pauseMonitorMsg: "一時停止しますか?",
-    Settings: "設定",
-    Dashboard: "ダッシュボード",
-    "New Update": "新しいアップデート",
-    Language: "言語",
-    Appearance: "外観",
-    Theme: "テーマ",
-    General: "General",
-    Version: "バージョン",
-    "Check Update On GitHub": "GitHubでアップデートを確認する",
-    List: "一覧",
-    Add: "追加",
-    "Add New Monitor": "監視の追加",
-    "Quick Stats": "統計",
-    Up: "Up",
-    Down: "Down",
-    Pending: "中止",
-    Unknown: "不明",
-    Pause: "一時停止",
-    Name: "名前",
-    Status: "ステータス",
-    DateTime: "日時",
-    Message: "メッセージ",
-    "No important events": "重要なイベントなし",
-    Resume: "再開",
-    Edit: "編集",
-    Delete: "削除",
-    Current: "現在",
-    Uptime: "起動時間",
-    "Cert Exp.": "証明書有効期限",
-    day: "日 | 日間",
-    "-day": "-日",
-    hour: "時間",
-    "-hour": "-時間",
-    Response: "レスポンス",
-    Ping: "Ping",
-    "Monitor Type": "監視タイプ",
-    Keyword: "キーワード",
-    "Friendly Name": "分かりやすい名前",
-    URL: "URL",
-    Hostname: "ホスト名",
-    Port: "ポート",
-    "Heartbeat Interval": "監視間隔",
-    Retries: "Retries",
-    Advanced: "Advanced",
-    "Upside Down Mode": "Upside Down Mode",
-    "Max. Redirects": "最大リダイレクト数",
-    "Accepted Status Codes": "承認されたステータスコード",
-    Save: "保存",
-    Notifications: "通知",
-    "Not available, please setup.": "利用できません。設定してください。",
-    "Setup Notification": "通知設定",
-    Light: "Light",
-    Dark: "Dark",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "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": "add one",
-    "Notification Type": "通知タイプ",
-    Email: "Eメール",
-    Test: "テスト",
-    "Certificate Info": "証明書情報",
-    "Resolver Server": "問い合わせ先DNSサーバ",
-    "Resource Record Type": "DNSレコード設定",
-    "Last Result": "最終結果",
-    "Create your admin account": "Adminアカウントの作成",
-    "Repeat Password": "パスワード確認",
-    respTime: "応答時間 (ms)",
-    notAvailableShort: "N/A",
-    Create: "作成",
-    clearEventsMsg: "この監視のすべての記録を削除してもよろしいですか?",
-    clearHeartbeatsMsg: "この監視のすべての異常記録を削除してもよろしいですか?",
-    confirmClearStatisticsMsg: "すべての統計を削除してもよろしいですか?",
-    "Clear Data": "データを削除",
-    Events: "統計",
-    Heartbeats: "異常記録",
-    "Auto Get": "自動取得",
-    enableDefaultNotificationDescription: "監視を作成するごとに、この通知方法はデフォルトで有効になります。監視ごとに通知を無効にすることもできます。",
-    "Default enabled": "デフォルトで有効にする",
-    "Also apply to existing monitors": "既存のモニターにも適用する",
-    Export: "エクスポート",
-    Import: "インポート",
-    backupDescription: "すべての監視と通知方法をJSONファイルにできます。",
-    backupDescription2: "※ 履歴と統計のデータはバックアップされません。",
-    backupDescription3: "通知に使用するトークンなどの機密データも含まれています。注意して扱ってください。",
-    alertNoFile: "インポートするファイルを選択してください。",
-    alertWrongFileType: "JSONファイルを選択してください。",
-    twoFAVerifyLabel: "トークンを入力して、2段階認証を有効にします。",
-    tokenValidSettingsMsg: "トークンの確認が完了しました! 「保存」をしてください。",
-    confirmEnableTwoFAMsg: "2段階認証を「有効」にします。よろしいですか?",
-    confirmDisableTwoFAMsg: "2段階認証を「無効」にします。よろしいですか?",
-    "Apply on all existing monitors": "既存のすべてのモニターに適用する",
-    "Verify Token": "認証する",
-    "Setup 2FA": "2段階認証の設定",
-    "Enable 2FA": "2段階認証を有効にする",
-    "Disable 2FA": "2段階認証を無効にする",
-    "2FA Settings": "2段階認証の設定",
-    "Two Factor Authentication": "2段階認証",
-    Active: "Active",
-    Inactive: "Inactive",
-    Token: "Token",
-    "Show URI": "Show URI",
-    "Clear all statistics": "すべての記録を削除",
-    retryCheckEverySecond: "Retry every {0} seconds.",
-    importHandleDescription: "同じ名前のすべての監視または通知方法を上書きしない場合は、「既存のをスキップ」を選択します。 「上書きする」は、既存のすべてのモニターと通知を削除します。",
-    confirmImportMsg: "バックアップをインポートしてもよろしいですか?希望するオプションを選択してください。",
-    "Heartbeat Retry Interval": "異常検知後の再試行間隔",
-    "Import Backup": "バックアップのインポート",
-    "Export Backup": "バックアップのエクスポート",
-    "Skip existing": "既存のをスキップする",
-    Overwrite: "上書きする",
-    Options: "オプション",
-    "Keep both": "どちらも保持する",
-    Tags: "タグ",
-    "Add New below or Select...": "新規追加または選択...",
-    "Tag with this name already exist.": "この名前のタグはすでに存在しています。",
-    "Tag with this value already exist.": "この値のタグはすでに存在しています。",
-    color: "色",
-    "value (optional)": "値 (optional)",
-    Gray: "Gray",
-    Red: "Red",
-    Orange: "Orange",
-    Green: "Green",
-    Blue: "Blue",
-    Indigo: "Indigo",
-    Purple: "Purple",
-    Pink: "Pink",
-    "Search...": "検索...",
-    "Avg. Ping": "平均Ping時間",
-    "Avg. Response": "平均応答時間",
-    "Entry Page": "エントリーページ",
-    statusPageNothing: "ここには何もありません。グループまたは監視を追加してください。",
-    "No Services": "No Services",
-    "All Systems Operational": "すべてのサービスが稼働中",
-    "Partially Degraded Service": "部分的にサービスが停止中",
-    "Degraded Service": "サービスが停止中",
-    "Add Group": "グループの追加",
-    "Add a monitor": "監視の追加",
-    "Edit Status Page": "ステータスページ編集",
-    "Go to Dashboard": "ダッシュボード",
-    "Status Page": "ステータスページ",
-    "Status Pages": "ステータスページ",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
deleted file mode 100644
index f614f518..00000000
--- a/src/languages/ko-KR.js
+++ /dev/null
@@ -1,531 +0,0 @@
-export default {
-    languageName: "한국어",
-    checkEverySecond: "{0}초마다 확인해요.",
-    retryCheckEverySecond: "{0}초마다 다시 확인해요.",
-    retriesDescription: "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
-    ignoreTLSError: "HTTPS 웹사이트에서 TLS/SSL 오류 무시하기",
-    upsideDownModeDescription: "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거예요.",
-    maxRedirectDescription: "최대 리다이렉트 횟수예요. 0을 입력하면 리다이렉트를 꺼요.",
-    acceptedStatusCodesDescription: "응답 성공으로 간주할 상태 코드를 정해요.",
-    passwordNotMatchMsg: "비밀번호 재입력이 일치하지 않아요.",
-    notificationDescription: "모니터링에 알림을 설정할 수 있어요.",
-    keywordDescription: "HTML 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.",
-    pauseDashboardHome: "일시 정지",
-    deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?",
-    deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?",
-    resolverserverDescription: "Cloudflare가 기본 서버예요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
-    rrtypeDescription: "모니터링할 RR-Type을 선택해요.",
-    pauseMonitorMsg: "정말 이 모니터링을 일시 정지할까요?",
-    enableDefaultNotificationDescription: "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
-    clearEventsMsg: "정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?",
-    clearHeartbeatsMsg: "정말 이 모니터링에 대한 모든 하트비트를 삭제할까요?",
-    confirmClearStatisticsMsg: "정말 모든 통계를 삭제할까요?",
-    importHandleDescription: "이름이 같은 모든 모니터링이나 알림을 건너뛰려면 '기존값 건너뛰기'를 선택해주세요. '덮어쓰기'는 기존의 모든 모니터링과 알림을 삭제해요.",
-    confirmImportMsg: "정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.",
-    twoFAVerifyLabel: "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요.",
-    tokenValidSettingsMsg: "토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.",
-    confirmEnableTwoFAMsg: "정말 2단계 인증을 활성화할까요?",
-    confirmDisableTwoFAMsg: "정말 2단계 인증을 비활성화할까요?",
-    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.": "인증서 만료",
-    day: "일",
-    "-day": "-일",
-    hour: "시간",
-    "-hour": "-시간",
-    Response: "응답",
-    Ping: "핑",
-    "Monitor Type": "모니터링 종류",
-    Keyword: "키워드",
-    "Friendly Name": "이름",
-    URL: "URL",
-    Hostname: "호스트네임",
-    Port: "포트",
-    "Heartbeat Interval": "하트비트 주기",
-    Retries: "재시도",
-    "Heartbeat Retry Interval": "하트비트 재시도 주기",
-    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": "인증 활성화",
-    "disableauth.message1": "정말로 <strong>인증 기능을 끌까요</strong>?",
-    "disableauth.message2": "이 기능은 <strong>Cloudflare Access와 같은 서드파티 인증</strong>을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.",
-    "Please use this option carefully!": "신중하게 사용하세요.",
-    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": "비밀번호 재입력",
-    "Import Backup": "백업 가져오기",
-    "Export Backup": "백업 내보내기",
-    Export: "내보내기",
-    Import: "가져오기",
-    respTime: "응답 시간 (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "기본 알림으로 설정",
-    "Apply on all existing monitors": "기존 모니터링에 모두 적용하기",
-    Create: "생성하기",
-    "Clear Data": "데이터 삭제",
-    Events: "이벤트",
-    Heartbeats: "하트비트",
-    "Auto Get": "자동 Get",
-    backupDescription: "모든 모니터링과 알림을 JSON 파일 형식에 저장할 수 있어요.",
-    backupDescription2: "히스토리와 이벤트 데이터는 포함되어 있지 않아요.",
-    backupDescription3: "알림 토큰과 같은 보안 데이터가 내보내기 파일에 포함되어 있으므로 관리에 주의해주세요.",
-    alertNoFile: "가져오기를 하기 위해 파일을 선택해주세요.",
-    alertWrongFileType: "JSON 파일을 선택해주세요.",
-    "Clear all statistics": "모든 통계치 삭제",
-    "Skip existing": "기존값 건너뛰기",
-    Overwrite: "덮어쓰기",
-    Options: "옵션",
-    "Keep both": "두개 모두 보존",
-    "Verify Token": "토큰 검증",
-    "Setup 2FA": "2단계 인증 설정하기",
-    "Enable 2FA": "2단계 인증 활성화",
-    "Disable 2FA": "2단계 인증 비활성화",
-    "2FA Settings": "2단계 인증 설정",
-    "Two Factor Authentication": "2단계 인증",
-    Active: "활성화",
-    Inactive: "비활성화",
-    Token: "토큰",
-    "Show URI": "URI 보기",
-    Tags: "태그",
-    "Add New below or Select...": "아래 새롭게 추가 또는 선택...",
-    "Tag with this name already exist.": "같은 태그 이름이 이미 존재해요.",
-    "Tag with this value already exist.": "같은 값을 가진 태그가 이미 존재해요.",
-    color: "색상",
-    "value (optional)": "값 (선택)",
-    Gray: "회색",
-    Red: "빨간색",
-    Orange: "주황색",
-    Green: "초록색",
-    Blue: "파란색",
-    Indigo: "남색",
-    Purple: "보라색",
-    Pink: "핑크색",
-    "Search...": "검색...",
-    "Avg. Ping": "평균 핑",
-    "Avg. Response": "평균 응답",
-    "Entry Page": "첫 페이지",
-    statusPageNothing: "아무것도 없어요. 새로운 그룹 또는 모니터링을 추가해주세요.",
-    "No Services": "서비스 없음",
-    "All Systems Operational": "모든 시스템 정상",
-    "Partially Degraded Service": "일부 시스템 비정상",
-    "Degraded Service": "모든 시스템 비정상",
-    "Add Group": "그룹 추가",
-    "Add a monitor": "모니터링 추가",
-    "Edit Status Page": "상태 페이지 수정",
-    "Go to Dashboard": "대시보드로 가기",
-    "Status Page": "상태 페이지",
-    "Status Pages": "상태 페이지",
-    defaultNotificationName: "내 {notification} 알림 ({number})",
-    here: "여기",
-    Required: "필수",
-    telegram: "Telegram",
-    "Bot Token": "봇 토큰",
-    wayToGetTelegramToken: "토큰은 여기서 얻을 수 있어요: {0}.",
-    "Chat ID": "채팅 ID",
-    supportTelegramChatID: "개인 채팅 / 그룹 / 채널의 ID를 지원해요.",
-    wayToGetTelegramChatID: "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
-    "YOUR BOT TOKEN HERE": "봇 토큰",
-    chatIDNotFound: "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
-    webhookFormDataDesc: "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "없음 / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS 에러 무시하기",
-    "From Email": "보내는 이메일",
-    "To Email": "받는 이메일",
-    smtpCC: "참조",
-    smtpBCC: "숨은 참조",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요!",
-    "Bot Display Name": "표시 이름",
-    "Prefix Custom Message": "접두사 메시지",
-    "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "{0}에서 Webhook을 어떻게 만드는지 알아보세요!",
-    signal: "Signal",
-    Number: "숫자",
-    Recipients: "받는 사람",
-    needSignalAPI: "REST API를 사용하는 Signal 클라이언트가 있어야 해요.",
-    wayToCheckSignalURL: "밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요.",
-    signalImportant: "경고: 받는 사람의 그룹과 숫자는 섞을 수 없어요!",
-    gotify: "Gotify",
-    "Application Token": "애플리케이션 토큰",
-    "Server URL": "서버 URL",
-    Priority: "Priority",
-    slack: "Slack",
-    "Icon Emoji": "아이콘 이모지",
-    "Channel Name": "채널 이름",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Webhook에 대한 설명: {0}",
-    aboutChannelName: "Webhook 채널을 무시하려면 {0} 채널 이름칸에 채널 이름을 입력해주세요. 예: #기타-채널",
-    aboutKumaURL: "Uptime Kuma URL칸을 공백으로 두면 기본적으로 Github Project 페이지로 설정해요.",
-    emojiCheatSheet: "이모지 목록 시트: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (50개 이상 알림 서비스)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "유저 키",
-    Device: "디바이스",
-    "Message Title": "메시지 제목",
-    "Notification Sound": "알림음",
-    "More info on:": "자세한 정보: {0}",
-    pushoverDesc1: "긴급 우선 순위 (2)는 재시도 사이에 기본적으로 30초의 타임아웃이 있고, 1시간 후에 만료되어요.",
-    pushoverDesc2: "다른 장치에 알림을 보내려면 장치칸을 입력해주세요.",
-    "SMS Type": "SMS 종류",
-    octopushTypePremium: "프리미엄 (빠름) - 알림 기능에 적합해요)",
-    octopushTypeLowCost: "저렴한 요금 (느림) - 가끔 차단될 수 있어요)",
-    "Check octopush prices": "{0}에서 Octopush 가격을 확인할 수 있어요.",
-    octopushPhoneNumber: "휴대전화 번호 (intl format, 예시: +821023456789) ",
-    octopushSMSSender: "보내는 사람 이름 : 3-11개의 영숫자 및 여백공간 (a-z, A-Z, 0-9)",
-    "LunaSea Device ID": "LunaSea 장치 ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "예: {0}",
-    "Read more:": "더 보기: {0}",
-    "Status:": "상태: {0}",
-    "Read more": "더 보기",
-    appriseInstalled: "Apprise가 설치되어있어요.",
-    appriseNotInstalled: "Apprise가 설치되어있지 않아요. {0}",
-    "Access Token": "액세스 토큰",
-    "Channel access token": "채널 액세스 토큰",
-    "Line Developers Console": "Line 개발자 콘솔",
-    lineDevConsoleTo: "Line 개발자 콘솔 - {0}",
-    "Basic Settings": "기본 설정 메뉴",
-    "User ID": "사용자 ID",
-    "Messaging API": "Messaging API 메뉴",
-    wayToGetLineChannelToken: "먼저 {0}에 액세스하고, 공급자 및 채널 (Messaging API)을 만든 다음, 각 메뉴 밑에 언급된 메뉴에서 채널 액세스 토큰과 사용자 ID를 얻을 수 있어요.",
-    "Icon URL": "아이콘 URL",
-    aboutIconURL: "\"아이콘 URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
-    aboutMattermostChannelName: "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
-    promosmsTypeFlash: "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
-    promosmsTypeFull: "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
-    promosmsTypeSpeed: "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
-    promosmsPhoneNumber: "전화 번호 (폴란드 수신자라면 지역번호를 적지 않아도 되어요.)",
-    promosmsSMSSender: "SMS 보내는 사람 이름 : 미리 등록된 이름 혹은 기본값 중 하나예요: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Primary Base URL": "기본 URL",
-    "Push URL": "Push URL",
-    needPushEvery: "이 URL을 {0} 초 마다 호출할 수 있어요.",
-    pushOptionalParams: "선택적 파라미터: {0}",
-    emailCustomSubject: "커스텀 주제",
-    clicksendsms: "ClickSend SMS",
-    checkPrice: "{0} 가격 확인:",
-    apiCredentials: "API 인증정보",
-    octopushLegacyHint: "Octopush 레거시 버전 (2011-2020) 을 사용하시나요? 아니면 새 버전을 사용하시나요?",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (http(s):// 와 함께 적어주세요. 그리고 포트 번호는 선택적 입니다.)",
-    "Internal Room Id": "내부 방 ID",
-    matrixDesc1: "Matrix 클라이언트 방 설정의 고급 섹션에서 내부 방 ID를 찾을 수 있어요. 내부 방 ID는 이렇게 생겼답니다: !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "사용자의 모든 방에 대한 엑세스가 허용될 수 있어서 새로운 사용자를 만들고 원하는 방에만 초대한 후 엑세스 토큰을 사용하는 것이 좋아요. {0} 이 명령어를 통해 엑세스 토큰을 얻을 수 있어요.",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "요청 Headers의 JSON 형식이 올바르지 않아요: ",
-    BodyInvalidFormat: "요청 Body의 JSON 형식이 올바르지 않아요: ",
-    "Monitor History": "모니터링 기록",
-    clearDataOlderThan: "모니터링 기록을 {0}일 동안 저장해요.",
-    PasswordsDoNotMatch: "비밀번호가 일치하지 않아요.",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "스팀 게임 서버를 모니터링하려면 Steam Web API 키가 필요해요. API 키는 하단 웹사이트에서 등록할 수 있어요: ",
-    "Current User": "현재 사용자",
-    recent: "최근",
-    Done: "완료",
-    Info: "정보",
-    Security: "보안",
-    "Steam API Key": "스팀 API 키",
-    "Shrink Database": "데이터베이스 축소",
-    "Pick a RR-Type...": "RR-Type을 골라주세요...",
-    "Pick Accepted Status Codes...": "상태 코드를 골라주세요...",
-    Default: "기본",
-    "HTTP Options": "HTTP 옵션",
-    "Create Incident": "인시던트 만들기",
-    Title: "제목",
-    Content: "내용",
-    Style: "스타일",
-    info: "정보",
-    warning: "주의",
-    danger: "경고",
-    primary: "기본",
-    light: "화이트",
-    dark: "다크",
-    Post: "게시",
-    "Please input title and content": "제목과 내용을 작성해주세요.",
-    Created: "생성 날짜",
-    "Last Updated": "마지막 업데이트",
-    Unpin: "제거",
-    "Switch to Light Theme": "화이트 테마로 전환",
-    "Switch to Dark Theme": "다크 테마로 전환",
-    "Show Tags": "태그 보이기",
-    "Hide Tags": "태그 숨기기",
-    Description: "설명",
-    "No monitors available.": "모니터링이 없어요.",
-    "Add one": "추가하기",
-    "No Monitors": "모니터링 없음",
-    "Untitled Group": "이름없는 그룹",
-    Services: "서비스",
-    Discard: "취소",
-    Cancel: "취소",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "SQLite 데이터베이스 VACUUM을 트리거해요. 만약 데이터베이스가 1.10.0 버전 이후에 생성되었다면 AUTO_VACUUM이 설정되어 있어 이 작업은 필요 없을 거에요.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Usename (webapi_ 접두사 포함)",
-    serwersmsAPIPassword: "API 비밀번호",
-    serwersmsPhoneNumber: "휴대전화 번호",
-    serwersmsSenderName: "보내는 사람 이름 (customer portal를 통해 가입된 정보)",
-    stackfield: "Stackfield",
-    dnsPortDescription: "DNS 서버 포트, 기본값은 53 이에요. 포트는 언제나 변경할 수 있어요.",
-    PushByTechulus: "Push by Techulus",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    topic: "Topic",
-    topicExplanation: "모니터링할 MQTT Topic",
-    successMessage: "성공 메시지",
-    successMessageExplanation: "성공으로 간주되는 MQTT 메시지",
-    error: "오류",
-    critical: "크리티컬",
-    Customize: "커스터마이즈",
-    "Custom Footer": "커스텀 Footer",
-    "Custom CSS": "커스텀 CSS",
-    smtpDkimSettings: "DKIM 설정",
-    smtpDkimDesc: "사용 방법은 DKIM {0}를 참조하세요.",
-    documentation: "문서",
-    smtpDkimDomain: "도메인 이름",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "해시 알고리즘 (선택)",
-    smtpDkimheaderFieldNames: "서명할 헤더 키 (선택)",
-    smtpDkimskipFields: "서명하지 않을 헤더 키 (선택)",
-    wayToGetPagerDutyKey: "Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요.",
-    "Integration Key": "Integration 키",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "자동 해결 혹은 승인",
-    "do nothing": "아무것도 하지 않기",
-    "auto acknowledged": "자동 승인 (acknowledged)",
-    "auto resolve": "자동 해결 (resolve)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "환경변수",
-    alertaApiKey: "API 키",
-    alertaAlertState: "경고 상태",
-    alertaRecoverState: "해결된 상태",
-    deleteStatusPageMsg: "정말 이 상태 페이지를 삭제할까요?",
-    Proxies: "프록시",
-    default: "Default",
-    enabled: "활성화",
-    setAsDefault: "기본 프록시로 설정",
-    deleteProxyMsg: "정말 이 프록시를 모든 모니터링에서 삭제할까요?",
-    proxyDescription: "프록시가 작동하려면 모니터에 할당되어야 해요.",
-    enableProxyDescription: "이 프록시는 활성화될 때까지 영향을 미치지 않아요. 활성화 상태에 따라 모든 모니터에서 프록시를 일시정지할 수 있어요.",
-    setAsDefaultProxyDescription: "새로 추가하는 모든 모니터링에 이 프록시를 기본적으로 활성화해요. 각 모니터에 대해 별도로 프록시를 비활성화할 수 있어요.",
-    "Certificate Chain": "인증서 체인",
-    Valid: "유효",
-    Invalid: "유효하지 않음",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "휴대전화 번호",
-    TemplateCode: "템플릿 코드",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "SMS 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "웹훅 URL",
-    SecretKey: "Secret Key",
-    "For safety, must use secret key": "안전을 위해 꼭 Secret Key를 사용하세요.",
-    "Device Token": "기기 Token",
-    Platform: "플랫폼",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "재시도",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "프록시 설정",
-    "Proxy Protocol": "프록시 프로토콜",
-    "Proxy Server": "프록시 서버",
-    "Proxy server has authentication": "프록시 서버에 인증 절차가 있음",
-    User: "사용자",
-    Installed: "설치됨",
-    "Not installed": "설치되어 있지 않음",
-    Running: "작동 중",
-    "Not running": "작동하고 있지 않음",
-    "Remove Token": "토큰 삭제",
-    Start: "시작",
-    Stop: "정지",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "새로운 상태 페이지 만들기",
-    Slug: "주소",
-    "Accept characters:": "허용되는 문자열:",
-    startOrEndWithOnly: "{0}로 시작하거나 끝나야 해요.",
-    "No consecutive dashes": "연속되는 대시는 허용되지 않아요",
-    Next: "다음",
-    "The slug is already taken. Please choose another slug.": "이미 존재하는 주소에요. 다른 주소를 사용해 주세요.",
-    "No Proxy": "프록시 없음",
-    Authentication: "인증",
-    "HTTP Basic Auth": "HTTP 인증",
-    "New Status Page": "새로운 상태 페이지",
-    "Page Not Found": "페이지를 찾을 수 없어요",
-    "Reverse Proxy": "리버스 프록시",
-    Backup: "백업",
-    About: "정보",
-    wayToGetCloudflaredURL: "({0}에서 Cloudflare 다운로드 하기)",
-    cloudflareWebsite: "Cloudflare 웹사이트",
-    "Message:": "메시지:",
-    "Don't know how to get the token? Please read the guide:": "토큰을 얻는 방법은 이 가이드를 확인해주세요:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Cloudflare Tunnel를 연결하면 현재 연결이 끊길 수 있어요. 정말 중지할까요? 비밀번호를 입력해 확인하세요.",
-    "Other Software": "다른 소프트웨어",
-    "For example: nginx, Apache and Traefik.": "nginx, Apache, Traefik 등을 사용할 수 있어요.",
-    "Please read": "이 문서를 참조하세요:",
-    "Subject:": "Subject:",
-    "Valid To:": "Valid To:",
-    "Days Remaining:": "남은 일수:",
-    "Issuer:": "Issuer:",
-    "Fingerprint:": "Fingerprint:",
-    "No status pages": "상태 페이지 없음",
-    "Domain Name Expiry Notification": "도메인 이름 만료 알림",
-    Proxy: "프록시",
-    "Date Created": "생성된 날짜",
-    onebotHttpAddress: "OneBot HTTP 주소",
-    onebotMessageType: "OneBot 메시지 종류",
-    onebotGroupMessage: "그룹 메시지",
-    onebotPrivateMessage: "개인 메시지",
-    onebotUserOrGroupId: "그룹/사용자 ID",
-    onebotSafetyTips: "안전을 위해 Access 토큰을 설정하세요.",
-    "PushDeer Key": "PushDeer 키",
-    "Footer Text": "Footer 문구",
-    "Show Powered By": "Powered By 문구 표시하기",
-    "Domain Names": "도메인 이름",
-    signedInDisp: "{0} 로그인됨",
-    signedInDispDisabled: "인증 비활성화됨.",
-    "Certificate Expiry Notification": "인증서 만료 알림",
-    "API Username": "API 사용자 이름",
-    "API Key": "API 키",
-    "Recipient Number": "받는 사람 번호",
-    "From Name/Number": "발신자 이름/번호",
-    "Leave blank to use a shared sender number.": "공유 발신자 번호를 사용하려면 공백으로 두세요.",
-    "Octopush API Version": "Octopush API 버전",
-    "Legacy Octopush-DM": "레거시 Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "제어판 HTTP API credentials 에서 \"API key\"",
-    octopushLogin: "제어판 HTTP API credentials 에서 \"Login\"",
-    promosmsLogin: "API 로그인 이름",
-    promosmsPassword: "API 비밀번호",
-    "pushoversounds pushover": "Pushover (기본)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "진동만",
-    "pushoversounds none": "없음 (무음)",
-    pushyAPIKey: "비밀 API 키",
-    pushyToken: "기기 토큰",
-    "Show update if available": "사용 가능한 경우에 업데이트 표시",
-    "Also check beta release": "베타 릴리즈 확인",
-    "Using a Reverse Proxy?": "리버스 프록시를 사용하시나요?",
-    "Check how to config it for WebSocket": "웹소켓 대한 설정 방법",
-    "Steam Game Server": "스팀 게임 서버",
-    "Most likely causes:": "원인:",
-    "The resource is no longer available.": "더 이상 사용할 수 없어요...",
-    "There might be a typing error in the address.": "주소에 오탈자가 있을 수 있어요.",
-    "What you can try:": "해결 방법:",
-    "Retype the address.": "주소 다시 입력하기",
-    "Go back to the previous page.": "이전 페이지로 돌아가기",
-    "Coming Soon": "Coming Soon...",
-    wayToGetClickSendSMSToken: "{0}에서 API 사용자 이름과 키를 얻을 수 있어요.",
-};
diff --git a/src/languages/nb-NO.js b/src/languages/nb-NO.js
deleted file mode 100644
index 96f71d97..00000000
--- a/src/languages/nb-NO.js
+++ /dev/null
@@ -1,285 +0,0 @@
-export default {
-    languageName: "Norsk",
-    checkEverySecond: "Sjekk hvert {0} sekund.",
-    retryCheckEverySecond: "Prøv igjen hvert {0} sekund.",
-    retriesDescription: "Maksimalt antall forsøk før tjenesten er merket som nede og et varsel sendes",
-    ignoreTLSError: "Ignorer TLS/SSL-feil for HTTPS-nettsteder",
-    upsideDownModeDescription: "Snu statusen opp ned. Hvis tjenesten er tilgjengelig, er den NEDE.",
-    maxRedirectDescription: "Maksimalt antall viderekoblinger å følge. Sett til 0 for å deaktivere viderekoblinger.",
-    acceptedStatusCodesDescription: "Velg statuskoder som anses som en vellykket respons.",
-    passwordNotMatchMsg: "Passordene stemmer ikke overens.",
-    notificationDescription: "Varsler må tilordnes en overvåkning for å fungere.",
-    keywordDescription: "Søk etter nøkkelord i ren HTML eller JSON. Søket skiller mellom store og små bokstaver.",
-    pauseDashboardHome: "Pause",
-    deleteMonitorMsg: "Er du sikker på at du vil slette denne overvåkningen?",
-    deleteNotificationMsg: "Er du sikker på at du vil slette dette varselet for alle overvåkningene?",
-    resolverserverDescription: "Cloudflare er standardserveren. Du kan endre DNS-serveren når som helst.",
-    rrtypeDescription: "Velg RR-typen du vil overvåke",
-    pauseMonitorMsg: "Er du sikker på at du vil sette på pause?",
-    enableDefaultNotificationDescription: "For hver ny overvåkning vil denne varslingen være aktivert som standard. Du kan fortsatt deaktivere varselet separat for hver overvåkning.",
-    clearEventsMsg: "Er du sikker på at du vil slette alle hendelser for denne overvåkningen?",
-    clearHeartbeatsMsg: "Er du sikker på at du vil slette alle hjerteslag for denne overvåkningen?",
-    confirmClearStatisticsMsg: "Er du sikker på at du vil slette ALL statistikk?",
-    importHandleDescription: "Velg 'Hopp over eksisterende' hvis du vil hoppe over hver overvåkning eller varsel med samme navn. 'Overskriv' sletter alle eksisterende overvåkninger og varsler.",
-    confirmImportMsg: "Er du sikker på at du vil importere denne sikkerhetskopien? Sørg for at du har valgt riktig importalternativ.",
-    twoFAVerifyLabel: "Skriv inn tokenet ditt for å bekrefte at 2FA fungerer",
-    tokenValidSettingsMsg: "Token er gyldig! Du kan nå lagre 2FA-innstillingene.",
-    confirmEnableTwoFAMsg: "Er du sikker på at du vil aktivere 2FA?",
-    confirmDisableTwoFAMsg: "Er du sikker på at du vil deaktivere 2FA?",
-    Settings: "Innstillinger",
-    Dashboard: "Dashboard",
-    "New Update": "Ny Oppdatering",
-    Language: "Språk",
-    Appearance: "Utseende",
-    Theme: "Tema",
-    General: "Generelt",
-    Version: "Versjon",
-    "Check Update On GitHub": "Sjekk oppdatering på GitHub",
-    List: "Liste",
-    Add: "Legg til",
-    "Add New Monitor": "Legg til ny overvåkning",
-    "Quick Stats": "Statistikk",
-    Up: "Oppe",
-    Down: "Nede",
-    Pending: "Avventer",
-    Unknown: "Ukjent",
-    Pause: "Pause",
-    Name: "Navn",
-    Status: "Status",
-    DateTime: "Dato tid",
-    Message: "Melding",
-    "No important events": "Ingen viktige hendelser",
-    Resume: "Fortsett",
-    Edit: "Rediger",
-    Delete: "Slett",
-    Current: "Nåværende",
-    Uptime: "Oppetid",
-    "Cert Exp.": "Sertifikat utløper",
-    day: "dag | dager",
-    "-day": "-dag",
-    hour: "time",
-    "-hour": "-time",
-    Response: "Respons",
-    Ping: "Ping",
-    "Monitor Type": "Overvåkningstype",
-    Keyword: "Stikkord",
-    "Friendly Name": "Vennlig navn",
-    URL: "URL",
-    Hostname: "Vertsnavn",
-    Port: "Port",
-    "Heartbeat Interval": "Hjerteslagsintervall",
-    Retries: "Forsøk",
-    "Heartbeat Retry Interval": "Hjerteslagsforsøkintervall",
-    Advanced: "Avansert",
-    "Upside Down Mode": "Opp-ned-modus",
-    "Max. Redirects": "Maks. viderekoblinger",
-    "Accepted Status Codes": "Godkjente statuskoder",
-    Save: "Lagre",
-    Notifications: "Varsler",
-    "Not available, please setup.": "Ikke tilgjengelig, venligst sett opp.",
-    "Setup Notification": "Sett opp varsel",
-    Light: "Lys",
-    Dark: "Mørk",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
-    Normal: "Normal",
-    Bottom: "Bunn",
-    None: "Ingen",
-    Timezone: "Tidssone",
-    "Search Engine Visibility": "Søkemotor-synlighet",
-    "Allow indexing": "Tillat indeksering",
-    "Discourage search engines from indexing site": "Fraråd søkemotorer fra å indeksere nettstedet",
-    "Change Password": "Endre passord",
-    "Current Password": "Nåværende passord",
-    "New Password": "Nytt passord",
-    "Repeat New Password": "Gjenta nytt passord",
-    "Update Password": "Oppdater passord",
-    "Disable Auth": "Deaktiver autentisering",
-    "Enable Auth": "Aktiver autentisering",
-    "disableauth.message1": "Er du sikker på at du vil <strong>deaktiver autentisering</strong>?",
-    "disableauth.message2": "Dette er for <strong>de som har tredjepartsautorisering</strong> foran Uptime Kuma, for eksempel Cloudflare Access.",
-    "Please use this option carefully!": "Vennligst vær forsiktig.",
-    Logout: "Logg ut",
-    Leave: "Forlat",
-    "I understand, please disable": "Jeg forstår, vennligst deaktiver",
-    Confirm: "Bekreft",
-    Yes: "Ja",
-    No: "Nei",
-    Username: "Brukernavn",
-    Password: "Passord",
-    "Remember me": "Husk meg",
-    Login: "Logg inn",
-    "No Monitors, please": "Ingen overvåkning, vær så snill",
-    "add one": "legg til en",
-    "Notification Type": "Meldingstype",
-    Email: "E-post",
-    Test: "Test",
-    "Certificate Info": "Sertifikatinformasjon",
-    "Resolver Server": "DNS-server",
-    "Resource Record Type": "DNS-posttype",
-    "Last Result": "Siste resultat",
-    "Create your admin account": "Opprett en administratorkonto",
-    "Repeat Password": "Gjenta passord",
-    "Import Backup": "Importer sikkerhetskopi",
-    "Export Backup": "Eksporter sikkerhetskopi",
-    Export: "Eksporter",
-    Import: "Importer",
-    respTime: "Svartid (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Standard aktivert",
-    "Apply on all existing monitors": "Anvend for alle eksisterende overvåkninger",
-    Create: "Opprett",
-    "Clear Data": "Slett data",
-    Events: "Hendelser",
-    Heartbeats: "Hjerteslag",
-    "Auto Get": "Auto Hent",
-    backupDescription: "Du kan sikkerhetskopiere alle overvåkninger og alle varsler til en JSON-fil.",
-    backupDescription2: "PS: Historikk og hendelsesdata er ikke inkludert.",
-    backupDescription3: "Følsomme data som varslingstokener er inkludert i eksportfilen. Vennligst oppbevar dem sikkert.",
-    alertNoFile: "Velg en fil som skal importeres.",
-    alertWrongFileType: "Velg en JSON-fil.",
-    "Clear all statistics": "Fjern all statistikk",
-    "Skip existing": "Hopp over eksisterende",
-    Overwrite: "Overskriv",
-    Options: "Alternativer",
-    "Keep both": "Behold begge",
-    "Verify Token": "Bekreft token",
-    "Setup 2FA": "Konfigurer 2FA",
-    "Enable 2FA": "Aktiver 2FA",
-    "Disable 2FA": "Deaktiver 2FA",
-    "2FA Settings": "2FA Innstillinger",
-    "Two Factor Authentication": "To-faktor autentisering",
-    Active: "Aktiv",
-    Inactive: "Inaktiv",
-    Token: "Token",
-    "Show URI": "Vis URI",
-    Tags: "Etiketter",
-    "Add New below or Select...": "Legg til nytt nedenfor eller Velg ...",
-    "Tag with this name already exist.": "Etikett med dette navnet eksisterer allerede.",
-    "Tag with this value already exist.": "Etikett med denne verdien eksisterer allerede.",
-    color: "farge",
-    "value (optional)": "verdi (valgfritt)",
-    Gray: "Grå",
-    Red: "Rød",
-    Orange: "Oransje",
-    Green: "Grønn",
-    Blue: "Blå",
-    Indigo: "Indigo",
-    Purple: "Lilla",
-    Pink: "Rosa",
-    "Search...": "Søk...",
-    "Avg. Ping": "Gj.sn. Ping",
-    "Avg. Response": "Gj.sn. Respons",
-    "Entry Page": "Oppføringsside",
-    statusPageNothing: "Ingenting her, vennligst legg til en gruppe eller en overvåkning.",
-    "No Services": "Ingen tjenester",
-    "All Systems Operational": "Alle systemer i drift",
-    "Partially Degraded Service": "Delvis degradert tjeneste",
-    "Degraded Service": "Degradert tjeneste",
-    "Add Group": "Legg til gruppe",
-    "Add a monitor": "Legg til en overvåkning",
-    "Edit Status Page": "Rediger statusside",
-    "Go to Dashboard": "Gå til Dashboard",
-    "Status Page": "Statusside",
-    "Status Pages": "Statusside",
-    defaultNotificationName: "Min {notification} varsling ({number})",
-    here: "her",
-    Required: "Obligatorisk",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Du kan få et token fra {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
-    wayToGetTelegramChatID: "Du kan få chat-ID-en din ved å sende en melding til boten og gå til denne nettadressen for å se chat_id:",
-    "YOUR BOT TOKEN HERE": "DITT BOT TOKEN HER",
-    chatIDNotFound: "Chat-ID ble ikke funnet. Send en melding til denne boten først",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Innholdstype",
-    webhookJsonDesc: "{0} er bra for alle moderne HTTP-servere som express.js",
-    webhookFormDataDesc: "{multipart} er bra for PHP. JSON trenger å bli analysert med {decodeFunction}",
-    smtp: "E-post (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignorer TLS feilmelding",
-    "From Email": "Fra E-post",
-    "To Email": "Til E-post",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Du kan få denne ved å gå til Serverinnstillinger -> Integrasjoner -> Opprett en Webhook",
-    "Bot Display Name": "Bot Visningsnavn",
-    "Prefix Custom Message": "Prefiks tilpasset melding",
-    "Hello @everyone is...": "Hei {'@'}everyone det er...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Du kan lære hvordan du oppretter en webhook-URL {0}.",
-    signal: "Signal",
-    Number: "Nummer",
-    Recipients: "Mottakere",
-    needSignalAPI: "Du må ha en Signal-klient med REST API.",
-    wayToCheckSignalURL: "Du kan sjekke denne nettadressen for å se hvordan du konfigurerer en:",
-    signalImportant: "VIKTIG: Du kan ikke blande grupper og nummere i mottakere!",
-    gotify: "Gotify",
-    "Application Token": "Application Token",
-    "Server URL": "Server URL",
-    Priority: "Prioritet",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Kanal navn",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Mer informasjon om webhooks på: {0}",
-    aboutChannelName: "Skriv inn kanalnavnet på {0} Kanalnavn-feltet hvis du vil omgå webhook-kanalen. Eks: #other-channel",
-    aboutKumaURL: "Hvis du lar Uptime Kuma URL feltet være blank, den blir som standard til Github-siden for dette prosjektet.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Bruker-nøkkel",
-    Device: "Enhet",
-    "Message Title": "Meldingstittel",
-    "Notification Sound": "Notifikasjonslyd",
-    "More info on:": "Mer info på: {0}",
-    pushoverDesc1: "Nødsprioritet (2) har en standard 30 sekunders tidsavbrudd mellom forsøk og vil utløpe etter 1 time.",
-    pushoverDesc2: "Hvis du vil sende varsler til forskjellige enheteter, fyll ut Enhet-feltet.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Raskt - anbefalt for varsling)",
-    octopushTypeLowCost: "Lav kostnad (Sakte, noen ganger blokkert av leverandør)",
-    "Check octopush prices": "Sjekk octopush priser {0}.",
-    octopushPhoneNumber: "Telefonnummer (intl format, eg : +4791234567) ",
-    octopushSMSSender: "SMS Avsendernavn : 3-11 alphanumeriske tegn og mellomrom (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Enhet ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Eksempel: {0}",
-    "Read more:": "Les mer: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Les mer",
-    appriseInstalled: "Apprise er installert.",
-    appriseNotInstalled: "Apprise ikke installert. {0}",
-    "Access Token": "Tilgangs-Token",
-    "Channel access token": "Kanal tilgangs-token",
-    "Line Developers Console": "Line Utviklserskonsoll",
-    lineDevConsoleTo: "Line Utviklserskonsoll - {0}",
-    "Basic Settings": "Grunnleggende instillinger",
-    "User ID": "Bruker-ID",
-    "Messaging API": "Meldings-API",
-    wayToGetLineChannelToken: "Først, få tilgang til {0}, lag en leverandør og kanal (Meldings-API),  deretter kan du hente kanaltilgangs-token og bruker id fra menu-valgene nevnt over.",
-    "Icon URL": "Ikon URL",
-    aboutIconURL: "Du kan gi en link til et bilde i \"Ikon URL\" for å overskrive det standard profilbildet. Vil ikke bli brukt hvis Ikon Emoji ikke er satt.",
-    aboutMattermostChannelName: "Du kan overskrive standardkanalen som webhook-en poster i ved å skrive enn kanalnavnet i \"Kanalnavn\" feltet. Dette må være skrudd på i Mattermost webhook-instillingene. Eks: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - billig, men treg og ofte overbelastet. Begrenset til bare polske mottakere.",
-    promosmsTypeFlash: "SMS FLASH - Melding vil automatisk vises på mottakker-enhet. Begrenset til bare polske mottakere.",
-    promosmsTypeFull: "SMS FULL - Premuimnivå SMS. Du kan bruke dit avsendernavn (Du må registerere et navn først). Pålitelig for alle varslinger.",
-    promosmsTypeSpeed: "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
-    promosmsPhoneNumber: "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
-    promosmsSMSSender: "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-};
diff --git a/src/languages/nl-NL.js b/src/languages/nl-NL.js
deleted file mode 100644
index 290b32f6..00000000
--- a/src/languages/nl-NL.js
+++ /dev/null
@@ -1,531 +0,0 @@
-export default {
-    languageName: "Nederlands",
-    checkEverySecond: "Controleer elke {0} seconden.",
-    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?",
-    resolverserverDescription: "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?",
-    enableDefaultNotificationDescription: "Voor elke nieuwe monitor wordt deze melding standaard ingeschakeld. U kunt de melding nog steeds afzonderlijk uitschakelen voor elke monitor.",
-    clearEventsMsg: "Weet je zeker dat je alle evenementen voor deze monitor wilt verwijderen?",
-    clearHeartbeatsMsg: "Weet je zeker dat je alle heartbeats voor deze monitor wilt verwijderen?",
-    confirmClearStatisticsMsg: "Weet u zeker dat u alle statistieken wilt verwijderen?",
-    twoFAVerifyLabel: "Voer uw 2FA controle token in voor verificatie",
-    tokenValidSettingsMsg: "Token is geldig! U kunt nu de 2FA-instellingen opslaan.",
-    confirmEnableTwoFAMsg: "Weet je zeker dat je 2FA wilt inschakelen?",
-    confirmDisableTwoFAMsg: "Weet je zeker dat je 2FA wilt uitschakelen?",
-    Settings: "Instellingen",
-    Dashboard: "Dashboard",
-    "New Update": "Nieuwe update",
-    Language: "Taal",
-    Appearance: "Weergave",
-    Theme: "Thema",
-    General: "Algemeen",
-    Version: "Versie",
-    "Check Update On GitHub": "Controleer voor updates 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.",
-    day: "dag | dagen",
-    "-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": "Authenticatie uitschakelen",
-    "Enable Auth": "Authenticatie inschakelen",
-    "disableauth.message1": "Weet je zeker dat je <strong>authenticatie wilt uitschakelen</strong>?",
-    "disableauth.message2": "Er zijn omstandigheden waarbij je <strong>authenticatie door derden wilt implementeren</strong> voor Uptime Kuma, zoals Cloudflare Access, Authelia of andere authenticatiemechanismen.",
-    "Please use this option carefully!": "Gebruik deze optie zorgvuldig!",
-    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",
-    Export: "Exporteren",
-    Import: "Importeren",
-    respTime: "reactietijd (ms)",
-    notAvailableShort: "N.v.t.",
-    "Default enabled": "Default enabled",
-    "Apply on all existing monitors": "Pas toe op alle bestaande monitors",
-    Create: "Aanmaken",
-    "Clear Data": "Data wissen",
-    Events: "Gebeurtenissen",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    backupDescription: "U kunt een back-up maken van alle monitoren en alle meldingen in een JSON-bestand.",
-    backupDescription2: "PS: Geschiedenis- en gebeurtenisgegevens zijn niet inbegrepen.",
-    backupDescription3: "Gevoelige gegevens zoals melding tokens zijn opgenomen in het exportbestand, houd het veilig opgeslagen.",
-    alertNoFile: "Selecteer een bestand om te importeren.",
-    alertWrongFileType: "Selecteer een JSON-bestand.",
-    "Verify Token": "Controleer token",
-    "Setup 2FA": "2FA instellingen",
-    "Enable 2FA": "Schakel 2FA in",
-    "Disable 2FA": "Schakel 2FA uit",
-    "2FA Settings": "2FA-instellingen",
-    "Two Factor Authentication": "Two Factor Authenticatie",
-    Active: "Actief",
-    Inactive: "Inactief",
-    "Also apply to existing monitors": "Voeg ook toe aan bestaande monitors",
-    Token: "Token",
-    "Show URI": "Toon URI",
-    "Clear all statistics": "Wis alle statistieken",
-    retryCheckEverySecond: "Probeer elke {0} seconden.",
-    importHandleDescription: "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.",
-    confirmImportMsg: "Weet je zeker dat je dit bestand wilt importeren?",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "Importeer Backup",
-    "Export Backup": "Exporteer Backup",
-    "Skip existing": "Sla bestaande over",
-    Overwrite: "Overschrijf",
-    Options: "Opties",
-    "Keep both": "Bewaar beide",
-    Tags: "Labels",
-    "Add New below or Select...": "Voeg nieuwe toe of selecteer...",
-    "Tag with this name already exist.": "Label met deze naam bestaat al",
-    "Tag with this value already exist.": "Label met deze waarde bestaat al",
-    color: "Kleur",
-    "value (optional)": "waarde (optioneel)",
-    Gray: "Grijs",
-    Red: "Rood",
-    Orange: "Oranje",
-    Green: "Groen",
-    Blue: "Blauw",
-    Indigo: "Indigo",
-    Purple: "Paars",
-    Pink: "Roze",
-    "Search...": "Zoeken...",
-    "Avg. Ping": "Gemiddelde Ping",
-    "Avg. Response": "Gemiddelde Response",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Niets hier, voeg een groep of monitor toe.",
-    "No Services": "Geen diensten",
-    "All Systems Operational": "Alle systemen operationeel",
-    "Partially Degraded Service": "Gedeeltelijk verminderde prestaties",
-    "Degraded Service": "Verminderde prestaties",
-    "Add Group": "Voeg groep toe",
-    "Add a monitor": "Voeg monitor toe",
-    "Edit Status Page": "Wijzig status pagina",
-    "Go to Dashboard": "Ga naar Dashboard",
-    "Status Page": "Status Pagina",
-    "Status Pages": "Status Pagina",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    Method: "Methode",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "The request headers is geen geldige JSON: ",
-    BodyInvalidFormat: "De request body is geen geldige JSON: ",
-    "Primary Base URL": "Hoofd Basis URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Je moet deze URL elke {0} seconden aanroepen.",
-    pushOptionalParams: "Optionele parameters: {0}",
-    defaultNotificationName: "Mijn {notification} Alert ({number})",
-    here: "hier",
-    Required: "Verplicht",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Je kunt een token krijgen van {0}.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Ondersteuning Directe Chat / Groep / Kanaal Chat ID",
-    wayToGetTelegramChatID: "Je kunt je CHAT ID krijgen door een bericht te sturen naar de bot en naar deze URL te gaan om het chat_id te bekijken:",
-    "YOUR BOT TOKEN HERE": "DE BOT TOKEN HIER",
-    chatIDNotFound: "Chat ID is niet gevonden; stuur eerst een bericht naar de bot",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} is goed voor een moderne HTTP server zoals Express.js",
-    webhookFormDataDesc: "{multipart} is goed voor PHP. De JSON moet worden ontleed met {decodeFunction}",
-    secureOptionNone: "Geen / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Negeer TLS Error",
-    "From Email": "Van Email",
-    emailCustomSubject: "Aangepast Onderwerp",
-    "To Email": "Naar Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Je kunt dit krijgen door te gaan naar Server Instellingen -> Integraties -> Creëer Webhook",
-    "Bot Display Name": "Bot Weergave Naam",
-    "Prefix Custom Message": "Prefix Aangepast Bericht",
-    "Hello @everyone is...": "Hallo {'@'}iedereen is...",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Je kunt hier leren hoe je een webhook URL kunt maken {0}.",
-    Number: "Nummer",
-    Recipients: "Ontvangers",
-    needSignalAPI: "Je moet een signal client met REST API hebben.",
-    wayToCheckSignalURL: "Je kunt op deze URL zien hoe je een kunt instellen:",
-    signalImportant: "BELANGRIJK: Je kunt groepen en nummers niet mengen in ontvangers!",
-    "Application Token": "Applicatie Token",
-    "Server URL": "Server URL",
-    Priority: "Prioriteit",
-    "Icon Emoji": "Icoon Emoji",
-    "Channel Name": "Kanaal Naam",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Meer info over Webhooks op: {0}",
-    aboutChannelName: "Voer de kanaal naam in op {0} Kannaal Naam veld als je het Webhook kanaal wilt omzeilen. Bv: #other-channel",
-    aboutKumaURL: "Als je de Uptime Kuma URL veld leeg laat, wordt standaard het GitHub project pagina weergegeven.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    PushByTechulus: "Push door Techulus",
-    clicksendsms: "ClickSend SMS",
-    GoogleChat: "Google Chat (Google Workspace alleen)",
-    "User Key": "Gebruikers sleutel",
-    Device: "Apparaat",
-    "Message Title": "Bericht Titel",
-    "Notification Sound": "Notificatie Geluid",
-    "More info on:": "Meer info op: {0}",
-    pushoverDesc1: "Nood prioriteit (2) heeft standaard een 30 seconden timeout tussen pogingen en verloopt na 1 uur.",
-    pushoverDesc2: "Vul het appraat veld in als je notificaties naar andere apparaten wilt versturen.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Snel - aangeraden voor te alarmeren)",
-    octopushTypeLowCost: "Low Cost (Langzaam - wordt soms geblokkeerd door operator)",
-    checkPrice: "Controleer {0} prijzen:",
-    apiCredentials: "API referenties",
-    octopushLegacyHint: "Wil je de legacy versie van Octopush (2011-2020) gebruiken of de nieuwe versie?",
-    "Check octopush prices": "Controleer Octopush prijzen {0}.",
-    octopushPhoneNumber: "Telefoon nummer (Int. formaat, eg : +33612345678) ",
-    octopushSMSSender: "SMS zender naam : 3-11 alfanumerieke karakters en spatie (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Apparaat ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Voorbeeld: {0}",
-    "Read more:": "Lees meer: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Lees meer",
-    appriseInstalled: "Apprise is geïnstalleerd.",
-    appriseNotInstalled: "Apprise is niet geïnstalleerd. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Kanaal access token",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Basis Instellingen",
-    "User ID": "Gebruiker ID",
-    "Messaging API": "Berichten API",
-    wayToGetLineChannelToken: "Begin met {0} te openen, creëer een provider en kanaal (Messaging API), dan kun je de kanaal access token en gebruikers ID van de hierboven genoemde menu items krijgen.",
-    "Icon URL": "Icoon URL",
-    aboutIconURL: "Je kunt een link om de standaard profiel afbeelding te overschrijving in \"Icoon URL\" meegeven. Dit wordt niet gebruikt als Icon Emoji is ingesteld.",
-    aboutMattermostChannelName: "Je kunt het standaard kanaal dat de Webhook plaatst overschijven door de kanaal naam in te vullen in het \"Channel Name\" veld. Dit moet worden ingeschakeld in de Mattermost Webhook instellingen. Bv. #ander-kanaal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - Goedkoop maar langzaam en vaak overbelast. Gelimiteerd tot Poolse ontvangers.",
-    promosmsTypeFlash: "SMS FLASH - Berichten worden automatisch weergegeven op het apparaat van de ontvanger. Gelimiteerd tot Poolse ontvangers.",
-    promosmsTypeFull: "SMS FULL - Premium tier van SMS, je kunt de ontvanger naam gebruiken (Je moet eerst de naam registreren). Betrouwbaar voor alarmeringen.",
-    promosmsTypeSpeed: "SMS SPEED - Hoogste prioriteit in systeem. Is veel sneller en betrouwbaarder maar kost meer (ongeveer twee keer zoveel als volle SMS prijs).",
-    promosmsPhoneNumber: "Telefoon nummer (voor Poolse ontvangers. Je kunt gebieds codes overslaan)",
-    promosmsSMSSender: "SMS Ontvanger naam : Voor geregistreerde naam of een van de standaarden: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (met http(s):// en optioneel poort)",
-    "Internal Room Id": "Interne Room ID",
-    matrixDesc1: "Je kunt de interne room ID vinden door in de geavanceerde sectie van de room instellingen in je Matrix client te kijken. Het zou moeten uitzien als !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Het wordt ten zeerste aanbevolen om een nieuwe gebruiker aan te maken en niet de access token van je account te gebruiken, aangezien dit volledige toegang geeft tot je account en alle kamers waar je lid van bent. Maak in plaats daarvan een nieuwe gebruiker aan en nodig deze alleen uit voor de ruimte waarin je de melding wilt ontvangen. Je kunt de access token krijgen door het volgende uit te voeren {0}",
-    "Monitor History": "Monitor Geschiedenis",
-    clearDataOlderThan: "Bewaar monitor geschiedenis voor {0} dagen.",
-    PasswordsDoNotMatch: "Wachtwoorden komen niet overeen",
-    records: "records",
-    "One record": "Een record",
-    steamApiKeyDescription: "Om een Steam Game Server te monitoren heb je een Steam Web-API key nodig. Je kunt hier je API key registreren: ",
-    "Current User": "Huidge Gebruiker",
-    topic: "Onderwerp",
-    topicExplanation: "MQTT onderwerp om te monitoren",
-    successMessage: "Succesbericht",
-    successMessageExplanation: "MQTT bericht dat als succes wordt beschouwd.",
-    recent: "Recent",
-    Done: "Klaar",
-    Info: "Info",
-    Security: "Beveiliging",
-    "Steam API Key": "Steam API Sleutel",
-    "Shrink Database": "Verklein Database",
-    "Pick a RR-Type...": "Kies een RR-Type...",
-    "Pick Accepted Status Codes...": "Kies geaccepteerde Status Codes...",
-    Default: "Standaard",
-    "HTTP Options": "HTTP Opties",
-    "Create Incident": "Creëer Incident",
-    Title: "Titel",
-    Content: "Content",
-    Style: "Stijl",
-    info: "info",
-    warning: "waarschuwing",
-    danger: "gevaar",
-    primary: "primair",
-    light: "licht",
-    dark: "donker",
-    Post: "Post",
-    "Please input title and content": "Voer alstublieft titel en content in",
-    Created: "Gemaakt",
-    "Last Updated": "Laatst Bijgewerkt",
-    Unpin: "Losmaken",
-    "Switch to Light Theme": "Wissel naar Licht Thema",
-    "Switch to Dark Theme": "Wissel naar Donker Thema",
-    "Show Tags": "Toon Labels",
-    "Hide Tags": "Verberg Labels",
-    Description: "Beschrijving",
-    "No monitors available.": "Geen monitors beschikbaar.",
-    "Add one": "Voeg een toe",
-    "No Monitors": "Geen Monitors",
-    "Untitled Group": "Naamloze Groep",
-    Services: "Diensten",
-    Discard: "Weggooien",
-    Cancel: "Annuleren",
-    "Powered by": "Mogelijk gemaakt door",
-    shrinkDatabaseDescription: "Activeer database VACUUM voor SQLite. Als de database na 1.10.0 aangemaakt is, dan staat AUTO_VACUUM al aan en is deze actie niet nodig.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Gebruikersnaam (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Wachtwoord",
-    serwersmsPhoneNumber: "Telefoon nummer",
-    serwersmsSenderName: "SMS Zender Naam (geregistreerd via klant portaal)",
-    stackfield: "Stackfield",
-    Customize: "Aanpassen",
-    "Custom Footer": "Aangepaste Footer",
-    "Custom CSS": "Aangepaste CSS",
-    smtpDkimSettings: "DKIM Instellingen",
-    smtpDkimDesc: "Refereer alsjeblieft naar Nodemailer DKIM {0} voor gebruik.",
-    documentation: "documentatie",
-    smtpDkimDomain: "Domein Naam",
-    smtpDkimKeySelector: "Sleutel Kiezer",
-    smtpDkimPrivateKey: "Prive Sleutel",
-    smtpDkimHashAlgo: "Hash Algoritme (Optioneel)",
-    smtpDkimheaderFieldNames: "Header sleutels om te ondertekenen (Optioneel)",
-    smtpDkimskipFields: "Header sleutels niet om te ondertekenen (Optioneel)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Eindpunt",
-    alertaEnvironment: "Omgeving",
-    alertaApiKey: "API Sleutel",
-    alertaAlertState: "Alert Staat",
-    alertaRecoverState: "Herstel Staat",
-    deleteStatusPageMsg: "Weet je zeker je deze status pagina wilt verwijderen?",
-    Proxies: "Proxies",
-    default: "Standaard",
-    enabled: "Ingeschakeld",
-    setAsDefault: "Stel in als standaard",
-    deleteProxyMsg: "Weet je zeker dat je deze proxy wilt verwijderen voor alle monitors?",
-    proxyDescription: "Proxies moeten worden toegewezen aan een monitor om te functioneren.",
-    enableProxyDescription: "Deze proxy heeft geen effect op monitor verzoeken totdat het is geactiveerd. Je kunt tijdelijk de proxy uitschakelen voor alle monitors voor activatie status.",
-    setAsDefaultProxyDescription: "Deze proxy wordt standaard aangezet voor alle nieuwe monitors. Je kunt nog steeds de proxy apart uitschakelen voor elke monitor.",
-    "Certificate Chain": "Certificaatketen",
-    Valid: "Geldig",
-    Invalid: "Ongeldig",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "TelefoonNummers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken",
-    "Device Token": "Apparaat Token",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Hoog",
-    Retry: "Opnieuw",
-    Topic: "Onderwerp",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Proxy instellen",
-    "Proxy Protocol": "Proxy Protocol",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Proxy server heeft authenticatie",
-    User: "Gebruiker",
-    Installed: "Geïnstalleerd",
-    "Not installed": "Niet geïnstalleerd",
-    Running: "Actief",
-    "Not running": "Niet actief",
-    "Remove Token": "Verwijder Token",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Voeg nieuwe status pagina toe",
-    Slug: "Slug",
-    "Accept characters:": "Geaccepteerde tekens:",
-    startOrEndWithOnly: "Start of eindig alleen met {0}",
-    "No consecutive dashes": "Geen opeenvolgende streepjes",
-    Next: "Volgende",
-    "The slug is already taken. Please choose another slug.": "De slug is al in gebruik. Kies een andere slug.",
-    "No Proxy": "Geen Proxy",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "Nieuwe Status Pagina",
-    "Page Not Found": "Pagina Niet gevonden",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Backup",
-    About: "Over",
-    wayToGetCloudflaredURL: "(Download cloudflared van {0})",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Bericht:",
-    "Don't know how to get the token? Please read the guide:": "Lees de uitleg als je niet weet hoe je een token krijgt:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "De huidge verbinding kan worden verbroken als je momenteel bent verbonden met Cloudflare Tunnel. Weet je zeker dat je het wilt stoppen? Typ je huidige wachtwoord om het te bevestigen.",
-    "Other Software": "Andere Software",
-    "For example: nginx, Apache and Traefik.": "Bijvoorbeeld: nginx, Apache and Traefik.",
-    "Please read": "Lees alstublieft",
-    "Subject:": "Onderwerp:",
-    "Valid To:": "Geldig Tot:",
-    "Days Remaining:": "Dagen Resterend:",
-    "Issuer:": "Uitgever:",
-    "Fingerprint:": "Vingerafruk:",
-    "No status pages": "Geen status pagina's",
-    Proxy: "Proxy",
-    "Date Created": "Datum Aangemaakt",
-    onebotHttpAddress: "OneBot HTTP Adres",
-    onebotMessageType: "OneBot Bericht Type",
-    onebotGroupMessage: "Groep",
-    onebotPrivateMessage: "Privé",
-    onebotUserOrGroupId: "Groep/Gebruiker ID",
-    onebotSafetyTips: "Voor de veiligheid moet een toegangssleutel worden ingesteld",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Footer Tekst",
-    "Show Powered By": "Laat \"Mogeljik gemaakt door\" zien",
-    "Domain Names": "Domein Namen",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    dnsPortDescription: "DNS-serverpoort. Standaard ingesteld op 53. Je kunt de poort op elk moment wijzigen.",
-    error: "fout",
-    critical: "kritisch",
-    wayToGetPagerDutyKey: "Je kunt dit krijgen door naar Service -> Service Directory -> (Selecteer een service) -> Integraties -> Integratie toevoegen te gaan. Hier kunt u zoeken naar \"Events API V2\". Meer informatie {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Automatisch oplossen of bevestigen",
-    "do nothing": "niets doen",
-    "auto acknowledged": "automatisch bevestigen",
-    "auto resolve": "automatisch oplossen",
-    Authentication: "authenticatie",
-    signedInDisp: "Aangemeld als {0}",
-    signedInDispDisabled: "Authenticatie uitgeschakeld.",
-    "Certificate Expiry Notification": "Melding over verlopen certificaat",
-    "Recipient Number": "Nummer ontvanger",
-    "From Name/Number": "Van naam/nummer",
-    "Leave blank to use a shared sender number.": "Laat leeg om een gedeeld afzendernummer te gebruiken.",
-    endpoint: "endpoint",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Device token",
-    "Show update if available": "Update weergeven indien beschikbaar",
-    "Also check beta release": "Controleer ook de bètaversies",
-    "Using a Reverse Proxy?": "Een reverse proxy gebruiken?",
-    "Check how to config it for WebSocket": "Controleer hoe je het configureert voor een WebSocket",
-    "Steam Game Server": "Steam gameserver",
-    "Most likely causes:": "Meest waarschijnlijke oorzaken:",
-    "The resource is no longer available.": "De paginabron is niet langer beschikbaar.",
-    "There might be a typing error in the address.": "Er zit een typefout in het de URL.",
-    "What you can try:": "Wat je kan proberen:",
-    "Retype the address.": "De URL controleren en/of opnnieuw typen.",
-    "Go back to the previous page.": "Terug naar de vorige pagina.",
-    "Coming Soon": "Binnenkort beschikbaar",
-    wayToGetClickSendSMSToken: "Je kan een  API Username en API Key krijgen vanuit {0} .",
-    "Connection String": "Connection String",
-    Query: "Query",
-    settingsCertificateExpiry: "TLS Certificate Expiry",
-    certificationExpiryDescription: "HTTPS Monitors trigger notification when TLS certificate expires in:",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Domein",
-    Workstation: "Werkstation",
-    disableCloudflaredNoAuthMsg: "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist.",
-};
diff --git a/src/languages/pl.js b/src/languages/pl.js
deleted file mode 100644
index beef5df5..00000000
--- a/src/languages/pl.js
+++ /dev/null
@@ -1,645 +0,0 @@
-export default {
-    languageName: "Polski",
-    checkEverySecond: "Sprawdzaj co {0} sekund",
-    retryCheckEverySecond: "Ponawiaj co {0} sekund",
-    retriesDescription: "Maksymalna liczba powtórzeń, zanim usługa zostanie oznaczona jako niedostępna i zostanie wysłane powiadomienie",
-    ignoreTLSError: "Ignoruj błąd TLS/SSL dla stron HTTPS",
-    upsideDownModeDescription: "Odwróć status do góry nogami. Jeśli usługa jest osiągalna, to jest oznaczona jako niedostępna.",
-    maxRedirectDescription: "Maksymalna liczba przekierowań do wykonania. Ustaw na 0, aby wyłączyć przekierowania.",
-    acceptedStatusCodesDescription: "Wybierz kody stanu, które są uważane za prawidłową odpowiedź.",
-    passwordNotMatchMsg: "Powtórzone hasło nie pasuje.",
-    notificationDescription: "Proszę przypisać powiadomienie do monitora(ów), aby działało.",
-    keywordDescription: "Wyszukiwanie słów kluczowych w zwykłym html lub odpowiedzi JSON. Wielkość liter ma znaczenie.",
-    pauseDashboardHome: "Wstrzymane",
-    deleteMonitorMsg: "Czy na pewno chcesz usunąć ten monitor?",
-    deleteNotificationMsg: "Czy na pewno chcesz usunąć to powiadomienie dla wszystkich monitorów?",
-    resolverserverDescription: "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w każdej chwili.",
-    rrtypeDescription: "Wybierz rodzaj rekordu, który chcesz monitorować.",
-    pauseMonitorMsg: "Czy na pewno chcesz wstrzymać monitorowanie?",
-    enableDefaultNotificationDescription: "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.",
-    clearEventsMsg: "Jesteś pewien, że chcesz wyczyścić historię zdarzeń dla tego monitora?",
-    clearHeartbeatsMsg: "Jesteś pewien, że chcesz wyczyścić historię bicia serca dla tego monitora?",
-    confirmClearStatisticsMsg: "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?",
-    importHandleDescription: "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.",
-    confirmImportMsg: "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.",
-    twoFAVerifyLabel: "Proszę, podaj swój token 2FA, aby sprawdzić, czy 2FA działa.",
-    tokenValidSettingsMsg: "Token jest prawidłowy! Teraz możesz zapisać ustawienia 2FA.",
-    confirmEnableTwoFAMsg: "Jesteś pewien, że chcesz włączyć 2FA?",
-    confirmDisableTwoFAMsg: "Jesteś pewien, że chcesz wyłączyć 2FA?",
-    Settings: "Ustawienia",
-    Dashboard: "Panel",
-    "New Update": "Nowa aktualizacja",
-    Language: "Język",
-    Appearance: "Wygląd",
-    Theme: "Motyw",
-    General: "Ogólne",
-    Version: "Wersja",
-    "Check Update On GitHub": "Sprawdź aktualizację na GitHub",
-    List: "Lista",
-    Add: "Dodaj",
-    "Add New Monitor": "Dodaj monitor",
-    "Quick Stats": "Szybki podgląd statystyk",
-    Up: "Online",
-    Down: "Offline",
-    Pending: "Oczekuje",
-    Unknown: "Nieznane",
-    Pause: "Wstrzymaj",
-    Name: "Nazwa",
-    Status: "Status",
-    DateTime: "Data i godzina",
-    Message: "Wiadomość",
-    "No important events": "Brak ważnych wydarzeń",
-    Resume: "Wznów",
-    Edit: "Edytuj",
-    Delete: "Usuń",
-    Current: "Aktualny",
-    Uptime: "Czas pracy",
-    "Cert Exp.": "Certyfikat wygasa",
-    day: "dzień | dni",
-    "-day": " dni",
-    hour: "godzina",
-    "-hour": " godzin",
-    Response: "Odpowiedź",
-    Ping: "Ping",
-    "Monitor Type": "Rodzaj monitora",
-    Keyword: "Słowo kluczowe",
-    "Friendly Name": "Przyjazna nazwa",
-    URL: "URL",
-    Hostname: "Nazwa hosta",
-    Port: "Port",
-    "Heartbeat Interval": "Częstotliwość bicia serca",
-    Retries: "Prób",
-    "Heartbeat Retry Interval": "Częstotliwość ponawiania bicia serca",
-    Advanced: "Zaawansowane",
-    "Upside Down Mode": "Tryb odwrócony",
-    "Max. Redirects": "Maks. przekierowań",
-    "Accepted Status Codes": "Akceptowane kody statusu",
-    Save: "Zapisz",
-    Notifications: "Powiadomienia",
-    "Not available, please setup.": "Niedostępne, proszę skonfigurować.",
-    "Setup Notification": "Skonfiguruj powiadomienie",
-    Light: "Jasny",
-    Dark: "Ciemny",
-    Auto: "Automatyczny",
-    "Theme - Heartbeat Bar": "Motyw - pasek bicia serca",
-    Normal: "Domyślne",
-    Bottom: "Na dole",
-    None: "Brak",
-    Timezone: "Strefa czasowa",
-    "Search Engine Visibility": "Widoczność w wyszukiwarce",
-    "Allow indexing": "Zezwól na indeksowanie",
-    "Discourage search engines from indexing site": "Zniechęcaj wyszukiwarki do indeksowania strony",
-    "Change Password": "Zmień hasło",
-    "Current Password": "Aktualne hasło",
-    "New Password": "Nowe hasło",
-    "Repeat New Password": "Powtórz nowe hasło",
-    "Update Password": "Zaktualizuj hasło",
-    "Disable Auth": "Wyłącz autoryzację",
-    "Enable Auth": "Włącz autoryzację",
-    "disableauth.message1": "Czy na pewno chcesz <strong>wyłączyć autoryzację</strong>?",
-    "disableauth.message2": "Jest przeznaczony dla <strong>kogoś, kto ma autoryzację zewnętrzną</strong> przed Uptime Kuma, taką jak Cloudflare Access.",
-    "Please use this option carefully!": "Proszę używać ostrożnie.",
-    Logout: "Wyloguj",
-    Leave: "Zostaw",
-    "I understand, please disable": "Rozumiem, proszę wyłączyć",
-    Confirm: "Potwierdź",
-    Yes: "Tak",
-    No: "Nie",
-    Username: "Nazwa użytkownika",
-    Password: "Hasło",
-    "Remember me": "Zapamiętaj mnie",
-    Login: "Zaloguj",
-    "No Monitors, please": "Brak monitorów, proszę",
-    "add one": "dodać jeden",
-    "Notification Type": "Rodzaj powiadomienia",
-    Email: "E-mail",
-    Test: "Test",
-    "Certificate Info": "Informacje o certyfikacie",
-    "Resolver Server": "Serwer rozwiązywania nazw",
-    "Resource Record Type": "Typ rekordu zasobów",
-    "Last Result": "Ostatni wynik",
-    "Create your admin account": "Utwórz swoje konto administratora",
-    "Repeat Password": "Powtórz hasło",
-    "Import Backup": "Importuj kopię zapasową",
-    "Export Backup": "Eksportuj kopię zapasową",
-    Export: "Eksportuj",
-    Import: "Importuj",
-    respTime: "Czas odp. (ms)",
-    notAvailableShort: "N/D",
-    "Default enabled": "Włącz domyślnie",
-    "Apply on all existing monitors": "Zastosuj do istniejących monitorów",
-    Create: "Stwórz",
-    "Clear Data": "Usuń dane",
-    Events: "Wydarzenia",
-    Heartbeats: "Bicia serca",
-    "Auto Get": "Wykryj",
-    backupDescription: "Możesz wykonać kopię zapasową wszystkich monitorów i wszystkich powiadomień do pliku JSON.",
-    backupDescription2: "PS: Historia i dane zdarzeń nie są uwzględniane.",
-    backupDescription3: "Poufne dane, takie jak tokeny powiadomień, są zawarte w pliku eksportu, prosimy o ostrożne przechowywanie.",
-    alertNoFile: "Wybierz plik do importu.",
-    alertWrongFileType: "Proszę wybrać plik JSON.",
-    "Clear all statistics": "Wyczyść wszystkie statystyki",
-    "Skip existing": "Pomiń istniejące",
-    Overwrite: "Nadpisz",
-    Options: "Opcje",
-    "Keep both": "Zachowaj oba",
-    "Verify Token": "Zweryfikuj token",
-    "Setup 2FA": "Konfiguracja 2FA",
-    "Enable 2FA": "Włącz 2FA",
-    "Disable 2FA": "Wyłącz 2FA",
-    "2FA Settings": "Ustawienia 2FA",
-    "Two Factor Authentication": "Uwierzytelnienie dwuskładnikowe",
-    Active: "Włączone",
-    Inactive: "Wyłączone",
-    Token: "Token",
-    "Show URI": "Pokaż URI",
-    Tags: "Tagi",
-    "Add New below or Select...": "Dodaj nowy poniżej lub wybierz...",
-    "Tag with this name already exist.": "Tag o tej nazwie już istnieje.",
-    "Tag with this value already exist.": "Tag o tej wartości już istnieje.",
-    color: "kolor",
-    "value (optional)": "wartość (opcjonalnie)",
-    Gray: "Szary",
-    Red: "Czerwony",
-    Orange: "Pomarańczowy",
-    Green: "Zielony",
-    Blue: "Niebieski",
-    Indigo: "Indygo",
-    Purple: "Fioletowy",
-    Pink: "Różowy",
-    "Search...": "Szukaj...",
-    "Avg. Ping": "Średni ping",
-    "Avg. Response": "Średnia odpowiedź",
-    "Entry Page": "Strona startowa",
-    statusPageNothing: "Nic tu nie ma, dodaj grupę lub monitor.",
-    "No Services": "Brak usług",
-    "All Systems Operational": "Wszystkie systemy działają poprawnie",
-    "Partially Degraded Service": "Część usług nie działa",
-    "Degraded Service": "Usługa nie działa",
-    "Add Group": "Dodaj grupę",
-    "Add a monitor": "Dodaj monitor",
-    "Edit Status Page": "Edytuj stronę statusu",
-    "Go to Dashboard": "Idź do panelu",
-    "Status Page": "Strona statusu",
-    "Status Pages": "Strony statusów",
-    defaultNotificationName: "Moje powiadomienie {notification} ({number})",
-    here: "tutaj",
-    Required: "Wymagane",
-    telegram: "Telegram",
-    "Bot Token": "Token bota",
-    wayToGetTelegramToken: "Token można uzyskać z {0}.",
-    "Chat ID": "Identyfikator czatu",
-    supportTelegramChatID: "Czat wsparcia technicznego / Bezpośrednia rozmowa / Czat grupowy",
-    wayToGetTelegramChatID: "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:",
-    "YOUR BOT TOKEN HERE": "TWÓJ TOKEN BOTA",
-    chatIDNotFound: "Identyfikator czatu nie znaleziony, najpierw napisz do bota",
-    webhook: "Webhook",
-    "Post URL": "Adres URL",
-    "Content Type": "Rodzaj danych",
-    webhookJsonDesc: "{0} jest dobry w przypadku serwerów HTTP, takich jak express.js",
-    webhookFormDataDesc: "{multipart} jest dobry dla PHP, musisz jedynie przetworzyć dane przez {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "Brak / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Zignoruj błędy TLS",
-    "From Email": "Nadawca (OD)",
-    "To Email": "Odbiorca (DO)",
-    smtpCC: "DW",
-    smtpBCC: "UDW",
-    discord: "Discord",
-    "Discord Webhook URL": "URL webhook Discorda",
-    wayToGetDiscordURL: "Możesz go uzyskać, przechodząc do Ustawienia serwera -> Integracje -> Tworzenie webhooka",
-    "Bot Display Name": "Wyświetlana nazwa bota",
-    "Prefix Custom Message": "Własny początek wiadomości",
-    "Hello @everyone is...": "Hej {'@'}everyone ...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "URL webhooka",
-    wayToGetTeamsURL: "Możesz dowiedzieć się, jak utworzyć adres url webhooka {0}.",
-    signal: "Signal",
-    Number: "Numer",
-    Recipients: "Odbiorcy",
-    needSignalAPI: "Musisz mieć klienta Signal z REST API.",
-    wayToCheckSignalURL: "W celu dowiedzenia się, jak go skonfigurować, odwiedź poniższy link:",
-    signalImportant: "UWAGA: Nie można mieszać nazw grup i numerów odbiorców!",
-    gotify: "Gotify",
-    "Application Token": "Token aplikacji",
-    "Server URL": "Server URL",
-    Priority: "Priorytet",
-    slack: "Slack",
-    "Icon Emoji": "Ikona emoji",
-    "Channel Name": "Nazwa kanału",
-    "Uptime Kuma URL": "Adres Uptime Kuma",
-    aboutWebhooks: "Więcej informacji na temat webhooków: {0}",
-    aboutChannelName: "Podaj nazwę kanału {0} w polu Nazwa kanału, jeśli chcesz pominąć kanał webhooka. Np.: #inny-kanal",
-    aboutKumaURL: "Jeśli pozostawisz pole Adres Uptime Kuma puste, domyślnie będzie to strona projektu na GitHub.",
-    emojiCheatSheet: "Ściąga emoji: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push od Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (obsługuje 50+ usług powiadomień)",
-    GoogleChat: "Google Chat (wyłącznie Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Klucz użytkownika",
-    Device: "Urządzenie",
-    "Message Title": "Tytuł wiadomości",
-    "Notification Sound": "Dźwięk powiadomienia",
-    "More info on:": "Więcej informacji na: {0}",
-    pushoverDesc1: "Priorytet awaryjny (2) ma domyślny 30-sekundowy limit czasu między kolejnymi próbami i wygaśnie po 1 godzinie.",
-    pushoverDesc2: "Jeśli chcesz wysyłać powiadomienia na różne urządzenia, wypełnij pole Urządzenie.",
-    "SMS Type": "Rodzaj SMS",
-    octopushTypePremium: "Premium (szybki - rekomendowany dla powiadomień)",
-    octopushTypeLowCost: "Low Cost (wolny, czasami blokowany przez operatorów)",
-    "Check octopush prices": "Sprawdź ceny Octopush {0}.",
-    octopushPhoneNumber: "Numer telefonu (format międzynarodowy np.: +33612345678)",
-    octopushSMSSender: "Nadawca SMS: 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)",
-    "LunaSea Device ID": "Identyfikator urządzenia LunaSea",
-    "Apprise URL": "URL Apprise",
-    "Example:": "Przykład: {0}",
-    "Read more:": "Czytaj dalej: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Czytaj dalej",
-    appriseInstalled: "Apprise jest zainstalowane.",
-    appriseNotInstalled: "Apprise nie zostało zainstalowane. {0}",
-    "Access Token": "Token dostępu",
-    "Channel access token": "Token dostępu kanału",
-    "Line Developers Console": "Konsola deweloperska Line",
-    lineDevConsoleTo: "Konsola deweloperska Line - {0}",
-    "Basic Settings": "Ustawienia ogólne",
-    "User ID": "Identyfikator użytkownika",
-    "Messaging API": "API wiadomości",
-    wayToGetLineChannelToken: "Najpierw uzyskaj dostęp do {0}, utwórz dostawcę i kanał (Messaging API), a następnie możesz uzyskać token dostępu do kanału i identyfikator użytkownika z wyżej wymienionych pozycji menu.",
-    "Icon URL": "Adres Ikony",
-    aboutIconURL: "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona emoji.",
-    aboutMattermostChannelName: "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - tanie, lecz wolne. Dostępne tylko w Polsce",
-    promosmsTypeFlash: "SMS FLASH - wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.",
-    promosmsTypeFull: "SMS FULL - szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.",
-    promosmsTypeSpeed: "SMS SPEED - wysyłka priorytetowa, ma wszystkie zalety SMS FULL",
-    promosmsPhoneNumber: "Numer odbiorcy",
-    promosmsSMSSender: "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)",
-    promosmsAllowLongSMS: "Zezwól na długie SMSy",
-    "Primary Base URL": "Główny URL",
-    "Push URL": "Push URL",
-    needPushEvery: "Powinieneś wywoływać ten URL co {0} sekund",
-    pushOptionalParams: "Parametry opcjonalne: {0}",
-    emailCustomSubject: "Niestandardowy temat",
-    checkPrice: "Sprawdź ceny {0}:",
-    octopushLegacyHint: "Czy używasz starszej wersji Octopush (2011-2020) czy nowej wersji?",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Adres URL serwera domowego (z http(s):// i opcjonalnie port)",
-    "Internal Room Id": "Wewnętrzne ID pokoju",
-    matrixDesc1: "Możesz znaleźć wewnętrzne ID pokoju, patrząc w zaawansowanej sekcji ustawień pokoju w twoim kliencie Matrix. Powinien on wyglądać jak !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Jest wysoce zalecane, abyś stworzył nowego użytkownika i nie używał tokena dostępu swojego użytkownika Matrix, ponieważ pozwoli on na pełny dostęp do twojego konta i wszystkich pokoi, do których dołączyłeś. Zamiast tego, utwórz nowego użytkownika i zaproś go tylko do pokoju, w którym chcesz otrzymywać powiadomienia. Możesz uzyskać token dostępu przez uruchomienie {0}",
-    Method: "Metoda",
-    Body: "Treść",
-    Headers: "Nagłówki",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Nagłówki żądania nie są w poprawnym formacie JSON: ",
-    BodyInvalidFormat: "Treść żądania nie jest w poprawnym formacie JSON: ",
-    "Monitor History": "Historia monitorów",
-    clearDataOlderThan: "Przechowuj dane dotyczące historii monitorowania {0} dni.",
-    PasswordsDoNotMatch: "Hasła nie pasują.",
-    records: "rekordy",
-    "One record": "Jeden rekord",
-    steamApiKeyDescription: "Do monitorowania serwera gier Steam potrzebny jest klucz Steam Web-API. Możesz zarejestrować swój klucz API tutaj: ",
-    "Current User": "Aktualny użytkownik",
-    topic: "Temat",
-    topicExplanation: "Temat MQTT do monitorowania",
-    successMessage: "Komunikat o powodzeniu",
-    successMessageExplanation: "Komunikat MQTT, który zostanie uznany za powodzenie",
-    recent: "Ostatnie",
-    Done: "Zrobione",
-    Info: "Info",
-    Security: "Bezpieczeństwo",
-    "Steam API Key": "Klucz Steam API",
-    "Shrink Database": "Zmniejsz bazę danych",
-    "Pick a RR-Type...": "Wybierz typ RR...",
-    "Pick Accepted Status Codes...": "Wybierz akceptowalne kody statusu...",
-    Default: "Domyślnie",
-    "HTTP Options": "Opcje HTTP",
-    "Create Incident": "Stwórz incydent",
-    Title: "Tytuł",
-    Content: "Treść",
-    Style: "Styl",
-    info: "info",
-    warning: "ostrzeżenie",
-    danger: "niebezpieczeństwo",
-    primary: "podstawowy",
-    light: "jasny",
-    dark: "ciemny",
-    Post: "Wyślij",
-    "Please input title and content": "Podaj tytuł i treść",
-    Created: "Stworzony",
-    "Last Updated": "Ostatnio zaktualizowany",
-    Unpin: "Odepnij",
-    "Switch to Light Theme": "Przełącz na jasny motyw",
-    "Switch to Dark Theme": "Przełącz na ciemny motyw",
-    "Show Tags": "Pokaż tagi",
-    "Hide Tags": "Ukryj tagi",
-    Description: "Opis",
-    "No monitors available.": "Brak dostępnych monitorów.",
-    "Add one": "Dodaj jeden",
-    "No Monitors": "Brak monitorów",
-    "Untitled Group": "Nienazwana grupa",
-    Services: "Usługi",
-    Discard: "Odrzuć",
-    Cancel: "Anuluj",
-    "Powered by": "Napędzane przez",
-    shrinkDatabaseDescription: "Uruchom VACUUM na bazie SQLite. Jeżeli twoja baza została stworzona po wersji 1.10.0, to ma już włączoną opcję AUTO_VACUUM i stosowanie ręcznego oczyszczania nie jest potrzebne.",
-    clicksendsms: "ClickSend SMS",
-    apiCredentials: "Poświadczenia API",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "Nazwa użytkownika API (z prefiksem webapi_)",
-    serwersmsAPIPassword: "Hasło API",
-    serwersmsPhoneNumber: "Numer telefonu",
-    serwersmsSenderName: "Nazwa nadawcy (zatwierdzona w panelu klienta)",
-    smseagle: "SMSEagle",
-    smseagleTo: "Numer/y telefonu",
-    smseagleGroup: "Grupa/y z Książki adresowej",
-    smseagleContact: "Kontakt/y z Książki adresowej",
-    smseagleRecipientType: "Typ odbiorcy",
-    smseagleRecipient: "Odbiorca/y (wiele musi być oddzielone przecinkami)",
-    smseagleToken: "Klucz dostępu API",
-    smseagleUrl: "URL Twojego urządzenia SMSEagle",
-    smseagleEncoding: "Wyślij jako Unicode",
-    smseaglePriority: "Priorytet wiadomości (0-9, domyślnie = 0)",
-    stackfield: "Stackfield",
-    Customize: "Dostosuj",
-    "Custom Footer": "Niestandardowa stopka",
-    "Custom CSS": "Niestandardowy CSS",
-    smtpDkimSettings: "Ustawienia DKIM",
-    smtpDkimDesc: "Zapoznaj się z Nodemailer DKIM {0}, aby dowiedzieć się więcej",
-    documentation: "dokumentacja",
-    smtpDkimDomain: "Nazwa domeny",
-    smtpDkimKeySelector: "Selektor klucza",
-    smtpDkimPrivateKey: "Klucz prywatny",
-    smtpDkimHashAlgo: "Algorytm haszujący (opcjonalne)",
-    smtpDkimheaderFieldNames: "Klucze nagłówka do podpisu (opcjonalne)",
-    smtpDkimskipFields: "Klucze nagłówka do pominięcia (opcjonalne)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Punkt końcowy API",
-    alertaEnvironment: "Środowisko",
-    alertaApiKey: "Klucz API",
-    alertaAlertState: "Alert State",
-    alertaRecoverState: "Recover State",
-    deleteStatusPageMsg: "Jesteś pewien, że chcesz usunąć tę stronę statusów?",
-    Proxies: "Proxy",
-    default: "Domyślny",
-    enabled: "Włączony",
-    setAsDefault: "Ustaw jako domyślny",
-    deleteProxyMsg: "Jesteś pewien, że chcesz usunąć proxy ze wszystkich monitorów?",
-    proxyDescription: "Proxy muszą być przypisane do monitora, aby działały.",
-    enableProxyDescription: "Ten serwer proxy nie będzie miał wpływu na żądania monitorów, dopóki nie zostanie aktywowany. Możesz kontrolować tymczasowe wyłączenie serwera proxy ze wszystkich monitorów za pomocą statusu aktywacji.",
-    setAsDefaultProxyDescription: "Ten serwer proxy będzie domyślnie włączony dla nowych monitorów. Można go jednak wyłączyć osobno dla każdego monitora.",
-    "Certificate Chain": "Łańcuch certyfikatów",
-    Valid: "Ważny",
-    Invalid: "Nieważny",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Sekret",
-    PhoneNumbers: "Numery telefonów",
-    TemplateCode: "Kod szablonu",
-    SignName: "Podpis",
-    "Sms template must contain parameters: ": "Szablon sms musi posiadać parametry: ",
-    "Bark Endpoint": "Punkt końcowy Bark",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "Tajny klucz",
-    "For safety, must use secret key": "Ze względów bezpieczeństwa musisz użyć tajnego klucza",
-    "Device Token": "Device Token",
-    Platform: "Platforma",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Wysoki",
-    Retry: "Ponów",
-    Topic: "Temat",
-    "WeCom Bot Key": "Klucz bota WeCom",
-    "Setup Proxy": "Skonfiguruj proxy",
-    "Proxy Protocol": "Protokół proxy",
-    "Proxy Server": "Serwer proxy",
-    "Proxy server has authentication": "Serwer proxy ma autoryzację",
-    User: "Użytkownik",
-    Installed: "Zainstalowany",
-    "Not installed": "Nie zainstalowany",
-    Running: "Działa",
-    "Not running": "Nie działa",
-    "Remove Token": "Usuń token",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Dodaj nową stronę statusów",
-    Slug: "Symbol",
-    "Accept characters:": "Dozwolone znaki:",
-    startOrEndWithOnly: "Zaczynające się i kończące wyłącznie {0} znakami",
-    "No consecutive dashes": "Bez powtarzających się myślników",
-    Next: "Dalej",
-    "The slug is already taken. Please choose another slug.": "Ten symbol jest już zajęty. Proszę, wybierz inny.",
-    "No Proxy": "Bez proxy",
-    Authentication: "Uwierzytelnianie",
-    "HTTP Basic Auth": "Podstawowa autoryzacja HTTP",
-    "New Status Page": "Nowa strona statusu",
-    "Page Not Found": "Strona nie została znaleziona",
-    "Reverse Proxy": "Zwrotny serwer proxy",
-    Backup: "Backup",
-    About: "O skrypcie",
-    wayToGetCloudflaredURL: "(Pobierz cloudflared z {0})",
-    cloudflareWebsite: "Strona Cloudflare",
-    "Message:": "Wiadomość:",
-    "Don't know how to get the token? Please read the guide:": "Nie wiesz jak uzyksać token? Przeczytaj proszę poradnik:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Bieżące połączenie może zostać utracone, jeśli aktualnie łączysz się przez tunel Cloudflare. Czy na pewno chcesz to przerwać? Wpisz swoje aktualne hasło, aby je potwierdzić.",
-    "Other Software": "Inne oprogramowanie",
-    "For example: nginx, Apache and Traefik.": "Na przykład: nginx, Apache i Traefik.",
-    "Please read": "Przeczytaj proszę",
-    "Subject:": "Temat:",
-    "Valid To:": "Ważny do:",
-    "Days Remaining:": "Pozostało dni:",
-    "Issuer:": "Wydawca:",
-    "Fingerprint:": "Odcisk palca:",
-    "No status pages": "Brak stron statusów",
-    "Domain Name Expiry Notification": "Powiadomienie o wygasaniu domeny",
-    Proxy: "Proxy",
-    "Date Created": "Data stworzenia",
-    onebotHttpAddress: "Adres HTTP OneBot",
-    onebotMessageType: "Rodzaj wiadomości OneBot",
-    onebotGroupMessage: "Grupowa",
-    onebotPrivateMessage: "Prywatna",
-    onebotUserOrGroupId: "ID Grupy/Użytkownika",
-    onebotSafetyTips: "Ze względów bezpieczeństwa musisz ustawić token dostępu",
-    "PushDeer Key": "Klucz PushDeer",
-    "Footer Text": "Treść stopki",
-    "Show Powered By": "Pokaż co napędza stronę",
-    "Domain Names": "Domeny",
-    signedInDisp: "Zalogowany jako {0}",
-    signedInDispDisabled: "Autoryzacja wyłączona.",
-    resendEveryXTimes: "Wysyłaj ponownie co {0} razy",
-    resendDisabled: "Ponowne wysyłanie jest wyłączone",
-    Maintenance: "Konserwacja",
-    statusMaintenance: "Konserwacja",
-    "Schedule maintenance": "Planowanie konserwacji",
-    "Affected Monitors": "Monitory dotknięte problemem",
-    "Pick Affected Monitors...": "Wybierz monitory, których to dotyczy...",
-    "Start of maintenance": "Rozpoczęcie konserwacji",
-    "All Status Pages": "Wszystkie strony statusu",
-    "Select status pages...": "Wybierz strony statusu...",
-    recurringIntervalMessage: "Uruchom raz dziennie | Uruchom raz na {0} dni",
-    affectedMonitorsDescription: "Wybierz monitory, których dotyczy bieżąca konserwacja",
-    affectedStatusPages: "Pokaż ten komunikat o konserwacji na wybranych stronach statusu",
-    atLeastOneMonitor: "Wybierz co najmniej jeden monitor, którego dotyczy problem",
-    deleteMaintenanceMsg: "Czy na pewno chcesz usunąć tę konserwację?",
-    dnsPortDescription: "Port serwera DNS. Domyślnie 53. Możesz zmienić port w dowolnym momencie.",
-    "Resend Notification if Down X times consequently": "Wyślij ponownie powiadomienie, jeśli nie działa X razy pod rząd",
-    error: "błąd",
-    critical: "krytyczny",
-    wayToGetPagerDutyKey: "Możesz to uzyskać, przechodząc do Service -> Service Directory -> (wybierz usługę) -> Integrations -> Add integration. Tutaj możesz wyszukać \"Events API V2\". Więcej informacji {0}",
-    "Integration Key": "Klucz integracji",
-    "Integration URL": "Adres URL integracji",
-    "Auto resolve or acknowledged": "Automatycznie rozwiązany lub potwierdzony",
-    "do nothing": "nie rób nic",
-    "auto acknowledged": "auto potwierdzony",
-    "auto resolve": "automatycznie rozwiązany",
-    "Bark Group": "Grupa Bark",
-    "Bark Sound": "Dźwięk Bark",
-    "HTTP Headers": "Nagłówki HTTP",
-    "Trust Proxy": "Ufaj proxy",
-    HomeAssistant: "Home Assistant",
-    RadiusSecret: "Sekretny klucz Radius",
-    RadiusSecretDescription: "Współdzielony sekretny klucz pomiędzy klientem a serwerem",
-    RadiusCalledStationId: "Id stacji wywoływanej",
-    RadiusCalledStationIdDescription: "Identyfikator wywoływanego urządzenia",
-    RadiusCallingStationId: "Id stacji wywoławczej",
-    RadiusCallingStationIdDescription: "Identyfikator urządzenia wywołującego",
-    "Certificate Expiry Notification": "Powiadomienie o wygaśnięciu certyfikatu",
-    "API Username": "Nazwa użytkownika API",
-    "API Key": "Klucz API",
-    "Recipient Number": "Numer odbiorcy",
-    "From Name/Number": "Od nazwa/numer",
-    "Leave blank to use a shared sender number.": "Pozostaw puste, aby użyć wspólnego numeru nadawcy.",
-    "Octopush API Version": "Wersja API Octopush",
-    "Legacy Octopush-DM": "Starsze Octopush-DM",
-    endpoint: "punkt końcowy",
-    octopushAPIKey: "\"API key\" z poświadczeń HTTP API w panelu sterowania",
-    octopushLogin: "\"Login\" z poświadczeń HTTP API w panelu sterowania",
-    promosmsLogin: "Nazwa logowania API",
-    promosmsPassword: "Hasło API",
-    "pushoversounds pushover": "Pushover (domyślny)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (długie)",
-    "pushoversounds climb": "Climb (długie)",
-    "pushoversounds persistent": "Persistent (długie)",
-    "pushoversounds echo": "Pushover Echo (długie)",
-    "pushoversounds updown": "Up Down (długie)",
-    "pushoversounds vibrate": "Tylko wibracje",
-    "pushoversounds none": "Brak (cisza)",
-    pushyAPIKey: "Tajny klucz API",
-    pushyToken: "Token urządzenia",
-    "Show update if available": "Pokaż aktualizację, jeśli jest dostępna",
-    "Also check beta release": "Sprawdź również wydanie beta",
-    "Using a Reverse Proxy?": "Używasz odwróconego proxy?",
-    "Check how to config it for WebSocket": "Sprawdź jak go skonfigurować dla WebSocket",
-    "Steam Game Server": "Serwer gry Steam",
-    "Most likely causes:": "Najbardziej prawdopodobne przyczyny:",
-    "The resource is no longer available.": "Zasób nie jest już dostępny.",
-    "There might be a typing error in the address.": "W adresie może być błąd w pisowni.",
-    "What you can try:": "Co możesz spróbować:",
-    "Retype the address.": "Ponownie wpisz adres.",
-    "Go back to the previous page.": "Wróć do poprzedniej strony.",
-    "Coming Soon": "Wkrótce",
-    wayToGetClickSendSMSToken: "Możesz uzyskać nazwę użytkownika API i klucz API z {0}.",
-    "Connection String": "Ciąg połączenia",
-    Query: "Zapytanie",
-    settingsCertificateExpiry: "Wygaśnięcie certyfikatu TLS",
-    certificationExpiryDescription: "Monitory HTTPS uruchamiają powiadomienia o wygaśnięciu certyfikatu TLS w:",
-    "Setup Docker Host": "Konfiguracja hosta Docker",
-    "Connection Type": "Typ połączenia",
-    "Docker Daemon": "Demon Dockera",
-    deleteDockerHostMsg: "Czy na pewno chcesz usunąć ten host Dockera dla wszystkich monitorów?",
-    socket: "Gniazdo",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Kontener Dockera",
-    "Container Name / ID": "Nazwa kontenera / ID",
-    "Docker Host": "Host Dockera",
-    "Docker Hosts": "Hosty Dockera",
-    "ntfy Topic": "Temat ntfy",
-    Domain: "Domena",
-    Workstation: "Stacja robocza",
-    disableCloudflaredNoAuthMsg: "Jesteś w trybie No Auth, hasło nie jest wymagane.",
-    trustProxyDescription: "Zaufaj nagłówkom 'X-Forwarded-*'. Jeśli chcesz uzyskać poprawne IP klienta, a twój Uptime Kuma jest za Nginx lub Apache, powinieneś to włączyć.",
-    wayToGetLineNotifyToken: "Możesz uzyskać token dostępu z {0}",
-    Examples: "Przykłady",
-    "Home Assistant URL": "URL Home Assistant",
-    "Long-Lived Access Token": "Długotrwały token dostępu",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Długotrwały token dostępu można utworzyć klikając na nazwę swojego profilu (na dole po lewej stronie) i przewijając do dołu, a następnie klikając Create Token. ",
-    "Notification Service": "Usługa powiadamiania",
-    "default: notify all devices": "domyślnie: powiadamiaj wszystkie urządzenia",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Listę usług powiadamiania można znaleźć w Home Assistant pod \"Developer Tools > Services\" wyszukaj \"notification\", aby znaleźć nazwę swojego urządzenia/telefonu.",
-    "Automations can optionally be triggered in Home Assistant:": "Automaty mogą być opcjonalnie uruchamiane w Home Assistant:",
-    "Trigger type:": "Typ wyzwalacza:",
-    "Event type:": "Typ zdarzenia:",
-    "Event data:": "Dane o zdarzeniu:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Następnie wybierz akcję, na przykład przełącz scenę na taką, w której światło RGB jest czerwone.",
-    "Frontend Version": "Wersja frontu",
-    "Frontend Version do not match backend version!": "Wersja frontu nie pasuje do wersji backendu!",
-    "Base URL": "Bazowy adres URL",
-    goAlertInfo: "GoAlert to aplikacja open source do planowania, automatycznych eskalacji i powiadomień (jak SMS lub połączenia głosowe). Automatycznie angażuj właściwą osobę, we właściwy sposób i we właściwym czasie! {0}",
-    goAlertIntegrationKeyInfo: "Pobierz generyczny klucz integracyjny API dla usługi, którego wartość skopiowanego tokena URL jest zwykle w formacie \"aaaaaaaa-bbb-cccc-dddd-eeeeee\".",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Przestarzałe: ponieważ dodano wiele funkcji i funkcja tworzenia kopii zapasowych nie jest wystarczająco utrzymywana, nie może generować ani przywracać pełnej kopii zapasowej.",
-    backupRecommend: "Zamiast tego należy wykonać bezpośrednią kopię zapasową woluminu lub folderu danych (./data/).",
-    Optional: "Opcjonalne",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "Dokumentacja API SMSManager ",
-    "Gateway Type": "Typ bramy",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Możesz dzielić liczby przez",
-    or: "lub",
-    recurringInterval: "odstęp czasu",
-    Recurring: "powtarzający się",
-    strategyManual: "Aktywowany/dezaktywowany ręcznie",
-    warningTimezone: "Używa strefy czasowej serwera",
-    weekdayShortMon: "pon",
-    weekdayShortTue: "wt",
-    weekdayShortWed: "śr",
-    weekdayShortThu: "czw",
-    weekdayShortFri: "pt",
-    weekdayShortSat: "sob",
-    weekdayShortSun: "niedz",
-    dayOfWeek: "Dzień tygodnia",
-    dayOfMonth: "Dzień miesiąca",
-    lastDay: "Ostatni dzień",
-    lastDay1: "Ostatni dzień miesiąca",
-    lastDay2: "2. ostatni dzień miesiąca",
-    lastDay3: "3. ostatni dzień miesiąca",
-    lastDay4: "4. ostatni dzień miesiąca",
-    "No Maintenance": "Brak konserwacji",
-    pauseMaintenanceMsg: "Jesteś pewien, że chcesz zatrzymać?",
-    "maintenanceStatus-under-maintenance": "Podczas konserwacji",
-    "maintenanceStatus-inactive": "Nieaktywny",
-    "maintenanceStatus-scheduled": "Zaplanowany",
-    "maintenanceStatus-ended": "Zakończony",
-    "maintenanceStatus-unknown": "Nieznany",
-    "Display Timezone": "Wyświetlana strefa czasowa",
-    "Server Timezone": "Strefa czasowa serwera",
-    statusPageMaintenanceEndDate: "Koniec",
-};
diff --git a/src/languages/pt-BR.js b/src/languages/pt-BR.js
deleted file mode 100644
index 7bc8d0fd..00000000
--- a/src/languages/pt-BR.js
+++ /dev/null
@@ -1,203 +0,0 @@
-export default {
-    languageName: "Português (Brasileiro)",
-    checkEverySecond: "Verificar cada {0} segundos.",
-    retryCheckEverySecond: "Tentar novamente a cada {0} segundos.",
-    retriesDescription: "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
-    ignoreTLSError: "Ignorar erros TLS/SSL para sites HTTPS",
-    upsideDownModeDescription: "Inverta o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
-    maxRedirectDescription: "Número máximo de redirecionamentos a seguir. Defina como 0 para desativar redirecionamentos.",
-    acceptedStatusCodesDescription: "Selecione os códigos de status que são considerados uma resposta bem-sucedida.",
-    passwordNotMatchMsg: "A senha repetida não corresponde.",
-    notificationDescription: "Atribua uma notificação ao (s) monitor (es) para que funcione.",
-    keywordDescription: "Pesquise a palavra-chave em html simples ou resposta JSON e diferencia maiúsculas de minúsculas",
-    pauseDashboardHome: "Pausar",
-    deleteMonitorMsg: "Tem certeza de que deseja excluir este monitor?",
-    deleteNotificationMsg: "Tem certeza de que deseja excluir esta notificação para todos os monitores?",
-    resolverserverDescription: "Cloudflare é o servidor padrão, você pode alterar o servidor resolvedor a qualquer momento.",
-    rrtypeDescription: "Selecione o RR-Type que você deseja monitorar",
-    pauseMonitorMsg: "Tem certeza que deseja fazer uma pausa?",
-    enableDefaultNotificationDescription: "Para cada novo monitor, esta notificação será habilitada por padrão. Você ainda pode desativar a notificação separadamente para cada monitor.",
-    clearEventsMsg: "Tem certeza de que deseja excluir todos os eventos deste monitor?",
-    clearHeartbeatsMsg: "Tem certeza de que deseja excluir todos os heartbeats deste monitor?",
-    confirmClearStatisticsMsg: "Tem certeza que deseja excluir TODAS as estatísticas?",
-    importHandleDescription: "Escolha 'Ignorar existente' se quiser ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
-    confirmImportMsg: "Tem certeza que deseja importar o backup? Certifique-se de que selecionou a opção de importação correta.",
-    twoFAVerifyLabel: "Digite seu token para verificar se 2FA está funcionando",
-    tokenValidSettingsMsg: "O token é válido! Agora você pode salvar as configurações 2FA.",
-    confirmEnableTwoFAMsg: "Tem certeza de que deseja habilitar 2FA?",
-    confirmDisableTwoFAMsg: "Tem certeza de que deseja desativar 2FA?",
-    Settings: "Configurações",
-    Dashboard: "Dashboard",
-    "New Update": "Nova Atualização",
-    Language: "Linguagem",
-    Appearance: "Aparência",
-    Theme: "Tema",
-    General: "Geral",
-    Version: "Versão",
-    "Check Update On GitHub": "Verificar atualização no Github",
-    List: "Lista",
-    Add: "Adicionar",
-    "Add New Monitor": "Adicionar novo monitor",
-    "Quick Stats": "Estatísticas rápidas",
-    Up: "On",
-    Down: "Off",
-    Pending: "Pendente",
-    Unknown: "Desconhecido",
-    Pause: "Pausar",
-    Name: "Nome",
-    Status: "Status",
-    DateTime: "Data hora",
-    Message: "Mensagem",
-    "No important events": "Nenhum evento importante",
-    Resume: "Resumo",
-    Edit: "Editar",
-    Delete: "Deletar",
-    Current: "Atual",
-    Uptime: "Tempo de atividade",
-    "Cert Exp.": "Cert Exp.",
-    day: "dia | dias",
-    "-day": "-dia",
-    hour: "hora",
-    "-hour": "-hora",
-    Response: "Resposta",
-    Ping: "Ping",
-    "Monitor Type": "Tipo de Monitor",
-    Keyword: "Palavra-Chave",
-    "Friendly Name": "Nome Amigável",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Porta",
-    "Heartbeat Interval": "Intervalo de Heartbeat",
-    Retries: "Novas tentativas",
-    "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeat",
-    Advanced: "Avançado",
-    "Upside Down Mode": "Modo de cabeça para baixo",
-    "Max. Redirects": "Redirecionamento Máx.",
-    "Accepted Status Codes": "Status Code Aceitáveis",
-    Save: "Salvar",
-    Notifications: "Notificações",
-    "Not available, please setup.": "Não disponível, por favor configure.",
-    "Setup Notification": "Configurar Notificação",
-    Light: "Claro",
-    Dark: "Escuro",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Tema - Barra de Heartbeat",
-    Normal: "Normal",
-    Bottom: "Inferior",
-    None: "Nenhum",
-    Timezone: "Fuso horário",
-    "Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
-    "Allow indexing": "Permitir Indexação",
-    "Discourage search engines from indexing site": "Desencoraje os motores de busca de indexar o site",
-    "Change Password": "Mudar senha",
-    "Current Password": "Senha atual",
-    "New Password": "Nova Senha",
-    "Repeat New Password": "Repetir Nova Senha",
-    "Update Password": "Atualizar Senha",
-    "Disable Auth": "Desativar Autenticação",
-    "Enable Auth": "Ativar Autenticação",
-    "disableauth.message1": "Você tem certeza que deseja <strong>desativar a autenticação</strong>?",
-    "disableauth.message2": "Isso é para <strong>alguém que tem autenticação de terceiros</strong> na frente do 'UpTime Kuma' como o Cloudflare Access.",
-    "Please use this option carefully!": "Por favor, utilize isso com cautela.",
-    Logout: "Deslogar",
-    Leave: "Sair",
-    "I understand, please disable": "Eu entendo, por favor desative.",
-    Confirm: "Confirmar",
-    Yes: "Sim",
-    No: "Não",
-    Username: "Usuário",
-    Password: "Senha",
-    "Remember me": "Lembre-me",
-    Login: "Autenticar",
-    "No Monitors, please": "Nenhum monitor, por favor",
-    "add one": "adicionar um",
-    "Notification Type": "Tipo de Notificação",
-    Email: "Email",
-    Test: "Testar",
-    "Certificate Info": "Info. do Certificado ",
-    "Resolver Server": "Resolver Servidor",
-    "Resource Record Type": "Tipo de registro de aplicação",
-    "Last Result": "Último resultado",
-    "Create your admin account": "Crie sua conta de admin",
-    "Repeat Password": "Repita a senha",
-    "Import Backup": "Importar Backup",
-    "Export Backup": "Exportar Backup",
-    Export: "Exportar",
-    Import: "Importar",
-    respTime: "Tempo de Resp. (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Padrão habilitado",
-    "Apply on all existing monitors": "Aplicar em todos os monitores existentes",
-    Create: "Criar",
-    "Clear Data": "Limpar Dados",
-    Events: "Eventos",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Obter Automático",
-    backupDescription: "Você pode fazer backup de todos os monitores e todas as notificações em um arquivo JSON.",
-    backupDescription2: "OBS: Os dados do histórico e do evento não estão incluídos.",
-    backupDescription3: "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantenha-o com cuidado.",
-    alertNoFile: "Selecione um arquivo para importar.",
-    alertWrongFileType: "Selecione um arquivo JSON.",
-    "Clear all statistics": "Limpar todas as estatísticas",
-    "Skip existing": "Pular existente",
-    Overwrite: "Sobrescrever",
-    Options: "Opções",
-    "Keep both": "Manter os dois",
-    "Verify Token": "Verificar Token",
-    "Setup 2FA": "Configurar 2FA",
-    "Enable 2FA": "Ativar 2FA",
-    "Disable 2FA": "Desativar 2FA",
-    "2FA Settings": "Configurações do 2FA ",
-    "Two Factor Authentication": "Autenticação e Dois Fatores",
-    Active: "Ativo",
-    Inactive: "Inativo",
-    Token: "Token",
-    "Show URI": "Mostrar URI",
-    Tags: "Tag",
-    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar ...",
-    "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
-    "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
-    color: "cor",
-    "value (optional)": "valor (opcional)",
-    Gray: "Cinza",
-    Red: "Vermelho",
-    Orange: "Laranja",
-    Green: "Verde",
-    Blue: "Azul",
-    Indigo: "Índigo",
-    Purple: "Roxo",
-    Pink: "Rosa",
-    "Search...": "Buscar...",
-    "Avg. Ping": "Ping Médio.",
-    "Avg. Response": "Resposta Média. ",
-    "Status Page": "Página de Status",
-    "Status Pages": "Página de Status",
-    "Entry Page": "Página de entrada",
-    statusPageNothing: "Nada aqui, por favor, adicione um grupo ou monitor.",
-    "No Services": "Nenhum Serviço",
-    "All Systems Operational": "Todos os Serviços Operacionais",
-    "Partially Degraded Service": "Serviço parcialmente degradado",
-    "Degraded Service": "Serviço Degradado",
-    "Add Group": "Adicionar Grupo",
-    "Add a monitor": "Adicionar um monitor",
-    "Edit Status Page": "Editar Página de Status",
-    "Go to Dashboard": "Ir para a dashboard",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/pt-PT.js b/src/languages/pt-PT.js
deleted file mode 100644
index 21e68d26..00000000
--- a/src/languages/pt-PT.js
+++ /dev/null
@@ -1,203 +0,0 @@
-export default {
-    languageName: "Português (Portugal)",
-    checkEverySecond: "Verificar a cada {0} segundos.",
-    retryCheckEverySecond: "Tentar novamente a cada {0} segundos.",
-    retriesDescription: "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
-    ignoreTLSError: "Ignorar erros TLS/SSL para sites HTTPS",
-    upsideDownModeDescription: "Inverte o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
-    maxRedirectDescription: "Número máximo de redirecionamentos a seguir. Define como 0 para desativar redirecionamentos.",
-    acceptedStatusCodesDescription: "Seleciona os códigos de status que são considerados uma resposta bem-sucedida.",
-    passwordNotMatchMsg: "A senha repetida não corresponde.",
-    notificationDescription: "Atribuir uma notificação ao (s) monitor (es) para que funcione.",
-    keywordDescription: "Pesquisa a palavra-chave em HTML simples ou resposta JSON e diferencia maiúsculas de minúsculas",
-    pauseDashboardHome: "Pausa",
-    deleteMonitorMsg: "Tens a certeza de que queres excluir este monitor?",
-    deleteNotificationMsg: "Tens a certeza de que queres excluir esta notificação para todos os monitores?",
-    resolverserverDescription: "A Cloudflare é o servidor padrão, podes alterar o servidor 'resolvedor' a qualquer momento.",
-    rrtypeDescription: "Seleciona o RR-Type que queres monitorizar",
-    pauseMonitorMsg: "Tens a certeza que queres fazer uma pausa?",
-    enableDefaultNotificationDescription: "Para cada monitor novo esta notificação vai estar activa por padrão. Podes também desativar a notificação separadamente para cada monitor.",
-    clearEventsMsg: "Tens a certeza que queres excluir todos os eventos deste monitor?",
-    clearHeartbeatsMsg: "Tens a certeza de que queres excluir todos os heartbeats deste monitor?",
-    confirmClearStatisticsMsg: "Tens a certeza que queres excluir TODAS as estatísticas?",
-    importHandleDescription: "Escolhe 'Ignorar existente' se quiseres ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
-    confirmImportMsg: "Tens a certeza que queres importar o backup? Certifica-te que selecionaste a opção de importação correta.",
-    twoFAVerifyLabel: "Insire o teu token para verificares se o 2FA está a funcionar",
-    tokenValidSettingsMsg: "O token é válido! Agora podes salvar as configurações do 2FA.",
-    confirmEnableTwoFAMsg: "Tens a certeza de que queres habilitar 2FA?",
-    confirmDisableTwoFAMsg: "Tens a certeza de que queres desativar 2FA?",
-    Settings: "Configurações",
-    Dashboard: "Dashboard",
-    "New Update": "Nova Atualização",
-    Language: "Linguagem",
-    Appearance: "Aparência",
-    Theme: "Tema",
-    General: "Geral",
-    Version: "Versão",
-    "Check Update On GitHub": "Verificar atualização no Github",
-    List: "Lista",
-    Add: "Adicionar",
-    "Add New Monitor": "Adicionar novo monitor",
-    "Quick Stats": "Estatísticas rápidas",
-    Up: "On",
-    Down: "Off",
-    Pending: "Pendente",
-    Unknown: "Desconhecido",
-    Pause: "Pausa",
-    Name: "Nome",
-    Status: "Status",
-    DateTime: "Data hora",
-    Message: "Mensagem",
-    "No important events": "Nenhum evento importante",
-    Resume: "Resumo",
-    Edit: "Editar",
-    Delete: "Apagar",
-    Current: "Atual",
-    Uptime: "Tempo de atividade",
-    "Cert Exp.": "Cert Exp.",
-    day: "dia | dias",
-    "-day": "-dia",
-    hour: "hora",
-    "-hour": "-hora",
-    Response: "Resposta",
-    Ping: "Ping",
-    "Monitor Type": "Tipo de Monitor",
-    Keyword: "Palavra-Chave",
-    "Friendly Name": "Nome Amigável",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Porta",
-    "Heartbeat Interval": "Intervalo de Heartbeats",
-    Retries: "Novas tentativas",
-    "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeats",
-    Advanced: "Avançado",
-    "Upside Down Mode": "Modo de cabeça para baixo",
-    "Max. Redirects": "Redirecionamento Máx.",
-    "Accepted Status Codes": "Status Code Aceitáveis",
-    Save: "Guardar",
-    Notifications: "Notificações",
-    "Not available, please setup.": "Não disponível, por favor configura.",
-    "Setup Notification": "Configurar Notificação",
-    Light: "Claro",
-    Dark: "Escuro",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Tema - Barra de Heartbeat",
-    Normal: "Normal",
-    Bottom: "Inferior",
-    None: "Nenhum",
-    Timezone: "Fuso horário",
-    "Search Engine Visibility": "Visibilidade do mecanismo de pesquisa",
-    "Allow indexing": "Permitir Indexação",
-    "Discourage search engines from indexing site": "Desencorajar que motores de busca indexem o site",
-    "Change Password": "Mudar senha",
-    "Current Password": "Senha atual",
-    "New Password": "Nova Senha",
-    "Repeat New Password": "Repetir Nova Senha",
-    "Update Password": "Atualizar Senha",
-    "Disable Auth": "Desativar Autenticação",
-    "Enable Auth": "Ativar Autenticação",
-    "disableauth.message1": "Tens a certeza que queres <strong>desativar a autenticação</strong>?",
-    "disableauth.message2": "Isso é para <strong>alguém que tem autenticação de terceiros</strong> em frente ao 'UpTime Kuma' como o Cloudflare Access.",
-    "Please use this option carefully!": "Por favor, utiliza esta opção com cuidado.",
-    Logout: "Logout",
-    Leave: "Sair",
-    "I understand, please disable": "Eu entendo, por favor desativa.",
-    Confirm: "Confirmar",
-    Yes: "Sim",
-    No: "Não",
-    Username: "Utilizador",
-    Password: "Senha",
-    "Remember me": "Lembra-me",
-    Login: "Autenticar",
-    "No Monitors, please": "Nenhum monitor, por favor",
-    "add one": "adicionar um",
-    "Notification Type": "Tipo de Notificação",
-    Email: "Email",
-    Test: "Testar",
-    "Certificate Info": "Info. do Certificado ",
-    "Resolver Server": "Resolver Servidor",
-    "Resource Record Type": "Tipo de registro de aplicação",
-    "Last Result": "Último resultado",
-    "Create your admin account": "Cria a tua conta de admin",
-    "Repeat Password": "Repete a senha",
-    "Import Backup": "Importar Backup",
-    "Export Backup": "Exportar Backup",
-    Export: "Exportar",
-    Import: "Importar",
-    respTime: "Tempo de Resp. (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Padrão habilitado",
-    "Apply on all existing monitors": "Aplicar em todos os monitores existentes",
-    Create: "Criar",
-    "Clear Data": "Limpar Dados",
-    Events: "Eventos",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Obter Automático",
-    backupDescription: "Podes fazer backup de todos os monitores e todas as notificações num arquivo JSON.",
-    backupDescription2: "OBS: Os dados do histórico e do evento não estão incluídos.",
-    backupDescription3: "Dados confidenciais, como tokens de notificação, estão incluídos no arquivo de exportação, mantem-no com cuidado.",
-    alertNoFile: "Seleciona um arquivo para importar.",
-    alertWrongFileType: "Seleciona um arquivo JSON.",
-    "Clear all statistics": "Limpar todas as estatísticas",
-    "Skip existing": "Saltar existente",
-    Overwrite: "Sobrescrever",
-    Options: "Opções",
-    "Keep both": "Manter os dois",
-    "Verify Token": "Verificar Token",
-    "Setup 2FA": "Configurar 2FA",
-    "Enable 2FA": "Ativar 2FA",
-    "Disable 2FA": "Desativar 2FA",
-    "2FA Settings": "Configurações do 2FA ",
-    "Two Factor Authentication": "Autenticação de Dois Fatores",
-    Active: "Ativo",
-    Inactive: "Inativo",
-    Token: "Token",
-    "Show URI": "Mostrar URI",
-    Tags: "Tag",
-    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar ...",
-    "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
-    "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
-    color: "cor",
-    "value (optional)": "valor (opcional)",
-    Gray: "Cinza",
-    Red: "Vermelho",
-    Orange: "Laranja",
-    Green: "Verde",
-    Blue: "Azul",
-    Indigo: "Índigo",
-    Purple: "Roxo",
-    Pink: "Rosa",
-    "Search...": "Pesquisa...",
-    "Avg. Ping": "Ping Médio.",
-    "Avg. Response": "Resposta Média. ",
-    "Status Page": "Página de Status",
-    "Status Pages": "Página de Status",
-    "Entry Page": "Página de entrada",
-    statusPageNothing: "Nada aqui, por favor, adiciona um grupo ou monitor.",
-    "No Services": "Nenhum Serviço",
-    "All Systems Operational": "Todos os Serviços Operacionais",
-    "Partially Degraded Service": "Serviço parcialmente degradados",
-    "Degraded Service": "Serviço Degradado",
-    "Add Group": "Adicionar Grupo",
-    "Add a monitor": "Adicionar um monitor",
-    "Edit Status Page": "Editar Página de Status",
-    "Go to Dashboard": "Ir para o dashboard",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js
deleted file mode 100644
index 2e6fdf7b..00000000
--- a/src/languages/ru-RU.js
+++ /dev/null
@@ -1,581 +0,0 @@
-export default {
-    languageName: "Русский",
-    checkEverySecond: "Проверка каждые {0} секунд",
-    retriesDescription: "Максимальное количество попыток перед пометкой сервиса как недоступного и отправкой уведомления",
-    ignoreTLSError: "Игнорировать ошибку TLS/SSL для HTTPS сайтов",
-    upsideDownModeDescription: "Реверс статуса сервиса. Если сервис доступен, то он помечается как НЕДОСТУПНЫЙ.",
-    maxRedirectDescription: "Максимальное количество перенаправлений. Поставьте 0, чтобы отключить перенаправления.",
-    acceptedStatusCodesDescription: "Выберите коды статусов для определения доступности сервиса.",
-    passwordNotMatchMsg: "Повтор пароля не совпадает.",
-    notificationDescription: "Привяжите уведомления к мониторам.",
-    keywordDescription: "Поиск слова в чистом HTML или в JSON-ответе (чувствительно к регистру)",
-    pauseDashboardHome: "Пауза",
-    deleteMonitorMsg: "Вы действительно хотите удалить данный монитор?",
-    deleteNotificationMsg: "Вы действительно хотите удалить это уведомление для всех мониторов?",
-    resolverserverDescription: "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.": "Сертификат истекает",
-    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": "Включить авторизацию",
-    "disableauth.message1": "Вы уверены, что хотите <strong>отключить авторизацию</strong>?",
-    "disableauth.message2": "Это подходит для <strong>тех, у кого стоит другая авторизация</strong> перед открытием Uptime Kuma, например Cloudflare Access.",
-    "Please use this option carefully!": "Пожалуйста, используйте с осторожностью.",
-    Logout: "Выйти",
-    Leave: "Отмена",
-    "I understand, please disable": "Я понимаю, всё равно отключить",
-    Confirm: "Подтвердить",
-    Yes: "Да",
-    No: "Нет",
-    Username: "Логин",
-    Password: "Пароль",
-    "Remember me": "Запомнить меня",
-    Login: "Вход в систему",
-    "No Monitors, please": "Мониторов нет, пожалуйста",
-    "No Monitors": "Мониторы отсутствуют",
-    "add one": "создайте новый",
-    "Notification Type": "Тип уведомления",
-    Email: "Почта",
-    Test: "Проверка",
-    "Certificate Info": "Информация о сертификате",
-    "Resolver Server": "DNS сервер",
-    "Resource Record Type": "Тип ресурсной записи",
-    "Last Result": "Последний результат",
-    "Create your admin account": "Создайте аккаунт администратора",
-    "Repeat Password": "Повторите пароль",
-    respTime: "Время ответа (мс)",
-    notAvailableShort: "N/A",
-    Create: "Создать",
-    clearEventsMsg: "Вы действительно хотите удалить всю статистику событий данного монитора?",
-    clearHeartbeatsMsg: "Вы действительно хотите удалить всю статистику опросов данного монитора?",
-    confirmClearStatisticsMsg: "Вы действительно хотите удалить ВСЮ статистику?",
-    "Clear Data": "Удалить статистику",
-    Events: "События",
-    Heartbeats: "Опросы",
-    "Auto Get": "Авто-получение",
-    enableDefaultNotificationDescription: "Для каждого нового монитора это уведомление будет включено по умолчанию. Вы всё ещё можете отключить уведомления в каждом мониторе отдельно.",
-    "Default enabled": "Использовать по умолчанию",
-    "Also apply to existing monitors": "Применить к существующим мониторам",
-    Export: "Экспорт",
-    Import: "Импорт",
-    backupDescription: "Вы можете сохранить резервную копию всех мониторов и уведомлений в виде JSON-файла",
-    backupDescription2: "P.S. История и события сохранены не будут",
-    backupDescription3: "Важные данные, такие как токены уведомлений, добавляются при экспорте, поэтому храните файлы в безопасном месте",
-    alertNoFile: "Выберите файл для импорта.",
-    alertWrongFileType: "Выберите JSON-файл.",
-    twoFAVerifyLabel: "Пожалуйста, введите свой токен, чтобы проверить работу 2FA",
-    tokenValidSettingsMsg: "Токен действителен! Теперь вы можете сохранить настройки 2FA.",
-    confirmEnableTwoFAMsg: "Вы действительно хотите включить 2FA?",
-    confirmDisableTwoFAMsg: "Вы действительно хотите выключить 2FA?",
-    "Apply on all existing monitors": "Применить ко всем существующим мониторам",
-    "Verify Token": "Проверить токен",
-    "Setup 2FA": "Настройка 2FA",
-    "Enable 2FA": "Включить 2FA",
-    "Disable 2FA": "Выключить 2FA",
-    "2FA Settings": "Настройки 2FA",
-    "Two Factor Authentication": "Двухфакторная аутентификация",
-    Active: "Активно",
-    Inactive: "Неактивно",
-    Token: "Токен",
-    "Show URI": "Показать URI",
-    "Clear all statistics": "Очистить статистику",
-    retryCheckEverySecond: "Повтор каждые {0} секунд",
-    importHandleDescription: "Выберите \"Пропустить существующие\", если вы хотите пропустить каждый монитор или уведомление с таким же именем. \"Перезаписать\" удалит каждый существующий монитор или уведомление и добавит заново. Вариант \"Не проверять\" принудительно восстанавливает все мониторы и уведомления, даже если они уже существуют.",
-    confirmImportMsg: "Вы действительно хотите восстановить резервную копию? Убедитесь, что вы выбрали подходящий вариант импорта.",
-    "Heartbeat Retry Interval": "Интервал повтора опроса",
-    "Import Backup": "Импорт",
-    "Export Backup": "Скачать",
-    "Skip existing": "Пропустить существующие",
-    Overwrite: "Перезаписать",
-    Options: "Опции",
-    "Keep both": "Не проверять",
-    Tags: "Теги",
-    "Add New below or Select...": "Добавить новый или выбрать...",
-    "Tag with this name already exist.": "Такой тег уже существует.",
-    "Tag with this value already exist.": "Тег с таким значением уже существует.",
-    color: "цвет",
-    "value (optional)": "значение (опционально)",
-    Gray: "Серый",
-    Red: "Красный",
-    Orange: "Оранжевый",
-    Green: "Зелёный",
-    Blue: "Синий",
-    Indigo: "Индиго",
-    Purple: "Пурпурный",
-    Pink: "Розовый",
-    "Search...": "Поиск...",
-    "Avg. Ping": "Среднее значение пинга",
-    "Avg. Response": "Среднее время ответа",
-    "Entry Page": "Главная страница",
-    statusPageNothing: "Здесь пусто. Добавьте группу или монитор.",
-    "No Services": "Нет сервисов",
-    "All Systems Operational": "Все системы работают в штатном режиме",
-    "Partially Degraded Service": "Сервисы работают частично",
-    "Degraded Service": "Все сервисы не работают",
-    "Add Group": "Добавить группу",
-    "Add a monitor": "Добавить монитор",
-    "Edit Status Page": "Редактировать",
-    "Go to Dashboard": "Панель управления",
-    "Status Page": "Страница статуса",
-    "Status Pages": "Страницы статуса",
-    Discard: "Отмена",
-    "Create Incident": "Создать инцидент",
-    "Switch to Dark Theme": "Тёмная тема",
-    "Switch to Light Theme": "Светлая тема",
-    telegram: "Telegram",
-    webhook: "Вебхук",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Поддержка 50+ сервисов уведомлений)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Основной URL",
-    "Push URL": "URL пуша",
-    needPushEvery: "К этому URL необходимо обращаться каждые {0} секунд",
-    pushOptionalParams: "Опциональные параметры: {0}",
-    defaultNotificationName: "Моё уведомление {notification} ({number})",
-    here: "здесь",
-    Required: "Требуется",
-    "Bot Token": "Токен бота",
-    wayToGetTelegramToken: "Вы можете взять токен здесь - {0}.",
-    "Chat ID": "ID чата",
-    supportTelegramChatID: "Поддерживаются ID чатов, групп и каналов",
-    wayToGetTelegramChatID: "Вы можете взять ID вашего чата, отправив сообщение боту и перейдя по этому URL для просмотра chat_id:",
-    "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ЗДЕСЬ",
-    chatIDNotFound: "ID чата не найден; пожалуйста отправьте сначала сообщение боту",
-    "Post URL": "Post URL",
-    "Content Type": "Тип контента",
-    webhookJsonDesc: "{0} подходит для любых современных HTTP-серверов, например Express.js",
-    webhookFormDataDesc: "{multipart} подходит для PHP. JSON-вывод необходимо будет обработать с помощью {decodeFunction}",
-    secureOptionNone: "Нет / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Игнорировать ошибки TLS",
-    "From Email": "От кого",
-    emailCustomSubject: "Своя тема",
-    "To Email": "Кому",
-    smtpCC: "Копия",
-    smtpBCC: "Скрытая копия",
-    "Discord Webhook URL": "Discord вебхук URL",
-    wayToGetDiscordURL: "Вы можете создать его в Параметрах сервера -> Интеграции -> Создать вебхук",
-    "Bot Display Name": "Отображаемое имя бота",
-    "Prefix Custom Message": "Свой префикс сообщения",
-    "Hello @everyone is...": "Привет {'@'}everyone это...",
-    "Webhook URL": "URL вебхука",
-    wayToGetTeamsURL: "Как создать URL вебхука вы можете узнать здесь - {0}.",
-    Number: "Номер",
-    Recipients: "Получатели",
-    needSignalAPI: "Вам необходим клиент Signal с поддержкой REST API.",
-    wayToCheckSignalURL: "Пройдите по этому URL, чтобы узнать как настроить такой клиент:",
-    signalImportant: "ВАЖНО: Нельзя смешивать в Получателях группы и номера!",
-    "Application Token": "Токен приложения",
-    "Server URL": "URL сервера",
-    Priority: "Приоритет",
-    "Icon Emoji": "Иконка Emoji",
-    "Channel Name": "Имя канала",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Больше информации о вебхуках: {0}",
-    aboutChannelName: "Введите имя канала в поле {0} Имя канала, если вы хотите обойти канал вебхука. Например: #other-channel",
-    aboutKumaURL: "Если поле Uptime Kuma URL в настройках останется пустым, по умолчанию будет использоваться ссылка на проект на GitHub.",
-    emojiCheatSheet: "Шпаргалка по Emoji: {0}",
-    "User Key": "Ключ пользователя",
-    Device: "Устройство",
-    "Message Title": "Заголовок сообщения",
-    "Notification Sound": "Звук уведомления",
-    "More info on:": "Больше информации: {0}",
-    pushoverDesc1: "Экстренный приоритет (2) имеет таймаут повтора по умолчанию 30 секунд и истекает через 1 час.",
-    pushoverDesc2: "Если вы хотите отправлять уведомления различным устройствам, необходимо заполнить поле Устройство.",
-    "SMS Type": "Тип SMS",
-    octopushTypePremium: "Премиум (Быстрый - рекомендуется для алертов)",
-    octopushTypeLowCost: "Дешёвый (Медленный - иногда блокируется операторами)",
-    checkPrice: "Тарифы {0}:",
-    octopushLegacyHint: "Вы используете старую версию Octopush (2011-2020) или новую?",
-    "Check octopush prices": "Тарифы Octopush {0}.",
-    octopushPhoneNumber: "Номер телефона (межд. формат, например: +79831234567) ",
-    octopushSMSSender: "Имя отправителя SMS: 3-11 символов алвафита, цифр и пробелов (a-zA-Z0-9)",
-    "LunaSea Device ID": "ID устройства LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Пример: {0}",
-    "Read more:": "Подробнее: {0}",
-    "Status:": "Статус: {0}",
-    "Read more": "Подробнее",
-    appriseInstalled: "Apprise установлен.",
-    appriseNotInstalled: "Apprise не установлен. {0}",
-    "Access Token": "Токен доступа",
-    "Channel access token": "Токен доступа канала",
-    "Line Developers Console": "Консоль разработчиков Line",
-    lineDevConsoleTo: "Консоль разработчиков Line - {0}",
-    "Basic Settings": "Базовые настройки",
-    "User ID": "ID пользователя",
-    "Messaging API": "API сообщений",
-    wayToGetLineChannelToken: "Сначала зайдите в {0}, создайте провайдера и канал (API сообщений), затем вы сможете получить токен доступа канала и ID пользователя из вышеупомянутых пунктов меню.",
-    "Icon URL": "URL иконки",
-    aboutIconURL: "Вы можете предоставить ссылку на иконку в поле \"URL иконки\" чтобы переопределить картинку профиля по умолчанию. Не используется, если задана иконка Emoji.",
-    aboutMattermostChannelName: "Вы можете переопределить канал по умолчанию, в который вебхук пишет, введя имя канала в поле \"Имя канала\". Это необходимо включить в настройках вебхука Mattermost. Например: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - дёшево и медленно, часто перегружен. Только для получателей из Польши.",
-    promosmsTypeFlash: "SMS FLASH - сообщения автоматически появятся на устройстве получателя. Только для получателей из Польши.",
-    promosmsTypeFull: "SMS FULL - премиум-уровень SMS, можно использовать своё имя отправителя (предварительно зарегистрировав его). Надёжно для алертов.",
-    promosmsTypeSpeed: "SMS SPEED - наивысший приоритет в системе. Очень быстро и надёжно, но очень дорого (в два раза дороже, чем SMS FULL).",
-    promosmsPhoneNumber: "Номер телефона (для получателей из Польши можно пропустить код региона)",
-    promosmsSMSSender: "Имя отправителя SMS: Зарегистрированное или одно из имён по умолчанию: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "URL сервера (вместе с http(s):// и опционально порт)",
-    "Internal Room Id": "Внутренний ID комнаты",
-    matrixDesc1: "Внутренний ID комнаты можно найти в Подробностях в параметрах канала вашего Matrix клиента. Он должен выглядеть примерно как !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Рекомендуется создать нового пользователя и не использовать токен доступа личного пользователя Matrix, т.к. это влечёт за собой полный доступ к аккаунту и к комнатам, в которых вы состоите. Вместо этого создайте нового пользователя и пригласите его только в ту комнату, в которой вы хотите получать уведомления. Токен доступа можно получить, выполнив команду {0}",
-    Method: "Метод",
-    Body: "Тело",
-    Headers: "Заголовки",
-    PushUrl: "URL пуша",
-    HeadersInvalidFormat: "Заголовки запроса некорректны JSON: ",
-    BodyInvalidFormat: "Тело запроса некорректно JSON: ",
-    "Monitor History": "Статистика",
-    clearDataOlderThan: "Сохранять статистику за {0} дней.",
-    PasswordsDoNotMatch: "Пароли не совпадают.",
-    records: "записей",
-    "One record": "Одна запись",
-    steamApiKeyDescription: "Для мониторинга игрового сервера Steam вам необходим Web-API ключ Steam. Зарегистрировать его можно здесь: ",
-    "Certificate Chain": "Цепочка сертификатов",
-    Valid: "Действительный",
-    "Hide Tags": "Скрыть тэги",
-    Title: "Название инцидента:",
-    Content: "Содержание инцидента:",
-    Post: "Опубликовать",
-    Cancel: "Отмена",
-    Created: "Создано",
-    Unpin: "Открепить",
-    "Show Tags": "Показать тэги",
-    recent: "Сейчас",
-    "3h": "3 часа",
-    "6h": "6 часов",
-    "24h": "24 часа",
-    "1w": "1 неделя",
-    "No monitors available.": "Нет доступных мониторов",
-    "Add one": "Добавить новый",
-    Backup: "Резервная копия",
-    Security: "Безопасность",
-    "Shrink Database": "Сжать Базу Данных",
-    "Current User": "Текущий пользователь",
-    About: "О программе",
-    Description: "Описание",
-    "Powered by": "Работает на основе скрипта от",
-    shrinkDatabaseDescription: "Включает VACUUM для базы данных SQLite. Если ваша база данных была создана на версии 1.10.0 и более, AUTO_VACUUM уже включен и это действие не требуется.",
-    deleteStatusPageMsg: "Вы действительно хотите удалить эту страницу статуса сервисов?",
-    Style: "Стиль",
-    info: "ИНФО",
-    warning: "ВНИМАНИЕ",
-    danger: "ОШИБКА",
-    primary: "ОСНОВНОЙ",
-    light: "СВЕТЛЫЙ",
-    dark: "ТЕМНЫЙ",
-    "New Status Page": "Новая страница статуса",
-    "Show update if available": "Показывать доступные обновления",
-    "Also check beta release": "Проверять обновления для бета версий",
-    "Add New Status Page": "Добавить страницу статуса",
-    Next: "Далее",
-    "Accept characters: a-z 0-9 -": "Разрешены символы: a-z 0-9 -",
-    "Start or end with a-z 0-9 only": "Начало и окончание имени только на символы: a-z 0-9",
-    "No consecutive dashes --": "Запрещено использовать тире --",
-    "HTTP Options": "HTTP Опции",
-    Authentication: "Аутентификация",
-    "HTTP Basic Auth": "HTTP Авторизация",
-    PushByTechulus: "Push by Techulus",
-    clicksendsms: "ClickSend SMS",
-    GoogleChat: "Google Chat (только Google Workspace)",
-    apiCredentials: "API реквизиты",
-    Done: "Готово",
-    Info: "Инфо",
-    "Steam API Key": "Steam API-Ключ",
-    "Pick a RR-Type...": "Выберите RR-Тип...",
-    "Pick Accepted Status Codes...": "Выберите принятые коды состояния...",
-    Default: "По умолчанию",
-    "Please input title and content": "Пожалуйста, введите название и содержание",
-    "Last Updated": "Последнее Обновление",
-    "Untitled Group": "Группа без названия",
-    Services: "Сервисы",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Пользователь (включая префикс webapi_)",
-    serwersmsAPIPassword: "API Пароль",
-    serwersmsPhoneNumber: "Номер телефона",
-    serwersmsSenderName: "SMS Имя Отправителя (регистрированный через пользовательский портал)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM Настройки",
-    smtpDkimDesc: "Пожалуйста ознакомьтесь с {0} Nodemailer DKIM для использования.",
-    documentation: "документацией",
-    smtpDkimDomain: "Имя Домена",
-    smtpDkimKeySelector: "Ключ",
-    smtpDkimPrivateKey: "Приватный ключ",
-    smtpDkimHashAlgo: "Алгоритм хэша (опционально)",
-    smtpDkimheaderFieldNames: "Заголовок ключей для подписи (опционально)",
-    smtpDkimskipFields: "Заголовок ключей не для подписи (опционально)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Конечная точка API",
-    alertaEnvironment: "Среда",
-    alertaApiKey: "Ключ API",
-    alertaAlertState: "Состояние алерта",
-    alertaRecoverState: "Состояние восстановления",
-    Proxies: "Прокси",
-    "Setup Proxy": "Настройка Прокси",
-    "Proxy Protocol": "Протокол Прокси",
-    "Proxy Server": "Прокси",
-    "Proxy server has authentication": "Прокси имеет аутентификацию",
-    "Reverse Proxy": "Обратный прокси",
-    "No Proxy": "Без прокси",
-    default: "По умолчанию",
-    enabled: "Включено",
-    setAsDefault: "Установлено по умолчанию",
-    deleteProxyMsg: "Вы действительно хотите удалить этот прокси для всех мониторов?",
-    proxyDescription: "Прокси должны быть привязаны к монитору, чтобы работать.",
-    enableProxyDescription: "Этот прокси не будет влиять на запросы монитора, пока не будет активирован. Вы можете контролировать временное отключение прокси для всех мониторов через статус активации.",
-    setAsDefaultProxyDescription: "Этот прокси будет по умолчанию включен для новых мониторов. Вы всё ещё можете отдельно отключать прокси в каждом мониторе.",
-    Invalid: "Недействительный",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Шаблон СМС должен содержать параметры: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "В целях безопасности необходимо использовать секретный ключ",
-    "Device Token": "Токен устройства",
-    Platform: "Платформа",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Повторить",
-    Topic: "Тема",
-    "WeCom Bot Key": "WeCom Bot Key",
-    User: "Пользователь",
-    Installed: "Установлено",
-    "Not installed": "Не установлено",
-    Running: "Запускается",
-    "Not running": "Не запускается",
-    "Remove Token": "Удалить токен",
-    Start: "Запустить",
-    Stop: "Остановить",
-    "Uptime Kuma": "Uptime Kuma",
-    Slug: "Slug",
-    "Accept characters:": "Принимаемые символы:",
-    startOrEndWithOnly: "Начинается или кончается только {0}",
-    "No consecutive dashes": "Без последовательных тире",
-    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
-    "Page Not Found": "Страница не найдена",
-    wayToGetCloudflaredURL: "(Скачать cloudflared с {0})",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Сообщение:",
-    "Don't know how to get the token? Please read the guide:": "Don't know how to get the token? Please read the guide:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.",
-    "HTTP Headers": "HTTP заголовки",
-    "Trust Proxy": "Доверять прокси",
-    "Other Software": "Другое программное обеспечение",
-    "For example: nginx, Apache and Traefik.": "К примеру: nginx, Apache и Traefik.",
-    "Please read": "Пожалуйста, прочитайте",
-    "Subject:": "Тема:",
-    "Valid To:": "Действителен до:",
-    "Days Remaining:": "Дней осталось:",
-    "Issuer:": "Издатель:",
-    "Fingerprint:": "Отпечаток:",
-    "No status pages": "Нет статусных страниц",
-    "Domain Name Expiry Notification": "Уведомление об истечении срока действия доменного имени",
-    Proxy: "Прокси",
-    "Date Created": "Дата создания",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Address",
-    onebotMessageType: "OneBot Message Type",
-    onebotGroupMessage: "Группа",
-    onebotPrivateMessage: "Private",
-    onebotUserOrGroupId: "Группа/ID пользователя",
-    onebotSafetyTips: "В целях безопасности необходимо установить токен доступа",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Текст нижнего колонтитула",
-    "Show Powered By": "Показывать на чем создано",
-    "Domain Names": "Доменные имена",
-    signedInDisp: "Вы вошли как {0}",
-    signedInDispDisabled: "Аутентификация отключена.",
-    RadiusSecret: "Секрет Radius",
-    RadiusSecretDescription: "Общий секрет между клиентом и сервером",
-    RadiusCalledStationId: "Идентификатор вызываемой станции",
-    RadiusCalledStationIdDescription: "Идентификатор вызываемого устройства",
-    RadiusCallingStationId: "Идентификатор вызывающей станции",
-    RadiusCallingStationIdDescription: "Идентификатор вызывающего устройства",
-    "Certificate Expiry Notification": "Уведомление об истечении срока действия сертификата",
-    "API Username": "Имя пользователя API",
-    "API Key": "API ключ",
-    "Recipient Number": "Номер получателя",
-    "From Name/Number": "Имя/номер отправителя",
-    "Leave blank to use a shared sender number.": "Оставьте пустым, чтобы использовать общий номер отправителя.",
-    "Octopush API Version": "Версия API Octopush",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" из учетных данных HTTP API в панели управления",
-    octopushLogin: "\"Login\" из учетных данных HTTP API в панели управления",
-    promosmsLogin: "Логин API",
-    promosmsPassword: "Пароль API",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Токен устройства",
-    "Using a Reverse Proxy?": "Используете обратный прокси?",
-    "Check how to config it for WebSocket": "Проверьте, как настроить его для WebSocket",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "Наиболее вероятные причины:",
-    "The resource is no longer available.": "Ресурс больше не доступен.",
-    "There might be a typing error in the address.": "В адресе может быть опечатка.",
-    "What you can try:": "Что вы можете попробовать:",
-    "Retype the address.": "Повторите адрес.",
-    "Go back to the previous page.": "Вернуться на предыдущую страницу.",
-    "Coming Soon": "Скоро",
-    wayToGetClickSendSMSToken: "Вы можете получить имя пользователя API и ключ API из {0} .",
-    "Connection String": "Строка подключения",
-    Query: "Запрос",
-    settingsCertificateExpiry: "Истекание TLS сертификата",
-    certificationExpiryDescription: "HTTPS Мониторы инициируют уведомление, когда срок действия сертификата TLS истечет:",
-    "Setup Docker Host": "Настроить Docker Host",
-    "Connection Type": "Тип соединения",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Are you sure want to delete this docker host for all monitors?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker контейнер",
-    "Container Name / ID": "Название контейнера / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "Домен",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "Вы находитесь в режиме без авторизации, пароль не требуется.",
-    trustProxyDescription: "Доверять заголовкам 'X-Forwarded-*'. Если вы хотите получить правильный IP-адрес клиента, а ваш Uptime Kuma находится под Nginx или Apache, вам следует включить этот параметр.",
-    wayToGetLineNotifyToken: "Вы можете получить токен доступа в {0}",
-    Examples: "Примеры",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Токен доступа с длительным сроком службы",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
-    "Notification Service": "Служба уведомлений",
-    "default: notify all devices": "по стандарту: уведомлять все устройства",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
-    "Automations can optionally be triggered in Home Assistant:": "При желании автоматизацию можно активировать в Home Assistant.:",
-    "Trigger type:": "Тип триггера:",
-    "Event type:": "Тип события:",
-    "Event data:": "Данные события:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Затем выберите действие, например, переключите сцену на красный индикатор RGB..",
-    "Frontend Version": "Версия интерфейса",
-    "Frontend Version do not match backend version!": "Версия интерфейса не соответствует версии серверной части!",
-    "Base URL": "Базовый URL",
-    goAlertInfo: "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
-    goAlertIntegrationKeyInfo: "Получить общий ключ интеграции API для сервиса в этом формате \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обычно значение параметра токена скопированного URL.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Устарело: поскольку добавлено множество функций, а эта функция резервного копирования немного не поддерживается, она не может создать или восстановить полную резервную копию.",
-    backupRecommend: "Сделайте резервную копию тома или папки с данными (./data/) напрямую.",
-    "Optional": "Необязательно",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "Документация к API SMSManager ",
-    "Gateway Type": "Тип шлюза",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Вы можете делить числа с",
-    "or": "или",
-};
diff --git a/src/languages/sl-SI.js b/src/languages/sl-SI.js
deleted file mode 100644
index 48bbeb20..00000000
--- a/src/languages/sl-SI.js
+++ /dev/null
@@ -1,357 +0,0 @@
-export default {
-    languageName: "Slovenščina",
-    checkEverySecond: "Preveri na vsakih {0} sekund",
-    retryCheckEverySecond: "Ponovno poskusi na vsakih {0} sekund",
-    retriesDescription: "Maksimalno število poskusov predenj se storitev označi kot 'ne deluje' in se pošlje obvestilo",
-    ignoreTLSError: "Ignoriraj TLS/SSL napake za HTTPS spletne strani",
-    upsideDownModeDescription: "Negiraj status. Če je storitev deluje bo označena kot 'ne deluje'.",
-    maxRedirectDescription: "Maksimalno število sledečih preusmeritev. 0 onemogoči preusmeritve.",
-    acceptedStatusCodesDescription: "Izberi kode statusa veljavna kot uspešen odgovor.",
-    passwordNotMatchMsg: "Ponovljeno geslo se ne ujema.",
-    notificationDescription: "Obvestila morajo biti dodeljena monitorju, da delujejo.",
-    keywordDescription: "Iskana ključna beseda v surovem HTML ali JSON odgovoru. Iskanje je občutljivo na začetnico.",
-    pauseDashboardHome: "Pavza",
-    deleteMonitorMsg: "Ste prepričani, da želite izbrisati ta monitor?",
-    deleteNotificationMsg: "Ste prepričani, da želite izbrisati to obvestilo za vse monitorje?",
-    resolverserverDescription: "Cloudflare je privzeti strežnik. DNS strežnik lahko spremenite kadarkoli.",
-    rrtypeDescription: "Izberite RR tip, ki ga želite spremljati",
-    pauseMonitorMsg: "Ste prepričani, da želite pavzirati?",
-    enableDefaultNotificationDescription: "To obvestilo bo kot privzeto omogočeno za vse nove monitorje. Še vedno ga lahko izključite posebej za vsak monitor.",
-    clearEventsMsg: "Ste prepričani da želite izbrisati vse dogodke tega monitorja?",
-    clearHeartbeatsMsg: "Ste prepričani da želite izbrisati vse srčne utripe tega monitorja?",
-    confirmClearStatisticsMsg: "Ste prepričani da želite izbrisati VSO statistiko?",
-    importHandleDescription: "Izberite 'Preskoči obstoječe', če želite preskočiti vsak monitor ali obvestilo z istim imenom. 'Prepiši' bo prepisal vse obstoječe monitorje in obvestila.",
-    confirmImportMsg: "Ste prepričani da želite uvoziti varnostno kopijo? Preverite da ste izbrali pravo opcijo za uvoz.",
-    twoFAVerifyLabel: "Prosimo vnesite žeton za potrditev 2FA:",
-    tokenValidSettingsMsg: "Žeton je veljaven! Sedaj lahko shranite 2FA nastavitev.",
-    confirmEnableTwoFAMsg: "Ste prepričani, da želite omogočiti 2FA?",
-    confirmDisableTwoFAMsg: "Ste prepričani, da želite onemogočiti 2FA?",
-    Settings: "Nastavitve",
-    Dashboard: "Nadzorna plošča",
-    "New Update": "Nova posodobitev",
-    Language: "Jezik",
-    Appearance: "Izgled",
-    Theme: "Teme",
-    General: "Splošno",
-    "Primary Base URL": "Primaren URL",
-    Version: "Različica",
-    "Check Update On GitHub": "Preveri posodobitev na GitHub-u",
-    List: "Seznam",
-    Add: "Dodaj",
-    "Add New Monitor": "Dodaj nov monitor",
-    "Quick Stats": "Hitro stanje",
-    Up: "Deluje",
-    Down: "Ne deluje",
-    Pending: "Na čakanju",
-    Unknown: "Neznano",
-    Pause: "Pavza",
-    Name: "Ime",
-    Status: "Status",
-    DateTime: "DateTime",
-    Message: "Sporočilo",
-    "No important events": "Ni pomembnih dogodkov",
-    Resume: "Nadaljuj",
-    Edit: "Uredi",
-    Delete: "Izbriši",
-    Current: "Trenutno",
-    Uptime: "Uptime",
-    "Cert Exp.": "Potek certifikata",
-    day: "dan | dni",
-    "-day": "-dni",
-    hour: "ura",
-    "-hour": "-ur",
-    Response: "Odgovor",
-    Ping: "Ping",
-    "Monitor Type": "Tip monitorja",
-    Keyword: "Ključna beseda",
-    "Friendly Name": "Ime za prikaz",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Vrata",
-    "Heartbeat Interval": "Interval srčnega utripa",
-    Retries: "Ponovni poskusi",
-    "Heartbeat Retry Interval": "Ponovni poskus srčnega utripa",
-    Advanced: "Napredno",
-    "Upside Down Mode": "Negiran način",
-    "Max. Redirects": "Max. preusmeritev",
-    "Accepted Status Codes": "Sprejete kode statusa",
-    "Push URL": "Push URL",
-    needPushEvery: "Pokliči ta URL vsakih {0} sekund.",
-    pushOptionalParams: "Dodatni parametri: {0}",
-    Save: "Shrani",
-    Notifications: "Obvestila",
-    "Not available, please setup.": "Ni na voljo, prosimo nastavite.",
-    "Setup Notification": "Nastavi obvestila",
-    Light: "Svetlo",
-    Dark: "Temno",
-    Auto: "Auto",
-    "Theme - Heartbeat Bar": "Tema - vrstica srčnega utripa",
-    Normal: "Normalna",
-    Bottom: "Spodaj",
-    None: "Brez",
-    Timezone: "Časovni pas",
-    "Search Engine Visibility": "Vidljivost v spletnih iskalnikih",
-    "Allow indexing": "Dovoli indeksiranje",
-    "Discourage search engines from indexing site": "Odvračaj spletne iskalnike od indeksiranja te strani",
-    "Change Password": "Zamenjaj geslo",
-    "Current Password": "Trenutno geslo",
-    "New Password": "Novo geslo",
-    "Repeat New Password": "Ponovi novo geslo",
-    "Update Password": "Posodobi geslo",
-    "Disable Auth": "Onemogoči auth",
-    "Enable Auth": "Omogoči auth",
-    "disableauth.message1": "Ali ste prepričani, da želite onemogočiti <strong>avtentikacijo</strong>?",
-    "disableauth.message2": "Namenjen je <strong>nekomu, ki ima pred programom Uptime Kuma vklopljeno zunanje preverjanje pristnosti</strong>, na primer Cloudflare Access.",
-    "Please use this option carefully!": "Uporabljajte previdno.",
-    Logout: "Odjava",
-    Leave: "Zapusti",
-    "I understand, please disable": "Razumem, prosim onemogočite",
-    Confirm: "Potrdi",
-    Yes: "Da",
-    No: "Ne",
-    Username: "Uporabniško ime",
-    Password: "Geslo",
-    "Remember me": "Zapomni si me",
-    Login: "Vpis",
-    "No Monitors, please": "Prosim, brez monitorjev",
-    "add one": "Dodaj enega",
-    "Notification Type": "Tip obvestila",
-    Email: "Email",
-    Test: "Test",
-    "Certificate Info": "Informacije certifikata",
-    "Resolver Server": "Strežnik za razreševanje",
-    "Resource Record Type": "Vrsta zapisa o viru",
-    "Last Result": "Zadnji rezultat",
-    "Create your admin account": "Ustvari administratorski račun",
-    "Repeat Password": "Ponovi geslo",
-    "Import Backup": "Uvozi varnostno kopijo",
-    "Export Backup": "Izvozi varnostno kopijo",
-    Export: "Izvozi",
-    Import: "Uvozi",
-    respTime: "Odzivni čas (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Privzeto omogočeno",
-    "Apply on all existing monitors": "Uporabi na vseh obstoječih monitorjih",
-    Create: "Ustvari",
-    "Clear Data": "Izbriši podatke",
-    Events: "Dogodki",
-    Heartbeats: "Srčni utripi",
-    "Auto Get": "Auto Get",
-    backupDescription: "Izvozite lahko vse monitorje in obvestila v JSON datoteko.",
-    backupDescription2: "Pomni: Zgodovina in podatki dogodkov niso vključeni.",
-    backupDescription3: "Občutljivi podatki, kot žetoni za obvestila so vlkjučeni v datoteko za izvoz; prosimo hranite na varnem.",
-    alertNoFile: "Izberite datoteko za Uvoz.",
-    alertWrongFileType: "Prosimo izberite JSON datoteko.",
-    "Clear all statistics": "Pobrišite vso statistiko",
-    "Skip existing": "Preskoči obstoječe",
-    Overwrite: "Prepiši",
-    Options: "Možnosti",
-    "Keep both": "Ohrani oboje",
-    "Verify Token": "Potrdi žeton",
-    "Setup 2FA": "Nastavi 2FA",
-    "Enable 2FA": "Omogoči 2FA",
-    "Disable 2FA": "Onemogoči 2FA",
-    "2FA Settings": "2FA nastavitve",
-    "Two Factor Authentication": "Preverjanje pristnosti z dvema dejavnikoma",
-    Active: "Aktivno",
-    Inactive: "Neaktivno",
-    Token: "Žeton",
-    "Show URI": "Prikaži URI",
-    Tags: "Značke",
-    "Add New below or Select...": "Dodaj novo spodaj ali izberi iz seznama...",
-    "Tag with this name already exist.": "Značka s tem imenom že obstaja.",
-    "Tag with this value already exist.": "Značka s to vrednostjo že obstaja.",
-    color: "barva",
-    "value (optional)": "vrednost (po želji)",
-    Gray: "Siva",
-    Red: "Rdeča",
-    Orange: "Oranžna",
-    Green: "Zelena",
-    Blue: "Modra",
-    Indigo: "Indigo",
-    Purple: "Vijolična",
-    Pink: "Roza",
-    "Search...": "Išči...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. odziv",
-    "Entry Page": "Vstopna stran",
-    statusPageNothing: "Nikjer nič... Dodajte skupino ali monitor.",
-    "No Services": "Ni storitev",
-    "All Systems Operational": "Vsi sistemi delujejo",
-    "Partially Degraded Service": "Delno poslabšana storitev",
-    "Degraded Service": "Poslabšana storitev",
-    "Add Group": "Dodaj skupino",
-    "Add a monitor": "Dodaj monitor",
-    "Edit Status Page": "Uredi statusno stran",
-    "Go to Dashboard": "Pojdi na nadzorno ploščo",
-    "Status Page": "Statusna stran",
-    "Status Pages": "Statusne strani",
-    defaultNotificationName: "Moje {notification} Obvestilo ({number})",
-    here: "tukaj",
-    Required: "Obvezno",
-    telegram: "Telegram",
-    "Bot Token": "Robotkov žetonček",
-    wayToGetTelegramToken: "Lahko dobiš žeton od {0}.",
-    "Chat ID": "ID pogovora",
-    supportTelegramChatID: "Direkten pogovor pomoči / Skupina / ID kanala",
-    wayToGetTelegramChatID: "Id lahko dobiš, če pošlješ sporočilo robotku in odpreš ta URL, da bi videl chat_id:",
-    "YOUR BOT TOKEN HERE": "ROBOTKOV ŽETON TUKAJ",
-    chatIDNotFound: "Ne najdem Chat Id-ja; prvo pošlji sporočilo robotku",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Vrsta vsebine",
-    webhookJsonDesc: "{0} je v redu za vsak moderen HTTP strežnik, kot recimo Express.js",
-    webhookFormDataDesc: "{multipart} je v redu za PHP. JSON bo moral biti razčlenjen s {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "Brez / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ignoriraj TLS napako",
-    "From Email": "Od Email",
-    emailCustomSubject: "Poljubna zadeva",
-    "To Email": "Za Email",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "To lahko dibiš v Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "Prikazno ime robotka",
-    "Prefix Custom Message": "Predpona poljubnega sporočila",
-    "Hello @everyone is...": "Pozdravljen {'@'}everyone je...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Izvedi kako narediš webhook URL {0}.",
-    signal: "Signal",
-    Number: "Številka",
-    Recipients: "Prejemniki",
-    needSignalAPI: "Imeti moraš signal klienta z REST API.",
-    wayToCheckSignalURL: "Kako se to naredi, lahko preveriš na tem URL-ju:",
-    signalImportant: "POMEMBNO: Ne moreš mešati skupin in številk v prejemnikih!",
-    gotify: "Gotify",
-    "Application Token": "Žeton za aplikacijo",
-    "Server URL": "URL Strežnika",
-    Priority: "Prioriteta",
-    slack: "Slack",
-    "Icon Emoji": "Emoji ikona",
-    "Channel Name": "Ime kanala",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Več o webhook-ih: {0}",
-    aboutChannelName: "Vnesi ime kanala na {0} Channel Name polje, če želiš preskočiti webhook kanal. npr.: #drug-kanal",
-    aboutKumaURL: "Če pustite polje Uptime Kuma URL prazno, bo nastavljeno privzeto na GitHub stran projekta.",
-    emojiCheatSheet: "Emoji plonk listek: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (podpira 50+ storitev za obveščevanje)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "User Key",
-    Device: "Naprava",
-    "Message Title": "Naslov sporočila",
-    "Notification Sound": "Zvok obvestila",
-    "More info on:": "Več informacij na: {0}",
-    pushoverDesc1: "Prioriteta nujnosti (2) ima privzeto nastavitev 30 sekund časa med ponovni poskusi in poteče po 1 uri.",
-    pushoverDesc2: "Če želite pošiljati obvestila na različne naprave izpolnite polje 'Naprava'.",
-    "SMS Type": "Vrsta SMS-a",
-    octopushTypePremium: "Premium (hitro - priporočljivo za opozarjanje)",
-    octopushTypeLowCost: "Cenovno ugodno (počasno - včasih jih blokira operater)",
-    checkPrice: "preveri {0} cene:",
-    apiCredentials: "API poverilnice",
-    octopushLegacyHint: "Uporabljate legacy verzijo Octopush-a (2011-2020) ali novo verzijo?",
-    "Check octopush prices": "Preveri octopush cene {0}.",
-    octopushPhoneNumber: "Telefonska številka (npr.: +386031234567) ",
-    octopushSMSSender: "Ime SMS pošiljatelja: 3-11 alfanumeričnih znakov in presledki (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Primer: {0}",
-    "Read more:": "Preberi več: {0}",
-    "Status:": "Status: {0}",
-    "Read more": "Preberi več",
-    appriseInstalled: "Apprise je nameščen.",
-    appriseNotInstalled: "Apprise ni nameščen. {0}",
-    "Access Token": "Žeton za dostop",
-    "Channel access token": "Žeton za dostop do kanala",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Osnovne nastavitve",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Prvo odpri {0}, ustvarite ponudnika in kanal (Messaging API), potem lahko žeton za dostop do kanala in ID uporabnika dobite iz zgoraj navedenih elementov menija.",
-    "Icon URL": "URL ikone",
-    aboutIconURL: "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji.",
-    aboutMattermostChannelName: "V razdelku \"URL ikone\" lahko zagotovite povezavo do slike, ki bo nadomestila privzeto sliko profila. Ne bo uporabljena, če je nastavljena ikona Emoji",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - poceni, vendar počasen in pogosto preobremenjen. Omejeno samo na poljske prejemnike.",
-    promosmsTypeFlash: "SMS FLASH - sporočilo se samodejno prikaže v napravi prejemnika. Omejeno samo na poljske prejemnike.",
-    promosmsTypeFull: "SMS FULL - Premium raven SMS, Uporabite lahko svoje ime pošiljatelja (najprej morate registrirati ime). Zanesljivo za opozorila.",
-    promosmsTypeSpeed: "SMS SPEED - Najvišja prednost v sistemu. Zelo hitro in zanesljivo, vendar drago (približno dvakratnik cene SMS FULL)..",
-    promosmsPhoneNumber: "Telefonska številka (za poljskega prejemnika Lahko preskočite področne oznake",
-    promosmsSMSSender: "Ime pošiljatelja SMS : vnaprej registrirano ime ali eno od privzetih: SMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (z http(s):// in vrata po želji)",
-    "Internal Room Id": "Interni ID sobe",
-    matrixDesc1: "Notranji ID sobe lahko poiščete v naprednem razdelku nastavitev sobe v odjemalcu Matrix. Izgledati mora kot !QMdRCpUIfLwsfjxye6:home.server",
-    matrixDesc2: "Zelo priporočljivo je, da ustvarite novega uporabnika in ne uporabljate svojega žetona za dostop uporabnika Matrix, saj bo omogočil popoln dostop do vašega računa in vseh sob, ki ste se jim pridružili. Namesto tega ustvarite novega uporabnika in ga povabite le v sobo, v kateri želite prejemati obvestila. Token dostopa lahko dobite tako, da zaženete {0}",
-    Method: "Metoda",
-    Body: "Telo",
-    Headers: "Glave",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Glave zahtevka niso veljavni JSON: ",
-    BodyInvalidFormat: "Telo zahteve ni veljaven JSON: ",
-    "Monitor History": "Zgodovina",
-    clearDataOlderThan: "Ohrani zgodovino {0} dni.",
-    PasswordsDoNotMatch: "Gesli se ne ujemata.",
-    records: "vnosi",
-    "One record": "En vnos",
-    steamApiKeyDescription: "Za spremljanje igralnega strežnika Steam potrebujete ključ spletnega vmesnika Steam. Ključ API lahko registrirate tukaj: ",
-    "Current User": "Trenuten uporabnik",
-    recent: "Nedavno",
-    Done: "Zaključi",
-    Info: "Info",
-    Security: "Varnost",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Stisni bazo",
-    "Pick a RR-Type...": "Izberi RR tip...",
-    "Pick Accepted Status Codes...": "Izbiranje sprejetih kod stanja...",
-    Default: "Privzeto",
-    "HTTP Options": "HTTP možnosti",
-    "Create Incident": "Ustvari incident",
-    Title: "Naslov",
-    Content: "Vsebina",
-    Style: "Stil",
-    info: "info",
-    warning: "opozorilo",
-    danger: "nevarnost",
-    primary: "primarno",
-    light: "svetlo",
-    dark: "temno",
-    Post: "Objavi",
-    "Please input title and content": "Vnesi naslov in vsebino",
-    Created: "Ustvarjeno",
-    "Last Updated": "Nazadnje posodobljeno",
-    Unpin: "Odpni",
-    "Switch to Light Theme": "Preklopi na svetlo temo",
-    "Switch to Dark Theme": "Preklopi na temno temo",
-    "Show Tags": "Prikaži značke",
-    "Hide Tags": "Skrij značke",
-    Description: "Opis",
-    "No monitors available.": "Nobenega monitorja ni na voljo.",
-    "Add one": "Dodaj enega",
-    "No Monitors": "Ni monitorjev",
-    "Untitled Group": "Skupina brez imena",
-    Services: "Storitve",
-    Discard: "zavrzi",
-    Cancel: "Prekliči",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "Sprožitev podatkovne zbirke VACUUM za SQLite. Če je vaša zbirka podatkov ustvarjena po različici 1.10.0, je funkcija AUTO_VACUUM že omogočena in ta ukrep ni potreben.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API uporabniško ime (vključno z webapi_ prefix)",
-    serwersmsAPIPassword: "API geslo",
-    serwersmsPhoneNumber: "Telefonska številka",
-    serwersmsSenderName: "Ime SMS pošiljatelja (registrirani prek portala za stranke)",
-    "stackfield": "Stackfield",
-};
diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js
deleted file mode 100644
index 32e074ee..00000000
--- a/src/languages/sr-latn.js
+++ /dev/null
@@ -1,204 +0,0 @@
-export default {
-    languageName: "Srpski",
-    checkEverySecond: "Proveri svakih {0} sekundi.",
-    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?",
-    resolverserverDescription: "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.",
-    day: "dan | dana",
-    "-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",
-    "disableauth.message1": "Da li ste sigurni da želite da <strong>isključite autentifikaciju</strong>?",
-    "disableauth.message2": "To je za <strong>one koji imaju dodatu autentifikaciju</strong> ispred Uptime Kuma kao na primer Cloudflare Access.",
-    "Please use this option carefully!": "Molim Vas koristite ovo sa pažnjom.",
-    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",
-    Create: "Create",
-    clearEventsMsg: "Are you sure want to delete all events for this monitor?",
-    clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
-    confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?",
-    "Clear Data": "Clear Data",
-    Events: "Events",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
-    "Default enabled": "Default enabled",
-    "Also apply to existing monitors": "Also apply to existing monitors",
-    Export: "Export",
-    Import: "Import",
-    backupDescription: "You can backup all monitors and all notifications into a JSON file.",
-    backupDescription2: "PS: History and event data is not included.",
-    backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
-    alertNoFile: "Please select a file to import.",
-    alertWrongFileType: "Please select a JSON file.",
-    twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
-    tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
-    confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    "Apply on all existing monitors": "Apply on all existing monitors",
-    "Verify Token": "Verify Token",
-    "Setup 2FA": "Setup 2FA",
-    "Enable 2FA": "Enable 2FA",
-    "Disable 2FA": "Disable 2FA",
-    "2FA Settings": "2FA Settings",
-    "Two Factor Authentication": "Two Factor Authentication",
-    Active: "Active",
-    Inactive: "Inactive",
-    Token: "Token",
-    "Show URI": "Show URI",
-    "Clear all statistics": "Clear all Statistics",
-    retryCheckEverySecond: "Retry every {0} seconds.",
-    importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "Import Backup",
-    "Export Backup": "Export Backup",
-    "Skip existing": "Skip existing",
-    Overwrite: "Overwrite",
-    Options: "Options",
-    "Keep both": "Keep both",
-    Tags: "Tags",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exist.",
-    "Tag with this value already exist.": "Tag with this value already exist.",
-    color: "color",
-    "value (optional)": "value (optional)",
-    Gray: "Gray",
-    Red: "Red",
-    Orange: "Orange",
-    Green: "Green",
-    Blue: "Blue",
-    Indigo: "Indigo",
-    Purple: "Purple",
-    Pink: "Pink",
-    "Search...": "Search...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. Response",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Nothing here, please add a group or a monitor.",
-    "No Services": "No Services",
-    "All Systems Operational": "All Systems Operational",
-    "Partially Degraded Service": "Partially Degraded Service",
-    "Degraded Service": "Degraded Service",
-    "Add Group": "Add Group",
-    "Add a monitor": "Add a monitor",
-    "Edit Status Page": "Edit Status Page",
-    "Go to Dashboard": "Go to Dashboard",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/sr.js b/src/languages/sr.js
deleted file mode 100644
index bd8e4dd3..00000000
--- a/src/languages/sr.js
+++ /dev/null
@@ -1,204 +0,0 @@
-export default {
-    languageName: "Српски",
-    checkEverySecond: "Провери сваких {0} секунди.",
-    retriesDescription: "Максимум покушаја пре него што се сервис обележи као неактиван и пошаље се обавештење.",
-    ignoreTLSError: "Игнориши TLS/SSL грешке за HTTPS веб странице.",
-    upsideDownModeDescription: "Обрните статус. Ако је сервис доступан, онда је обележен као неактиван.",
-    maxRedirectDescription: "Максимани број преусмерења да се прате. Поставите на 0 да би се искључила преусмерења.",
-    acceptedStatusCodesDescription: "Одаберите статусне кодове који се сматрају успешним одговором.",
-    passwordNotMatchMsg: "Поновљена лозинка се не поклапа.",
-    notificationDescription: "Молим Вас поставите обавештење за масматраче да бисе активирали.",
-    keywordDescription: "Претражи кључну реч у чистом html или JSON одговору са осетљивим великим и малим словима",
-    pauseDashboardHome: "Паузирај",
-    deleteMonitorMsg: "Да ли сте сигурни да желите да обришете овог посматрача?",
-    deleteNotificationMsg: "Да ли сте сигурни д ажелите да уклоните ово обавештење за све посматраче?",
-    resolverserverDescription: "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.": "Истек серт.",
-    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": "Укључи аутентификацију",
-    "disableauth.message1": "Да ли сте сигурни да желите да <strong>искључите аутентификацију</strong>?",
-    "disableauth.message2": "То је за <strong>оне који имају додату аутентификацију</strong> испред Uptime Kuma као на пример Cloudflare Access.",
-    "Please use this option carefully!": "Молим Вас користите ово са пажњом.",
-    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",
-    Create: "Create",
-    clearEventsMsg: "Are you sure want to delete all events for this monitor?",
-    clearHeartbeatsMsg: "Are you sure want to delete all heartbeats for this monitor?",
-    confirmClearStatisticsMsg: "Are you sure want to delete ALL statistics?",
-    "Clear Data": "Clear Data",
-    Events: "Events",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Auto Get",
-    enableDefaultNotificationDescription: "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
-    "Default enabled": "Default enabled",
-    "Also apply to existing monitors": "Also apply to existing monitors",
-    Export: "Export",
-    Import: "Import",
-    backupDescription: "You can backup all monitors and all notifications into a JSON file.",
-    backupDescription2: "PS: History and event data is not included.",
-    backupDescription3: "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
-    alertNoFile: "Please select a file to import.",
-    alertWrongFileType: "Please select a JSON file.",
-    twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
-    tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
-    confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    "Apply on all existing monitors": "Apply on all existing monitors",
-    "Verify Token": "Verify Token",
-    "Setup 2FA": "Setup 2FA",
-    "Enable 2FA": "Enable 2FA",
-    "Disable 2FA": "Disable 2FA",
-    "2FA Settings": "2FA Settings",
-    "Two Factor Authentication": "Two Factor Authentication",
-    Active: "Active",
-    Inactive: "Inactive",
-    Token: "Token",
-    "Show URI": "Show URI",
-    "Clear all statistics": "Clear all Statistics",
-    retryCheckEverySecond: "Retry every {0} seconds.",
-    importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "Import Backup",
-    "Export Backup": "Export Backup",
-    "Skip existing": "Skip existing",
-    Overwrite: "Overwrite",
-    Options: "Options",
-    "Keep both": "Keep both",
-    Tags: "Tags",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exist.",
-    "Tag with this value already exist.": "Tag with this value already exist.",
-    color: "color",
-    "value (optional)": "value (optional)",
-    Gray: "Gray",
-    Red: "Red",
-    Orange: "Orange",
-    Green: "Green",
-    Blue: "Blue",
-    Indigo: "Indigo",
-    Purple: "Purple",
-    Pink: "Pink",
-    "Search...": "Search...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. Response",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Nothing here, please add a group or a monitor.",
-    "No Services": "No Services",
-    "All Systems Operational": "All Systems Operational",
-    "Partially Degraded Service": "Partially Degraded Service",
-    "Degraded Service": "Degraded Service",
-    "Add Group": "Add Group",
-    "Add a monitor": "Add a monitor",
-    "Edit Status Page": "Edit Status Page",
-    "Go to Dashboard": "Go to Dashboard",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Support 50+ Notification services)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-};
diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js
deleted file mode 100644
index 1fc35be1..00000000
--- a/src/languages/sv-SE.js
+++ /dev/null
@@ -1,110 +0,0 @@
-export default {
-    languageName: "Svenska",
-    checkEverySecond: "Uppdatera var {0} sekund.",
-    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ösenordet stämmer ej överens.",
-    notificationDescription: "Vänligen lägg till en notistjänst till dina övervakare.",
-    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?",
-    resolverserverDescription: "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: "Pausa",
-    Name: "Namn",
-    Status: "Status",
-    DateTime: "Datum & Tid",
-    Message: "Meddelande",
-    "No important events": "Inga viktiga händelser",
-    Resume: "Återuppta",
-    Edit: "Redigera",
-    Delete: "Ta bort",
-    Current: "Nuvarande",
-    Uptime: "Drifttid",
-    "Cert Exp.": "Certifikat utgår",
-    day: "dag | dagar",
-    "-day": " dagar",
-    hour: "timme",
-    "-hour": " timmar",
-    Response: "Svar",
-    Ping: "Ping",
-    "Monitor Type": "Övervakningstyp",
-    Keyword: "Nyckelord",
-    "Friendly Name": "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": "Ny Notistjänst",
-    Light: "Ljust",
-    Dark: "Mörkt",
-    Auto: "Automatiskt",
-    "Theme - Heartbeat Bar": "Tema - Heartbeat Bar",
-    Normal: "Normal",
-    Bottom: "Botten",
-    None: "Tomt",
-    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",
-    respTime: "Svarstid (ms)",
-    notAvailableShort: "Ej Tillg.",
-};
diff --git a/src/languages/th-TH.js b/src/languages/th-TH.js
deleted file mode 100644
index 3d847038..00000000
--- a/src/languages/th-TH.js
+++ /dev/null
@@ -1,580 +0,0 @@
-export default {
-    languageName: "ไทย",
-    checkEverySecond: "ตรวจสอบทุก {0} วินาที",
-    retryCheckEverySecond: "ลองใหม่ทุก {0} วินาที",
-    retriesDescription: "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
-    ignoreTLSError: "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
-    upsideDownModeDescription: "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
-    maxRedirectDescription: "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั้งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
-    acceptedStatusCodesDescription: "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
-    passwordNotMatchMsg: "รหัสผ่านไม่ตรงกัน",
-    notificationDescription: "การแจ้งเตือนต้องกำหนดให้มอนิเตอร์เพื่อให้สามารถใช้งานได้",
-    keywordDescription: "ค้นหาคำสำคัญใน HTML หรือ JSON ของการตอบกลับ, คำสำคัญต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่",
-    pauseDashboardHome: "หยุดชั่วคราว",
-    deleteMonitorMsg: "คุณแน่ใจหรือไม่ที่จะลบมอนิเตอร์?",
-    deleteNotificationMsg: "คุณแน่ใจหรือไม่ที่จะลบการแจ้งเตือนสำหรับมอนิเตอร์ทั้งหมด?",
-    resolverserverDescription: "Cloudflare เป็นเซิร์ฟเวอร์ค้นหาเริ่มต้น, คุณสามารถเปลี่ยนเซิร์ฟเวอร์ได้ตลอดเวลา",
-    rrtypeDescription: "เลือกประเภท DNS Record ที่คุณต้องการจะมอนิเตอร์",
-    pauseMonitorMsg: "คุณแน่ใจหรือไม่ที่จะหยุดมอนิเตอร์ชั่วคราว?",
-    enableDefaultNotificationDescription: "การแจ้งเตือนนี้จะถูกเปิดโดยค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
-    clearEventsMsg: "คุณแน่ใจหรือไม่ที่จะลบเหตุการณ์ทั้งหมดสำหรับมอนิเตอร์นี้?",
-    clearHeartbeatsMsg: "คุณแน่ใจหรือไม่ที่จะลบประวัติการตรวจสอบทั้งหมดสำหรับมอนิเตอร์นี้?",
-    confirmClearStatisticsMsg: "คุณแน่ใจหรือไม่ที่จะลบสถิติทั้งหมด?",
-    importHandleDescription: "เลือก \"ข้ามรายการที่มีอยู่แล้ว\" ถ้าคุณต้องการข้ามทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน, \"เขียนทับ\" จะลบทุกมอนิเตอร์หรือการแจ้งเตือนที่มีชื่อซ้ำกัน",
-    confirmImportMsg: "คุณแน่ใจหรือไม่ที่จะนำเข้าข้อมูลสำรอง, กรุณาตรวจสอบว่าคุณเลือกข้อมูลที่ถูกต้อง",
-    twoFAVerifyLabel: "โปรดกรอกกุญแจ 2FA ของคุณเพื่อยืนยัน:",
-    tokenValidSettingsMsg: "กุญแจถูกต้อง, ตอนนี้คุณสามารถบันทึกการตั้งค่า 2FA ของคุณได้แล้ว",
-    confirmEnableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะเปิดใช้งาน 2FA?",
-    confirmDisableTwoFAMsg: "คุณแน่ใจหรือไม่ที่จะปิดใช้งาน 2FA?",
-    Settings: "การตั้งค่า",
-    Dashboard: "แผงควบคุม",
-    "New Update": "อัพเดทใหม่",
-    Language: "ภาษา",
-    Appearance: "รูปร่าง",
-    Theme: "หน้าตา",
-    General: "ทั่วไป",
-    "Primary Base URL": "URL หลัก",
-    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: "จำนวนครั้งที่จะลองใหม่",
-    "Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
-    Advanced: "ขั้นสูง",
-    "Upside Down Mode": "โหมดกลับด้าน",
-    "Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด",
-    "Accepted Status Codes": "รหัสสถานะที่ยอมรับ",
-    "Push URL": "URL เป้าหมาย",
-    needPushEvery: "คุณควรเรียก URL นี้ทุก {0} วินาที",
-    pushOptionalParams: "ตัวแปรเสริม: {0}",
-    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": "เปิดใช้งานการตรวจสอบสิทธิ์",
-    "disableauth.message1": "คุณต้องการที่จะ <strong>ปิดใช้งานระบบรับรองความถูกต้องใช่หรือไม่</strong>?",
-    "disableauth.message2": "ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่น ๆ",
-    "Please use this option carefully!": "โปรดใช้ความระมัดระวังในการเลือกใช้งานระบบนี้ !",
-    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": "ประเภท DNS Record",
-    "Last Result": "ผลล่าสุด",
-    "Create your admin account": "สร้างบัญชีผู้ดูแลระบบ",
-    "Repeat Password": "ยืนยันรหัสผ่าน",
-    "Import Backup": "นำเข้าข้อมูลสำรอง",
-    "Export Backup": "ส่งออกข้อมูลสำรอง",
-    Export: "ส่งออก",
-    Import: "นำเข้า",
-    respTime: "ระยะเวลาการตอบสนอง (ms)",
-    notAvailableShort: "ไม่สามารถใช้งานได้",
-    "Default enabled": "เปิดใช้งานโดยค่าเริ่มต้น",
-    "Apply on all existing monitors": "ใช้กับมอนิเตอร์ทั้งหมด",
-    Create: "สร้าง",
-    "Clear Data": "ล้างข้อมูล",
-    Events: "เหตุการณ์",
-    Heartbeats: "ประวัติการตรวจสอบ",
-    "Auto Get": "ดึงอัตโนมัติ",
-    backupDescription: "คุณสามารถสำรองข้อมูลการแจ้งเตือนและมอนิเตอร์ทั้งหมดไว้ได้ในไฟล์ JSON",
-    backupDescription2: "หมายเหตุ : ประวัติและข้อมูลเหตการณ์จะไม่ถูกสำรอง",
-    backupDescription3: "ข้อมูลที่ละเอียดอ่อนเช่นกุญแจการแจ้งเตือนจะรวมอยู่ในไฟล์ข้อมูลสำรอง, โปรดเก็บข้อมูลสำรองอย่างปลอดภัย",
-    alertNoFile: "กรุณาเลือกไฟล์ที่จะใช้งาน",
-    alertWrongFileType: "กรุณาเลือกไฟล์ที่เป็น JSON",
-    "Clear all statistics": "ล้างข้อมูลสถิติทั้งหมด",
-    "Skip existing": "ข้ามรายการที่มีอยู่แล้ว",
-    Overwrite: "เขียนทับ",
-    Options: "ตัวเลือก",
-    "Keep both": "เก็บทั้งสอง",
-    "Verify Token": "ยืนยันกุญแจ",
-    "Setup 2FA": "ติดตั้ง 2FA",
-    "Enable 2FA": "เปิดใช้งาน 2FA",
-    "Disable 2FA": "ปิดใช้งาน 2FA",
-    "2FA Settings": "ตั้งค่า 2FA",
-    "Two Factor Authentication": "การยืนยันตัวตนแบบสองขั้นตอน",
-    Active: "ใช้งาน",
-    Inactive: "ไม่ใช้งาน",
-    Token: "กุญแจ",
-    "Show URI": "แสดง URI",
-    Tags: "แท็ก",
-    "Add New below or Select...": "เพิ่มใหม่ด้านล่างหรือเลือก...",
-    "Tag with this name already exist.": "แท็กที่มีชื่อนี้มีอยู่แล้ว",
-    "Tag with this value already exist.": "แท็กที่มีข้อมูลนี้มีอยู่แล้ว",
-    color: "สี",
-    "value (optional)": "ข้อมูล (ไม่จำเป็น)",
-    Gray: "เทา",
-    Red: "แดง",
-    Orange: "ส้ม",
-    Green: "เขียว",
-    Blue: "น้ำเงิน",
-    Indigo: "ม่วง",
-    Purple: "ม่วง",
-    Pink: "ชมพู",
-    "Search...": "ค้นหา...",
-    "Avg. Ping": "ค่า Ping เฉลี่ย",
-    "Avg. Response": "ค่า Response เฉลี่ย",
-    "Entry Page": "หน้าต้อนรับ",
-    statusPageNothing: "ไม่มีอะไรตรงนี้ !, กรุณาเพิ่มกลุ่มหรือมอนิเตอร์",
-    "No Services": "ไม่มีบริการ",
-    "All Systems Operational": "บริการทั้งหมดทำงานได้ปกติ",
-    "Partially Degraded Service": "บริการมีปัญหาบางส่วน",
-    "Degraded Service": "บริการมีปัญหา",
-    "Add Group": "เพิ่มกลุ่ม",
-    "Add a monitor": "เพิ่มมอนิเตอร์",
-    "Edit Status Page": "แก้ไขหน้าสถานะ",
-    "Go to Dashboard": "ไปที่หน้าควบคุม",
-    "Status Page": "หน้าสถานะ",
-    "Status Pages": "หน้าสถานะ",
-    defaultNotificationName: "การแจ้งเตือน {notification} ของฉัน ({number})",
-    here: "ที่นี่",
-    Required: "จำเป็น",
-    telegram: "Telegram",
-    "Bot Token": "กุญแจของบอท",
-    wayToGetTelegramToken: "คุณสามารถรับกุญแจได้จาก {0}.",
-    "Chat ID": "ไอดีแชท",
-    supportTelegramChatID: "รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท",
-    wayToGetTelegramChatID: "คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :",
-    "YOUR BOT TOKEN HERE": "กุญแจของบอทของคุณที่นี่",
-    chatIDNotFound: "ไม่พบไอดีแชท, กรุณาส่งข้อความไปที่บอท",
-    webhook: "Webhook",
-    "Post URL": "URL โพสต์",
-    "Content Type": "ประเภทเนื้อหา",
-    webhookJsonDesc: "{0} ดีสำหรับเซิร์ฟเวอร์ HTTP สมัยใหม่เช่น Express.js",
-    webhookFormDataDesc: "{multipart} ดีสำหรับ PHP, ข้อมูล JSON จะต้องถูกประมวลผลด้วย {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "None / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "เพิกเฉยข้อผิดพลาด TLS",
-    "From Email": "จากอีเมล",
-    emailCustomSubject: "หัวข้อที่กำหนดเอง",
-    "To Email": "ถึงอีเมล",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "ชื่อบอท",
-    "Prefix Custom Message": "คำนำหน้าข้อความที่กำหนดเอง",
-    "Hello @everyone is...": "สวัสดี {'@'}everyone นี่...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}",
-    signal: "Signal",
-    Number: "หมายเลข",
-    Recipients: "ผู้รับ",
-    needSignalAPI: "คุณต้องมี Signal Client ที่มี Rest API",
-    wayToCheckSignalURL: "คุณสามารถตรวจสอบ URL นี้เพื่อดูวิธีตั้งค่า :",
-    signalImportant: "สำคัญ: คุณไม่สามารถผสมกลุ่มและตัวเลขในผู้รับได้!",
-    gotify: "Gotify",
-    "Application Token": "กุญแจของแอพพลิเคชั่น",
-    "Server URL": "Server URL",
-    Priority: "ลำดับความสำคัญ",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "ชื่อห้อง",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "ข้อมูลเพิ่มเติมสำหรับ Webhooks : {0}",
-    aboutChannelName: "ใส่ชื่อห้องใน {0} ในช่องชื่อห้องถ้าต้องการที่จะข้าม Webhook, เช่น: #ช่องอื่นๆ",
-    aboutKumaURL: "ถ้าคุณไม่ใส่ข้อมูลในช่อง Uptime Kuma URL ค่าเริ่มต้นจะเป็นจะเป็น Uptime Kuma Github",
-    emojiCheatSheet: "ตาราง Emoji : {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (รองรับการแจ้งเตือนมากกว่า 50 บริการ)",
-    GoogleChat: "Google Chat (สำหรับ Google Workspace เท่านั้น)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "กุญแจผู้ใช้งาน",
-    Device: "อุปกรณ์",
-    "Message Title": "หัวข้อข้อความ",
-    "Notification Sound": "เสียงแจ้งเตือน",
-    "More info on:": "ข้อมูลเพิ่มเติม : {0}",
-    pushoverDesc1: "ลำดับความสำคัญฉุกเฉิน (2) มีการหมดเวลาเริ่มต้น 30 วินาทีระหว่างการลองใหม่และจะหมดอายุหลังจาก 1 ชั่วโมง",
-    pushoverDesc2: "ถ้าคุณต้องการจะส่งการแจ้งเตือนไปยังอุปกรณ์อื่นๆ สามารถกำหนดได้ที่ช่องอุปกรณ์",
-    "SMS Type": "ประเภท SMS",
-    octopushTypePremium: "พรีเมี่ยม (เร็ว - แนะนำสำหรับการแจ้งเตือน)",
-    octopushTypeLowCost: "ต้นทุนต่ำ (ช้า - บางครั้งจะถูกบล็อกโดยผู้ให้บริการ)",
-    checkPrice: "ตรวจสอบราคาของ {0} :",
-    apiCredentials: "ข้อมูลการตรวจสอบสิทธิ์ API",
-    octopushLegacyHint: "คุณใช้เวอร์ชันดั้งเดิมของ Octopush (2011 - 2020) หรือเวอร์ชันใหม่หรือไม่?",
-    "Check octopush prices": "ตรวจสอบราคาของ Octopush {0}",
-    octopushPhoneNumber: "หมายเลขโทรศัพท์ (รูปแบบสากล เช่น +33612345678) ",
-    octopushSMSSender: "ชื่อผู้ส่ง SMS : ความยาว 3 - 11 ตัวอักษร, ตัวเลข และช่องว่าง (a-zA-Z0-9 )",
-    "LunaSea Device ID": "ไอดีอุปกรณ์ LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "ตัวอย่าง : {0}",
-    "Read more:": "อ่านเพิ่มเติม : {0}",
-    "Status:": "สถานะ : {0}",
-    "Read more": "อ่านเพิ่มเติม",
-    appriseInstalled: "Apprise ถูกติดตั้งแล้ว",
-    appriseNotInstalled: "Apprise ยังไม่ถูกติดตั้ง {0}",
-    "Access Token": "กุญแจการเข้าถึง",
-    "Channel access token": "กุญแจการเข้าถึงของช่อง",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "การตั้งค่าพื้นฐาน",
-    "User ID": "ไอดีผู้ใช้",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "ขั้นแรกให้เข้า {0} สร้างผู้ให้บริการและช่องทาง (Messaging API) จากนั้นคุณจะได้รับกุญแจการเข้าถึงช่องและไอดีผู้ใช้จากรายการเมนูที่กล่าวถึงข้างต้น",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "คุณสามารถระบุลิงก์รูปภาพใน \"URL ไอคอน\" เพื่อแทนที่รูปภาพโปรไฟล์เริ่มต้น จะไม่ถูกใช้หากมีการตั้งค่า Icon Emoji",
-    aboutMattermostChannelName: "คุณลบช่องเริ่มต้นที่ Webhook โพสต์ได้ด้วยการป้อนชื่อช่องลงในช่อง \"ชื่อช่อง\" ต้องเปิดใช้งานในการตั้งค่า Mattermost Webhook เช่น #ช่องอื่นๆ",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - ราคาถูก แต่ช้าและมักจะโอเวอร์โหลด จำกัดเฉพาะผู้รับในโปแลนด์",
-    promosmsTypeFlash: "SMS FLASH - ข้อความจะแสดงบนอุปกรณ์ของผู้รับโดยอัตโนมัติ จำกัดเฉพาะผู้รับในโปแลนด์",
-    promosmsTypeFull: "SMS FULL - SMS ระดับพรีเมียม คุณสามารถใช้ชื่อผู้ส่งของคุณได้ (คุณต้องลงทะเบียนชื่อก่อน) เชื่อถือได้สำหรับการแจ้งเตือน",
-    promosmsTypeSpeed: "SMS SPEED - ลำดับความสำคัญสูงสุดในระบบ รวดเร็วและเชื่อถือได้ แต่มีค่าใช้จ่ายสูง (ประมาณสองเท่าของราคาเต็ม SMS)",
-    promosmsPhoneNumber: "หมายเลขโทรศัพท์ (สำหรับผู้รับโปแลนด์ คุณสามารถข้ามรหัสพื้นที่ได้)",
-    promosmsSMSSender: "ชื่อผู้ส่ง SMS : ชื่อที่ลงทะเบียนล่วงหน้าหรือหนึ่งในค่าเริ่มต้น: InfoSMS, ข้อมูล SMS, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "URL ของโฮมเซิร์ฟเวอร์ (พร้อม http(s):// และพอร์ตเสริม)",
-    "Internal Room Id": "รหัสห้องภายใน",
-    matrixDesc1: "คุณค้นหารหัสห้องภายในได้โดยดูในส่วนขั้นสูงของการตั้งค่าห้องในไคลเอ็นต์ Matrix มันควรจะมีลักษณะเช่น !PMdRCpsIfLwsfjIye6:kiznick.server.",
-    matrixDesc2: "ขอแนะนำเป็นอย่างยิ่งให้คุณสร้างผู้ใช้ใหม่และอย่าใช้โทเค็นการเข้าถึงของผู้ใช้ Matrix ของคุณเอง เนื่องจากจะทำให้สามารถเข้าถึงบัญชีของคุณและห้องทั้งหมดที่คุณเข้าร่วม ให้สร้างผู้ใช้ใหม่และเชิญเฉพาะห้องที่คุณต้องการรับการแจ้งเตือนแทน คุณสามารถรับโทเค็นเพื่อการเข้าถึงได้โดยเรียกใช้ {0}",
-    Method: "วิธี",
-    Body: "เนื้อหา",
-    Headers: "ส่วนหัว",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง :",
-    BodyInvalidFormat: "เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ",
-    "Monitor History": "ประวัติมอนิเตอร์",
-    clearDataOlderThan: "เก็บข้อมูลมอนิเตอร์ {0} วัน",
-    PasswordsDoNotMatch: "รหัสผ่านไม่ตรงกัน",
-    records: "บันทึก",
-    "One record": "หนึ่งบันทึก",
-    steamApiKeyDescription: "สำหรับการมอนิเตอร์ Steam Game Server คุณต้องมี Steam Web-API key, คุณสามารถสมัครได้จากที่นี่ : ",
-    "Current User": "ผู้ใช้ปัจจุบัน",
-    topic: "หัวข้อ",
-    topicExplanation: "หัวข้อ MQTT ที่จะมอนิเตอร์",
-    successMessage: "ข้อความที่จะถือว่าประสบความสำเร็จ",
-    successMessageExplanation: "ข้อความ MQTT ที่จะถือว่าประสบความสำเร็จ",
-    recent: "ล่าสุด",
-    Done: "สำเร็จ",
-    Info: "ข้อมูล",
-    Security: "ความปลอดภัย",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "ย่อฐานข้อมูล",
-    "Pick a RR-Type...": "เลือกชนิด DNS Record",
-    "Pick Accepted Status Codes...": "เลือกสถานะที่ยอมรับ...",
-    Default: "ค่าเริ่มต้น",
-    "HTTP Options": "ตัวเลือก HTTP",
-    "Create Incident": "สร้างเหตุการณ์",
-    Title: "หัวข้อ",
-    Content: "เนื้อหา",
-    Style: "สไตล์",
-    info: "ข้อมูล",
-    warning: "แจ้งเตือน",
-    danger: "อันตราย",
-    primary: "หลัก",
-    light: "สว่าง",
-    dark: "มืด",
-    Post: "โพสต์",
-    "Please input title and content": "กรุณาใส่ชื่อและเนื้อหา",
-    Created: "สร้าง",
-    "Last Updated": "อัพเดทล่าสุด",
-    Unpin: "เลิกตรึง",
-    "Switch to Light Theme": "เปลี่ยนเป็นแบบสว่าง",
-    "Switch to Dark Theme": "เปลี่ยนเป็นแบบมืด",
-    "Show Tags": "แสดงแท็ก",
-    "Hide Tags": "ซ่อนแท็ก",
-    Description: "รายละเอียด",
-    "No monitors available.": "ไม่มีมอนิเตอร์ที่สามารถใช้งานได้",
-    "Add one": "เพิ่ม",
-    "No Monitors": "ไม่มีมอนิเตอร์",
-    "Untitled Group": "กลุ่มที่ไม่มีชื่อ",
-    Services: "บริการ",
-    Discard: "ทิ้ง",
-    Cancel: "ยกเลิก",
-    "Powered by": "ขับเคลื่อนโดย",
-    shrinkDatabaseDescription: "ทริกเกอร์ฐานข้อมูล VACUUM สำหรับ SQLite หากฐานข้อมูลของคุณถูกสร้างขึ้นหลังจากเวอร์ชั่น 1.10.0 แสดงว่า AUTO_VACUUM เปิดใช้งานอยู่แล้วและไม่จำเป็นต้องดำเนินการนี้",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Password",
-    serwersmsPhoneNumber: "หมายเลขโทรศัพท์",
-    serwersmsSenderName: "ชื่อผู้ส่ง SMS (ลงทะเบียนผ่านหน้าควบคุม)",
-    stackfield: "Stackfield",
-    Customize: "ปรับแต่ง",
-    "Custom Footer": "ส่วนท้ายที่กำหนดเอง",
-    "Custom CSS": "CSS ที่กำหนดเอง",
-    smtpDkimSettings: "การตั้งค่า DKIM",
-    smtpDkimDesc: "โปรดดู Nodemailer DKIM {0} สำหรับการใช้งาน",
-    documentation: "คู่มือการใช้งาน",
-    smtpDkimDomain: "ชื่อโดเมน",
-    smtpDkimKeySelector: "Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "อัลกอริทึมแฮช (ไม่บังคับ)",
-    smtpDkimheaderFieldNames: "คีย์ส่วนหัวสำหรับลงชื่อ (ไม่บังคับ)",
-    smtpDkimskipFields: "Header Keys ไม่ต้องเซ็น (ไม่บังคับ)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "กุญแจ API",
-    alertaAlertState: "แจ้งเตือนสถานะ",
-    alertaRecoverState: "กู้คืนสถานะ",
-    deleteStatusPageMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบหน้าสถานะนี้",
-    Proxies: "พร็อกซี",
-    default: "ค่าเริ่มต้น",
-    enabled: "เปิดใช้งานแล้ว",
-    setAsDefault: "ตั้งเป็นค่าเริ่มต้น",
-    deleteProxyMsg: "คุณแน่ใจหรือไม่ว่าต้องการลบพร็อกซีสำหรับมอนิเตอร์ทั้งหมด?",
-    proxyDescription: "ต้องตั้งค่ามอนิเตอร์ให้ใช้พร็อกซีเพื่อให้ใช้งานได้",
-    enableProxyDescription: "พร็อกซีนี้จะไม่ส่งผลต่อมอนิเตอร์จนกว่าจะเปิดใช้งาน คุณสามารถควบคุมการปิดใช้งานพร็อกซีชั่วคราวจากมอนิเตอร์ทั้งหมดได้ที่ส่วนสถานะการเปิดใช้งาน",
-    setAsDefaultProxyDescription: "พร็อกซีนี้จะถูกเปิดโดนค่าเริ่มต้นสำหรับมอนิเตอร์ใหม่, คุณสามารถปิดการแจ้งเตือนสำหรับแต่ละมอนิเตอร์ได้",
-    "Certificate Chain": "ห่วงโซ่ใบรับรอง",
-    Valid: "ถูกต้อง",
-    Invalid: "ไม่ถูกต้อง",
-    AccessKeyId: "กุญแจสิทธิ ID",
-    SecretAccessKey: "กุญแจสิทธิ Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "รหัสเทมเพลต",
-    SignName: "ป้ายชื่อ",
-    "Sms template must contain parameters: ": "เทมเพลต SMS ต้องมีพารามิเตอร์ : ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
-    "Device Token": "Device Token",
-    Platform: "แพลตฟอร์ม",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "สูง",
-    Retry: "ลองใหม่",
-    Topic: "หัวข้อ",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "ติดตั้งพร็อกซี่",
-    "Proxy Protocol": "โปรโตคอลพร็อกซี่",
-    "Proxy Server": "เซิร์ฟเวอร์พร็อกซี",
-    "Proxy server has authentication": "พร็อกซีเซิร์ฟเวอร์มีการตรวจสอบสิทธิ์",
-    User: "ผู้ใช้",
-    Installed: "ติดตั้งแล้ว",
-    "Not installed": "ไม่ได้ติดตั้ง",
-    Running: "กำลังทำงาน",
-    "Not running": "ไม่ได้ทำงาน",
-    "Remove Token": "ลบกุญแจ",
-    Start: "เริ่ม",
-    Stop: "หยุด",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "เพิ่มหน้าสถานะใหม่",
-    Slug: "ชื่อ",
-    "Accept characters:": "ตัวอักษรที่ใช้งานได้ :",
-    startOrEndWithOnly: "เริ่มหรือจบด้วย {0} เท่านั้น",
-    "No consecutive dashes": "ไม่มีขีดกลางติดต่อกัน",
-    Next: "ต่อไป",
-    "The slug is already taken. Please choose another slug.": "ชื่อนี้ถูกใช้งานแล้ว กรุณาใช้ชื่ออื่น",
-    "No Proxy": "ไม่มีพร็อกซี่",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "หน้าสถานะใหม่",
-    "Page Not Found": "ไม่พบหน้านี้",
-    "Reverse Proxy": "พร็อกซีย้อนกลับ",
-    Backup: "สำรองข้อมูล",
-    About: "เกี่ยวกับ",
-    wayToGetCloudflaredURL: "(ดาวโหลด cloudflared จาก {0})",
-    cloudflareWebsite: "เว็บไซต์ Cloudflare",
-    "Message:": "ข้อความ :",
-    "Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน",
-    "Other Software": "ซอฟต์แวร์อื่นๆ ",
-    "For example: nginx, Apache and Traefik.": "เช่น: nginx, Apache และ Traefik",
-    "Please read": "กรุณาอ่าน",
-    "Subject:": "เรื่อง :",
-    "Valid To:": "ใช้ได้ถึง :",
-    "Days Remaining:": "จำนวนวันที่เหลือ :",
-    "Issuer:": "ผู้ออก :",
-    "Fingerprint:": "ลายนิ้วมือ :",
-    "No status pages": "ไม่มีหน้าสถานะ",
-    "Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุของโดเมน",
-    Proxy: "Proxy",
-    "Date Created": "วันที่สร้าง",
-    onebotHttpAddress: "ที่อยู่ HTTP OneBot ",
-    onebotMessageType: "ชนิดข้อความ OneBot",
-    onebotGroupMessage: "กลุ่ม",
-    onebotPrivateMessage: "ส่วนตัว",
-    onebotUserOrGroupId: "กลุ่ม / ไอดีผู้ใช้",
-    onebotSafetyTips: "เพื่อความปลอดภัย จำเป็นต้องตั้งค่ากุญแจการเข้าถึง",
-    "PushDeer Key": "กุญแจ PushDeer",
-    "Footer Text": "ข้อความส่วนท้าย",
-    "Show Powered By": "แสดงข้อความ \"ขับเคลื่อนโดย\"",
-    "Domain Names": "Domain Names",
-    signedInDisp: "เข้าใช้งานในฐานะ {0}",
-    signedInDispDisabled: "ปิดการยืนยันตัวตน",
-    "Certificate Expiry Notification": "แจ้งเตือนใบรับรองหมดอายุ",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "หมายเลขผู้รับ",
-    "From Name/Number": "จาก ชื่อ / หมายเลข",
-    "Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    endpoint: "endpoint",
-    octopushAPIKey: "\"API key\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
-    octopushLogin: "\"Login\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
-    promosmsLogin: "API Login Name",
-    promosmsPassword: "API Password",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Secret API Key",
-    pushyToken: "Device token",
-    "Show update if available": "แสดงการอัปเดตถ้ามี",
-    "Also check beta release": "ตรวจสอบรุ่นเบต้า",
-    "Using a Reverse Proxy?": "ใช้ Reverse Proxy อยู่ใช่มั้ย?",
-    "Check how to config it for WebSocket": "ตรวจสอบวิธีการตั้งค่าสำหรับ WebSocket",
-    "Steam Game Server": "Steam Game Server",
-    "Most likely causes:": "สาเหตุที่เป็นไปได้มากที่สุด :",
-    "The resource is no longer available.": "ทรัพยากรไม่สามารถใช้งานได้อีกต่อไป",
-    "There might be a typing error in the address.": "อาจมีข้อผิดพลาดในการพิมพ์ที่อยู่",
-    "What you can try:": "สิ่งที่คุณสามารถลองทำ :",
-    "Retype the address.": "พิมพ์ที่อยู่อีกครั้ง",
-    "Go back to the previous page.": "กลับไปหน้าที่แล้ว",
-    "Coming Soon": "เร็วๆ นี้",
-    wayToGetClickSendSMSToken: "คุณสามารถรับ API Username และ API Key ได้จาก {0}",
-    wayToGetLineNotifyToken: "คุณสามารถรับ access token ได้จาก {0}",
-    resendEveryXTimes: "ส่งซ้ำทุก {0} ครั้ง",
-    resendDisabled: "การส่งซ้ำถูกปิดใช้งาน",
-    dnsPortDescription: "พอร์ตของเซิร์ฟเวอร์ DNS, ค่าเริ่มต้นคือ 53, คุณสามารถเปลี่ยนพอร์ตตอนไหนก็ได้",
-    "Resend Notification if Down X times consequently": "ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง",
-    error: "เกิดข้อผิดพลาด",
-    critical: "วิกฤต",
-    wayToGetPagerDutyKey: "คุณสามารถรับคีย์ได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา \"Events API V2\", สำหรับข้อมูลเพิ่มเติม {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "แก้ไขอัตโนมัติหรือยอมรับ",
-    "do nothing": "ไม่ทำอะไร",
-    "auto acknowledged": "ยอมรับอัตโนมัติ",
-    "auto resolve": "แก้ไขอัตโนมัติ",
-    "Bark Group": "กลุ่มที่จะประกาศ",
-    "Bark Sound": "เสียงประกาศ",
-    Authentication: "การตรวจสอบสิทธิ์",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Trust Proxy",
-    HomeAssistant: "Home Assistant",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "แบ่งปันคีย์ลับระหว่างผู้ใช้งานและเซิร์ฟเวอร์",
-    RadiusCalledStationId: "Called Station Id",
-    RadiusCalledStationIdDescription: "Identifier of the called device",
-    RadiusCallingStationId: "Calling Station Id",
-    RadiusCallingStationIdDescription: "Identifier of the calling device",
-    "Connection String": "Connection String",
-    Query: "Query",
-    settingsCertificateExpiry: "วันหมดอายุของใบรับรอง TLS",
-    certificationExpiryDescription: "การตรวจสอบ HTTPS จะแจ้งเตือนถ้าใบอนุญาติ TLS จะหมดอายุใน:",
-    "Setup Docker Host": "ติดตั้ง Docker Host",
-    "Connection Type": "ประเภทการเชื่อมต่อ",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "คุณแน่ใจหรือไม่ที่จะลบ Docker host นี้สำหรับการมอนิเตอร์ทั้งหมด?",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "โดเมน",
-    Workstation: "Workstation",
-    disableCloudflaredNoAuthMsg: "คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน",
-    trustProxyDescription: "เชื่อ Header 'X-Forwarded-*' ถ้าคุณต้องการไอพีที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache, คุณควรเปิดใช้งาน",
-    Examples: "ตัวอย่าง",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Access Token แบบมีอายุนาน",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก \"Create Token\"",
-    "Notification Service": "บริการแจ้งเตือน",
-    "default: notify all devices": "ค่าเริ่มต้น: แจ้งเตือนทุกอุปกรณ์",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู \"Developer Tools > Services\" แล้วค้นหา \"notification\" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์",
-    "Automations can optionally be triggered in Home Assistant:": "สามารถเลือกสั่งงานระบบอัตโนมัติได้ใน Home Assistant:",
-    "Trigger type:": "ชนิดสิ่งกระตุ้น:",
-    "Event type:": "ชนิดเหตการณ์:",
-    "Event data:": "ข้อมูลกิจกรรม:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง",
-    "Frontend Version": "เวอร์ชั่น Frontend",
-    "Frontend Version do not match backend version!": "เวอร์ชั่น Frontend ไม่ตรงกับ Backend !",
-};
diff --git a/src/languages/tr-TR.js b/src/languages/tr-TR.js
deleted file mode 100644
index c84fa1f2..00000000
--- a/src/languages/tr-TR.js
+++ /dev/null
@@ -1,678 +0,0 @@
-export default {
-    languageName: "Türkçe",
-    checkEverySecond: "{0} Saniyede bir kontrol et.",
-    retryCheckEverySecond: "{0} Saniyede bir dene.",
-    resendEveryXTimes: "Her {0} bir yeniden gönder",
-    resendDisabled: "Yeniden gönderme devre dışı",
-    retriesDescription: "Servisin kapalı olarak işaretlenmeden ve bir bildirim gönderilmeden önce maksimum yeniden deneme sayısı",
-    ignoreTLSError: "HTTPS web siteleri için TLS/SSL hatasını yoksay",
-    upsideDownModeDescription: "Servisin durumunu tersine çevirir. Servis çalışıyorsa kapalı olarak işaretler.",
-    maxRedirectDescription: "İzlenecek maksimum yönlendirme sayısı. Yönlendirmeleri devre dışı bırakmak için 0'a ayarlayın.",
-    acceptedStatusCodesDescription: "Servisin çalıştığını hangi durum kodları belirlesin?",
-    passwordNotMatchMsg: "Şifre eşleşmiyor.",
-    notificationDescription: "Servislerin bildirim gönderebilmesi için bir bildirim yöntemi belirleyin.",
-    keywordDescription: "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır",
-    pauseDashboardHome: "Durdur",
-    deleteMonitorMsg: "Servisi silmek istediğinden emin misin?",
-    deleteNotificationMsg: "Bu bildirimi tüm servisler için silmek istediğinden emin misin?",
-    dnsPortDescription: "DNS sunucusu bağlantı noktası. Varsayılan değer 53'tür. Bağlantı noktasını istediğiniz zaman değiştirebilirsiniz.",
-    resolverserverDescription: "Cloudflare varsayılan sunucudur, çözümleyici sunucusunu istediğiniz zaman değiştirebilirsiniz.",
-    rrtypeDescription: "İzlemek istediğiniz servisin RR-Tipini seçin",
-    pauseMonitorMsg: "Durdurmak istediğinden emin misin?",
-    enableDefaultNotificationDescription: "Bu bildirim her yeni serviste aktif olacaktır. Bildirimi servisler için ayrı ayrı deaktive edebilirsiniz. ",
-    clearEventsMsg: "Bu servisin bütün kayıtlarını silmek istediğinden emin misin?",
-    clearHeartbeatsMsg: "Bu servis için tüm sağlık durumunu silmek istediğinden emin misin?",
-    confirmClearStatisticsMsg: "Tüm istatistikleri silmek istediğinden emin misin?",
-    importHandleDescription: "Aynı isimdeki bütün servisleri ve bildirimleri atlamak için 'Var olanı atla' seçiniz. 'Üzerine yaz' var olan bütün servisleri ve bildirimleri silecektir. ",
-    confirmImportMsg: "Yedeği içeri aktarmak istediğinize emin misiniz? Lütfen doğru içeri aktarma seçeneğini seçtiğinizden emin olunuz. ",
-    twoFAVerifyLabel: "Lütfen tokeni yazarak 2FA doğrulamanın çalıştığından emin olunuz.",
-    tokenValidSettingsMsg: "Token geçerli! Şimdi 2FA ayarlarını kaydedebilirsiniz. ",
-    confirmEnableTwoFAMsg: "2FA'ı etkinleştirmek istediğinizden emin misiniz?",
-    confirmDisableTwoFAMsg: "2FA'ı devre dışı bırakmak istediğinize emin misiniz?",
-    Settings: "Ayarlar",
-    Dashboard: "Panel",
-    "New Update": "Yeni Güncelleme",
-    Language: "Dil",
-    Appearance: "Görünüm",
-    Theme: "Tema",
-    General: "Genel",
-    "Primary Base URL": "Birincil Temel URL",
-    Version: "Versiyon",
-    "Check Update On GitHub": "GitHub'da Güncellemeyi Kontrol Edin",
-    List: "Liste",
-    Add: "Ekle",
-    "Add New Monitor": "Yeni Servis Ekle",
-    "Quick Stats": "Servis istatistikleri",
-    Up: "Normal",
-    Down: "Hatalı",
-    Pending: "Bekliyor",
-    Unknown: "Bilinmeyen",
-    Pause: "Durdur",
-    Name: "Servis ismi",
-    Status: "Durum",
-    DateTime: "Zaman",
-    Message: "Mesaj",
-    "No important events": "Önemli olay yok",
-    Resume: "Devam et",
-    Edit: "Düzenle",
-    Delete: "Sil",
-    Current: "Şu anda",
-    Uptime: "Çalışma zamanı",
-    "Cert Exp.": "Sertifika Süresi",
-    day: "gün | günler",
-    "-day": "-gün",
-    hour: "saat",
-    "-hour": "-saat",
-    Response: "Cevap Süresi",
-    Ping: "Ping",
-    "Monitor Type": "Servis Tipi",
-    Keyword: "Anahtar Kelime",
-    "Friendly Name": "Panelde görünecek isim",
-    URL: "URL",
-    Hostname: "IP Adresi",
-    Port: "Port",
-    "Heartbeat Interval": "Servis Test Aralığı",
-    Retries: "Yeniden deneme",
-    "Heartbeat Retry Interval": "Sağlık Durumları Tekrar Deneme Sıklığı",
-    "Resend Notification if Down X times consequently": "Sonuç olarak X kez düşerse bildirimi yeniden gönder",
-    Advanced: "Gelişmiş",
-    "Upside Down Mode": "Ters/Düz Modu",
-    "Max. Redirects": "Maksimum Yönlendirme",
-    "Accepted Status Codes": "Kabul Edilen Durum Kodları",
-    "Push URL": "Push URL",
-    needPushEvery: "Bu URL'yi her {0} saniyede bir aramalısınız.",
-    pushOptionalParams: "İsteğe bağlı parametreler: {0}",
-    Save: "Kaydet",
-    Notifications: "Bildirimler",
-    "Not available, please setup.": "Atanmış bildirim yöntemi yok. Ayarlardan belirleyebilirsiniz.",
-    "Setup Notification": "Bildirim yöntemi kur",
-    Light: "Açık",
-    Dark: "Koyu",
-    Auto: "Oto",
-    "Theme - Heartbeat Bar": "Servis Bar Konumu",
-    Normal: "Normal",
-    Bottom: "Aşağıda",
-    None: "Gösterme",
-    Timezone: "Zaman Dilimi",
-    "Search Engine Visibility": "Arama Motoru Görünürlüğü",
-    "Allow indexing": "İndekslemeye izin ver",
-    "Discourage search engines from indexing site": "İndekslemeyi reddet",
-    "Change Password": "Şifre Değiştir",
-    "Current Password": "Şuan ki Şifre",
-    "New Password": "Yeni Şifre",
-    "Repeat New Password": "Yeni Şifreyi Tekrar Girin",
-    "Update Password": "Şifreyi Değiştir",
-    "Disable Auth": "Şifreli girişi iptal et.",
-    "Enable Auth": "Şifreli girişi aktif et.",
-    "disableauth.message1": "<strong>Şifreli girişi devre dışı bırakmak istediğinizden</strong>emin misiniz?",
-    "disableauth.message2": "Bu, Uptime Kuma'nın önünde Cloudflare Access gibi <strong>üçüncü taraf yetkilendirmesi olan</strong> kişiler içindir.",
-    "Please use this option carefully!": "Lütfen dikkatli kullanın.",
-    Logout: "Çıkış yap",
-    Leave: "Ayrıl",
-    "I understand, please disable": "Evet farkındayım, iptal et",
-    Confirm: "Onayla",
-    Yes: "Evet",
-    No: "Hayır",
-    Username: "Kullanıcı Adı",
-    Password: "Şifre",
-    "Remember me": "Beni Hatırla",
-    Login: "Giriş yap",
-    "No Monitors, please": "Servis yok, lütfen",
-    "add one": "bir servis ekleyin",
-    "Notification Type": "Bildirim Yöntemi",
-    Email: "E-mail",
-    Test: "Test",
-    "Certificate Info": "Sertifika Bilgisi",
-    "Resolver Server": "Çözümleyici Sunucu",
-    "Resource Record Type": "Kaynak Kayıt Türü",
-    "Last Result": "En son sonuçlar",
-    "Create your admin account": "Yönetici hesabınızı oluşturun",
-    "Repeat Password": "Şifrenizi tekrar girin",
-    "Import Backup": "Yedeği içe aktar",
-    "Export Backup": "Yedeği dışa aktar",
-    Export: "Dışa aktar",
-    Import: "İçe aktar",
-    respTime: "Cevap Süresi (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Varsayılan etkinleştirilmiş",
-    "Apply on all existing monitors": "Var olan bütün servislere uygula",
-    Create: "Oluştur",
-    "Clear Data": "Verileri Temizle",
-    Events: "Olaylar",
-    Heartbeats: "Sağlık Durumları",
-    "Auto Get": "Otomatik Al",
-    backupDescription: "Bütün servisleri ve bildirimleri JSON dosyasına yedekleyebilirsiniz.",
-    backupDescription2: "Not: Geçmiş ve etkinlik verileri içinde değildir.",
-    backupDescription3: "Dışa aktarma dosyasında bildirim tokeni gibi hassas veriler bulunur, dikkatli bir şekilde saklayınız.",
-    alertNoFile: "İçeri aktarmak için bir dosya seçiniz.",
-    alertWrongFileType: "Lütfen bir JSON dosyası seçiniz.",
-    "Clear all statistics": "Bütün istatistikleri temizle",
-    "Skip existing": "Var olanı atla",
-    Overwrite: "Üzerine yaz",
-    Options: "Seçenekler",
-    "Keep both": "İkisini sakla",
-    "Verify Token": "Tokeni doğrula",
-    "Setup 2FA": "2FA Kur",
-    "Enable 2FA": "2FA Etkinleştir",
-    "Disable 2FA": "2FA Devre dışı bırak",
-    "2FA Settings": "2FA Ayarları",
-    "Two Factor Authentication": "İki Faktörlü Kimlik Doğrulama (2FA)",
-    Active: "Aktif",
-    Inactive: "İnaktif",
-    Token: "Token",
-    "Show URI": "URI'yi göster",
-    Tags: "Etiketler",
-    "Add New below or Select...": "Aşağıya Yeni Ekle veya Seç...",
-    "Tag with this name already exist.": "Bu ada sahip etiket zaten var.",
-    "Tag with this value already exist.": "Bu değere sahip etiket zaten var.",
-    color: "renk",
-    "value (optional)": "değer (isteğe bağlı)",
-    Gray: "Gri",
-    Red: "Kırmızı",
-    Orange: "Turuncu",
-    Green: "Yeşil",
-    Blue: "Mavi",
-    Indigo: "Çivit mavisi",
-    Purple: "Mor",
-    Pink: "Pembe",
-    "Search...": "Ara...",
-    "Avg. Ping": "Ortalama Ping",
-    "Avg. Response": "Ortalama Cevap Süresi",
-    "Entry Page": "Giriş Sayfası",
-    statusPageNothing: "Burada hiçbir şey yok, lütfen bir grup veya servis ekleyin.",
-    "No Services": "Hizmet Yok",
-    "All Systems Operational": "Tüm Sistemler Operasyonel",
-    "Partially Degraded Service": "Kısmen Bozulmuş Hizmet",
-    "Degraded Service": "Bozulmuş Hizmet",
-    "Add Group": "Grup Ekle",
-    "Add a monitor": "Servis Ekle",
-    "Edit Status Page": "Durum Sayfasını Düzenle",
-    "Go to Dashboard": "Panele Git",
-    "Status Page": "Durum Sayfası",
-    "Status Pages": "Durum Sayfaları",
-    defaultNotificationName: "My {notification} Alert ({number})",
-    here: "burada",
-    Required: "Gerekli",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "{0} adresinden bir token alabilirsiniz.",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Doğrudan Sohbet / Grup / Kanalın Sohbet Kimliğini Destekleyin",
-    wayToGetTelegramChatID: "Bot'a bir mesaj göndererek ve chat_id'yi görüntülemek için bu URL'ye giderek sohbet kimliğinizi alabilirsiniz:",
-    "YOUR BOT TOKEN HERE": "BOT TOKENİNİZ BURADA",
-    chatIDNotFound: "Chat ID bulunamadı; lütfen önce bu bota bir mesaj gönderin",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0}, Express.js gibi tüm modern HTTP sunucuları için iyidir",
-    webhookFormDataDesc: "{multipart} PHP için iyidir. JSON'un {decodeFunction} ile ayrıştırılması gerekecek",
-    smtp: "E-mail (SMTP)",
-    secureOptionNone: "Hiçbiri / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "TLS Hatasını Yoksay",
-    "From Email": "E-postadan",
-    emailCustomSubject: "Özel Konu",
-    "To Email": "E-postaya",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhook Oluştur'a giderek alabilirsiniz.",
-    "Bot Display Name": "Botun Görünecek Adı",
-    "Prefix Custom Message": "Önek Özel Mesaj",
-    "Hello @everyone is...": "Merhaba {'@'}everyone ...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
-    signal: "Sinyal",
-    Number: "Numara",
-    Recipients: "Alıcılar",
-    needSignalAPI: "REST API ile bir signal istemciniz olması gerekiyor.",
-    wayToCheckSignalURL: "Nasıl kurulacağını görmek için bu URL'yi kontrol edebilirsiniz:",
-    signalImportant: "ÖNEMLİ: Alıcılarda grupları ve sayıları karıştıramazsınız!",
-    gotify: "Gotify",
-    "Application Token": "Uygulama Tokeni",
-    "Server URL": "Sunucu URL",
-    Priority: "Öncelik",
-    slack: "Slack",
-    "Icon Emoji": "İkon Emoji",
-    "Channel Name": "Kanal Adı",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Webhook hakkında daha fazla bilgi: {0}",
-    aboutChannelName: "Webhook kanalını atlamak istiyorsanız, {0} Kanal Adı alanına kanal adını girin. Ör: #diğer-kanal",
-    aboutKumaURL: "Uptime Kuma URL alanını boş bırakırsanız, varsayılan olarak Project GitHub sayfası olur.",
-    emojiCheatSheet: "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (50'den fazla Bildirim hizmetini destekler)",
-    GoogleChat: "Google Chat (sadece Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "Kullancı Anahtarı",
-    Device: "Cihaz",
-    "Message Title": "Mesaj Başlığı",
-    "Notification Sound": "Bilgilendirme sesi",
-    "More info on:": "Daha fazla bilgi: {0}",
-    pushoverDesc1: "Acil durum önceliği (2), yeniden denemeler arasında varsayılan olarak 30 saniyelik bir zaman aşımına sahiptir ve 1 saat sonra sona erecektir.",
-    pushoverDesc2: "Farklı cihazlara bildirim göndermek istiyorsanız Cihaz alanını doldurunuz.",
-    "SMS Type": "SMS Tipi",
-    octopushTypePremium: "Premium (Hızlı - uyarı için önerilir)",
-    octopushTypeLowCost: "Düşük Maliyet (Yavaş - bazen operatör tarafından engellenir)",
-    checkPrice: "{0} fiyatlarını kontrol edin:",
-    apiCredentials: "API kimlik bilgileri",
-    octopushLegacyHint: "Octopush'un (2011-2020) eski sürümünü mü yoksa yeni sürümünü mü kullanıyorsunuz?",
-    "Check octopush prices": "Octopush fiyatlarını kontrol edin {0}.",
-    octopushPhoneNumber: "Telefon numarası (uluslararası biçim, örneğin: +33612345678) ",
-    octopushSMSSender: "SMS Gönderici Adı : 3-11 alfanümerik karakter ve boşluk (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Cihaz ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Örnek: {0}",
-    "Read more:": "Daha fazla oku: {0}",
-    "Status:": "Durum: {0}",
-    "Read more": "Daha fazla oku",
-    appriseInstalled: "Apprise yüklendi.",
-    appriseNotInstalled: "Appris yüklü değil. {0}",
-    "Access Token": "Erişim Tokeni",
-    "Channel access token": "Kanal erişim tokeni",
-    "Line Developers Console": "Line Geliştirici Konsolu",
-    lineDevConsoleTo: "Line Geliştirici Konsolu - {0}",
-    "Basic Settings": "Temel Ayarlar",
-    "User ID": "Kullanıcı ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Önce {0}'e erişin, bir sağlayıcı ve kanal (Messaging API) oluşturun, ardından yukarıda belirtilen menü öğelerinden kanal erişim tokenini ve kullanıcı id alabilirsiniz.",
-    "Icon URL": "Simge URL",
-    aboutIconURL: "Varsayılan profil resmini geçersiz kılmak için \"Simge URL\" bölümünde bir resme bağlantı sağlayabilirsiniz. Simge Emojisi ayarlanmışsa kullanılmayacaktır.",
-    aboutMattermostChannelName: "Kanal adını \"Kanal Adı\" alanına girerek Webhook'un gönderi yaptığı varsayılan kanalı geçersiz kılabilirsiniz. Bunun Mattermost Webhook ayarlarında etkinleştirilmesi gerekir. Ör: #diğer-kanal",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - ucuz ama yavaş ve genellikle aşırı yüklü. Yalnızca Polonyalı alıcılarla sınırlıdır.",
-    promosmsTypeFlash: "SMS FLASH - Mesaj, alıcı cihazda otomatik olarak gösterilecektir. Yalnızca Polonyalı alıcılarla sınırlıdır.",
-    promosmsTypeFull: "SMS FULL - Premium SMS katmanı, Gönderici Adınızı kullanabilirsiniz (Önce adınızı kaydetmeniz gerekir). Uyarılar için güvenilir.",
-    promosmsTypeSpeed: "SMS HIZI - Sistemde en yüksek öncelik. Çok hızlı ve güvenilir ancak maliyetli (SMS FULL fiyatının yaklaşık iki katı).",
-    promosmsPhoneNumber: "Telefon numarası (Polonyalı alıcı için Alan kodlarını atlayabilirsiniz)",
-    promosmsSMSSender: "SMS Gönderici Adı : Ön kayıtlı ad veya varsayılanlardan biri: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    matrixHomeserverURL: "Homeserver URL (http(s):// ve isteğe bağlı olarak bağlantı noktası ile)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "Internal Room ID'sini, Matrix istemcinizdeki oda ayarlarının gelişmiş bölümüne bakarak bulabilirsiniz. !QMdRCpUIfLwsfjxye6:home.server gibi görünmelidir.",
-    matrixDesc2: "Hesabınıza ve katıldığınız tüm odalara tam erişime izin vereceğinden, yeni bir kullanıcı oluşturmanız ve kendi Matrix kullanıcınızın erişim belirtecini kullanmamanız şiddetle tavsiye edilir. Bunun yerine, yeni bir kullanıcı oluşturun ve onu yalnızca bildirimi almak istediğiniz odaya davet edin. {0} komutunu çalıştırarak erişim tokenini alabilirsiniz.",
-    Method: "Yöntem",
-    Body: "Gövde",
-    Headers: "Başlıklar",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "İstek başlıkları geçerli JSON değil:",
-    BodyInvalidFormat: "İstek gövdesi geçerli JSON değil:",
-    "Monitor History": "Servis Geçmişi",
-    clearDataOlderThan: "{0} gün boyunca izleme geçmişi verilerini saklayın.",
-    PasswordsDoNotMatch: "Parolalar uyuşmuyor.",
-    records: "kayıtlar",
-    "One record": "Bir Kayıt",
-    steamApiKeyDescription: "Bir Steam Oyun Sunucusunu izlemek için bir Steam Web-API anahtarına ihtiyacınız vardır. API anahtarınızı buradan kaydedebilirsiniz: ",
-    "Current User": "Şu anki kullanıcı",
-    topic: "Başlık",
-    topicExplanation: "İzlenecek MQTT servisi",
-    successMessage: "Başarılı Mesaj",
-    successMessageExplanation: "Başarılı olarak kabul edilecek MQTT mesajı",
-    recent: "Son",
-    Done: "Tamamlandı",
-    Info: "Bilgi",
-    Security: "Güvenlik",
-    "Steam API Key": "Steam API Anahtarı",
-    "Shrink Database": "Veritabanını Küçült",
-    "Pick a RR-Type...": "Bir RR-Tipi seçin...",
-    "Pick Accepted Status Codes...": "Kabul Edilen Durum Kodlarını Seçin...",
-    Default: "Varsayılan",
-    "HTTP Options": "HTTP Ayarları",
-    "Create Incident": "Olay Oluştur",
-    Title: "Başlık",
-    Content: "İçerik",
-    Style: "Stil",
-    info: "info",
-    warning: "warning",
-    danger: "danger",
-    error: "hata",
-    critical: "kritik",
-    primary: "primary",
-    light: "light",
-    dark: "dark",
-    Post: "Post",
-    "Please input title and content": "Lütfen başlık ve içerik girin",
-    Created: "Oluşturuldu",
-    "Last Updated": "Son Güncelleme",
-    Unpin: "Unpin",
-    "Switch to Light Theme": "Açık Temaya Geç",
-    "Switch to Dark Theme": "Karanlık Temaya Geç",
-    "Show Tags": "Etiketleri Göster",
-    "Hide Tags": "Etiketleri Gizle",
-    Description: "Açıklama",
-    "No monitors available.": "Kullanılabilir servis yok.",
-    "Add one": "Bir tane ekle",
-    "No Monitors": "Servis Yok",
-    "Untitled Group": "Adsız Grup",
-    Services: "Hizmetler",
-    Discard: "İptal Et",
-    Cancel: "İptal Et",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "SQLite için veritabanı VACUUM'unu tetikleyin. Veritabanınız 1.10.0'dan sonra oluşturulduysa, AUTO_VACUUM zaten etkinleştirilmiştir ve bu eyleme gerek yoktur.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Kullanıcı Adı (webapi_ öneki dahil)",
-    serwersmsAPIPassword: "API Şifre",
-    serwersmsPhoneNumber: "Telefon numarası",
-    serwersmsSenderName: "SMS Gönderici Adı (müşteri portalı üzerinden kayıtlı)",
-    stackfield: "Stackfield",
-    Customize: "Özelleştirme",
-    "Custom Footer": "Özel Altbilgi",
-    "Custom CSS": "Özel CSS",
-    smtpDkimSettings: "DKIM Ayarları",
-    smtpDkimDesc: "Kullanım için lütfen Nodemailer DKIM'e {0} bakın.",
-    documentation: "belgeler",
-    smtpDkimDomain: "Alan adı",
-    smtpDkimKeySelector: "Anahtar Seçici",
-    smtpDkimPrivateKey: "Özel anahtar",
-    smtpDkimHashAlgo: "Hash Algoritması (Opsiyonel)",
-    smtpDkimheaderFieldNames: "İmzalanacak Başlık Anahtarları (Opsiyonel)",
-    smtpDkimskipFields: "İmzalamayacak Başlık Anahtarları (Opsiyonel)",
-    wayToGetPagerDutyKey: "Bunu Hizmet -> Hizmet Dizini -> (Bir hizmet seçin) -> Entegrasyonlar -> Entegrasyon ekle'ye giderek alabilirsiniz. Burada \"Events API V2\" için arama yapabilirsiniz. Daha fazla bilgi {0}",
-    "Integration Key": "Entegrasyon Anahtarı",
-    "Integration URL": "Entegrasyon URL'si",
-    "Auto resolve or acknowledged": "Otomatik çözümleme veya onaylandı",
-    "do nothing": "hiçbir şey yapma",
-    "auto acknowledged": "otomatik onaylandı",
-    "auto resolve": "otomatik çözümleme",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Uyarı Durumu",
-    alertaRecoverState: "Kurtarma Durumu",
-    deleteStatusPageMsg: "Bu durum sayfasını silmek istediğinizden emin misiniz?",
-    Proxies: "Proxy'ler",
-    default: "Varsayılan",
-    enabled: "Etkinleştirilmiş",
-    setAsDefault: "Varsayılan Olarak Ayarla",
-    deleteProxyMsg: "Bu proxy'yi tüm servisler için silmek istediğinizden emin misiniz?",
-    proxyDescription: "Proxy'lerin çalışması için bir servise atanması gerekir.",
-    enableProxyDescription: "Bu proxy, etkinleştirilene kadar izleme isteklerini etkilemeyecektir. Aktivasyon durumuna göre proxy'yi tüm servislerden geçici olarak devre dışı bırakabilirsiniz.",
-    setAsDefaultProxyDescription: "Bu proxy, yeni servisler için varsayılan olarak etkinleştirilecektir. Yine de proxy'yi her servis için ayrı ayrı devre dışı bırakabilirsiniz.",
-    "Certificate Chain": "Sertifika Zinciri",
-    Valid: "Geçerli",
-    Invalid: "Geçersiz",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir:",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
-    "Device Token": "Cihaz Tokeni",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Retry",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Proxy kur",
-    "Proxy Protocol": "Proxy Protokolü",
-    "Proxy Server": "Proxy Sunucusu",
-    "Proxy server has authentication": "Proxy sunucusunun kimlik doğrulaması var",
-    User: "Kullanıcı",
-    Installed: "Yüklenmiş",
-    "Not installed": "Yüklü değil",
-    Running: "Çalışıyor",
-    "Not running": "Çalışmıyor",
-    "Remove Token": "Tokeni Kaldır",
-    Start: "Başlat",
-    Stop: "Durdur",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Yeni Durum Sayfası Ekle",
-    Slug: "Slug",
-    "Accept characters:": "Kabul edilen karakterler:",
-    startOrEndWithOnly: "Yalnızca {0} ile başlayın veya bitirin",
-    "No consecutive dashes": "Ardışık tire yok",
-    Next: "Sonraki",
-    "The slug is already taken. Please choose another slug.": "Slug zaten alındı. Lütfen başka bir slug seçin.",
-    "No Proxy": "Proxy Yok",
-    Authentication: "Kimlik doğrulama",
-    "HTTP Basic Auth": "HTTP Temel Yetkilendirme",
-    "New Status Page": "Yeni Durum Sayfası",
-    "Page Not Found": "Sayfa bulunamadı",
-    "Reverse Proxy": "Ters Proxy",
-    Backup: "Yedek",
-    About: "Hakkında",
-    wayToGetCloudflaredURL: "(Cloudflared'i {0} adresinden indirin)",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Mesaj:",
-    "Don't know how to get the token? Please read the guide:": "Tokeni nasıl alacağınızı bilmiyor musunuz? Lütfen kılavuzu okuyun:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Halihazırda Cloudflare Tüneli üzerinden bağlanıyorsanız mevcut bağlantı kesilebilir. Durdurmak istediğinden emin misin? Onaylamak için mevcut şifrenizi yazın.",
-    "HTTP Headers": "HTTP Headers",
-    "Trust Proxy": "Trust Proxy",
-    "Other Software": "Diğer Yazılımlar",
-    "For example: nginx, Apache and Traefik.": "Örneğin: nginx, Apache ve Traefik.",
-    "Please read": "Lütfen oku",
-    "Subject:": "Başlık:",
-    "Valid To:": "Geçerlilik:",
-    "Days Remaining:": "Kalan günler:",
-    "Issuer:": "Veren:",
-    "Fingerprint:": "Parmak izi:",
-    "No status pages": "Durum sayfası yok",
-    "Domain Name Expiry Notification": "Alan Adı Sona Erme Bildirimi",
-    Proxy: "Proxy",
-    "Date Created": "Tarih Oluşturuldu",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP Adresi",
-    onebotMessageType: "OneBot Mesaj Türü",
-    onebotGroupMessage: "Grup",
-    onebotPrivateMessage: "Özel",
-    onebotUserOrGroupId: "Grup/Kullanıcı Kimliği",
-    onebotSafetyTips: "Güvenlik için erişim tokeni ayarlamalısınız",
-    "PushDeer Key": "PushDeer Anahtarı",
-    "Footer Text": "Altbilgi metni",
-    "Show Powered By": "\"Powered by\" kısmını göster",
-    "Domain Names": "Alan isimleri",
-    signedInDisp: "{0} olarak oturum açıldı",
-    signedInDispDisabled: "Yetkilendirme Devre Dışı.",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "İstemci ve sunucu arasında paylaşılan gizli anahtar",
-    RadiusCalledStationId: "Aranan İstasyon Kimliği",
-    RadiusCalledStationIdDescription: "Aranan cihazın tanımlayıcısı",
-    RadiusCallingStationId: "Arayan İstasyon Kimliği",
-    RadiusCallingStationIdDescription: "Arayan cihazın tanımlayıcısı",
-    "Certificate Expiry Notification": "Sertifika Sona Erme Bildirimi",
-    "API Username": "API Kullanıc Adı",
-    "API Key": "API Anahtarı",
-    "Recipient Number": "Alıcı Numarası",
-    "From Name/Number": "İsimden/Numaradan",
-    "Leave blank to use a shared sender number.": "Paylaşılan bir gönderen numarası kullanmak için boş bırakın.",
-    "Octopush API Version": "Octopush API Sürümü",
-    "Legacy Octopush-DM": "Eski Octopush-DM",
-    endpoint: "uç nokta",
-    octopushAPIKey: "Kontrol panelindeki HTTP API kimlik bilgilerinden \"API Key\"",
-    octopushLogin: "Kontrol panelindeki HTTP API kimlik bilgilerinden \"Login\"",
-    promosmsLogin: "API Oturum Açma Adı",
-    promosmsPassword: "API Şifresi",
-    "pushoversounds pushover": "Pushover (varsayılan)",
-    "pushoversounds bike": "Bisiklet",
-    "pushoversounds bugle": "Boru",
-    "pushoversounds cashregister": "Yazar kasa",
-    "pushoversounds classical": "Klasik",
-    "pushoversounds cosmic": "Kozmik",
-    "pushoversounds falling": "Düşme",
-    "pushoversounds gamelan": "Oyun Alanı",
-    "pushoversounds incoming": "Gelen",
-    "pushoversounds intermission": "Ara",
-    "pushoversounds magic": "Büyü",
-    "pushoversounds mechanical": "Mekanik",
-    "pushoversounds pianobar": "Piano",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Uzay Alarmı",
-    "pushoversounds tugboat": "Römorkör",
-    "pushoversounds alien": "Uzaylı Alarmı (uzun)",
-    "pushoversounds climb": "Tırmanış (uzun)",
-    "pushoversounds persistent": "Sürekli (uzun)",
-    "pushoversounds echo": "Pushover Yankı (uzun)",
-    "pushoversounds updown": "Yukarı Aşağı (uzun)",
-    "pushoversounds vibrate": "Sadece titreşim",
-    "pushoversounds none": "Yok (sessiz)",
-    pushyAPIKey: "Gizli API Anahtarı",
-    pushyToken: "Cihaz tokeni",
-    "Show update if available": "Varsa güncellemeyi göster",
-    "Also check beta release": "Ayrıca beta sürümünü kontrol edin",
-    "Using a Reverse Proxy?": "Ters Proxy mi Kullanıyorsunuz?",
-    "Check how to config it for WebSocket": "WebSocket için nasıl yapılandırılacağını kontrol edin",
-    "Steam Game Server": "Steam Oyun Sunucusu",
-    "Most likely causes:": "En olası nedenler:",
-    "The resource is no longer available.": "Kaynak artık mevcut değil.",
-    "There might be a typing error in the address.": "Adreste bir yazım hatası olabilir.",
-    "What you can try:": "Ne deneyebilirsin:",
-    "Retype the address.": "Adresi tekrar yazın.",
-    "Go back to the previous page.": "Bir önceki sayfaya geri git.",
-    "Coming Soon": "Yakında gelecek",
-    wayToGetClickSendSMSToken: "API Kullanıcı Adı ve API Anahtarını {0} adresinden alabilirsiniz.",
-    "Connection String": "Bağlantı dizisi",
-    Query: "Sorgu",
-    settingsCertificateExpiry: "TLS Sertifikasının Geçerlilik Süresi",
-    certificationExpiryDescription: "HTTPS Monitörleri, TLS sertifikasının süresi dolduğunda bildirimi tetikler:",
-    "Setup Docker Host": "Docker Ana Bilgisayarını Kur",
-    "Connection Type": "Bağlantı türü",
-    "Docker Daemon": "Docker Daemon",
-    deleteDockerHostMsg: "Bu docker ana bilgisayarını tüm monitörler için silmek istediğinizden emin misiniz?",
-    socket: "Soket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker Konteyner",
-    "Container Name / ID": "Konteyner Adı / Kimliği",
-    "Docker Host": "Docker Ana Bilgisayarı",
-    "Docker Hosts": "Docker Ana Bilgisayarları",
-    "ntfy Topic": "ntfy Konu",
-    Domain: "Domain",
-    Workstation: "İş İstasyonu",
-    disableCloudflaredNoAuthMsg: "Yetki yok modundasınız, şifre gerekli değil.",
-    trustProxyDescription: "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.",
-    wayToGetLineNotifyToken: "{0} adresinden bir erişim jetonu alabilirsiniz.",
-    Examples: "Örnekler",
-    "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Long-Lived Erişim Anahtarı",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Erişim Anahtarı, profil adınıza (sol altta) tıklayarak ve aşağıya kaydırarak ve ardından Anahtar Oluştur'a tıklayarak oluşturulabilir. ",
-    "Notification Service": "Bildirim Hizmeti",
-    "default: notify all devices": "varsayılan: tüm cihazları bilgilendir",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Cihazınızın/telefonunuzun adını bulmak için Home Assistant'ta \"Geliştirici Araçları > Hizmetler\" \"bildirim\" araması altında bir Bildirim Hizmetleri listesi bulunabilir.",
-    "Automations can optionally be triggered in Home Assistant:": "Otomasyonlar isteğe bağlı olarak Home Assistant'ta tetiklenebilir:",
-    "Trigger type:": "Trigger tipi:",
-    "Event type:": "Etkinlik tipi:",
-    "Event data:": "Etkinlik verileri:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "Ardından bir eylem seçin, örneğin RGB ışığının kırmızı olduğu sahneyi değiştirin.",
-    "Frontend Version": "Frontend Sürümü",
-    "Frontend Version do not match backend version!": "Frontend Sürümü, backend sürümüyle eşleşmiyor!",
-    "Base URL": "Temel URL",
-    goAlertInfo: "GoAlert, çağrı üzerine zamanlama, otomatik eskalasyonlar ve bildirimler (SMS veya sesli çağrılar gibi) için açık kaynaklı bir uygulamadır. Doğru kişiyi, doğru şekilde ve doğru zamanda otomatik olarak devreye sokun! {0}",
-    goAlertIntegrationKeyInfo: "Servis için genel API entegrasyon anahtarını, genellikle kopyalanan URL'nin belirteç parametresinin değeri olan \"aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biçiminde alın.",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "Kullanımdan Kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan, tam bir yedekleme oluşturamaz veya geri yükleyemez.",
-    backupRecommend: "Lütfen bunun yerine birimi veya veri klasörünü (./data/) doğrudan yedekleyin.",
-    enableGRPCTls: "TLS bağlantısıyla gRPC isteği göndermeye izin ver",
-    grpcMethodDescription: "Yöntem adı, sayHello, check, vb. gibi cammelCase biçimine dönüştürülür.",
-    Maintenance: "Bakım",
-    statusMaintenance: "Bakım",
-    "Schedule maintenance": "Bakım Planla",
-    "Affected Monitors": "Etkilenen Monitörler",
-    "Pick Affected Monitors...": "Etkilenen Monitörleri Seçin...",
-    "Start of maintenance": "Bakım başlangıcı",
-    "All Status Pages": "Tüm Durum Sayfaları",
-    "Select status pages...": "Durum sayfalarını seçin...",
-    recurringIntervalMessage: "Her gün bir kez çalıştırın | {0} günde bir çalıştırın",
-    affectedMonitorsDescription: "Geçerli bakımdan etkilenen monitörleri seçin",
-    affectedStatusPages: "Bu bakım mesajını seçili durum sayfalarında göster",
-    atLeastOneMonitor: "Etkilenen en az bir monitör seçin",
-    deleteMaintenanceMsg: "Bu bakımı silmek istediğinizden emin misiniz?",
-    ZohoCliq: "ZohoCliq",
-    webhookAdditionalHeadersTitle: "Ek Başlıklar",
-    webhookAdditionalHeadersDesc: "Webhook ile gönderilen ek başlıkları ayarlar.",
-    wayToGetZohoCliqURL: "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
-    Kook: "Kook",
-    wayToGetKookBotToken: "Uygulama oluşturun ve {0} adresinde bot tokenı alın",
-    wayToGetKookGuildID: "Kook ayarında \"Geliştirici Modu\"nu açın ve kimliğini almak için guild'e sağ tıklayın",
-    "Guild ID": "Guild ID",
-    smseagle: "SMSEagle",
-    smseagleTo: "Telefon numara(ları)",
-    smseagleGroup: "Telefon defteri grubu ad(lar)ı",
-    smseagleContact: "Telefon rehberi kişi ad(lar)ı",
-    smseagleRecipientType: "Alıcı Türü",
-    smseagleRecipient: "Alıcı(lar) (birden çok olanlar virgülle ayrılmalıdır)",
-    smseagleToken: "API Erişim Tokenı",
-    smseagleUrl: "SMSEagle cihaz URL\"niz",
-    smseagleEncoding: "Unicode olarak gönder",
-    smseaglePriority: "Mesaj önceliği (0-9, varsayılan = 0)",
-    Optional: "İsteğe bağlı",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API Dökümanları ",
-    "Gateway Type": "Ağ Geçidi Türü",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "Sayıları aşağıdakilerle bölebilirsiniz",
-    or: "veya",
-    recurringInterval: "Sıklık",
-    Recurring: "Yineleme",
-    strategyManual: "Manuel olarak Aktif/Pasif",
-    warningTimezone: "Sunucunun kullandığı saat dilimi",
-    weekdayShortMon: "Pzt",
-    weekdayShortTue: "Sal",
-    weekdayShortWed: "Çar",
-    weekdayShortThu: "Per",
-    weekdayShortFri: "Cum",
-    weekdayShortSat: "Cmt",
-    weekdayShortSun: "Paz",
-    dayOfWeek: "Haftanın Günleri",
-    dayOfMonth: "Ayın Günleri",
-    lastDay: "Son Gün",
-    lastDay1: "Ayın Son Günü",
-    lastDay2: "Ayın 2. Son Günü",
-    lastDay3: "Ayın 3. Son Günü",
-    lastDay4: "Ayın 4. Son Günü",
-    "No Maintenance": "Bakım Yok",
-    pauseMaintenanceMsg: "Duraklatmak istediğinizden emin misiniz?",
-    "maintenanceStatus-under-maintenance": "Bakımda",
-    "maintenanceStatus-inactive": "Etkin Değil",
-    "maintenanceStatus-scheduled": "Planlanmış",
-    "maintenanceStatus-ended": "Bitti",
-    "maintenanceStatus-unknown": "Bilinmiyor",
-    "Display Timezone": "Saat dilimini göster",
-    "Server Timezone": "Sunucu Saat Dilimi",
-    statusPageMaintenanceEndDate: "Bitiş Zamanı",
-    IconUrl: "Icon URL",
-    "Enable DNS Cache": "DNS Önbelleğini Etkinleştir",
-    Enable: "Etkin",
-    Disable: "Devre Dışı",
-    dnsCacheDescription: "Bazı IPv6 ortamlarında çalışmıyor olabilir, herhangi bir sorunla karşılaşırsanız devre dışı bırakın.",
-    "Single Maintenance Window": "Tek Seferlik Bakım",
-    "Maintenance Time Window of a Day": "Bür Günlük Bakım",
-    "Effective Date Range": "Bakim Tarih Aralığı",
-    "Schedule Maintenance": "Bakım Planla",
-    "Date and Time": "Tarih ve Saat",
-    "DateTime Range": "Tarih ve Saat Aralığı",
-    Strategy: "Strateji",
-    "Free Mobile User Identifier": "Ücretsiz Mobil Kullanıcı ID",
-    "Free Mobile API Key": "Ücretsiz Mobil API Anahtarı",
-    "Enable TLS": "TLS'yi Etkinleştir",
-    "Proto Service Name": "Proto Service İsmi",
-    "Proto Method": "Proto Method",
-    "Proto Content": "Proto İçeriği",
-    Economy: "Ekonomik",
-    Lowcost: "Düşük maliyetli",
-    high: "Yüksek",
-    "General Monitor Type": "Genel Monitör Tipi",
-    "Passive Monitor Type": "Pasif Monitör Tipi",
-    "Specific Monitor Type": "Özel Monitör Tipi",
-};
diff --git a/src/languages/uk-UA.js b/src/languages/uk-UA.js
deleted file mode 100644
index cc01793c..00000000
--- a/src/languages/uk-UA.js
+++ /dev/null
@@ -1,530 +0,0 @@
-export default {
-    languageName: "Українська",
-    checkEverySecond: "Перевірка кожні {0} секунд",
-    retriesDescription: "Максимальна кількість спроб перед позначенням сервісу як недоступного та надсиланням повідомлення",
-    ignoreTLSError: "Ігнорувати помилку TLS/SSL для сайтів HTTPS",
-    upsideDownModeDescription: "Реверс статусу сервісу. Якщо сервіс доступний, він позначається як НЕДОСТУПНИЙ.",
-    maxRedirectDescription: "Максимальна кількість перенаправлень. Поставте 0, щоб вимкнути перенаправлення.",
-    acceptedStatusCodesDescription: "Виберіть коди статусів для визначення доступності сервісу.",
-    passwordNotMatchMsg: "Повторення паролю не збігається.",
-    notificationDescription: "Прив'яжіть сповіщення до моніторів.",
-    keywordDescription: "Пошук слова в чистому HTML або JSON-відповіді (чутливо до регістру)",
-    pauseDashboardHome: "Пауза",
-    deleteMonitorMsg: "Ви дійсно хочете видалити цей монітор?",
-    deleteNotificationMsg: "Ви дійсно хочете видалити це сповіщення для всіх моніторів?",
-    resolverserverDescription: "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.": "Сертифікат спливає",
-    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": "Увімкнути авторизацію",
-    "disableauth.message1": "Ви впевнені, що бажаєте <strong>вимкнути авторизацію</strong>?",
-    "disableauth.message2": "Це підходить для <strong>тих, у кого встановлена інша авторизація</strong> пееред відкриттям Uptime Kuma, наприклад Cloudflare Access.",
-    "Please use this option carefully!": "Будь ласка, використовуйте з обережністю.",
-    Logout: "Вийти",
-    Leave: "Відміна",
-    "I understand, please disable": "Я розумію, все одно відключити",
-    Confirm: "Підтвердити",
-    Yes: "Так",
-    No: "Ні",
-    Username: "Логін",
-    Password: "Пароль",
-    "Remember me": "Запам'ятати мене",
-    Login: "Вхід до системи",
-    "No Monitors, please": "Моніторів немає, будь ласка",
-    "No Monitors": "Монітори відсутні",
-    "add one": "створіть новий",
-    "Notification Type": "Тип сповіщення",
-    Email: "Пошта",
-    Test: "Перевірка",
-    "Certificate Info": "Інформація про сертифікат",
-    "Resolver Server": "DNS сервер",
-    "Resource Record Type": "Тип ресурсного запису",
-    "Last Result": "Останній результат",
-    "Create your admin account": "Створіть обліковий запис адміністратора",
-    "Repeat Password": "Повторіть пароль",
-    respTime: "Час відповіді (мс)",
-    notAvailableShort: "Н/д",
-    Create: "Створити",
-    clearEventsMsg: "Ви дійсно хочете видалити всю статистику подій цього монітора?",
-    clearHeartbeatsMsg: "Ви дійсно хочете видалити всю статистику опитувань цього монітора?",
-    confirmClearStatisticsMsg: "Ви дійсно хочете видалити ВСЮ статистику?",
-    "Clear Data": "Видалити статистику",
-    Events: "Події",
-    Heartbeats: "Опитування",
-    "Auto Get": "Авто-отримання",
-    enableDefaultNotificationDescription: "Для кожного нового монітора це сповіщення буде включено за замовчуванням. Ви все ще можете відключити сповіщення в кожному моніторі окремо.",
-    "Default enabled": "Використовувати за промовчанням",
-    "Also apply to existing monitors": "Застосувати до існуючих моніторів",
-    Export: "Експорт",
-    Import: "Імпорт",
-    backupDescription: "Ви можете зберегти резервну копію всіх моніторів та повідомлень у вигляді JSON-файлу",
-    backupDescription2: "P.S.: Історія та події збережені не будуть",
-    backupDescription3: "Важливі дані, такі як токени повідомлень, додаються під час експорту, тому зберігайте файли в безпечному місці",
-    alertNoFile: "Виберіть файл для імпорту.",
-    alertWrongFileType: "Виберіть JSON-файл.",
-    twoFAVerifyLabel: "Будь ласка, введіть свій токен, щоб перевірити роботу 2FA",
-    tokenValidSettingsMsg: "Токен дійсний! Тепер ви можете зберегти налаштування 2FA.",
-    confirmEnableTwoFAMsg: "Ви дійсно хочете увімкнути 2FA?",
-    confirmDisableTwoFAMsg: "Ви дійсно хочете вимкнути 2FA?",
-    "Apply on all existing monitors": "Застосувати до всіх існуючих моніторів",
-    "Verify Token": "Перевірити токен",
-    "Setup 2FA": "Налаштування 2FA",
-    "Enable 2FA": "Увімкнути 2FA",
-    "Disable 2FA": "Вимкнути 2FA",
-    "2FA Settings": "Налаштування 2FA",
-    "Two Factor Authentication": "Двофакторна аутентифікація",
-    Active: "Активно",
-    Inactive: "Неактивно",
-    Token: "Токен",
-    "Show URI": "Показати URI",
-    "Clear all statistics": "Очистити статистику",
-    retryCheckEverySecond: "Повтор кожні {0} секунд",
-    importHandleDescription: "Виберіть \"Пропустити існуючі\", якщо ви хочете пропустити кожен монітор або повідомлення з таким же ім'ям. \"Перезаписати\" видалить кожен існуючий монітор або повідомлення та додасть заново. Варіант \"Не перевіряти\" примусово відновлює всі монітори і повідомлення, навіть якщо вони вже існують.",
-    confirmImportMsg: "Ви дійсно хочете відновити резервну копію? Переконайтеся, що ви вибрали відповідний варіант імпорту.",
-    "Heartbeat Retry Interval": "Інтервал повтору опитування",
-    "Import Backup": "Імпорт",
-    "Export Backup": "Експорт",
-    "Skip existing": "Пропустити існуючі",
-    Overwrite: "Перезаписати",
-    Options: "Опції",
-    "Keep both": "Не перевіряти",
-    Tags: "Теги",
-    "Add New below or Select...": "Додати новий або вибрати...",
-    "Tag with this name already exist.": "Такий тег вже існує.",
-    "Tag with this value already exist.": "Тег із таким значенням вже існує.",
-    color: "колір",
-    "value (optional)": "значення (опціонально)",
-    Gray: "Сірий",
-    Red: "Червоний",
-    Orange: "Помаранчевий",
-    Green: "Зелений",
-    Blue: "Синій",
-    Indigo: "Індиго",
-    Purple: "Пурпурний",
-    Pink: "Рожевий",
-    "Search...": "Пошук...",
-    "Avg. Ping": "Середній пінг",
-    "Avg. Response": "Середній час відповіді",
-    "Entry Page": "Головна сторінка",
-    statusPageNothing: "Тут порожньо. Додайте групу або монітор.",
-    "No Services": "Немає сервісів",
-    "All Systems Operational": "Всі системи працюють у штатному режимі",
-    "Partially Degraded Service": "Сервіси працюють частково",
-    "Degraded Service": "Всі сервіси не працюють",
-    "Add Group": "Додати групу",
-    "Add a monitor": "Додати монітор",
-    "Edit Status Page": "Редагувати",
-    "Go to Dashboard": "Панель управління",
-    "Status Page": "Сторінка статусу",
-    "Status Pages": "Сторінки статусу",
-    Discard: "Скасування",
-    "Create Incident": "Створити інцидент",
-    "Switch to Dark Theme": "Темна тема",
-    "Switch to Light Theme": "Світла тема",
-    telegram: "Telegram",
-    webhook: "Вебхук",
-    smtp: "Email (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Підтримка 50+ сервісів повідомлень)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "Primary Base URL": "Основна URL",
-    "Push URL": "URL пуша",
-    needPushEvery: "До цієї URL необхідно звертатися кожні {0} секунд",
-    pushOptionalParams: "Опціональні параметри: {0}",
-    defaultNotificationName: "Моє сповіщення {notification} ({number})",
-    here: "тут",
-    Required: "Потрібно",
-    "Bot Token": "Токен бота",
-    wayToGetTelegramToken: "Ви можете взяти токен тут - {0}.",
-    "Chat ID": "ID чату",
-    supportTelegramChatID: "Підтримуються ID чатів, груп та каналів",
-    wayToGetTelegramChatID: "Ви можете взяти ID вашого чату, відправивши повідомлення боту і перейшовши по цьому URL для перегляду chat_id:",
-    "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ТУТ",
-    chatIDNotFound: "ID чату не знайдено; будь ласка, відправте спочатку повідомлення боту",
-    "Post URL": "Post URL",
-    "Content Type": "Тип контенту",
-    webhookJsonDesc: "{0} підходить для будь-яких сучасних HTTP-серверів, наприклад Express.js",
-    webhookFormDataDesc: "{multipart} підходить для PHP. JSON-вивід необхідно буде обробити за допомогою {decodeFunction}",
-    secureOptionNone: "Ні / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Ігнорувати помилки TLS",
-    "From Email": "Від кого",
-    emailCustomSubject: "Своя тема",
-    "To Email": "Кому",
-    smtpCC: "Копія",
-    smtpBCC: "Прихована копія",
-    "Discord Webhook URL": "Discord Вебхук URL",
-    wayToGetDiscordURL: "Ви можете створити його в Параметрах сервера -> Інтеграції -> Створити вебхук",
-    "Bot Display Name": "Ім'я бота, що відображається",
-    "Prefix Custom Message": "Свій префікс повідомлення",
-    "Hello @everyone is...": "Привіт {'@'}everyone це...",
-    "Webhook URL": "URL вебхука",
-    wayToGetTeamsURL: "Як створити URL вебхука ви можете дізнатися тут - {0}.",
-    Номер: "Номер",
-    Recipients: "Одержувачі",
-    needSignalAPI: "Вам необхідний клієнт Signal із підтримкою REST API.",
-    wayToCheckSignalURL: "Пройдіть по цьому URL, щоб дізнатися як налаштувати такий клієнт:",
-    signalImportant: "ВАЖЛИВО: Не можна змішувати в Одержувачах групи та номери!",
-    "Application Token": "Токен програми",
-    "Server URL": "URL сервера",
-    Priority: "Пріоритет",
-    "Icon Emoji": "Іконка Emoji",
-    "Channel Name": "Ім'я каналу",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Більше інформації про вебхуки: {0}",
-    aboutChannelName: "Введіть ім'я каналу в поле {0} Ім'я каналу, якщо ви хочете обійти канал вебхука. Наприклад: #other-channel",
-    aboutKumaURL: "Якщо поле Uptime Kuma URL в налаштуваннях залишиться порожнім, за замовчуванням буде використовуватися посилання на проект на GitHub.",
-    emojiCheatSheet: "Шпаргалка по Emoji: {0}",
-    "User Key": "Ключ користувача",
-    Device: "Пристрій",
-    "Message Title": "Заголовок повідомлення",
-    "Notification Sound": "Звук сповіщення",
-    "More info on:": "Більше інформації: {0}",
-    pushoverDesc1: "Екстренний пріоритет (2) має таймуут повтору за замовчуванням 30 секунд і закінчується через 1 годину.",
-    pushoverDesc2: "Якщо ви бажаєте надсилати повідомлення різним пристроям, необхідно заповнити поле Пристрій.",
-    "SMS Type": "Тип SMS",
-    octopushTypePremium: "Преміум (Швидкий - рекомендується для алертів)",
-    octopushTypeLowCost: "Дешевий (Повільний - іноді блокується операторами)",
-    checkPrice: "Тарифи {0}:",
-    octopushLegacyHint: "Ви використовуєте стару версію Octopush (2011-2020) або нову?",
-    "Check octopush prices": "Тарифи Octopush {0}.",
-    octopushPhoneNumber: "Номер телефону (між. формат, наприклад: +380123456789)",
-    octopushSMSSender: "Ім'я відправника SMS: 3-11 символів алвафіту, цифр та пробілів (a-zA-Z0-9)",
-    "LunaSea Device ID": "ID пристрою LunaSea",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Приклад: {0}",
-    "Read more:": "Докладніше: {0}",
-    "Status:": "Статус: {0}",
-    "Read more": "Докладніше",
-    appriseInstalled: "Apprise встановлено.",
-    appriseNotInstalled: "Apprise не встановлено. {0}",
-    "Access Token": "Токен доступу",
-    "Channel access token": "Токен доступу каналу",
-    "Line Developers Console": "Консоль розробників Line",
-    lineDevConsoleTo: "Консоль розробників Line - {0}",
-    "Basic Settings": "Базові налаштування",
-    "User ID": "ID користувача",
-    "Messaging API": "API повідомлень",
-    wayToGetLineChannelToken: "Спочатку зайдіть в {0}, створіть провайдера та канал (API повідомлень), потім ви зможете отримати токен доступу каналу та ID користувача з вищезгаданих пунктів меню.",
-    "Icon URL": "URL іконки",
-    aboutIconURL: "Ви можете надати посилання на іконку в полі \"URL іконки\", щоб перевизначити картинку профілю за замовчуванням. Не використовується, якщо задана іконка Emoji.",
-    aboutMattermostChannelName: "Ви можете перевизначити канал за замовчуванням, в який пише вебхук, ввівши ім'я каналу в полі \"Ім'я каналу\". Це необхідно включити в налаштуваннях вебхука Mattermost. Наприклад: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - дешево та повільно, часто перевантажений. Тільки для одержувачів з Польщі.",
-    promosmsTypeFlash: "SMS FLASH - повідомлення автоматично з'являться на пристрої одержувача. Тільки для одержувачів з Польщі.",
-    promosmsTypeFull: "SMS FULL - преміум-рівень SMS, можна використовувати своє ім'я відправника (попередньо зареєструвавши його). Надійно для алертів.",
-    promosmsTypeSpeed: "SMS SPEED - найвищий пріоритет у системі. Дуже швидко і надійно, але дуже дорого (вдвічі дорожче, ніж SMS FULL).",
-    promosmsPhoneNumber: "Номер телефону (для одержувачів з Польщі можна пропустити код регіону)",
-    promosmsSMSSender: "Ім'я відправника SMS: Зареєстроване або одне з імен за замовчуванням: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookURL": "Feishu WebHookURL",
-    matrixHomeserverURL: "URL сервера (разом з http(s):// і опціонально порт)",
-    "Internal Room Id": "Внутрішній ID кімнати",
-    matrixDesc1: "Внутрішній ID кімнати можна знайти в Подробицях у параметрах каналу вашого Matrix клієнта. Він повинен виглядати приблизно як !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Рекомендується створити нового користувача і не використовувати токен доступу особистого користувача Matrix, тому що це спричиняє повний доступ до облікового запису та до кімнат, в яких ви є. Замість цього створіть нового користувача і запросіть його тільки в ту кімнату, в якій ви хочете отримувати повідомлення.Токен доступу можна отримати, виконавши команду {0}",
-    Method: "Метод",
-    Body: "Тіло",
-    Headers: "Заголовки",
-    PushUrl: "URL пуша",
-    HeadersInvalidFormat: "Заголовки запиту некоректні JSON: ",
-    BodyInvalidFormat: "Тіло запиту некоректне JSON: ",
-    "Monitor History": "Статистика",
-    clearDataOlderThan: "Зберігати статистику за {0} днів.",
-    PasswordsDoNotMatch: "Паролі не співпадають.",
-    records: "записів",
-    "One record": "Один запис",
-    steamApiKeyDescription: "Для моніторингу ігрового сервера Steam вам потрібен Web-API ключ Steam. Зареєструвати його можна тут: ",
-    "Certificate Chain": "Ланцюжок сертифікатів",
-    Valid: "Дійсний",
-    "Hide Tags": "Приховати теги",
-    Title: "Назва інциденту:",
-    Content: "Зміст інциденту:",
-    Post: "Опублікувати",
-    Cancel: "Скасувати",
-    Created: "Створено",
-    Unpin: "Відкріпити",
-    "Show Tags": "Показати теги",
-    recent: "Зараз",
-    "3h": "3 години",
-    "6h": "6 годин",
-    "24h": "24 години",
-    "1w": "1 тиждень",
-    "No monitors available.": "Немає доступних моніторів",
-    "Add one": "Додати новий",
-    Backup: "Резервна копія",
-    Security: "Безпека",
-    "Shrink Database": "Стиснути базу даних",
-    "Current User": "Поточний користувач",
-    About: "Про програму",
-    Description: "Опис",
-    "Powered by": "Працює на основі скрипту від",
-    shrinkDatabaseDescription: "Включає VACUUM для бази даних SQLite. Якщо база даних була створена на версії 1.10.0 і більше, AUTO_VACUUM вже включений і ця дія не потрібна.",
-    Style: "Стиль",
-    info: "ІНФО",
-    warning: "УВАГА",
-    danger: "ПОМИЛКА",
-    primary: "ОСНОВНИЙ",
-    light: "СВІТЛИЙ",
-    dark: "ТЕМНИЙ",
-    "New Status Page": "Нова сторінка статусу",
-    "Show update if available": "Показувати доступні оновлення",
-    "Also check beta release": "Перевіряти оновлення для бета версій",
-    "Add New Status Page": "Додати сторінку статусу",
-    Next: "Далі",
-    "Acz characters: a-z 0-9 -": "Дозволені символи: a-z 0-9 -",
-    "Start or end with a-z 0-9 only": "Початок та закінчення імені лише на символи: a-z 0-9",
-    "No consecutive dashes --": "Заборонено використовувати тире --",
-    "HTTP Options": "HTTP Опції",
-    Authentication: "Аутентифікація",
-    "HTTP Basic Auth": "Базова HTTP",
-    PushByTechulus: "Push by Techulus",
-    clicksendsms: "ClickSend SMS",
-    GoogleChat: "Google Chat (тільки Google Workspace)",
-    apiCredentials: "API реквізити",
-    Done: "Готово",
-    Info: "Інфо",
-    "Steam API Key": "Steam API-Ключ",
-    "Pick a RR-Type...": "Виберіть RR-тип...",
-    "Pick Accepted Status Codes...": "Виберіть прийняті коди стану...",
-    Default: "За замовчуванням",
-    "Please input title and content": "Будь ласка, введіть назву та зміст",
-    "Last Updated": "Останнє Оновлення",
-    "Untitled Group": "Група без назви",
-    Services: "Сервіси",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Користувач (включаючи префікс webapi_)",
-    serwersmsAPIPassword: "API Пароль",
-    serwersmsPhoneNumber: "Номер телефону",
-    serwersmsSenderName: "SMS ім'я відправника (реєстрований через портал користувача)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM Налаштування",
-    smtpDkimDesc: "Повернутися до Nodemailer DKIM {0} для використання.",
-    documentation: "документація",
-    smtpDkimDomain: "Ім'я домена",
-    smtpDkimKeySelector: "Ключ",
-    smtpDkimPrivateKey: "Приватний ключ",
-    smtpDkimHashAlgo: "Алгоритм хеша (опціонально)",
-    smtpDkimheaderFieldNames: "Заголовок ключів для підпису (опціонально)",
-    smtpDkimskipFields: "Заколовок ключів не для підпису (опціонально)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "Кінцева точка API",
-    alertaEnvironment: "Середовище",
-    alertaApiKey: "Ключ API",
-    alertaAlertState: "Стан алерту",
-    alertaRecoverState: "Стан відновлення",
-    deleteStatusPageMsg: "Дійсно хочете видалити цю сторінку статусів?",
-    Proxies: "Проксі",
-    default: "За замовчуванням",
-    enabled: "Активно",
-    setAsDefault: "Встановити за замовчуванням",
-    deleteProxyMsg: "Ви впевнені, що хочете видалити цей проксі для всіх моніторів?",
-    proxyDescription: "Щоб функціонувати, монітору потрібно призначити проксі.",
-    enableProxyDescription: "Цей проксі не впливатиме на запити моніторингу, доки його не буде активовано. Ви можете контролювати тимчасове відключення проксі з усіх моніторів за статусом активації.",
-    setAsDefaultProxyDescription: "Цей проксі буде ввімкнено за умовчанням для нових моніторів. Ви все одно можете вимкнути проксі окремо для кожного монітора.",
-    Invalid: "Недійсний",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Шаблон смс повинен містити параметри: ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Для безпеки необхідно використовувати секретний ключ",
-    "Device Token": "Токен пристрою",
-    Platform: "Платформа",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "Високий",
-    Retry: "Повтор",
-    Topic: "Тема",
-    "WeCom Bot Key": "WeCom Bot ключ",
-    "Setup Proxy": "Налаштувати проксі",
-    "Proxy Protocol": "Протокол проксі",
-    "Proxy Server": "Проксі-сервер",
-    "Proxy server has authentication": "Проксі-сервер має аутентифікацію",
-    User: "Користувач",
-    Installed: "Встановлено",
-    "Not installed": "Не встановлено",
-    Running: "Запущено",
-    "Not running": "Не запущено",
-    "Remove Token": "Видалити токен",
-    Start: "Запустити",
-    Stop: "Зупинити",
-    "Uptime Kuma": "Uptime Kuma",
-    Slug: "Slug",
-    "Accept characters:": "Прийняти символи:",
-    startOrEndWithOnly: "Починається або закінчується лише {0}",
-    "No consecutive dashes": "Немає послідовних тире",
-    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
-    "No Proxy": "Без проксі",
-    "Page Not Found": "Сторінку не знайдено",
-    "Reverse Proxy": "Реверсивний проксі",
-    wayToGetCloudflaredURL: "(Завантажити Cloudflare з {0})",
-    cloudflareWebsite: "Веб-сайт Cloudflare",
-    "Message:": "Повідомлення:",
-    "Don't know how to get the token? Please read the guide:": "Не знаєте, як отримати токен? Прочитайте посібник:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Поточне з’єднання може бути втрачено, якщо ви зараз під’єднуєтеся через Cloudflare Tunnel. Ви дійсно хочете зробити це? Для підтвердження введіть поточний пароль.",
-    "Other Software": "Інше програмне забезпечення",
-    "For example: nginx, Apache and Traefik.": "Наприклад: nginx, Apache and Traefik.",
-    "Please read": "Будь ласка, прочитайте",
-    "Subject:": "Тема:",
-    "Valid To:": "Дійсний до:",
-    "Days Remaining:": "Залишилось днів:",
-    "Issuer:": "Емітент:",
-    "Fingerprint:": "Відбиток:",
-    "No status pages": "Немає сторінок статусу",
-    "Domain Name Expiry Notification": "Сповіщення про закінчення терміну дії доменного імені",
-    Proxy: "Проксі",
-    "Date Created": "Дата створення",
-    onebotHttpAddress: "OneBot адреса HTTP",
-    onebotMessageType: "OneBot тип повідомлення",
-    onebotGroupMessage: "Група",
-    onebotPrivateMessage: "Приватне",
-    onebotUserOrGroupId: "Група/Користувач ID",
-    onebotSafetyTips: "Для безпеки необхідно встановити маркер доступу",
-    "PushDeer Key": "PushDeer ключ",
-    "Footer Text": "Текст нижнього колонтитула",
-    "Show Powered By": "Показувати платформу",
-    "Domain Names": "Доменні імена",
-    signedInDisp: "Ви ввійшли як {0}",
-    signedInDispDisabled: "Авторизація вимкнена.",
-    "Certificate Expiry Notification": "Сповіщення про закінчення терміну дії сертифіката",
-    "API Username": "Користувач API",
-    "API Key": "Ключ API",
-    "Recipient Number": "Номер одержувача",
-    "From Name/Number": "Від Ім'я/Номер",
-    "Leave blank to use a shared sender number.": "Залиште поле порожнім, щоб використовувати спільний номер відправника.",
-    "Octopush API Version": "Octopush API версія",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    "endpoint": "кінцева точка",
-    octopushAPIKey: "\"Ключ API\" з облікових даних HTTP API в панелі керування",
-    octopushLogin: "\"Ім'я користувача\" з облікових даних HTTP API на панелі керування",
-    promosmsLogin: "API Логін",
-    promosmsPassword: "API Пароль",
-    "pushoversounds pushover": "Pushover (по замовчуванню)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    pushyAPIKey: "Секретний ключ API",
-    pushyToken: "Токен пристрою",
-    "Using a Reverse Proxy?": "Використовувати зворотній проксі?",
-    "Check how to config it for WebSocket": "Перевірте, як налаштувати його для WebSocket",
-    "Steam Game Server": "Ігровий сервер Steam",
-    "Most likely causes:": "Найімовірніші причини:",
-    "The resource is no longer available.": "Ресурс більше не доступний.",
-    "There might be a typing error in the address.": "Можливо, в адресі є помилка.",
-    "What you can try:": "Що ви можете спробувати:",
-    "Retype the address.": "Повторно введіть адресу.",
-    "Go back to the previous page.": "Повернутися на попередню сторінку.",
-    "Coming Soon": "Незабаром",
-    wayToGetClickSendSMSToken: "Ви можете отримати ім’я користувача API та ключ API з {0} .",
-    "Connection String": "Рядок підключення",
-    "Query": "Запит",
-    settingsCertificateExpiry: "Закінчення терміну дії сертифіката TLS",
-    certificationExpiryDescription: "Запуск сповіщення для HTTPS моніторів коли до закінчення терміну дії TLS сертифіката:",
-    "ntfy Topic": "ntfy Тема",
-    "Domain": "Домен",
-    "Workstation": "Робоча станція",
-    disableCloudflaredNoAuthMsg: "Ви перебуваєте в режимі без авторизації, пароль не потрібен.",
-};
diff --git a/src/languages/vi-VN.js b/src/languages/vi-VN.js
deleted file mode 100644
index 505776f0..00000000
--- a/src/languages/vi-VN.js
+++ /dev/null
@@ -1,469 +0,0 @@
-export default {
-    languageName: "Tiếng Việt",
-    checkEverySecond: "Kiểm tra mỗi {0} giây.",
-    retryCheckEverySecond: "Thử lại mỗi {0} giây.",
-    retriesDescription: "Số lần thử lại tối đa trước khi dịch vụ được đánh dấu là down và gửi thông báo.",
-    ignoreTLSError: "Bỏ qua lỗi TLS/SSL với các web HTTPS.",
-    upsideDownModeDescription: "Trạng thái đảo ngược, nếu dịch vụ có thể truy cập được nghĩa là DOWN.",
-    maxRedirectDescription: "Số lần chuyển hướng (redirect) tối đa. Đặt thành 0 để tắt chuyển hướng",
-    acceptedStatusCodesDescription: "Chọn mã trạng thái được coi là phản hồi thành công.",
-    passwordNotMatchMsg: "Mật khẩu nhập lại không khớp.",
-    notificationDescription: "Vui lòng chỉ định một kênh thông báo.",
-    keywordDescription: "Từ khoá tìm kiếm phản hồi ở dạng html hoặc JSON, có phân biệt chữ HOA - thường",
-    pauseDashboardHome: "Tạm dừng",
-    deleteMonitorMsg: "Bạn chắc chắn muốn xóa kênh theo dõi này chứ?",
-    deleteNotificationMsg: "Bạn có chắc chắn muốn xóa kênh thông báo này cho tất cả kênh theo dõi?",
-    resolverserverDescription: "Cloudflare là máy chủ mặc định, bạn có thể thay đổi bất cứ lúc nào.",
-    rrtypeDescription: "Hãy chọn RR-Type mà bạn muốn giám sát",
-    pauseMonitorMsg: "Bạn chắc chắn muốn tạm dừng chứ?",
-    enableDefaultNotificationDescription: "Bật làm mặc định cho mọi kênh theo dõi mới về sau. Bạn vẫn có thể tắt thông báo riêng cho từng kênh theo dõi.",
-    clearEventsMsg: "Bạn chắc chắn muốn xoá TẤT CẢ sự kiện cho kênh theo dõi này chứ?",
-    clearHeartbeatsMsg: "Bạn chắc chắn muốn xoá TẤT CẢ heartbeats cho kênh theo dõi này chứ?",
-    confirmClearStatisticsMsg: "Bạn chắc chắn muốn xoá TẤT CẢ số liệu thống kê?",
-    importHandleDescription: "Chọn 'Giữ lại' nếu bạn muốn bỏ qua mọi kênh theo dõi và kênh thông báo trùng tên. 'Ghi đè' sẽ ghi đè lên tất cả các kênh theo dõi và kênh thông báo.",
-    confirmImportMsg: "Bạn có chắc chắn muốn khôi phục bản bản sao lưu này không?.",
-    twoFAVerifyLabel: "Vui lòng nhập mã token của bạn để xác minh rằng xác thực 2 lớp (2FA) đang hoạt động",
-    tokenValidSettingsMsg: "Mã token hợp lệ! Bạn có thể lưu cài đặt xác thực 2 lớp (2FA) bây giờ.",
-    confirmEnableTwoFAMsg: "Bạn chắc chắn muốn bật xác thực 2 lớp (2FA) chứ?",
-    confirmDisableTwoFAMsg: "Bạn chắc chắn muốn tắt xác thực 2 lớp (2FA) chứ?",
-    Settings: "Cài đặt",
-    Dashboard: "Dashboard",
-    "New Update": "Bản cập nhật mới",
-    Language: "Ngôn ngữ",
-    Appearance: "Giao diện",
-    Theme: "Theme",
-    General: "Chung",
-    "Primary Base URL": "URL chính",
-    Version: "Phiên bản",
-    "Check Update On GitHub": "Kiểm tra bản cập nhật mới trên GitHub",
-    List: "List",
-    Add: "Thêm",
-    "Add New Monitor": "Thêm mới kênh theo dõi",
-    "Quick Stats": "Thống kê nhanh",
-    Up: "Up",
-    Down: "Down",
-    Pending: "Chờ xử lý",
-    Unknown: "Không xác định",
-    Pause: "Tạm dừng",
-    Name: "Tên",
-    Status: "Trạng thái",
-    DateTime: "Ngày tháng",
-    Message: "Trạng thái request",
-    "No important events": "Không có sự kiện quan trọng nào",
-    Resume: "Khôi phục",
-    Edit: "Sửa",
-    Delete: "Xoá",
-    Current: "Hiện tại",
-    Uptime: "Uptime",
-    "Cert Exp.": "Cert hết hạn",
-    day: "ngày",
-    "-day": "-ngày",
-    hour: "giờ",
-    "-hour": "-giờ",
-    Response: "Phản hồi",
-    Ping: "Ping",
-    "Monitor Type": "Kiểu kênh theo dõi",
-    Keyword: "Từ khoá",
-    "Friendly Name": "Tên rút gọn",
-    URL: "URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "Tần suất kiểm tra",
-    Retries: "Thử lại",
-    "Heartbeat Retry Interval": "Tần suất kiểm tra lại",
-    Advanced: "Nâng cao",
-    "Upside Down Mode": "Chế độ đảo ngược",
-    "Max. Redirects": "Số chuyển hướng tối đa",
-    "Accepted Status Codes": "Codes trạng thái chấp nhận",
-    "Push URL": "Push URL",
-    needPushEvery: "Bạn nên gọi URL mỗi {0} giây.",
-    pushOptionalParams: "Tuỳ chỉnh parameters: {0}",
-    Save: "Lưu",
-    Notifications: "Thông báo",
-    "Not available, please setup.": "Chưa sẵn sàng, hãy cài đặt.",
-    "Setup Notification": "Cài đặt thông báo",
-    Light: "Sáng",
-    Dark: "Tối",
-    Auto: "Tự động",
-    "Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
-    Normal: "Bình thường",
-    Bottom: "Dưới",
-    None: "Không có",
-    Timezone: "Múi giờ",
-    "Search Engine Visibility": "Hiển thị với các công cụ tìm kiếm",
-    "Allow indexing": "Cho phép indexing",
-    "Discourage search engines from indexing site": "Ngăn chặn các công cụ tìm kiếm indexing trang",
-    "Change Password": "Thay đổi mật khẩu",
-    "Current Password": "Mật khẩu hiện tại",
-    "New Password": "Mật khẩu mới",
-    "Repeat New Password": "Lặp lại mật khẩu mới",
-    "Update Password": "Cập nhật mật khẩu",
-    "Disable Auth": "Tắt xác minh",
-    "Enable Auth": "Bật xác minh",
-    "disableauth.message1": "Bạn có muốn <strong>TẮT XÁC THỰC</strong> không?",
-    "disableauth.message2": "Điều này rất nguy hiểm<strong>BẤT KỲ AI</strong> cũng có thể truy cập và cướp quyền điều khiển.",
-    "Please use this option carefully!": "Vui lòng <strong>cẩn thận</strong>.",
-    Logout: "Đăng xuất",
-    Leave: "Rời",
-    "I understand, please disable": "Tôi hiểu, làm ơn hãy tắt!",
-    Confirm: "Xác nhận",
-    Yes: "Có",
-    No: "Không",
-    Username: "Tài khoản",
-    Password: "Mật khẩu",
-    "Remember me": "Lưu phiên đăng nhập",
-    Login: "Đăng nhập",
-    "No Monitors, please": "Không có kênh theo dõi nào",
-    "add one": "Thêm mới",
-    "Notification Type": "Kiểu thông báo",
-    Email: "Email",
-    Test: "Thử",
-    "Certificate Info": "Thông tin Certificate",
-    "Resolver Server": "Máy chủ Resolver",
-    "Resource Record Type": "Loại bản ghi",
-    "Last Result": "Kết quả cuối cùng",
-    "Create your admin account": "Tạo tài khoản quản trị",
-    "Repeat Password": "Lặp lại mật khẩu",
-    "Import Backup": "Khôi phục bản sao lưu",
-    "Export Backup": "Xuất bản sao lưu",
-    Export: "Xuất",
-    Import: "Nhập",
-    respTime: "Thời gian phản hồi (ms)",
-    notAvailableShort: "N/A",
-    "Default enabled": "Mặc định bật",
-    "Apply on all existing monitors": "Áp dụng cho tất cả kênh theo dõi đang có",
-    Create: "Tạo",
-    "Clear Data": "Xoá dữ liệu",
-    Events: "Sự kiện",
-    Heartbeats: "Heartbeats",
-    "Auto Get": "Tự động lấy",
-    backupDescription: "Sao lưu tất cả các kênh theo dõi và tất cả các thông báo vào một file định dạng JSON.",
-    backupDescription2: "Lưu ý: Không bao gồm dữ liệu lịch sử các sự kiện.",
-    backupDescription3: "Hãy lưu giữ file này cẩn thận, trong file đó chứa cả các token thông báo.",
-    alertNoFile: "Hãy chọn file để khôi phục.",
-    alertWrongFileType: "Hãy chọn file định dạng JSON.",
-    "Clear all statistics": "Xoá tất cả thống kê",
-    "Skip existing": "Giữ lại",
-    Overwrite: "Ghi đè",
-    Options: "Tuỳ chọn",
-    "Keep both": "Giữ lại cả hai",
-    "Verify Token": "Xác minh Token",
-    "Setup 2FA": "Cài đặt xác thực 2 lớp (2FA)",
-    "Enable 2FA": "Bật xác thực 2 lớp (2FA)",
-    "Disable 2FA": "Tắt xác thực 2 lớp (2FA)",
-    "2FA Settings": "Cài đặt xác thực 2 lớp (2FA)",
-    "Two Factor Authentication": "Xác thực hai yếu tố",
-    Active: "Hoạt động",
-    Inactive: "Ngừng hoạt động",
-    Token: "Token",
-    "Show URI": "Hiển thị URI",
-    Tags: "Tags",
-    "Add New below or Select...": "Thêm mới ở dưới hoặc Chọn...",
-    "Tag with this name already exist.": "Tag với tên đã tồn tại.",
-    "Tag with this value already exist.": "Tag với value đã tồn tại.",
-    color: "Màu sắc",
-    "value (optional)": "Value (tuỳ chọn)",
-    Gray: "Xám",
-    Red: "Đỏ",
-    Orange: "Cam",
-    Green: "Xanh lá",
-    Blue: "Xanh da trời",
-    Indigo: "Chàm",
-    Purple: "Tím",
-    Pink: "Hồng",
-    "Search...": "Tìm kiếm...",
-    "Avg. Ping": "Ping trung bình",
-    "Avg. Response": "Phản hồi trung bình",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Chưa có thông tin gì, hãy thêm nhóm kênh theo dõi hoặc kênh theo dõi.",
-    "No Services": "Không có dịch vụ",
-    "All Systems Operational": "Tất cả các hệ thống hoạt động bình thường",
-    "Partially Degraded Service": "Có hệ thống bị ngưng",
-    "Degraded Service": "Toàn bộ hệ thống bị ngưng",
-    "Add Group": "Thêm nhóm",
-    "Add a monitor": "Thêm kênh theo dõi",
-    "Edit Status Page": "Sửa trang trạng thái",
-    "Go to Dashboard": "Đi tới Dashboard",
-    "Status Page": "Trang trạng thái",
-    "Status Pages": "Trang trạng thái",
-    defaultNotificationName: "My {notification} Alerts ({number})",
-    here: "tại đây",
-    Required: "Bắt buộc",
-    telegram: "Telegram",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "Bạn có thể lấy mã token từ",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "Hỗ trợ chat trực tiếp / Nhóm / Kênh Chat ID",
-    wayToGetTelegramChatID: "Bạn có thể lấy chat id của mình bằng cách gửi tin nhắn tới bot và truy cập url này để xem chat_id:",
-    "YOUR BOT TOKEN HERE": "MÃ BOT TOKEN CỦA BẠN",
-    chatIDNotFound: "Không tìm thấy Chat ID, vui lòng gửi tin nhắn cho bot này trước",
-    webhook: "Webhook",
-    "Post URL": "URL webhook",
-    "Content Type": "Loại nội dung",
-    webhookJsonDesc: "{0} tương thích với máy chủ HTTP ví dụ như Express.js",
-    webhookFormDataDesc: "{multipart} tương thích với máy chủ PHP, bạn chỉ cần phân tích cú pháp json bằng {decodeFunction}",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "None/STARTTLS(25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "Bỏ qua lỗi TLS",
-    "From Email": "Email gửi",
-    emailCustomSubject: "Tuỳ chỉnh tiêu đề",
-    "To Email": "Email nhận",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "Để lấy Discord, hãy vào: Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "Tên hiển thị của BOT",
-    "Prefix Custom Message": "Tiền tố tin nhắn tuỳ chọn",
-    "Hello @everyone is...": "Xin chào {'@'} mọi người đang...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "Bạn có thể học cách tạo webhook url {0}.",
-    signal: "Tín hiệu",
-    Number: "Số",
-    Recipients: "Người nhận",
-    needSignalAPI: "Bạn cần một tín hiệu kết nối với REST API.",
-    wayToCheckSignalURL: "Bạn có thể kiểm tra URL này để xem cách thiết lập:",
-    signalImportant: "QUAN TRỌNG: Bạn không thể kết hợp các nhóm và số trong người nhận!",
-    gotify: "Gotify",
-    "Application Token": "Mã Token ứng dụng",
-    "Server URL": "URL máy chủ",
-    Priority: "Mức ưu tiên",
-    slack: "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Tên Channel",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "Thông tin thêm về webhook trên: {0}",
-    aboutChannelName: "Nhập tên kênh trên {0} trường Channel Name nếu bạn muốn bỏ qua kênh webhook. vd: #other-channel",
-    aboutKumaURL: "Nếu bạn để trống trường Uptime Kuma URL, mặc định sẽ là trang Project Github.",
-    emojiCheatSheet: "Bảng tra cứu Emoji: {0}",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (Hỗ trợ trên 50 dịch vụ thông báo)",
-    GoogleChat: "Google Chat (Google Workspace only)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "User Key",
-    Device: "Thiết bị",
-    "Message Title": "Tiêu đề tin nhắn",
-    "Notification Sound": "Âm thanh thông báo",
-    "More info on:": "Thông tin chi tiết tại: {0}",
-    pushoverDesc1: "Mức ưu tiên khẩn cấp (2) có thời gian chờ mặc định là 30 giây giữa các lần thử lại và sẽ hết hạn sau 1 giờ.",
-    pushoverDesc2: "Nếu bạn muốn gửi thông báo đến các thiết bị khác nhau, hãy điền vào trường Thiết bị.",
-    "SMS Type": "SMS Type",
-    octopushTypePremium: "Premium (Nhanh - Khuyến nghị nên dùng cho cảnh báo)",
-    octopushTypeLowCost: "Giá rẻ (Chậm, thỉnh thoảng bị chặn)",
-    checkPrice: "Kiểm tra giá {0}:",
-    apiCredentials: "API credentials",
-    octopushLegacyHint: "Bạn muốn sử dụng phiên bản cũ của Octopush (2011-2020) hay phiên bản mới?",
-    "Check octopush prices": "Kiểm tra giá octopush {0}.",
-    octopushPhoneNumber: "Số điện thoại (Định dạng intl, vd : +84692341165​) ",
-    octopushSMSSender: "SMS người gửi : 3-11 ký tự chữ, số và dấu cách (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea ID thiết bị",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Ví dụ: {0}",
-    "Read more:": "Đọc thêm: {0}",
-    "Status:": "Trạng thái: {0}",
-    "Read more": "Đọc thêm",
-    appriseInstalled: "Đã cài đặt Apprise.",
-    appriseNotInstalled: "Chưa cài đặt Apprise. {0}",
-    "Access Token": "Token truy cập",
-    "Channel access token": "Token kênh truy cập",
-    "Line Developers Console": "Line Developers Console",
-    lineDevConsoleTo: "Line Developers Console - {0}",
-    "Basic Settings": "Cài đặt cơ bản",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "Trước tiên, hãy truy cập {0},tạo nhà cung cấp và kênh (Messaging API), sau đó bạn có thể nhận mã token truy cập kênh và id người dùng từ các mục menu được đề cập ở trên.",
-    "Icon URL": "Icon URL",
-    aboutIconURL: "Bạn có thể cung cấp liên kết đến ảnh trong \"Icon URL\" để ghi đè ảnh hồ sơ mặc định. Sẽ không được sử dụng nếu Biểu tượng cảm xúc được thiết lập.",
-    aboutMattermostChannelName: "Bạn có thể ghi đè kênh mặc định mà webhook đăng lên bằng cách nhập tên kênh vào trường \"Channel Name\". Điều này cần được bật trong cài đặt Mattermost webhook. Ví dụ: #other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - rẻ nhưng chậm và thường xuyên quá tải. Chỉ dành cho người Ba Lan.",
-    promosmsTypeFlash: "SMS FLASH - Tin nhắn sẽ tự động hiển thị trên thiết bị của người nhận. Chỉ dành cho người Ba Lan.",
-    promosmsTypeFull: "SMS FULL - SMS cao cấp, Bạn có thể sử dụng Tên Người gửi (Bạn cần đăng ký tên trước). Đáng tin cậy cho các cảnh báo.",
-    promosmsTypeSpeed: "SMS SPEED - Ưu tiên cao nhất trong hệ thống. Rất nhanh chóng và đáng tin cậy nhưng tốn kém, (giá gấp đôi SMS FULL).",
-    promosmsPhoneNumber: "Số điện thoại (Bỏ qua mã vùng với người Ba Lan)",
-    promosmsSMSSender: "SMS Tên người gửi: Tên đã đăng ký trước hoặc tên mặc định: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookUrl",
-    matrixHomeserverURL: "Homeserver URL (với http(s):// và port tuỳ chỉnh)",
-    "Internal Room Id": "Room ID Nội bộ",
-    matrixDesc1: "Bạn có thể tìm thấy room ID nội bộ bằng cách tìm trong mục advanced của phần room settings trong Matrix client của bạn. Nó có dạng giống như !QMdRCpUIfLwsfjxye6:home.server.",
-    matrixDesc2: "Bạn nên tạo người dùng mới và đừng sử dụng mã token truy cập của Matrix user vì nó sẽ cho phép truy cập toàn quyền vào tài khoản của bạn và tất cả các phòng bạn đã tham gia. Thay vào đó, hãy tạo một người dùng mới và chỉ mời người đó vào phòng mà bạn muốn nhận thông báo. Bạn có thể lấy được mã token truy cập bằng cách chạy {0}",
-    Method: "Method",
-    Body: "Body",
-    Headers: "Headers",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "Header request không hợp lệ JSON: ",
-    BodyInvalidFormat: "Tequest body không hợp lệ JSON: ",
-    "Monitor History": "Lịch sử kênh theo dõi",
-    clearDataOlderThan: "Giữ dữ liệu lịch sử kênh theo dõi {0} ngày.",
-    PasswordsDoNotMatch: "Passwords không khớp.",
-    records: "records",
-    "One record": "One record",
-    steamApiKeyDescription: "Để theo dõi các Steam Game Server bạn cần một Steam Web-API key. Bạn có thể đăng ký API key tại đây: ",
-    "Current User": "User hiện tại",
-    topic: "Topic",
-    topicExplanation: "MQTT topic to monitor",
-    successMessage: "Success Message",
-    successMessageExplanation: "MQTT message that will be considered as success",
-    recent: "Gần đây",
-    Done: "Hoàn thành",
-    Info: "Thông tin",
-    Security: "Bảo mật",
-    "Steam API Key": "Steam API Key",
-    "Shrink Database": "Shrink Database",
-    "Pick a RR-Type...": "Pick a RR-Type...",
-    "Pick Accepted Status Codes...": "Chọn các Codes trạng thái chấp nhận được...",
-    Default: "Mặc định",
-    "HTTP Options": "Tuỳ chọn HTTP",
-    "Create Incident": "Tạo Incident",
-    Title: "Tiêu đề",
-    Content: "Nội dung",
-    Style: "Style",
-    info: "thông tin",
-    warning: "cảnh báo",
-    danger: "nguy hiểm",
-    primary: "cơ sở",
-    light: "sáng",
-    dark: "tối",
-    Post: "Post",
-    "Please input title and content": "Hãy nhập tiêu đề và nội dung",
-    Created: "Đã tạo",
-    "Last Updated": "Cập nhật mới nhất",
-    Unpin: "Bỏ ghim",
-    "Switch to Light Theme": "Chuyển sang giao diện Sáng",
-    "Switch to Dark Theme": "Chuyển sang giao diện Tối",
-    "Show Tags": "Hiện Tags",
-    "Hide Tags": "Ẩn Tags",
-    Description: "Mô tả",
-    "No monitors available.": "Không có kênh theo dõi nào.",
-    "Add one": "Thêm mới",
-    "No Monitors": "Không có kênh theo dõi",
-    "Untitled Group": "Nhóm không có tiêu đề",
-    Services: "Dịch vụ",
-    Discard: "Bỏ",
-    Cancel: "Hủy",
-    "Powered by": "Được cung cấp bởi",
-    shrinkDatabaseDescription: "Khởi chạy database VACCUM cho SQLite. Nếu database được tạo sau version 1.10.0, AUTO_VACCUM đã được bật sẵn, hành động này không cần thiết.",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API Username (incl. webapi_ prefix)",
-    serwersmsAPIPassword: "API Password",
-    serwersmsPhoneNumber: "Số điện thoại",
-    serwersmsSenderName: "Tên người gửi SMS (Đã đăng ký qua portal)",
-    "stackfield": "Stackfield",
-    Customize: "Customize",
-    "Custom Footer": "Custom Footer",
-    "Custom CSS": "Custom CSS",
-    smtpDkimSettings: "Cài đặt xác thực Email(DKIM)",
-    smtpDkimDesc: "Xem hướng dẫn tại {0}.",
-    documentation: "Nodemailer DKIM",
-    smtpDkimDomain: "Mail domain",
-    smtpDkimKeySelector: "DKIM Key Selector",
-    smtpDkimPrivateKey: "Private Key",
-    smtpDkimHashAlgo: "Hash Algorithm (Tuỳ chọn)",
-    smtpDkimheaderFieldNames: "Header Keys to sign (Tuỳ chọn)",
-    smtpDkimskipFields: "Header Keys not to sign (Tuỳ chọn)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "Environment",
-    alertaApiKey: "API Key",
-    alertaAlertState: "Alert State",
-    alertaRecoverState: "Recover State",
-    deleteStatusPageMsg: "Bạn có chắc chắn muốn xoá trang status này?",
-    Proxies: "Proxies",
-    default: "Mặc định",
-    enabled: "Enabled",
-    setAsDefault: "Set As Default",
-    deleteProxyMsg: "Bạn muốn xoá proxy này cho tất cả monitors?",
-    proxyDescription: "Proxies must be assigned to a monitor to function.",
-    enableProxyDescription: "Proxy này chưa ảnh hưởng tới monitor requests cho tới khi được activated. Bạn có thể tạm thời tắt proxy cho tất cả monitors bằng trạng thái activation.",
-    setAsDefaultProxyDescription: "Proxy này sẽ bật mặc định cho tất cả monitors mới. Bạn có thể tắt riêng lẻ proxy trên mỗi monitor.",
-    "Certificate Chain": "Certificate Chain",
-    Valid: "Hợp lệ",
-    Invalid: "Không hợp lệ",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
-    "Bark Endpoint": "Bark Endpoint",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "Để an toàn, hãy dùng secret key",
-    "Device Token": "Device Token",
-    Platform: "Platform",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "Huawei",
-    High: "High",
-    Retry: "Retry",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Setup Proxy",
-    "Proxy Protocol": "Proxy Protocol",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Proxy server has authentication",
-    User: "User",
-    Installed: "Installed",
-    "Not installed": "Not installed",
-    Running: "Running",
-    "Not running": "Not running",
-    "Remove Token": "Remove Token",
-    Start: "Start",
-    Stop: "Stop",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "Thêm mới Status Page",
-    Slug: "Slug",
-    "Accept characters:": "Accept characters:",
-    startOrEndWithOnly: "Start or end with {0} only",
-    "No consecutive dashes": "No consecutive dashes",
-    Next: "Next",
-    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
-    "No Proxy": "No Proxy",
-    "HTTP Basic Auth": "HTTP Basic Auth",
-    "New Status Page": "New Status Page",
-    "Page Not Found": "Page Not Found",
-    "Reverse Proxy": "Reverse Proxy",
-    Backup: "Backup",
-    About: "About",
-    wayToGetCloudflaredURL: "(Download cloudflared from {0})",
-    cloudflareWebsite: "Cloudflare Website",
-    "Message:": "Message:",
-    "Don't know how to get the token? Please read the guide:": "Chưa biết cách lấy token? Xem hướng dẫn tại:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Nếu bạn đang dùng Cloudflare Tunnel, kết nối hiện tại có thể đang bị mất. Bạn có muốn dừng lại? Nhập lại password để xác nhận.",
-    "Other Software": "Phần mềm khác",
-    "For example: nginx, Apache and Traefik.": "Ví dụ: Nginx, Apache hay Traefik.",
-    "Please read": "Hãy xem qua",
-    "Subject:": "Subject:",
-    "Valid To:": "Valid To:",
-    "Days Remaining:": "Số ngày còn lại:",
-    "Issuer:": "Issuer:",
-    "Fingerprint:": "Fingerprint:",
-    "No status pages": "No status pages",
-    "Domain Name Expiry Notification": "Cảnh báo hạn hạn Domain Name",
-    Proxy: "Proxy",
-    "Date Created": "Ngày khởi tạo",
-    onebotHttpAddress: "OneBot HTTP Address",
-    onebotMessageType: "OneBot Message Type",
-    onebotGroupMessage: "Group",
-    onebotPrivateMessage: "Private",
-    onebotUserOrGroupId: "Group/User ID",
-    onebotSafetyTips: "Để đảm bảo an toàn, hãy thiết lập access token",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Footer Text",
-    "Show Powered By": "Show Powered By",
-    "Domain Names": "Domain Names",
-    signedInDisp: "Signed in as {0}",
-    signedInDispDisabled: "Auth Disabled.",
-};
diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
deleted file mode 100644
index ba2a78ac..00000000
--- a/src/languages/zh-CN.js
+++ /dev/null
@@ -1,683 +0,0 @@
-export default {
-    languageName: "简体中文",
-    checkEverySecond: "检测频率 {0} 秒",
-    retryCheckEverySecond: "重试间隔 {0} 秒",
-    resendEveryXTimes: "每 {0} 次失败则重复发送一次",
-    resendDisabled: "为 0 时禁用重复发送",
-    retriesDescription: "服务被标记为故障并发送通知之前的最大重试次数",
-    ignoreTLSError: "忽略 HTTPS 站点的 TLS/SSL 错误",
-    upsideDownModeDescription: "反转状态监控,如果服务可访问,则认为是故障。",
-    maxRedirectDescription: "允许的最大重定向次数。设置为 0 禁用重定向。",
-    enableGRPCTls: "允许通过 TLS 连接发送 gRPC 请求",
-    grpcMethodDescription: "方法名会转换为小驼峰格式,例如 sayHello、check 等等",
-    acceptedStatusCodesDescription: "选择被视为成功响应的状态码。",
-    Maintenance: "维护",
-    statusMaintenance: "维护",
-    "Schedule maintenance": "计划维护",
-    "Affected Monitors": "受影响的监控项",
-    "Pick Affected Monitors...": "选择受影响的监控项…",
-    "Start of maintenance": "维护开始",
-    "All Status Pages": "所有状态页面",
-    "Select status pages...": "选择状态页面…",
-    recurringIntervalMessage: "每天一次 | 每 {0} 天一次",
-    affectedMonitorsDescription: "选择受当前维护影响的监控项",
-    affectedStatusPages: "在所选状态页面上显示此维护消息",
-    atLeastOneMonitor: "至少选择一个受影响的监控项",
-    passwordNotMatchMsg: "两次输入的密码不一致。",
-    notificationDescription: "通知必须被分配给监控项才能正常工作。",
-    keywordDescription: "在纯 HTML 或 JSON 响应中搜索关键字,区分大小写。",
-    pauseDashboardHome: "暂停",
-    deleteMonitorMsg: "确定要删除此监控项吗?",
-    deleteMaintenanceMsg: "确定要删除此维护吗?",
-    deleteNotificationMsg: "确定要为所有监控项删除此通知吗?",
-    dnsPortDescription: "DNS 服务器端口,默认为 53,您可以在任何时候更改此端口.",
-    resolverserverDescription: "默认服务器是 Cloudflare。您随时可以修改解析服务器。",
-    rrtypeDescription: "选择要监控的资源记录类型",
-    pauseMonitorMsg: "确定要暂停吗?",
-    enableDefaultNotificationDescription: "新的监控项将默认启用此通知,您仍然为每个监控项单独禁用。",
-    clearEventsMsg: "确定要删除此监控项的所有事件吗?",
-    clearHeartbeatsMsg: "确定要删除此监控项的所有心跳状态吗?",
-    confirmClearStatisticsMsg: "确定要删除所有统计信息吗?",
-    importHandleDescription: "如果想跳过同名的监控项或消息通知,请选择“跳过已存在”。“覆盖”将删除所有现有的监控项和通知。",
-    confirmImportMsg: "确定要导入备份吗?请确保已经选择了正确的导入选项。",
-    twoFAVerifyLabel: "请输入令牌码以确认二次验证:",
-    tokenValidSettingsMsg: "令牌码有效!您现在可以保存二次验证设置了。",
-    confirmEnableTwoFAMsg: "确定要启用二次验证吗?",
-    confirmDisableTwoFAMsg: "确定要禁用二次验证吗?",
-    Settings: "设置",
-    Dashboard: "仪表盘",
-    "New Update": "有新版本",
-    Language: "语言",
-    Appearance: "外观",
-    Theme: "主题",
-    General: "常规",
-    "Primary Base URL": "站点主 URL",
-    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.": "证书有效期",
-    day: "天",
-    "-day": " 天",
-    hour: "小时",
-    "-hour": " 小时",
-    Response: "响应",
-    Ping: "Ping",
-    "Monitor Type": "监控类型",
-    Keyword: "关键字",
-    "Friendly Name": "显示名称",
-    URL: "URL",
-    Hostname: "主机名",
-    Port: "端口号",
-    "Heartbeat Interval": "心跳间隔",
-    Retries: "重试次数",
-    "Heartbeat Retry Interval": "心跳重试间隔",
-    "Resend Notification if Down X times consequently": "连续失败时重复发送通知的间隔次数",
-    Advanced: "高级",
-    "Upside Down Mode": "反转监控",
-    "Max. Redirects": "最大重定向次数",
-    "Accepted Status Codes": "有效状态码",
-    "Push URL": "推送 URL",
-    needPushEvery: "您需要每 {0} 秒调用一次该 URL",
-    pushOptionalParams: "可选参数:{0}",
-    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": "启用身份验证",
-    "disableauth.message1": "是否确定 <strong>取消登录验证</strong>?",
-    "disableauth.message2": "这是为 <strong>有第三方认证</strong> 的用户提供的功能,如 Cloudflare Access",
-    "Please use this option carefully!": "请谨慎使用!",
-    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": "重复密码",
-    "Import Backup": "导入备份",
-    "Export Backup": "导出备份",
-    Export: "导出",
-    Import: "导入",
-    respTime: "响应时间(毫秒)",
-    notAvailableShort: "N/A",
-    "Default enabled": "默认开启",
-    "Apply on all existing monitors": "应用到所有现有监控项",
-    Create: "创建",
-    "Clear Data": "清除数据",
-    Events: "事件",
-    Heartbeats: "心跳",
-    "Auto Get": "自动获取",
-    backupDescription: "您可以将所有监控项和通知备份到 JSON 文件。",
-    backupDescription2: "注意: 不包括历史状态和事件数据。",
-    backupDescription3: "导出的文件可能包含敏感信息,例如通知的令牌信息,请小心存放!",
-    alertNoFile: "请选择要导入的文件",
-    alertWrongFileType: "请选择一个 JSON 文件",
-    "Clear all statistics": "清除所有统计数据",
-    "Skip existing": "跳过已存在",
-    Overwrite: "覆盖",
-    Options: "选项",
-    "Keep both": "全部保留",
-    "Verify Token": "验证令牌",
-    "Setup 2FA": "设置二次验证",
-    "Enable 2FA": "启用二次验证",
-    "Disable 2FA": "禁用二次验证",
-    "2FA Settings": "二次验证设置",
-    "Two Factor Authentication": "二次验证",
-    Active: "激活",
-    Inactive: "停用",
-    Token: "令牌",
-    "Show URI": "显示 URI",
-    Tags: "标签",
-    "Add New below or Select...": "在下面添加或选择…",
-    "Tag with this name already exist.": "相同名称的标签已存在。",
-    "Tag with this value already exist.": "相同内容的标签已存在。",
-    color: "颜色",
-    "value (optional)": "值(可选)",
-    Gray: "灰色",
-    Red: "红色",
-    Orange: "橙色",
-    Green: "绿色",
-    Blue: "蓝色",
-    Indigo: "靛蓝",
-    Purple: "紫色",
-    Pink: "粉色",
-    "Search...": "搜索…",
-    "Avg. Ping": "平均 Ping",
-    "Avg. Response": "平均响应",
-    "Entry Page": "入口页面",
-    statusPageNothing: "这里什么也没有,请添加一个分组或一个监控项。",
-    "No Services": "无服务",
-    "All Systems Operational": "所有服务运行正常",
-    "Partially Degraded Service": "部分服务出现故障",
-    "Degraded Service": "全部服务出现故障",
-    "Add Group": "添加分组",
-    "Add a monitor": "添加监控项",
-    "Edit Status Page": "编辑状态页面",
-    "Go to Dashboard": "前往仪表盘",
-    "Status Page": "状态页面",
-    "Status Pages": "状态页面",
-    defaultNotificationName: "{notification} 通知({number})",
-    here: "这里",
-    Required: "必填",
-    telegram: "Telegram",
-    "ZohoCliq": "ZohoCliq",
-    "Bot Token": "Bot Token",
-    wayToGetTelegramToken: "您可以从 {0} 获取 Token。",
-    "Chat ID": "Chat ID",
-    supportTelegramChatID: "支持对话/群组/频道的 Chat ID",
-    wayToGetTelegramChatID: "您可以发送一条消息给您的机器人,然后访问此链接来查看 chat_id:",
-    "YOUR BOT TOKEN HERE": "这里替换成您的 BOT TOKEN",
-    chatIDNotFound: "未找到 Chat ID,请先给您的机器人发送一条消息。",
-    webhook: "Webhook",
-    "Post URL": "Post URL",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} 适合现代的 HTTP 服务器,例如 Express.js",
-    webhookFormDataDesc: "{multipart} 适合 PHP,其中 JSON 需要使用 {decodeFunction} 解码",
-    webhookAdditionalHeadersTitle: "额外 Header",
-    webhookAdditionalHeadersDesc: "设置通过此 Webhook 发送的额外 Header。",
-    smtp: "电子邮件(SMTP)",
-    secureOptionNone: "无 / STARTTLS(常用端口 25、587)",
-    secureOptionTLS: "TLS(常用端口 465)",
-    "Ignore TLS Error": "忽略 TLS 错误",
-    "From Email": "发信人",
-    emailCustomSubject: "邮件主题",
-    "To Email": "收信人",
-    smtpCC: "抄送",
-    smtpBCC: "密送",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    wayToGetDiscordURL: "要获取,可以前往服务器设置 -> 整合 -> 创建 Webhook",
-    "Bot Display Name": "机器人显示名称",
-    "Prefix Custom Message": "自定义消息前缀",
-    "Hello @everyone is...": "{'@'}everyone,……",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    wayToGetTeamsURL: "您可以在{0}了解如何获取 Webhook URL。",
-    wayToGetZohoCliqURL: "您可以在{0}了解如何创建 Webhook URL。",
-    signal: "Signal",
-    Number: "号码",
-    Recipients: "收件人",
-    needSignalAPI: "您需要有一个支持 REST API 的 Signal 客户端。",
-    wayToCheckSignalURL: "您可以通过下面的 URL 了解如何设置:",
-    signalImportant: "重要:您不能混合设定收件人的分组和号码!",
-    gotify: "Gotify",
-    "Application Token": "Application Token",
-    "Server URL": "服务器 URL",
-    Priority: "优先级",
-    slack: "Slack",
-    "Icon Emoji": "Emoji 图标",
-    "Channel Name": "频道名称",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    aboutWebhooks: "关于 Webhook 的更多信息:{0}",
-    aboutChannelName: "如果您想绕过 Webhook 频道,请在 {0} 字段输入所需的频道名称。例如:#other-channel",
-    aboutKumaURL: "如果保留 Uptime Kuma URL 为空,将会默认指向项目的 GitHub 页面。",
-    emojiCheatSheet: "Emoji 速查:{0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (支持 50+ 种通知服务)",
-    GoogleChat: "Google Chat(仅 Google Workspace)",
-    pushbullet: "Pushbullet",
-    AliyunSMS: "阿里云短信服务",
-    Kook: "Kook",
-    wayToGetKookBotToken: "在 {0} 创建应用并获取机器人 Token",
-    wayToGetKookGuildID: "在 Kook 设置中打开“开发者模式”,然后右键点击频道可获取其 ID",
-    "Guild ID": "频道 ID",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "User Key",
-    Device: "设备",
-    "Message Title": "消息标题",
-    "Notification Sound": "通知铃声",
-    "More info on:": "更多信息:{0}",
-    pushoverDesc1: "紧急优先级(2)会在一小时内每隔 30 秒重试一次。",
-    pushoverDesc2: "如果您想发送通知给不同的设备,请填写“设备”字段。",
-    "SMS Type": "短信类型",
-    octopushTypePremium: "Premium(快 - 推荐用于警报)",
-    octopushTypeLowCost: "Low Cost(慢 - 有时会被运营商屏蔽)",
-    checkPrice: "查看 {0} 的价格:",
-    apiCredentials: "API Credentials",
-    octopushLegacyHint: "您是否在使用旧版本的 Octopush(2011-2020)?",
-    "Check octopush prices": "查看 Octopush 的价格 {0}。",
-    octopushPhoneNumber: "电话号码(国际格式,例如:+33612345678)",
-    octopushSMSSender: "短信发送名称:3-11 位大小写字母、数字和空格(a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea 设备 ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "例如:{0}",
-    "Read more:": "了解更多:{0}",
-    "Status:": "状态:{0}",
-    "Read more": "了解更多",
-    appriseInstalled: "Apprise 已安装",
-    appriseNotInstalled: "Apprise 未安装。{0}",
-    "Access Token": "Access Token",
-    "Channel access token": "频道 Access Token",
-    "Line Developers Console": "Line 开发者控制台",
-    lineDevConsoleTo: "Line 开发者控制台 - {0}",
-    "Basic Settings": "基本设置",
-    "User ID": "用户 ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "首先访问 {0},创建一个提供者和频道(Messaging API),然后您就可以从上面提到的菜单获取频道的 Access Token 和用户 ID。",
-    "Icon URL": "图标 URL",
-    aboutIconURL: "您可以在“图标 URL”中提供一个图片链接来覆盖默认的资料图片。如果设置了 Emoji 图标则此字段会被忽略。",
-    aboutMattermostChannelName: "您可以覆盖 Webhook 发送消息的默认频道,只需在“频道名称”字段中输入您想要的频道名。这需要在 Mattermost 的 Webhook 设置中启用。例如:#other-channel",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - 便宜但是慢,并且容易超负荷。仅限波兰地区的收信人。",
-    promosmsTypeFlash: "SMS FLASH - 消息会自动显示在收信人设备上。仅限波兰地区的收信人。",
-    promosmsTypeFull: "SMS FULL - 高级短信,您可以使用您自己的发信人名称(需要先注册)。对于警报来说更可靠。",
-    promosmsTypeSpeed: "SMS SPEED - 最高优先级。非常快速可靠,但更贵(大约两倍 SMS FULL 的价格)。",
-    promosmsPhoneNumber: "电话号码(波兰地区收信人可以不填区号)",
-    promosmsSMSSender: "短信发信人名称:已注册的名称或以下默认值之一:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
-    Feishu: "飞书",
-    "Feishu WebHookUrl": "飞书 WebHook URL",
-    matrixHomeserverURL: "服务器 URL(包含 http(s):// 和可选的端口号)",
-    "Internal Room Id": "内部房间 ID",
-    matrixDesc1: "您可以在 Matrix 客户端房间设置的高级选项内找到内部房间 ID。格式类似于 !QMdRCpUIfLwsfjxye6:home.server。",
-    matrixDesc2: "请不要使用您自己的 Access Token,这将开放您所有的账户权限和您已加入房间的权限。我们强烈建议您创建一个新用户并邀请它至您接收通知的房间中。您可以运行以下命令来获取 Access Token:{0}",
-    Method: "方法",
-    Body: "请求体",
-    Headers: "请求头",
-    PushUrl: "推送 URL",
-    HeadersInvalidFormat: "请求头不是有效的 JSON: ",
-    BodyInvalidFormat: "请求体不是有效的 JSON: ",
-    "Monitor History": "监控历史",
-    clearDataOlderThan: "保留监控历史数据 {0} 天。",
-    PasswordsDoNotMatch: "密码不匹配",
-    records: "记录",
-    "One record": "一条记录",
-    steamApiKeyDescription: "要监控 Steam 游戏服务器,您需要 Steam Web-API 密钥。您可以在这里注册您的 API 密钥: ",
-    "Current User": "当前用户",
-    topic: "Topic",
-    topicExplanation: "要监控的 MQTT Topic",
-    successMessage: "成功消息",
-    successMessageExplanation: "视为成功的 MQTT 消息",
-    recent: "最近",
-    Done: "完成",
-    Info: "信息",
-    Security: "安全性",
-    "Steam API Key": "Steam API 密钥",
-    "Shrink Database": "压缩数据库",
-    "Pick a RR-Type...": "选择资源记录类型…",
-    "Pick Accepted Status Codes...": "选择有效的状态码…",
-    Default: "默认",
-    "HTTP Options": "HTTP 选项",
-    "Create Incident": "创建事件",
-    Title: "标题",
-    Content: "内容",
-    Style: "类型",
-    info: "信息",
-    warning: "警告",
-    danger: "危险",
-    error: "错误",
-    critical: "关键",
-    primary: "主要",
-    light: "明亮",
-    dark: "黑暗",
-    Post: "发布",
-    "Please input title and content": "请输入标题和内容",
-    Created: "创建时间",
-    "Last Updated": "更新时间",
-    Unpin: "取消钉选",
-    "Switch to Light Theme": "切换到浅色主题",
-    "Switch to Dark Theme": "切换到深色主题",
-    "Show Tags": "显示标签",
-    "Hide Tags": "隐藏标签",
-    Description: "描述",
-    "No monitors available.": "没有可用的监控项。",
-    "Add one": "添加一个",
-    "No Monitors": "没有监控项",
-    "Untitled Group": "无标题分组",
-    Services: "服务",
-    Discard: "放弃",
-    Cancel: "取消",
-    "Powered by": "Powered by",
-    shrinkDatabaseDescription: "触发 SQLite 数据库的 VACUUM 命令,如果您的数据库是在 1.10.0 版本之后创建的,则已启用 AUTO_VACUUM,不再需要此操作。",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API 用户名(包括 webapi_ 前缀)",
-    serwersmsAPIPassword: "API 密码",
-    serwersmsPhoneNumber: "电话号码",
-    serwersmsSenderName: "SMS 发信人名称(需要在客户中心注册)",
-    smseagle: "SMSEagle",
-    smseagleTo: "电话号码",
-    smseagleGroup: "通讯录群组名",
-    smseagleContact: "通讯录联系人",
-    smseagleRecipientType: "收信人类型",
-    smseagleRecipient: "收信人(多个需用半角逗号分隔)",
-    smseagleToken: "API Access token",
-    smseagleUrl: "您的 SMSEagle 设备 URL",
-    smseagleEncoding: "以 Unicode 发送",
-    smseaglePriority: "消息优先级(0-9,默认为 0)",
-    stackfield: "Stackfield",
-    Customize: "自定义",
-    "Custom Footer": "自定义底部",
-    "Custom CSS": "自定义 CSS",
-    smtpDkimSettings: "DKIM 设置",
-    smtpDkimDesc: "请访问 Nodemailer DKIM {0} 了解配置方法。",
-    documentation: "文档",
-    smtpDkimDomain: "域名",
-    smtpDkimKeySelector: "前缀选择器",
-    smtpDkimPrivateKey: "密钥",
-    smtpDkimHashAlgo: "哈希算法(可选)",
-    smtpDkimheaderFieldNames: "包含在哈希计算对象内的 Header 列表(可选)",
-    smtpDkimskipFields: "不包含在哈希计算对象内的 Header 列表(可选)",
-    wayToGetPagerDutyKey: "您可以在 Service -> Service Directory -> (选择一个 Service) -> Integrations -> Add integration 页面中搜索“Events API V2”以获取此 Integration Key,更多信息请看{0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "自动标记为已解决或已读",
-    "do nothing": "不做任何操作",
-    "auto acknowledged": "自动标记为已读",
-    "auto resolve": "自动标记为已解决",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API 接入点",
-    alertaEnvironment: "环境参数",
-    alertaApiKey: "API Key",
-    alertaAlertState: "报警时的严重性",
-    alertaRecoverState: "恢复后的严重性",
-    deleteStatusPageMsg: "您确认要删除此状态页吗?",
-    Proxies: "代理",
-    default: "默认",
-    enabled: "启用",
-    setAsDefault: "设为默认",
-    deleteProxyMsg: "您确认要在所有监控项中删除此代理吗?",
-    proxyDescription: "代理必须配置到至少一个监控项后才会工作。",
-    enableProxyDescription: "此代理必须启用才能对监控项的网络请求起作用。您可以通过修改激活状态,临时在所有监控项中禁用此代理。",
-    setAsDefaultProxyDescription: "此代理会对新创建的监控项默认激活,您仍可以在监控项配置中单独禁用此代理。",
-    "Certificate Chain": "证书链",
-    Valid: "有效",
-    Invalid: "无效",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey Secret",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "短信模板必须包含以下变量:",
-    "Bark Endpoint": "Bark 接入点",
-    "Bark Group": "Bark 群组",
-    "Bark Sound": "Bark 铃声",
-    DingDing: "钉钉自定义机器人",
-    WebHookUrl: "钉钉自定义机器人 Webhook 地址",
-    SecretKey: "钉钉自定义机器人加签密钥",
-    "For safety, must use secret key": "出于安全考虑,必须使用加签密钥",
-    "Device Token": "Apple Device Token",
-    Platform: "平台",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "华为",
-    High: "高",
-    Retry: "重试次数",
-    Topic: "Gorush Topic",
-    WeCom: "企业微信群机器人",
-    "WeCom Bot Key": "企业微信群机器人 Key",
-    "Setup Proxy": "设置代理",
-    "Proxy Protocol": "代理协议",
-    "Proxy Server": "代理服务器",
-    "Server Address": "服务器地址",
-    "Proxy server has authentication": "代理服务器启用了身份验证功能",
-    User: "用户名",
-    Installed: "已安装",
-    "Not installed": "未安装",
-    Running: "运行中",
-    "Not running": "未运行",
-    "Remove Token": "移除 Token",
-    Start: "启动",
-    Stop: "停止",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "添加新的状态页",
-    Slug: "路径",
-    "Accept characters:": "可接受的字符:",
-    startOrEndWithOnly: "开头和结尾必须为 {0}",
-    "No consecutive dashes": "不能有连续的破折号",
-    Next: "下一步",
-    "The slug is already taken. Please choose another slug.": "该路径已被使用。请选择其他路径。",
-    "No Proxy": "无代理",
-    Authentication: "验证",
-    "HTTP Basic Auth": "HTTP 基础身份验证",
-    "New Status Page": "新的状态页",
-    "Page Not Found": "未找到该页面",
-    "Reverse Proxy": "反向代理",
-    Backup: "备份",
-    About: "关于",
-    wayToGetCloudflaredURL: "(可从 {0} 下载 cloudflared)",
-    cloudflareWebsite: "Cloudflare 网站",
-    "Message:": "信息:",
-    "Don't know how to get the token? Please read the guide:": "不知道如何获取 Token?请阅读指南:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您正在通过 Cloudflare Tunnel 访问网站,则停止可能会导致当前连接断开。您确定要停止吗?请输入密码以确认。",
-    "HTTP Headers": "HTTP 头",
-    "Trust Proxy": "可信的代理类字段",
-    "Other Software": "其他软件",
-    "For example: nginx, Apache and Traefik.": "例如:nginx、Apache 和 Traefik。",
-    "Please read": "请阅读",
-    "Subject:": "颁发给:",
-    "Valid To:": "有效期至:",
-    "Days Remaining:": "剩余有效天数:",
-    "Issuer:": "颁发者:",
-    "Fingerprint:": "指纹:",
-    "No status pages": "无状态页",
-    "Domain Name Expiry Notification": "域名到期时通知",
-    Proxy: "代理",
-    "Date Created": "创建于",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP 地址",
-    onebotMessageType: "OneBot 消息类型",
-    onebotGroupMessage: "群聊",
-    onebotPrivateMessage: "私聊",
-    onebotUserOrGroupId: "群组/用户 ID",
-    onebotSafetyTips: "出于安全原因,请务必设置 AccessToken",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "底部自定义文本",
-    "Show Powered By": "显示 Powered By",
-    "Domain Names": "域名",
-    signedInDisp: "当前用户: {0}",
-    signedInDispDisabled: "已禁用身份验证",
-    RadiusSecret: "Radius 共享机密",
-    RadiusSecretDescription: "客户端和服务器之间共享的密钥",
-    RadiusCalledStationId: "NAS 网络访问服务器号码(Called Station Id)",
-    RadiusCalledStationIdDescription: "所访问的服务器的标识",
-    RadiusCallingStationId: "呼叫方号码(Calling Station Id)",
-    RadiusCallingStationIdDescription: "发出请求的设备的标识",
-    "Certificate Expiry Notification": "证书到期时通知",
-    "API Username": "API Username",
-    "API Key": "API Key",
-    "Recipient Number": "收件人手机号码",
-    "From Name/Number": "发件人名称/手机号码",
-    "Leave blank to use a shared sender number.": "留空以使用平台共享的发件人手机号码",
-    "Octopush API Version": "Octopush API 版本",
-    "Legacy Octopush-DM": "旧版本 Octopush-DM",
-    endpoint: "接入点",
-    octopushAPIKey: "控制台 HTTP API credentials 里的 \"API key\"",
-    octopushLogin: "控制台 HTTP API credentials 里的 \"Login\"",
-    promosmsLogin: "API 登录名",
-    promosmsPassword: "API 密码",
-    "pushoversounds pushover": "Pushover(默认)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm(长铃声)",
-    "pushoversounds climb": "Climb(长铃声)",
-    "pushoversounds persistent": "Persistent(长铃声)",
-    "pushoversounds echo": "Pushover Echo(长铃声)",
-    "pushoversounds updown": "Up Down(长铃声)",
-    "pushoversounds vibrate": "仅震动",
-    "pushoversounds none": "无(禁音)",
-    pushyAPIKey: "API 密钥",
-    pushyToken: "设备 Token",
-    "Show update if available": "有更新时通知",
-    "Also check beta release": "一并检查 Beta 版更新",
-    "Using a Reverse Proxy?": "正在使用反向代理?",
-    "Check how to config it for WebSocket": "查看如何将反向代理与 WebSocket 一起使用",
-    "Steam Game Server": "Steam 游戏服务器",
-    "Most likely causes:": "最可能的原因:",
-    "The resource is no longer available.": "您所请求的资源已不再可用;",
-    "There might be a typing error in the address.": "您输入的地址可能有误。",
-    "What you can try:": "您可以尝试以下操作:",
-    "Retype the address.": "重新输入地址;",
-    "Go back to the previous page.": "返回到上一页面。",
-    "Coming Soon": "即将推出",
-    wayToGetClickSendSMSToken: "您可以在{0}获取 API Username 和 API Key。",
-    "Connection String": "连接字符串",
-    Query: "查询语句",
-    settingsCertificateExpiry: "TLS 证书过期通知",
-    certificationExpiryDescription: "HTTPS 监控项发现被监控目标的 TLS 证书剩余有效期少于以下天数时将发出通知:",
-    "Setup Docker Host": "配置 Docker 宿主信息",
-    "Connection Type": "连接方式",
-    "Docker Daemon": "Docker 守护进程",
-    deleteDockerHostMsg: "您确定您要删除此 Docker 宿主设置吗?这会影响所有 Docker 监控项",
-    socket: "Socket",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker 容器",
-    "Container Name / ID": "容器名称 / ID",
-    "Docker Host": "Docker 宿主",
-    "Docker Hosts": "Docker 宿主",
-    "ntfy Topic": "ntfy Topic",
-    Domain: "域名",
-    Workstation: "工作站",
-    disableCloudflaredNoAuthMsg: "您现在正处于 No Auth 模式,无需输入密码",
-    trustProxyDescription: "信任 'X-Forwarded-*' 头。如果您的 Uptime Kuma 是通过 Nginx 或 Apache 等反代服务对外提供访问的话,则您应当启用本功能以获取正确的客户端 IP。",
-    wayToGetLineNotifyToken: "您可以在 {0} 获取 Access token",
-    Examples: "例如",
-    "Home Assistant URL": "Home Assistant 地址",
-    "Long-Lived Access Token": "长期访问令牌",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "长期访问令牌可通过点击左下角您的用户名,滚动到页面底部并点击 Create Token 按钮获取。",
-    "Notification Service": "Notification Service",
-    "default: notify all devices": "默认:通知所有设备",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "通知服务的列表可在 Home Assistant 中的 Developer Tools > Services 通过搜索您的设备或手机的名称来获得。",
-    "Automations can optionally be triggered in Home Assistant:": "可以在 Home Assistant 使用下列模板设置自动化操作的触发条件:",
-    "Trigger type:": "触发类型:",
-    "Event type:": "事件类型:",
-    "Event data:": "事件数据:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "然后您可以选择关联操作,例如切换到 RGB 灯发出红光的场景",
-    "Frontend Version": "前端版本",
-    "Frontend Version do not match backend version!": "前端版本与后端版本不匹配!",
-    "Base URL": "API 基础地址",
-    goAlertInfo: "GoAlert 是一个用于呼叫调度、自动汇报和通知(如 SMS 或语音呼叫)的开源应用程序。在正确的时间以正确的方式自动让正确的人参与!{0}",
-    goAlertIntegrationKeyInfo: "使用形如 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 的通用 API 集成密钥,通常是复制来的链接中的 token 参数值。",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "已弃用:由于大量新功能的加入,以及备份功能没有时时维护,现在备份功能已经无法生成完整的备份和恢复完整的设置。",
-    backupRecommend: "请改为直接备份 docker 卷或者数据文件夹(./data/)。",
-    Optional: "可选的",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API 文档在",
-    "Gateway Type": "网关类型",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "可用的分隔符:",
-    or: "或",
-    recurringInterval: "时间间隔",
-    Recurring: "重复",
-    strategyManual: "手动启用/禁用",
-    warningTimezone: "使用服务器时区",
-    weekdayShortMon: "周一",
-    weekdayShortTue: "周二",
-    weekdayShortWed: "周三",
-    weekdayShortThu: "周四",
-    weekdayShortFri: "周五",
-    weekdayShortSat: "周六",
-    weekdayShortSun: "周日",
-    dayOfWeek: "每周计划",
-    dayOfMonth: "每月计划",
-    lastDay: "结束日",
-    lastDay1: "每月最后一天",
-    lastDay2: "每月倒数第二天",
-    lastDay3: "每月倒数第三天",
-    lastDay4: "每月倒数第四天",
-    "No Maintenance": "无维护计划",
-    pauseMaintenanceMsg: "确定要暂停吗?",
-    "maintenanceStatus-under-maintenance": "正在维护",
-    "maintenanceStatus-inactive": "未启用",
-    "maintenanceStatus-scheduled": "已计划",
-    "maintenanceStatus-ended": "已结束",
-    "maintenanceStatus-unknown": "未知",
-    "Display Timezone": "显示时区",
-    "Server Timezone": "服务器时区",
-    statusPageMaintenanceEndDate: "结束时间",
-    IconUrl: "图标 URL",
-    "Enable DNS Cache": "启用 DNS 缓存",
-    Enable: "启用",
-    Disable: "禁用",
-    dnsCacheDescription: "可能无法在某些 IPv6 环境工作,如果遇到问题请禁用。",
-    "Single Maintenance Window": "单一时间窗口",
-    "Maintenance Time Window of a Day": "每日维护时间窗口",
-    "Effective Date Range": "生效日期范围",
-    "Schedule Maintenance": "计划维护",
-    "Date and Time": "日期时间",
-    "DateTime Range": "日期时间范围",
-    Strategy: "策略",
-    "Free Mobile User Identifier": "Free Mobile User Identifier",
-    "Free Mobile API Key": "Free Mobile API Key",
-    "Enable TLS": "启用 TLS",
-    "Proto Service Name": "Proto 服务名称",
-    "Proto Method": "Proto 方法",
-    "Proto Content": "Proto 内容",
-    Economy: "经济",
-    Lowcost: "低价",
-    high: "高价",
-    "General Monitor Type": "常规监控类型",
-    "Passive Monitor Type": "被动监控类型",
-    "Specific Monitor Type": "针对监控类型",
-};
diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js
deleted file mode 100644
index 6a57b459..00000000
--- a/src/languages/zh-HK.js
+++ /dev/null
@@ -1,388 +0,0 @@
-export default {
-    languageName: "繁體中文 (香港)",
-    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: "暫停",
-    pauseDashboardHome: "暫停",
-    Name: "名稱",
-    Status: "狀態",
-    DateTime: "日期時間",
-    Message: "內容",
-    "No important events": "沒有重要事件",
-    Resume: "恢復",
-    Edit: "編輯",
-    Delete: "刪除",
-    Current: "目前",
-    Uptime: "上線率",
-    "Cert Exp.": "証書期限",
-    day: "日",
-    "-day": "日",
-    hour: "小時",
-    "-hour": "小時",
-    checkEverySecond: "每 {0} 秒檢查一次",
-    Response: "反應時間",
-    Ping: "反應時間",
-    "Monitor Type": "監測器類型",
-    Keyword: "關鍵字",
-    "Friendly Name": "名稱",
-    URL: "網址 URL",
-    Hostname: "Hostname",
-    Port: "Port",
-    "Heartbeat Interval": "檢查間距",
-    Retries: "重試數次確定為離線",
-    retriesDescription: "重試多少次後才判定為離線及傳送通知。如數值為 0 會即判定為離線及傳送通知。",
-    Advanced: "進階",
-    ignoreTLSError: "忽略 TLS/SSL 錯誤",
-    "Upside Down Mode": "反轉模式",
-    upsideDownModeDescription: "反轉狀態,如網址是可正常瀏覽,會被判定為 '離線/DOWN'",
-    "Max. Redirects": "跟隨重新導向 (Redirect) 的次數",
-    maxRedirectDescription: "設為 0 即不跟蹤",
-    "Accepted Status Codes": "接受為上線的 HTTP 狀態碼",
-    acceptedStatusCodesDescription: "可多選",
-    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": "確認新密碼",
-    passwordNotMatchMsg: "密碼不一致",
-    "Update Password": "更新密碼",
-    "Disable Auth": "取消登入認証",
-    "Enable Auth": "開啟登入認証",
-    "disableauth.message1": "你是否確認<strong>取消登入認証</strong>?",
-    "disableauth.message2": "這個功能是設計給已有<strong>第三方認証</strong>的用家,例如 Cloudflare Access。",
-    "Please use this option carefully!": "請小心使用。",
-    Logout: "登出",
-    notificationDescription: "新增後,你需要在監測器裡啟用。",
-    Leave: "離開",
-    "I understand, please disable": "我明白,請取消登入認証",
-    Confirm: "確認",
-    Yes: "是",
-    No: "否",
-    Username: "帳號",
-    Password: "密碼",
-    "Remember me": "記住我",
-    Login: "登入",
-    "No Monitors, please": "沒有監測器,請",
-    "add one": "新增",
-    "Notification Type": "通知類型",
-    Email: "電郵",
-    Test: "測試",
-    keywordDescription: "搜索 HTML 或 JSON 裡是否有出現關鍵字(注意英文大細階)",
-    "Certificate Info": "憑證詳細資料",
-    deleteMonitorMsg: "是否確定刪除這個監測器?",
-    deleteNotificationMsg: "是否確定刪除這個通知設定?如監測器啟用了這個通知,將會收不到通知。",
-    "Resolver Server": "DNS 伺服器",
-    "Resource Record Type": "DNS 記錄類型",
-    resolverserverDescription: "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。",
-    rrtypeDescription: "請選擇 DNS 記錄類型",
-    pauseMonitorMsg: "是否確定暫停?",
-    "Last Result": "最後結果",
-    "Create your admin account": "建立管理員帳號",
-    "Repeat Password": "重複密碼",
-    respTime: "反應時間 (ms)",
-    notAvailableShort: "N/A",
-    Create: "建立",
-    clearEventsMsg: "是否確定刪除這個監測器的所有事件?",
-    clearHeartbeatsMsg: "是否確定刪除這個監測器的所有脈搏資料?",
-    confirmClearStatisticsMsg: "是否確定刪除所有監測器的脈搏資料?(您的監測器會繼續正常運作)",
-    "Clear Data": "清除資料",
-    Events: "事件",
-    Heartbeats: "脈搏",
-    "Auto Get": "自動獲取",
-    enableDefaultNotificationDescription: "新增監測器時這個通知會預設啟用,當然每個監測器亦可分別控制開關。",
-    "Default enabled": "預設通知",
-    "Also apply to existing monitors": "同時取用至目前所有監測器",
-    Export: "匯出",
-    Import: "匯入",
-    backupDescription: "您可以備份所有監測器及所有通知。",
-    backupDescription2: "註:此備份不包括歷史記錄。",
-    backupDescription3: "此備份可能包含了一些敏感資料如通知裡的 Token,請小心保存備份。",
-    alertNoFile: "請選擇一個檔案",
-    alertWrongFileType: "請選擇 JSON 檔案",
-    twoFAVerifyLabel: "Please type in your token to verify that 2FA is working",
-    tokenValidSettingsMsg: "Token is valid! You can now save the 2FA settings.",
-    confirmEnableTwoFAMsg: "Are you sure you want to enable 2FA?",
-    confirmDisableTwoFAMsg: "Are you sure you want to disable 2FA?",
-    "Apply on all existing monitors": "套用至目前所有監測器",
-    "Verify Token": "驗証 Token",
-    "Setup 2FA": "設定 2FA",
-    "Enable 2FA": "開啟 2FA",
-    "Disable 2FA": "關閉 2FA",
-    "2FA Settings": "2FA 設定",
-    "Two Factor Authentication": "雙重認證",
-    Active: "生效",
-    Inactive: "未生效",
-    Token: "Token",
-    "Show URI": "顯示 URI",
-    "Clear all statistics": "清除所有歷史記錄",
-    retryCheckEverySecond: "Retry every {0} seconds.",
-    importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "匯入備份",
-    "Export Backup": "匯出備份",
-    "Skip existing": "略過已存在的",
-    Overwrite: "覆蓋",
-    Options: "選項",
-    "Keep both": "兩者並存",
-    Tags: "標籤",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exist.",
-    "Tag with this value already exist.": "Tag with this value already exist.",
-    color: "顏色",
-    "value (optional)": "值 (非必需)",
-    Gray: "灰",
-    Red: "紅",
-    Orange: "橙",
-    Green: "綠",
-    Blue: "藍",
-    Indigo: "靛",
-    Purple: "紫",
-    Pink: "粉紅",
-    "Search...": "搜尋...",
-    "Avg. Ping": "平均反應時間",
-    "Avg. Response": "平均反應時間",
-    "Entry Page": "Entry Page",
-    statusPageNothing: "Nothing here, please add a group or a monitor.",
-    "No Services": "沒有服務",
-    "All Systems Operational": "一切正常",
-    "Partially Degraded Service": "部份服務受阻",
-    "Degraded Service": "服務受阻",
-    "Add Group": "新增群組",
-    "Add a monitor": " 新增監測器",
-    "Edit Status Page": "編輯 Status Page",
-    "Go to Dashboard": "前往主控台",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    telegram: "Telegram",
-    webhook: "Webhook",
-    smtp: "電郵 (SMTP)",
-    discord: "Discord",
-    teams: "Microsoft Teams",
-    signal: "Signal",
-    gotify: "Gotify",
-    slack: "Slack",
-    "rocket.chat": "Rocket.chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (支援 50 多種通知)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    deleteStatusPageMsg: "是否確定刪除這個 Status Page?",
-    "Push URL": "推送網址",
-    needPushEvery: "您應每 {0} 秒呼叫此網址。",
-    pushOptionalParams: "選填參數:{0}",
-    defaultNotificationName: "我的 {notification} 通知 ({number})",
-    here: "此處",
-    Required: "必填",
-    "Bot Token": "機器人權杖",
-    wayToGetTelegramToken: "您可以從 {0} 取得 Token。",
-    "Chat ID": "聊天 ID",
-    supportTelegramChatID: "支援 對話/群組/頻道的聊天 ID",
-    wayToGetTelegramChatID: "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
-    "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
-    chatIDNotFound: "找不到 Chat ID;請先傳送訊息給機器人",
-    "Post URL": "Post 網址",
-    "Content Type": "Content Type",
-    webhookJsonDesc: "{0} 適合任何現代的 HTTP 伺服器,如 Express.js",
-    webhookFormDataDesc: "{multipart} 適合 PHP。 JSON 必須先經由 {decodeFunction} 剖析。",
-    secureOptionNone: "無 / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "忽略 TLS 錯誤",
-    "From Email": "寄件人",
-    emailCustomSubject: "自訂主旨",
-    "To Email": "收件人",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    "Discord Webhook URL": "Discord Webhook 網址",
-    wayToGetDiscordURL: "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
-    "Bot Display Name": "機器人顯示名稱",
-    "Prefix Custom Message": "前綴自訂訊息",
-    "Webhook URL": "Webhook 網址",
-    wayToGetTeamsURL: "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
-    Number: "號碼",
-    Recipients: "收件人",
-    needSignalAPI: "您需要有 REST API 的 Signal 客戶端。",
-    wayToCheckSignalURL: "您可以前往下列網址以了解如何設定:",
-    signalImportant: "注意: 不得混合收件人的群組和號碼!",
-    "Application Token": "應用程式權杖",
-    "Server URL": "伺服器網址",
-    Priority: "優先度",
-    "Icon Emoji": "Emoji 圖示",
-    "Channel Name": "頻道名稱",
-    "Uptime Kuma URL": "Uptime Kuma 網址",
-    aboutWebhooks: "更多關於 Webhook 的資訊: {0}",
-    aboutChannelName: "如果您不想使用 Webhook 頻道,請在 {0} 頻道名稱欄位填入您想使用的頻道。例如: #其他頻道",
-    aboutKumaURL: "如果您未填入 Uptime Kuma 網址。將預設使用專案 Github 頁面。",
-    emojiCheatSheet: "Emoji 一覽表: {0}",
-    PushByTechulus: "Push by Techulus",
-    clicksendsms: "ClickSend SMS",
-    GoogleChat: "Google Chat (僅限 Google Workspace)",
-    "User Key": "使用者金鑰",
-    Device: "裝置",
-    "Message Title": "訊息標題",
-    "Notification Sound": "通知音效",
-    "More info on:": "更多資訊: {0}",
-    pushoverDesc1: "緊急優先度 (2) 的重試間隔為 30 秒並且會在 1 小時後過期。",
-    pushoverDesc2: "如果您想要傳送通知到不同裝置,請填寫裝置欄位。",
-    "SMS Type": "簡訊類型",
-    octopushTypePremium: "Premium (快速 - 建議用於警報)",
-    octopushTypeLowCost: "Low Cost (緩慢 - 有時會被營運商阻擋)",
-    checkPrice: "查看 {0} 價格:",
-    apiCredentials: "API 認證",
-    octopushLegacyHint: "您使用的是舊版的 Octopush (2011-2020) 還是新版?",
-    "Check octopush prices": "查看 octopush 價格 {0}。",
-    octopushPhoneNumber: "電話號碼 (intl 格式,例如:+33612345678) ",
-    octopushSMSSender: "簡訊寄件人名稱:3-11位英數字元及空白 (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea 裝置 ID",
-    "Apprise URL": "Apprise 網址",
-    "Example:": "範例:{0}",
-    "Read more:": "深入瞭解:{0}",
-    "Status:": "狀態:{0}",
-    "Read more": "深入瞭解",
-    appriseInstalled: "已安裝 Apprise。",
-    appriseNotInstalled: "尚未安裝 Apprise。{0}",
-    "Access Token": "存取權杖",
-    "Channel access token": "頻道存取權杖",
-    "Line Developers Console": "Line 開發者控制台",
-    lineDevConsoleTo: "Line 開發者控制台 - {0}",
-    "Basic Settings": "基本設定",
-    "User ID": "使用者 ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "首先,前往 {0},建立 provider 和 channel (Messaging API)。接著您就可以從上面提到的選單項目中取得頻道存取權杖及使用者 ID。",
-    "Icon URL": "圖示網址",
-    aboutIconURL: "您可以在 \"圖示網址\" 中提供圖片網址以覆蓋預設個人檔案圖片。若已設定 Emoji 圖示,將忽略此設定。",
-    aboutMattermostChannelName: "您可以在 \"頻道名稱\" 欄位中填寫頻道名稱以覆蓋 Webhook 的預設頻道。必須在 Mattermost 的 Webhook 設定中啟用。例如:#其他頻道",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件人。",
-    promosmsTypeFlash: "SMS FLASH - 訊息會自動在收件人的裝置上顯示。僅限位於波蘭的收件人。",
-    promosmsTypeFull: "SMS FULL - 高級版,您可以使用您的寄件人名稱 (必須先註冊名稱。對於警報來說十分可靠。",
-    promosmsTypeSpeed: "SMS SPEED - 系統中的最高優先度。快速、可靠,但昂貴 (約 SMS FULL 的兩倍價格)。",
-    promosmsPhoneNumber: "電話號碼 (若收件人位於波蘭則無需輸入區域代碼)",
-    promosmsSMSSender: "簡訊寄件人名稱:預先註冊的名稱或以下的預設名稱:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
-    "Feishu WebHookUrl": "飛書 WebHook 網址",
-    matrixHomeserverURL: "Homeserver 網址 (開頭為 http(s)://,結尾可能帶連接埠)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "您可以在 Matrix 客戶端的房間設定中的進階選項找到 internal room ID。應該看起來像 !QMdRCpUIfLwsfjxye6:home.server。",
-    matrixDesc2: "使用您自己的 Matrix 使用者存取權杖將賦予存取您的帳號和您加入的房間的完整權限。建議建立新使用者,並邀請至您想要接收通知的房間中。您可以執行 {0} 以取得存取權杖",
-    Method: "方法",
-    Body: "主體",
-    Headers: "標頭",
-    PushUrl: "Push URL",
-    HeadersInvalidFormat: "要求標頭不是有效的 JSON:",
-    BodyInvalidFormat: "請求主體不是有效的 JSON:",
-    "Monitor History": "監測器歷史紀錄",
-    clearDataOlderThan: "保留 {0} 天內的監測器歷史紀錄。",
-    PasswordsDoNotMatch: "密碼不相符。",
-    records: "記錄",
-    "One record": "一項記錄",
-    "Showing {from} to {to} of {count} records": "正在顯示 {count} 項記錄中的 {from} 至 {to} 項",
-    steamApiKeyDescription: "若要監測 Steam 遊戲伺服器,您將需要 Steam Web-API 金鑰。您可以在此註冊您的 API 金鑰:",
-    "Current User": "目前使用者",
-    recent: "最近",
-    Done: "完成",
-    Info: "資訊",
-    Security: "安全性",
-    "Steam API Key": "Steam API 金鑰",
-    "Shrink Database": "壓縮資料庫",
-    "Pick a RR-Type...": "選擇資源記錄類型...",
-    "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
-    Default: "預設",
-    "HTTP Options": "HTTP 選項",
-    "Create Incident": "建立事件",
-    Title: "標題",
-    Content: "內容",
-    Style: "樣式",
-    info: "資訊",
-    warning: "警告",
-    danger: "危險",
-    primary: "主要",
-    light: "淺色",
-    dark: "暗色",
-    Post: "發佈",
-    "Please input title and content": "請輸入標題及內容",
-    Created: "建立",
-    "Last Updated": "最後更新",
-    Unpin: "取消釘選",
-    "Switch to Light Theme": "切換至淺色佈景主題",
-    "Switch to Dark Theme": "切換至深色佈景主題",
-    "Show Tags": "顯示標籤",
-    "Hide Tags": "隱藏標籤",
-    Description: "描述",
-    "No monitors available.": "沒有可用的監測器。",
-    "Add one": "新增一個",
-    "No Monitors": "無監測器",
-    "Untitled Group": "未命名群組",
-    Services: "服務",
-    Discard: "捨棄",
-    Cancel: "取消",
-    shrinkDatabaseDescription: "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立,AUTO_VACUUM 已自動啟用,則無需此操作。",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API 使用者名稱 (包括 webapi_ 前綴)",
-    serwersmsAPIPassword: "API 密碼",
-    serwersmsPhoneNumber: "電話號碼",
-    serwersmsSenderName: "SMS 寄件人名稱 (由客戶入口網站註冊)",
-    stackfield: "Stackfield",
-    smtpDkimSettings: "DKIM 設定",
-    smtpDkimDesc: "請參考 Nodemailer DKIM {0} 使用方式。",
-    documentation: "文件",
-    smtpDkimDomain: "網域名稱",
-    smtpDkimKeySelector: "DKIM 選取器",
-    smtpDkimPrivateKey: "私密金鑰",
-    smtpDkimHashAlgo: "雜湊演算法 (選填)",
-    smtpDkimheaderFieldNames: "要簽署的郵件標頭 (選填)",
-    smtpDkimskipFields: "不簽署的郵件標頭 (選填)",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API Endpoint",
-    alertaEnvironment: "環境",
-    alertaApiKey: "API 金鑰",
-    alertaAlertState: "警示狀態",
-    alertaRecoverState: "恢復狀態",
-    Proxies: "代理伺服器",
-    default: "預設",
-    enabled: "啟用",
-    setAsDefault: "設為預設",
-    deleteProxyMsg: "您確定要為所有監測器刪除此代理伺服器嗎?",
-    proxyDescription: "必須將代理伺服器指派給監測器才能運作。",
-    enableProxyDescription: "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
-    setAsDefaultProxyDescription: "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
-    Maintenance: "維護",
-    statusMaintenance: "維護中",
-    "Enable DNS Cache": "啟用 DNS 快取",
-    "Enable": "啟用",
-    "Disable": "停用",
-};
diff --git a/src/languages/zh-TW.js b/src/languages/zh-TW.js
deleted file mode 100644
index 668e4c23..00000000
--- a/src/languages/zh-TW.js
+++ /dev/null
@@ -1,672 +0,0 @@
-export default {
-    languageName: "繁體中文 (台灣)",
-    checkEverySecond: "每 {0} 秒檢查一次",
-    retryCheckEverySecond: "每 {0} 秒重試一次",
-    resendEveryXTimes: "每 {0} 次便重新傳送",
-    resendDisabled: "重新傳送已停用",
-    retriesDescription: "在服務被標記為離線並傳送通知前的最大重試次數",
-    ignoreTLSError: "忽略 HTTPS 網站的 TLS/SSL 錯誤",
-    upsideDownModeDescription: "反轉顯示狀態。若服務可以連線,將顯示離線。",
-    maxRedirectDescription: "最大重新導向跟隨次數。設為 0 將停用重新導向。",
-    enableGRPCTls: "允許以 TLS 連線傳送 gRPC 要求",
-    grpcMethodDescription: "方法名稱將轉換至駝峰式命名,如 sayHello、check 等。",
-    acceptedStatusCodesDescription: "選擇視為成功回應的狀態碼。",
-    Maintenance: "維護",
-    statusMaintenance: "維護",
-    "Schedule maintenance": "排程維護",
-    "Affected Monitors": "受影響的監測器",
-    "Pick Affected Monitors...": "挑選受影響的監測器...",
-    "Start of maintenance": "維護起始",
-    "All Status Pages": "所有狀態頁",
-    "Select status pages...": "選擇狀態頁...",
-    recurringIntervalMessage: "每日執行 | 每 {0} 天執行",
-    affectedMonitorsDescription: "選擇受目前維護影響的監測器",
-    affectedStatusPages: "在已選取的狀態頁中顯示此維護訊息",
-    atLeastOneMonitor: "至少選擇一個受影響的監測器",
-    passwordNotMatchMsg: "密碼不相符。",
-    notificationDescription: "必須將通知指派給監測器才能運作。",
-    keywordDescription: "HTML 或 JSON 回應的搜尋關鍵字。區分大小寫。",
-    pauseDashboardHome: "暫停",
-    deleteMonitorMsg: "您確定要刪除此監測器嗎?",
-    deleteMaintenanceMsg: "您確定要刪除此維護嗎?",
-    deleteNotificationMsg: "您確定要為所有監測器刪除此通知嗎?",
-    dnsPortDescription: "DNS 伺服器連接埠。預設為 53。您可以隨時變更連接埠。",
-    resolverserverDescription: "Cloudflare 為預設伺服器。您可以隨時更換解析伺服器。",
-    rrtypeDescription: "選擇您想要監測的資源記錄類型",
-    pauseMonitorMsg: "您確定要暫停嗎?",
-    enableDefaultNotificationDescription: "預設情況下,新監測器將啟用此通知。您仍可分別停用各監測器的通知。",
-    clearEventsMsg: "您確定要刪除此監測器的所有事件嗎?",
-    clearHeartbeatsMsg: "您確定要刪除此監測器的所有心跳嗎?",
-    confirmClearStatisticsMsg: "您確定要刪除所有統計資料嗎?",
-    importHandleDescription: "若您想跳過所有相同名稱的監測器或通知,請選擇 '略過現有'。選擇 '覆寫' 將刪除所有現有的監測器及通知。",
-    confirmImportMsg: "您確定要匯入備份嗎?請確認是否選擇正確的匯入設定。",
-    twoFAVerifyLabel: "請輸入權杖以驗證雙步驟驗證:",
-    tokenValidSettingsMsg: "權杖有效!您可以儲存雙步驟驗證設定了。",
-    confirmEnableTwoFAMsg: "您確定要啟用雙步驟驗證嗎?",
-    confirmDisableTwoFAMsg: "您確定要停用雙步驟驗證嗎?",
-    Settings: "設定",
-    Dashboard: "儀表板",
-    "New Update": "新版本",
-    Language: "語言",
-    Appearance: "外觀",
-    Theme: "主題",
-    General: "一般",
-    "Primary Base URL": "主要基底網址",
-    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.": "憑證期限",
-    day: "天",
-    "-day": "天",
-    hour: "小時",
-    "-hour": "小時",
-    Response: "回應",
-    Ping: "Ping",
-    "Monitor Type": "監測器類型",
-    Keyword: "關鍵字",
-    "Friendly Name": "易記名稱",
-    URL: "網址",
-    Hostname: "主機名稱",
-    Port: "連接埠",
-    "Heartbeat Interval": "心跳間隔",
-    Retries: "重試次數",
-    "Heartbeat Retry Interval": "心跳重試間隔",
-    "Resend Notification if Down X times consequently": "若 X 次心跳皆離線,重新傳送通知",
-    Advanced: "進階",
-    "Upside Down Mode": "顛倒模式",
-    "Max. Redirects": "最大重新導向次數",
-    "Accepted Status Codes": "可接受的狀態碼",
-    "Push URL": "推送網址",
-    needPushEvery: "您應每 {0} 秒呼叫此網址。",
-    pushOptionalParams: "選填參數:{0}",
-    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": "啟用驗證",
-    "disableauth.message1": ">你是否要<strong>取消登入驗證</strong>?",
-    "disableauth.message2": "此功能是設計給已有<strong>第三方認證</strong>的使用者,例如 Cloudflare Access。",
-    "Please use this option carefully!": "請謹慎使用。",
-    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": "確認密碼",
-    "Import Backup": "匯入備份",
-    "Export Backup": "匯出備份",
-    Export: "匯出",
-    Import: "匯入",
-    respTime: "回應時間 (毫秒)",
-    notAvailableShort: "N/A",
-    "Default enabled": "啟用預設",
-    "Apply on all existing monitors": "套用到目前所有的監測器",
-    Create: "建立",
-    "Clear Data": "清除資料",
-    Events: "活動",
-    Heartbeats: "心跳",
-    "Auto Get": "自動取得",
-    backupDescription: "您可以將所有監測器及通知備份成一個 JSON 檔案。",
-    backupDescription2: "提醒:不包含歷史紀錄及活動紀錄。",
-    backupDescription3: "如通知權杖等機密資料也會一同匯出。請妥善保存。",
-    alertNoFile: "請選擇要匯入的檔案。",
-    alertWrongFileType: "請選擇 JSON 檔案。",
-    "Clear all statistics": "清除所有統計資料",
-    "Skip existing": "略過現有",
-    Overwrite: "覆寫",
-    Options: "選項",
-    "Keep both": "保留兩者",
-    "Verify Token": "認證權杖",
-    "Setup 2FA": "設置雙步驟驗證",
-    "Enable 2FA": "啟用雙步驟驗證",
-    "Disable 2FA": "停用雙步驟驗證",
-    "2FA Settings": "雙步驟驗證設定",
-    "Two Factor Authentication": "雙步驟驗證",
-    Active: "啟用",
-    Inactive: "停用",
-    Token: "權杖",
-    "Show URI": "顯示 URI",
-    Tags: "標籤",
-    "Add New below or Select...": "在下方新增或選取...",
-    "Tag with this name already exist.": "已存在相同名稱的標籤。",
-    "Tag with this value already exist.": "已存在相同數值的標籤。",
-    color: "顏色",
-    "value (optional)": "數值 (選填)",
-    Gray: "灰色",
-    Red: "紅色",
-    Orange: "橘色",
-    Green: "綠色",
-    Blue: "藍色",
-    Indigo: "靛色",
-    Purple: "紫色",
-    Pink: "粉色",
-    "Search...": "搜尋...",
-    "Avg. Ping": "平均 Ping",
-    "Avg. Response": "平均回應",
-    "Entry Page": "入口頁面",
-    statusPageNothing: "空空如也,請新增群組或監測器。",
-    "No Services": "無服務",
-    "All Systems Operational": "所有系統正常運作",
-    "Partially Degraded Service": "部分服務效能降低",
-    "Degraded Service": "服務效能降低",
-    "Add Group": "新增群組",
-    "Add a monitor": "加入監測器",
-    "Edit Status Page": "編輯狀態頁",
-    "Go to Dashboard": "前往儀表板",
-    "Status Page": "狀態頁",
-    "Status Pages": "狀態頁",
-    defaultNotificationName: "我的 {notification} 通知 ({number})",
-    here: "此處",
-    Required: "必填",
-    telegram: "Telegram",
-    "Bot Token": "機器人權杖",
-    wayToGetTelegramToken: "您可以從 {0} 取得權杖。",
-    "Chat ID": "聊天 ID",
-    supportTelegramChatID: "支援 對話/群組/頻道的聊天 ID",
-    wayToGetTelegramChatID: "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
-    "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
-    chatIDNotFound: "找不到 Chat ID;請先傳送訊息給機器人",
-    webhook: "Webhook",
-    "Post URL": "Post 網址",
-    "Content Type": "內容類型",
-    webhookJsonDesc: "{0} 適合任何現代的 HTTP 伺服器,如 Express.js",
-    webhookFormDataDesc: "{multipart} 適合 PHP。 JSON 必須先經由 {decodeFunction} 剖析。",
-    webhookAdditionalHeadersTitle: "額外標頭",
-    webhookAdditionalHeadersDesc: "設定與 webhook 一同傳送的額外標頭。",
-    smtp: "Email (SMTP)",
-    secureOptionNone: "無 / STARTTLS (25, 587)",
-    secureOptionTLS: "TLS (465)",
-    "Ignore TLS Error": "忽略 TLS 錯誤",
-    "From Email": "寄件人",
-    emailCustomSubject: "自訂主旨",
-    "To Email": "收件者",
-    smtpCC: "CC",
-    smtpBCC: "BCC",
-    discord: "Discord",
-    "Discord Webhook URL": "Discord Webhook 網址",
-    wayToGetDiscordURL: "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
-    "Bot Display Name": "機器人顯示名稱",
-    "Prefix Custom Message": "前綴自訂訊息",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
-    teams: "Microsoft Teams",
-    "Webhook URL": "Webhook 網址",
-    wayToGetTeamsURL: "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
-    signal: "Signal",
-    Number: "號碼",
-    Recipients: "收件者",
-    needSignalAPI: "您需要有 REST API 的 Signal 客戶端。",
-    wayToCheckSignalURL: "您可以前往下列網址以了解如何設定:",
-    signalImportant: "注意: 不得混合收件者的群組和號碼!",
-    gotify: "Gotify",
-    "Application Token": "應用程式權杖",
-    "Server URL": "伺服器網址",
-    Priority: "優先度",
-    slack: "Slack",
-    "Icon Emoji": "Emoji 圖示",
-    "Channel Name": "頻道名稱",
-    "Uptime Kuma URL": "Uptime Kuma 網址",
-    aboutWebhooks: "更多關於 Webhook 的資訊: {0}",
-    aboutChannelName: "如果您不想使用 Webhook 頻道,請在 {0} 頻道名稱欄位填入您想使用的頻道。例如: #其他頻道",
-    aboutKumaURL: "如果您未填入 Uptime Kuma 網址。將預設使用專案 Github 頁面。",
-    emojiCheatSheet: "Emoji 一覽表: {0}",
-    "rocket.chat": "Rocket.Chat",
-    pushover: "Pushover",
-    pushy: "Pushy",
-    PushByTechulus: "Push by Techulus",
-    octopush: "Octopush",
-    promosms: "PromoSMS",
-    clicksendsms: "ClickSend SMS",
-    lunasea: "LunaSea",
-    apprise: "Apprise (支援 50 種以上的通知服務)",
-    GoogleChat: "Google Chat (僅限 Google Workspace)",
-    pushbullet: "Pushbullet",
-    line: "Line Messenger",
-    mattermost: "Mattermost",
-    "User Key": "使用者金鑰",
-    Device: "裝置",
-    "Message Title": "訊息標題",
-    "Notification Sound": "通知音效",
-    "More info on:": "更多資訊: {0}",
-    pushoverDesc1: "緊急優先度 (2) 的重試間隔為 30 秒並且會在 1 小時後過期。",
-    pushoverDesc2: "如果您想要傳送通知到不同裝置,請填寫裝置欄位。",
-    "SMS Type": "簡訊類型",
-    octopushTypePremium: "Premium (快速 - 建議用於警報)",
-    octopushTypeLowCost: "Low Cost (緩慢 - 有時會被營運商阻擋)",
-    checkPrice: "查看 {0} 價格:",
-    apiCredentials: "API 認證",
-    octopushLegacyHint: "您使用的是舊版的 Octopush (2011-2020) 還是新版?",
-    "Check octopush prices": "查看 octopush 價格 {0}。",
-    octopushPhoneNumber: "電話號碼 (intl 格式,例如:+33612345678) ",
-    octopushSMSSender: "簡訊寄件人名稱:3-11位英數字元及空白 (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea 裝置 ID",
-    "Apprise URL": "Apprise 網址",
-    "Example:": "範例:{0}",
-    "Read more:": "深入瞭解:{0}",
-    "Status:": "狀態:{0}",
-    "Read more": "深入瞭解",
-    appriseInstalled: "已安裝 Apprise。",
-    appriseNotInstalled: "尚未安裝 Apprise。{0}",
-    "Access Token": "存取權杖",
-    "Channel access token": "頻道存取權杖",
-    "Line Developers Console": "Line 開發者控制台",
-    lineDevConsoleTo: "Line 開發者控制台 - {0}",
-    "Basic Settings": "基本設定",
-    "User ID": "使用者 ID",
-    "Messaging API": "Messaging API",
-    wayToGetLineChannelToken: "首先,前往 {0},建立 provider 和 channel (Messaging API)。接著您就可以從上面提到的選單項目中取得頻道存取權杖及使用者 ID。",
-    "Icon URL": "圖示網址",
-    aboutIconURL: "您可以在 \"圖示網址\" 中提供圖片網址以覆蓋預設個人檔案圖片。若已設定 Emoji 圖示,將忽略此設定。",
-    aboutMattermostChannelName: "您可以在 \"頻道名稱\" 欄位中填寫頻道名稱以覆蓋 Webhook 的預設頻道。必須在 Mattermost 的 Webhook 設定中啟用。例如:#其他頻道",
-    matrix: "Matrix",
-    promosmsTypeEco: "SMS ECO - 便宜,但是很慢且經常過載。僅限位於波蘭的收件者。",
-    promosmsTypeFlash: "SMS FLASH - 訊息會自動在收件者的裝置上顯示。僅限位於波蘭的收件者。",
-    promosmsTypeFull: "SMS FULL - 高級版,您可以使用您的寄件人名稱 (必須先註冊名稱。對於警報來說十分可靠。",
-    promosmsTypeSpeed: "SMS SPEED - 系統中的最高優先度。快速、可靠,但昂貴 (約 SMS FULL 的兩倍價格)。",
-    promosmsPhoneNumber: "電話號碼 (若收件者位於波蘭則無需輸入區域代碼)",
-    promosmsSMSSender: "簡訊寄件人名稱:預先註冊的名稱或以下的預設名稱:InfoSMS、SMS Info、MaxSMS、INFO、SMS",
-    "Feishu WebHookUrl": "飛書 WebHook 網址",
-    matrixHomeserverURL: "Homeserver 網址 (開頭為 http(s)://,結尾可能帶連接埠)",
-    "Internal Room Id": "Internal Room ID",
-    matrixDesc1: "您可以在 Matrix 客戶端的房間設定中的進階選項找到 internal room ID。應該看起來像 !QMdRCpUIfLwsfjxye6:home.server。",
-    matrixDesc2: "使用您自己的 Matrix 使用者存取權杖將賦予存取您的帳號和您加入的房間的完整權限。建議建立新使用者,並邀請至您想要接收通知的房間中。您可以執行 {0} 以取得存取權杖",
-    Method: "方法",
-    Body: "主體",
-    Headers: "標頭",
-    PushUrl: "Push 網址",
-    HeadersInvalidFormat: "要求標頭不是有效的 JSON:",
-    BodyInvalidFormat: "要求主體不是有效的 JSON:",
-    "Monitor History": "監測器歷史紀錄",
-    clearDataOlderThan: "保留 {0} 天內的監測器歷史紀錄。",
-    PasswordsDoNotMatch: "密碼不相符。",
-    records: "記錄",
-    "One record": "一項記錄",
-    steamApiKeyDescription: "若要監測 Steam 遊戲伺服器,您將需要 Steam Web-API 金鑰。您可以在此註冊您的 API 金鑰:",
-    "Current User": "目前使用者",
-    topic: "Topic",
-    topicExplanation: "要監測的 MQTT Topic",
-    successMessage: "成功訊息",
-    successMessageExplanation: "視為成功的 MQTT 訊息",
-    recent: "最近",
-    Done: "完成",
-    Info: "資訊",
-    Security: "安全性",
-    "Steam API Key": "Steam API 金鑰",
-    "Shrink Database": "壓縮資料庫",
-    "Pick a RR-Type...": "選擇資源記錄類型...",
-    "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
-    Default: "預設",
-    "HTTP Options": "HTTP 選項",
-    "Create Incident": "建立事件",
-    Title: "標題",
-    Content: "內容",
-    Style: "樣式",
-    info: "資訊",
-    warning: "警告",
-    danger: "危險",
-    error: "錯誤",
-    critical: "嚴重",
-    primary: "主要",
-    light: "淺色",
-    dark: "暗色",
-    Post: "發佈",
-    "Please input title and content": "請輸入標題及內容",
-    Created: "建立",
-    "Last Updated": "最後更新",
-    Unpin: "取消釘選",
-    "Switch to Light Theme": "切換至淺色佈景主題",
-    "Switch to Dark Theme": "切換至深色佈景主題",
-    "Show Tags": "顯示標籤",
-    "Hide Tags": "隱藏標籤",
-    Description: "說明",
-    "No monitors available.": "沒有可用的監測器。",
-    "Add one": "新增一個",
-    "No Monitors": "無監測器",
-    "Untitled Group": "未命名群組",
-    Services: "服務",
-    Discard: "捨棄",
-    Cancel: "取消",
-    "Powered by": "技術支援",
-    shrinkDatabaseDescription: "觸發 SQLite 的資料庫清理 (VACUUM)。如果您的資料庫是在 1.10.0 版本後建立,AUTO_VACUUM 已自動啟用,則無需此操作。",
-    serwersms: "SerwerSMS.pl",
-    serwersmsAPIUser: "API 使用者名稱 (包括 webapi_ 前綴)",
-    serwersmsAPIPassword: "API 密碼",
-    serwersmsPhoneNumber: "電話號碼",
-    serwersmsSenderName: "SMS 寄件人名稱 (由客戶入口網站註冊)",
-    smseagle: "SMSEagle",
-    smseagleTo: "電話號碼",
-    smseagleGroup: "電話簿群組名稱",
-    smseagleContact: "電話簿聯絡人名稱",
-    smseagleRecipientType: "收件者類型",
-    smseagleRecipient: "收件者 (用逗號分隔)",
-    smseagleToken: "API 存取權杖",
-    smseagleUrl: "您的 SMSEagle 裝置網址",
-    smseagleEncoding: "以 Unicode 傳送",
-    smseaglePriority: "訊息優先度 (0-9,預設 = 0)",
-    stackfield: "Stackfield",
-    Customize: "自訂",
-    "Custom Footer": "自訂頁尾",
-    "Custom CSS": "自訂 CSS",
-    smtpDkimSettings: "DKIM 設定",
-    smtpDkimDesc: "請參考 Nodemailer DKIM {0} 使用方式。",
-    documentation: "文件",
-    smtpDkimDomain: "網域名稱",
-    smtpDkimKeySelector: "DKIM 選取器",
-    smtpDkimPrivateKey: "私密金鑰",
-    smtpDkimHashAlgo: "雜湊演算法 (選填)",
-    smtpDkimheaderFieldNames: "要簽署的郵件標頭 (選填)",
-    smtpDkimskipFields: "不簽署的郵件標頭 (選填)",
-    wayToGetPagerDutyKey: "您可以前往服務 -> 服務目錄 -> (選取服務) -> 整合 -> 新增整合以取得。您可以搜尋 \"Events API V2\"。詳細資訊 {0}",
-    "Integration Key": "整合金鑰",
-    "Integration URL": "整合網址",
-    "Auto resolve or acknowledged": "自動解決或認可",
-    "do nothing": "不進行任何操作",
-    "auto acknowledged": "自動認可",
-    "auto resolve": "自動解決",
-    gorush: "Gorush",
-    alerta: "Alerta",
-    alertaApiEndpoint: "API 端點",
-    alertaEnvironment: "環境",
-    alertaApiKey: "API 金鑰",
-    alertaAlertState: "警示狀態",
-    alertaRecoverState: "恢復狀態",
-    deleteStatusPageMsg: "您確定要刪除此狀態頁嗎?",
-    Proxies: "代理伺服器",
-    default: "預設",
-    enabled: "啟用",
-    setAsDefault: "設為預設",
-    deleteProxyMsg: "您確定要為所有監測器刪除此代理伺服器嗎?",
-    proxyDescription: "必須將代理伺服器指派給監測器才能運作。",
-    enableProxyDescription: "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
-    setAsDefaultProxyDescription: "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
-    "Certificate Chain": "憑證鏈結",
-    Valid: "有效",
-    Invalid: "無效",
-    AccessKeyId: "AccessKey ID",
-    SecretAccessKey: "AccessKey 密碼",
-    PhoneNumbers: "PhoneNumbers",
-    TemplateCode: "TemplateCode",
-    SignName: "SignName",
-    "Sms template must contain parameters: ": "Sms 範本必須包含參數:",
-    "Bark Endpoint": "Bark 端點",
-    "Bark Group": "Bark 群組",
-    "Bark Sound": "Bark 鈴聲",
-    WebHookUrl: "WebHookUrl",
-    SecretKey: "SecretKey",
-    "For safety, must use secret key": "為了安全起見,必須使用秘密金鑰",
-    "Device Token": "裝置權杖",
-    Platform: "平台",
-    iOS: "iOS",
-    Android: "Android",
-    Huawei: "華為",
-    High: "高",
-    Retry: "重試",
-    Topic: "Topic",
-    "WeCom Bot Key": "WeCom 機器人金鑰",
-    "Setup Proxy": "設置 Proxy",
-    "Proxy Protocol": "Proxy 通訊協定",
-    "Proxy Server": "Proxy 伺服器",
-    "Proxy server has authentication": "Proxy 伺服器啟用了驗證功能",
-    User: "使用者",
-    Installed: "已安裝",
-    "Not installed": "未安裝",
-    Running: "執行中",
-    "Not running": "未執行",
-    "Remove Token": "移除權杖",
-    Start: "開始",
-    Stop: "停止",
-    "Uptime Kuma": "Uptime Kuma",
-    "Add New Status Page": "新增狀態頁",
-    Slug: "Slug",
-    "Accept characters:": "可用字元:",
-    startOrEndWithOnly: "僅能使用 {0} 開頭或結尾",
-    "No consecutive dashes": "不得連續使用破折號",
-    Next: "下一步",
-    "The slug is already taken. Please choose another slug.": "此 slug 已被使用。請選擇其他 slug。",
-    "No Proxy": "無 Proxy",
-    Authentication: "驗證",
-    "HTTP Basic Auth": "HTTP 基本驗證",
-    "New Status Page": "新狀態頁",
-    "Page Not Found": "找不到頁面",
-    "Reverse Proxy": "反向代理",
-    Backup: "備份",
-    About: "關於",
-    wayToGetCloudflaredURL: "(從 {0} 下載 cloudflared)",
-    cloudflareWebsite: "Cloudflare 網站",
-    "Message:": "訊息:",
-    "Don't know how to get the token? Please read the guide:": "不知道如何取得權杖嗎?請閱讀指南:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您目前正透過 Cloudflare Tunnel 連線,可能會導致連線中斷。您確定要停止嗎?請輸入密碼以確認。",
-    "HTTP Headers": "HTTP 標頭",
-    "Trust Proxy": "信任的 Proxy",
-    "Other Software": "其他軟體",
-    "For example: nginx, Apache and Traefik.": "例如 nginx、Apache 和 Traefik。",
-    "Please read": "請閱覽",
-    "Subject:": "簽發給:",
-    "Valid To:": "有效期限:",
-    "Days Remaining:": "剩餘天數:",
-    "Issuer:": "簽發者:",
-    "Fingerprint:": "指紋:",
-    "No status pages": "無狀態頁",
-    "Domain Name Expiry Notification": "網域名稱到期通知",
-    Proxy: "Proxy",
-    "Date Created": "建立日期",
-    HomeAssistant: "Home Assistant",
-    onebotHttpAddress: "OneBot HTTP 位址",
-    onebotMessageType: "OneBot 訊息類型",
-    onebotGroupMessage: "群組",
-    onebotPrivateMessage: "私人",
-    onebotUserOrGroupId: "群組/使用者 ID",
-    onebotSafetyTips: "為了安全起見,必須設置存取權杖",
-    "PushDeer Key": "PushDeer 金鑰",
-    "Footer Text": "頁尾文字",
-    "Show Powered By": "顯示技術支援文字",
-    "Domain Names": "網域名稱",
-    signedInDisp: "以 {0} 身分登入",
-    signedInDispDisabled: "驗證已停用。",
-    RadiusSecret: "Radius Secret",
-    RadiusSecretDescription: "客戶端與伺服器端的共享機密",
-    RadiusCalledStationId: "被叫站 Id",
-    RadiusCalledStationIdDescription: "被呼叫裝置的識別碼",
-    RadiusCallingStationId: "呼叫站 Id",
-    RadiusCallingStationIdDescription: "呼叫裝置的識別碼",
-    "Certificate Expiry Notification": "憑證到期通知",
-    "API Username": "API 使用者名稱",
-    "API Key": "API 金鑰",
-    "Recipient Number": "收件者號碼",
-    "From Name/Number": "來自名字/號碼",
-    "Leave blank to use a shared sender number.": "留空以使用共享寄件人號碼。",
-    "Octopush API Version": "Octopush API 版本",
-    "Legacy Octopush-DM": "舊版 Octopush-DM",
-    "endpoint": "端",
-    octopushAPIKey: "在控制台的 HTTP API 憑證取得的 \"API 金鑰\"",
-    octopushLogin: "在控制台的 HTTP API 憑證取得的 \"Login\"",
-    promosmsLogin: "API 登入名稱",
-    promosmsPassword: "API 密碼",
-    "pushoversounds pushover": "Pushover (預設)",
-    "pushoversounds bike": "車鈴",
-    "pushoversounds bugle": "號角",
-    "pushoversounds cashregister": "收銀機",
-    "pushoversounds classical": "古典",
-    "pushoversounds cosmic": "宇宙",
-    "pushoversounds falling": "下落",
-    "pushoversounds gamelan": "甘美朗",
-    "pushoversounds incoming": "來電",
-    "pushoversounds intermission": "中場休息",
-    "pushoversounds magic": "魔法",
-    "pushoversounds mechanical": "機械",
-    "pushoversounds pianobar": "鋼琴酒吧",
-    "pushoversounds siren": "警鈴",
-    "pushoversounds spacealarm": "太空鬧鐘",
-    "pushoversounds tugboat": "汽笛",
-    "pushoversounds alien": "外星鬧鐘 (長)",
-    "pushoversounds climb": "爬升 (長)",
-    "pushoversounds persistent": "持續 (長)",
-    "pushoversounds echo": "Pushover 回音 (長)",
-    "pushoversounds updown": "上下 (長)",
-    "pushoversounds vibrate": "僅震動",
-    "pushoversounds none": "無 (靜音)",
-    pushyAPIKey: "API 密鑰",
-    pushyToken: "裝置權杖",
-    "Show update if available": "顯示可用更新",
-    "Also check beta release": "檢查 Beta 版",
-    "Using a Reverse Proxy?": "正在使用反向代理?",
-    "Check how to config it for WebSocket": "查看如何為 WebSocket 設定",
-    "Steam Game Server": "Steam 遊戲伺服器",
-    "Most likely causes:": "可能原因:",
-    "The resource is no longer available.": "資源已不可用。",
-    "There might be a typing error in the address.": "網址可能有誤。",
-    "What you can try:": "您可以嘗試:",
-    "Retype the address.": "重新輸入網址。",
-    "Go back to the previous page.": "返回上一頁。",
-    "Coming Soon": "即將推出",
-    wayToGetClickSendSMSToken: "您可以從 {0} 取得 API 使用者名稱和金鑰。",
-    "Connection String": "連線字串",
-    Query: "查詢",
-    settingsCertificateExpiry: "TLS 憑證到期",
-    certificationExpiryDescription: "TLS 將於 X 天後到期時觸發 HTTPS 監測器通知:",
-    "Setup Docker Host": "設定 Docker 主機",
-    "Connection Type": "連線類型",
-    "Docker Daemon": "Docker 精靈",
-    deleteDockerHostMsg: "您確定要為所有監測器刪除此 Docker 主機嗎?",
-    socket: "通訊端",
-    tcp: "TCP / HTTP",
-    "Docker Container": "Docker 容器",
-    "Container Name / ID": "容器名稱 / ID",
-    "Docker Host": "Docker 主機",
-    "Docker Hosts": "Docker 主機",
-    "ntfy Topic": "ntfy 主題",
-    Domain: "網域",
-    Workstation: "工作站",
-    disableCloudflaredNoAuthMsg: "您處於無驗證模式。無須輸入密碼。",
-    trustProxyDescription: "信任 'X-Forwarded-*' 標頭。如果您想要取得正確的客戶端 IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache 後方,您應啟用此選項。",
-    wayToGetLineNotifyToken: "您可以從 {0} 取得存取權杖",
-    Examples: "範例",
-    "Home Assistant URL": "Home Assistant 網址",
-    "Long-Lived Access Token": "長期有效存取權杖",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要建立長期有效存取權杖,請點擊您的個人檔案名稱 (左下角),捲動至最下方,然後點擊建立權杖。",
-    "Notification Service": "通知服務",
-    "default: notify all devices": "預設:通知所有服務",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
-    "Automations can optionally be triggered in Home Assistant:": "可以選擇在 Home Assistant 中觸發自動化程序:",
-    "Trigger type:": "觸發器類型:",
-    "Event type:": "事件類型:",
-    "Event data:": "事件資料:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "然後選擇動作,例如切換至 RGB 燈為紅色的場景。",
-    "Frontend Version": "前端版本",
-    "Frontend Version do not match backend version!": "前端版本與後端版本不符!",
-    "Base URL": "基底網址",
-    goAlertInfo: "GoAlert 是用於待命排程、升級自動化,以及通知 (如簡訊或語音通話) 的開源應用程式。自動在正確的時間、用洽當的方法、聯絡合適的人! {0}",
-    goAlertIntegrationKeyInfo: "取得服務的通用 API 整合金鑰,格式為 \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"。通常是已複製的網址的權杖參數值。",
-    goAlert: "GoAlert",
-    backupOutdatedWarning: "過時:由於新功能的增加,且未妥善維護,故此備份功能無法產生或復原完整備份。",
-    backupRecommend: "請直接備份磁碟區或 ./data/ 資料夾。",
-    "Optional": "選填",
-    squadcast: "Squadcast",
-    SendKey: "SendKey",
-    "SMSManager API Docs": "SMSManager API 文件 ",
-    "Gateway Type": "閘道類型",
-    SMSManager: "SMSManager",
-    "You can divide numbers with": "若要除數,您可以使用",
-    "or": "或是",
-    recurringInterval: "間隔",
-    "Recurring": "週期性",
-    strategyManual: "手動切換使用中/非使用中",
-    warningTimezone: "正在使用伺服器的時區",
-    weekdayShortMon: "一",
-    weekdayShortTue: "二",
-    weekdayShortWed: "三",
-    weekdayShortThu: "四",
-    weekdayShortFri: "五",
-    weekdayShortSat: "六",
-    weekdayShortSun: "日",
-    dayOfWeek: "每周特定一天",
-    dayOfMonth: "每月特定一天",
-    lastDay: "最後一天",
-    lastDay1: "每月的最後一天",
-    lastDay2: "每月的倒數第二天",
-    lastDay3: "每月的倒數第三天",
-    lastDay4: "每月的倒數第四天",
-    "No Maintenance": "無維護",
-    pauseMaintenanceMsg: "您確定要暫停嗎?",
-    "maintenanceStatus-under-maintenance": "維護中",
-    "maintenanceStatus-inactive": "非使用中",
-    "maintenanceStatus-scheduled": "已排程",
-    "maintenanceStatus-ended": "已結束",
-    "maintenanceStatus-unknown": "未知",
-    "Display Timezone": "顯示時區",
-    "Server Timezone": "伺服器時區",
-    statusPageMaintenanceEndDate: "結束",
-    IconUrl: "圖示網址",
-    "Enable DNS Cache": "啟用 DNS 快取",
-    Enable: "啟用",
-    Disable: "停用",
-    dnsCacheDescription: "在某些 IPv6 環境可能會無法運作,如果您遇到任何問題,請停用。",
-    "Single Maintenance Window": "單一維護時段",
-    "Maintenance Time Window of a Day": "每日的維護時段",
-    "Effective Date Range": "有效的日期範圍",
-    "Schedule Maintenance": "排程維護",
-    "Date and Time": "時間和日期",
-    "DateTime Range": "DateTime 範圍",
-    Strategy: "策略",
-    "Free Mobile User Identifier": "Free Mobile User Identifier",
-    "Free Mobile API Key": "Free Mobile API 金鑰",
-    "Enable TLS": "啟用 TLS",
-    "Proto Service Name": "Proto 服務名稱",
-    "Proto Method": "Proto 方式",
-    "Proto Content": "Proto 內容",
-    Economy: "節約",
-    Lowcost: "低費率",
-    high: "高",
-    "General Monitor Type": "一般監測器類型",
-    "Passive Monitor Type": "被動監測器類型",
-    "Specific Monitor Type": "指定監測器類型",
-};

From f125534829fabe68f5bdd4b91b1dc415e40b0b4c Mon Sep 17 00:00:00 2001
From: 401Unauthorized <redme@live.cn>
Date: Tue, 24 Jan 2023 16:02:43 +0800
Subject: [PATCH 485/803] remove WIP

---
 .github/PULL_REQUEST_TEMPLATE.md | 1 -
 README.md                        | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 6bbbf1fd..87e7f5ff 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -16,7 +16,6 @@ Please delete any options that are not relevant.
 - User interface (UI)
 - New feature (non-breaking change which adds functionality)
 - Breaking change (fix or feature that would cause existing functionality to not work as expected)
-- ~Translation update~ (Do not accept now, as migration to [Weblate](https://weblate.kuma.pet) is WIP, see #2611)
 - Other
 - This change requires a documentation update
 
diff --git a/README.md b/README.md
index 1bb9b02a..15a36bb9 100644
--- a/README.md
+++ b/README.md
@@ -171,7 +171,7 @@ Check out the latest beta release here: https://github.com/louislam/uptime-kuma/
 If you want to report a bug or request a new feature, feel free to open a [new issue](https://github.com/louislam/uptime-kuma/issues).
 
 ### Translations
-If you want to translate Uptime Kuma into your language, please visit [Weblate](https://weblate.kuma.pet) (WIP, see #2611).
+If you want to translate Uptime Kuma into your language, please visit [Weblate](https://weblate.kuma.pet).
 
 Feel free to correct my grammar in this README, source code, or wiki, as my mother language is not English and my grammar is not that great.
 

From 434bff671468ba00fc0e99c2f42d6ffefd6cdc5e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 24 Jan 2023 16:52:36 +0800
Subject: [PATCH 486/803] Add `Help` language key

---
 src/lang/en.json | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 22f61f1b..e10b94d5 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -680,5 +680,6 @@
     "Specific Monitor Type": "Specific Monitor Type",
     "dataRetentionTimeError": "Retention period must be 0 or greater",
     "infiniteRetention": "Set to 0 for infinite retention.",
-    "confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted."
-}
\ No newline at end of file
+    "confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
+    "Help": "Help"
+}

From bf5ac3fc19d82a38edc436018e7f1e5ccbb6e7ed Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 24 Jan 2023 16:55:16 +0800
Subject: [PATCH 487/803] Update CONTRIBUTING.md

---
 CONTRIBUTING.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 5cfa93e2..f75b312b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -33,7 +33,6 @@ Here are some references:
 
 ✅ Usually Accept:
 - Bug/Security fix
-- Translations
 - Adding notification providers
 
 ⚠️ Discussion First
@@ -41,6 +40,7 @@ Here are some references:
 - New features
 
 ❌ Won't Merge
+- Translations (You can now translate on https://weblate.kuma.pet)
 - Do not pass auto test
 - Any breaking changes
 - Duplicated pull request

From 417efd9711f266aeeb2d5a339f8544b90e162fa4 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 24 Jan 2023 18:13:31 +0800
Subject: [PATCH 488/803] Update README.md

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

diff --git a/README.md b/README.md
index 15a36bb9..771b3a64 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,9 @@
 # Uptime Kuma
 
 <a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/stars/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/pulls/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/v/louislam/uptime-kuma/latest?label=docker%20image%20ver." /></a> <a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/last-commit/louislam/uptime-kuma" /></a>  <a target="_blank" href="https://opencollective.com/uptime-kuma"><img src="https://opencollective.com/uptime-kuma/total/badge.svg?label=Open%20Collective%20Backers&color=brightgreen" /></a>
-[![GitHub Sponsors](https://img.shields.io/github/sponsors/louislam?label=GitHub%20Sponsors)](https://github.com/sponsors/louislam)
+[![GitHub Sponsors](https://img.shields.io/github/sponsors/louislam?label=GitHub%20Sponsors)](https://github.com/sponsors/louislam) <a href="https://weblate.kuma.pet/engage/uptime-kuma/">
+<img src="https://weblate.kuma.pet/widgets/uptime-kuma/-/svg-badge.svg" alt="Translation status" />
+</a>
 
 <div align="center" width="100%">
     <img src="./public/icon.svg" width="128" alt="" />

From f155ec9ba884607e889402fefbb1935adbd74d48 Mon Sep 17 00:00:00 2001
From: Thomas Spalinger <spali@spali.ch>
Date: Tue, 24 Jan 2023 09:14:16 +0000
Subject: [PATCH 489/803] remember prometheus instance and expose it in
 preperation for #2491,#680 and #898

---
 server/model/monitor.js | 14 +++++++-------
 server/server.js        |  3 ---
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 28fae9e6..53b7985e 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -200,7 +200,7 @@ class Monitor extends BeanModel {
         let previousBeat = null;
         let retries = 0;
 
-        let prometheus = new Prometheus(this);
+        this.prometheus = new Prometheus(this);
 
         const beat = async () => {
 
@@ -729,7 +729,7 @@ class Monitor extends BeanModel {
             await R.store(bean);
 
             log.debug("monitor", `[${this.name}] prometheus.update`);
-            prometheus.update(bean, tlsInfo);
+            this.prometheus.update(bean, tlsInfo);
 
             previousBeat = bean;
 
@@ -814,15 +814,15 @@ class Monitor extends BeanModel {
         clearTimeout(this.heartbeatInterval);
         this.isStop = true;
 
-        this.prometheus().remove();
+        this.prometheus.remove();
     }
 
     /**
-     * Get a new prometheus instance
-     * @returns {Prometheus}
+     * Get prometheus instance
+     * @returns {Prometheus|undefined}
      */
-    prometheus() {
-        return new Prometheus(this);
+    getPrometheus() {
+        return this.prometheus;
     }
 
     /**
diff --git a/server/server.js b/server/server.js
index f43008e2..4574292b 100644
--- a/server/server.js
+++ b/server/server.js
@@ -674,9 +674,6 @@ let needSetup = false;
                     throw new Error("Permission denied.");
                 }
 
-                // Reset Prometheus labels
-                server.monitorList[monitor.id]?.prometheus()?.remove();
-
                 bean.name = monitor.name;
                 bean.type = monitor.type;
                 bean.url = monitor.url;

From 2408b1bffa68b95fd5bbdaf7abfed7c049bf1477 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 24 Jan 2023 19:20:35 +0800
Subject: [PATCH 490/803] Update README.md

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

diff --git a/README.md b/README.md
index 771b3a64..6647dcda 100644
--- a/README.md
+++ b/README.md
@@ -28,7 +28,7 @@ It is a temporary live demo, all data will be deleted after 10 minutes. Use the
 * Fancy, Reactive, Fast UI/UX
 * Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and [90+ notification services, click here for the full list](https://github.com/louislam/uptime-kuma/tree/master/src/components/notifications)
 * 20 second intervals
-* [Multi Languages](https://github.com/louislam/uptime-kuma/tree/master/src/languages)
+* [Multi Languages](https://github.com/louislam/uptime-kuma/tree/master/src/lang)
 * Multiple status pages
 * Map status pages to specific domains
 * Ping chart

From 83e0401dd8a7bbc32f6e60d8f13aab45ca387b28 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 24 Jan 2023 23:03:01 +0800
Subject: [PATCH 491/803] Show game list for GameDig monitor

---
 server/model/monitor.js                       |  2 +-
 .../socket-handlers/general-socket-handler.js | 31 ++++++++++++++
 src/pages/EditMonitor.vue                     | 42 +++++++++++++++++--
 3 files changed, 70 insertions(+), 5 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 62d788a9..2fcb0875 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -502,7 +502,7 @@ class Monitor extends BeanModel {
                         bean.status = UP;
                         bean.ping = state.ping;
                     } catch (e) {
-                        throw new Error("Server is offline");
+                        throw new Error(e.message);
                     }
                 } else if (this.type === "docker") {
                     log.debug(`[${this.name}] Prepare Options for Axios`);
diff --git a/server/socket-handlers/general-socket-handler.js b/server/socket-handlers/general-socket-handler.js
index 700b4a38..11b47a5b 100644
--- a/server/socket-handlers/general-socket-handler.js
+++ b/server/socket-handlers/general-socket-handler.js
@@ -2,6 +2,30 @@ const { log } = require("../../src/util");
 const { Settings } = require("../settings");
 const { sendInfo } = require("../client");
 const { checkLogin } = require("../util-server");
+const GameResolver = require("gamedig/lib/GameResolver");
+
+let gameResolver = new GameResolver();
+let gameList = null;
+
+/**
+ * Get a game list via GameDig
+ * @returns {any[]}
+ */
+function getGameList() {
+    if (!gameList) {
+        gameList = gameResolver._readGames().games.sort((a, b) => {
+            if ( a.pretty < b.pretty ) {
+                return -1;
+            }
+            if ( a.pretty > b.pretty ) {
+                return 1;
+            }
+            return 0;
+        });
+    } else {
+        return gameList;
+    }
+}
 
 module.exports.generalSocketHandler = (socket, server) => {
 
@@ -17,4 +41,11 @@ module.exports.generalSocketHandler = (socket, server) => {
         }
     });
 
+    socket.on("getGameList", async (callback) => {
+        callback({
+            ok: true,
+            gameList: getGameList(),
+        });
+    });
+
 };
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 3003f3a9..16ecb887 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -114,7 +114,11 @@
                             <!-- GameDig only -->
                             <div v-if="monitor.type === 'gamedig'" class="my-3">
                                 <label for="game" class="form-label"> {{ $t("Game") }} </label>
-                                <input id="game" v-model="monitor.game" type="text" class="form-control" required>
+                                <select id="game" v-model="monitor.game" class="form-select" required>
+                                    <option v-for="game in gameList" :key="game.keys[0]" :value="game.keys[0]">
+                                        {{ game.pretty }}
+                                    </option>
+                                </select>
                             </div>
 
                             <!-- Hostname -->
@@ -636,7 +640,8 @@ export default {
             acceptedStatusCodeOptions: [],
             dnsresolvetypeOptions: [],
             ipOrHostnameRegexPattern: hostNameRegexPattern(),
-            mqttIpOrHostnameRegexPattern: hostNameRegexPattern(true)
+            mqttIpOrHostnameRegexPattern: hostNameRegexPattern(true),
+            gameList: null,
         };
     },
 
@@ -713,7 +718,18 @@ message HealthCheckResponse {
 {
     "HeaderName": "HeaderValue"
 }` ]);
-        }
+        },
+
+        currentGameObject() {
+            if (this.gameList) {
+                for (let game of this.gameList) {
+                    if (game.keys[0] === this.monitor.game) {
+                        return game;
+                    }
+                }
+            }
+            return null;
+        },
 
     },
     watch: {
@@ -757,6 +773,24 @@ message HealthCheckResponse {
                     this.monitor.port = undefined;
                 }
             }
+
+            // Get the game list from server
+            if (this.monitor.type === "gamedig") {
+                this.$root.getSocket().emit("getGameList", (res) => {
+                    if (res.ok) {
+                        this.gameList = res.gameList;
+                    } else {
+                        toast.error(res.msg);
+                    }
+                });
+            }
+        },
+
+        currentGameObject(newGameObject, previousGameObject) {
+            if (!this.monitor.port || (previousGameObject && previousGameObject.options.port === this.monitor.port)) {
+                this.monitor.port = newGameObject.options.port;
+            }
+            this.monitor.game = newGameObject.keys[0];
         }
 
     },
@@ -947,7 +981,7 @@ message HealthCheckResponse {
         // Enable it if the Docker Host is added in EditMonitor.vue
         addedDockerHost(id) {
             this.monitor.docker_host = id;
-        }
+        },
     },
 };
 </script>

From e637fa4e402a15c01147226afc3d7a6c870aae11 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 24 Jan 2023 23:09:24 +0800
Subject: [PATCH 492/803] Add language key

---
 src/lang/en.json | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index e10b94d5..ca485a8a 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -681,5 +681,6 @@
     "dataRetentionTimeError": "Retention period must be 0 or greater",
     "infiniteRetention": "Set to 0 for infinite retention.",
     "confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
-    "Help": "Help"
+    "Help": "Help",
+    "Game": "Game"
 }

From c4c720027c5d58dba0386f128c95b15b01cfdd14 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Tue, 24 Jan 2023 23:40:24 +0800
Subject: [PATCH 493/803] Fix: Use correct log call format

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 2fcb0875..2e3bf66e 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -505,7 +505,7 @@ class Monitor extends BeanModel {
                         throw new Error(e.message);
                     }
                 } else if (this.type === "docker") {
-                    log.debug(`[${this.name}] Prepare Options for Axios`);
+                    log.debug("monitor", `[${this.name}] Prepare Options for Axios`);
 
                     const dockerHost = await R.load("docker_host", this.docker_host);
 
@@ -531,7 +531,7 @@ class Monitor extends BeanModel {
                         options.baseURL = DockerHost.patchDockerURL(dockerHost._dockerDaemon);
                     }
 
-                    log.debug(`[${this.name}] Axios Request`);
+                    log.debug("monitor", `[${this.name}] Axios Request`);
                     let res = await axios.request(options);
                     if (res.data.State.Running) {
                         bean.status = UP;

From 9cc3bd0de416bb12dcb1b156953b203b2fcd3fa8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 25 Jan 2023 00:19:54 +0800
Subject: [PATCH 494/803] Avoid the multiple queries for Gamedig monitor

---
 server/model/monitor.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 2fcb0875..d247fdf1 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -495,7 +495,8 @@ class Monitor extends BeanModel {
                         const state = await Gamedig.query({
                             type: this.game,
                             host: this.hostname,
-                            port: this.port
+                            port: this.port,
+                            givenPortOnly: true,
                         });
 
                         bean.msg = state.name;

From 2a86b43d69fd6d0a2e7c1fe26e5e4095d1b9cdd8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 25 Jan 2023 01:10:25 +0800
Subject: [PATCH 495/803] Move notification related language keys to the
 bottom.

---
 src/lang/en.json | 552 +++++++++++++++++++++++------------------------
 1 file changed, 276 insertions(+), 276 deletions(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index ca485a8a..1493a7b0 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -1,56 +1,14 @@
 {
     "languageName": "English",
-    "checkEverySecond": "Check every {0} seconds",
-    "retryCheckEverySecond": "Retry every {0} seconds",
-    "resendEveryXTimes": "Resend every {0} times",
-    "resendDisabled": "Resend disabled",
-    "retriesDescription": "Maximum retries before the service is marked as down and a notification is sent",
-    "ignoreTLSError": "Ignore TLS/SSL error for HTTPS websites",
-    "upsideDownModeDescription": "Flip the status upside down. If the service is reachable, it is DOWN.",
-    "maxRedirectDescription": "Maximum number of redirects to follow. Set to 0 to disable redirects.",
-    "enableGRPCTls": "Allow to send gRPC request with TLS connection",
-    "grpcMethodDescription": "Method name is convert to cammelCase format such as sayHello, check, etc.",
-    "acceptedStatusCodesDescription": "Select status codes which are considered as a successful response.",
-    "Maintenance": "Maintenance",
-    "statusMaintenance": "Maintenance",
-    "Schedule maintenance": "Schedule maintenance",
-    "Affected Monitors": "Affected Monitors",
-    "Pick Affected Monitors...": "Pick Affected Monitors...",
-    "Start of maintenance": "Start of maintenance",
-    "All Status Pages": "All Status Pages",
-    "Select status pages...": "Select status pages...",
-    "recurringIntervalMessage": "Run once every day | Run once every {0} days",
-    "affectedMonitorsDescription": "Select monitors that are affected by current maintenance",
-    "affectedStatusPages": "Show this maintenance message on selected status pages",
-    "atLeastOneMonitor": "Select at least one affected monitor",
-    "passwordNotMatchMsg": "The repeat password does not match.",
-    "notificationDescription": "Notifications must be assigned to a monitor to function.",
-    "keywordDescription": "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
-    "pauseDashboardHome": "Pause",
-    "deleteMonitorMsg": "Are you sure want to delete this monitor?",
-    "deleteMaintenanceMsg": "Are you sure want to delete this maintenance?",
-    "deleteNotificationMsg": "Are you sure want to delete this notification for all monitors?",
-    "dnsPortDescription": "DNS server port. Defaults to 53. You can change the port at any time.",
-    "resolverserverDescription": "Cloudflare is the default server. You can change the resolver server anytime.",
-    "rrtypeDescription": "Select the RR type you want to monitor",
-    "pauseMonitorMsg": "Are you sure want to pause?",
-    "enableDefaultNotificationDescription": "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
-    "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
-    "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
-    "confirmClearStatisticsMsg": "Are you sure you want to delete ALL statistics?",
-    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    "confirmImportMsg": "Are you sure you want to import the backup? Please verify you've selected the correct import option.",
-    "twoFAVerifyLabel": "Please enter your token to verify 2FA:",
-    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
-    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
-    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
     "Settings": "Settings",
     "Dashboard": "Dashboard",
+    "Help": "Help",
     "New Update": "New Update",
     "Language": "Language",
     "Appearance": "Appearance",
     "Theme": "Theme",
     "General": "General",
+    "Game": "Game",
     "Primary Base URL": "Primary Base URL",
     "Version": "Version",
     "Check Update On GitHub": "Check Update On GitHub",
@@ -61,7 +19,13 @@
     "Up": "Up",
     "Down": "Down",
     "Pending": "Pending",
+    "statusMaintenance": "Maintenance",
+    "Maintenance": "Maintenance",
     "Unknown": "Unknown",
+    "General Monitor Type": "General Monitor Type",
+    "Passive Monitor Type": "Passive Monitor Type",
+    "Specific Monitor Type": "Specific Monitor Type",
+    "pauseDashboardHome": "Pause",
     "Pause": "Pause",
     "Name": "Name",
     "Status": "Status",
@@ -92,6 +56,14 @@
     "Heartbeat Retry Interval": "Heartbeat Retry Interval",
     "Resend Notification if Down X times consequently": "Resend Notification if Down X times consequently",
     "Advanced": "Advanced",
+    "checkEverySecond": "Check every {0} seconds",
+    "retryCheckEverySecond": "Retry every {0} seconds",
+    "resendEveryXTimes": "Resend every {0} times",
+    "resendDisabled": "Resend disabled",
+    "retriesDescription": "Maximum retries before the service is marked as down and a notification is sent",
+    "ignoreTLSError": "Ignore TLS/SSL error for HTTPS websites",
+    "upsideDownModeDescription": "Flip the status upside down. If the service is reachable, it is DOWN.",
+    "maxRedirectDescription": "Maximum number of redirects to follow. Set to 0 to disable redirects.",
     "Upside Down Mode": "Upside Down Mode",
     "Max. Redirects": "Max. Redirects",
     "Accepted Status Codes": "Accepted Status Codes",
@@ -157,9 +129,12 @@
     "Events": "Events",
     "Heartbeats": "Heartbeats",
     "Auto Get": "Auto Get",
-    "backupDescription": "You can backup all monitors and notifications into a JSON file.",
-    "backupDescription2": "Note: history and event data is not included.",
-    "backupDescription3": "Sensitive data such as notification tokens are included in the export file; please store export securely.",
+    "Schedule maintenance": "Schedule maintenance",
+    "Affected Monitors": "Affected Monitors",
+    "Pick Affected Monitors...": "Pick Affected Monitors...",
+    "Start of maintenance": "Start of maintenance",
+    "All Status Pages": "All Status Pages",
+    "Select status pages...": "Select status pages...",
     "alertNoFile": "Please select a file to import.",
     "alertWrongFileType": "Please select a JSON file.",
     "Clear all statistics": "Clear all Statistics",
@@ -210,15 +185,6 @@
     "defaultNotificationName": "My {notification} Alert ({number})",
     "here": "here",
     "Required": "Required",
-    "telegram": "Telegram",
-    "ZohoCliq": "ZohoCliq",
-    "Bot Token": "Bot Token",
-    "wayToGetTelegramToken": "You can get a token from {0}.",
-    "Chat ID": "Chat ID",
-    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
-    "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
-    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
-    "chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
     "webhook": "Webhook",
     "Post URL": "Post URL",
     "Content Type": "Content Type",
@@ -226,108 +192,14 @@
     "webhookFormDataDesc": "{multipart} is good for PHP. The JSON will need to be parsed with {decodeFunction}",
     "webhookAdditionalHeadersTitle": "Additional Headers",
     "webhookAdditionalHeadersDesc": "Sets additional headers sent with the webhook.",
-    "smtp": "Email (SMTP)",
-    "secureOptionNone": "None / STARTTLS (25, 587)",
-    "secureOptionTLS": "TLS (465)",
-    "Ignore TLS Error": "Ignore TLS Error",
-    "From Email": "From Email",
-    "emailCustomSubject": "Custom Subject",
-    "To Email": "To Email",
-    "smtpCC": "CC",
-    "smtpBCC": "BCC",
-    "discord": "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> Create Webhook",
-    "Bot Display Name": "Bot Display Name",
-    "Prefix Custom Message": "Prefix Custom Message",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
-    "teams": "Microsoft Teams",
     "Webhook URL": "Webhook URL",
-    "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
-    "wayToGetZohoCliqURL": "You can learn how to create a webhook URL {0}.",
-    "signal": "Signal",
-    "Number": "Number",
-    "Recipients": "Recipients",
-    "needSignalAPI": "You need to have a signal client with REST API.",
-    "wayToCheckSignalURL": "You can check this URL to view how to set one up:",
-    "signalImportant": "IMPORTANT: You cannot mix groups and numbers in recipients!",
-    "gotify": "Gotify",
     "Application Token": "Application Token",
     "Server URL": "Server URL",
     "Priority": "Priority",
-    "slack": "Slack",
-    "Icon Emoji": "Icon Emoji",
-    "Channel Name": "Channel Name",
-    "Uptime Kuma URL": "Uptime Kuma URL",
-    "aboutWebhooks": "More info about Webhooks on: {0}",
-    "aboutChannelName": "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
-    "aboutKumaURL": "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
     "emojiCheatSheet": "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.Chat",
-    "pushover": "Pushover",
-    "pushy": "Pushy",
-    "PushByTechulus": "Push by Techulus",
-    "octopush": "Octopush",
-    "promosms": "PromoSMS",
-    "clicksendsms": "ClickSend SMS",
-    "lunasea": "LunaSea",
-    "apprise": "Apprise (Support 50+ Notification services)",
-    "GoogleChat": "Google Chat (Google Workspace only)",
-    "pushbullet": "Pushbullet",
-    "Kook": "Kook",
-    "wayToGetKookBotToken": "Create application and get your bot token at {0}",
-    "wayToGetKookGuildID": "Switch on 'Developer Mode' in Kook setting, and right click the guild to get its ID",
-    "Guild ID": "Guild ID",
-    "line": "Line Messenger",
-    "mattermost": "Mattermost",
-    "User Key": "User Key",
-    "Device": "Device",
-    "Message Title": "Message Title",
-    "Notification Sound": "Notification Sound",
-    "More info on:": "More info on: {0}",
-    "pushoverDesc1": "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
-    "pushoverDesc2": "If you want to send notifications to different devices, fill out Device field.",
-    "SMS Type": "SMS Type",
-    "octopushTypePremium": "Premium (Fast - recommended for alerting)",
-    "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
-    "checkPrice": "Check {0} prices:",
-    "apiCredentials": "API credentials",
-    "octopushLegacyHint": "Do you use the legacy version of Octopush (2011-2020) or the new version?",
-    "Check octopush prices": "Check octopush prices {0}.",
-    "octopushPhoneNumber": "Phone number (intl format, eg : +33612345678) ",
-    "octopushSMSSender": "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
-    "LunaSea Device ID": "LunaSea Device ID",
-    "Apprise URL": "Apprise URL",
-    "Example:": "Example: {0}",
-    "Read more:": "Read more: {0}",
-    "Status:": "Status: {0}",
     "Read more": "Read more",
     "appriseInstalled": "Apprise is installed.",
     "appriseNotInstalled": "Apprise is not installed. {0}",
-    "Access Token": "Access Token",
-    "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
-    "lineDevConsoleTo": "Line Developers Console - {0}",
-    "Basic Settings": "Basic Settings",
-    "User ID": "User ID",
-    "Messaging API": "Messaging API",
-    "wayToGetLineChannelToken": "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
-    "Icon URL": "Icon URL",
-    "aboutIconURL": "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
-    "aboutMattermostChannelName": "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
-    "matrix": "Matrix",
-    "promosmsTypeEco": "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
-    "promosmsTypeFlash": "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
-    "promosmsTypeFull": "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
-    "promosmsTypeSpeed": "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
-    "promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes)",
-    "promosmsSMSSender": "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "promosmsAllowLongSMS": "Allow long SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
-    "matrixHomeserverURL": "Homeserver URL (with http(s):// and optionally port)",
-    "Internal Room Id": "Internal Room ID",
-    "matrixDesc1": "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
-    "matrixDesc2": "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
     "Method": "Method",
     "Body": "Body",
     "Headers": "Headers",
@@ -386,48 +258,9 @@
     "Cancel": "Cancel",
     "Powered by": "Powered by",
     "shrinkDatabaseDescription": "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.",
-    "serwersms": "SerwerSMS.pl",
-    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
-    "serwersmsAPIPassword": "API Password",
-    "serwersmsPhoneNumber": "Phone number",
-    "serwersmsSenderName": "SMS Sender Name (registered via customer portal)",
-    "smseagle": "SMSEagle",
-    "smseagleTo": "Phone number(s)",
-    "smseagleGroup": "Phonebook group name(s)",
-    "smseagleContact": "Phonebook contact name(s)",
-    "smseagleRecipientType": "Recipient type",
-    "smseagleRecipient": "Recipient(s) (multiple must be separated with comma)",
-    "smseagleToken": "API Access token",
-    "smseagleUrl": "Your SMSEagle device URL",
-    "smseagleEncoding": "Send as Unicode",
-    "smseaglePriority": "Message priority (0-9, default = 0)",
-    "stackfield": "Stackfield",
     "Customize": "Customize",
     "Custom Footer": "Custom Footer",
     "Custom CSS": "Custom CSS",
-    "smtpDkimSettings": "DKIM Settings",
-    "smtpDkimDesc": "Please refer to the Nodemailer DKIM {0} for usage.",
-    "documentation": "documentation",
-    "smtpDkimDomain": "Domain Name",
-    "smtpDkimKeySelector": "Key Selector",
-    "smtpDkimPrivateKey": "Private Key",
-    "smtpDkimHashAlgo": "Hash Algorithm (Optional)",
-    "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
-    "smtpDkimskipFields": "Header Keys not to sign (Optional)",
-    "wayToGetPagerDutyKey": "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
-    "do nothing": "do nothing",
-    "auto acknowledged": "auto acknowledged",
-    "auto resolve": "auto resolve",
-    "gorush": "Gorush",
-    "alerta": "Alerta",
-    "alertaApiEndpoint": "API Endpoint",
-    "alertaEnvironment": "Environment",
-    "alertaApiKey": "API Key",
-    "alertaAlertState": "Alert State",
-    "alertaRecoverState": "Recover State",
     "deleteStatusPageMsg": "Are you sure want to delete this status page?",
     "Proxies": "Proxies",
     "default": "Default",
@@ -440,31 +273,6 @@
     "Certificate Chain": "Certificate Chain",
     "Valid": "Valid",
     "Invalid": "Invalid",
-    "AccessKeyId": "AccessKey ID",
-    "SecretAccessKey": "AccessKey Secret",
-    "PhoneNumbers": "PhoneNumbers",
-    "TemplateCode": "TemplateCode",
-    "SignName": "SignName",
-    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    "WebHookUrl": "WebHookUrl",
-    "SecretKey": "SecretKey",
-    "For safety, must use secret key": "For safety, must use secret key",
-    "Device Token": "Device Token",
-    "Platform": "Platform",
-    "iOS": "iOS",
-    "Android": "Android",
-    "Huawei": "Huawei",
-    "High": "High",
-    "Retry": "Retry",
-    "Topic": "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
-    "Setup Proxy": "Setup Proxy",
-    "Proxy Protocol": "Proxy Protocol",
-    "Proxy Server": "Proxy Server",
-    "Proxy server has authentication": "Proxy server has authentication",
     "User": "User",
     "Installed": "Installed",
     "Not installed": "Not installed",
@@ -508,14 +316,6 @@
     "Domain Name Expiry Notification": "Domain Name Expiry Notification",
     "Proxy": "Proxy",
     "Date Created": "Date Created",
-    "HomeAssistant": "Home Assistant",
-    "onebotHttpAddress": "OneBot HTTP Address",
-    "onebotMessageType": "OneBot Message Type",
-    "onebotGroupMessage": "Group",
-    "onebotPrivateMessage": "Private",
-    "onebotUserOrGroupId": "Group/User ID",
-    "onebotSafetyTips": "For safety, must set access token",
-    "PushDeer Key": "PushDeer Key",
     "Footer Text": "Footer Text",
     "Show Powered By": "Show Powered By",
     "Domain Names": "Domain Names",
@@ -530,41 +330,6 @@
     "Certificate Expiry Notification": "Certificate Expiry Notification",
     "API Username": "API Username",
     "API Key": "API Key",
-    "Recipient Number": "Recipient Number",
-    "From Name/Number": "From Name/Number",
-    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
-    "endpoint": "endpoint",
-    "octopushAPIKey": "\"API key\" from HTTP API credentials in control panel",
-    "octopushLogin": "\"Login\" from HTTP API credentials in control panel",
-    "promosmsLogin": "API Login Name",
-    "promosmsPassword": "API Password",
-    "pushoversounds pushover": "Pushover (default)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
-    "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
-    "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
-    "pushoversounds alien": "Alien Alarm (long)",
-    "pushoversounds climb": "Climb (long)",
-    "pushoversounds persistent": "Persistent (long)",
-    "pushoversounds echo": "Pushover Echo (long)",
-    "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
-    "pushoversounds none": "None (silent)",
-    "pushyAPIKey": "Secret API Key",
-    "pushyToken": "Device token",
     "Show update if available": "Show update if available",
     "Also check beta release": "Also check beta release",
     "Using a Reverse Proxy?": "Using a Reverse Proxy?",
@@ -577,7 +342,6 @@
     "Retype the address.": "Retype the address.",
     "Go back to the previous page.": "Go back to the previous page.",
     "Coming Soon": "Coming Soon",
-    "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
     "Connection String": "Connection String",
     "Query": "Query",
     "settingsCertificateExpiry": "TLS Certificate Expiry",
@@ -592,9 +356,17 @@
     "Container Name / ID": "Container Name / ID",
     "Docker Host": "Docker Host",
     "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
     "Domain": "Domain",
     "Workstation": "Workstation",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Bot Token",
+    "wayToGetTelegramToken": "You can get a token from {0}.",
+    "Chat ID": "Chat ID",
+    "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
+    "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
+    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
+    "chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
     "disableCloudflaredNoAuthMsg": "You are in No Auth mode, a password is not required.",
     "trustProxyDescription": "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
     "wayToGetLineNotifyToken": "You can get an access token from {0}",
@@ -612,19 +384,10 @@
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
     "Frontend Version": "Frontend Version",
     "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
-    "Base URL": "Base URL",
-    "goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
-    "goAlertIntegrationKeyInfo": "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
-    "goAlert": "GoAlert",
     "backupOutdatedWarning": "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
     "backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.",
     "Optional": "Optional",
     "squadcast": "Squadcast",
-    "SendKey": "SendKey",
-    "SMSManager API Docs": "SMSManager API Docs ",
-    "Gateway Type": "Gateway Type",
-    "SMSManager": "SMSManager",
-    "You can divide numbers with": "You can divide numbers with",
     "or": "or",
     "recurringInterval": "Interval",
     "Recurring": "Recurring",
@@ -665,6 +428,143 @@
     "Schedule Maintenance": "Schedule Maintenance",
     "Date and Time": "Date and Time",
     "DateTime Range": "DateTime Range",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ignore TLS Error",
+    "From Email": "From Email",
+    "emailCustomSubject": "Custom Subject",
+    "To Email": "To Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> Create Webhook",
+    "Bot Display Name": "Bot Display Name",
+    "Prefix Custom Message": "Prefix Custom Message",
+    "Hello @everyone is...": "Hello {'@'}everyone is...",
+    "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
+    "wayToGetZohoCliqURL": "You can learn how to create a webhook URL {0}.",
+    "needSignalAPI": "You need to have a signal client with REST API.",
+    "wayToCheckSignalURL": "You can check this URL to view how to set one up:",
+    "Number": "Number",
+    "Recipients": "Recipients",
+    "Access Token": "Access Token",
+    "Channel access token": "Channel access token",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "Basic Settings",
+    "User ID": "User ID",
+    "Messaging API": "Messaging API",
+    "wayToGetLineChannelToken": "First access the {0}, create a provider and channel (Messaging API), then you can get the channel access token and user ID from the above mentioned menu items.",
+    "Icon URL": "Icon URL",
+    "aboutIconURL": "You can provide a link to a picture in \"Icon URL\" to override the default profile picture. Will not be used if Icon Emoji is set.",
+    "aboutMattermostChannelName": "You can override the default channel that the Webhook posts to by entering the channel name into \"Channel Name\" field. This needs to be enabled in the Mattermost Webhook settings. Ex: #other-channel",
+    "dataRetentionTimeError": "Retention period must be 0 or greater",
+    "infiniteRetention": "Set to 0 for infinite retention.",
+    "confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
+    "enableGRPCTls": "Allow to send gRPC request with TLS connection",
+    "grpcMethodDescription": "Method name is convert to cammelCase format such as sayHello, check, etc.",
+    "acceptedStatusCodesDescription": "Select status codes which are considered as a successful response.",
+    "deleteMonitorMsg": "Are you sure want to delete this monitor?",
+    "deleteMaintenanceMsg": "Are you sure want to delete this maintenance?",
+    "deleteNotificationMsg": "Are you sure want to delete this notification for all monitors?",
+    "dnsPortDescription": "DNS server port. Defaults to 53. You can change the port at any time.",
+    "resolverserverDescription": "Cloudflare is the default server. You can change the resolver server anytime.",
+    "rrtypeDescription": "Select the RR type you want to monitor",
+    "pauseMonitorMsg": "Are you sure want to pause?",
+    "enableDefaultNotificationDescription": "This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor.",
+    "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
+    "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
+    "confirmClearStatisticsMsg": "Are you sure you want to delete ALL statistics?",
+    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
+    "confirmImportMsg": "Are you sure you want to import the backup? Please verify you've selected the correct import option.",
+    "twoFAVerifyLabel": "Please enter your token to verify 2FA:",
+    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
+    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
+    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "recurringIntervalMessage": "Run once every day | Run once every {0} days",
+    "affectedMonitorsDescription": "Select monitors that are affected by current maintenance",
+    "affectedStatusPages": "Show this maintenance message on selected status pages",
+    "atLeastOneMonitor": "Select at least one affected monitor",
+    "passwordNotMatchMsg": "The repeat password does not match.",
+    "notificationDescription": "Notifications must be assigned to a monitor to function.",
+    "keywordDescription": "Search keyword in plain HTML or JSON response. The search is case-sensitive.",
+    "backupDescription": "You can backup all monitors and notifications into a JSON file.",
+    "backupDescription2": "Note: history and event data is not included.",
+    "backupDescription3": "Sensitive data such as notification tokens are included in the export file; please store export securely.",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "\"API key\" from HTTP API credentials in control panel",
+    "octopushLogin": "\"Login\" from HTTP API credentials in control panel",
+    "promosmsLogin": "API Login Name",
+    "promosmsPassword": "API Password",
+    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "pushyToken": "Device token",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Push by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "GoogleChat": "Google Chat (Google Workspace only)",
+    "pushbullet": "Pushbullet",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Create application and get your bot token at {0}",
+    "wayToGetKookGuildID": "Switch on 'Developer Mode' in Kook setting, and right click the guild to get its ID",
+    "Guild ID": "Guild ID",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "User Key",
+    "Device": "Device",
+    "Message Title": "Message Title",
+    "Notification Sound": "Notification Sound",
+    "More info on:": "More info on: {0}",
+    "pushoverDesc1": "Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.",
+    "pushoverDesc2": "If you want to send notifications to different devices, fill out Device field.",
+    "SMS Type": "SMS Type",
+    "octopushTypePremium": "Premium (Fast - recommended for alerting)",
+    "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
+    "checkPrice": "Check {0} prices:",
+    "apiCredentials": "API credentials",
+    "octopushLegacyHint": "Do you use the legacy version of Octopush (2011-2020) or the new version?",
+    "Check octopush prices": "Check octopush prices {0}.",
+    "octopushPhoneNumber": "Phone number (intl format, eg : +33612345678) ",
+    "octopushSMSSender": "SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea Device ID",
+    "Apprise URL": "Apprise URL",
+    "Example:": "Example: {0}",
+    "Read more:": "Read more: {0}",
+    "Status:": "Status: {0}",
     "Strategy": "Strategy",
     "Free Mobile User Identifier": "Free Mobile User Identifier",
     "Free Mobile API Key": "Free Mobile API Key",
@@ -675,12 +575,112 @@
     "Economy": "Economy",
     "Lowcost": "Lowcost",
     "high": "high",
-    "General Monitor Type": "General Monitor Type",
-    "Passive Monitor Type": "Passive Monitor Type",
-    "Specific Monitor Type": "Specific Monitor Type",
-    "dataRetentionTimeError": "Retention period must be 0 or greater",
-    "infiniteRetention": "Set to 0 for infinite retention.",
-    "confirmDeleteTagMsg": "Are you sure you want to delete this tag? Monitors associated with this tag will not be deleted.",
-    "Help": "Help",
-    "Game": "Game"
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API Docs ",
+    "Gateway Type": "Gateway Type",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "You can divide numbers with",
+    "Base URL": "Base URL",
+    "goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
+    "goAlertIntegrationKeyInfo": "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
+    "goAlert": "GoAlert",
+    "AccessKeyId": "AccessKey ID",
+    "SecretAccessKey": "AccessKey Secret",
+    "PhoneNumbers": "PhoneNumbers",
+    "TemplateCode": "TemplateCode",
+    "SignName": "SignName",
+    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
+    "Bark Endpoint": "Bark Endpoint",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "WebHookUrl": "WebHookUrl",
+    "SecretKey": "SecretKey",
+    "For safety, must use secret key": "For safety, must use secret key",
+    "Device Token": "Device Token",
+    "Platform": "Platform",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "High": "High",
+    "Retry": "Retry",
+    "Topic": "Topic",
+    "WeCom Bot Key": "WeCom Bot Key",
+    "Setup Proxy": "Setup Proxy",
+    "Proxy Protocol": "Proxy Protocol",
+    "Proxy Server": "Proxy Server",
+    "Proxy server has authentication": "Proxy server has authentication",
+    "matrix": "Matrix",
+    "promosmsTypeEco": "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
+    "promosmsTypeFlash": "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
+    "promosmsTypeFull": "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
+    "promosmsTypeSpeed": "SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).",
+    "promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes)",
+    "promosmsSMSSender": "SMS Sender Name : Pre-registred name or one of defaults: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "promosmsAllowLongSMS": "Allow long SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "matrixHomeserverURL": "Homeserver URL (with http(s):// and optionally port)",
+    "Internal Room Id": "Internal Room ID",
+    "matrixDesc1": "You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client. It should look like !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "It is highly recommended you create a new user and do not use your own Matrix user's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running {0}",
+    "Channel Name": "Channel Name",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "Icon Emoji": "Icon Emoji",
+    "signalImportant": "IMPORTANT: You cannot mix groups and numbers in recipients!",
+    "aboutWebhooks": "More info about Webhooks on: {0}",
+    "aboutChannelName": "Enter the channel name on {0} Channel Name field if you want to bypass the Webhook channel. Ex: #other-channel",
+    "aboutKumaURL": "If you leave the Uptime Kuma URL field blank, it will default to the Project GitHub page.",
+    "smtpDkimSettings": "DKIM Settings",
+    "smtpDkimDesc": "Please refer to the Nodemailer DKIM {0} for usage.",
+    "documentation": "documentation",
+    "smtpDkimDomain": "Domain Name",
+    "smtpDkimKeySelector": "Key Selector",
+    "smtpDkimPrivateKey": "Private Key",
+    "smtpDkimHashAlgo": "Hash Algorithm (Optional)",
+    "smtpDkimheaderFieldNames": "Header Keys to sign (Optional)",
+    "smtpDkimskipFields": "Header Keys not to sign (Optional)",
+    "wayToGetPagerDutyKey": "You can get this by going to Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Here you can search for \"Events API V2\". More info {0}",
+    "Integration Key": "Integration Key",
+    "Integration URL": "Integration URL",
+    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
+    "do nothing": "do nothing",
+    "auto acknowledged": "auto acknowledged",
+    "auto resolve": "auto resolve",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API Endpoint",
+    "alertaEnvironment": "Environment",
+    "alertaApiKey": "API Key",
+    "alertaAlertState": "Alert State",
+    "alertaRecoverState": "Recover State",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIPassword": "API Password",
+    "serwersmsPhoneNumber": "Phone number",
+    "serwersmsSenderName": "SMS Sender Name (registered via customer portal)",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Phone number(s)",
+    "smseagleGroup": "Phonebook group name(s)",
+    "smseagleContact": "Phonebook contact name(s)",
+    "smseagleRecipientType": "Recipient type",
+    "smseagleRecipient": "Recipient(s) (multiple must be separated with comma)",
+    "smseagleToken": "API Access token",
+    "smseagleUrl": "Your SMSEagle device URL",
+    "smseagleEncoding": "Send as Unicode",
+    "smseaglePriority": "Message priority (0-9, default = 0)",
+    "stackfield": "Stackfield",
+    "Recipient Number": "Recipient Number",
+    "From Name/Number": "From Name/Number",
+    "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
+    "Octopush API Version": "Octopush API Version",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "ntfy Topic": "ntfy Topic",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP Address",
+    "onebotMessageType": "OneBot Message Type",
+    "onebotGroupMessage": "Group",
+    "onebotPrivateMessage": "Private",
+    "onebotUserOrGroupId": "Group/User ID",
+    "onebotSafetyTips": "For safety, must set access token",
+    "PushDeer Key": "PushDeer Key",
+    "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} ."
 }

From b0e1bb4057ec2f3db833f49fb5b41577a95a4fcf Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 25 Jan 2023 01:28:10 +0800
Subject: [PATCH 496/803] Create README.md

---
 src/lang/README.md | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
 create mode 100644 src/lang/README.md

diff --git a/src/lang/README.md b/src/lang/README.md
new file mode 100644
index 00000000..5b27b2dc
--- /dev/null
+++ b/src/lang/README.md
@@ -0,0 +1,15 @@
+# How to translate 
+
+(2023-01-24 Updated)
+
+1. Go to https://weblate.kuma.pet
+
+# How to add a new language in the dropdown
+
+1. Add your language at https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/
+2. Find the language code (You can find it at the end of the URL)
+3. Go to https://github.com/louislam/uptime-kuma/blob/master/src/i18n.js and click `Edit` icon
+4. Add your language at the end of `languageList`, format: `"zh-TW": "繁體中文 (台灣)",`
+5. Commit and make a pull request for me to approve
+
+If you do not have programming skills, let me know in [the issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏

From e1e62272454e3e2a04b253aee09248305b39746c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 25 Jan 2023 01:29:29 +0800
Subject: [PATCH 497/803] Update README.md

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

diff --git a/README.md b/README.md
index 6647dcda..f29622a6 100644
--- a/README.md
+++ b/README.md
@@ -173,7 +173,7 @@ Check out the latest beta release here: https://github.com/louislam/uptime-kuma/
 If you want to report a bug or request a new feature, feel free to open a [new issue](https://github.com/louislam/uptime-kuma/issues).
 
 ### Translations
-If you want to translate Uptime Kuma into your language, please visit [Weblate](https://weblate.kuma.pet).
+If you want to translate Uptime Kuma into your language, please visit [Weblate Readme](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md).
 
 Feel free to correct my grammar in this README, source code, or wiki, as my mother language is not English and my grammar is not that great.
 

From e3246a27058206ed99f6d84b786b69dd81afe4b6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 25 Jan 2023 01:30:58 +0800
Subject: [PATCH 498/803] Update README.md

---
 src/lang/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/README.md b/src/lang/README.md
index 5b27b2dc..4960d62d 100644
--- a/src/lang/README.md
+++ b/src/lang/README.md
@@ -2,7 +2,7 @@
 
 (2023-01-24 Updated)
 
-1. Go to https://weblate.kuma.pet
+1. Go to [https://weblate.kuma.pet](https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/)
 
 # How to add a new language in the dropdown
 

From edd5592dcabe8f69458ed08d585f0ca7d46eb5d8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 25 Jan 2023 01:37:19 +0800
Subject: [PATCH 499/803] Update CONTRIBUTING.md

---
 CONTRIBUTING.md | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f75b312b..f46b17e1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -32,15 +32,18 @@ Yes or no, it depends on what you will try to do. Since I don't want to waste yo
 Here are some references:
 
 ✅ Usually Accept:
-- Bug/Security fix
+- Bug fix
+- Security fix
 - Adding notification providers
+- Adding new language files (You should go to https://weblate.kuma.pet for existing languages)
+- Adding new language keys: `$t("...")`
 
 ⚠️ Discussion First
 - Large pull requests
 - New features
 
 ❌ Won't Merge
-- Translations (You can now translate on https://weblate.kuma.pet)
+- A dedicated pr for translating existing languages (You can now translate on https://weblate.kuma.pet) 
 - Do not pass auto test
 - Any breaking changes
 - Duplicated pull request

From a9b7bbcd9eba66c0990f9d90ba17aeeed9f0b5fb Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 25 Jan 2023 01:58:12 +0800
Subject: [PATCH 500/803] =?UTF-8?q?Add=20=E7=B9=81=E9=AB=94=E4=B8=AD?=
 =?UTF-8?q?=E6=96=87=20(=E5=BB=A3=E6=9D=B1=E8=A9=B1=20/=20=E7=B2=B5?=
 =?UTF-8?q?=E8=AA=9E)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/i18n.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/i18n.js b/src/i18n.js
index b8f1a192..b6a7beee 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -37,6 +37,7 @@ const languageList = {
     "uk-UA": "Український",
     "th-TH": "ไทย",
     "el-GR": "Ελληνικά",
+    "yue": "繁體中文 (廣東話 / 粵語)",
 };
 
 let messages = {

From 82f33f4445e3e59292cdd94cd36843479f13c4ec Mon Sep 17 00:00:00 2001
From: UptimeKumaBot <123442769+UptimeKumaBot@users.noreply.github.com>
Date: Wed, 25 Jan 2023 02:00:56 +0800
Subject: [PATCH 501/803] Translations update from Uptime Kuma Weblate (#2663)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Translated using Weblate (Chinese (Simplified))

Currently translated at 99.2% (677 of 682 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/

* Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 56.4% (385 of 682 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (682 of 682 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (682 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/

* Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 56.5% (386 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/

* Translated using Weblate (Czech)

Currently translated at 100.0% (683 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/

* Translated using Weblate (Czech)

Currently translated at 100.0% (683 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (683 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (683 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 98.2% (671 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant/

* Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 56.8% (388 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/

* Translated using Weblate (Czech)

Currently translated at 100.0% (683 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/

* Translated using Weblate (French)

Currently translated at 100.0% (683 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/

* Translated using Weblate (Russian)

Currently translated at 86.2% (589 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (683 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (683 of 683 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/

* Added translation using Weblate (Aramaic)

* Added translation using Weblate (Yue)

* Translated using Weblate (Czech)

Currently translated at 100.0% (684 of 684 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/

* Translated using Weblate (French)

Currently translated at 100.0% (684 of 684 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (684 of 684 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/

* Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 57.6% (394 of 684 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/

* Translated using Weblate (Yue)

Currently translated at 0.1% (1 of 684 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/yue/

* Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 58.6% (401 of 684 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/

* Translated using Weblate (English)

Currently translated at 100.0% (684 of 684 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en/

* Translated using Weblate (Yue)

Currently translated at 2.0% (14 of 684 strings)

Translation: Uptime Kuma/Uptime Kuma
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/yue/

Co-authored-by: 401Unauthorized <yehowahliu@4o1.to>
Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Co-authored-by: test <tori@weblate2.louislam.net>
Co-authored-by: Buchtič <martin.buchta@gmail.com>
Co-authored-by: Michal <black23@gmail.com>
Co-authored-by: deluxghost <deluxghost@gmail.com>
Co-authored-by: Cyril59310 <archas.cyril@hotmail.fr>
Co-authored-by: sovushik <evgeniy@grachev.biz>
Co-authored-by: Ömer Faruk Genç <omer@farukgenc.com>
---
 src/lang/arc.json   |  1 +
 src/lang/cs-CZ.json | 92 +++++++++++++++++++++++----------------------
 src/lang/en.json    | 14 +++----
 src/lang/fr-FR.json | 10 +++--
 src/lang/ru-RU.json | 25 +++++++++++-
 src/lang/tr-TR.json | 23 ++++++++----
 src/lang/yue.json   | 16 ++++++++
 src/lang/zh-CN.json | 84 ++++++++++++++++++++++-------------------
 src/lang/zh-HK.json | 21 ++++++++++-
 src/lang/zh-TW.json |  5 ++-
 10 files changed, 183 insertions(+), 108 deletions(-)
 create mode 100644 src/lang/arc.json
 create mode 100644 src/lang/yue.json

diff --git a/src/lang/arc.json b/src/lang/arc.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/src/lang/arc.json
@@ -0,0 +1 @@
+{}
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index e94a38f6..ede498ff 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -23,7 +23,7 @@
     "affectedMonitorsDescription": "Vyberte dohledy, které budou ovlivněny touto údržbou",
     "affectedStatusPages": "Zobrazit tuto zprávu o údržbě na vybraných stavových stránkách",
     "atLeastOneMonitor": "Vyberte alespoň jeden dotčený dohled",
-    "passwordNotMatchMsg": "Hesla se neshodují",
+    "passwordNotMatchMsg": "Hesla se neshodují.",
     "notificationDescription": "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.",
     "keywordDescription": "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
     "pauseDashboardHome": "Pozastaveno",
@@ -57,7 +57,7 @@
     "List": "Seznam",
     "Add": "Přidat",
     "Add New Monitor": "Přidat nový dohled",
-    "Quick Stats": "Rychlé statistiky",
+    "Quick Stats": "Rychlý přehled",
     "Up": "Běží",
     "Down": "Nedostupný",
     "Pending": "Čekám",
@@ -122,7 +122,7 @@
     "Enable Auth": "Povolit ověřování",
     "disableauth.message1": "Opravdu chcete <strong>deaktivovat autentifikaci</strong>?",
     "disableauth.message2": "Tato možnost je určena pro případy, kdy <strong>máte autentifikaci zajištěnou třetí stranou</strong> ještě před přístupem do Uptime Kuma, například prostřednictvím Cloudflare Access.",
-    "Please use this option carefully!": "Používejte ji prosím s rozmyslem.",
+    "Please use this option carefully!": "Používejte ji prosím s rozmyslem!",
     "Logout": "Odhlásit",
     "Leave": "Odejít",
     "I understand, please disable": "Rozumím, chci ji deaktivovat",
@@ -139,7 +139,7 @@
     "Email": "E-mail",
     "Test": "Test",
     "Certificate Info": "Informace o certifikátu",
-    "Resolver Server": "Resolver Server",
+    "Resolver Server": "Server Resolveru",
     "Resource Record Type": "Typ záznamu o prostředku",
     "Last Result": "Poslední výsledek",
     "Create your admin account": "Vytvořit účet administrátora",
@@ -236,7 +236,7 @@
     "smtpCC": "Kopie",
     "smtpBCC": "Skrytá kopie",
     "discord": "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
+    "Discord Webhook URL": "URL Webhooku Discord",
     "wayToGetDiscordURL": "Získáte tak, že přejdete do Nastavení serveru - > Integrace - > Vytvořit Webhook",
     "Bot Display Name": "Zobrazované jméno robota",
     "Prefix Custom Message": "Předpona vlastní zprávy",
@@ -250,7 +250,7 @@
     "Recipients": "Příjemci",
     "needSignalAPI": "Musíte mít Signal klienta s REST API.",
     "wayToCheckSignalURL": "Pro zobrazení instrukcí, jak službu nastavit, přejděte na následující adresu:",
-    "signalImportant": "Důležité V seznamu příjemců není možné současně použít skupiny a čísla!",
+    "signalImportant": "Důležité: v seznamu příjemců není možné současně použít skupiny a čísla!",
     "gotify": "Gotify",
     "Application Token": "Token aplikace",
     "Server URL": "URL adresa serveru",
@@ -266,7 +266,7 @@
     "rocket.chat": "Rocket.Chat",
     "pushover": "Pushover",
     "pushy": "Pushy",
-    "PushByTechulus": "Push by Techulus",
+    "PushByTechulus": "Push od Techulus",
     "octopush": "Octopush",
     "promosms": "PromoSMS",
     "clicksendsms": "ClickSend SMS",
@@ -323,7 +323,7 @@
     "promosmsPhoneNumber": "Telefonní číslo (polští příjemci mohou vynechat telefonní předvolbu)",
     "promosmsSMSSender": "Odesílatel SMS: Předem zaregistrovaný název nebo jeden z výchozích: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
     "promosmsAllowLongSMS": "Povolit dlouhé SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "Feishu WebHookUrl": "URL Webhooku Feishu",
     "matrixHomeserverURL": "URL adresa domácího serveru (s http(s):// a volitelně portem)",
     "Internal Room Id": "ID interní místnosti",
     "matrixDesc1": "ID interní místnosti naleznete v Matrix klientovi v rozšířeném nastavení místnosti. Mělo by být ve tvaru !QMdRCpUIfLwsfjxye6:home.server.",
@@ -341,7 +341,7 @@
     "One record": "Jeden záznam",
     "steamApiKeyDescription": "Pro monitorování Steam Game Serveru je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
     "Current User": "Aktuálně přihlášený uživatel",
-    "topic": "Topic",
+    "topic": "Téma",
     "topicExplanation": "MQTT topic, který chcete sledovat",
     "successMessage": "Zpráva o úspěchu",
     "successMessageExplanation": "MQTT zpráva považovaná za úspěšnou",
@@ -415,17 +415,17 @@
     "smtpDkimheaderFieldNames": "Podepisovat tyto hlavičky (volitelné)",
     "smtpDkimskipFields": "Nepodepisovat tyto hlavičky (volitelné)",
     "wayToGetPagerDutyKey": "Získat jej můžete v sekci Service -> Service Directory -> (vyberte službu) -> Integrations -> Add integration. Následně vyhledejte \"Events API V2\". Více informace naleznete na adrese {0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
-    "Auto resolve or acknowledged": "Auto resolve or acknowledged",
-    "do nothing": "do nothing",
-    "auto acknowledged": "auto acknowledged",
-    "auto resolve": "auto resolve",
+    "Integration Key": "Integrační klíč",
+    "Integration URL": "Integrační URL",
+    "Auto resolve or acknowledged": "Automatické řešení nebo potvrzení",
+    "do nothing": "nedělat nic",
+    "auto acknowledged": "automaticky uznáno",
+    "auto resolve": "automatické řešení",
     "gorush": "Gorush",
     "alerta": "Alerta",
     "alertaApiEndpoint": "API Endpoint",
     "alertaEnvironment": "Prostředí",
-    "alertaApiKey": "API Key",
+    "alertaApiKey": "API klíč",
     "alertaAlertState": "Stav upozornění",
     "alertaRecoverState": "Stav obnovení",
     "deleteStatusPageMsg": "Opravdu chcete odstranit tuto stavovou stránku?",
@@ -440,17 +440,17 @@
     "Certificate Chain": "Řetězec certifikátu",
     "Valid": "Platný",
     "Invalid": "Neplatný",
-    "AccessKeyId": "AccessKey ID",
-    "SecretAccessKey": "AccessKey Secret",
-    "PhoneNumbers": "PhoneNumbers",
+    "AccessKeyId": "ID přístupového klíče",
+    "SecretAccessKey": "Tajemství přístupového klíče",
+    "PhoneNumbers": "Telefonní čísla",
     "TemplateCode": "TemplateCode",
     "SignName": "SignName",
-    "Sms template must contain parameters: ": "Sms template must contain parameters: ",
+    "Sms template must contain parameters: ": "Šablona SMS musí obsahovat parametry: ",
     "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
+    "Bark Group": "Skupina Bark",
+    "Bark Sound": "Bark zvuk",
     "WebHookUrl": "WebHookUrl",
-    "SecretKey": "SecretKey",
+    "SecretKey": "Tajný klíč",
     "For safety, must use secret key": "Z důvodu bezpečnosti použijte secret key",
     "Device Token": "Token zařízení",
     "Platform": "Platforma",
@@ -459,8 +459,8 @@
     "Huawei": "Huawei",
     "High": "Vysoký",
     "Retry": "Opakovat",
-    "Topic": "Topic",
-    "WeCom Bot Key": "WeCom Bot Key",
+    "Topic": "Téma",
+    "WeCom Bot Key": "Klíč WeCom Bota",
     "Setup Proxy": "Nastavit proxy",
     "Proxy Protocol": "Protokol proxy",
     "Proxy Server": "Proxy Server",
@@ -521,15 +521,15 @@
     "Domain Names": "Názvy domén",
     "signedInDisp": "Přihlášen jako {0}",
     "signedInDispDisabled": "Ověření je vypnuté.",
-    "RadiusSecret": "Radius Secret",
+    "RadiusSecret": "Tajemství Radius",
     "RadiusSecretDescription": "Sdílený tajný klíč mezi klientem a serverem",
     "RadiusCalledStationId": "ID volaného zařízení",
     "RadiusCalledStationIdDescription": "Identifikátor volaného zařízení",
     "RadiusCallingStationId": "ID volajícího zařízení",
     "RadiusCallingStationIdDescription": "Identifikátor volajícího zařízení",
     "Certificate Expiry Notification": "Oznámení na blížící se konec platnosti certifikátu",
-    "API Username": "API Username",
-    "API Key": "API Key",
+    "API Username": "Uživatelské jména API",
+    "API Key": "API klíč",
     "Recipient Number": "Číslo příjemce",
     "From Name/Number": "Jméno/číslo odesílatele",
     "Leave blank to use a shared sender number.": "Ponechte prázdné, pokud chcete použít číslo sdíleného příjemce.",
@@ -541,19 +541,19 @@
     "promosmsLogin": "API Login Name",
     "promosmsPassword": "API Password",
     "pushoversounds pushover": "Pushover (výchozí)",
-    "pushoversounds bike": "Bike",
+    "pushoversounds bike": "Kolo",
     "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds cashregister": "Pokladna",
     "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds cosmic": "Kosmický",
     "pushoversounds falling": "Falling",
     "pushoversounds gamelan": "Gamelan",
-    "pushoversounds incoming": "Incoming",
-    "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
-    "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
+    "pushoversounds incoming": "Příchozí",
+    "pushoversounds intermission": "Přestávka",
+    "pushoversounds magic": "Kouzlo",
+    "pushoversounds mechanical": "Mechanika",
+    "pushoversounds pianobar": "Barové piano",
+    "pushoversounds siren": "Siréna",
     "pushoversounds spacealarm": "Space Alarm",
     "pushoversounds tugboat": "Tug Boat",
     "pushoversounds alien": "Alien Alarm (dlouhý)",
@@ -563,7 +563,7 @@
     "pushoversounds updown": "Up Down (dlouhý)",
     "pushoversounds vibrate": "Pouze vibrace",
     "pushoversounds none": "Žádný (ticho)",
-    "pushyAPIKey": "Secret API Key",
+    "pushyAPIKey": "Tajný API klíč",
     "pushyToken": "Token zařízení",
     "Show update if available": "Upozornit na aktualizace, pokud jsou k dispozici",
     "Also check beta release": "Kontrolovat také dostupnost beta verzí",
@@ -584,7 +584,7 @@
     "certificationExpiryDescription": "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:",
     "Setup Docker Host": "Nastavit Docker hostitele",
     "Connection Type": "Typ připojení",
-    "Docker Daemon": "Docker Daemon",
+    "Docker Daemon": "Démon Dockeru",
     "deleteDockerHostMsg": "Opravdu chcete odstranit tohoto docker hostitele ze všech dohledů?",
     "socket": "Socket",
     "tcp": "TCP / HTTP",
@@ -592,7 +592,7 @@
     "Container Name / ID": "ID / název kontejneru",
     "Docker Host": "Docker hostitel",
     "Docker Hosts": "Docker hostitelé",
-    "ntfy Topic": "ntfy Topic",
+    "ntfy Topic": "ntfy Téma",
     "Domain": "Doména",
     "Workstation": "Pracovní stanice",
     "disableCloudflaredNoAuthMsg": "Používáte režim bez ověření, heslo není vyžadováno.",
@@ -621,8 +621,8 @@
     "Optional": "Volitelný",
     "squadcast": "Squadcast",
     "SendKey": "SendKey",
-    "SMSManager API Docs": "SMSManager API Docs ",
-    "Gateway Type": "Gateway Typ",
+    "SMSManager API Docs": "Dokumentace SMSManager API ",
+    "Gateway Type": "Typ brány",
     "SMSManager": "SMSManager",
     "You can divide numbers with": "Čísla můžete oddělit pomocí",
     "or": "nebo",
@@ -645,7 +645,7 @@
     "lastDay3": "3. poslední den v měsíci",
     "lastDay4": "4. poslední den v měsíci",
     "No Maintenance": "Žádná údržba",
-    "pauseMaintenanceMsg": "Opravdu chcete pozastavit údržbu?",
+    "pauseMaintenanceMsg": "Opravdu chcete údržbu pozastavit?",
     "maintenanceStatus-under-maintenance": "Údržba",
     "maintenanceStatus-inactive": "Neaktivní",
     "maintenanceStatus-scheduled": "Naplánováno",
@@ -680,5 +680,7 @@
     "Specific Monitor Type": "Konkrétní typ dohledu",
     "dataRetentionTimeError": "Doba pro uchování musí být větší nebo rovna 0",
     "infiniteRetention": "Pro nekonečný záznam zadejte 0.",
-    "confirmDeleteTagMsg": "Opravdu chcete odstranit tento štíte? Provedením této akce nedojde k odstranění dohledů, které jej mají přiřazeny."
-}
\ No newline at end of file
+    "confirmDeleteTagMsg": "Opravdu chcete odstranit tento štítek? Provedením této akce nedojde k odstranění dohledů, které jej mají přiřazeny.",
+    "Help": "Nápověda",
+    "Game": "Hra"
+}
diff --git a/src/lang/en.json b/src/lang/en.json
index 1493a7b0..a36a1218 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -131,10 +131,10 @@
     "Auto Get": "Auto Get",
     "Schedule maintenance": "Schedule maintenance",
     "Affected Monitors": "Affected Monitors",
-    "Pick Affected Monitors...": "Pick Affected Monitors...",
+    "Pick Affected Monitors...": "Pick Affected Monitors…",
     "Start of maintenance": "Start of maintenance",
     "All Status Pages": "All Status Pages",
-    "Select status pages...": "Select status pages...",
+    "Select status pages...": "Select status pages…",
     "alertNoFile": "Please select a file to import.",
     "alertWrongFileType": "Please select a JSON file.",
     "Clear all statistics": "Clear all Statistics",
@@ -153,7 +153,7 @@
     "Token": "Token",
     "Show URI": "Show URI",
     "Tags": "Tags",
-    "Add New below or Select...": "Add New below or Select...",
+    "Add New below or Select...": "Add New below or Select…",
     "Tag with this name already exist.": "Tag with this name already exists.",
     "Tag with this value already exist.": "Tag with this value already exists.",
     "color": "Color",
@@ -167,7 +167,7 @@
     "Purple": "Purple",
     "Pink": "Pink",
     "Custom": "Custom",
-    "Search...": "Search...",
+    "Search...": "Search…",
     "Avg. Ping": "Avg. Ping",
     "Avg. Response": "Avg. Response",
     "Entry Page": "Entry Page",
@@ -223,8 +223,8 @@
     "Security": "Security",
     "Steam API Key": "Steam API Key",
     "Shrink Database": "Shrink Database",
-    "Pick a RR-Type...": "Pick a RR-Type...",
-    "Pick Accepted Status Codes...": "Pick Accepted Status Codes...",
+    "Pick a RR-Type...": "Pick a RR-Type…",
+    "Pick Accepted Status Codes...": "Pick Accepted Status Codes…",
     "Default": "Default",
     "HTTP Options": "HTTP Options",
     "Create Incident": "Create Incident",
@@ -441,7 +441,7 @@
     "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> Create Webhook",
     "Bot Display Name": "Bot Display Name",
     "Prefix Custom Message": "Prefix Custom Message",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
+    "Hello @everyone is...": "Hello {'@'}everyone is…",
     "wayToGetTeamsURL": "You can learn how to create a webhook URL {0}.",
     "wayToGetZohoCliqURL": "You can learn how to create a webhook URL {0}.",
     "needSignalAPI": "You need to have a signal client with REST API.",
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 3decd987..f9a520d6 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -170,7 +170,7 @@
     "Setup 2FA": "Configurer la double authentification (2FA)",
     "Enable 2FA": "Activer la double authentification (2FA)",
     "Disable 2FA": "Désactiver la double authentification (2FA)",
-    "2FA Settings": "Paramètres de la la double authentification (2FA)",
+    "2FA Settings": "Paramètres de la double authentification (2FA)",
     "Two Factor Authentication": "Double authentification",
     "Active": "Actif",
     "Inactive": "Inactif",
@@ -309,7 +309,7 @@
     "Basic Settings": "Paramètres de base",
     "User ID": "Identifiant utilisateur",
     "Messaging API": "Messaging API",
-    "wayToGetLineChannelToken": "Premièrement accédez à {0}, créez un <i>provider</i> et définissez un type de salon à « Messaging API ». Vous pourrez alors avoir  puis vous pourrez avoir le jeton d'accès du salon et l'identifiant utilisateur demandés.",
+    "wayToGetLineChannelToken": "Premièrement accédez à {0}, créez un <i>provider</i> et définissez un type de salon à «Messaging API». Vous obtiendrez alors le jeton d'accès du salon et l'identifiant utilisateur demandés.",
     "Icon URL": "URL vers l'icône",
     "aboutIconURL": "Vous pouvez mettre un lien vers une image dans « URL vers l'icône » pour remplacer l'image de profil par défaut. Elle ne sera utilisé que si « Icône émoji » n'est pas défini.",
     "aboutMattermostChannelName": "Vous pouvez remplacer le salon par défaut que le webhook utilise en mettant le nom du salon dans le champ « Nom du salon ». Vous aurez besoin de l'activer depuis les paramètres de Mattermost. Ex. : #autre-salon",
@@ -680,5 +680,7 @@
     "Monitor": "Sonde | Sondes",
     "Custom": "Personnalisé",
     "confirmDeleteTagMsg": "Voulez-vous vraiment supprimer cette étiquettes ? Les moniteurs associés ne seront pas supprimés.",
-    "promosmsAllowLongSMS": "Autoriser les longs SMS"
-}
\ No newline at end of file
+    "promosmsAllowLongSMS": "Autoriser les longs SMS",
+    "Help": "Aide",
+    "Game": "Jeux"
+}
diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index a70c50c4..50b55fe3 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -577,5 +577,26 @@
     "Gateway Type": "Тип шлюза",
     "SMSManager": "SMSManager",
     "You can divide numbers with": "Вы можете делить числа с",
-    "or": "или"
-}
\ No newline at end of file
+    "or": "или",
+    "Maintenance": "Обслуживание",
+    "Schedule maintenance": "Запланировать обслуживание",
+    "affectedMonitorsDescription": "Выберите мониторы, которые будут затронуты во время обслуживания",
+    "affectedStatusPages": "Показывать уведомление об обслуживании на выбранных страницах статуса",
+    "atLeastOneMonitor": "Выберите больше одного затрагиваемого монитора",
+    "dnsPortDescription": "По умолчанию порт DNS сервера - 53. Мы можете изменить его в любое время.",
+    "Monitor": "Монитор | Мониторы",
+    "webhookAdditionalHeadersTitle": "Дополнительные Заголовки",
+    "recurringIntervalMessage": "Запускать 1 раз каждый день | Запускать 1 раз каждые {0} дней",
+    "error": "ошибка",
+    "statusMaintenance": "Обслуживание",
+    "Affected Monitors": "Затронутые мониторы",
+    "Start of maintenance": "Начало обслуживания",
+    "All Status Pages": "Все страницы статусов",
+    "Select status pages...": "Выберите страницу статуса...",
+    "resendEveryXTimes": "Повторная отправка каждые {0} раз",
+    "resendDisabled": "Повторная отправка отключена",
+    "deleteMaintenanceMsg": "Вы действительно хотите удалить это обслуживание?",
+    "ZohoCliq": "ZohoCliq",
+    "critical": "критично",
+    "smseagle": "SMSEagle"
+}
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 85340255..560be296 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -8,7 +8,7 @@
     "ignoreTLSError": "HTTPS web siteleri için TLS/SSL hatasını yoksay",
     "upsideDownModeDescription": "Servisin durumunu tersine çevirir. Servis çalışıyorsa kapalı olarak işaretler.",
     "maxRedirectDescription": "İzlenecek maksimum yönlendirme sayısı. Yönlendirmeleri devre dışı bırakmak için 0'a ayarlayın.",
-    "acceptedStatusCodesDescription": "Servisin çalıştığını hangi durum kodları belirlesin?",
+    "acceptedStatusCodesDescription": "Başarılı bir yanıt olarak kabul edilen durum kodlarını seçin.",
     "passwordNotMatchMsg": "Şifre eşleşmiyor.",
     "notificationDescription": "Servislerin bildirim gönderebilmesi için bir bildirim yöntemi belirleyin.",
     "keywordDescription": "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır",
@@ -25,7 +25,7 @@
     "confirmClearStatisticsMsg": "Tüm istatistikleri silmek istediğinden emin misin?",
     "importHandleDescription": "Aynı isimdeki bütün servisleri ve bildirimleri atlamak için 'Var olanı atla' seçiniz. 'Üzerine yaz' var olan bütün servisleri ve bildirimleri silecektir. ",
     "confirmImportMsg": "Yedeği içeri aktarmak istediğinize emin misiniz? Lütfen doğru içeri aktarma seçeneğini seçtiğinizden emin olunuz. ",
-    "twoFAVerifyLabel": "Lütfen tokeni yazarak 2FA doğrulamanın çalıştığından emin olunuz.",
+    "twoFAVerifyLabel": "2FA doğrulamasını sağlamak için lütfen token bilgisini giriniz:",
     "tokenValidSettingsMsg": "Token geçerli! Şimdi 2FA ayarlarını kaydedebilirsiniz. ",
     "confirmEnableTwoFAMsg": "2FA'ı etkinleştirmek istediğinizden emin misiniz?",
     "confirmDisableTwoFAMsg": "2FA'ı devre dışı bırakmak istediğinize emin misiniz?",
@@ -106,7 +106,7 @@
     "Enable Auth": "Şifreli girişi aktif et.",
     "disableauth.message1": "<strong>Şifreli girişi devre dışı bırakmak istediğinizden</strong>emin misiniz?",
     "disableauth.message2": "Bu, Uptime Kuma'nın önünde Cloudflare Access gibi <strong>üçüncü taraf yetkilendirmesi olan</strong> kişiler içindir.",
-    "Please use this option carefully!": "Lütfen dikkatli kullanın.",
+    "Please use this option carefully!": "Lütfen dikkatli kullanın!",
     "Logout": "Çıkış yap",
     "Leave": "Ayrıl",
     "I understand, please disable": "Evet farkındayım, iptal et",
@@ -306,8 +306,8 @@
     "Body": "Gövde",
     "Headers": "Başlıklar",
     "PushUrl": "Push URL",
-    "HeadersInvalidFormat": "İstek başlıkları geçerli JSON değil:",
-    "BodyInvalidFormat": "İstek gövdesi geçerli JSON değil:",
+    "HeadersInvalidFormat": "İstek başlıkları geçerli JSON değil. ",
+    "BodyInvalidFormat": "İstek gövdesi geçerli JSON değil: ",
     "Monitor History": "Servis Geçmişi",
     "clearDataOlderThan": "{0} gün boyunca izleme geçmişi verilerini saklayın.",
     "PasswordsDoNotMatch": "Parolalar uyuşmuyor.",
@@ -409,7 +409,7 @@
     "PhoneNumbers": "PhoneNumbers",
     "TemplateCode": "TemplateCode",
     "SignName": "SignName",
-    "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir:",
+    "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir: ",
     "Bark Endpoint": "Bark Endpoint",
     "Bark Group": "Bark Group",
     "Bark Sound": "Bark Sound",
@@ -674,5 +674,12 @@
     "high": "Yüksek",
     "General Monitor Type": "Genel Monitör Tipi",
     "Passive Monitor Type": "Pasif Monitör Tipi",
-    "Specific Monitor Type": "Özel Monitör Tipi"
-}
\ No newline at end of file
+    "Specific Monitor Type": "Özel Monitör Tipi",
+    "Help": "Yardım",
+    "Monitor": "Ekran | Ekranlar",
+    "Custom": "Özel",
+    "dataRetentionTimeError": "Saklama süresi 0 veya daha büyük olmalıdır",
+    "confirmDeleteTagMsg": "Bu etiketi silmek istediğinizden emin misiniz? Bu etiketle ilişkili monitörler silinmez.",
+    "promosmsAllowLongSMS": "Uzun SMS'e izin ver",
+    "infiniteRetention": "Sonsuza dek saklamak için 0 giriniz."
+}
diff --git a/src/lang/yue.json b/src/lang/yue.json
new file mode 100644
index 00000000..cc9a1edb
--- /dev/null
+++ b/src/lang/yue.json
@@ -0,0 +1,16 @@
+{
+    "languageName": "繁體中文 (廣東話 / 粵語)",
+    "Settings": "設定",
+    "General": "一般",
+    "Dashboard": "表板",
+    "Help": "幫助",
+    "New Update": "有新版本",
+    "Language": "語言",
+    "Appearance": "外觀",
+    "Theme": "主題",
+    "Game": "遊戲",
+    "Version": "版本",
+    "Check Update On GitHub": "去  GitHub  睇下有冇更新",
+    "List": "列表",
+    "Add": "新增"
+}
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index fcc4310f..e3faa8e1 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -9,7 +9,7 @@
     "upsideDownModeDescription": "反转状态监控,如果服务可访问,则认为是故障。",
     "maxRedirectDescription": "允许的最大重定向次数。设置为 0 禁用重定向。",
     "enableGRPCTls": "允许通过 TLS 连接发送 gRPC 请求",
-    "grpcMethodDescription": "方法名会转换为小驼峰格式,例如 sayHello、check 等等",
+    "grpcMethodDescription": "方法名会转换为小驼峰格式,例如 sayHello、check 等等。",
     "acceptedStatusCodesDescription": "选择被视为成功响应的状态码。",
     "Maintenance": "维护",
     "statusMaintenance": "维护",
@@ -30,7 +30,7 @@
     "deleteMonitorMsg": "确定要删除此监控项吗?",
     "deleteMaintenanceMsg": "确定要删除此维护吗?",
     "deleteNotificationMsg": "确定要为所有监控项删除此通知吗?",
-    "dnsPortDescription": "DNS 服务器端口,默认为 53,您可以在任何时候更改此端口.",
+    "dnsPortDescription": "DNS 服务器端口,默认为 53,您可以在任何时候更改此端口。",
     "resolverserverDescription": "默认服务器是 Cloudflare。您随时可以修改解析服务器。",
     "rrtypeDescription": "选择要监控的资源记录类型",
     "pauseMonitorMsg": "确定要暂停吗?",
@@ -75,7 +75,7 @@
     "Uptime": "在线时间",
     "Cert Exp.": "证书有效期",
     "day": "天",
-    "-day": " 天",
+    "-day": "天",
     "hour": "小时",
     "-hour": " 小时",
     "Response": "响应",
@@ -95,11 +95,11 @@
     "Max. Redirects": "最大重定向次数",
     "Accepted Status Codes": "有效状态码",
     "Push URL": "推送 URL",
-    "needPushEvery": "您需要每 {0} 秒调用一次该 URL",
+    "needPushEvery": "您需要每 {0} 秒调用一次该 URL。",
     "pushOptionalParams": "可选参数:{0}",
     "Save": "保存",
     "Notifications": "通知",
-    "Not available, please setup.": "暂不可用,请先设置",
+    "Not available, please setup.": "暂不可用,请先设置。",
     "Setup Notification": "设置通知",
     "Light": "明亮",
     "Dark": "黑暗",
@@ -120,7 +120,7 @@
     "Disable Auth": "禁用身份验证",
     "Enable Auth": "启用身份验证",
     "disableauth.message1": "是否确定 <strong>取消登录验证</strong>?",
-    "disableauth.message2": "这是为 <strong>有第三方认证</strong> 的用户提供的功能,如 Cloudflare Access",
+    "disableauth.message2": "这是为 <strong>有第三方认证</strong> 的用户提供的功能,如 Cloudflare Access。",
     "Please use this option carefully!": "请谨慎使用!",
     "Logout": "退出",
     "Leave": "离开",
@@ -158,9 +158,9 @@
     "Auto Get": "自动获取",
     "backupDescription": "您可以将所有监控项和通知备份到 JSON 文件。",
     "backupDescription2": "注意: 不包括历史状态和事件数据。",
-    "backupDescription3": "导出的文件可能包含敏感信息,例如通知的令牌信息,请小心存放!",
-    "alertNoFile": "请选择要导入的文件",
-    "alertWrongFileType": "请选择一个 JSON 文件",
+    "backupDescription3": "导出的文件可能包含敏感信息,例如通知的令牌,请小心存放。",
+    "alertNoFile": "请选择要导入的文件。",
+    "alertWrongFileType": "请选择一个 JSON 文件。",
     "Clear all statistics": "清除所有统计数据",
     "Skip existing": "跳过已存在",
     "Overwrite": "覆盖",
@@ -210,13 +210,13 @@
     "Required": "必填",
     "telegram": "Telegram",
     "ZohoCliq": "ZohoCliq",
-    "Bot Token": "Bot Token",
+    "Bot Token": "机器人令牌",
     "wayToGetTelegramToken": "您可以从 {0} 获取 Token。",
     "Chat ID": "Chat ID",
     "supportTelegramChatID": "支持对话/群组/频道的 Chat ID",
     "wayToGetTelegramChatID": "您可以发送一条消息给您的机器人,然后访问此链接来查看 chat_id:",
     "YOUR BOT TOKEN HERE": "这里替换成您的 BOT TOKEN",
-    "chatIDNotFound": "未找到 Chat ID,请先给您的机器人发送一条消息。",
+    "chatIDNotFound": "未找到 Chat ID,请先给您的机器人发送一条消息",
     "webhook": "Webhook",
     "Post URL": "Post URL",
     "Content Type": "Content Type",
@@ -234,13 +234,13 @@
     "smtpCC": "抄送",
     "smtpBCC": "密送",
     "discord": "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
+    "Discord Webhook URL": "Discord Webhook 网址",
     "wayToGetDiscordURL": "要获取,可以前往服务器设置 -> 整合 -> 创建 Webhook",
     "Bot Display Name": "机器人显示名称",
     "Prefix Custom Message": "自定义消息前缀",
     "Hello @everyone is...": "{'@'}everyone,……",
     "teams": "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
+    "Webhook URL": "Webhook 网址",
     "wayToGetTeamsURL": "您可以在{0}了解如何获取 Webhook URL。",
     "wayToGetZohoCliqURL": "您可以在{0}了解如何创建 Webhook URL。",
     "signal": "Signal",
@@ -250,7 +250,7 @@
     "wayToCheckSignalURL": "您可以通过下面的 URL 了解如何设置:",
     "signalImportant": "重要:您不能混合设定收件人的分组和号码!",
     "gotify": "Gotify",
-    "Application Token": "Application Token",
+    "Application Token": "应用程序令牌",
     "Server URL": "服务器 URL",
     "Priority": "优先级",
     "slack": "Slack",
@@ -279,7 +279,7 @@
     "Guild ID": "频道 ID",
     "line": "Line Messenger",
     "mattermost": "Mattermost",
-    "User Key": "User Key",
+    "User Key": "用户密钥",
     "Device": "设备",
     "Message Title": "消息标题",
     "Notification Sound": "通知铃声",
@@ -293,17 +293,17 @@
     "apiCredentials": "API Credentials",
     "octopushLegacyHint": "您是否在使用旧版本的 Octopush(2011-2020)?",
     "Check octopush prices": "查看 Octopush 的价格 {0}。",
-    "octopushPhoneNumber": "电话号码(国际格式,例如:+33612345678)",
+    "octopushPhoneNumber": "电话号码(国际格式,例如:+33612345678) ",
     "octopushSMSSender": "短信发送名称:3-11 位大小写字母、数字和空格(a-zA-Z0-9)",
     "LunaSea Device ID": "LunaSea 设备 ID",
-    "Apprise URL": "Apprise URL",
+    "Apprise URL": "Apprise 网址",
     "Example:": "例如:{0}",
     "Read more:": "了解更多:{0}",
     "Status:": "状态:{0}",
     "Read more": "了解更多",
-    "appriseInstalled": "Apprise 已安装",
+    "appriseInstalled": "Apprise 已安装。",
     "appriseNotInstalled": "Apprise 未安装。{0}",
-    "Access Token": "Access Token",
+    "Access Token": "访问令牌",
     "Channel access token": "频道 Access Token",
     "Line Developers Console": "Line 开发者控制台",
     "lineDevConsoleTo": "Line 开发者控制台 - {0}",
@@ -335,7 +335,7 @@
     "BodyInvalidFormat": "请求体不是有效的 JSON: ",
     "Monitor History": "监控历史",
     "clearDataOlderThan": "保留监控历史数据 {0} 天。",
-    "PasswordsDoNotMatch": "密码不匹配",
+    "PasswordsDoNotMatch": "密码不匹配。",
     "records": "记录",
     "One record": "一条记录",
     "steamApiKeyDescription": "要监控 Steam 游戏服务器,您需要 Steam Web-API 密钥。您可以在这里注册您的 API 密钥: ",
@@ -396,7 +396,7 @@
     "smseagleContact": "通讯录联系人",
     "smseagleRecipientType": "收信人类型",
     "smseagleRecipient": "收信人(多个需用半角逗号分隔)",
-    "smseagleToken": "API Access token",
+    "smseagleToken": "API访问令牌",
     "smseagleUrl": "您的 SMSEagle 设备 URL",
     "smseagleEncoding": "以 Unicode 发送",
     "smseaglePriority": "消息优先级(0-9,默认为 0)",
@@ -414,8 +414,8 @@
     "smtpDkimheaderFieldNames": "包含在哈希计算对象内的 Header 列表(可选)",
     "smtpDkimskipFields": "不包含在哈希计算对象内的 Header 列表(可选)",
     "wayToGetPagerDutyKey": "您可以在 Service -> Service Directory -> (选择一个 Service) -> Integrations -> Add integration 页面中搜索“Events API V2”以获取此 Integration Key,更多信息请看{0}",
-    "Integration Key": "Integration Key",
-    "Integration URL": "Integration URL",
+    "Integration Key": "集成密钥",
+    "Integration URL": "集成网址",
     "Auto resolve or acknowledged": "自动标记为已解决或已读",
     "do nothing": "不做任何操作",
     "auto acknowledged": "自动标记为已读",
@@ -440,11 +440,11 @@
     "Valid": "有效",
     "Invalid": "无效",
     "AccessKeyId": "AccessKey ID",
-    "SecretAccessKey": "AccessKey Secret",
+    "SecretAccessKey": "AccessKey 密码",
     "PhoneNumbers": "PhoneNumbers",
     "TemplateCode": "TemplateCode",
     "SignName": "SignName",
-    "Sms template must contain parameters: ": "短信模板必须包含以下变量:",
+    "Sms template must contain parameters: ": "短信模板必须包含以下变量: ",
     "Bark Endpoint": "Bark 接入点",
     "Bark Group": "Bark 群组",
     "Bark Sound": "Bark 铃声",
@@ -522,7 +522,7 @@
     "Show Powered By": "显示 Powered By",
     "Domain Names": "域名",
     "signedInDisp": "当前用户: {0}",
-    "signedInDispDisabled": "已禁用身份验证",
+    "signedInDispDisabled": "已禁用身份验证。",
     "RadiusSecret": "Radius 共享机密",
     "RadiusSecretDescription": "客户端和服务器之间共享的密钥",
     "RadiusCalledStationId": "NAS 网络访问服务器号码(Called Station Id)",
@@ -534,7 +534,7 @@
     "API Key": "API Key",
     "Recipient Number": "收件人手机号码",
     "From Name/Number": "发件人名称/手机号码",
-    "Leave blank to use a shared sender number.": "留空以使用平台共享的发件人手机号码",
+    "Leave blank to use a shared sender number.": "留空以使用平台共享的发件人手机号码。",
     "Octopush API Version": "Octopush API 版本",
     "Legacy Octopush-DM": "旧版本 Octopush-DM",
     "endpoint": "接入点",
@@ -564,7 +564,7 @@
     "pushoversounds echo": "Pushover Echo(长铃声)",
     "pushoversounds updown": "Up Down(长铃声)",
     "pushoversounds vibrate": "仅震动",
-    "pushoversounds none": "无(禁音)",
+    "pushoversounds none": "无(静音)",
     "pushyAPIKey": "API 密钥",
     "pushyToken": "设备 Token",
     "Show update if available": "有更新时通知",
@@ -573,10 +573,10 @@
     "Check how to config it for WebSocket": "查看如何将反向代理与 WebSocket 一起使用",
     "Steam Game Server": "Steam 游戏服务器",
     "Most likely causes:": "最可能的原因:",
-    "The resource is no longer available.": "您所请求的资源已不再可用;",
+    "The resource is no longer available.": "您所请求的资源已不再可用。",
     "There might be a typing error in the address.": "您输入的地址可能有误。",
     "What you can try:": "您可以尝试以下操作:",
-    "Retype the address.": "重新输入地址;",
+    "Retype the address.": "重新输入地址。",
     "Go back to the previous page.": "返回到上一页面。",
     "Coming Soon": "即将推出",
     "wayToGetClickSendSMSToken": "您可以在{0}获取 API Username 和 API Key。",
@@ -587,7 +587,7 @@
     "Setup Docker Host": "配置 Docker 宿主信息",
     "Connection Type": "连接方式",
     "Docker Daemon": "Docker 守护进程",
-    "deleteDockerHostMsg": "您确定您要删除此 Docker 宿主设置吗?这会影响所有 Docker 监控项",
+    "deleteDockerHostMsg": "您确定要为所有监控项删除此 Docker 宿主设置吗?",
     "socket": "Socket",
     "tcp": "TCP / HTTP",
     "Docker Container": "Docker 容器",
@@ -597,13 +597,13 @@
     "ntfy Topic": "ntfy Topic",
     "Domain": "域名",
     "Workstation": "工作站",
-    "disableCloudflaredNoAuthMsg": "您现在正处于 No Auth 模式,无需输入密码",
+    "disableCloudflaredNoAuthMsg": "您现在正处于 No Auth 模式,无需输入密码。",
     "trustProxyDescription": "信任 'X-Forwarded-*' 头。如果您的 Uptime Kuma 是通过 Nginx 或 Apache 等反代服务对外提供访问的话,则您应当启用本功能以获取正确的客户端 IP。",
     "wayToGetLineNotifyToken": "您可以在 {0} 获取 Access token",
     "Examples": "例如",
     "Home Assistant URL": "Home Assistant 地址",
     "Long-Lived Access Token": "长期访问令牌",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "长期访问令牌可通过点击左下角您的用户名,滚动到页面底部并点击 Create Token 按钮获取。",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "长期访问令牌可通过点击左下角您的用户名,滚动到页面底部并点击 Create Token 按钮获取。 ",
     "Notification Service": "Notification Service",
     "default: notify all devices": "默认:通知所有设备",
     "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "通知服务的列表可在 Home Assistant 中的 Developer Tools > Services 通过搜索您的设备或手机的名称来获得。",
@@ -611,7 +611,7 @@
     "Trigger type:": "触发类型:",
     "Event type:": "事件类型:",
     "Event data:": "事件数据:",
-    "Then choose an action, for example switch the scene to where an RGB light is red.": "然后您可以选择关联操作,例如切换到 RGB 灯发出红光的场景",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "然后您可以选择关联操作,例如切换到 RGB 灯发出红光的场景。",
     "Frontend Version": "前端版本",
     "Frontend Version do not match backend version!": "前端版本与后端版本不匹配!",
     "Base URL": "API 基础地址",
@@ -623,10 +623,10 @@
     "Optional": "可选的",
     "squadcast": "Squadcast",
     "SendKey": "SendKey",
-    "SMSManager API Docs": "SMSManager API 文档在",
+    "SMSManager API Docs": "SMSManager API 文档 ",
     "Gateway Type": "网关类型",
     "SMSManager": "SMSManager",
-    "You can divide numbers with": "可用的分隔符:",
+    "You can divide numbers with": "可用的数字分隔符包括",
     "or": "或",
     "recurringInterval": "时间间隔",
     "Recurring": "重复",
@@ -679,5 +679,13 @@
     "high": "高价",
     "General Monitor Type": "常规监控类型",
     "Passive Monitor Type": "被动监控类型",
-    "Specific Monitor Type": "针对监控类型"
-}
\ No newline at end of file
+    "Specific Monitor Type": "针对监控类型",
+    "dataRetentionTimeError": "保留期必须为0或更大",
+    "Monitor": "监控项 | 监控项",
+    "Custom": "自定义",
+    "promosmsAllowLongSMS": "允许长的短信",
+    "confirmDeleteTagMsg": "你确定你要删除这个标签?与此标签关联的监视器不会被删除。",
+    "infiniteRetention": "设为0表示无限保留期。",
+    "Help": "帮助",
+    "Game": "游戏"
+}
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index f1933f27..1d7c38d7 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -384,5 +384,22 @@
     "statusMaintenance": "維護中",
     "Enable DNS Cache": "啟用 DNS 快取",
     "Enable": "啟用",
-    "Disable": "停用"
-}
\ No newline at end of file
+    "Disable": "停用",
+    "Schedule maintenance": "計劃維護",
+    "Help": "幫助",
+    "Valid To:": "有效期至:",
+    "Date Created": "新增日期",
+    "resendEveryXTimes": "每 {0} 次便重新傳送",
+    "resendDisabled": "重新傳送已停用",
+    "enableGRPCTls": "允許以 TLS 連線傳送 gRPC 要求",
+    "recurringIntervalMessage": "每天一次 | 每 {0} 天一次",
+    "affectedMonitorsDescription": "選擇受目前維護影響的監測器",
+    "affectedStatusPages": "在已選取的狀態頁中顯示此維護訊息",
+    "Primary Base URL": "主要 Base URL",
+    "Passive Monitor Type": "被動監測器類型",
+    "Resend Notification if Down X times consequently": "若 X 次心跳皆離線,重新傳送通知",
+    "Game": "遊戲",
+    "Specific Monitor Type": "特定監測器類型",
+    "Monitor": "監測器 | 監測器",
+    "General Monitor Type": "一般監測器類型"
+}
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
index 1c168412..d9d0256e 100644
--- a/src/lang/zh-TW.json
+++ b/src/lang/zh-TW.json
@@ -668,5 +668,6 @@
     "high": "高",
     "General Monitor Type": "一般監測器類型",
     "Passive Monitor Type": "被動監測器類型",
-    "Specific Monitor Type": "指定監測器類型"
-}
\ No newline at end of file
+    "Specific Monitor Type": "指定監測器類型",
+    "ZohoCliq": "ZohoCliq"
+}

From e3828f09a38f8ef63097256a29716c03af6e457d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 25 Jan 2023 16:13:09 +0800
Subject: [PATCH 502/803] Merge en.js to en.json

---
 src/lang/en.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/lang/en.json b/src/lang/en.json
index a36a1218..14ba725f 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -358,6 +358,7 @@
     "Docker Hosts": "Docker Hosts",
     "Domain": "Domain",
     "Workstation": "Workstation",
+    "Packet Size": "Packet Size",
     "telegram": "Telegram",
     "ZohoCliq": "ZohoCliq",
     "Bot Token": "Bot Token",

From dcda520d59f24ccaa12c175e57c3a5337a238ad7 Mon Sep 17 00:00:00 2001
From: UptimeKumaBot <123442769+UptimeKumaBot@users.noreply.github.com>
Date: Thu, 26 Jan 2023 00:55:59 +0800
Subject: [PATCH 503/803] Translations update from Uptime Kuma Weblate (#2670)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Update translation files

Updated by "Squash Git commits" hook in Weblate.

Translated using Weblate (Estonian)

Currently translated at 29.9% (205 of 685 strings)

Translated using Weblate (Spanish)

Currently translated at 29.7% (204 of 685 strings)

Translated using Weblate (Greek)

Currently translated at 84.6% (580 of 685 strings)

Translated using Weblate (German)

Currently translated at 94.1% (645 of 685 strings)

Translated using Weblate (German)

Currently translated at 94.2% (645 of 684 strings)

Translated using Weblate (German)

Currently translated at 94.2% (645 of 684 strings)

Translated using Weblate (German (Switzerland))

Currently translated at 92.2% (632 of 685 strings)

Translated using Weblate (German (Switzerland))

Currently translated at 92.3% (632 of 684 strings)

Translated using Weblate (Danish)

Currently translated at 50.6% (347 of 685 strings)

Translated using Weblate (Danish)

Currently translated at 50.7% (347 of 684 strings)

Translated using Weblate (Czech)

Currently translated at 98.8% (677 of 685 strings)

Translated using Weblate (Arabic (ar_SY))

Currently translated at 96.3% (660 of 685 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Persian)

Currently translated at 29.7% (204 of 685 strings)

Translated using Weblate (Basque)

Currently translated at 77.9% (534 of 685 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 42.0% (288 of 685 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 42.1% (288 of 684 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (684 of 685 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Dutch)

Currently translated at 76.3% (523 of 685 strings)

Translated using Weblate (Dutch)

Currently translated at 76.4% (523 of 684 strings)

Translated using Weblate (Korean)

Currently translated at 76.4% (524 of 685 strings)

Translated using Weblate (Japanese)

Currently translated at 28.6% (196 of 685 strings)

Translated using Weblate (Italian)

Currently translated at 52.5% (360 of 685 strings)

Translated using Weblate (Italian)

Currently translated at 52.6% (360 of 684 strings)

Translated using Weblate (Indonesian)

Currently translated at 84.3% (578 of 685 strings)

Translated using Weblate (Hungarian)

Currently translated at 53.8% (369 of 685 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.8% (677 of 685 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.8% (677 of 685 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 40.8% (280 of 685 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 40.9% (280 of 684 strings)

Translated using Weblate (Croatian)

Currently translated at 83.5% (572 of 685 strings)

Translated using Weblate (Hebrew (Israel))

Currently translated at 96.7% (663 of 685 strings)

Translated using Weblate (Yue)

Currently translated at 57.9% (397 of 685 strings)

Translated using Weblate (Yue)

Currently translated at 57.9% (397 of 685 strings)

Translated using Weblate (Yue)

Currently translated at 9.4% (65 of 685 strings)

Translated using Weblate (Yue)

Currently translated at 9.4% (65 of 685 strings)

Translated using Weblate (Yue)

Currently translated at 2.0% (14 of 684 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 96.9% (664 of 685 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 57.9% (397 of 685 strings)

Translated using Weblate (Vietnamese)

Currently translated at 67.4% (462 of 685 strings)

Translated using Weblate (Vietnamese)

Currently translated at 67.5% (462 of 684 strings)

Translated using Weblate (Ukrainian)

Currently translated at 74.8% (513 of 685 strings)

Translated using Weblate (Turkish)

Currently translated at 98.6% (676 of 685 strings)

Translated using Weblate (Thai)

Currently translated at 83.5% (572 of 685 strings)

Translated using Weblate (Swedish)

Currently translated at 15.7% (108 of 685 strings)

Translated using Weblate (Serbian)

Currently translated at 29.0% (199 of 685 strings)

Translated using Weblate (Serbian (latin))

Currently translated at 29.0% (199 of 685 strings)

Translated using Weblate (Serbian (latin))

Currently translated at 29.0% (199 of 685 strings)

Translated using Weblate (Slovenian)

Currently translated at 51.0% (350 of 685 strings)

Translated using Weblate (Russian)

Currently translated at 85.1% (583 of 685 strings)

Translated using Weblate (Portuguese (Portugal))

Currently translated at 29.0% (199 of 685 strings)

Translated using Weblate (French)

Currently translated at 98.9% (678 of 685 strings)

Co-authored-by: 401Unauthorized <yehowahliu@4o1.to>
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Cyril59310 <contact@cyril59310.fr>
Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Co-authored-by: MrEddX <mreddx@chatrix.one>
Co-authored-by: Victor Monteiro <victor@bbhost.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: cetteup <cetteup@dasemail.de>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ar_SY/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/bg/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/da/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de_CH/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/el/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/es/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/et/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/eu/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fa/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/he_IL/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/hr/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/hu/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/id/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/it/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ja/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ko/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/nb_NO/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/nl/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pl/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pt_BR/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pt_PT/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/sl/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/sr/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/sr_Latn/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/sv/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/th/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/uk/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/vi/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/yue/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma

* Revert autofill mistake

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: 401Unauthorized <yehowahliu@4o1.to>
Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
Co-authored-by: Cyril59310 <contact@cyril59310.fr>
Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Co-authored-by: MrEddX <mreddx@chatrix.one>
Co-authored-by: Victor Monteiro <victor@bbhost.com.br>
Co-authored-by: cetteup <cetteup@dasemail.de>
---
 src/lang/ar-SY.json   |   2 +-
 src/lang/arc.json     |   1 -
 src/lang/bg-BG.json   |  45 ++++++++------
 src/lang/da-DK.json   |   7 +--
 src/lang/de-CH.json   |  25 ++++----
 src/lang/de-DE.json   |  28 +++++----
 src/lang/el-GR.json   |   2 +-
 src/lang/en.json      |   1 -
 src/lang/es-ES.json   |   2 +-
 src/lang/et-EE.json   |   2 +-
 src/lang/eu.json      |   2 +-
 src/lang/fa.json      |  19 +-----
 src/lang/fr-FR.json   |   3 +-
 src/lang/he-IL.json   |   2 +-
 src/lang/hr-HR.json   |   2 +-
 src/lang/hu.json      |   2 +-
 src/lang/id-ID.json   |   2 +-
 src/lang/it-IT.json   |   4 +-
 src/lang/ja.json      |  34 +----------
 src/lang/ko-KR.json   |   2 +-
 src/lang/nb-NO.json   |   4 +-
 src/lang/nl-NL.json   |   4 +-
 src/lang/pl.json      |  81 ++++++++++++++++++-------
 src/lang/pt-BR.json   | 134 ++++++++++++++++++++++++++++++++----------
 src/lang/pt-PT.json   |  22 +------
 src/lang/ru-RU.json   |   4 +-
 src/lang/sl-SI.json   |   5 +-
 src/lang/sr-latn.json |  95 +-----------------------------
 src/lang/sr.json      |  96 +-----------------------------
 src/lang/sv-SE.json   |   5 +-
 src/lang/th-TH.json   |   2 +-
 src/lang/tr-TR.json   |  10 ----
 src/lang/uk-UA.json   |   2 +-
 src/lang/vi-VN.json   |  12 +---
 src/lang/yue.json     |   2 +-
 src/lang/zh-CN.json   |   2 +-
 src/lang/zh-TW.json   |   3 +-
 37 files changed, 262 insertions(+), 408 deletions(-)
 delete mode 100644 src/lang/arc.json

diff --git a/src/lang/ar-SY.json b/src/lang/ar-SY.json
index a961c205..d852a690 100644
--- a/src/lang/ar-SY.json
+++ b/src/lang/ar-SY.json
@@ -681,4 +681,4 @@
     "dataRetentionTimeError": "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
     "infiniteRetention": "ضبط على 0 للاحتفاظ لا نهائي.",
     "confirmDeleteTagMsg": "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة."
-}
\ No newline at end of file
+}
diff --git a/src/lang/arc.json b/src/lang/arc.json
deleted file mode 100644
index 0967ef42..00000000
--- a/src/lang/arc.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 63806675..0520760e 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -9,7 +9,7 @@
     "acceptedStatusCodesDescription": "Изберете статус кодове, които да се считат за успешен отговор.",
     "passwordNotMatchMsg": "Повторената парола не съвпада.",
     "notificationDescription": "Моля, задайте известието към монитор(и), за да функционира.",
-    "keywordDescription": "Търси ключова дума в чист html или JSON отговор - чувствителна е към регистъра",
+    "keywordDescription": "Търси ключова дума в чист HTML или JSON отговор - чувствителна е към регистъра.",
     "pauseDashboardHome": "Пауза",
     "deleteMonitorMsg": "Наистина ли желаете да изтриете този монитор?",
     "deleteNotificationMsg": "Наистина ли желаете да изтриете това известие за всички монитори?",
@@ -22,7 +22,7 @@
     "confirmClearStatisticsMsg": "Наистина ли желаете да изтриете всички статистически данни?",
     "importHandleDescription": "Изберете 'Пропусни съществуващите', ако желаете да пропуснете всеки монитор или известие със същото име. 'Презапис' ще изтрие всеки съществуващ монитор и известие.",
     "confirmImportMsg": "Сигурни ли сте, че желаете импортирането на архива? Моля, уверете се, че сте избрали правилната опция за импортиране.",
-    "twoFAVerifyLabel": "Моля, въведете вашия токен код, за да проверите дали 2FA работи",
+    "twoFAVerifyLabel": "Моля, въведете вашия токен код, за да проверите дали 2FA работи:",
     "tokenValidSettingsMsg": "Токен кодът е валиден! Вече можете да запазите настройките за 2FA.",
     "confirmEnableTwoFAMsg": "Сигурни ли сте, че желаете да активирате 2FA?",
     "confirmDisableTwoFAMsg": "Сигурни ли сте, че желаете да изключите 2FA?",
@@ -98,7 +98,7 @@
     "Enable Auth": "Активирай удостоверяване",
     "disableauth.message1": "Сигурни ли сте, че желаете да <strong>изключите удостоверяването</strong>?",
     "disableauth.message2": "Използва се в случаите, когато <strong>има настроен алтернативен метод за удостоверяване</strong> преди Uptime Kuma, например Cloudflare Access, Authelia или друг механизъм за удостоверяване.",
-    "Please use this option carefully!": "Моля, използвайте с повишено внимание.",
+    "Please use this option carefully!": "Моля, използвайте с повишено внимание!",
     "Logout": "Изход от профила",
     "Leave": "Отказ",
     "I understand, please disable": "Разбирам. Моля, изключи",
@@ -109,7 +109,7 @@
     "Password": "Парола",
     "Remember me": "Запомни ме",
     "Login": "Вход",
-    "No Monitors, please": "Все още няма монитори. Моля, добавете поне ",
+    "No Monitors, please": "Все още няма монитори. Моля, добавете поне",
     "add one": "един.",
     "Notification Type": "Тип известие",
     "Email": "Имейл",
@@ -154,7 +154,7 @@
     "Token": "Токен код",
     "Show URI": "Покажи URI",
     "Tags": "Етикети",
-    "Add New below or Select...": "Добавете нов по-долу или изберете...",
+    "Add New below or Select...": "Добавете нов по-долу или изберете…",
     "Tag with this name already exist.": "Етикет с това име вече съществува.",
     "Tag with this value already exist.": "Етикет с тази стойност вече съществува.",
     "color": "цвят",
@@ -167,7 +167,7 @@
     "Indigo": "Индиго",
     "Purple": "Лилаво",
     "Pink": "Розово",
-    "Search...": "Търси...",
+    "Search...": "Търси…",
     "Avg. Ping": "Ср. пинг",
     "Avg. Response": "Ср. отговор",
     "Entry Page": "Основна страница",
@@ -202,7 +202,7 @@
     "Status Pages": "Статус страници",
     "Primary Base URL": "Основен базов URL адрес",
     "Push URL": "Генериран Push URL адрес",
-    "needPushEvery": "Необходимо е да извършвате заявка към този URL адрес на всеки {0} секунди",
+    "needPushEvery": "Необходимо е да извършвате заявка към този URL адрес на всеки {0} секунди.",
     "pushOptionalParams": "Допълнителни, но не задължителни параметри: {0}",
     "defaultNotificationName": "Моето {notification} известие ({number})",
     "here": "тук",
@@ -230,7 +230,7 @@
     "wayToGetDiscordURL": "Може да създадете, от меню \"Настройки на сървъра\" -> \"Интеграции\" -> \"Уеб куки\" -> \"Нова уеб кука\"",
     "Bot Display Name": "Име на бота, което да се показва",
     "Prefix Custom Message": "Модифицирано обръщение",
-    "Hello @everyone is...": "Здравейте, {'@'}everyone е...",
+    "Hello @everyone is...": "Здравейте, {'@'}everyone е…",
     "Webhook URL": "Уеб кука URL адрес",
     "wayToGetTeamsURL": "Можете да научите как се създава URL адрес за уеб кука {0}.",
     "Number": "Номер",
@@ -316,8 +316,8 @@
     "Security": "Сигурност",
     "Steam API Key": "Steam API ключ",
     "Shrink Database": "Редуцирай базата данни",
-    "Pick a RR-Type...": "Изберете вида на ресурсния запис за мониториране...",
-    "Pick Accepted Status Codes...": "Изберете статус кодове, които да се считат за успешен отговор...",
+    "Pick a RR-Type...": "Изберете вида на ресурсния запис за мониториране…",
+    "Pick Accepted Status Codes...": "Изберете статус кодове, които да се считат за успешен отговор…",
     "Default": "По подразбиране",
     "HTTP Options": "HTTP Опции",
     "Create Incident": "Създаване на инцидент",
@@ -543,7 +543,7 @@
     "Bark Group": "Bark група",
     "Bark Sound": "Bark звук",
     "HTTP Headers": "HTTP хедъри",
-    "Trust Proxy": "Trust Proxy",
+    "Trust Proxy": "Доверено Proxy",
     "HomeAssistant": "Home Assistant",
     "RadiusSecret": "Radius таен код",
     "RadiusSecretDescription": "Споделен таен код между клиент и сървър",
@@ -561,10 +561,10 @@
     "Container Name / ID": "Име на контейнер / ID",
     "Docker Host": "Docker хост",
     "Docker Hosts": "Docker хостове",
-    "trustProxyDescription": "Trust 'X-Forwarded-*' headers.  Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
+    "trustProxyDescription": "Trust 'X-Forwarded-*' headers. Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
     "Examples": "Примери",
     "Home Assistant URL": "Home Assistant URL адрес",
-    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token": "Long-Lived токен за достъп",
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token можете да създадете, като кликнете върху името на профила си (долу ляво) и превъртите до най-долу, след това кликнете върху Създаване на токен. ",
     "Notification Service": "Услуга за известяване",
     "default: notify all devices": "по подразбиране: извести всички устройства",
@@ -576,7 +576,7 @@
     "Then choose an action, for example switch the scene to where an RGB light is red.": "След което изберете действие, например да превключите сцената, където RGB светлината е червена.",
     "Frontend Version": "Фронтенд версия",
     "Frontend Version do not match backend version!": "Фронтенд версията не съвпада с Бекенд версията!",
-    "Base URL": "Базов  URL адрес",
+    "Base URL": "Базов URL адрес",
     "goAlertInfo": "GoAlert е приложение с отворен код за планиране на повиквания, автоматизирани ескалации и известия (като SMS или гласови повиквания). Автоматично ангажирайте точния човек, по точния начин и в точното време! {0}",
     "goAlertIntegrationKeyInfo": "Вземете общ API интеграционен ключ за услугата във формат \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обикновено стойността на параметъра token на копирания URL адрес.",
     "goAlert": "GoAlert",
@@ -586,10 +586,10 @@
     "statusMaintenance": "Поддръжка",
     "Schedule maintenance": "Планиране на поддръжка",
     "Affected Monitors": "Засегнати монитори",
-    "Pick Affected Monitors...": "Изберете засегнати монитори...",
+    "Pick Affected Monitors...": "Изберете засегнатите монитори…",
     "Start of maintenance": "Стартирай поддръжка",
     "All Status Pages": "Всички статус страници",
-    "Select status pages...": "Изберете статус страници...",
+    "Select status pages...": "Изберете статус страници…",
     "recurringIntervalMessage": "Изпълнявай ежедневно | Изпълнявай всеки {0} дни",
     "affectedMonitorsDescription": "Изберете монитори, засегнати от текущата поддръжка",
     "affectedStatusPages": "Покажи това съобщение за поддръжка на избрани статус страници",
@@ -674,5 +674,14 @@
     "Kook": "Kook",
     "wayToGetKookBotToken": "Създайте приложение и вземете вашия бот токен на {0}",
     "wayToGetKookGuildID": "Превключете в 'Developer Mode' в 'Kook' настройките, след което десен клик върху 'guild' за да вземете неговото 'ID'",
-    "Guild ID": "Guild ID"
-}
\ No newline at end of file
+    "Guild ID": "Guild ID",
+    "Help": "Помощ",
+    "Game": "игрови",
+    "Custom": "Потребителски",
+    "infiniteRetention": "Задайте стойност 0 за безкрайно съхранение.",
+    "Monitor": "Монитор | Монитори",
+    "dataRetentionTimeError": "Периодът на съхранение трябва да е 0 или по-голям",
+    "confirmDeleteTagMsg": "Сигурни ли сте, че желаете да изтриете този таг? Мониторите, свързани с него, няма да бъдат изтрити.",
+    "promosmsAllowLongSMS": "Позволи дълъг SMS",
+    "Packet Size": "Размер на пакет"
+}
diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
index 18177f6f..679431c3 100644
--- a/src/lang/da-DK.json
+++ b/src/lang/da-DK.json
@@ -96,7 +96,7 @@
     "Certificate Info": "Certifikatoplysninger",
     "keywordDescription": "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.",
     "deleteMonitorMsg": "Er du sikker på, at du vil slette overvågeren?",
-    "deleteNotificationMsg": "Er du sikker på, at du vil slette denne underretning for alle overvågere? ",
+    "deleteNotificationMsg": "Er du sikker på, at du vil slette denne underretning for alle overvågere?",
     "resolverserverDescription": "Cloudflare er standardserveren, den kan til enhver tid ændres.",
     "Resolver Server": "Navne-server",
     "rrtypeDescription": "Vælg den type RR, du vil overvåge.",
@@ -350,6 +350,5 @@
     "serwersmsAPIUser": "API Brugernavn (inkl. webapi_ prefix)",
     "serwersmsAPIPassword": "API Adgangskode",
     "serwersmsPhoneNumber": "Telefonnummer",
-    "serwersmsSenderName": "SMS Afsender Navn (registreret via kundeportal)",
-    "stackfield": "Stackfield"
-}
\ No newline at end of file
+    "serwersmsSenderName": "SMS Afsender Navn (registreret via kundeportal)"
+}
diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
index b39814f9..85da35e0 100644
--- a/src/lang/de-CH.json
+++ b/src/lang/de-CH.json
@@ -79,7 +79,7 @@
     "Enable Auth": "Authentifizierung aktivieren",
     "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
     "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
-    "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
+    "Please use this option carefully!": "Bitte mit Vorsicht nutzen!",
     "Logout": "Ausloggen",
     "notificationDescription": "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
     "Leave": "Verlassen",
@@ -150,7 +150,7 @@
     "Token": "Token",
     "Show URI": "URI anzeigen",
     "Tags": "Tags",
-    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
+    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen…",
     "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
     "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
     "color": "Farbe",
@@ -163,7 +163,7 @@
     "Indigo": "Indigo",
     "Purple": "Lila",
     "Pink": "Pink",
-    "Search...": "Suchen...",
+    "Search...": "Suchen…",
     "Heartbeat Retry Interval": "Überprüfungsintervall",
     "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
     "retryCheckEverySecond": "Alle {0} Sekunden neu versuchen",
@@ -234,7 +234,7 @@
     "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
     "Bot Display Name": "Bot-Anzeigename",
     "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
-    "Hello @everyone is...": "Hallo {'@'}everyone ist...",
+    "Hello @everyone is...": "Hallo {'@'}everyone ist…",
     "Webhook URL": "Webhook URL",
     "wayToGetTeamsURL": "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
     "Number": "Nummer",
@@ -317,8 +317,8 @@
     "Security": "Sicherheit",
     "Steam API Key": "Steam API Key",
     "Shrink Database": "Datenbank verkleinern",
-    "Pick a RR-Type...": "Wähle ein RR-Typ aus...",
-    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
+    "Pick a RR-Type...": "Wähle ein RR-Typ aus…",
+    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus…",
     "Default": "Standard",
     "HTTP Options": "HTTP Optionen",
     "Create Incident": "Vorfall erstellen",
@@ -565,7 +565,7 @@
     "Examples": "Beispiele",
     "Home Assistant URL": "Home Assistant URL",
     "Long-Lived Access Token": "Lange gültiges Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
     "Notification Service": "Benachrichtigungsdienst",
     "default: notify all devices": "standard: Alle Geräte benachrichtigen",
     "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
@@ -580,10 +580,10 @@
     "statusMaintenance": "Wartung",
     "Schedule maintenance": "Geplante Wartung",
     "Affected Monitors": "Betroffene Monitore",
-    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
+    "Pick Affected Monitors...": "Wähle betroffene Monitore…",
     "Start of maintenance": "Beginn der Wartung",
     "All Status Pages": "Alle Status Seiten",
-    "Select status pages...": "Wähle Status Seiten...",
+    "Select status pages...": "Wähle Status Seiten…",
     "recurringIntervalMessage": "einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
     "affectedMonitorsDescription": "Wähle alle Monitore die von der Wartung betroffen sind",
     "affectedStatusPages": "Zeige diese Nachricht auf ausgewählten Status Seiten",
@@ -593,7 +593,7 @@
     "goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
     "goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
     "goAlert": "GoAlert",
-    "backupOutdatedWarning": "Veraltet:  Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
+    "backupOutdatedWarning": "Veraltet: Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
     "backupRecommend": "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
     "Optional": "Optional",
     "squadcast": "Squadcast",
@@ -629,6 +629,5 @@
     "maintenanceStatus-ended": "Ende",
     "maintenanceStatus-unknown": "Unbekannt",
     "Display Timezone": "Zeitzone anzeigen",
-    "Server Timezone": "Server Zeitzone",
-    "statusPageMaintenanceEndDate": "Ende"
-}
\ No newline at end of file
+    "Server Timezone": "Server Zeitzone"
+}
diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 938ab195..45b5ae56 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -79,7 +79,7 @@
     "Enable Auth": "Authentifizierung aktivieren",
     "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
     "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
-    "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
+    "Please use this option carefully!": "Bitte mit Vorsicht nutzen!",
     "Logout": "Ausloggen",
     "notificationDescription": "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
     "Leave": "Verlassen",
@@ -150,7 +150,7 @@
     "Token": "Token",
     "Show URI": "URI anzeigen",
     "Tags": "Tags",
-    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen...",
+    "Add New below or Select...": "Einen bestehenden Tag auswählen oder neuen hinzufügen…",
     "Tag with this name already exist.": "Ein Tag mit diesem Namen existiert bereits.",
     "Tag with this value already exist.": "Ein Tag mit diesem Wert existiert bereits.",
     "color": "Farbe",
@@ -163,7 +163,7 @@
     "Indigo": "Indigo",
     "Purple": "Lila",
     "Pink": "Pink",
-    "Search...": "Suchen...",
+    "Search...": "Suchen…",
     "Heartbeat Retry Interval": "Überprüfungsintervall",
     "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
     "retryCheckEverySecond": "Alle {0} Sekunden neu versuchen",
@@ -234,7 +234,7 @@
     "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
     "Bot Display Name": "Bot-Anzeigename",
     "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
-    "Hello @everyone is...": "Hallo {'@'}everyone ist...",
+    "Hello @everyone is...": "Hallo {'@'}everyone ist…",
     "Webhook URL": "Webhook URL",
     "wayToGetTeamsURL": "Wie eine Webhook-URL erstellt werden kann, erfährst du {0}.",
     "Number": "Nummer",
@@ -317,8 +317,8 @@
     "Security": "Sicherheit",
     "Steam API Key": "Steam API Key",
     "Shrink Database": "Datenbank verkleinern",
-    "Pick a RR-Type...": "Wähle ein RR-Typ aus...",
-    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus...",
+    "Pick a RR-Type...": "Wähle ein RR-Typ aus…",
+    "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus…",
     "Default": "Standard",
     "HTTP Options": "HTTP Optionen",
     "Create Incident": "Vorfall erstellen",
@@ -565,7 +565,7 @@
     "Examples": "Beispiele",
     "Home Assistant URL": "Home Assistant URL",
     "Long-Lived Access Token": "Lange gültiges Access Token",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token  können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Lange gültige Access Token können durch klicken auf den Profilnamen (unten links) und dann einen Klick auf Create Token am Ende erstellt werden. ",
     "Notification Service": "Benachrichtigungsdienst",
     "default: notify all devices": "standard: Alle Geräte benachrichtigen",
     "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Eine Liste der Benachrichtigungsdienste kann im Home Assistant unter \"Developer Tools > Services\" gefunden werden, wnen man nach \"notification\" sucht um den Geräte-/Telefonnamen zu finden.",
@@ -580,10 +580,10 @@
     "statusMaintenance": "Wartung",
     "Schedule maintenance": "Geplante Wartung",
     "Affected Monitors": "Betroffene Monitore",
-    "Pick Affected Monitors...": "Wähle betroffene Monitore...",
+    "Pick Affected Monitors...": "Wähle betroffene Monitore…",
     "Start of maintenance": "Beginn der Wartung",
     "All Status Pages": "Alle Status Seiten",
-    "Select status pages...": "Statusseiten auswählen...",
+    "Select status pages...": "Statusseiten auswählen…",
     "recurringIntervalMessage": "Einmal pro Tag ausgeführt | Wird alle {0} Tage ausgführt",
     "affectedMonitorsDescription": "Wähle Monitore aus, die von der aktuellen Wartung betroffen sind",
     "affectedStatusPages": "Diese Wartungsmeldung auf ausgewählten Statusseiten anzeigen",
@@ -637,5 +637,11 @@
     "Date and Time": "Datum und Zeit",
     "DateTime Range": "Datums- und Zeitbereich",
     "Strategy": "Strategie",
-    "statusPageMaintenanceEndDate": "Ende"
-}
\ No newline at end of file
+    "statusPageMaintenanceEndDate": "Ende",
+    "Help": "Hilfe",
+    "Game": "Spiel",
+    "Custom": "Benutzerdefiniert",
+    "Enable DNS Cache": "DNS Cache aktivieren",
+    "Enable": "Aktivieren",
+    "Disable": "Deaktivieren"
+}
diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json
index cbd6497d..c77d6158 100644
--- a/src/lang/el-GR.json
+++ b/src/lang/el-GR.json
@@ -584,4 +584,4 @@
     "goAlert": "GoAlert",
     "backupOutdatedWarning": "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται πολη, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
     "backupRecommend": "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του volume ή του φακέλου δεδομένων (./data/) απευθείας."
-}
\ No newline at end of file
+}
diff --git a/src/lang/en.json b/src/lang/en.json
index 14ba725f..f2f16693 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -281,7 +281,6 @@
     "Remove Token": "Remove Token",
     "Start": "Start",
     "Stop": "Stop",
-    "Uptime Kuma": "Uptime Kuma",
     "Add New Status Page": "Add New Status Page",
     "Slug": "Slug",
     "Accept characters:": "Accept characters:",
diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index 2a3ae446..9a40ee8b 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -206,4 +206,4 @@
     "records": "registros",
     "One record": "Un registro",
     "steamApiKeyDescription": "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: "
-}
\ No newline at end of file
+}
diff --git a/src/lang/et-EE.json b/src/lang/et-EE.json
index 53ef8abd..f7a23a6c 100644
--- a/src/lang/et-EE.json
+++ b/src/lang/et-EE.json
@@ -206,4 +206,4 @@
     "alertaApiKey": "API võti",
     "alertaAlertState": "Häireseisund",
     "alertaRecoverState": "Taasta algolek"
-}
\ No newline at end of file
+}
diff --git a/src/lang/eu.json b/src/lang/eu.json
index d5e3f91c..9d667a58 100644
--- a/src/lang/eu.json
+++ b/src/lang/eu.json
@@ -538,4 +538,4 @@
     "Domain": "Domeinua",
     "Workstation": "Lan gunea",
     "disableCloudflaredNoAuthMsg": "Ez Auth moduan zaude, pasahitza ez da beharrezkoa."
-}
\ No newline at end of file
+}
diff --git a/src/lang/fa.json b/src/lang/fa.json
index 3809ec33..6d158481 100644
--- a/src/lang/fa.json
+++ b/src/lang/fa.json
@@ -187,22 +187,5 @@
     "One record": "یک مورد",
     "Info": "اطلاعات",
     "Powered by": "نیرو گرفته از",
-    "telegram": "Telegram",
-    "webhook": "Webhook",
-    "smtp": "Email (SMTP)",
-    "discord": "Discord",
-    "teams": "Microsoft Teams",
-    "signal": "Signal",
-    "gotify": "Gotify",
-    "slack": "Slack",
-    "rocket.chat": "Rocket.chat",
-    "pushover": "Pushover",
-    "pushy": "Pushy",
-    "octopush": "Octopush",
-    "promosms": "PromoSMS",
-    "lunasea": "LunaSea",
     "apprise": "Apprise (Support 50+ Notification services)",
-    "pushbullet": "Pushbullet",
-    "line": "Line Messenger",
-    "mattermost": "Mattermost"
-}
\ No newline at end of file
+}
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index f9a520d6..c87b4874 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -682,5 +682,6 @@
     "confirmDeleteTagMsg": "Voulez-vous vraiment supprimer cette étiquettes ? Les moniteurs associés ne seront pas supprimés.",
     "promosmsAllowLongSMS": "Autoriser les longs SMS",
     "Help": "Aide",
-    "Game": "Jeux"
+    "Game": "Jeux",
+    "Packet Size": "Taille du paquet"
 }
diff --git a/src/lang/he-IL.json b/src/lang/he-IL.json
index 469e1d4d..c8219ff5 100644
--- a/src/lang/he-IL.json
+++ b/src/lang/he-IL.json
@@ -669,4 +669,4 @@
     "General Monitor Type": "מוניטור כללי",
     "Passive Monitor Type": "מוניטור פסיבי",
     "Specific Monitor Type": "סוג מוניטור ספציפי"
-}
\ No newline at end of file
+}
diff --git a/src/lang/hr-HR.json b/src/lang/hr-HR.json
index 698b1afd..417b689e 100644
--- a/src/lang/hr-HR.json
+++ b/src/lang/hr-HR.json
@@ -578,4 +578,4 @@
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Potrebno je i odabrati akciju za izvođenje na Home Assistantu.",
     "Frontend Version": "Inačica sučelja",
     "Frontend Version do not match backend version!": "Inačica sučelja ne odgovara poslužitelju!"
-}
\ No newline at end of file
+}
diff --git a/src/lang/hu.json b/src/lang/hu.json
index 17645dbb..78036a1f 100644
--- a/src/lang/hu.json
+++ b/src/lang/hu.json
@@ -373,4 +373,4 @@
     "alertaAlertState": "Figyelmeztetési állapot",
     "alertaRecoverState": "Visszaállási állapot",
     "deleteStatusPageMsg": "Biztos, hogy törölni akarja a státusz oldalt?"
-}
\ No newline at end of file
+}
diff --git a/src/lang/id-ID.json b/src/lang/id-ID.json
index b0903155..59a06521 100644
--- a/src/lang/id-ID.json
+++ b/src/lang/id-ID.json
@@ -582,4 +582,4 @@
     "goAlert": "GoAlert",
     "backupOutdatedWarning": "Tidak digunakan lagi: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
     "backupRecommend": "Harap cadangkan volume atau folder data (./data/) secara langsung."
-}
\ No newline at end of file
+}
diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json
index c4c719e0..ccb8132f 100644
--- a/src/lang/it-IT.json
+++ b/src/lang/it-IT.json
@@ -100,7 +100,7 @@
     "Update Password": "Modifica password",
     "Disable Auth": "Disabilita autenticazione",
     "Enable Auth": "Abilita autenticazione",
-    "disableauth.message1": "<strong>Disabilitare l'autenticazione?</strong>",
+    "disableauth.message1": "<strong>Disabilitare l'autenticazione</strong>?",
     "disableauth.message2": "<strong>Questa opzione è per chi un sistema di autenticazione gestito da terze parti</strong> messo davanti ad Uptime Kuma, ad esempio Cloudflare Access.",
     "Please use this option carefully!": "Utilizzare con attenzione!",
     "Logout": "Esci",
@@ -364,4 +364,4 @@
     "smtpDkimheaderFieldNames": "Campi Intestazione da firmare (opzionale)",
     "smtpDkimskipFields": "Campi Intestazione da non firmare (opzionale)",
     "GoogleChat": "Google Chat (solo per Google Workspace)"
-}
\ No newline at end of file
+}
diff --git a/src/lang/ja.json b/src/lang/ja.json
index 42ae45ee..76ca4c23 100644
--- a/src/lang/ja.json
+++ b/src/lang/ja.json
@@ -136,10 +136,6 @@
     "Disable 2FA": "2段階認証を無効にする",
     "2FA Settings": "2段階認証の設定",
     "Two Factor Authentication": "2段階認証",
-    "Active": "Active",
-    "Inactive": "Inactive",
-    "Token": "Token",
-    "Show URI": "Show URI",
     "Clear all statistics": "すべての記録を削除",
     "retryCheckEverySecond": "Retry every {0} seconds.",
     "importHandleDescription": "同じ名前のすべての監視または通知方法を上書きしない場合は、「既存のをスキップ」を選択します。 「上書きする」は、既存のすべてのモニターと通知を削除します。",
@@ -157,14 +153,6 @@
     "Tag with this value already exist.": "この値のタグはすでに存在しています。",
     "color": "色",
     "value (optional)": "値 (optional)",
-    "Gray": "Gray",
-    "Red": "Red",
-    "Orange": "Orange",
-    "Green": "Green",
-    "Blue": "Blue",
-    "Indigo": "Indigo",
-    "Purple": "Purple",
-    "Pink": "Pink",
     "Search...": "検索...",
     "Avg. Ping": "平均Ping時間",
     "Avg. Response": "平均応答時間",
@@ -179,23 +167,5 @@
     "Edit Status Page": "ステータスページ編集",
     "Go to Dashboard": "ダッシュボード",
     "Status Page": "ステータスページ",
-    "Status Pages": "ステータスページ",
-    "telegram": "Telegram",
-    "webhook": "Webhook",
-    "smtp": "Email (SMTP)",
-    "discord": "Discord",
-    "teams": "Microsoft Teams",
-    "signal": "Signal",
-    "gotify": "Gotify",
-    "slack": "Slack",
-    "rocket.chat": "Rocket.chat",
-    "pushover": "Pushover",
-    "pushy": "Pushy",
-    "octopush": "Octopush",
-    "promosms": "PromoSMS",
-    "lunasea": "LunaSea",
-    "apprise": "Apprise (Support 50+ Notification services)",
-    "pushbullet": "Pushbullet",
-    "line": "Line Messenger",
-    "mattermost": "Mattermost"
-}
\ No newline at end of file
+    "Status Pages": "ステータスページ"
+}
diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
index c2d7b880..2cb2131c 100644
--- a/src/lang/ko-KR.json
+++ b/src/lang/ko-KR.json
@@ -528,4 +528,4 @@
     "Go back to the previous page.": "이전 페이지로 돌아가기",
     "Coming Soon": "Coming Soon...",
     "wayToGetClickSendSMSToken": "{0}에서 API 사용자 이름과 키를 얻을 수 있어요."
-}
\ No newline at end of file
+}
diff --git a/src/lang/nb-NO.json b/src/lang/nb-NO.json
index b215abd1..1ddc4d17 100644
--- a/src/lang/nb-NO.json
+++ b/src/lang/nb-NO.json
@@ -271,7 +271,7 @@
     "Basic Settings": "Grunnleggende instillinger",
     "User ID": "Bruker-ID",
     "Messaging API": "Meldings-API",
-    "wayToGetLineChannelToken": "Først, få tilgang til {0}, lag en leverandør og kanal (Meldings-API),  deretter kan du hente kanaltilgangs-token og bruker id fra menu-valgene nevnt over.",
+    "wayToGetLineChannelToken": "Først, få tilgang til {0}, lag en leverandør og kanal (Meldings-API), deretter kan du hente kanaltilgangs-token og bruker id fra menu-valgene nevnt over.",
     "Icon URL": "Ikon URL",
     "aboutIconURL": "Du kan gi en link til et bilde i \"Ikon URL\" for å overskrive det standard profilbildet. Vil ikke bli brukt hvis Ikon Emoji ikke er satt.",
     "aboutMattermostChannelName": "Du kan overskrive standardkanalen som webhook-en poster i ved å skrive enn kanalnavnet i \"Kanalnavn\" feltet. Dette må være skrudd på i Mattermost webhook-instillingene. Eks: #other-channel",
@@ -282,4 +282,4 @@
     "promosmsTypeSpeed": "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
     "promosmsPhoneNumber": "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
     "promosmsSMSSender": "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS"
-}
\ No newline at end of file
+}
diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json
index e16519fe..32c79545 100644
--- a/src/lang/nl-NL.json
+++ b/src/lang/nl-NL.json
@@ -519,7 +519,7 @@
     "Retype the address.": "De URL controleren en/of opnnieuw typen.",
     "Go back to the previous page.": "Terug naar de vorige pagina.",
     "Coming Soon": "Binnenkort beschikbaar",
-    "wayToGetClickSendSMSToken": "Je kan een  API Username en API Key krijgen vanuit {0} .",
+    "wayToGetClickSendSMSToken": "Je kan een API Username en API Key krijgen vanuit {0} .",
     "Connection String": "Connection String",
     "Query": "Query",
     "settingsCertificateExpiry": "TLS Certificate Expiry",
@@ -528,4 +528,4 @@
     "Domain": "Domein",
     "Workstation": "Werkstation",
     "disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist."
-}
\ No newline at end of file
+}
diff --git a/src/lang/pl.json b/src/lang/pl.json
index 88123547..802fa56d 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -14,7 +14,7 @@
     "deleteMonitorMsg": "Czy na pewno chcesz usunąć ten monitor?",
     "deleteNotificationMsg": "Czy na pewno chcesz usunąć to powiadomienie dla wszystkich monitorów?",
     "resolverserverDescription": "Cloudflare jest domyślnym serwerem, możesz zmienić serwer resolver w każdej chwili.",
-    "rrtypeDescription": "Wybierz rodzaj rekordu, który chcesz monitorować.",
+    "rrtypeDescription": "Wybierz rodzaj rekordu, który chcesz monitorować",
     "pauseMonitorMsg": "Czy na pewno chcesz wstrzymać monitorowanie?",
     "enableDefaultNotificationDescription": "Dla każdego nowego monitora to powiadomienie będzie domyślnie włączone. Nadal możesz wyłączyć powiadomienia osobno dla każdego monitora.",
     "clearEventsMsg": "Jesteś pewien, że chcesz wyczyścić historię zdarzeń dla tego monitora?",
@@ -22,7 +22,7 @@
     "confirmClearStatisticsMsg": "Jesteś pewien, że chcesz usunąć WSZYSTKIE statystyki?",
     "importHandleDescription": "Wybierz 'Pomiń istniejące', jeśli chcesz pominąć każdy monitor lub powiadomienie o tej samej nazwie. 'Nadpisz' spowoduje usunięcie każdego istniejącego monitora i powiadomienia.",
     "confirmImportMsg": "Czy na pewno chcesz zaimportować kopię zapasową? Upewnij się, że wybrałeś właściwą opcję importu.",
-    "twoFAVerifyLabel": "Proszę, podaj swój token 2FA, aby sprawdzić, czy 2FA działa.",
+    "twoFAVerifyLabel": "Proszę, podaj swój token 2FA, aby sprawdzić, czy 2FA działa:",
     "tokenValidSettingsMsg": "Token jest prawidłowy! Teraz możesz zapisać ustawienia 2FA.",
     "confirmEnableTwoFAMsg": "Jesteś pewien, że chcesz włączyć 2FA?",
     "confirmDisableTwoFAMsg": "Jesteś pewien, że chcesz wyłączyć 2FA?",
@@ -56,9 +56,9 @@
     "Uptime": "Czas pracy",
     "Cert Exp.": "Certyfikat wygasa",
     "day": "dzień | dni",
-    "-day": " dni",
+    "-day": "dni",
     "hour": "godzina",
-    "-hour": " godzin",
+    "-hour": "godzin",
     "Response": "Odpowiedź",
     "Ping": "Ping",
     "Monitor Type": "Rodzaj monitora",
@@ -98,7 +98,7 @@
     "Enable Auth": "Włącz autoryzację",
     "disableauth.message1": "Czy na pewno chcesz <strong>wyłączyć autoryzację</strong>?",
     "disableauth.message2": "Jest przeznaczony dla <strong>kogoś, kto ma autoryzację zewnętrzną</strong> przed Uptime Kuma, taką jak Cloudflare Access.",
-    "Please use this option carefully!": "Proszę używać ostrożnie.",
+    "Please use this option carefully!": "Proszę używać tej opcji ostrożnie!",
     "Logout": "Wyloguj",
     "Leave": "Zostaw",
     "I understand, please disable": "Rozumiem, proszę wyłączyć",
@@ -154,7 +154,7 @@
     "Token": "Token",
     "Show URI": "Pokaż URI",
     "Tags": "Tagi",
-    "Add New below or Select...": "Dodaj nowy poniżej lub wybierz...",
+    "Add New below or Select...": "Dodaj nowy poniżej lub wybierz…",
     "Tag with this name already exist.": "Tag o tej nazwie już istnieje.",
     "Tag with this value already exist.": "Tag o tej wartości już istnieje.",
     "color": "kolor",
@@ -167,7 +167,7 @@
     "Indigo": "Indygo",
     "Purple": "Fioletowy",
     "Pink": "Różowy",
-    "Search...": "Szukaj...",
+    "Search...": "Szukaj…",
     "Avg. Ping": "Średni ping",
     "Avg. Response": "Średnia odpowiedź",
     "Entry Page": "Strona startowa",
@@ -211,7 +211,7 @@
     "wayToGetDiscordURL": "Możesz go uzyskać, przechodząc do Ustawienia serwera -> Integracje -> Tworzenie webhooka",
     "Bot Display Name": "Wyświetlana nazwa bota",
     "Prefix Custom Message": "Własny początek wiadomości",
-    "Hello @everyone is...": "Hej {'@'}everyone ...",
+    "Hello @everyone is...": "Hej {'@'}everyone…",
     "teams": "Microsoft Teams",
     "Webhook URL": "URL webhooka",
     "wayToGetTeamsURL": "Możesz dowiedzieć się, jak utworzyć adres url webhooka {0}.",
@@ -256,7 +256,7 @@
     "octopushTypePremium": "Premium (szybki - rekomendowany dla powiadomień)",
     "octopushTypeLowCost": "Low Cost (wolny, czasami blokowany przez operatorów)",
     "Check octopush prices": "Sprawdź ceny Octopush {0}.",
-    "octopushPhoneNumber": "Numer telefonu (format międzynarodowy np.: +33612345678)",
+    "octopushPhoneNumber": "Numer telefonu (format międzynarodowy np.: +33612345678) ",
     "octopushSMSSender": "Nadawca SMS: 3-11 znaków alfanumerycznych i spacji (a-zA-Z0-9)",
     "LunaSea Device ID": "Identyfikator urządzenia LunaSea",
     "Apprise URL": "URL Apprise",
@@ -278,16 +278,16 @@
     "aboutIconURL": "Możesz podać link do zdjęcia w \"Adres URL ikony\", aby zastąpić domyślne zdjęcie profilowe. Nie będzie używany, jeśli ustawiona jest ikona emoji.",
     "aboutMattermostChannelName": "Możesz zastąpić domyślny kanał, na którym publikowane są posty webhooka, wpisując nazwę kanału w polu \"Nazwa kanału\". Należy to włączyć w ustawieniach webhooka Mattermost. Np.: #inny-kanał",
     "matrix": "Matrix",
-    "promosmsTypeEco": "SMS ECO - tanie, lecz wolne. Dostępne tylko w Polsce",
+    "promosmsTypeEco": "SMS ECO - tanie, lecz wolne. Dostępne tylko w Polsce.",
     "promosmsTypeFlash": "SMS FLASH - wiadomość automatycznie wyświetli się na urządzeniu. Dostępne tylko w Polsce.",
     "promosmsTypeFull": "SMS FULL - szybkie i dostępne międzynarodowo. Wersja premium usługi, która pozwala min. ustawić własną nazwę nadawcy.",
-    "promosmsTypeSpeed": "SMS SPEED - wysyłka priorytetowa, ma wszystkie zalety SMS FULL",
+    "promosmsTypeSpeed": "SMS SPEED - wysyłka priorytetowa, ma wszystkie zalety SMS FULL.",
     "promosmsPhoneNumber": "Numer odbiorcy",
     "promosmsSMSSender": "Nadawca SMS (wcześniej zatwierdzone nazwy z panelu PromoSMS)",
     "promosmsAllowLongSMS": "Zezwól na długie SMSy",
     "Primary Base URL": "Główny URL",
     "Push URL": "Push URL",
-    "needPushEvery": "Powinieneś wywoływać ten URL co {0} sekund",
+    "needPushEvery": "Powinieneś wywoływać ten URL co {0} sekund.",
     "pushOptionalParams": "Parametry opcjonalne: {0}",
     "emailCustomSubject": "Niestandardowy temat",
     "checkPrice": "Sprawdź ceny {0}:",
@@ -320,8 +320,8 @@
     "Security": "Bezpieczeństwo",
     "Steam API Key": "Klucz Steam API",
     "Shrink Database": "Zmniejsz bazę danych",
-    "Pick a RR-Type...": "Wybierz typ RR...",
-    "Pick Accepted Status Codes...": "Wybierz akceptowalne kody statusu...",
+    "Pick a RR-Type...": "Wybierz typ RR…",
+    "Pick Accepted Status Codes...": "Wybierz akceptowalne kody statusu…",
     "Default": "Domyślnie",
     "HTTP Options": "Opcje HTTP",
     "Create Incident": "Stwórz incydent",
@@ -375,7 +375,7 @@
     "Custom Footer": "Niestandardowa stopka",
     "Custom CSS": "Niestandardowy CSS",
     "smtpDkimSettings": "Ustawienia DKIM",
-    "smtpDkimDesc": "Zapoznaj się z Nodemailer DKIM {0}, aby dowiedzieć się więcej",
+    "smtpDkimDesc": "Zapoznaj się z Nodemailer DKIM {0}, aby dowiedzieć się więcej.",
     "documentation": "dokumentacja",
     "smtpDkimDomain": "Nazwa domeny",
     "smtpDkimKeySelector": "Selektor klucza",
@@ -412,7 +412,7 @@
     "WebHookUrl": "WebHookUrl",
     "SecretKey": "Tajny klucz",
     "For safety, must use secret key": "Ze względów bezpieczeństwa musisz użyć tajnego klucza",
-    "Device Token": "Device Token",
+    "Device Token": "Token urządzenia",
     "Platform": "Platforma",
     "iOS": "iOS",
     "Android": "Android",
@@ -484,10 +484,10 @@
     "statusMaintenance": "Konserwacja",
     "Schedule maintenance": "Planowanie konserwacji",
     "Affected Monitors": "Monitory dotknięte problemem",
-    "Pick Affected Monitors...": "Wybierz monitory, których to dotyczy...",
+    "Pick Affected Monitors...": "Wybierz monitory, których to dotyczy…",
     "Start of maintenance": "Rozpoczęcie konserwacji",
     "All Status Pages": "Wszystkie strony statusu",
-    "Select status pages...": "Wybierz strony statusu...",
+    "Select status pages...": "Wybierz strony statusu…",
     "recurringIntervalMessage": "Uruchom raz dziennie | Uruchom raz na {0} dni",
     "affectedMonitorsDescription": "Wybierz monitory, których dotyczy bieżąca konserwacja",
     "affectedStatusPages": "Pokaż ten komunikat o konserwacji na wybranych stronach statusu",
@@ -641,5 +641,46 @@
     "maintenanceStatus-unknown": "Nieznany",
     "Display Timezone": "Wyświetlana strefa czasowa",
     "Server Timezone": "Strefa czasowa serwera",
-    "statusPageMaintenanceEndDate": "Koniec"
-}
\ No newline at end of file
+    "statusPageMaintenanceEndDate": "Koniec",
+    "Help": "Pomoc",
+    "Passive Monitor Type": "Pasywny typ monitora",
+    "Enable": "Włącz",
+    "confirmDeleteTagMsg": "Czy na pewno chcesz usunąć ten tag? Monitory powiązane z tym tagiem nie zostaną usunięte.",
+    "Kook": "Kook",
+    "Enable TLS": "Włącz TLS",
+    "webhookAdditionalHeadersDesc": "Ustawia dodatkowe nagłówki wysyłane z webhookiem.",
+    "dnsCacheDescription": "Może nie działać w niektórych środowiskach z IPv6. Wyłącz, jeśli napotkasz jakiekolwiek problemy.",
+    "wayToGetKookBotToken": "Utwórz aplikację i uzyskaj swój token bota na {0}",
+    "wayToGetKookGuildID": "Włącz 'Developer Mode' w ustawieniach Kook'a i kliknij prawym przyciskiem myszy na gildię, aby uzyskać jej ID",
+    "Game": "Gra",
+    "Specific Monitor Type": "Konkretny typ monitora",
+    "Monitor": "Monitor | Monitory",
+    "webhookAdditionalHeadersTitle": "Dodatkowe nagłówki",
+    "Custom": "Własny",
+    "ZohoCliq": "ZohoCliq",
+    "Disable": "Wyłącz",
+    "Date and Time": "Data i czas",
+    "IconUrl": "URL ikony",
+    "Enable DNS Cache": "Włącz pamięć podręczną DNS",
+    "Single Maintenance Window": "Pojedyncze okno konserwacji",
+    "Effective Date Range": "Zakres dat obowiązywania",
+    "Schedule Maintenance": "Planowanie konserwacji",
+    "DateTime Range": "Zakres czasowy",
+    "Maintenance Time Window of a Day": "Okno czasowe konserwacji na dzień",
+    "wayToGetZohoCliqURL": "Możesz dowiedzieć się, jak utworzyć adres URL webhook {0}.",
+    "dataRetentionTimeError": "Okres przechowywania musi wynosić 0 lub więcej",
+    "infiniteRetention": "Ustaw na 0, aby uzyskać nieskończony okres przechowywania.",
+    "enableGRPCTls": "Zezwalaj na wysyłanie żądania gRPC z połączeniem TLS",
+    "grpcMethodDescription": "Nazwa metody jest konwertowana na format cammelCase, taki jak sayHello, check, itp.",
+    "Guild ID": "ID gildii",
+    "Proto Content": "Zawartość Proto",
+    "Proto Method": "Metoda Proto",
+    "Proto Service Name": "Nazwa usługi Proto",
+    "Economy": "Ekonomia",
+    "Strategy": "Strategia",
+    "Free Mobile User Identifier": "Darmowy mobilny identyfikator użytkownika",
+    "Free Mobile API Key": "Darmowy mobilny klucz API",
+    "Lowcost": "Tani",
+    "high": "wysoki",
+    "General Monitor Type": "Ogólny typ monitora"
+}
diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json
index 3164702a..b7ebdbd4 100644
--- a/src/lang/pt-BR.json
+++ b/src/lang/pt-BR.json
@@ -1,7 +1,7 @@
 {
     "languageName": "Português (Brasileiro)",
-    "checkEverySecond": "Verificar cada {0} segundos.",
-    "retryCheckEverySecond": "Tentar novamente a cada {0} segundos.",
+    "checkEverySecond": "Verificar a cada {0} segundos",
+    "retryCheckEverySecond": "Tentar novamente a cada {0} segundos",
     "retriesDescription": "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
     "ignoreTLSError": "Ignorar erros TLS/SSL para sites HTTPS",
     "upsideDownModeDescription": "Inverta o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
@@ -9,7 +9,7 @@
     "acceptedStatusCodesDescription": "Selecione os códigos de status que são considerados uma resposta bem-sucedida.",
     "passwordNotMatchMsg": "A senha repetida não corresponde.",
     "notificationDescription": "Atribua uma notificação ao (s) monitor (es) para que funcione.",
-    "keywordDescription": "Pesquise a palavra-chave em html simples ou resposta JSON e diferencia maiúsculas de minúsculas",
+    "keywordDescription": "Pesquise a palavra-chave em html simples ou resposta JSON e diferencia maiúsculas de minúsculas.",
     "pauseDashboardHome": "Pausar",
     "deleteMonitorMsg": "Tem certeza de que deseja excluir este monitor?",
     "deleteNotificationMsg": "Tem certeza de que deseja excluir esta notificação para todos os monitores?",
@@ -22,7 +22,7 @@
     "confirmClearStatisticsMsg": "Tem certeza que deseja excluir TODAS as estatísticas?",
     "importHandleDescription": "Escolha 'Ignorar existente' se quiser ignorar todos os monitores ou notificações com o mesmo nome. 'Substituir' excluirá todos os monitores e notificações existentes.",
     "confirmImportMsg": "Tem certeza que deseja importar o backup? Certifique-se de que selecionou a opção de importação correta.",
-    "twoFAVerifyLabel": "Digite seu token para verificar se 2FA está funcionando",
+    "twoFAVerifyLabel": "Digite seu token para verificar se 2FA está funcionando:",
     "tokenValidSettingsMsg": "O token é válido! Agora você pode salvar as configurações 2FA.",
     "confirmEnableTwoFAMsg": "Tem certeza de que deseja habilitar 2FA?",
     "confirmDisableTwoFAMsg": "Tem certeza de que deseja desativar 2FA?",
@@ -72,7 +72,7 @@
     "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeat",
     "Advanced": "Avançado",
     "Upside Down Mode": "Modo de cabeça para baixo",
-    "Max. Redirects": "Redirecionamento Máx.",
+    "Max. Redirects": "Redirecionamentos Máx",
     "Accepted Status Codes": "Status Code Aceitáveis",
     "Save": "Salvar",
     "Notifications": "Notificações",
@@ -98,10 +98,10 @@
     "Enable Auth": "Ativar Autenticação",
     "disableauth.message1": "Você tem certeza que deseja <strong>desativar a autenticação</strong>?",
     "disableauth.message2": "Isso é para <strong>alguém que tem autenticação de terceiros</strong> na frente do 'UpTime Kuma' como o Cloudflare Access.",
-    "Please use this option carefully!": "Por favor, utilize isso com cautela.",
+    "Please use this option carefully!": "Por favor, utilize isso com cautela!",
     "Logout": "Deslogar",
     "Leave": "Sair",
-    "I understand, please disable": "Eu entendo, por favor desative.",
+    "I understand, please disable": "Eu entendo, por favor desative",
     "Confirm": "Confirmar",
     "Yes": "Sim",
     "No": "Não",
@@ -114,7 +114,7 @@
     "Notification Type": "Tipo de Notificação",
     "Email": "Email",
     "Test": "Testar",
-    "Certificate Info": "Info. do Certificado ",
+    "Certificate Info": "Info. do Certificado",
     "Resolver Server": "Resolver Servidor",
     "Resource Record Type": "Tipo de registro de aplicação",
     "Last Result": "Último resultado",
@@ -147,14 +147,14 @@
     "Setup 2FA": "Configurar 2FA",
     "Enable 2FA": "Ativar 2FA",
     "Disable 2FA": "Desativar 2FA",
-    "2FA Settings": "Configurações do 2FA ",
+    "2FA Settings": "Configurações do 2FA",
     "Two Factor Authentication": "Autenticação e Dois Fatores",
     "Active": "Ativo",
     "Inactive": "Inativo",
     "Token": "Token",
     "Show URI": "Mostrar URI",
     "Tags": "Tag",
-    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar ...",
+    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar…",
     "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
     "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
     "color": "cor",
@@ -167,9 +167,9 @@
     "Indigo": "Índigo",
     "Purple": "Roxo",
     "Pink": "Rosa",
-    "Search...": "Buscar...",
-    "Avg. Ping": "Ping Médio.",
-    "Avg. Response": "Resposta Média. ",
+    "Search...": "Buscar…",
+    "Avg. Ping": "Ping Médio",
+    "Avg. Response": "Resposta Média",
     "Status Page": "Página de Status",
     "Status Pages": "Página de Status",
     "Entry Page": "Página de entrada",
@@ -182,22 +182,92 @@
     "Add a monitor": "Adicionar um monitor",
     "Edit Status Page": "Editar Página de Status",
     "Go to Dashboard": "Ir para a dashboard",
-    "telegram": "Telegram",
-    "webhook": "Webhook",
-    "smtp": "Email (SMTP)",
-    "discord": "Discord",
-    "teams": "Microsoft Teams",
-    "signal": "Signal",
-    "gotify": "Gotify",
-    "slack": "Slack",
-    "rocket.chat": "Rocket.chat",
-    "pushover": "Pushover",
-    "pushy": "Pushy",
-    "octopush": "Octopush",
-    "promosms": "PromoSMS",
-    "lunasea": "LunaSea",
-    "apprise": "Apprise (Support 50+ Notification services)",
-    "pushbullet": "Pushbullet",
-    "line": "Line Messenger",
-    "mattermost": "Mattermost"
-}
\ No newline at end of file
+    "apprise": "Apprise (Suporta mais de 50 serviços de notificação)",
+    "Help": "Ajuda",
+    "Select status pages...": "Selecionar status pages…",
+    "Game": "Jogo",
+    "Passive Monitor Type": "Tipo de monitoramento passivo",
+    "Specific Monitor Type": "Especificar tipo de monitoramento",
+    "Monitor": "Monitoramento | Monitoramentos",
+    "needPushEvery": "Você deve chamar esta URL a cada {0} segundos.",
+    "Push URL": "Push URL",
+    "Custom": "Personalizado",
+    "here": "aqui",
+    "Required": "Requerido",
+    "webhookJsonDesc": "{0} é bom para qualquer servidor HTTP moderno, como Express.js",
+    "webhookAdditionalHeadersTitle": "Cabeçalhos Adicionais",
+    "webhookAdditionalHeadersDesc": "Define cabeçalhos adicionais enviados com o webhook.",
+    "Webhook URL": "Webhook URL",
+    "Priority": "Prioridade",
+    "Read more": "Ver mais",
+    "appriseInstalled": "Apprise está instalado.",
+    "appriseNotInstalled": "Apprise não está instalado. {0}",
+    "Headers": "Cabeçalhos",
+    "BodyInvalidFormat": "O corpo da solicitação não é um JSON válido: ",
+    "Monitor History": "Histórico de monitoramento",
+    "clearDataOlderThan": "Mantenha os dados do histórico do monitoramento por {0} dias.",
+    "PasswordsDoNotMatch": "As senhas não coincidem.",
+    "records": "registros",
+    "One record": "Um registro",
+    "Current User": "Usuário atual",
+    "successMessage": "Mensagem de sucesso",
+    "Post URL": "Posto URL",
+    "Application Token": "Token de aplicativo",
+    "Server URL": "URL do servidor",
+    "Body": "Corpo",
+    "PushUrl": "Push URL",
+    "recent": "Recente",
+    "Done": "Feito",
+    "Info": "Informação",
+    "Security": "Segurança",
+    "Steam API Key": "API Key da Steam",
+    "Default": "Padrão",
+    "HTTP Options": "Opções HTTP",
+    "Create Incident": "Criar incidente",
+    "Title": "Título",
+    "Style": "Estilo",
+    "info": "informação",
+    "danger": "perigo",
+    "Please input title and content": "Por favor, inclua título e o conteúdo",
+    "Created": "Criado",
+    "Last Updated": "Última atualização",
+    "Switch to Light Theme": "Mudar para tema claro",
+    "Show Tags": "Mostrar tags",
+    "Hide Tags": "Esconder tags",
+    "Description": "Descrição",
+    "No monitors available.": "Nenhum monitoramento disponível.",
+    "Add one": "Adicionar um",
+    "No Monitors": "Sem monitoramentos",
+    "Services": "Serviços",
+    "Discard": "Descartar",
+    "Cancel": "Cancelar",
+    "Customize": "Customizar",
+    "Custom CSS": "CSS personalizado",
+    "deleteStatusPageMsg": "Tem certeza que deseja apagar essa status page?",
+    "Proxies": "Proxies",
+    "default": "Padrão",
+    "enabled": "Ativado",
+    "setAsDefault": "Definir como padrão",
+    "Primary Base URL": "URL base principal",
+    "Resend Notification if Down X times consequently": "Reenviar notificação se OFFLINE X vezes consecutivamente",
+    "pushOptionalParams": "Parâmetros opcionais: {0}",
+    "webhookFormDataDesc": "{multipart} é bom para PHP. O JSON precisará ser analisado com {decodeFunction}",
+    "HeadersInvalidFormat": "Os cabeçalhos da solicitação não são um JSON válidos: ",
+    "steamApiKeyDescription": "Para monitorar um Steam Game Server, você precisa de uma chave Steam Web-API. Você pode registrar sua chave de API aqui: ",
+    "warning": "atenção",
+    "Switch to Dark Theme": "Mudar para tema escuro",
+    "Custom Footer": "Rodapé personalizado",
+    "error": "erro",
+    "critical": "crítico",
+    "dark": "escuro",
+    "statusMaintenance": "Manutenção",
+    "Maintenance": "Manutenção",
+    "resendEveryXTimes": "Reenviar a cada {0} vezes",
+    "resendDisabled": "Reenvio desativado",
+    "Schedule maintenance": "Manutenção agendada",
+    "Affected Monitors": "Monitoramentos afetados",
+    "Start of maintenance": "Iniciar manutenção",
+    "All Status Pages": "Todas as Status Pages",
+    "Method": "Método",
+    "General Monitor Type": "Tipo de monitoramento geral"
+}
diff --git a/src/lang/pt-PT.json b/src/lang/pt-PT.json
index 454d5b07..e3ce55e9 100644
--- a/src/lang/pt-PT.json
+++ b/src/lang/pt-PT.json
@@ -181,23 +181,5 @@
     "Add Group": "Adicionar Grupo",
     "Add a monitor": "Adicionar um monitor",
     "Edit Status Page": "Editar Página de Status",
-    "Go to Dashboard": "Ir para o dashboard",
-    "telegram": "Telegram",
-    "webhook": "Webhook",
-    "smtp": "Email (SMTP)",
-    "discord": "Discord",
-    "teams": "Microsoft Teams",
-    "signal": "Signal",
-    "gotify": "Gotify",
-    "slack": "Slack",
-    "rocket.chat": "Rocket.chat",
-    "pushover": "Pushover",
-    "pushy": "Pushy",
-    "octopush": "Octopush",
-    "promosms": "PromoSMS",
-    "lunasea": "LunaSea",
-    "apprise": "Apprise (Support 50+ Notification services)",
-    "pushbullet": "Pushbullet",
-    "line": "Line Messenger",
-    "mattermost": "Mattermost"
-}
\ No newline at end of file
+    "Go to Dashboard": "Ir para o dashboard"
+}
diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 50b55fe3..8395eedb 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -596,7 +596,5 @@
     "resendEveryXTimes": "Повторная отправка каждые {0} раз",
     "resendDisabled": "Повторная отправка отключена",
     "deleteMaintenanceMsg": "Вы действительно хотите удалить это обслуживание?",
-    "ZohoCliq": "ZohoCliq",
-    "critical": "критично",
-    "smseagle": "SMSEagle"
+    "critical": "критично"
 }
diff --git a/src/lang/sl-SI.json b/src/lang/sl-SI.json
index d1476285..f4ca81bd 100644
--- a/src/lang/sl-SI.json
+++ b/src/lang/sl-SI.json
@@ -352,6 +352,5 @@
     "serwersmsAPIUser": "API uporabniško ime (vključno z webapi_ prefix)",
     "serwersmsAPIPassword": "API geslo",
     "serwersmsPhoneNumber": "Telefonska številka",
-    "serwersmsSenderName": "Ime SMS pošiljatelja (registrirani prek portala za stranke)",
-    "stackfield": "Stackfield"
-}
\ No newline at end of file
+    "serwersmsSenderName": "Ime SMS pošiljatelja (registrirani prek portala za stranke)"
+}
diff --git a/src/lang/sr-latn.json b/src/lang/sr-latn.json
index ff92748f..f5134477 100644
--- a/src/lang/sr-latn.json
+++ b/src/lang/sr-latn.json
@@ -109,96 +109,5 @@
     "Create your admin account": "Naprivi administratorski nalog",
     "Repeat Password": "Ponovite lozinku",
     "respTime": "Vreme odg. (ms)",
-    "notAvailableShort": "N/A",
-    "Create": "Create",
-    "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
-    "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
-    "confirmClearStatisticsMsg": "Are you sure want to delete ALL statistics?",
-    "Clear Data": "Clear Data",
-    "Events": "Events",
-    "Heartbeats": "Heartbeats",
-    "Auto Get": "Auto Get",
-    "enableDefaultNotificationDescription": "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
-    "Default enabled": "Default enabled",
-    "Also apply to existing monitors": "Also apply to existing monitors",
-    "Export": "Export",
-    "Import": "Import",
-    "backupDescription": "You can backup all monitors and all notifications into a JSON file.",
-    "backupDescription2": "PS: History and event data is not included.",
-    "backupDescription3": "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
-    "alertNoFile": "Please select a file to import.",
-    "alertWrongFileType": "Please select a JSON file.",
-    "twoFAVerifyLabel": "Please type in your token to verify that 2FA is working",
-    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
-    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
-    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
-    "Apply on all existing monitors": "Apply on all existing monitors",
-    "Verify Token": "Verify Token",
-    "Setup 2FA": "Setup 2FA",
-    "Enable 2FA": "Enable 2FA",
-    "Disable 2FA": "Disable 2FA",
-    "2FA Settings": "2FA Settings",
-    "Two Factor Authentication": "Two Factor Authentication",
-    "Active": "Active",
-    "Inactive": "Inactive",
-    "Token": "Token",
-    "Show URI": "Show URI",
-    "Clear all statistics": "Clear all Statistics",
-    "retryCheckEverySecond": "Retry every {0} seconds.",
-    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    "confirmImportMsg": "Are you sure to import the backup? Please make sure you've selected the right import option.",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "Import Backup",
-    "Export Backup": "Export Backup",
-    "Skip existing": "Skip existing",
-    "Overwrite": "Overwrite",
-    "Options": "Options",
-    "Keep both": "Keep both",
-    "Tags": "Tags",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exist.",
-    "Tag with this value already exist.": "Tag with this value already exist.",
-    "color": "color",
-    "value (optional)": "value (optional)",
-    "Gray": "Gray",
-    "Red": "Red",
-    "Orange": "Orange",
-    "Green": "Green",
-    "Blue": "Blue",
-    "Indigo": "Indigo",
-    "Purple": "Purple",
-    "Pink": "Pink",
-    "Search...": "Search...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. Response",
-    "Entry Page": "Entry Page",
-    "statusPageNothing": "Nothing here, please add a group or a monitor.",
-    "No Services": "No Services",
-    "All Systems Operational": "All Systems Operational",
-    "Partially Degraded Service": "Partially Degraded Service",
-    "Degraded Service": "Degraded Service",
-    "Add Group": "Add Group",
-    "Add a monitor": "Add a monitor",
-    "Edit Status Page": "Edit Status Page",
-    "Go to Dashboard": "Go to Dashboard",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    "telegram": "Telegram",
-    "webhook": "Webhook",
-    "smtp": "Email (SMTP)",
-    "discord": "Discord",
-    "teams": "Microsoft Teams",
-    "signal": "Signal",
-    "gotify": "Gotify",
-    "slack": "Slack",
-    "rocket.chat": "Rocket.chat",
-    "pushover": "Pushover",
-    "pushy": "Pushy",
-    "octopush": "Octopush",
-    "promosms": "PromoSMS",
-    "lunasea": "LunaSea",
-    "apprise": "Apprise (Support 50+ Notification services)",
-    "pushbullet": "Pushbullet",
-    "line": "Line Messenger",
-    "mattermost": "Mattermost"
-}
\ No newline at end of file
+    "notAvailableShort": "N/A"
+}
diff --git a/src/lang/sr.json b/src/lang/sr.json
index fcdb3316..34bec92a 100644
--- a/src/lang/sr.json
+++ b/src/lang/sr.json
@@ -108,97 +108,5 @@
     "Last Result": "Последњи резултат",
     "Create your admin account": "Наприви администраторски налог",
     "Repeat Password": "Поновите лозинку",
-    "respTime": "Време одг. (мс)",
-    "notAvailableShort": "N/A",
-    "Create": "Create",
-    "clearEventsMsg": "Are you sure want to delete all events for this monitor?",
-    "clearHeartbeatsMsg": "Are you sure want to delete all heartbeats for this monitor?",
-    "confirmClearStatisticsMsg": "Are you sure want to delete ALL statistics?",
-    "Clear Data": "Clear Data",
-    "Events": "Events",
-    "Heartbeats": "Heartbeats",
-    "Auto Get": "Auto Get",
-    "enableDefaultNotificationDescription": "For every new monitor this notification will be enabled by default. You can still disable the notification separately for each monitor.",
-    "Default enabled": "Default enabled",
-    "Also apply to existing monitors": "Also apply to existing monitors",
-    "Export": "Export",
-    "Import": "Import",
-    "backupDescription": "You can backup all monitors and all notifications into a JSON file.",
-    "backupDescription2": "PS: History and event data is not included.",
-    "backupDescription3": "Sensitive data such as notification tokens is included in the export file, please keep it carefully.",
-    "alertNoFile": "Please select a file to import.",
-    "alertWrongFileType": "Please select a JSON file.",
-    "twoFAVerifyLabel": "Please type in your token to verify that 2FA is working",
-    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
-    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
-    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
-    "Apply on all existing monitors": "Apply on all existing monitors",
-    "Verify Token": "Verify Token",
-    "Setup 2FA": "Setup 2FA",
-    "Enable 2FA": "Enable 2FA",
-    "Disable 2FA": "Disable 2FA",
-    "2FA Settings": "2FA Settings",
-    "Two Factor Authentication": "Two Factor Authentication",
-    "Active": "Active",
-    "Inactive": "Inactive",
-    "Token": "Token",
-    "Show URI": "Show URI",
-    "Clear all statistics": "Clear all Statistics",
-    "retryCheckEverySecond": "Retry every {0} seconds.",
-    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    "confirmImportMsg": "Are you sure to import the backup? Please make sure you've selected the right import option.",
-    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Import Backup": "Import Backup",
-    "Export Backup": "Export Backup",
-    "Skip existing": "Skip existing",
-    "Overwrite": "Overwrite",
-    "Options": "Options",
-    "Keep both": "Keep both",
-    "Tags": "Tags",
-    "Add New below or Select...": "Add New below or Select...",
-    "Tag with this name already exist.": "Tag with this name already exist.",
-    "Tag with this value already exist.": "Tag with this value already exist.",
-    "color": "color",
-    "value (optional)": "value (optional)",
-    "Gray": "Gray",
-    "Red": "Red",
-    "Orange": "Orange",
-    "Green": "Green",
-    "Blue": "Blue",
-    "Indigo": "Indigo",
-    "Purple": "Purple",
-    "Pink": "Pink",
-    "Search...": "Search...",
-    "Avg. Ping": "Avg. Ping",
-    "Avg. Response": "Avg. Response",
-    "Entry Page": "Entry Page",
-    "statusPageNothing": "Nothing here, please add a group or a monitor.",
-    "No Services": "No Services",
-    "All Systems Operational": "All Systems Operational",
-    "Partially Degraded Service": "Partially Degraded Service",
-    "Degraded Service": "Degraded Service",
-    "Add Group": "Add Group",
-    "Add a monitor": "Add a monitor",
-    "Edit Status Page": "Edit Status Page",
-    "Go to Dashboard": "Go to Dashboard",
-    "Status Page": "Status Page",
-    "Status Pages": "Status Pages",
-    "telegram": "Telegram",
-    "webhook": "Webhook",
-    "smtp": "Email (SMTP)",
-    "discord": "Discord",
-    "teams": "Microsoft Teams",
-    "signal": "Signal",
-    "gotify": "Gotify",
-    "slack": "Slack",
-    "rocket.chat": "Rocket.chat",
-    "pushover": "Pushover",
-    "pushy": "Pushy",
-    "octopush": "Octopush",
-    "promosms": "PromoSMS",
-    "lunasea": "LunaSea",
-    "apprise": "Apprise (Support 50+ Notification services)",
-    "pushbullet": "Pushbullet",
-    "line": "Line Messenger",
-    "mattermost": "Mattermost"
-}
\ No newline at end of file
+    "respTime": "Време одг. (мс)"
+}
diff --git a/src/lang/sv-SE.json b/src/lang/sv-SE.json
index 29a47756..7110067b 100644
--- a/src/lang/sv-SE.json
+++ b/src/lang/sv-SE.json
@@ -105,6 +105,5 @@
     "Last Result": "Senaste resultat",
     "Create your admin account": "Skapa ditt administratörskonto",
     "Repeat Password": "Upprepa Lösenord",
-    "respTime": "Svarstid (ms)",
-    "notAvailableShort": "Ej Tillg."
-}
\ No newline at end of file
+    "respTime": "Svarstid (ms)"
+}
diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
index 33268010..7ad132f5 100644
--- a/src/lang/th-TH.json
+++ b/src/lang/th-TH.json
@@ -577,4 +577,4 @@
     "Then choose an action, for example switch the scene to where an RGB light is red.": "จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง",
     "Frontend Version": "เวอร์ชั่น Frontend",
     "Frontend Version do not match backend version!": "เวอร์ชั่น Frontend ไม่ตรงกับ Backend !"
-}
\ No newline at end of file
+}
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 560be296..f57e6c74 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -234,7 +234,6 @@
     "Application Token": "Uygulama Tokeni",
     "Server URL": "Sunucu URL",
     "Priority": "Öncelik",
-    "slack": "Slack",
     "Icon Emoji": "İkon Emoji",
     "Channel Name": "Kanal Adı",
     "Uptime Kuma URL": "Uptime Kuma URL",
@@ -242,19 +241,10 @@
     "aboutChannelName": "Webhook kanalını atlamak istiyorsanız, {0} Kanal Adı alanına kanal adını girin. Ör: #diğer-kanal",
     "aboutKumaURL": "Uptime Kuma URL alanını boş bırakırsanız, varsayılan olarak Project GitHub sayfası olur.",
     "emojiCheatSheet": "Emoji cheat sheet: {0}",
-    "rocket.chat": "Rocket.Chat",
-    "pushover": "Pushover",
-    "pushy": "Pushy",
     "PushByTechulus": "Push by Techulus",
-    "octopush": "Octopush",
-    "promosms": "PromoSMS",
-    "clicksendsms": "ClickSend SMS",
-    "lunasea": "LunaSea",
     "apprise": "Apprise (50'den fazla Bildirim hizmetini destekler)",
     "GoogleChat": "Google Chat (sadece Google Workspace)",
     "pushbullet": "Pushbullet",
-    "line": "Line Messenger",
-    "mattermost": "Mattermost",
     "User Key": "Kullancı Anahtarı",
     "Device": "Cihaz",
     "Message Title": "Mesaj Başlığı",
diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
index 018c45c9..fcd678a3 100644
--- a/src/lang/uk-UA.json
+++ b/src/lang/uk-UA.json
@@ -527,4 +527,4 @@
     "Domain": "Домен",
     "Workstation": "Робоча станція",
     "disableCloudflaredNoAuthMsg": "Ви перебуваєте в режимі без авторизації, пароль не потрібен."
-}
\ No newline at end of file
+}
diff --git a/src/lang/vi-VN.json b/src/lang/vi-VN.json
index 022b5053..165bf1bb 100644
--- a/src/lang/vi-VN.json
+++ b/src/lang/vi-VN.json
@@ -265,7 +265,7 @@
     "apiCredentials": "API credentials",
     "octopushLegacyHint": "Bạn muốn sử dụng phiên bản cũ của Octopush (2011-2020) hay phiên bản mới?",
     "Check octopush prices": "Kiểm tra giá octopush {0}.",
-    "octopushPhoneNumber": "Số điện thoại (Định dạng intl, vd : +84692341165​) ",
+    "octopushPhoneNumber": "Số điện thoại (Định dạng intl, vd : +84692341165) ",
     "octopushSMSSender": "SMS người gửi : 3-11 ký tự chữ, số và dấu cách (a-zA-Z0-9)",
     "LunaSea Device ID": "LunaSea ID thiết bị",
     "Apprise URL": "Apprise URL",
@@ -459,11 +459,5 @@
     "onebotGroupMessage": "Group",
     "onebotPrivateMessage": "Private",
     "onebotUserOrGroupId": "Group/User ID",
-    "onebotSafetyTips": "Để đảm bảo an toàn, hãy thiết lập access token",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "Footer Text",
-    "Show Powered By": "Show Powered By",
-    "Domain Names": "Domain Names",
-    "signedInDisp": "Signed in as {0}",
-    "signedInDispDisabled": "Auth Disabled."
-}
\ No newline at end of file
+    "onebotSafetyTips": "Để đảm bảo an toàn, hãy thiết lập access token"
+}
diff --git a/src/lang/yue.json b/src/lang/yue.json
index cc9a1edb..6fdd7ac8 100644
--- a/src/lang/yue.json
+++ b/src/lang/yue.json
@@ -10,7 +10,7 @@
     "Theme": "主題",
     "Game": "遊戲",
     "Version": "版本",
-    "Check Update On GitHub": "去  GitHub  睇下有冇更新",
+    "Check Update On GitHub": "去 GitHub 睇下有冇更新",
     "List": "列表",
     "Add": "新增"
 }
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index e3faa8e1..26ee5747 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -383,7 +383,7 @@
     "Services": "服务",
     "Discard": "放弃",
     "Cancel": "取消",
-    "Powered by": "Powered by",
+    "Powered by": "技术支持:",
     "shrinkDatabaseDescription": "触发 SQLite 数据库的 VACUUM 命令,如果您的数据库是在 1.10.0 版本之后创建的,则已启用 AUTO_VACUUM,不再需要此操作。",
     "serwersms": "SerwerSMS.pl",
     "serwersmsAPIUser": "API 用户名(包括 webapi_ 前缀)",
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
index d9d0256e..142ebf2d 100644
--- a/src/lang/zh-TW.json
+++ b/src/lang/zh-TW.json
@@ -668,6 +668,5 @@
     "high": "高",
     "General Monitor Type": "一般監測器類型",
     "Passive Monitor Type": "被動監測器類型",
-    "Specific Monitor Type": "指定監測器類型",
-    "ZohoCliq": "ZohoCliq"
+    "Specific Monitor Type": "指定監測器類型"
 }

From d99d37898e6abc2753a3ae06e4dfff5c42e8cbd6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 26 Jan 2023 00:59:38 +0800
Subject: [PATCH 504/803] Fix

---
 src/lang/fa.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/fa.json b/src/lang/fa.json
index 6d158481..16effc34 100644
--- a/src/lang/fa.json
+++ b/src/lang/fa.json
@@ -187,5 +187,5 @@
     "One record": "یک مورد",
     "Info": "اطلاعات",
     "Powered by": "نیرو گرفته از",
-    "apprise": "Apprise (Support 50+ Notification services)",
+    "apprise": "Apprise (Support 50+ Notification services)"
 }

From 2673b509a598c9dc311b00cf9205a0353c9b5609 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Wed, 25 Jan 2023 20:22:50 +0300
Subject: [PATCH 505/803] Add "Body Encoding" to en.json

---
 src/lang/en.json | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index f2f16693..d01ccd20 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -682,5 +682,6 @@
     "onebotUserOrGroupId": "Group/User ID",
     "onebotSafetyTips": "For safety, must set access token",
     "PushDeer Key": "PushDeer Key",
-    "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} ."
+    "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
+    "Body Encoding": "Body Encoding"
 }

From e5ca67d0626092b379f3e6691a40ada7dc03ebc3 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 27 Jan 2023 18:25:57 +0800
Subject: [PATCH 506/803] HTTPS Monitor using Real Browsers + Limited plugin
 support (#1787)

---
 server/database.js                            |   8 +
 server/git.js                                 |  24 ++
 server/model/monitor.js                       |  12 +-
 server/monitor-types/monitor-type.js          |  19 ++
 server/notification-providers/clicksendsms.js |   1 -
 server/plugin.js                              |  13 +
 server/plugins-manager.js                     | 235 ++++++++++++++++++
 server/server.js                              |   5 +-
 server/socket-handlers/plugins-handler.js     |  65 +++++
 server/uptime-kuma-server.js                  |  56 +++++
 src/components/PluginItem.vue                 | 102 ++++++++
 src/components/settings/Plugins.vue           |  57 +++++
 src/lang/en.json                              |   7 +
 src/pages/EditMonitor.vue                     |  10 +-
 src/pages/Settings.vue                        |   3 +
 src/router.js                                 |   6 +
 16 files changed, 616 insertions(+), 7 deletions(-)
 create mode 100644 server/git.js
 create mode 100644 server/monitor-types/monitor-type.js
 create mode 100644 server/plugin.js
 create mode 100644 server/plugins-manager.js
 create mode 100644 server/socket-handlers/plugins-handler.js
 create mode 100644 src/components/PluginItem.vue
 create mode 100644 src/components/settings/Plugins.vue

diff --git a/server/database.js b/server/database.js
index 5ca88cac..06b81153 100644
--- a/server/database.js
+++ b/server/database.js
@@ -4,6 +4,7 @@ const { setSetting, setting } = require("./util-server");
 const { log, sleep } = require("../src/util");
 const dayjs = require("dayjs");
 const knex = require("knex");
+const { PluginsManager } = require("./plugins-manager");
 
 /**
  * Database & App Data Folder
@@ -85,6 +86,13 @@ class Database {
     static init(args) {
         // Data Directory (must be end with "/")
         Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/";
+
+        // Plugin feature is working only if the dataDir = "./data";
+        if (Database.dataDir !== "./data/") {
+            log.warn("PLUGIN", "Warning: In order to enable plugin feature, you need to use the default data directory: ./data/");
+            PluginsManager.disable = true;
+        }
+
         Database.path = Database.dataDir + "kuma.db";
         if (! fs.existsSync(Database.dataDir)) {
             fs.mkdirSync(Database.dataDir, { recursive: true });
diff --git a/server/git.js b/server/git.js
new file mode 100644
index 00000000..77a12d93
--- /dev/null
+++ b/server/git.js
@@ -0,0 +1,24 @@
+const childProcess = require("child_process");
+
+class Git {
+
+    static clone(repoURL, cwd, targetDir = ".") {
+        let result = childProcess.spawnSync("git", [
+            "clone",
+            repoURL,
+            targetDir,
+        ], {
+            cwd: cwd,
+        });
+
+        if (result.status !== 0) {
+            throw new Error(result.stderr.toString("utf-8"));
+        } else {
+            return result.stdout.toString("utf-8") + result.stderr.toString("utf-8");
+        }
+    }
+}
+
+module.exports = {
+    Git,
+};
diff --git a/server/model/monitor.js b/server/model/monitor.js
index e06c15e2..c3e91f93 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -655,9 +655,17 @@ class Monitor extends BeanModel {
                     bean.msg = await redisPingAsync(this.databaseConnectionString);
                     bean.status = UP;
                     bean.ping = dayjs().valueOf() - startTime;
+
+                } else if (this.type in UptimeKumaServer.monitorTypeList) {
+                    let startTime = dayjs().valueOf();
+                    const monitorType = UptimeKumaServer.monitorTypeList[this.type];
+                    await monitorType.check(this, bean);
+                    if (!bean.ping) {
+                        bean.ping = dayjs().valueOf() - startTime;
+                    }
+
                 } else {
-                    bean.msg = "Unknown Monitor Type";
-                    bean.status = PENDING;
+                    throw new Error("Unknown Monitor Type");
                 }
 
                 if (this.isUpsideDown()) {
diff --git a/server/monitor-types/monitor-type.js b/server/monitor-types/monitor-type.js
new file mode 100644
index 00000000..f2c7cbee
--- /dev/null
+++ b/server/monitor-types/monitor-type.js
@@ -0,0 +1,19 @@
+class MonitorType {
+
+    name = undefined;
+
+    /**
+     *
+     * @param {Monitor} monitor
+     * @param {Heartbeat} heartbeat
+     * @returns {Promise<void>}
+     */
+    async check(monitor, heartbeat) {
+        throw new Error("You need to override check()");
+    }
+
+}
+
+module.exports = {
+    MonitorType,
+};
diff --git a/server/notification-providers/clicksendsms.js b/server/notification-providers/clicksendsms.js
index e66b982c..1df05309 100644
--- a/server/notification-providers/clicksendsms.js
+++ b/server/notification-providers/clicksendsms.js
@@ -8,7 +8,6 @@ class ClickSendSMS extends NotificationProvider {
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
         try {
-            console.log({ notification });
             let config = {
                 headers: {
                     "Content-Type": "application/json",
diff --git a/server/plugin.js b/server/plugin.js
new file mode 100644
index 00000000..8b687ad6
--- /dev/null
+++ b/server/plugin.js
@@ -0,0 +1,13 @@
+class Plugin {
+    async load() {
+
+    }
+
+    async unload() {
+
+    }
+}
+
+module.exports = {
+    Plugin,
+};
diff --git a/server/plugins-manager.js b/server/plugins-manager.js
new file mode 100644
index 00000000..e48c53c8
--- /dev/null
+++ b/server/plugins-manager.js
@@ -0,0 +1,235 @@
+const fs = require("fs");
+const { log } = require("../src/util");
+const path = require("path");
+const axios = require("axios");
+const { Git } = require("./git");
+const childProcess = require("child_process");
+
+class PluginsManager {
+
+    static disable = false;
+
+    /**
+     * Plugin List
+     * @type {PluginWrapper[]}
+     */
+    pluginList = [];
+
+    /**
+     * Plugins Dir
+     */
+    pluginsDir;
+
+    server;
+
+    /**
+     *
+     * @param {UptimeKumaServer} server
+     */
+    constructor(server) {
+        this.server = server;
+
+        if (!PluginsManager.disable) {
+            this.pluginsDir = "./data/plugins/";
+
+            if (! fs.existsSync(this.pluginsDir)) {
+                fs.mkdirSync(this.pluginsDir, { recursive: true });
+            }
+
+            log.debug("plugin", "Scanning plugin directory");
+            let list = fs.readdirSync(this.pluginsDir);
+
+            this.pluginList = [];
+            for (let item of list) {
+                this.loadPlugin(item);
+            }
+
+        } else {
+            log.warn("PLUGIN", "Skip scanning plugin directory");
+        }
+
+    }
+
+    /**
+     * Install a Plugin
+     */
+    async loadPlugin(name) {
+        log.info("plugin", "Load " + name);
+        let plugin = new PluginWrapper(this.server, this.pluginsDir + name);
+
+        try {
+            await plugin.load();
+            this.pluginList.push(plugin);
+        } catch (e) {
+            log.error("plugin", "Failed to load plugin: " + this.pluginsDir + name);
+            log.error("plugin", "Reason: " + e.message);
+        }
+    }
+
+    /**
+     * Download a Plugin
+     * @param {string} repoURL Git repo url
+     * @param {string} name Directory name, also known as plugin unique name
+     */
+    downloadPlugin(repoURL, name) {
+        log.info("plugin", "Installing plugin: " + name + " " + repoURL);
+        let result = Git.clone(repoURL, this.pluginsDir, name);
+        log.info("plugin", "Install result: " + result);
+    }
+
+    /**
+     * Remove a plugin
+     * @param {string} name
+     */
+    async removePlugin(name) {
+        log.info("plugin", "Removing plugin: " + name);
+        for (let plugin of this.pluginList) {
+            if (plugin.info.name === name) {
+                await plugin.unload();
+
+                // Delete the plugin directory
+                fs.rmSync(this.pluginsDir + name, {
+                    recursive: true
+                });
+
+                this.pluginList.splice(this.pluginList.indexOf(plugin), 1);
+                return;
+            }
+        }
+        log.warn("plugin", "Plugin not found: " + name);
+        throw new Error("Plugin not found: " + name);
+    }
+
+    /**
+     * TODO: Update a plugin
+     * Only available for plugins which were downloaded from the official list
+     * @param pluginID
+     */
+    updatePlugin(pluginID) {
+
+    }
+
+    /**
+     * Get the plugin list from server + local installed plugin list
+     * Item will be merged if the `name` is the same.
+     * @returns {Promise<[]>}
+     */
+    async fetchPluginList() {
+        const res = await axios.get("https://uptime.kuma.pet/c/plugins.json");
+        const list = res.data.pluginList;
+
+        for (let plugin of this.pluginList) {
+            let find = false;
+            // Try to merge
+            for (let remotePlugin of list) {
+                if (remotePlugin.name === plugin.info.name) {
+                    find = true;
+                    remotePlugin.installed = true;
+                    remotePlugin.name = plugin.info.name;
+                    remotePlugin.fullName = plugin.info.fullName;
+                    remotePlugin.description = plugin.info.description;
+                    remotePlugin.version = plugin.info.version;
+                    break;
+                }
+            }
+
+            // Local plugin
+            if (!find) {
+                plugin.info.local = true;
+                list.push(plugin.info);
+            }
+        }
+
+        // Sort Installed first, then sort by name
+        return list.sort((a, b) => {
+            if (a.installed === b.installed) {
+                if ( a.fullName < b.fullName ) {
+                    return -1;
+                }
+                if ( a.fullName > b.fullName ) {
+                    return 1;
+                }
+                return 0;
+            } else if (a.installed) {
+                return -1;
+            } else {
+                return 1;
+            }
+        });
+    }
+}
+
+class PluginWrapper {
+
+    server = undefined;
+    pluginDir = undefined;
+
+    /**
+     * Must be an `new-able` class.
+     * @type {function}
+     */
+    pluginClass = undefined;
+
+    /**
+     *
+     * @type {Plugin}
+     */
+    object = undefined;
+    info = {};
+
+    /**
+     *
+     * @param {UptimeKumaServer} server
+     * @param {string} pluginDir
+     */
+    constructor(server, pluginDir) {
+        this.server = server;
+        this.pluginDir = pluginDir;
+    }
+
+    async load() {
+        let indexFile = this.pluginDir + "/index.js";
+        let packageJSON = this.pluginDir + "/package.json";
+
+        if (fs.existsSync(indexFile)) {
+            // Install dependencies
+            childProcess.execSync("npm install", {
+                cwd: this.pluginDir,
+                env: {
+                    PLAYWRIGHT_BROWSERS_PATH: "../../browsers",    // Special handling for read-browser-monitor
+                }
+            });
+
+            this.pluginClass = require(path.join(process.cwd(), indexFile));
+
+            let pluginClassType = typeof this.pluginClass;
+
+            if (pluginClassType === "function") {
+                this.object = new this.pluginClass(this.server);
+                await this.object.load();
+            } else {
+                throw new Error("Invalid plugin, it does not export a class");
+            }
+
+            if (fs.existsSync(packageJSON)) {
+                this.info = require(path.join(process.cwd(), packageJSON));
+            } else {
+                this.info.fullName = this.pluginDir;
+                this.info.name = "[unknown]";
+                this.info.version = "[unknown-version]";
+            }
+
+            this.info.installed = true;
+            log.info("plugin", `${this.info.fullName} v${this.info.version} loaded`);
+        }
+    }
+
+    async unload() {
+        await this.object.unload();
+    }
+}
+
+module.exports = {
+    PluginsManager,
+    PluginWrapper
+};
diff --git a/server/server.js b/server/server.js
index 9c18fcd1..5fbc8e55 100644
--- a/server/server.js
+++ b/server/server.js
@@ -138,6 +138,7 @@ const { maintenanceSocketHandler } = require("./socket-handlers/maintenance-sock
 const { generalSocketHandler } = require("./socket-handlers/general-socket-handler");
 const { Settings } = require("./settings");
 const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
+const { pluginsHandler } = require("./socket-handlers/plugins-handler");
 
 app.use(express.json());
 
@@ -166,7 +167,7 @@ let needSetup = false;
     Database.init(args);
     await initDatabase(testMode);
     await server.initAfterDatabaseReady();
-
+    server.loadPlugins();
     server.entryPage = await Settings.get("entryPage");
     await StatusPage.loadDomainMappingList();
 
@@ -574,7 +575,6 @@ let needSetup = false;
                     });
                 }
             } catch (error) {
-                console.log(error);
                 callback({
                     ok: false,
                     msg: error.message,
@@ -1501,6 +1501,7 @@ let needSetup = false;
         dockerSocketHandler(socket);
         maintenanceSocketHandler(socket);
         generalSocketHandler(socket, server);
+        pluginsHandler(socket, server);
 
         log.debug("server", "added all socket handlers");
 
diff --git a/server/socket-handlers/plugins-handler.js b/server/socket-handlers/plugins-handler.js
new file mode 100644
index 00000000..4ee712c7
--- /dev/null
+++ b/server/socket-handlers/plugins-handler.js
@@ -0,0 +1,65 @@
+const { checkLogin } = require("../util-server");
+const { PluginManager } = require("../plugins-manager");
+
+/**
+ * Handlers for plugins
+ * @param {Socket} socket Socket.io instance
+ * @param {UptimeKumaServer} server
+ */
+module.exports.pluginsHandler = (socket, server) => {
+
+    const pluginManager = server.getPluginManager();
+
+    // Get Plugin List
+    socket.on("getPluginList", async (callback) => {
+        try {
+            checkLogin(socket);
+
+            if (PluginManager.disable) {
+                throw new Error("Plugin Disabled: In order to enable plugin feature, you need to use the default data directory: ./data/");
+            }
+
+            let pluginList = await pluginManager.fetchPluginList();
+            callback({
+                ok: true,
+                pluginList,
+            });
+        } catch (error) {
+            callback({
+                ok: false,
+                msg: error.message,
+            });
+        }
+    });
+
+    socket.on("installPlugin", async (repoURL, name, callback) => {
+        try {
+            checkLogin(socket);
+            pluginManager.downloadPlugin(repoURL, name);
+            await pluginManager.loadPlugin(name);
+            callback({
+                ok: true,
+            });
+        } catch (error) {
+            callback({
+                ok: false,
+                msg: error.message,
+            });
+        }
+    });
+
+    socket.on("uninstallPlugin", async (name, callback) => {
+        try {
+            checkLogin(socket);
+            await pluginManager.removePlugin(name);
+            callback({
+                ok: true,
+            });
+        } catch (error) {
+            callback({
+                ok: false,
+                msg: error.message,
+            });
+        }
+    });
+};
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index faffb98b..0573f0d8 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -10,6 +10,7 @@ const util = require("util");
 const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
 const { Settings } = require("./settings");
 const dayjs = require("dayjs");
+const { PluginsManager } = require("./plugins-manager");
 // DO NOT IMPORT HERE IF THE MODULES USED `UptimeKumaServer.getInstance()`
 
 /**
@@ -48,6 +49,20 @@ class UptimeKumaServer {
 
     generateMaintenanceTimeslotsInterval = undefined;
 
+    /**
+     * Plugins Manager
+     * @type {PluginsManager}
+     */
+    pluginsManager = null;
+
+    /**
+     *
+     * @type {{}}
+     */
+    static monitorTypeList = {
+
+    };
+
     static getInstance(args) {
         if (UptimeKumaServer.instance == null) {
             UptimeKumaServer.instance = new UptimeKumaServer(args);
@@ -272,6 +287,46 @@ class UptimeKumaServer {
     async stop() {
         clearTimeout(this.generateMaintenanceTimeslotsInterval);
     }
+
+    loadPlugins() {
+        this.pluginsManager = new PluginsManager(this);
+    }
+
+    /**
+     *
+     * @returns {PluginsManager}
+     */
+    getPluginManager() {
+        return this.pluginsManager;
+    }
+
+    /**
+     *
+     * @param {MonitorType} monitorType
+     */
+    addMonitorType(monitorType) {
+        if (monitorType instanceof MonitorType && monitorType.name) {
+            if (monitorType.name in UptimeKumaServer.monitorTypeList) {
+                log.error("", "Conflict Monitor Type name");
+            }
+            UptimeKumaServer.monitorTypeList[monitorType.name] = monitorType;
+        } else {
+            log.error("", "Invalid Monitor Type: " + monitorType.name);
+        }
+    }
+
+    /**
+     *
+     * @param {MonitorType} monitorType
+     */
+    removeMonitorType(monitorType) {
+        if (UptimeKumaServer.monitorTypeList[monitorType.name] === monitorType) {
+            delete UptimeKumaServer.monitorTypeList[monitorType.name];
+        } else {
+            log.error("", "Remove MonitorType failed: " + monitorType.name);
+        }
+    }
+
 }
 
 module.exports = {
@@ -280,3 +335,4 @@ module.exports = {
 
 // Must be at the end
 const MaintenanceTimeslot = require("./model/maintenance_timeslot");
+const { MonitorType } = require("./monitor-types/monitor-type");
diff --git a/src/components/PluginItem.vue b/src/components/PluginItem.vue
new file mode 100644
index 00000000..4925bc9c
--- /dev/null
+++ b/src/components/PluginItem.vue
@@ -0,0 +1,102 @@
+<template>
+    <div v-if="! (!plugin.installed && plugin.local)" class="plugin-item pt-4 pb-2">
+        <div class="info">
+            <h5>{{ plugin.fullName }}</h5>
+            <p class="description">
+                {{ plugin.description }}
+            </p>
+            <span class="version">{{ $t("Version") }}: {{ plugin.version }} <a v-if="plugin.repo" :href="plugin.repo" target="_blank">Repo</a></span>
+        </div>
+        <div class="buttons">
+            <button v-if="status === 'installing'" class="btn btn-primary" disabled>{{ $t("installing") }}</button>
+            <button v-else-if="status === 'uninstalling'" class="btn btn-danger" disabled>{{ $t("uninstalling") }}</button>
+            <button v-else-if="plugin.installed || status === 'installed'" class="btn btn-danger" @click="deleteConfirm">{{ $t("uninstall") }}</button>
+            <button v-else class="btn btn-primary" @click="install">{{ $t("install") }}</button>
+        </div>
+
+        <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="uninstall">
+            {{ $t("confirmUninstallPlugin") }}
+        </Confirm>
+    </div>
+</template>
+
+<script>
+import Confirm from "./Confirm.vue";
+
+export default {
+    components: {
+        Confirm,
+    },
+    props: {
+        plugin: {
+            type: Object,
+            required: true,
+        },
+    },
+    data() {
+        return {
+            status: "",
+        };
+    },
+    methods: {
+        /**
+         * Show confirmation for deleting a tag
+         */
+        deleteConfirm() {
+            this.$refs.confirmDelete.show();
+        },
+
+        install() {
+            this.status = "installing";
+
+            this.$root.getSocket().emit("installPlugin", this.plugin.repo, this.plugin.name, (res) => {
+                if (res.ok) {
+                    this.status = "";
+                    // eslint-disable-next-line vue/no-mutating-props
+                    this.plugin.installed = true;
+                } else {
+                    this.$root.toastRes(res);
+                }
+            });
+        },
+
+        uninstall() {
+            this.status = "uninstalling";
+
+            this.$root.getSocket().emit("uninstallPlugin", this.plugin.name, (res) => {
+                if (res.ok) {
+                    this.status = "";
+                    // eslint-disable-next-line vue/no-mutating-props
+                    this.plugin.installed = false;
+                } else {
+                    this.$root.toastRes(res);
+                }
+            });
+        }
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../assets/vars.scss";
+
+.plugin-item {
+    display: flex;
+    justify-content: space-between;
+    align-content: center;
+    align-items: center;
+
+    .info {
+        margin-right: 10px;
+    }
+
+    .description {
+        font-size: 13px;
+        margin-bottom: 0;
+    }
+
+    .version {
+        font-size: 13px;
+    }
+}
+</style>
diff --git a/src/components/settings/Plugins.vue b/src/components/settings/Plugins.vue
new file mode 100644
index 00000000..ca39e7ad
--- /dev/null
+++ b/src/components/settings/Plugins.vue
@@ -0,0 +1,57 @@
+<template>
+    <div>
+        <div class="mt-3">{{ remotePluginListMsg }}</div>
+        <PluginItem v-for="plugin in remotePluginList" :key="plugin.id" :plugin="plugin" />
+    </div>
+</template>
+
+<script>
+import PluginItem from "../PluginItem.vue";
+
+export default {
+    components: {
+        PluginItem
+    },
+
+    data() {
+        return {
+            remotePluginList: [],
+            remotePluginListMsg: "",
+        };
+    },
+
+    computed: {
+        pluginList() {
+            return this.$parent.$parent.$parent.pluginList;
+        },
+        settings() {
+            return this.$parent.$parent.$parent.settings;
+        },
+        saveSettings() {
+            return this.$parent.$parent.$parent.saveSettings;
+        },
+        settingsLoaded() {
+            return this.$parent.$parent.$parent.settingsLoaded;
+        },
+    },
+
+    async mounted() {
+        this.loadList();
+    },
+
+    methods: {
+        loadList() {
+            this.remotePluginListMsg = this.$t("Loading") + "...";
+
+            this.$root.getSocket().emit("getPluginList", (res) => {
+                if (res.ok) {
+                    this.remotePluginList = res.pluginList;
+                    this.remotePluginListMsg = "";
+                } else {
+                    this.remotePluginListMsg = this.$t("loadingError") + " " + res.message;
+                }
+            });
+        }
+    },
+};
+</script>
diff --git a/src/lang/en.json b/src/lang/en.json
index f2f16693..cab3dcea 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -428,6 +428,13 @@
     "Schedule Maintenance": "Schedule Maintenance",
     "Date and Time": "Date and Time",
     "DateTime Range": "DateTime Range",
+    "loadingError": "Cannot fetch the data, please try again later.",
+    "plugin": "Plugin | Plugins",
+    "install": "Install",
+    "installing": "Installing",
+    "uninstall": "Uninstall",
+    "uninstalling": "Uninstalling",
+    "confirmUninstallPlugin": "Are you sure want to uninstall this plugin?",
     "smtp": "Email (SMTP)",
     "secureOptionNone": "None / STARTTLS (25, 587)",
     "secureOptionTLS": "TLS (465)",
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 50e97bab..0f7fc4a5 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -70,6 +70,12 @@
                                             Redis
                                         </option>
                                     </optgroup>
+
+                                    <optgroup :label="$t('Custom Monitor Type')">
+                                        <option value="browser">
+                                            (Beta) HTTP(s) - Browser Engine (Chrome/Firefox)
+                                        </option>
+                                    </optgroup>
                                 </select>
                             </div>
 
@@ -80,7 +86,7 @@
                             </div>
 
                             <!-- URL -->
-                            <div v-if="monitor.type === 'http' || monitor.type === 'keyword' " class="my-3">
+                            <div v-if="monitor.type === 'http' || monitor.type === 'keyword' || monitor.type === 'browser' " class="my-3">
                                 <label for="url" class="form-label">{{ $t("URL") }}</label>
                                 <input id="url" v-model="monitor.url" type="url" class="form-control" pattern="https?://.+" required>
                             </div>
@@ -102,7 +108,7 @@
                             </div>
 
                             <!-- Keyword -->
-                            <div v-if="monitor.type === 'keyword' || monitor.type === 'grpc-keyword' " class="my-3">
+                            <div v-if="monitor.type === 'keyword' || monitor.type === 'grpc-keyword'" class="my-3">
                                 <label for="keyword" class="form-label">{{ $t("Keyword") }}</label>
                                 <input id="keyword" v-model="monitor.keyword" type="text" class="form-control" required>
                                 <div class="form-text">
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index f5d32e0e..2b08d04e 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -113,6 +113,9 @@ export default {
                 backup: {
                     title: this.$t("Backup"),
                 },
+                plugins: {
+                    title: this.$tc("plugin", 2),
+                },
                 about: {
                     title: this.$t("About"),
                 },
diff --git a/src/router.js b/src/router.js
index b5b46c30..7bb474ee 100644
--- a/src/router.js
+++ b/src/router.js
@@ -18,6 +18,7 @@ import NotFound from "./pages/NotFound.vue";
 import DockerHosts from "./components/settings/Docker.vue";
 import MaintenanceDetails from "./pages/MaintenanceDetails.vue";
 import ManageMaintenance from "./pages/ManageMaintenance.vue";
+import Plugins from "./components/settings/Plugins.vue";
 
 // Settings - Sub Pages
 import Appearance from "./components/settings/Appearance.vue";
@@ -31,6 +32,7 @@ import Proxies from "./components/settings/Proxies.vue";
 import Backup from "./components/settings/Backup.vue";
 import About from "./components/settings/About.vue";
 
+
 const routes = [
     {
         path: "/",
@@ -120,6 +122,10 @@ const routes = [
                                 path: "backup",
                                 component: Backup,
                             },
+                            {
+                                path: "plugins",
+                                component: Plugins,
+                            },
                             {
                                 path: "about",
                                 component: About,

From 82f875becac4f45b7269caa0365956a125ce3c52 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 27 Jan 2023 23:45:10 +0800
Subject: [PATCH 507/803] Update README.md

---
 src/lang/README.md | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/lang/README.md b/src/lang/README.md
index 4960d62d..aafda2de 100644
--- a/src/lang/README.md
+++ b/src/lang/README.md
@@ -3,6 +3,9 @@
 (2023-01-24 Updated)
 
 1. Go to [https://weblate.kuma.pet](https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/)
+2. Register an account on Weblate
+3. Make sure your GitHub email is matched with Weblate's account, so that it could show you as a contributor on GitHub
+4. Choose your language on Weblate and start translating.
 
 # How to add a new language in the dropdown
 

From 98f5bc51a8929c6f4cdc1e3a1d23a858307b2549 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 28 Jan 2023 12:38:39 +0800
Subject: [PATCH 508/803] Change golang version

---
 docker/builder-go.dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docker/builder-go.dockerfile b/docker/builder-go.dockerfile
index 79c1a95b..1d25843b 100644
--- a/docker/builder-go.dockerfile
+++ b/docker/builder-go.dockerfile
@@ -2,7 +2,7 @@
 # Build in Golang
 # Run npm run build-healthcheck-armv7 in the host first, another it will be super slow where it is building the armv7 healthcheck
 ############################################
-FROM golang:1.19.4-buster
+FROM golang:1.19-buster
 WORKDIR /app
 ARG TARGETPLATFORM
 COPY ./extra/ ./extra/

From 1dc2546a3910528ed341537571bfc81615e37d48 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 28 Jan 2023 13:39:23 +0800
Subject: [PATCH 509/803] Lint

---
 src/router.js | 1 -
 tsconfig.json | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/router.js b/src/router.js
index 7bb474ee..35647511 100644
--- a/src/router.js
+++ b/src/router.js
@@ -32,7 +32,6 @@ import Proxies from "./components/settings/Proxies.vue";
 import Backup from "./components/settings/Backup.vue";
 import About from "./components/settings/About.vue";
 
-
 const routes = [
     {
         path: "/",
diff --git a/tsconfig.json b/tsconfig.json
index c5454642..441d846e 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,7 +6,7 @@
         "module": "commonjs",
         "lib": [
             "es2020",
-            "DOM",
+            "DOM"
         ],
         "removeComments": false,
         "preserveConstEnums": true,

From ddce8f0cb06016d20c4f1910693d5258f95ff275 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 28 Jan 2023 19:00:13 +0800
Subject: [PATCH 510/803] Fix plugin installation

---
 docker/alpine-base.dockerfile             |  2 +-
 docker/debian-base.dockerfile             |  2 +-
 server/plugins-manager.js                 | 37 ++++++++++++++++++-----
 server/socket-handlers/plugins-handler.js |  8 +++--
 src/components/settings/Plugins.vue       |  2 +-
 5 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/docker/alpine-base.dockerfile b/docker/alpine-base.dockerfile
index 82bc7bb0..276d6e45 100644
--- a/docker/alpine-base.dockerfile
+++ b/docker/alpine-base.dockerfile
@@ -3,6 +3,6 @@ FROM node:16-alpine3.12
 WORKDIR /app
 
 # Install apprise, iputils for non-root ping, setpriv
-RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib && \
+RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib git && \
     pip3 --no-cache-dir install apprise==1.2.1 && \
     rm -rf /root/.cache
diff --git a/docker/debian-base.dockerfile b/docker/debian-base.dockerfile
index d94b4c7f..026189c4 100644
--- a/docker/debian-base.dockerfile
+++ b/docker/debian-base.dockerfile
@@ -10,7 +10,7 @@ WORKDIR /app
 # Stupid python3 and python3-pip actually install a lot of useless things into Debian, specify --no-install-recommends to skip them, make the base even smaller than alpine!
 RUN apt update && \
     apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
-        sqlite3 iputils-ping util-linux dumb-init && \
+        sqlite3 iputils-ping util-linux dumb-init git && \
     pip3 --no-cache-dir install apprise==1.2.1 && \
     rm -rf /var/lib/apt/lists/* && \
     apt --yes autoremove
diff --git a/server/plugins-manager.js b/server/plugins-manager.js
index e48c53c8..674ab969 100644
--- a/server/plugins-manager.js
+++ b/server/plugins-manager.js
@@ -72,6 +72,12 @@ class PluginsManager {
      * @param {string} name Directory name, also known as plugin unique name
      */
     downloadPlugin(repoURL, name) {
+        if (fs.existsSync(this.pluginsDir + name)) {
+            log.info("plugin", "Plugin folder already exists? Removing...");
+            fs.rmSync(this.pluginsDir + name, {
+                recursive: true
+            });
+        }
         log.info("plugin", "Installing plugin: " + name + " " + repoURL);
         let result = Git.clone(repoURL, this.pluginsDir, name);
         log.info("plugin", "Install result: " + result);
@@ -115,13 +121,19 @@ class PluginsManager {
      * @returns {Promise<[]>}
      */
     async fetchPluginList() {
-        const res = await axios.get("https://uptime.kuma.pet/c/plugins.json");
-        const list = res.data.pluginList;
+        let remotePluginList;
+        try {
+            const res = await axios.get("https://uptime.kuma.pet/c/plugins.json");
+            remotePluginList = res.data.pluginList;
+        } catch (e) {
+            log.error("plugin", "Failed to fetch plugin list: " + e.message);
+            remotePluginList = [];
+        }
 
         for (let plugin of this.pluginList) {
             let find = false;
             // Try to merge
-            for (let remotePlugin of list) {
+            for (let remotePlugin of remotePluginList) {
                 if (remotePlugin.name === plugin.info.name) {
                     find = true;
                     remotePlugin.installed = true;
@@ -136,17 +148,17 @@ class PluginsManager {
             // Local plugin
             if (!find) {
                 plugin.info.local = true;
-                list.push(plugin.info);
+                remotePluginList.push(plugin.info);
             }
         }
 
         // Sort Installed first, then sort by name
-        return list.sort((a, b) => {
+        return remotePluginList.sort((a, b) => {
             if (a.installed === b.installed) {
-                if ( a.fullName < b.fullName ) {
+                if (a.fullName < b.fullName) {
                     return -1;
                 }
-                if ( a.fullName > b.fullName ) {
+                if (a.fullName > b.fullName) {
                     return 1;
                 }
                 return 0;
@@ -191,15 +203,24 @@ class PluginWrapper {
         let indexFile = this.pluginDir + "/index.js";
         let packageJSON = this.pluginDir + "/package.json";
 
+        log.info("plugin", "Installing dependencies");
+
         if (fs.existsSync(indexFile)) {
             // Install dependencies
-            childProcess.execSync("npm install", {
+            let result = childProcess.spawnSync("npm", [ "install" ], {
                 cwd: this.pluginDir,
                 env: {
+                    ...process.env,
                     PLAYWRIGHT_BROWSERS_PATH: "../../browsers",    // Special handling for read-browser-monitor
                 }
             });
 
+            if (result.stdout) {
+                log.info("plugin", "Install dependencies result: " + result.stdout.toString("utf-8"));
+            } else {
+                log.warn("plugin", "Install dependencies result: no output");
+            }
+
             this.pluginClass = require(path.join(process.cwd(), indexFile));
 
             let pluginClassType = typeof this.pluginClass;
diff --git a/server/socket-handlers/plugins-handler.js b/server/socket-handlers/plugins-handler.js
index 4ee712c7..533da309 100644
--- a/server/socket-handlers/plugins-handler.js
+++ b/server/socket-handlers/plugins-handler.js
@@ -1,5 +1,6 @@
 const { checkLogin } = require("../util-server");
-const { PluginManager } = require("../plugins-manager");
+const { PluginsManager } = require("../plugins-manager");
+const { log } = require("../../src/util.js");
 
 /**
  * Handlers for plugins
@@ -15,7 +16,9 @@ module.exports.pluginsHandler = (socket, server) => {
         try {
             checkLogin(socket);
 
-            if (PluginManager.disable) {
+            log.debug("plugin", "PluginManager.disable: " + PluginsManager.disable);
+
+            if (PluginsManager.disable) {
                 throw new Error("Plugin Disabled: In order to enable plugin feature, you need to use the default data directory: ./data/");
             }
 
@@ -25,6 +28,7 @@ module.exports.pluginsHandler = (socket, server) => {
                 pluginList,
             });
         } catch (error) {
+            log.warn("plugin", "Error: " + error.message);
             callback({
                 ok: false,
                 msg: error.message,
diff --git a/src/components/settings/Plugins.vue b/src/components/settings/Plugins.vue
index ca39e7ad..614034fc 100644
--- a/src/components/settings/Plugins.vue
+++ b/src/components/settings/Plugins.vue
@@ -48,7 +48,7 @@ export default {
                     this.remotePluginList = res.pluginList;
                     this.remotePluginListMsg = "";
                 } else {
-                    this.remotePluginListMsg = this.$t("loadingError") + " " + res.message;
+                    this.remotePluginListMsg = this.$t("loadingError") + " " + res.msg;
                 }
             });
         }

From 6828d337aee65a65490d66d32c26e37a72e09f71 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 30 Jan 2023 00:00:41 +0800
Subject: [PATCH 511/803] Disable HTTP(s) - Browser Engine

Reason: Unfortunately, after some test, I found that Playwright requires a lot of libraries to be installed on the Linux host in order to start Chrome or Firefox. It will be hard to install, so I hide this feature for now.
---
 src/pages/EditMonitor.vue | 4 ++++
 src/pages/Settings.vue    | 5 ++++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 0f7fc4a5..0f7e86a3 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -71,12 +71,16 @@
                                         </option>
                                     </optgroup>
 
+                                    <!--
+                                    Hidden for now: Reason refer to Setting.vue
                                     <optgroup :label="$t('Custom Monitor Type')">
                                         <option value="browser">
                                             (Beta) HTTP(s) - Browser Engine (Chrome/Firefox)
                                         </option>
                                     </optgroup>
                                 </select>
+                                -->
+                                </select>
                             </div>
 
                             <!-- Friendly Name -->
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 2b08d04e..b034a541 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -113,9 +113,12 @@ export default {
                 backup: {
                     title: this.$t("Backup"),
                 },
+                /*
+                Hidden for now: Unfortunately, after some test, I found that Playwright requires a lot of libraries to be installed on the Linux host in order to start Chrome or Firefox.
+                It will be hard to install, so I hide this feature for now. But it still accessible via URL: /settings/plugins.
                 plugins: {
                     title: this.$tc("plugin", 2),
-                },
+                },*/
                 about: {
                     title: this.$t("About"),
                 },

From 4fb43034cda45230dd58bccbae50c8774d39b40d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 30 Jan 2023 21:46:27 +0800
Subject: [PATCH 512/803] Handle k8s in healthcheck.go

---
 extra/healthcheck.go | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/extra/healthcheck.go b/extra/healthcheck.go
index 302883d8..f79b3e65 100644
--- a/extra/healthcheck.go
+++ b/extra/healthcheck.go
@@ -11,12 +11,17 @@ import (
 	"net/http"
 	"os"
 	"runtime"
+	"strings"
 	"time"
 )
 
 func main() {
 	isFreeBSD := runtime.GOOS == "freebsd"
 
+	// Is K8S + uptime-kuma as the container name
+	// See #2083
+	isK8s := strings.HasPrefix(os.Getenv("UPTIME_KUMA_PORT"), "tcp://")
+
 	// process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
 	http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{
 		InsecureSkipVerify: true,
@@ -44,7 +49,11 @@ func main() {
 		hostname = "127.0.0.1"
 	}
 
-	port := os.Getenv("UPTIME_KUMA_PORT")
+	port := ""
+	// UPTIME_KUMA_PORT is override by K8S unexpectedly,
+	if !isK8s {
+		port = os.Getenv("UPTIME_KUMA_PORT")
+	}
 	if len(port) == 0 {
 		port = os.Getenv("PORT")
 	}

From 348d0170fa9f561c1ea8dcd714ff7936e44bc8d4 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Wed, 1 Feb 2023 05:33:36 +0800
Subject: [PATCH 513/803] Chore: Use constants instead of int

---
 server/routers/api-router.js | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 6001d58e..e95fd045 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -4,7 +4,7 @@ const { R } = require("redbean-node");
 const apicache = require("../modules/apicache");
 const Monitor = require("../model/monitor");
 const dayjs = require("dayjs");
-const { UP, MAINTENANCE, DOWN, flipStatus, log } = require("../../src/util");
+const { UP, MAINTENANCE, DOWN, PENDING, flipStatus, log } = require("../../src/util");
 const StatusPage = require("../model/status_page");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const { makeBadge } = require("badge-maker");
@@ -147,19 +147,19 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
 
             badgeValues.label = label ?? "";
             switch (state) {
-                case 0:
+                case DOWN:
                     badgeValues.color = downColor;
                     badgeValues.message = downLabel;
                     break;
-                case 1:
+                case UP:
                     badgeValues.color = upColor;
                     badgeValues.message = upLabel;
                     break;
-                case 2:
+                case PENDING:
                     badgeValues.color = pendingColor;
                     badgeValues.message = pendingLabel;
                     break;
-                case 3:
+                case MAINTENANCE:
                     badgeValues.color = maintenanceColor;
                     badgeValues.message = maintenanceLabel;
                     break;

From 95c934e08bf7ea97a85a7107059d804950907953 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Fri, 20 Jan 2023 06:33:45 +0800
Subject: [PATCH 514/803] Fix: Do not allow white space around IP

Feat: Trim input on submit

Test: Add test for whitespace regex match
---
 src/pages/EditMonitor.vue               |  8 ++++++++
 src/util-frontend.js                    |  2 +-
 test/cypress/unit/util-frontend.spec.js | 14 +++++++++++---
 3 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 00f45d7e..e9cbd824 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -949,6 +949,14 @@ message HealthCheckResponse {
                 this.monitor.headers = JSON.stringify(JSON.parse(this.monitor.headers), null, 4);
             }
 
+            if (this.monitor.hostname) {
+                this.monitor.hostname = this.monitor.hostname.trim();
+            }
+
+            if (this.monitor.url) {
+                this.monitor.url = this.monitor.url.trim();
+            }
+
             if (this.isAdd) {
                 this.$root.add(this.monitor, async (res) => {
 
diff --git a/src/util-frontend.js b/src/util-frontend.js
index 55d0f634..882ee291 100644
--- a/src/util-frontend.js
+++ b/src/util-frontend.js
@@ -88,7 +88,7 @@ export function hostNameRegexPattern(mqtt = false) {
     // mqtt, mqtts, ws and wss schemes accepted by mqtt.js (https://github.com/mqttjs/MQTT.js/#connect)
     const mqttSchemeRegexPattern = "((mqtt|ws)s?:\\/\\/)?";
     // Source: https://digitalfortress.tech/tips/top-15-commonly-used-regex/
-    const ipRegexPattern = `((^\\s*${mqtt ? mqttSchemeRegexPattern : ""}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))`;
+    const ipRegexPattern = `((^${mqtt ? mqttSchemeRegexPattern : ""}((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))$)|(^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?$))`;
     // Source: https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
     const hostNameRegexPattern = `^${mqtt ? mqttSchemeRegexPattern : ""}([a-zA-Z0-9])?(([a-zA-Z0-9_]|[a-zA-Z0-9_][a-zA-Z0-9\\-_]*[a-zA-Z0-9_])\\.)*([A-Za-z0-9_]|[A-Za-z0-9_][A-Za-z0-9\\-_]*[A-Za-z0-9_])$`;
 
diff --git a/test/cypress/unit/util-frontend.spec.js b/test/cypress/unit/util-frontend.spec.js
index 6abedf82..9bfd4bec 100644
--- a/test/cypress/unit/util-frontend.spec.js
+++ b/test/cypress/unit/util-frontend.spec.js
@@ -9,7 +9,11 @@ describe("Test util-frontend.js", () => {
             expect(regex.test("www.test.com")).to.be.true;
             expect(regex.test("127.0.0.1")).to.be.true;
             expect(regex.test("192.168.1.156")).to.be.true;
-            
+            expect(regex.test(" 192.168.1.145")).to.be.false;
+            expect(regex.test("192.168.1.145 ")).to.be.false;
+            expect(regex.test(" fe80::3282:3ff:ae28:592")).to.be.false;
+            expect(regex.test("fe80::3282:3ff:ae28:592 ")).to.be.false;
+
             ["mqtt", "mqtts", "ws", "wss"].forEach(schema => {
                 expect(regex.test(`${schema}://www.test.com`)).to.be.false;
                 expect(regex.test(`${schema}://127.0.0.1`)).to.be.false;
@@ -23,11 +27,15 @@ describe("Test util-frontend.js", () => {
             expect(regex.test("www.test.com")).to.be.true;
             expect(regex.test("127.0.0.1")).to.be.true;
             expect(regex.test("192.168.1.156")).to.be.true;
-            
+            expect(regex.test(" 192.168.1.145")).to.be.false;
+            expect(regex.test("192.168.1.145 ")).to.be.false;
+            expect(regex.test(" fe80::3282:3ff:ae28:592")).to.be.false;
+            expect(regex.test("fe80::3282:3ff:ae28:592 ")).to.be.false;
+
             ["mqtt", "mqtts", "ws", "wss"].forEach(schema => {
                 expect(regex.test(`${schema}://www.test.com`)).to.be.true;
                 expect(regex.test(`${schema}://127.0.0.1`)).to.be.true;
             });
         });
     });
-});
\ No newline at end of file
+});

From a8f0f1d872b359e53efada97ab8f9e84a72b8cad Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 1 Feb 2023 15:51:33 +0800
Subject: [PATCH 515/803] Merge manually and remove to devDependencies

---
 package-lock.json | 36 ++++++++++++++++++++++++++++++++++--
 package.json      |  4 ++--
 src/lang/en.json  |  1 +
 3 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 9da62968..c1e2645f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.5",
+    "version": "1.19.6",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.5",
+            "version": "1.19.6",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
@@ -88,10 +88,12 @@
                 "cypress": "^10.1.0",
                 "delay": "^5.0.0",
                 "dns2": "~2.0.1",
+                "dompurify": "~2.4.3",
                 "eslint": "~8.14.0",
                 "eslint-plugin-vue": "~8.7.1",
                 "favico.js": "~0.3.10",
                 "jest": "~27.2.5",
+                "marked": "~4.2.5",
                 "postcss-html": "~1.5.0",
                 "postcss-rtlcss": "~3.7.2",
                 "postcss-scss": "~4.0.4",
@@ -7800,6 +7802,12 @@
                 "url": "https://github.com/fb55/domhandler?sponsor=1"
             }
         },
+        "node_modules/dompurify": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
+            "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==",
+            "dev": true
+        },
         "node_modules/domutils": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@@ -13613,6 +13621,18 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/marked": {
+            "version": "4.2.12",
+            "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
+            "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
+            "dev": true,
+            "bin": {
+                "marked": "bin/marked.js"
+            },
+            "engines": {
+                "node": ">= 12"
+            }
+        },
         "node_modules/mathml-tag-names": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -24871,6 +24891,12 @@
                 "domelementtype": "^2.3.0"
             }
         },
+        "dompurify": {
+            "version": "2.4.3",
+            "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz",
+            "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==",
+            "dev": true
+        },
         "domutils": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
@@ -29100,6 +29126,12 @@
             "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
             "dev": true
         },
+        "marked": {
+            "version": "4.2.12",
+            "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
+            "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
+            "dev": true
+        },
         "mathml-tag-names": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
diff --git a/package.json b/package.json
index 1dc87f08..7a148ec2 100644
--- a/package.json
+++ b/package.json
@@ -84,7 +84,6 @@
         "compare-versions": "~3.6.0",
         "compression": "~1.7.4",
         "dayjs": "~1.11.5",
-        "dompurify": "^2.4.3",
         "express": "~4.17.3",
         "express-basic-auth": "~1.2.1",
         "express-static-gzip": "~2.1.7",
@@ -98,7 +97,6 @@
         "jsonwebtoken": "~9.0.0",
         "jwt-decode": "~3.1.2",
         "limiter": "~2.1.0",
-        "marked": "^4.2.5",
         "mongodb": "~4.13.0",
         "mqtt": "~4.3.7",
         "mssql": "~8.1.4",
@@ -147,9 +145,11 @@
         "cypress": "^10.1.0",
         "delay": "^5.0.0",
         "dns2": "~2.0.1",
+        "dompurify": "~2.4.3",
         "eslint": "~8.14.0",
         "eslint-plugin-vue": "~8.7.1",
         "favico.js": "~0.3.10",
+        "marked": "~4.2.5",
         "jest": "~27.2.5",
         "postcss-html": "~1.5.0",
         "postcss-rtlcss": "~3.7.2",
diff --git a/src/lang/en.json b/src/lang/en.json
index cab3dcea..072e0720 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -25,6 +25,7 @@
     "General Monitor Type": "General Monitor Type",
     "Passive Monitor Type": "Passive Monitor Type",
     "Specific Monitor Type": "Specific Monitor Type",
+    "markdownSupported": "Markdown syntax supported",
     "pauseDashboardHome": "Pause",
     "Pause": "Pause",
     "Name": "Name",

From 683f446cf573127e7bd02fccabb31d051655277c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 1 Feb 2023 20:07:08 +0800
Subject: [PATCH 516/803] Add support for `.env`

---
 package-lock.json | 18 ++++++++++++++++--
 package.json      |  1 +
 server/server.js  |  3 +++
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 9da62968..c5429446 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.5",
+    "version": "1.19.6",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.5",
+            "version": "1.19.6",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
@@ -27,6 +27,7 @@
                 "compare-versions": "~3.6.0",
                 "compression": "~1.7.4",
                 "dayjs": "~1.11.5",
+                "dotenv": "~16.0.3",
                 "express": "~4.17.3",
                 "express-basic-auth": "~1.2.1",
                 "express-static-gzip": "~2.1.7",
@@ -7813,6 +7814,14 @@
                 "url": "https://github.com/fb55/domutils?sponsor=1"
             }
         },
+        "node_modules/dotenv": {
+            "version": "16.0.3",
+            "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+            "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/duplexify": {
             "version": "4.1.2",
             "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
@@ -24881,6 +24890,11 @@
                 "domhandler": "^5.0.1"
             }
         },
+        "dotenv": {
+            "version": "16.0.3",
+            "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+            "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
+        },
         "duplexify": {
             "version": "4.1.2",
             "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
diff --git a/package.json b/package.json
index 9e635d1b..90140836 100644
--- a/package.json
+++ b/package.json
@@ -84,6 +84,7 @@
         "compare-versions": "~3.6.0",
         "compression": "~1.7.4",
         "dayjs": "~1.11.5",
+        "dotenv": "~16.0.3",
         "express": "~4.17.3",
         "express-basic-auth": "~1.2.1",
         "express-static-gzip": "~2.1.7",
diff --git a/server/server.js b/server/server.js
index 5fbc8e55..1073f3be 100644
--- a/server/server.js
+++ b/server/server.js
@@ -11,6 +11,9 @@ dayjs.extend(require("dayjs/plugin/utc"));
 dayjs.extend(require("./modules/dayjs/plugin/timezone"));
 dayjs.extend(require("dayjs/plugin/customParseFormat"));
 
+// Load environment variables from `.env`
+require("dotenv").config();
+
 // Check Node.js Version
 const nodeVersion = parseInt(process.versions.node.split(".")[0]);
 const requiredVersion = 14;

From 89465e676858b6f456f6d81f65dadadd60cead73 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 1 Feb 2023 22:39:09 +0800
Subject: [PATCH 517/803] Update CONTRIBUTING.md

---
 CONTRIBUTING.md | 36 +++++++++++++++++++++---------------
 1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f46b17e1..3f455092 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -17,8 +17,11 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
 
 ## Directories
 
+- config (dev config files)
 - data (App data)
+- db (Base database and migration scripts)
 - dist (Frontend build)
+- docker (Dockerfiles)
 - extra (Extra useful scripts)
 - public (Frontend resources for dev only)
 - server (Server source code)
@@ -80,13 +83,13 @@ Before deep into coding, discussion first is preferred. Creating an empty pull r
 
 ## Project Styles
 
-I personally do not like it when something requires so much learning and configuration before you can finally start the app.
+I personally do not like something that requires so many configurations before you can finally start the app. I hope Uptime Kuma installation could be as easy as like installing a mobile app.
 
-- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort required to get it running
+- Easy to install for non-Docker users, no native build dependency is needed (for x86_64/armv7/arm64), no extra config, no extra effort required to get it running
 - Single container for Docker users, no very complex docker-compose file. Just map the volume and expose the port, then good to go
-- Settings should be configurable in the frontend. Environment variable is not encouraged, unless it is related to startup such as `DATA_DIR`.
+- Settings should be configurable in the frontend. Environment variable is not encouraged, unless it is related to startup such as `DATA_DIR`
 - Easy to use
-- The web UI styling should be consistent and nice.
+- The web UI styling should be consistent and nice
 
 ## Coding Styles
 
@@ -95,7 +98,7 @@ I personally do not like it when something requires so much learning and configu
 - Follow ESLint
 - Methods and functions should be documented with JSDoc
 
-## Name convention
+## Name Conventions
 
 - Javascript/Typescript: camelCaseType
 - SQLite: snake_case (Underscore)
@@ -109,7 +112,7 @@ I personally do not like it when something requires so much learning and configu
 - IDE that supports ESLint and EditorConfig (I am using IntelliJ IDEA)
 - A SQLite GUI tool (SQLite Expert Personal is suggested)
 
-## Install dependencies
+## Install Dependencies for Development
 
 ```bash
 npm ci
@@ -127,6 +130,12 @@ Port `3000` and port `3001` will be used.
 npm run dev
 ```
 
+But sometimes, you would like to keep restart the server, but not the frontend, you can run these command in two terminals:
+```
+npm run start-frontend-dev
+npm run start-server-dev
+```
+
 ## Backend Server
 
 It binds to `0.0.0.0:3001` by default.
@@ -142,12 +151,15 @@ express.js is used for:
 
 ### Structure in /server/
 
+- jobs/ (Jobs that are running in another process)
 - model/ (Object model, auto mapping to the database table name)
 - modules/ (Modified 3rd-party modules)
+- monitor_types (Monitor Types)
 - notification-providers/ (individual notification logic)
 - routers/ (Express Routers)
 - socket-handler (Socket.io Handlers)
-- server.js (Server entry point and main logic)
+- server.js (Server entry point)
+- uptime-kuma-server.js (UptimeKumaServer class, main logic should be here, but some still in `server.js`)
 
 ## Frontend Dev Server
 
@@ -198,18 +210,12 @@ Both frontend and backend share the same package.json. However, the frontend dep
 
 ### Update Dependencies
 
-Install `ncu`
-https://github.com/raineorshine/npm-check-updates
-
-```bash
-ncu -u -t patch
-npm install
-```
-
 Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update patch release version only.
 
 Patch release = the third digit ([Semantic Versioning](https://semver.org/))
 
+If for maybe security reasons, a library must be updated. Then you must need to check if there are any breaking changes.
+
 ## Translations
 
 Please read: https://github.com/louislam/uptime-kuma/tree/master/src/languages

From 15ec8db48c3ff699301c6da920676debb4abf6b1 Mon Sep 17 00:00:00 2001
From: Anonymous <noreply@weblate.org>
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 518/803] Translated using Weblate (English)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (692 of 692 strings)

Translated using Weblate (Turkish)

Currently translated at 97.9% (670 of 684 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 58.6% (401 of 684 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Ömer Faruk Genç <omer@farukgenc.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/en.json    |  3 ++-
 src/lang/tr-TR.json | 11 ++++++++---
 src/lang/zh-HK.json |  8 ++++----
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index cab3dcea..9c8bdf71 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -689,5 +689,6 @@
     "onebotUserOrGroupId": "Group/User ID",
     "onebotSafetyTips": "For safety, must set access token",
     "PushDeer Key": "PushDeer Key",
-    "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} ."
+    "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
+    "Custom Monitor Type": "Custom Monitor Type"
 }
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index f57e6c74..a84bc1f4 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -578,10 +578,10 @@
     "statusMaintenance": "Bakım",
     "Schedule maintenance": "Bakım Planla",
     "Affected Monitors": "Etkilenen Monitörler",
-    "Pick Affected Monitors...": "Etkilenen Monitörleri Seçin...",
+    "Pick Affected Monitors...": "Etkilenen Monitörleri Seçin…",
     "Start of maintenance": "Bakım başlangıcı",
     "All Status Pages": "Tüm Durum Sayfaları",
-    "Select status pages...": "Durum sayfalarını seçin...",
+    "Select status pages...": "Durum sayfalarını seçin…",
     "recurringIntervalMessage": "Her gün bir kez çalıştırın | {0} günde bir çalıştırın",
     "affectedMonitorsDescription": "Geçerli bakımdan etkilenen monitörleri seçin",
     "affectedStatusPages": "Bu bakım mesajını seçili durum sayfalarında göster",
@@ -671,5 +671,10 @@
     "dataRetentionTimeError": "Saklama süresi 0 veya daha büyük olmalıdır",
     "confirmDeleteTagMsg": "Bu etiketi silmek istediğinizden emin misiniz? Bu etiketle ilişkili monitörler silinmez.",
     "promosmsAllowLongSMS": "Uzun SMS'e izin ver",
-    "infiniteRetention": "Sonsuza dek saklamak için 0 giriniz."
+    "infiniteRetention": "Sonsuza dek saklamak için 0 giriniz.",
+    "rocket.chat": "Rocket.Chat",
+    "slack": "Slack",
+    "pushover": "Pushover",
+    "Game": "Oyun",
+    "Packet Size": "Paket Boyutu"
 }
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 1d7c38d7..94608067 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -155,7 +155,7 @@
     "Options": "選項",
     "Keep both": "兩者並存",
     "Tags": "標籤",
-    "Add New below or Select...": "Add New below or Select...",
+    "Add New below or Select...": "在下方新增或選取…",
     "Tag with this name already exist.": "Tag with this name already exist.",
     "Tag with this value already exist.": "Tag with this value already exist.",
     "color": "顏色",
@@ -168,7 +168,7 @@
     "Indigo": "靛",
     "Purple": "紫",
     "Pink": "粉紅",
-    "Search...": "搜尋...",
+    "Search...": "搜尋…",
     "Avg. Ping": "平均反應時間",
     "Avg. Response": "平均反應時間",
     "Entry Page": "Entry Page",
@@ -318,8 +318,8 @@
     "Security": "安全性",
     "Steam API Key": "Steam API 金鑰",
     "Shrink Database": "壓縮資料庫",
-    "Pick a RR-Type...": "選擇資源記錄類型...",
-    "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
+    "Pick a RR-Type...": "選擇資源記錄類型…",
+    "Pick Accepted Status Codes...": "選擇可接受的狀態碼…",
     "Default": "預設",
     "HTTP Options": "HTTP 選項",
     "Create Incident": "建立事件",

From 1a601c937718c0c8d5c159c7deb5e67a1f27d7fb Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 519/803] Translated using Weblate (Chinese (Traditional))

Currently translated at 97.2% (673 of 692 strings)

Translated using Weblate (English)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 62.7% (429 of 684 strings)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/en.json    |  4 ++--
 src/lang/zh-HK.json | 30 +++++++++++++++++++++++++++++-
 src/lang/zh-TW.json | 22 ++++++++++++++--------
 3 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 9c8bdf71..231fe29f 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -368,7 +368,7 @@
     "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
     "chatIDNotFound": "Chat ID is not found; please send a message to this bot first",
     "disableCloudflaredNoAuthMsg": "You are in No Auth mode, a password is not required.",
-    "trustProxyDescription": "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind such as Nginx or Apache, you should enable this.",
+    "trustProxyDescription": "Trust 'X-Forwarded-*' headers. If you want to get the correct client IP and your Uptime Kuma is behind a proxy such as Nginx or Apache, you should enable this.",
     "wayToGetLineNotifyToken": "You can get an access token from {0}",
     "Examples": "Examples",
     "Home Assistant URL": "Home Assistant URL",
@@ -384,7 +384,7 @@
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Then choose an action, for example switch the scene to where an RGB light is red.",
     "Frontend Version": "Frontend Version",
     "Frontend Version do not match backend version!": "Frontend Version do not match backend version!",
-    "backupOutdatedWarning": "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
+    "backupOutdatedWarning": "Deprecated: Since a lot of features were added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
     "backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.",
     "Optional": "Optional",
     "squadcast": "Squadcast",
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 94608067..1111c3cb 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -401,5 +401,33 @@
     "Game": "遊戲",
     "Specific Monitor Type": "特定監測器類型",
     "Monitor": "監測器 | 監測器",
-    "General Monitor Type": "一般監測器類型"
+    "General Monitor Type": "一般監測器類型",
+    "Affected Monitors": "受影響的監測器",
+    "Powered by": "技術支持:",
+    "Add New Status Page": "新增 Status Page",
+    "Page Not Found": "找不到頁面",
+    "Start of maintenance": "維護開始時間",
+    "All Status Pages": "所有 Status Page",
+    "webhookAdditionalHeadersTitle": "額外 Header",
+    "successMessage": "成功訊息",
+    "error": "錯誤",
+    "critical": "嚴重",
+    "Customize": "自定義",
+    "Custom Footer": "自訂 Footer",
+    "Custom CSS": "自訂 CSS",
+    "Valid": "有效",
+    "Invalid": "無效",
+    "Installed": "已安裝",
+    "Not installed": "未安裝",
+    "Running": "執行中",
+    "Stop": "停止",
+    "Next": "下一步",
+    "No Proxy": "無 Proxy",
+    "Backup": "備份",
+    "Pick Affected Monitors...": "挑選受影響的監測器…",
+    "Custom": "自訂",
+    "Not running": "未執行",
+    "Remove Token": "移除 Token",
+    "Start": "開始",
+    "User": "使用者"
 }
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
index 142ebf2d..5eb0a699 100644
--- a/src/lang/zh-TW.json
+++ b/src/lang/zh-TW.json
@@ -15,10 +15,10 @@
     "statusMaintenance": "維護",
     "Schedule maintenance": "排程維護",
     "Affected Monitors": "受影響的監測器",
-    "Pick Affected Monitors...": "挑選受影響的監測器...",
+    "Pick Affected Monitors...": "挑選受影響的監測器…",
     "Start of maintenance": "維護起始",
     "All Status Pages": "所有狀態頁",
-    "Select status pages...": "選擇狀態頁...",
+    "Select status pages...": "選擇狀態頁…",
     "recurringIntervalMessage": "每日執行 | 每 {0} 天執行",
     "affectedMonitorsDescription": "選擇受目前維護影響的監測器",
     "affectedStatusPages": "在已選取的狀態頁中顯示此維護訊息",
@@ -177,7 +177,7 @@
     "Token": "權杖",
     "Show URI": "顯示 URI",
     "Tags": "標籤",
-    "Add New below or Select...": "在下方新增或選取...",
+    "Add New below or Select...": "在下方新增或選取…",
     "Tag with this name already exist.": "已存在相同名稱的標籤。",
     "Tag with this value already exist.": "已存在相同數值的標籤。",
     "color": "顏色",
@@ -190,7 +190,7 @@
     "Indigo": "靛色",
     "Purple": "紫色",
     "Pink": "粉色",
-    "Search...": "搜尋...",
+    "Search...": "搜尋…",
     "Avg. Ping": "平均 Ping",
     "Avg. Response": "平均回應",
     "Entry Page": "入口頁面",
@@ -237,7 +237,7 @@
     "wayToGetDiscordURL": "您可以前往伺服器設定 -> 整合 -> Webhook -> 新 Webhook 以取得",
     "Bot Display Name": "機器人顯示名稱",
     "Prefix Custom Message": "前綴自訂訊息",
-    "Hello @everyone is...": "Hello {'@'}everyone is...",
+    "Hello @everyone is...": "Hello {'@'}everyone is…",
     "teams": "Microsoft Teams",
     "Webhook URL": "Webhook 網址",
     "wayToGetTeamsURL": "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
@@ -342,8 +342,8 @@
     "Security": "安全性",
     "Steam API Key": "Steam API 金鑰",
     "Shrink Database": "壓縮資料庫",
-    "Pick a RR-Type...": "選擇資源記錄類型...",
-    "Pick Accepted Status Codes...": "選擇可接受的狀態碼...",
+    "Pick a RR-Type...": "選擇資源記錄類型…",
+    "Pick Accepted Status Codes...": "選擇可接受的狀態碼…",
     "Default": "預設",
     "HTTP Options": "HTTP 選項",
     "Create Incident": "建立事件",
@@ -668,5 +668,11 @@
     "high": "高",
     "General Monitor Type": "一般監測器類型",
     "Passive Monitor Type": "被動監測器類型",
-    "Specific Monitor Type": "指定監測器類型"
+    "Specific Monitor Type": "指定監測器類型",
+    "plugin": "插件 | 插件",
+    "install": "安裝",
+    "Game": "遊戲",
+    "Help": "幫助",
+    "Monitor": "監測器 | 監測器",
+    "Custom": "自訂"
 }

From fef09d3abdc4b719accbf48b1d4062a409b75b0f Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <saibamenppl@gmail.com>
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 520/803] Translated using Weblate (Polish)

Currently translated at 100.0% (691 of 691 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (684 of 684 strings)

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pl/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/pl.json | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/lang/pl.json b/src/lang/pl.json
index 802fa56d..ebc58797 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -130,7 +130,7 @@
     "Apply on all existing monitors": "Zastosuj do istniejących monitorów",
     "Create": "Stwórz",
     "Clear Data": "Usuń dane",
-    "Events": "Wydarzenia",
+    "Events": "Zdarzenia",
     "Heartbeats": "Bicia serca",
     "Auto Get": "Wykryj",
     "backupDescription": "Możesz wykonać kopię zapasową wszystkich monitorów i wszystkich powiadomień do pliku JSON.",
@@ -584,7 +584,7 @@
     "Domain": "Domena",
     "Workstation": "Stacja robocza",
     "disableCloudflaredNoAuthMsg": "Jesteś w trybie No Auth, hasło nie jest wymagane.",
-    "trustProxyDescription": "Zaufaj nagłówkom 'X-Forwarded-*'. Jeśli chcesz uzyskać poprawne IP klienta, a twój Uptime Kuma jest za Nginx lub Apache, powinieneś to włączyć.",
+    "trustProxyDescription": "Zaufaj nagłówkom 'X-Forwarded-*'. Jeśli chcesz uzyskać poprawne IP klienta, a twój Uptime Kuma jest za proxy, takim jak Nginx lub Apache, powinieneś to włączyć.",
     "wayToGetLineNotifyToken": "Możesz uzyskać token dostępu z {0}",
     "Examples": "Przykłady",
     "Home Assistant URL": "URL Home Assistant",
@@ -682,5 +682,13 @@
     "Free Mobile API Key": "Darmowy mobilny klucz API",
     "Lowcost": "Tani",
     "high": "wysoki",
-    "General Monitor Type": "Ogólny typ monitora"
+    "General Monitor Type": "Ogólny typ monitora",
+    "Packet Size": "Rozmiar pakietu",
+    "uninstalling": "Odinstalowywanie",
+    "loadingError": "Nie można pobrać danych, proszę spróbować ponownie później.",
+    "plugin": "Wtyczka | Wtyczki",
+    "install": "Instaluj",
+    "installing": "Instalowanie",
+    "uninstall": "Odinstaluj",
+    "confirmUninstallPlugin": "Czy na pewno chcesz odinstalować tę wtyczkę?"
 }

From 3208d9873877ad576be1d79183f71a371c0d659a Mon Sep 17 00:00:00 2001
From: 401Unauthorized <yehowahliu@4o1.to>
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 521/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (692 of 692 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (692 of 692 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (691 of 691 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.5% (681 of 691 strings)

Co-authored-by: 401Unauthorized <yehowahliu@4o1.to>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index 26ee5747..a3393bd1 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -77,7 +77,7 @@
     "day": "天",
     "-day": "天",
     "hour": "小时",
-    "-hour": " 小时",
+    "-hour": "小时",
     "Response": "响应",
     "Ping": "Ping",
     "Monitor Type": "监控类型",
@@ -238,7 +238,7 @@
     "wayToGetDiscordURL": "要获取,可以前往服务器设置 -> 整合 -> 创建 Webhook",
     "Bot Display Name": "机器人显示名称",
     "Prefix Custom Message": "自定义消息前缀",
-    "Hello @everyone is...": "{'@'}everyone,……",
+    "Hello @everyone is...": "{'@'}everyone,…",
     "teams": "Microsoft Teams",
     "Webhook URL": "Webhook 网址",
     "wayToGetTeamsURL": "您可以在{0}了解如何获取 Webhook URL。",
@@ -264,7 +264,7 @@
     "rocket.chat": "Rocket.Chat",
     "pushover": "Pushover",
     "pushy": "Pushy",
-    "PushByTechulus": "Push by Techulus",
+    "PushByTechulus": "使用 Techulus 推送",
     "octopush": "Octopush",
     "promosms": "PromoSMS",
     "clicksendsms": "ClickSend SMS",
@@ -687,5 +687,14 @@
     "confirmDeleteTagMsg": "你确定你要删除这个标签?与此标签关联的监视器不会被删除。",
     "infiniteRetention": "设为0表示无限保留期。",
     "Help": "帮助",
-    "Game": "游戏"
+    "Game": "游戏",
+    "Packet Size": "数据包大小",
+    "loadingError": "无法获取数据,请稍后重试。",
+    "plugin": "插件 | 插件",
+    "install": "安装",
+    "installing": "正在安装",
+    "uninstall": "卸载",
+    "uninstalling": "正在卸载",
+    "confirmUninstallPlugin": "您确定要卸载此插件吗?",
+    "Custom Monitor Type": "自定义监控类型"
 }

From 1aaf25184062b26d7077ac3278671fb4995132b9 Mon Sep 17 00:00:00 2001
From: Cyril59310 <contact@cyril59310.fr>
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 522/803] Translated using Weblate (French)

Currently translated at 98.6% (683 of 692 strings)

Translated using Weblate (French)

Currently translated at 98.6% (682 of 691 strings)

Co-authored-by: Cyril59310 <contact@cyril59310.fr>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index c87b4874..d973ec47 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -683,5 +683,13 @@
     "promosmsAllowLongSMS": "Autoriser les longs SMS",
     "Help": "Aide",
     "Game": "Jeux",
-    "Packet Size": "Taille du paquet"
+    "Packet Size": "Taille du paquet",
+    "loadingError": "Impossible de récupérer les données, veuillez réessayer plus tard.",
+    "plugin": "Plugin | Plugins",
+    "install": "Installer",
+    "installing": "Installation",
+    "uninstall": "Désinstaller",
+    "uninstalling": "Désinstallation",
+    "confirmUninstallPlugin": "Voulez-vous vraiment désinstaller ce plugin ?",
+    "Custom Monitor Type": "Type de sonde personnalisé"
 }

From c1461fd01f8080ed93c6f5cc80caac1c8cf8b5de Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Thu, 2 Feb 2023 16:04:49 +0000
Subject: [PATCH 523/803] Translated using Weblate (Chinese (Traditional, Hong
 Kong))

Currently translated at 82.8% (573 of 692 strings)

Translated using Weblate (Yue)

Currently translated at 2.6% (18 of 692 strings)

Translated using Weblate (Yue)

Currently translated at 2.1% (15 of 692 strings)

Co-authored-by: Nelson Chan <chakflying@hotmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/yue/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/yue.json   |   6 +-
 src/lang/zh-HK.json | 150 +++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 152 insertions(+), 4 deletions(-)

diff --git a/src/lang/yue.json b/src/lang/yue.json
index 6fdd7ac8..c6fb894f 100644
--- a/src/lang/yue.json
+++ b/src/lang/yue.json
@@ -12,5 +12,9 @@
     "Version": "版本",
     "Check Update On GitHub": "去 GitHub 睇下有冇更新",
     "List": "列表",
-    "Add": "新增"
+    "Add": "新增",
+    "Primary Base URL": "主要 Base URL",
+    "Heartbeat Retry Interval": "確定為離線的重試間隔",
+    "retryCheckEverySecond": "每 {0} 秒重試一次",
+    "add one": "加一個"
 }
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 1111c3cb..14f25b5e 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -178,7 +178,7 @@
     "Partially Degraded Service": "部份服務受阻",
     "Degraded Service": "服務受阻",
     "Add Group": "新增群組",
-    "Add a monitor": " 新增監測器",
+    "Add a monitor": "新增監測器",
     "Edit Status Page": "編輯 Status Page",
     "Go to Dashboard": "前往主控台",
     "Status Page": "Status Page",
@@ -316,7 +316,7 @@
     "Done": "完成",
     "Info": "資訊",
     "Security": "安全性",
-    "Steam API Key": "Steam API 金鑰",
+    "Steam API Key": "Steam API Key",
     "Shrink Database": "壓縮資料庫",
     "Pick a RR-Type...": "選擇資源記錄類型…",
     "Pick Accepted Status Codes...": "選擇可接受的狀態碼…",
@@ -429,5 +429,149 @@
     "Not running": "未執行",
     "Remove Token": "移除 Token",
     "Start": "開始",
-    "User": "使用者"
+    "User": "使用者",
+    "trustProxyDescription": "信任 'X-Forwarded-*' 的 Header。如果您想取得正確的 Client IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache 之後,您應啟用此選項。",
+    "Reverse Proxy": "Reverse Proxy",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要取得長期有效 Access Token,請按您的個人檔案名稱 (左下角),捲動至最下方,然後按建立 Token。 ",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
+    "loadingError": "未能取得數據,請重新再試。",
+    "uninstall": "解除安裝",
+    "wayToGetZohoCliqURL": "您可以前往此頁面以了解如何建立 Webhook 網址 {0}。",
+    "Select status pages...": "選擇 Status Page…",
+    "webhookAdditionalHeadersDesc": "設定傳送 Webhook 時使用的額外 Header。",
+    "topic": "Topic",
+    "topicExplanation": "監測 MQTT 中的一個 Topic",
+    "successMessageExplanation": "MQTT 中收到視為成功的訊息",
+    "Certificate Chain": "証書信任鏈",
+    "Slug": "Slug",
+    "Accept characters:": "可用字元:",
+    "startOrEndWithOnly": "只能使用 {0} 開頭或結尾",
+    "No consecutive dashes": "不得連續使用破折號",
+    "The slug is already taken. Please choose another slug.": "此 slug 已被使用。請選擇其他 slug。",
+    "Authentication": "驗證",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "新 Status Page",
+    "Docker Daemon": "Docker Daemon",
+    "About": "關於",
+    "wayToGetCloudflaredURL": "(到 {0} 下載 cloudflared)",
+    "cloudflareWebsite": "Cloudflare 網頁",
+    "Message:": "訊息:",
+    "Don't know how to get the token? Please read the guide:": "不知道如何取得權杖?請閱讀指南:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "如果您正透過 Cloudflare Tunnel 連線,可能會導致連線中斷。您確定要停止嗎?請輸入密碼以確認。",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "信任 Proxy",
+    "Other Software": "其他軟件",
+    "For example: nginx, Apache and Traefik.": "例如 nginx、Apache 和 Traefik。",
+    "Please read": "請閱覽",
+    "Subject:": "標題:",
+    "Days Remaining:": "餘下日數:",
+    "Issuer:": "簽發者:",
+    "Fingerprint:": "指紋:",
+    "No status pages": "無 Status Page",
+    "Domain Name Expiry Notification": "Domain 到期通知",
+    "Footer Text": "Footer 文字",
+    "Show Powered By": "顯示 \"Powered By\"",
+    "Domain Names": "Domain",
+    "signedInDisp": "登入為 {0}",
+    "signedInDispDisabled": "驗證已停用。",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Client 與 Server 之間的共享 Secret",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCallingStationId": "Calling Station Id",
+    "Certificate Expiry Notification": "証書過期通知",
+    "API Username": "API 使用者名稱",
+    "API Key": "API Key",
+    "Show update if available": "有更新時顯示",
+    "Also check beta release": "檢查 Beta 版本",
+    "Using a Reverse Proxy?": "正在使用 Reverse Proxy?",
+    "Check how to config it for WebSocket": "查看如何加入 WebSocket 設定",
+    "Steam Game Server": "Steam 遊戲 Server",
+    "Most likely causes:": "最可能原因:",
+    "The resource is no longer available.": "資源已不能存取。",
+    "There might be a typing error in the address.": "網址可能輸入錯誤。",
+    "What you can try:": "您可以嘗試:",
+    "Retype the address.": "重新輸入網址。",
+    "Go back to the previous page.": "返回上一頁。",
+    "Coming Soon": "即將推出",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "TLS 証書到期",
+    "certificationExpiryDescription": "証書將於 X 天後到期時觸發 HTTPS 監測器通知:",
+    "Setup Docker Host": "設定 Docker 主機",
+    "Connection Type": "連線方式",
+    "deleteDockerHostMsg": "您確定要為所有監測器刪除此 Docker 主機嗎?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container 名稱 / ID",
+    "Docker Host": "Docker 主機",
+    "Docker Hosts": "Docker 主機",
+    "Domain": "Domain",
+    "Workstation": "Workstation",
+    "ZohoCliq": "ZohoCliq",
+    "disableCloudflaredNoAuthMsg": "您處於無驗證模式。無須輸入密碼。",
+    "wayToGetLineNotifyToken": "您可以從 {0} 取得 Access Token。",
+    "Examples": "例子",
+    "Home Assistant URL": "Home Assistant 網址",
+    "Long-Lived Access Token": "長期有效 Access Token",
+    "Notification Service": "通知服務",
+    "default: notify all devices": "預設:通知所有服務",
+    "Automations can optionally be triggered in Home Assistant:": "可以選擇在 Home Assistant 中觸發自動程序:",
+    "Trigger type:": "觸發類型:",
+    "backupRecommend": "請直接備份 Docker Volume 或 ./data/ 資料夾。",
+    "squadcast": "Squadcast",
+    "or": "或",
+    "recurringInterval": "間隔",
+    "Recurring": "重複性",
+    "strategyManual": "手動啟用/停用",
+    "warningTimezone": "正在使用 Server 的時區",
+    "weekdayShortMon": "一",
+    "weekdayShortTue": "二",
+    "weekdayShortWed": "三",
+    "weekdayShortThu": "四",
+    "weekdayShortFri": "五",
+    "weekdayShortSat": "六",
+    "weekdayShortSun": "日",
+    "dayOfWeek": "每周特定一天",
+    "dayOfMonth": "每月特定一天",
+    "lastDay": "最後一天",
+    "lastDay1": "每月最後一天",
+    "maintenanceStatus-ended": "已結束",
+    "maintenanceStatus-unknown": "未知",
+    "Display Timezone": "顯示時區",
+    "Schedule Maintenance": "排程維護",
+    "Date and Time": "日期與時間",
+    "DateTime Range": "日期與時間範圍",
+    "plugin": "插件 | 插件",
+    "install": "安裝",
+    "installing": "正在安装",
+    "uninstalling": "正在解除安裝",
+    "confirmUninstallPlugin": "你確定要解除安裝?",
+    "dataRetentionTimeError": "保留限期必需為 0 或正數",
+    "infiniteRetention": "設定為 0 以作無限期保留。",
+    "Effective Date Range": "有效日期範圍",
+    "Hello @everyone is...": "Hello {'@'}everyone is…",
+    "Packet Size": "Packet 大小",
+    "Event type:": "事件類型:",
+    "Event data:": "事件資料:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "然後選擇操作,例如切換至 RGB 燈為紅色的場景。",
+    "Frontend Version": "前端版本",
+    "Frontend Version do not match backend version!": "前端版本與後端版本不符!",
+    "lastDay2": "每月倒數第二天",
+    "lastDay3": "每月倒數第三天",
+    "lastDay4": "每月倒數第四天",
+    "No Maintenance": "無維護",
+    "pauseMaintenanceMsg": "您確定要暫停嗎?",
+    "maintenanceStatus-under-maintenance": "維護中",
+    "maintenanceStatus-inactive": "已停用",
+    "maintenanceStatus-scheduled": "已排程",
+    "Server Timezone": "伺服器時區",
+    "statusPageMaintenanceEndDate": "結束",
+    "IconUrl": "Icon 網址",
+    "dnsCacheDescription": "在某些情況 IPv6 可能會出現異常,如果您遇到任何問題,請停用。",
+    "Single Maintenance Window": "單一維護時段",
+    "Maintenance Time Window of a Day": "每日維護時段",
+    "Proxy": "Proxy",
+    "backupOutdatedWarning": "過時:由於備份功能未顧及新功能的增加,因此備份功能無法產生或復原完整的備份。",
+    "Optional": "可選填"
 }

From 3bc9c19e7f860099d566e04520a797af24b7ab61 Mon Sep 17 00:00:00 2001
From: MrEddX <mreddx@chatrix.one>
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 524/803] Translated using Weblate (Bulgarian)

Currently translated at 100.0% (692 of 692 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (692 of 692 strings)

Co-authored-by: MrEddX <mreddx@chatrix.one>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/bg/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/bg-BG.json | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 0520760e..3a5f532d 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -109,8 +109,8 @@
     "Password": "Парола",
     "Remember me": "Запомни ме",
     "Login": "Вход",
-    "No Monitors, please": "Все още няма монитори. Моля, добавете поне",
-    "add one": "един.",
+    "No Monitors, please": "Все още няма монитори. Моля,",
+    "add one": "добавете един.",
     "Notification Type": "Тип известие",
     "Email": "Имейл",
     "Test": "Тест",
@@ -561,7 +561,7 @@
     "Container Name / ID": "Име на контейнер / ID",
     "Docker Host": "Docker хост",
     "Docker Hosts": "Docker хостове",
-    "trustProxyDescription": "Trust 'X-Forwarded-*' headers. Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
+    "trustProxyDescription": "Доверяване на 'X-Forwarded-*' хедърите. В случай, че желаете да получавате реалния IP адрес на клиента и Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
     "Examples": "Примери",
     "Home Assistant URL": "Home Assistant URL адрес",
     "Long-Lived Access Token": "Long-Lived токен за достъп",
@@ -580,8 +580,8 @@
     "goAlertInfo": "GoAlert е приложение с отворен код за планиране на повиквания, автоматизирани ескалации и известия (като SMS или гласови повиквания). Автоматично ангажирайте точния човек, по точния начин и в точното време! {0}",
     "goAlertIntegrationKeyInfo": "Вземете общ API интеграционен ключ за услугата във формат \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обикновено стойността на параметъра token на копирания URL адрес.",
     "goAlert": "GoAlert",
-    "backupOutdatedWarning": "Отпаднало: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
-    "backupRecommend": "Моля, архивирайте дяла или папката (./data/) директно вместо това.",
+    "backupOutdatedWarning": "Отпаднала: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
+    "backupRecommend": "Вместо това моля, архивирайте директно дяла или папката (./data/).",
     "Maintenance": "Поддръжка",
     "statusMaintenance": "Поддръжка",
     "Schedule maintenance": "Планиране на поддръжка",
@@ -683,5 +683,13 @@
     "dataRetentionTimeError": "Периодът на съхранение трябва да е 0 или по-голям",
     "confirmDeleteTagMsg": "Сигурни ли сте, че желаете да изтриете този таг? Мониторите, свързани с него, няма да бъдат изтрити.",
     "promosmsAllowLongSMS": "Позволи дълъг SMS",
-    "Packet Size": "Размер на пакет"
+    "Packet Size": "Размер на пакет",
+    "Custom Monitor Type": "Потребителски тип монитор",
+    "loadingError": "Данните не могат да бъдат изтеглени. Моля, опитайте отново по-късно.",
+    "plugin": "Плъгин | Плъгини",
+    "install": "Инсталирай",
+    "installing": "Инсталиране",
+    "uninstall": "Деинсталирай",
+    "uninstalling": "Деинсталиране",
+    "confirmUninstallPlugin": "Сигурни ли сте, че желаете да деинсталирате този плъгин?"
 }

From 47dd7ef4321351b437ab436e858e937af639fad7 Mon Sep 17 00:00:00 2001
From: Michal <black23@gmail.com>
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 525/803] Translated using Weblate (Czech)

Currently translated at 100.0% (692 of 692 strings)

Translated using Weblate (Czech)

Currently translated at 99.8% (691 of 692 strings)

Co-authored-by: Michal <black23@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/cs-CZ.json | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index ede498ff..c6b28312 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -62,7 +62,7 @@
     "Down": "Nedostupný",
     "Pending": "Čekám",
     "Unknown": "Neznámý",
-    "Pause": "Pozastavit",
+    "Pause": "Pauza",
     "Name": "Název",
     "Status": "Stav",
     "DateTime": "Časové razítko",
@@ -342,7 +342,7 @@
     "steamApiKeyDescription": "Pro monitorování Steam Game Serveru je nutné zadat Steam Web-API klíč. Svůj API klíč získáte na následující stránce: ",
     "Current User": "Aktuálně přihlášený uživatel",
     "topic": "Téma",
-    "topicExplanation": "MQTT topic, který chcete sledovat",
+    "topicExplanation": "MQTT téma, které chcete sledovat",
     "successMessage": "Zpráva o úspěchu",
     "successMessageExplanation": "MQTT zpráva považovaná za úspěšnou",
     "recent": "Poslední",
@@ -351,7 +351,7 @@
     "Security": "Bezpečnost",
     "Steam API Key": "API klíč služby Steam",
     "Shrink Database": "Zmenšit databázi",
-    "Pick a RR-Type...": "Vyberte typ záznamu o prostředku…",
+    "Pick a RR-Type...": "Vyberte typ RR záznamu…",
     "Pick Accepted Status Codes...": "Vyberte stavové kódy, které chcete akceptovat…",
     "Default": "Výchozí",
     "HTTP Options": "Možnosti protokolu HTTP",
@@ -578,7 +578,7 @@
     "Go back to the previous page.": "Vrátit se na předchozí stránku.",
     "Coming Soon": "Připravujeme",
     "wayToGetClickSendSMSToken": "API Username a API Key získáte na adrese {0} .",
-    "Connection String": "Connection String",
+    "Connection String": "Připojovací řetězec",
     "Query": "Dotaz",
     "settingsCertificateExpiry": "Platnost TLS certifikátu",
     "certificationExpiryDescription": "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:",
@@ -596,7 +596,7 @@
     "Domain": "Doména",
     "Workstation": "Pracovní stanice",
     "disableCloudflaredNoAuthMsg": "Používáte režim bez ověření, heslo není vyžadováno.",
-    "trustProxyDescription": "Důvěřovat 'X-Forwarded-*' hlavičkám. Pokud chcete získat správnou IP adresu klientů a vaše instance Uptime Kuma je schována za Nginx nebo Apache, měli byste tuto možnost zapnout.",
+    "trustProxyDescription": "Důvěřovat 'X-Forwarded-*' hlavičkám. Pokud chcete získat správnou IP adresu klientů a vaše instance Uptime Kuma je za Nginx nebo Apache, měli byste tuto možnost zapnout.",
     "wayToGetLineNotifyToken": "Přístupový token můžete získat na adrese {0}",
     "Examples": "Příklady",
     "Home Assistant URL": "Home Assistant URL",
@@ -616,7 +616,7 @@
     "goAlertInfo": "GoAlert je aplikace s otevřeným zdrojovým kódem pro plánování hovorů, automatické eskalace a upozornění (jako jsou SMS nebo hlasové hovory). Automaticky zapojte správnou osobu, správným způsobem a ve správný čas! {0}",
     "goAlertIntegrationKeyInfo": "Obecný API integrační klíč pro danou službu ve formátu \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" se obvykle nachází ve zkopírované URL jako hodnota parametru token.",
     "goAlert": "GoAlert",
-    "backupOutdatedWarning": "Zastaralé: V poslední době byla funkčnost aplikace značně rozšířena, nicméně součást pro zálohování nepokrývá všechny možnosti. Z tohoto důvodu není možné vygenerovat úplnou zálohu a zajistit obnovení všech dat.",
+    "backupOutdatedWarning": "Zastaralé: Vzhledem k tomu, že bylo přidáno mnoho funkcí a tato funkce zálohování je poněkud neudržovaná, nemůže vytvářet nebo obnovit kompletní zálohu.",
     "backupRecommend": "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
     "Optional": "Volitelný",
     "squadcast": "Squadcast",
@@ -666,12 +666,12 @@
     "Date and Time": "Datum a čas",
     "DateTime Range": "Rozsah data a času",
     "Strategy": "Strategie",
-    "Free Mobile User Identifier": "Free Mobile User Identifier",
-    "Free Mobile API Key": "Free Mobile API Key",
+    "Free Mobile User Identifier": "Identifikátor uživatele Free Mobile",
+    "Free Mobile API Key": "API klíč Free Mobile",
     "Enable TLS": "Povolit TLS",
     "Proto Service Name": "Proto Service Name",
-    "Proto Method": "Proto Method",
-    "Proto Content": "Proto Content",
+    "Proto Method": "Proto metoda",
+    "Proto Content": "Proto obsah",
     "Economy": "Úsporná",
     "Lowcost": "Nízkonákladová",
     "high": "high",
@@ -682,5 +682,14 @@
     "infiniteRetention": "Pro nekonečný záznam zadejte 0.",
     "confirmDeleteTagMsg": "Opravdu chcete odstranit tento štítek? Provedením této akce nedojde k odstranění dohledů, které jej mají přiřazeny.",
     "Help": "Nápověda",
-    "Game": "Hra"
+    "Game": "Hra",
+    "Custom Monitor Type": "Vlastní typ dohledu",
+    "loadingError": "Nelze načíst data, zkuste to prosím později.",
+    "confirmUninstallPlugin": "Opravdu chcete tento zásuvný modul odinstalovat?",
+    "plugin": "Zásuvné moduly | Zásuvné moduly",
+    "install": "Instalace",
+    "installing": "Instaluji",
+    "uninstall": "Odinstalace",
+    "uninstalling": "Odinstalování",
+    "Packet Size": "Velikost paketu"
 }

From a8af763f234ebe24889c86891d70156377f07583 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 526/803] Translated using Weblate (Yue)

Currently translated at 14.3% (99 of 692 strings)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/yue/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/yue.json | 83 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 82 insertions(+), 1 deletion(-)

diff --git a/src/lang/yue.json b/src/lang/yue.json
index c6fb894f..98936dbc 100644
--- a/src/lang/yue.json
+++ b/src/lang/yue.json
@@ -16,5 +16,86 @@
     "Primary Base URL": "主要 Base URL",
     "Heartbeat Retry Interval": "確定為離線的重試間隔",
     "retryCheckEverySecond": "每 {0} 秒重試一次",
-    "add one": "加一個"
+    "add one": "加一個",
+    "upsideDownModeDescription": "反轉狀態,如果網址係可以正常瀏覽,會被判定為 '離線/DOWN'",
+    "Not available, please setup.": "未可以用,需要設定。",
+    "Discourage search engines from indexing site": "唔建議搜尋器索引",
+    "Remember me": "記住我",
+    "Test": "測試",
+    "DateTime": "日期時間",
+    "Resume": "恢復",
+    "statusMaintenance": "維護緊",
+    "Maintenance": "維護",
+    "Unknown": "唔知",
+    "pauseDashboardHome": "暫停",
+    "Pause": "暫停",
+    "Status": "狀態",
+    "Message": "內容",
+    "No important events": "冇重要事件",
+    "Edit": "編輯",
+    "Delete": "刪除",
+    "Current": "目前",
+    "Uptime": "上線率",
+    "day": "日 | 日",
+    "-day": "日",
+    "hour": "個鐘",
+    "-hour": "個鐘",
+    "Response": "反應時間",
+    "Ping": "反應時間",
+    "URL": "網址",
+    "Retries": "重試數次確定為離線",
+    "Advanced": "進階",
+    "ignoreTLSError": "唔理 TLS/SSL 錯誤",
+    "Upside Down Mode": "反轉模式",
+    "Accepted Status Codes": "接受為上線嘅 HTTP 狀態碼",
+    "Save": "儲存",
+    "Notifications": "通知",
+    "Setup Notification": "設定通知",
+    "Light": "明亮",
+    "Dark": "暗黑",
+    "Auto": "自動",
+    "Normal": "一般",
+    "Bottom": "下方",
+    "None": "冇",
+    "Timezone": "時區",
+    "Search Engine Visibility": "係咪允許搜尋器索引",
+    "Allow indexing": "允許索引",
+    "Change Password": "改密碼",
+    "Current Password": "而家嘅密碼",
+    "New Password": "新密碼",
+    "Repeat New Password": "確認新密碼",
+    "Update Password": "更新密碼",
+    "Disable Auth": "取消登入認証",
+    "Enable Auth": "開啟登入認証",
+    "disableauth.message1": "你係咪確認想<strong>取消登入認証</strong>?",
+    "Please use this option carefully!": "請小心使用。",
+    "Logout": "登出",
+    "Leave": "離開",
+    "I understand, please disable": "我知,唔該取消登入認証",
+    "Confirm": "確認",
+    "Yes": "係",
+    "No": "唔係",
+    "Username": "帳號",
+    "Password": "密碼",
+    "Login": "登入",
+    "Notification Type": "通知類型",
+    "Email": "電郵",
+    "Repeat Password": "重複密碼",
+    "Up": "上線",
+    "Down": "離線",
+    "Pending": "待定",
+    "Name": "名稱",
+    "General Monitor Type": "一般監測器類型",
+    "Passive Monitor Type": "被動監測器類型",
+    "Specific Monitor Type": "特定監測器類型",
+    "Monitor": "監測器 | 監測器",
+    "Keyword": "關鍵字",
+    "Friendly Name": "名稱",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "No Monitors, please": "冇監測器,請",
+    "Monitor Type": "監測器類型",
+    "Heartbeat Interval": "檢查間距",
+    "Add New Monitor": "新增監測器",
+    "Quick Stats": "綜合數據"
 }

From 30fb5f0b7b4b830c66209479fe618d7b840de2a2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=96mer=20Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 527/803] Translated using Weblate (Turkish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (692 of 692 strings)

Co-authored-by: Ömer Faruk Genç <omer@farukgenc.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 77 +++++++++++++++++++++++++++------------------
 1 file changed, 46 insertions(+), 31 deletions(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index a84bc1f4..b9bc8adc 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -1,7 +1,7 @@
 {
     "languageName": "Türkçe",
-    "checkEverySecond": "{0} Saniyede bir kontrol et.",
-    "retryCheckEverySecond": "{0} Saniyede bir dene.",
+    "checkEverySecond": "{0} saniyede bir kontrol et",
+    "retryCheckEverySecond": "{0} saniyede bir dene",
     "resendEveryXTimes": "Her {0} bir yeniden gönder",
     "resendDisabled": "Yeniden gönderme devre dışı",
     "retriesDescription": "Servisin kapalı olarak işaretlenmeden ve bir bildirim gönderilmeden önce maksimum yeniden deneme sayısı",
@@ -11,7 +11,7 @@
     "acceptedStatusCodesDescription": "Başarılı bir yanıt olarak kabul edilen durum kodlarını seçin.",
     "passwordNotMatchMsg": "Şifre eşleşmiyor.",
     "notificationDescription": "Servislerin bildirim gönderebilmesi için bir bildirim yöntemi belirleyin.",
-    "keywordDescription": "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır",
+    "keywordDescription": "Anahtar kelimeyi düz html veya JSON yanıtında arayın ve büyük/küçük harfe duyarlıdır.",
     "pauseDashboardHome": "Durdur",
     "deleteMonitorMsg": "Servisi silmek istediğinden emin misin?",
     "deleteNotificationMsg": "Bu bildirimi tüm servisler için silmek istediğinden emin misin?",
@@ -19,14 +19,14 @@
     "resolverserverDescription": "Cloudflare varsayılan sunucudur, çözümleyici sunucusunu istediğiniz zaman değiştirebilirsiniz.",
     "rrtypeDescription": "İzlemek istediğiniz servisin RR-Tipini seçin",
     "pauseMonitorMsg": "Durdurmak istediğinden emin misin?",
-    "enableDefaultNotificationDescription": "Bu bildirim her yeni serviste aktif olacaktır. Bildirimi servisler için ayrı ayrı deaktive edebilirsiniz. ",
+    "enableDefaultNotificationDescription": "Bu bildirim her yeni serviste aktif olacaktır. Bildirimi servisler için ayrı ayrı deaktive edebilirsiniz.",
     "clearEventsMsg": "Bu servisin bütün kayıtlarını silmek istediğinden emin misin?",
     "clearHeartbeatsMsg": "Bu servis için tüm sağlık durumunu silmek istediğinden emin misin?",
     "confirmClearStatisticsMsg": "Tüm istatistikleri silmek istediğinden emin misin?",
-    "importHandleDescription": "Aynı isimdeki bütün servisleri ve bildirimleri atlamak için 'Var olanı atla' seçiniz. 'Üzerine yaz' var olan bütün servisleri ve bildirimleri silecektir. ",
-    "confirmImportMsg": "Yedeği içeri aktarmak istediğinize emin misiniz? Lütfen doğru içeri aktarma seçeneğini seçtiğinizden emin olunuz. ",
+    "importHandleDescription": "Aynı isimdeki bütün servisleri ve bildirimleri atlamak için 'Var olanı atla' seçiniz. 'Üzerine yaz' var olan bütün servisleri ve bildirimleri silecektir.",
+    "confirmImportMsg": "Yedeği içeri aktarmak istediğinize emin misiniz? Lütfen doğru içeri aktarma seçeneğini seçtiğinizden emin olunuz.",
     "twoFAVerifyLabel": "2FA doğrulamasını sağlamak için lütfen token bilgisini giriniz:",
-    "tokenValidSettingsMsg": "Token geçerli! Şimdi 2FA ayarlarını kaydedebilirsiniz. ",
+    "tokenValidSettingsMsg": "Token geçerli! Şimdi 2FA ayarlarını kaydedebilirsiniz.",
     "confirmEnableTwoFAMsg": "2FA'ı etkinleştirmek istediğinizden emin misiniz?",
     "confirmDisableTwoFAMsg": "2FA'ı devre dışı bırakmak istediğinize emin misiniz?",
     "Settings": "Ayarlar",
@@ -69,7 +69,7 @@
     "Keyword": "Anahtar Kelime",
     "Friendly Name": "Panelde görünecek isim",
     "URL": "URL",
-    "Hostname": "IP Adresi",
+    "Hostname": "Hostname",
     "Port": "Port",
     "Heartbeat Interval": "Servis Test Aralığı",
     "Retries": "Yeniden deneme",
@@ -102,8 +102,8 @@
     "New Password": "Yeni Şifre",
     "Repeat New Password": "Yeni Şifreyi Tekrar Girin",
     "Update Password": "Şifreyi Değiştir",
-    "Disable Auth": "Şifreli girişi iptal et.",
-    "Enable Auth": "Şifreli girişi aktif et.",
+    "Disable Auth": "Şifreli girişi iptal et",
+    "Enable Auth": "Şifreli girişi aktif et",
     "disableauth.message1": "<strong>Şifreli girişi devre dışı bırakmak istediğinizden</strong>emin misiniz?",
     "disableauth.message2": "Bu, Uptime Kuma'nın önünde Cloudflare Access gibi <strong>üçüncü taraf yetkilendirmesi olan</strong> kişiler içindir.",
     "Please use this option carefully!": "Lütfen dikkatli kullanın!",
@@ -162,7 +162,7 @@
     "Token": "Token",
     "Show URI": "URI'yi göster",
     "Tags": "Etiketler",
-    "Add New below or Select...": "Aşağıya Yeni Ekle veya Seç...",
+    "Add New below or Select...": "Aşağıya Yeni Ekle veya Seç…",
     "Tag with this name already exist.": "Bu ada sahip etiket zaten var.",
     "Tag with this value already exist.": "Bu değere sahip etiket zaten var.",
     "color": "renk",
@@ -175,7 +175,7 @@
     "Indigo": "Çivit mavisi",
     "Purple": "Mor",
     "Pink": "Pembe",
-    "Search...": "Ara...",
+    "Search...": "Ara…",
     "Avg. Ping": "Ortalama Ping",
     "Avg. Response": "Ortalama Cevap Süresi",
     "Entry Page": "Giriş Sayfası",
@@ -190,7 +190,7 @@
     "Go to Dashboard": "Panele Git",
     "Status Page": "Durum Sayfası",
     "Status Pages": "Durum Sayfaları",
-    "defaultNotificationName": "My {notification} Alert ({number})",
+    "defaultNotificationName": "Benim {notification} Alarmım ({number})",
     "here": "burada",
     "Required": "Gerekli",
     "telegram": "Telegram",
@@ -220,7 +220,7 @@
     "wayToGetDiscordURL": "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhook Oluştur'a giderek alabilirsiniz.",
     "Bot Display Name": "Botun Görünecek Adı",
     "Prefix Custom Message": "Önek Özel Mesaj",
-    "Hello @everyone is...": "Merhaba {'@'}everyone ...",
+    "Hello @everyone is...": "Merhaba {'@'}everyone…",
     "teams": "Microsoft Teams",
     "Webhook URL": "Webhook URL",
     "wayToGetTeamsURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
@@ -240,7 +240,7 @@
     "aboutWebhooks": "Webhook hakkında daha fazla bilgi: {0}",
     "aboutChannelName": "Webhook kanalını atlamak istiyorsanız, {0} Kanal Adı alanına kanal adını girin. Ör: #diğer-kanal",
     "aboutKumaURL": "Uptime Kuma URL alanını boş bırakırsanız, varsayılan olarak Project GitHub sayfası olur.",
-    "emojiCheatSheet": "Emoji cheat sheet: {0}",
+    "emojiCheatSheet": "Emoji referans sayfası: {0}",
     "PushByTechulus": "Push by Techulus",
     "apprise": "Apprise (50'den fazla Bildirim hizmetini destekler)",
     "GoogleChat": "Google Chat (sadece Google Workspace)",
@@ -315,8 +315,8 @@
     "Security": "Güvenlik",
     "Steam API Key": "Steam API Anahtarı",
     "Shrink Database": "Veritabanını Küçült",
-    "Pick a RR-Type...": "Bir RR-Tipi seçin...",
-    "Pick Accepted Status Codes...": "Kabul Edilen Durum Kodlarını Seçin...",
+    "Pick a RR-Type...": "Bir RR-Tipi seçin…",
+    "Pick Accepted Status Codes...": "Kabul Edilen Durum Kodlarını Seçin…",
     "Default": "Varsayılan",
     "HTTP Options": "HTTP Ayarları",
     "Create Incident": "Olay Oluştur",
@@ -324,13 +324,13 @@
     "Content": "İçerik",
     "Style": "Stil",
     "info": "info",
-    "warning": "warning",
-    "danger": "danger",
+    "warning": "uyarı",
+    "danger": "tehlike",
     "error": "hata",
     "critical": "kritik",
-    "primary": "primary",
-    "light": "light",
-    "dark": "dark",
+    "primary": "öncelik",
+    "light": "hafif",
+    "dark": "koyu",
     "Post": "Post",
     "Please input title and content": "Lütfen başlık ve içerik girin",
     "Created": "Oluşturuldu",
@@ -348,7 +348,7 @@
     "Services": "Hizmetler",
     "Discard": "İptal Et",
     "Cancel": "İptal Et",
-    "Powered by": "Powered by",
+    "Powered by": "Tarafından desteklenmektedir",
     "shrinkDatabaseDescription": "SQLite için veritabanı VACUUM'unu tetikleyin. Veritabanınız 1.10.0'dan sonra oluşturulduysa, AUTO_VACUUM zaten etkinleştirilmiştir ve bu eyleme gerek yoktur.",
     "serwersms": "SerwerSMS.pl",
     "serwersmsAPIUser": "API Kullanıcı Adı (webapi_ öneki dahil)",
@@ -390,13 +390,13 @@
     "deleteProxyMsg": "Bu proxy'yi tüm servisler için silmek istediğinizden emin misiniz?",
     "proxyDescription": "Proxy'lerin çalışması için bir servise atanması gerekir.",
     "enableProxyDescription": "Bu proxy, etkinleştirilene kadar izleme isteklerini etkilemeyecektir. Aktivasyon durumuna göre proxy'yi tüm servislerden geçici olarak devre dışı bırakabilirsiniz.",
-    "setAsDefaultProxyDescription": "Bu proxy, yeni servisler için varsayılan olarak etkinleştirilecektir. Yine de proxy'yi her servis için ayrı ayrı devre dışı bırakabilirsiniz.",
+    "setAsDefaultProxyDescription": "Bu proxy, yeni servisler için varsayılan olarak etkinleştirilecektir. Yine de proxy'yi her bir servis için devre dışı bırakabilirsiniz.",
     "Certificate Chain": "Sertifika Zinciri",
     "Valid": "Geçerli",
     "Invalid": "Geçersiz",
     "AccessKeyId": "AccessKey ID",
     "SecretAccessKey": "AccessKey Secret",
-    "PhoneNumbers": "PhoneNumbers",
+    "PhoneNumbers": "Telefon numaraları",
     "TemplateCode": "TemplateCode",
     "SignName": "SignName",
     "Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir: ",
@@ -412,8 +412,8 @@
     "Android": "Android",
     "Huawei": "Huawei",
     "High": "High",
-    "Retry": "Retry",
-    "Topic": "Topic",
+    "Retry": "Tekrar",
+    "Topic": "Başlık",
     "WeCom Bot Key": "WeCom Bot Key",
     "Setup Proxy": "Proxy kur",
     "Proxy Protocol": "Proxy Protokolü",
@@ -550,7 +550,7 @@
     "Domain": "Domain",
     "Workstation": "İş İstasyonu",
     "disableCloudflaredNoAuthMsg": "Yetki yok modundasınız, şifre gerekli değil.",
-    "trustProxyDescription": "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.",
+    "trustProxyDescription": "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache gibi bir proxy'nin arkasındaysa, bunu etkinleştirmelisiniz.",
     "wayToGetLineNotifyToken": "{0} adresinden bir erişim jetonu alabilirsiniz.",
     "Examples": "Örnekler",
     "Home Assistant URL": "Home Assistant URL",
@@ -570,7 +570,7 @@
     "goAlertInfo": "GoAlert, çağrı üzerine zamanlama, otomatik eskalasyonlar ve bildirimler (SMS veya sesli çağrılar gibi) için açık kaynaklı bir uygulamadır. Doğru kişiyi, doğru şekilde ve doğru zamanda otomatik olarak devreye sokun! {0}",
     "goAlertIntegrationKeyInfo": "Servis için genel API entegrasyon anahtarını, genellikle kopyalanan URL'nin belirteç parametresinin değeri olan \"aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biçiminde alın.",
     "goAlert": "GoAlert",
-    "backupOutdatedWarning": "Kullanımdan Kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan, tam bir yedekleme oluşturamaz veya geri yükleyemez.",
+    "backupOutdatedWarning": "Kullanımdan kaldırıldı: Birçok özellik eklendiğinden ve bu yedekleme özelliği biraz bakımsız olduğundan tam bir yedekleme oluşturamaz veya geri yükleyemez.",
     "backupRecommend": "Lütfen bunun yerine birimi veya veri klasörünü (./data/) doğrudan yedekleyin.",
     "enableGRPCTls": "TLS bağlantısıyla gRPC isteği göndermeye izin ver",
     "grpcMethodDescription": "Yöntem adı, sayHello, check, vb. gibi cammelCase biçimine dönüştürülür.",
@@ -666,7 +666,7 @@
     "Passive Monitor Type": "Pasif Monitör Tipi",
     "Specific Monitor Type": "Özel Monitör Tipi",
     "Help": "Yardım",
-    "Monitor": "Ekran | Ekranlar",
+    "Monitor": "Monitör | Monitörler",
     "Custom": "Özel",
     "dataRetentionTimeError": "Saklama süresi 0 veya daha büyük olmalıdır",
     "confirmDeleteTagMsg": "Bu etiketi silmek istediğinizden emin misiniz? Bu etiketle ilişkili monitörler silinmez.",
@@ -676,5 +676,20 @@
     "slack": "Slack",
     "pushover": "Pushover",
     "Game": "Oyun",
-    "Packet Size": "Paket Boyutu"
+    "Packet Size": "Paket Boyutu",
+    "Custom Monitor Type": "Özel Monitör Tipi",
+    "clicksendsms": "ClickSend SMS",
+    "loadingError": "Veriler getirilemiyor, lütfen daha sonra tekrar deneyin.",
+    "plugin": "Eklenti | Eklentiler",
+    "install": "Yükle",
+    "installing": "Yükleniyor",
+    "uninstall": "Kaldır",
+    "uninstalling": "Yükleme kaldırılıyor",
+    "confirmUninstallPlugin": "Bu eklentiyi kaldırmak istediğinizden emin misiniz?",
+    "pushy": "Pushy",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost"
 }

From c2ca60aaa2058e4859684e7d4db8b3aba793391f Mon Sep 17 00:00:00 2001
From: rubesaca <rubesaca@gmail.com>
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 528/803] Translated using Weblate (Spanish)

Currently translated at 94.6% (655 of 692 strings)

Translated using Weblate (Spanish)

Currently translated at 57.8% (400 of 692 strings)

Translated using Weblate (Spanish)

Currently translated at 56.6% (392 of 692 strings)

Translated using Weblate (Spanish)

Currently translated at 49.2% (341 of 692 strings)

Co-authored-by: rubesaca <rubesaca@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/es/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/es-ES.json | 470 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 460 insertions(+), 10 deletions(-)

diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index 9a40ee8b..8fa80158 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -1,14 +1,14 @@
 {
     "languageName": "Español",
-    "checkEverySecond": "Comprobar cada {0} segundos.",
-    "retriesDescription": "Número máximo de intentos antes de que el servicio se marque como CAÍDO y una notificación sea enviada.",
+    "checkEverySecond": "Comprobar cada {0} segundos",
+    "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 asigna una notificación a el/los monitor(es) para hacerlos funcional(es).",
-    "keywordDescription": "Palabra clave en HTML plano o respuesta JSON, es sensible a mayúsculas",
+    "keywordDescription": "Buscar palabra clave en HTML plano o respuesta JSON. La búsqueda es sensible a mayúsculas.",
     "pauseDashboardHome": "Pausado",
     "deleteMonitorMsg": "¿Seguro que quieres eliminar este monitor?",
     "deleteNotificationMsg": "¿Seguro que quieres eliminar esta notificación para todos los monitores?",
@@ -86,7 +86,7 @@
     "Enable Auth": "Habilitar autenticación",
     "disableauth.message1": "Seguro que deseas <strong>deshabilitar la autenticación</strong>?",
     "disableauth.message2": "Es para <strong>quien implementa autenticación de terceros</strong> ante Uptime Kuma como por ejemplo Cloudflare Access.",
-    "Please use this option carefully!": "Por favor usar con cuidado.",
+    "Please use this option carefully!": "¡Utilice esta opción con cuidado!",
     "Logout": "Cerrar sesión",
     "Leave": "Salir",
     "I understand, please disable": "Entiendo, por favor deshabilitar",
@@ -128,7 +128,7 @@
     "backupDescription3": "Los datos confidenciales, como los tokens de notificación, se incluyen en el archivo de exportación. Guárdalo con cuidado.",
     "alertNoFile": "Selecciona un archivo para importar.",
     "alertWrongFileType": "Selecciona un archivo JSON.",
-    "twoFAVerifyLabel": "Ingresa tu token para verificar que 2FA está funcionando",
+    "twoFAVerifyLabel": "Ingresa tu token para verificar que 2FA está funcionando:",
     "tokenValidSettingsMsg": "¡El token es válido! Ahora puedes guardar la configuración de 2FA.",
     "confirmEnableTwoFAMsg": "¿Estás seguro de que quieres habilitar 2FA?",
     "confirmDisableTwoFAMsg": "¿Estás seguro de que quieres desactivar 2FA?",
@@ -144,7 +144,7 @@
     "Token": "Token",
     "Show URI": "Mostrar URI",
     "Clear all statistics": "Borrar todas las estadísticas",
-    "retryCheckEverySecond": "Reintentar cada {0} segundo.",
+    "retryCheckEverySecond": "Reintentar cada {0} segundos",
     "importHandleDescription": "Elige 'Omitir existente' si deseas omitir todos los monitores o notificaciones con el mismo nombre. 'Sobrescribir' eliminará todos los monitores y notificaciones existentes.",
     "confirmImportMsg": "¿Estás seguro de importar la copia de seguridad? Asegúrate de haber seleccionado la opción de importación correcta.",
     "Heartbeat Retry Interval": "Intervalo de reintento de latido",
@@ -155,7 +155,7 @@
     "Options": "Opciones",
     "Keep both": "Manténer ambos",
     "Tags": "Etiquetas",
-    "Add New below or Select...": "Agregar nuevo a continuación o seleccionar...",
+    "Add New below or Select...": "Agregar nuevo a continuación o seleccionar…",
     "Tag with this name already exist.": "Una etiqueta con este nombre ya existe.",
     "Tag with this value already exist.": "Una etiqueta con este valor ya existe.",
     "color": "color",
@@ -168,7 +168,7 @@
     "Indigo": "Índigo",
     "Purple": "Morado",
     "Pink": "Rosa",
-    "Search...": "Buscar...",
+    "Search...": "Buscar…",
     "Avg. Ping": "Ping promedio",
     "Avg. Response": "Respuesta promedio",
     "Entry Page": "Página de entrada",
@@ -188,7 +188,7 @@
     "smtp": "Email (SMTP)",
     "discord": "Discord",
     "teams": "Microsoft Teams",
-    "signal": "Signal",
+    "signal": "Señal",
     "gotify": "Gotify",
     "slack": "Slack",
     "rocket.chat": "Rocket.chat",
@@ -205,5 +205,455 @@
     "clearDataOlderThan": "Mantener los datos del historial del monitor durante {0} días.",
     "records": "registros",
     "One record": "Un registro",
-    "steamApiKeyDescription": "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: "
+    "steamApiKeyDescription": "Para monitorear un servidor de juegos de Steam, necesitas una clave Steam Web-API. Puedes registrar tu clave API aquí: ",
+    "Custom Monitor Type": "Monitor Tipo Personalizado",
+    "Primary Base URL": "URL Base Primaria",
+    "Passive Monitor Type": "Monitor Tipo Pasivo",
+    "pushOptionalParams": "Parámetros opcionales: {0}",
+    "Schedule maintenance": "Programar mantenimiento",
+    "Pick Affected Monitors...": "Seleccionar Monitores Afectados…",
+    "Start of maintenance": "Inicio del mantenimiento",
+    "All Status Pages": "Todas las Páginas de Estado",
+    "Select status pages...": "Seleccionar páginas de estado…",
+    "Style": "Estilo",
+    "info": "información",
+    "warning": "advertencia",
+    "danger": "peligro",
+    "critical": "crítico",
+    "primary": "primario",
+    "Content": "Contenido",
+    "recent": "Reciente",
+    "Done": "Terminado",
+    "Create Incident": "Crear Incidente",
+    "Title": "Título",
+    "Info": "Información",
+    "Security": "Seguridad",
+    "Current User": "Usuario Actual",
+    "topic": "Asunto",
+    "Shrink Database": "Reducir Base de Datos",
+    "dark": "oscuro",
+    "light": "claro",
+    "Last Updated": "Última Actualización",
+    "Show Tags": "Mostrar Etiquetas",
+    "Switch to Light Theme": "Cambiar a Tema Claro",
+    "Add one": "Añadir uno",
+    "Description": "Descripción",
+    "Cancel": "Cancelar",
+    "No Monitors": "Sin Monitores",
+    "Untitled Group": "Grupo sin título",
+    "Services": "Servicios",
+    "Discard": "Descartar",
+    "Add New Status Page": "Añadir Nueva Página de Estado",
+    "Start": "Iniciar",
+    "Stop": "Parar",
+    "Remove Token": "Eliminar Token",
+    "Powered by": "Potenciado por",
+    "Customize": "Personalizar",
+    "Custom Footer": "Pie Personalizado",
+    "Custom CSS": "CSS Personalizado",
+    "Backup": "Respaldo",
+    "Go back to the previous page.": "Volver a la página anterior.",
+    "Query": "Consulta",
+    "Examples": "Ejemplos",
+    "weekdayShortMon": "Lun",
+    "weekdayShortWed": "Mie",
+    "weekdayShortSat": "Sab",
+    "Ignore TLS Error": "Ignorar Error TLS",
+    "secureOptionNone": "Ninguno / STARTTLS (25, 587)",
+    "Schedule Maintenance": "Programar Mantenimiento",
+    "Date and Time": "Fecha y Hora",
+    "Enable": "Habilitar",
+    "Disable": "Deshabilitar",
+    "maintenanceStatus-inactive": "Inactivo",
+    "maintenanceStatus-scheduled": "Programado",
+    "maintenanceStatus-unknown": "Desconocido",
+    "Display Timezone": "Mostrar Zona Horaria",
+    "Server Timezone": "Servidor de Zona Horaria",
+    "statusPageMaintenanceEndDate": "Finaliza",
+    "Enable DNS Cache": "Habilitar Cache DNS",
+    "No Maintenance": "Sin Mantenimiento",
+    "weekdayShortSun": "Dom",
+    "dayOfWeek": "Día de la Semana",
+    "dayOfMonth": "Día del Mes",
+    "lastDay": "Último día",
+    "lastDay1": "Último Día del Mes",
+    "pauseMaintenanceMsg": "¿Seguro que quiere pausar?",
+    "maintenanceStatus-under-maintenance": "En Mantenimiento",
+    "DateTime Range": "Rango de Fecha y Hora",
+    "infiniteRetention": "Poner a 0 para retención infinita.",
+    "confirmDeleteTagMsg": "¿Estas seguro que quieres eliminar esta etiqueta? Los monitores asociados a esta etiqueta no serán eliminados.",
+    "Example:": "Ejemplo: {0}",
+    "Strategy": "Estrategia",
+    "Read more:": "Leer más: {0}",
+    "onebotGroupMessage": "Grupo",
+    "Affected Monitors": "Monitores Afectados",
+    "Custom": "Personalizado",
+    "Headers": "Encabezados",
+    "PhoneNumbers": "Números de Teléfono",
+    "No monitors available.": "Sin monitores disponibles.",
+    "error": "error",
+    "deleteProxyMsg": "¿Seguro que quieres eliminar este proxy para todos los monitores?",
+    "Hide Tags": "Ocultar Etiquetas",
+    "Created": "Creado",
+    "Switch to Dark Theme": "Cambiar a Tema Oscuro",
+    "More info on:": "Más información en: {0}",
+    "weekdayShortTue": "Mar",
+    "PasswordsDoNotMatch": "Las contraseñas no coinciden.",
+    "statusMaintenance": "Mantenimiento",
+    "Maintenance": "Mantenimiento",
+    "General Monitor Type": "Monitor Tipo General",
+    "Specific Monitor Type": "Monitor Tipo Específico",
+    "Monitor": "Monitores",
+    "Resend Notification if Down X times consequently": "Reenviar Notificación si Caído X veces consecutivas",
+    "resendEveryXTimes": "Reenviar cada {0} veces",
+    "resendDisabled": "Reenvío deshabilitado",
+    "needPushEvery": "Debe llamar a esta URL cada {0} segundos.",
+    "here": "aquí",
+    "Content Type": "Tipo de Contenido",
+    "Required": "Requerido",
+    "defaultNotificationName": "Mi {notification} Alerta ({number})",
+    "Server URL": "URL del servidor",
+    "Priority": "Prioridad",
+    "Read more": "Leer más",
+    "Body": "Cuerpo",
+    "webhookAdditionalHeadersTitle": "Encabezados Adicionales",
+    "Method": "Método",
+    "Default": "Predeterminado",
+    "uninstalling": "Desinstalando",
+    "install": "Instalar",
+    "installing": "Instalando",
+    "uninstall": "Desinstalar",
+    "confirmUninstallPlugin": "¿Estas seguro que quieres desinstalar este complemento?",
+    "Recipients": "Destinatarios",
+    "User ID": "ID de Usuario",
+    "deleteMaintenanceMsg": "¿Seguro que quieres eliminar este mantenimiento?",
+    "promosmsLogin": "Nombre de inicio de sesión de la API",
+    "SMS Type": "Tipo de SMS",
+    "Device": "Dispositivo",
+    "Message Title": "Título del Mensaje",
+    "Notification Sound": "Sonido de Notificación",
+    "documentation": "documentación",
+    "onebotUserOrGroupId": "Grupo/ID de Usuario",
+    "Game": "Juego",
+    "or": "ó",
+    "Status:": "Estado: {0}",
+    "Help": "Ayuda",
+    "HTTP Options": "Opciones HTTP",
+    "weekdayShortThu": "Jue",
+    "weekdayShortFri": "Vie",
+    "maintenanceStatus-ended": "Finalizado",
+    "BodyInvalidFormat": "El cuerpo de la solicitud no es JSON válido: ",
+    "topicExplanation": "Tema MQTT para monitorear",
+    "successMessageExplanation": "Mensaje MQTT que será considerado como éxito",
+    "Steam API Key": "API Key de Steam",
+    "Please input title and content": "Por favor introduzca título y contenido",
+    "Footer Text": "Texto del Pié",
+    "Show Powered By": "Mostrar Potenciado Por",
+    "Domain Names": "Nombres de Dominio",
+    "signedInDisp": "Iniciada sesión como {0}",
+    "RadiusSecretDescription": "Secreto Compartido entre cliente y servidor",
+    "RadiusCalledStationId": "Id de la Estación Llamada",
+    "RadiusCalledStationIdDescription": "Identificador del dispositivo llamado",
+    "RadiusCallingStationId": "Id de Estación Llamante",
+    "Certificate Expiry Notification": "Notificación de Caducidad del Certificado",
+    "API Username": "Nombre Usuario API",
+    "API Key": "Clave API",
+    "Show update if available": "Mostrar actualización si está disponible",
+    "Also check beta release": "Comprobar también lanzamientos beta",
+    "Steam Game Server": "Servidor de Juegos de Steam",
+    "Most likely causes:": "Las causas más probables:",
+    "There might be a typing error in the address.": "Debe haber un error de escritura en la dirección.",
+    "What you can try:": "Lo que puedes intentar:",
+    "Retype the address.": "Reescriba la dirección.",
+    "Coming Soon": "Próximamente",
+    "Connection String": "Cadena de Conexión",
+    "settingsCertificateExpiry": "Caducidad del certificado TLS",
+    "certificationExpiryDescription": "Los monitores HTTPS activan una notificación cuando el certificado TLS caduca en:",
+    "Setup Docker Host": "Configurar Host de Docker",
+    "Connection Type": "Tipo de Conexión",
+    "Docker Daemon": "Demonio Docker",
+    "deleteDockerHostMsg": "¿Estas seguro que quieres eliminar este host de docker para todos los monitores?",
+    "Date Created": "Fecha de Creación",
+    "signedInDispDisabled": "Autenticación Deshabilitada.",
+    "RadiusCallingStationIdDescription": "Identificador del dispositivo llamante",
+    "Using a Reverse Proxy?": "¿Usando un Proxy Inverso?",
+    "Check how to config it for WebSocket": "Compruebe cómo configurarlo para WebSocket",
+    "The resource is no longer available.": "El recurso ya no está disponible.",
+    "Push URL": "URL Push",
+    "Webhook URL": "URL Webhook",
+    "Application Token": "Token de Aplicación",
+    "appriseNotInstalled": "Apprise no está instalado. {0}",
+    "PushUrl": "URL Push",
+    "HeadersInvalidFormat": "Los encabezados de solicitud no son JSON válido: ",
+    "Post URL": "URL Post",
+    "emojiCheatSheet": "Hoja de trucos Emoji: {0}",
+    "webhookJsonDesc": "{0} es bueno para cualquier servidor HTTP moderno como Express.js",
+    "webhookFormDataDesc": "{multipart} es bueno para PHP. El JSON deberá analizarse con {decodeFunction}",
+    "webhookAdditionalHeadersDesc": "Establece encabezados adicionales enviados con el webhook.",
+    "appriseInstalled": "Apprise está instalado.",
+    "successMessage": "Mensaje de éxito",
+    "Pick Accepted Status Codes...": "Elija códigos de estado aceptados…",
+    "Post": "Post",
+    "shrinkDatabaseDescription": "Activar ASPIRADORA para SQLite. Si tu base de datos fue creada después 1.10.0, AUTO_ASPIRADORA ya está habilitada y esta acción no es necesaria.",
+    "deleteStatusPageMsg": "¿Estas seguro que quieres eliminar esta página de estado?",
+    "default": "Predeterminado",
+    "enabled": "Habilitado",
+    "setAsDefault": "Establecer Por Defecto",
+    "proxyDescription": "Proxies deben ser asignados a un monitor para que funcionen.",
+    "warningTimezone": "Está usando la zona horaria del servidor",
+    "trustProxyDescription": "Confiar en los encabezados 'X-Forwarded-*'. Si desea obtener la IP de cliente correcta y su Uptime Kuma está detrás de un proxy como Nginx o Apache, debe habilitar esto.",
+    "enableProxyDescription": "Este proxy no afectará las solicitudes de monitoreo hasta que se active. Puede controlar deshabilitar temporalmente el proxy de todos los monitores por estado de activación.",
+    "setAsDefaultProxyDescription": "Este proxy estará habilitado de forma predeterminada para los nuevos monitores. Todavía puede deshabilitar el proxy por separado para cada monitor.",
+    "Certificate Chain": "Cadena de certificado",
+    "Valid": "Válido",
+    "Invalid": "Inválido",
+    "User": "Usuario",
+    "Installed": "Instalado",
+    "Not installed": "No instalado",
+    "Running": "Funcionando",
+    "Not running": "No funcionando",
+    "Slug": "Slug",
+    "Accept characters:": "Aceptar caracteres:",
+    "Proxies": "Proxys",
+    "startOrEndWithOnly": "Empezar o terminar sólo con {0}",
+    "No consecutive dashes": "Sin guiones consecutivos",
+    "Next": "Siguiente",
+    "The slug is already taken. Please choose another slug.": "Este slug ya está en uso. Por favor, elige otro slug.",
+    "No Proxy": "Sin Proxy",
+    "Authentication": "Autenticación",
+    "HTTP Basic Auth": "Autenticación básica HTTP",
+    "New Status Page": "Nueva Página de Estado",
+    "Page Not Found": "Página No Encontrada",
+    "Reverse Proxy": "Proxy Inverso",
+    "About": "Acerca de",
+    "wayToGetCloudflaredURL": "(Descargar cloudflared de {0})",
+    "cloudflareWebsite": "Web de Cloudflare",
+    "Message:": "Mensaje:",
+    "Don't know how to get the token? Please read the guide:": "No sabes como obtener el token? Por favor, lee la guía:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La conexión actual puede perderse si actualmente se está conectando a través del Tunel Cloudflare. ¿Seguro que quieres detenerlo? Escriba su contraseña actual para confirmarlo.",
+    "HTTP Headers": "Encabezados HTTP",
+    "Trust Proxy": "Proxy de Confianza",
+    "Other Software": "Otro Software",
+    "For example: nginx, Apache and Traefik.": "Por ejemplo: nginx, Apache y Traefik.",
+    "Please read": "Por favor lee",
+    "Subject:": "Asunto:",
+    "Valid To:": "Válido Para:",
+    "Days Remaining:": "Días Restantes:",
+    "Issuer:": "Emisor:",
+    "Fingerprint:": "Huella:",
+    "No status pages": "Sin páginas de estado",
+    "Domain Name Expiry Notification": "Notificación de Caducidad de Nombre de Dominio",
+    "Proxy": "Proxy",
+    "RadiusSecret": "Secreto de Radius",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Contenedor de Docker",
+    "Container Name / ID": "Nombre / ID de Contenedor",
+    "Docker Host": "Host Docker",
+    "Docker Hosts": "Hosts Docker",
+    "Domain": "Dominio",
+    "Workstation": "Puesto de Trabajo",
+    "Packet Size": "Tamaño del Paquete",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Token de Bot",
+    "wayToGetTelegramToken": "Puedes conseguir un token desde {0}.",
+    "Chat ID": "ID de Chat",
+    "supportTelegramChatID": "Chat Directo de Soporte / Grupo / ID de Chat del Canal",
+    "wayToGetTelegramChatID": "Puedes obtener tu ID de chat enviando un mensaje al bot y visitando esta URL para ver el chat_id:",
+    "YOUR BOT TOKEN HERE": "TU TOKEN DE BOT AQUÍ",
+    "chatIDNotFound": "ID de Chat no encontrada; por favor, primero envía un mensaje a este bot",
+    "disableCloudflaredNoAuthMsg": "Estas en modo No Autenticado, no es necesaria una contraseña.",
+    "wayToGetLineNotifyToken": "Puede obtener un token de acceso desde {0}",
+    "Home Assistant URL": "URL de Asistente de Hogar",
+    "Long-Lived Access Token": "Token de acceso de larga duración",
+    "Notification Service": "Servicio de Notificaciones",
+    "default: notify all devices": "predeterminado: notificar todos los dispositivos",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Puede encontrar una lista de Servicios de notificación en Asistente de Hogar en \"Herramientas para desarrolladores > Servicios\", busque \"notificación\" para encontrar el nombre de su dispositivo/teléfono.",
+    "Automations can optionally be triggered in Home Assistant:": "Las automatizaciones se pueden activar opcionalmente en Asistente de Hogar:",
+    "Trigger type:": "Tipo de disparador:",
+    "Event type:": "Tipo de Evento:",
+    "Event data:": "Datos del Evento:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Luego elija una acción, por ejemplo, cambie la escena a donde una luz RGB es roja.",
+    "Frontend Version": "Versión de Interfaz",
+    "Frontend Version do not match backend version!": "La Versión de Interfaz no coincide con la versión backend!",
+    "backupRecommend": "Por favor, haz copia de seguridad del volumen o el archivo de datos (./data/) directamente en su lugar.",
+    "recurringInterval": "Intervalo",
+    "Recurring": "Periódico",
+    "strategyManual": "Activo/Inactivo Manualmente",
+    "lastDay2": "Penúltimo Día del Mes",
+    "lastDay3": "Antepenúltimo día del mes",
+    "lastDay4": "Trasantepenúltimo Día del Mes",
+    "IconUrl": "URL de Icono",
+    "dnsCacheDescription": "Es posible que no funcione en algunos entornos IPv6; desactívelo si encuentra algún problema.",
+    "Single Maintenance Window": "Ventana de Mantenimiento Único",
+    "secureOptionTLS": "TLS (465)",
+    "aboutMattermostChannelName": "Puedes sobreescribir el canal por defecto en el cual el Webhook publica introduciendo el nombre del canal en el campo \"Nombre del Canal\". Esto tiene que estar habilitado en la configuración de Mattermost Webhook. Ejemplo: #otro-canal",
+    "dataRetentionTimeError": "El periodo de retención debe ser 0 o mayor",
+    "Enable TLS": "Habilita TLS",
+    "Lowcost": "Bajo coste",
+    "You can divide numbers with": "Puedes dividir números con",
+    "Base URL": "URL Base",
+    "Proto Service Name": "Nombre de Servicio Proto",
+    "Proto Method": "Método Proto",
+    "Proto Content": "Contenido Proto",
+    "Economy": "Económico",
+    "iOS": "iOS",
+    "Android": "Android",
+    "Platform": "Plataforma",
+    "onebotPrivateMessage": "Privado",
+    "onebotMessageType": "Tipo de Mensaje OneBot",
+    "smseagleRecipientType": "Tipo de destinatario",
+    "smseagleRecipient": "Destinatario(s) (multiples deben separarse por comas)",
+    "smseagleEncoding": "Enviar como Unicode",
+    "smseaglePriority": "Prioridad del mensaje (0-9, predeterminado = 0)",
+    "stackfield": "Stackfield",
+    "Leave blank to use a shared sender number.": "Dejar en blanco para usar un número de remitente compartido.",
+    "Octopush API Version": "Versión API Octopush",
+    "From Name/Number": "De Nombre/Número",
+    "Recipient Number": "Número de Destinatario",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "El token de acceso de larga duración se puede crear haciendo clic en el nombre de su perfil (abajo a la izquierda) y desplazándose hasta la parte inferior y luego haciendo clic en Crear token. ",
+    "backupOutdatedWarning": "Obsoleto: dado que se agregaron muchas funciones y esta función de copia de seguridad no se mantiene desde hace un tiempo, no puede generar ni restaurar una copia de seguridad completa.",
+    "Optional": "Opcional",
+    "loadingError": "No se pueden obtener los datos, inténtelo de nuevo más tarde.",
+    "pushoverDesc2": "Si quieres enviar notificaciones a diferentes dispositivos, rellena el campo Dispositivo.",
+    "octopushLegacyHint": "Utilizas la versión anterior de Octopush (2011-2020) o la nueva versión?",
+    "Sms template must contain parameters: ": "La plantilla SMS debería contener parámetros: ",
+    "For safety, must use secret key": "Por seguridad, deberías usar key secreta",
+    "signalImportant": "IMPORTANTE: No puedes mezclar grupos y números en destinatarios!",
+    "aboutWebhooks": "Más información sobre Webhooks en: {0}",
+    "smtpDkimHashAlgo": "Algoritmo Hash (Opcional)",
+    "promosmsPhoneNumber": "Número de teléfono (para destinatarios Polacos puedes omitir los códigos de área)",
+    "promosmsTypeFlash": "SMS FLASH - Mensaje se mostrará automáticamente en el dispositivo del destinatario. Limitado sólo a destinatarios Polacos.",
+    "promosmsSMSSender": "Nombre de Remitente SMS: Nombre pre-registrado o uno de los predeterminados: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "matrixDesc1": "Puedes encontrar la ID de sala interna mirando en la sección avanzado de los ajustes de sala en tu cliente Matrix. Debería ser algo como !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "Es altamente recomendable crear un nuevo usuario y no usar el token de acceso propio de tu usuario porque otorgaría acceso completo a tu cuenta y todas las salas que hayas entrado. En su lugar, crea un usuario nuevo e invítalo a la sala donde quieres recibir las notificaciones. Puedes obtener el token de acceso ejecutando {0}",
+    "plugin": "Complemento | Complementos",
+    "From Email": "Desde el Email",
+    "emailCustomSubject": "Asunto Personalizado",
+    "To Email": "Al Email",
+    "smtpCC": "CC",
+    "smtpBCC": "CCO",
+    "Discord Webhook URL": "URL Webhook de Discord",
+    "wayToGetDiscordURL": "Puede obtener esto yendo a Configuración del servidor -> Integraciones -> Crear webhook",
+    "Bot Display Name": "Nombre para mostrar del Bot",
+    "Hello @everyone is...": "Hola {'@'}todos están…",
+    "wayToGetTeamsURL": "Puedes aprender cómo crear una URL webhook {0}.",
+    "wayToGetZohoCliqURL": "Puedes aprender cómo crear una URL webhook {0}.",
+    "needSignalAPI": "Necesitas tener un cliente de señal con API REST.",
+    "wayToCheckSignalURL": "Puedes revisar esta URL para ver cómo configurar uno:",
+    "Number": "Número",
+    "Access Token": "Token de Acceso",
+    "Channel access token": "Token de acceso al canal",
+    "Line Developers Console": "Consola de Desarrolladores de Line",
+    "lineDevConsoleTo": "Consola de Desarrolladores de Line - {0}",
+    "Basic Settings": "Configuración Básica",
+    "Messaging API": "API de Mensajería",
+    "wayToGetLineChannelToken": "Primero accede al {0}, crea un proveedor y un canal (API de Mensajería), entonces puedes obtener el token de acceso al cana y el ID de usuario de los elementos de menú anteriormente mencionados.",
+    "Icon URL": "URL de Icono",
+    "aboutIconURL": "Puede proporcionar un enlace a una imagen en \"URL de icono\" para anular la imagen de perfil predeterminada. No se utilizará si se establece Icono Emoji.",
+    "enableGRPCTls": "Permite enviar solicitudes gRPC con conexión TLS",
+    "grpcMethodDescription": "Nombre del método es convertido a formato cammelCase tal como digoHola, verificandoTodo, etc.",
+    "dnsPortDescription": "Puerto servidor DNS. Por defecto al 53. Puedes cambiar el puerto en cualquier momento.",
+    "recurringIntervalMessage": "Ejecutar una vez al día | Ejecutar una vez cada {0} días",
+    "affectedMonitorsDescription": "Selecciona los monitores que se ven afectados por el mantenimiento actual",
+    "affectedStatusPages": "Muestra este mensaje de mantenimiento en las páginas de estado seleccionadas",
+    "atLeastOneMonitor": "Selecciona al menos un monitor afectado",
+    "endpoint": "punto final",
+    "promosmsPassword": "Contraseña API",
+    "pushoversounds pushover": "Pushover (predeterminado)",
+    "pushoversounds bike": "Bicicleta",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Caja Registradora",
+    "pushoversounds classical": "Clásica",
+    "pushoversounds cosmic": "Cósmico",
+    "pushoversounds falling": "Descendente",
+    "pushoversounds gamelan": "Gamelán",
+    "pushoversounds incoming": "Entrante",
+    "pushoversounds intermission": "Intermedio",
+    "pushoversounds magic": "Mágico",
+    "pushoversounds mechanical": "Mecánica",
+    "pushoversounds pianobar": "Bar Piano",
+    "pushoversounds siren": "Sirena",
+    "pushoversounds spacealarm": "Alarma Espacial",
+    "pushoversounds tugboat": "Remolcador",
+    "pushoversounds alien": "Alarma Alienígena (largo)",
+    "pushoversounds climb": "Escalada (largo)",
+    "pushoversounds persistent": "Persistente (largo)",
+    "pushoversounds echo": "Pushover Eco (largo)",
+    "pushoversounds updown": "Arriba Abajo (largo)",
+    "pushoversounds vibrate": "Sólo Vibración",
+    "pushoversounds none": "Ninguno (silencio)",
+    "pushyAPIKey": "Key de Api Secreta",
+    "pushyToken": "Token de Dispositivo",
+    "PushByTechulus": "Push con Techulus",
+    "clicksendsms": "SMS con ClickSend",
+    "GoogleChat": "Chat de Google (sólo Google Workspace)",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Crea aplicación y obtén tu token de bot en {0}",
+    "wayToGetKookGuildID": "Activa 'Modo Desarrollador' en los ajustes de Kook, y haz click derecho en la unión para obtener su ID",
+    "Guild ID": "",
+    "User Key": "Key de Usuario",
+    "octopushTypePremium": "Premium (Rápido - recomendado para alertas)",
+    "octopushTypeLowCost": "Bajo Coste (Lento - algunas veces bloqueado por operador)",
+    "checkPrice": "Consultar {0} precios:",
+    "apiCredentials": "Credenciales de API",
+    "Check octopush prices": "Consulta los precios de octopush {0}.",
+    "octopushPhoneNumber": "Número de teléfono (en formato internacional, ejemplo: +33612345678) ",
+    "octopushSMSSender": "Nombre de Remitente del SMS: 3-11 caracteres alfanuméricos y espacio (a-zA-Z0-9)",
+    "LunaSea Device ID": "ID Dispositivo LunaSea",
+    "goAlert": "GoAlert",
+    "pushoverDesc1": "La prioridad Emergencia (2) tiene predeterminado un tiempo muerto entre reintentos de 30 segundos y expirará después de 1 hora.",
+    "AccessKeyId": "ID de Key de Acceso",
+    "SecretAccessKey": "Secrreto de Key de Acceso",
+    "TemplateCode": "Código de Plantilla",
+    "Bark Group": "Grupo de Bark",
+    "Bark Sound": "Sonido de Bark",
+    "SecretKey": "Key Secreta",
+    "Huawei": "Huawei",
+    "Retry": "Reintentar",
+    "Proxy Server": "Servidor Proxy",
+    "Proxy Protocol": "Protocolo Proxy",
+    "Setup Proxy": "Configurar Proxy",
+    "Proxy server has authentication": "El servidor Proxy tiene autenticación",
+    "promosmsAllowLongSMS": "Permitir SMS largo",
+    "Uptime Kuma URL": "URL de Uptime Kuma",
+    "Icon Emoji": "Icono Emoji",
+    "aboutKumaURL": "Si dejas vacío el campo URL Uptime Kuma, predeterminará la página GitHub del Proyecto.",
+    "smtpDkimSettings": "Ajustes DKIM",
+    "smtpDkimDomain": "Nombre de Dominio",
+    "smtpDkimKeySelector": "Selector de Key",
+    "smtpDkimPrivateKey": "Key Privada",
+    "Integration Key": "Key de Integración",
+    "Integration URL": "URL de Integración",
+    "Device Token": "Token de Dispositivo",
+    "WeCom Bot Key": "Key de Bot WeCom",
+    "promosmsTypeEco": "SMS ECO - barato pero lento y a veces sobrecargado. Limitado sólo a destinatarios Polacos.",
+    "promosmsTypeSpeed": "SMS SPEED - La mayor prioridad en el sistema. Muy rápido y confiable pero costoso (alrededor del doble del precio de SMS FULL).",
+    "matrixHomeserverURL": "URL Servidor Casero (con http(s):// y opcionalmente el puerto)",
+    "Internal Room Id": "ID de Sala Interna",
+    "Channel Name": "Nombre del canal",
+    "aboutChannelName": "Introduce el nombre del canal en {0} campo Nombre del Canal si quieres evitar el canal Webhook. Ejemplo: #otro-canal",
+    "smtpDkimDesc": "Por favor, remitir a DKIM Nodemailer {0} para descubrir como se usa.",
+    "smtpDkimheaderFieldNames": "Keys de encabezado para firmar (Opcional)",
+    "smtpDkimskipFields": "Keys de encabezado para no firmar (Opcional)",
+    "Auto resolve or acknowledged": "Resolución automática o reconocida",
+    "promosmsTypeFull": "SMS FULL - Nivel Premium de SMS, puedes usar tu Nombre de Remitente (Tienes que registrarlo primero). Confiable para alertas.",
+    "do nothing": "no hacer nada",
+    "alerta": "Alerta",
+    "serwersmsAPIPassword": "Contraseña de API",
+    "serwersmsPhoneNumber": "Número de teléfono",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Número(s) de teléfono",
+    "serwersmsSenderName": "Nombre de remitente de SMS (registrado a través del portal de cliente)",
+    "auto resolve": "resolución automática",
+    "auto acknowledged": "Auto reconocida",
+    "alertaEnvironment": "Entorno",
+    "PushDeer Key": "Key de PushDeer",
+    "onebotSafetyTips": "Por seguridad, deberías colocara el token de acceso",
+    "wayToGetClickSendSMSToken": "Puedes obtener Nombre de Usuario API y la Key API en {0}.",
+    "Apprise URL": "URL Apprise",
+    "gorush": "Gorush",
+    "squadcast": "Squadcast",
+    "Maintenance Time Window of a Day": "Ventana de tiempo de mantenimiento de un día",
+    "Effective Date Range": "Rango de Fecha Efectivo"
 }

From e1021ba38a2d5783bab4a2a9438a1d83be2d24b1 Mon Sep 17 00:00:00 2001
From: Dim <DimitriDR@users.noreply.weblate.kuma.pet>
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 529/803] Translated using Weblate (French)

Currently translated at 100.0% (692 of 692 strings)

Co-authored-by: Dim <DimitriDR@users.noreply.weblate.kuma.pet>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index d973ec47..ae39af3c 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -15,10 +15,10 @@
     "statusMaintenance": "Maintenance",
     "Schedule maintenance": "Planifier la maintenance",
     "Affected Monitors": "Sondes concernées",
-    "Pick Affected Monitors...": "Sélectionner les sondes concernées...",
+    "Pick Affected Monitors...": "Sélectionner les sondes concernées…",
     "Start of maintenance": "Début de la maintenance",
     "All Status Pages": "Toutes les pages d'état",
-    "Select status pages...": "Sélectionner les pages d'état...",
+    "Select status pages...": "Sélectionner les pages d'état…",
     "recurringIntervalMessage": "Exécuter une fois par jour | Exécuter une fois tous les {0} jours",
     "affectedMonitorsDescription": "Sélectionnez les sondes concernées par la maintenance en cours",
     "affectedStatusPages": "Afficher ce message de maintenance sur les pages d'état sélectionnées",
@@ -29,7 +29,7 @@
     "pauseDashboardHome": "En pause",
     "deleteMonitorMsg": "Êtes-vous sûr de vouloir supprimer cette sonde ?",
     "deleteMaintenanceMsg": "Voulez-vous vraiment supprimer cette maintenance ?",
-    "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.",
+    "deleteNotificationMsg": "Êtes-vous sûr de vouloir supprimer ce type de notification pour toutes les sondes ?",
     "dnsPortDescription": "Port du serveur DNS. La valeur par défaut est 53. Vous pouvez modifier le port à tout moment.",
     "resolverserverDescription": "Le DNS de Cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
     "rrtypeDescription": "Veuillez sélectionner un type d'enregistrement DNS",
@@ -177,7 +177,7 @@
     "Token": "Jeton",
     "Show URI": "Afficher l'URI",
     "Tags": "Étiquettes",
-    "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici...",
+    "Add New below or Select...": "Ajoutez-en un en dessous ou sélectionnez-le ici…",
     "Tag with this name already exist.": "Une étiquette portant ce nom existe déjà.",
     "Tag with this value already exist.": "Une étiquette avec cette valeur existe déjà.",
     "color": "Couleur",
@@ -190,7 +190,7 @@
     "Indigo": "Indigo",
     "Purple": "Violet",
     "Pink": "Rose",
-    "Search...": "Rechercher...",
+    "Search...": "Rechercher…",
     "Avg. Ping": "Ping moyen",
     "Avg. Response": "Réponse moyenne",
     "Entry Page": "Page d'accueil",
@@ -238,7 +238,7 @@
     "wayToGetDiscordURL": "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Créer un Webhook »",
     "Bot Display Name": "Nom du robot (affiché)",
     "Prefix Custom Message": "Préfixe du message personnalisé",
-    "Hello @everyone is...": "Bonjour {'@'}everyone il...",
+    "Hello @everyone is...": "Bonjour {'@'}everyone il…",
     "teams": "Microsoft Teams",
     "Webhook URL": "URL vers le webhook",
     "wayToGetTeamsURL": "Vous pouvez apprendre comment créer une URL Webhook {0}.",
@@ -348,8 +348,8 @@
     "Security": "Sécurité",
     "Steam API Key": "Clé d'API Steam",
     "Shrink Database": "Réduire la base de données",
-    "Pick a RR-Type...": "Choisissez un type d'enregistrement...",
-    "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés...",
+    "Pick a RR-Type...": "Choisissez un type d'enregistrement…",
+    "Pick Accepted Status Codes...": "Choisissez les codes de statut acceptés…",
     "Default": "Défaut",
     "HTTP Options": "Options HTTP",
     "Create Incident": "Créer un incident",
@@ -593,7 +593,7 @@
     "Domain": "Domaine",
     "Workstation": "Poste de travail",
     "disableCloudflaredNoAuthMsg": "Vous êtes en mode No Auth, un mot de passe n'est pas nécessaire.",
-    "trustProxyDescription": "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière (nginx ou Apache) vous devez l'activer.",
+    "trustProxyDescription": "Faire confiance aux en-têtes 'X-Forwarded-*'. Si vous souhaitez obtenir la bonne adresse IP client et que votre Uptime Kuma se situe derrière un proxy (comme nginx ou Apache) vous devez l'activer.",
     "wayToGetLineNotifyToken": "Vous pouvez obtenir un jeton d'accès auprès de {0}",
     "Examples": "Exemples",
     "Home Assistant URL": "URL vers Home Assistant",
@@ -613,7 +613,7 @@
     "goAlertInfo": "GoAlert est une application open source pour la planification des appels, les escalades automatisées et les notifications (comme les SMS ou les appels vocaux). Impliquez automatiquement la bonne personne, de la bonne manière et au bon moment ! {0}",
     "goAlertIntegrationKeyInfo": "Obtenez la clé d'intégration d'API générique pour le service dans ce format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" généralement la valeur du paramètre de jeton de l'URL copiée.",
     "goAlert": "GoAlert",
-    "backupOutdatedWarning": "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
+    "backupOutdatedWarning": "Obsolète : étant donné que de nombreuses fonctionnalités ont été ajoutées et que cette fonctionnalité de sauvegarde est non maintenue, elle ne peut pas générer ou restaurer une sauvegarde complète.",
     "backupRecommend": "Veuillez sauvegarder le volume ou le dossier de données (./data/) directement à la place.",
     "Optional": "Optionnel",
     "squadcast": "Squadcast",

From 99d4b8ba5015c4688f71d8ee772d75560759fdc4 Mon Sep 17 00:00:00 2001
From: mrkbaji <mrkbaji13@gmail.com>
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 530/803] Translated using Weblate (Hungarian)

Currently translated at 58.8% (407 of 692 strings)

Co-authored-by: mrkbaji <mrkbaji13@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/hu/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/hu.json | 50 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 44 insertions(+), 6 deletions(-)

diff --git a/src/lang/hu.json b/src/lang/hu.json
index 78036a1f..a6424a0f 100644
--- a/src/lang/hu.json
+++ b/src/lang/hu.json
@@ -56,9 +56,9 @@
     "Uptime": "Uptime",
     "Cert Exp.": "SSL lejárat",
     "day": "nap",
-    "-day": " nap",
+    "-day": "-nap",
     "hour": "óra",
-    "-hour": " óra",
+    "-hour": "- óra",
     "Response": "Válasz",
     "Ping": "Ping",
     "Monitor Type": "Figyelő típusa",
@@ -197,7 +197,7 @@
     "apprise": "Apprise (50+ értesítési szolgáltatás)",
     "pushbullet": "Pushbullet",
     "line": "Line Messenger",
-    "mattermost": "Mattermost",
+    "mattermost": "A legfontosabb",
     "Status Page": "Státusz oldal",
     "Status Pages": "Státusz oldalak",
     "Primary Base URL": "Elsődleges URL",
@@ -315,8 +315,8 @@
     "Security": "Biztonság",
     "Steam API Key": "Steam API kulcs",
     "Shrink Database": "Adatbázis tömörítése",
-    "Pick a RR-Type...": "Válasszon egy RR-típust...",
-    "Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít...",
+    "Pick a RR-Type...": "Válasszon egy RR-típust…",
+    "Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít…",
     "Default": "Alapért.",
     "HTTP Options": "HTTP beállítások",
     "Create Incident": "Incidens létrehozása",
@@ -372,5 +372,43 @@
     "alertaApiKey": "API kulcs",
     "alertaAlertState": "Figyelmeztetési állapot",
     "alertaRecoverState": "Visszaállási állapot",
-    "deleteStatusPageMsg": "Biztos, hogy törölni akarja a státusz oldalt?"
+    "deleteStatusPageMsg": "Biztos, hogy törölni akarja a státusz oldalt?",
+    "Start of maintenance": "Karbantartás kezdete",
+    "successMessageExplanation": "MQTT üzenet, amely sikeresnek minősül",
+    "weekdayShortFri": "Pé",
+    "lastDay2": "A hónap 2. utolsó napja",
+    "maintenanceStatus-under-maintenance": "Karbantartás alatt",
+    "dnsCacheDescription": "Előfordulhat, hogy bizonyos IPv6-környezetekben nem működik, tiltsa le, ha problémákat tapasztal.",
+    "Add New Status Page": "Új állapotoldal hozzáadása",
+    "The resource is no longer available.": "Az erőforrás már nem elérhető.",
+    "Show update if available": "Frissítés megjelenítése, ha elérhető",
+    "weekdayShortMon": "Hé",
+    "weekdayShortTue": "Ke",
+    "weekdayShortWed": "Sze",
+    "weekdayShortThu": "Csüt",
+    "weekdayShortSat": "Szo",
+    "weekdayShortSun": "Vas",
+    "dayOfWeek": "A hét napja",
+    "dayOfMonth": "A hónap napja",
+    "lastDay": "Utolsó nap",
+    "lastDay3": "A hónap 3. utolsó napja",
+    "lastDay4": "A hónap 4. utolsó napja",
+    "No Maintenance": "Nincs karbantartás",
+    "pauseMaintenanceMsg": "Biztosan szüneteltetni akarja?",
+    "maintenanceStatus-inactive": "Inaktív",
+    "maintenanceStatus-scheduled": "Ütemezett",
+    "maintenanceStatus-ended": "Végzett",
+    "maintenanceStatus-unknown": "Ismeretlen",
+    "Display Timezone": "Időzóna megjelenítése",
+    "Server Timezone": "Szerver időzóna",
+    "statusPageMaintenanceEndDate": "Vége",
+    "Enable DNS Cache": "DNS-gyorsítótár engedélyezése",
+    "Enable": "Engedélyezze",
+    "Disable": "Letiltás",
+    "Affected Monitors": "Érintett monitorok",
+    "Packet Size": "Csomag mérete",
+    "IconUrl": "Ikon URL",
+    "successMessage": "Sikeres üzenet",
+    "lastDay1": "A hónap utolsó napja",
+    "Guild ID": "Guild ID"
 }

From 2b1cb66ff7f6a1baf2720268b9bc3c29383c754b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EC=98=A4=EB=A1=9C=EB=9D=BC?= <dhfhfk1203@gmail.com>
Date: Thu, 2 Feb 2023 16:04:50 +0000
Subject: [PATCH 531/803] Translated using Weblate (Korean)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (692 of 692 strings)

Co-authored-by: 오로라 <dhfhfk1203@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ko/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ko-KR.json | 238 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 201 insertions(+), 37 deletions(-)

diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
index 2cb2131c..2c2297c6 100644
--- a/src/lang/ko-KR.json
+++ b/src/lang/ko-KR.json
@@ -1,7 +1,7 @@
 {
     "languageName": "한국어",
-    "checkEverySecond": "{0}초마다 확인해요.",
-    "retryCheckEverySecond": "{0}초마다 다시 확인해요.",
+    "checkEverySecond": "{0}초마다 확인해요",
+    "retryCheckEverySecond": "{0}초마다 다시 확인해요",
     "retriesDescription": "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
     "ignoreTLSError": "HTTPS 웹사이트에서 TLS/SSL 오류 무시하기",
     "upsideDownModeDescription": "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거예요.",
@@ -14,7 +14,7 @@
     "deleteMonitorMsg": "정말 이 모니터링을 삭제할까요?",
     "deleteNotificationMsg": "정말 이 알림을 모든 모니터링에서 삭제할까요?",
     "resolverserverDescription": "Cloudflare가 기본 서버예요, 원한다면 언제나 다른 Resolver 서버로 변경할 수 있어요.",
-    "rrtypeDescription": "모니터링할 RR-Type을 선택해요.",
+    "rrtypeDescription": "모니터링할 RR-Type을 선택해요",
     "pauseMonitorMsg": "정말 이 모니터링을 일시 정지할까요?",
     "enableDefaultNotificationDescription": "새로 추가하는 모든 모니터링에 이 알림을 기본적으로 활성화해요. 각 모니터에 대해 별도로 알림을 비활성화할 수 있어요.",
     "clearEventsMsg": "정말 이 모니터링에 대한 모든 이벤트를 삭제할까요?",
@@ -22,7 +22,7 @@
     "confirmClearStatisticsMsg": "정말 모든 통계를 삭제할까요?",
     "importHandleDescription": "이름이 같은 모든 모니터링이나 알림을 건너뛰려면 '기존값 건너뛰기'를 선택해주세요. '덮어쓰기'는 기존의 모든 모니터링과 알림을 삭제해요.",
     "confirmImportMsg": "정말 백업을 가져올까요? 가져오기 옵션을 제대로 설정했는지 다시 확인해주세요.",
-    "twoFAVerifyLabel": "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요.",
+    "twoFAVerifyLabel": "토큰을 입력해 2단계 인증이 작동하는지 확인해주세요",
     "tokenValidSettingsMsg": "토큰이 유효해요! 이제 2단계 인증 설정을 저장할 수 있어요.",
     "confirmEnableTwoFAMsg": "정말 2단계 인증을 활성화할까요?",
     "confirmDisableTwoFAMsg": "정말 2단계 인증을 비활성화할까요?",
@@ -98,7 +98,7 @@
     "Enable Auth": "인증 활성화",
     "disableauth.message1": "정말로 <strong>인증 기능을 끌까요</strong>?",
     "disableauth.message2": "이 기능은 <strong>Cloudflare Access와 같은 서드파티 인증</strong>을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.",
-    "Please use this option carefully!": "신중하게 사용하세요.",
+    "Please use this option carefully!": "신중하게 사용하세요!",
     "Logout": "로그아웃",
     "Leave": "나가기",
     "I understand, please disable": "기능에 대해 이해했으니 꺼주세요.",
@@ -154,7 +154,7 @@
     "Token": "토큰",
     "Show URI": "URI 보기",
     "Tags": "태그",
-    "Add New below or Select...": "아래 새롭게 추가 또는 선택...",
+    "Add New below or Select...": "아래 새롭게 추가 또는 선택…",
     "Tag with this name already exist.": "같은 태그 이름이 이미 존재해요.",
     "Tag with this value already exist.": "같은 값을 가진 태그가 이미 존재해요.",
     "color": "색상",
@@ -167,7 +167,7 @@
     "Indigo": "남색",
     "Purple": "보라색",
     "Pink": "핑크색",
-    "Search...": "검색...",
+    "Search...": "검색…",
     "Avg. Ping": "평균 핑",
     "Avg. Response": "평균 응답",
     "Entry Page": "첫 페이지",
@@ -189,15 +189,15 @@
     "Bot Token": "봇 토큰",
     "wayToGetTelegramToken": "토큰은 여기서 얻을 수 있어요: {0}.",
     "Chat ID": "채팅 ID",
-    "supportTelegramChatID": "개인 채팅 / 그룹 / 채널의 ID를 지원해요.",
-    "wayToGetTelegramChatID": "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
+    "supportTelegramChatID": "개인 채팅 / 그룹 / 채널의 ID를 지원해요",
+    "wayToGetTelegramChatID": "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요",
     "YOUR BOT TOKEN HERE": "봇 토큰",
-    "chatIDNotFound": "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
+    "chatIDNotFound": "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요",
     "webhook": "Webhook",
     "Post URL": "Post URL",
     "Content Type": "Content Type",
-    "webhookJsonDesc": "{0}은 express.js와 같은 최신 HTTP 서버에 적합해요.",
-    "webhookFormDataDesc": "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 json을 디코딩하면 되어요.",
+    "webhookJsonDesc": "{0}은 Express.js와 같은 최신 HTTP 서버에 적합해요",
+    "webhookFormDataDesc": "{multipart}은 PHP에 적합해요. {decodeFunction}를 기준으로 JSON을 디코딩하면 되어요",
     "smtp": "Email (SMTP)",
     "secureOptionNone": "없음 / STARTTLS (25, 587)",
     "secureOptionTLS": "TLS (465)",
@@ -207,24 +207,24 @@
     "smtpCC": "참조",
     "smtpBCC": "숨은 참조",
     "discord": "Discord",
-    "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요!",
+    "Discord Webhook URL": "Discord 웹훅 URL",
+    "wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요",
     "Bot Display Name": "표시 이름",
     "Prefix Custom Message": "접두사 메시지",
-    "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요...",
+    "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요…",
     "teams": "Microsoft Teams",
-    "Webhook URL": "Webhook URL",
-    "wayToGetTeamsURL": "{0}에서 Webhook을 어떻게 만드는지 알아보세요!",
+    "Webhook URL": "웹훅 URL",
+    "wayToGetTeamsURL": "{0}에서 Webhook을 어떻게 만드는지 알아보세요.",
     "signal": "Signal",
     "Number": "숫자",
     "Recipients": "받는 사람",
     "needSignalAPI": "REST API를 사용하는 Signal 클라이언트가 있어야 해요.",
-    "wayToCheckSignalURL": "밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요.",
+    "wayToCheckSignalURL": "밑에 URL을 확인해 URL 설정 방법을 볼 수 있어요:",
     "signalImportant": "경고: 받는 사람의 그룹과 숫자는 섞을 수 없어요!",
     "gotify": "Gotify",
     "Application Token": "애플리케이션 토큰",
     "Server URL": "서버 URL",
-    "Priority": "Priority",
+    "Priority": "우선 순위",
     "slack": "Slack",
     "Icon Emoji": "아이콘 이모지",
     "Channel Name": "채널 이름",
@@ -276,7 +276,7 @@
     "aboutIconURL": "\"아이콘 URL\"에 사진 링크를 입력해 프로필 사진을 설정할 수 있어요. 아이콘 이모지가 설정되어 있으면 적용되지 않을 거예요.",
     "aboutMattermostChannelName": "채널 이름을 입력하면 Webhook이 게시할 기본 채널을 재설정할 수 있어요. 이 설정은 Mattermost 웹훅 설정에서 활성화해야 해요. 예: #기타-채널",
     "matrix": "Matrix",
-    "promosmsTypeEco": "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요. ",
+    "promosmsTypeEco": "SMS ECO - 저렴하지만 느리고 가끔 과부하에 걸려요. 폴란드 수신자만 사용할 수 있어요.",
     "promosmsTypeFlash": "SMS FLASH - 메시지가 받는 사람 장치에 자동으로 표시되어요. 폴란드 수신자만 사용할 수 있어요.",
     "promosmsTypeFull": "SMS FULL - SMS 프리미엄 티어, 보내는 사람 이름을 먼저 등록해야 해요. 알림 기능에 적합해요.",
     "promosmsTypeSpeed": "SMS SPEED - 시스템에서 가장 높은 우선순위예요. 매우 빠르고 신뢰할 수 있지만 비용이 많이 들어요 (SMS 전체 가격의 약 두 배).",
@@ -295,10 +295,10 @@
     "matrixHomeserverURL": "Homeserver URL (http(s):// 와 함께 적어주세요. 그리고 포트 번호는 선택적 입니다.)",
     "Internal Room Id": "내부 방 ID",
     "matrixDesc1": "Matrix 클라이언트 방 설정의 고급 섹션에서 내부 방 ID를 찾을 수 있어요. 내부 방 ID는 이렇게 생겼답니다: !QMdRCpUIfLwsfjxye6:home.server.",
-    "matrixDesc2": "사용자의 모든 방에 대한 엑세스가 허용될 수 있어서 새로운 사용자를 만들고 원하는 방에만 초대한 후 엑세스 토큰을 사용하는 것이 좋아요. {0} 이 명령어를 통해 엑세스 토큰을 얻을 수 있어요.",
-    "Method": "Method",
+    "matrixDesc2": "사용자의 모든 방에 대한 엑세스가 허용될 수 있어서 새로운 사용자를 만들고 원하는 방에만 초대한 후 엑세스 토큰을 사용하는 것이 좋아요. {0} 이 명령어를 통해 엑세스 토큰을 얻을 수 있어요",
+    "Method": "메서드",
     "Body": "Body",
-    "Headers": "Headers",
+    "Headers": "헤더",
     "PushUrl": "Push URL",
     "HeadersInvalidFormat": "요청 Headers의 JSON 형식이 올바르지 않아요: ",
     "BodyInvalidFormat": "요청 Body의 JSON 형식이 올바르지 않아요: ",
@@ -315,8 +315,8 @@
     "Security": "보안",
     "Steam API Key": "스팀 API 키",
     "Shrink Database": "데이터베이스 축소",
-    "Pick a RR-Type...": "RR-Type을 골라주세요...",
-    "Pick Accepted Status Codes...": "상태 코드를 골라주세요...",
+    "Pick a RR-Type...": "RR-Type을 골라주세요…",
+    "Pick Accepted Status Codes...": "상태 코드를 골라주세요…",
     "Default": "기본",
     "HTTP Options": "HTTP 옵션",
     "Create Incident": "인시던트 만들기",
@@ -330,7 +330,7 @@
     "light": "화이트",
     "dark": "다크",
     "Post": "게시",
-    "Please input title and content": "제목과 내용을 작성해주세요.",
+    "Please input title and content": "제목과 내용을 작성해주세요",
     "Created": "생성 날짜",
     "Last Updated": "마지막 업데이트",
     "Unpin": "제거",
@@ -375,7 +375,7 @@
     "smtpDkimHashAlgo": "해시 알고리즘 (선택)",
     "smtpDkimheaderFieldNames": "서명할 헤더 키 (선택)",
     "smtpDkimskipFields": "서명하지 않을 헤더 키 (선택)",
-    "wayToGetPagerDutyKey": "Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요.",
+    "wayToGetPagerDutyKey": "Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요",
     "Integration Key": "Integration 키",
     "Integration URL": "Integration URL",
     "Auto resolve or acknowledged": "자동 해결 혹은 승인",
@@ -406,7 +406,7 @@
     "PhoneNumbers": "휴대전화 번호",
     "TemplateCode": "템플릿 코드",
     "SignName": "SignName",
-    "Sms template must contain parameters: ": "SMS 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
+    "Sms template must contain parameters: ": "SMS 템플릿은 다음과 같은 파라미터가 포함되어야 해요: ",
     "Bark Endpoint": "Bark Endpoint",
     "WebHookUrl": "웹훅 URL",
     "SecretKey": "Secret Key",
@@ -436,7 +436,7 @@
     "Add New Status Page": "새로운 상태 페이지 만들기",
     "Slug": "주소",
     "Accept characters:": "허용되는 문자열:",
-    "startOrEndWithOnly": "{0}로 시작하거나 끝나야 해요.",
+    "startOrEndWithOnly": "{0} 로 시작하거나 끝나야 해요",
     "No consecutive dashes": "연속되는 대시는 허용되지 않아요",
     "Next": "다음",
     "The slug is already taken. Please choose another slug.": "이미 존재하는 주소에요. 다른 주소를 사용해 주세요.",
@@ -456,10 +456,10 @@
     "Other Software": "다른 소프트웨어",
     "For example: nginx, Apache and Traefik.": "nginx, Apache, Traefik 등을 사용할 수 있어요.",
     "Please read": "이 문서를 참조하세요:",
-    "Subject:": "Subject:",
-    "Valid To:": "Valid To:",
+    "Subject:": "발급 대상:",
+    "Valid To:": "유효 기간:",
     "Days Remaining:": "남은 일수:",
-    "Issuer:": "Issuer:",
+    "Issuer:": "발급 기관:",
     "Fingerprint:": "Fingerprint:",
     "No status pages": "상태 페이지 없음",
     "Domain Name Expiry Notification": "도메인 이름 만료 알림",
@@ -470,7 +470,7 @@
     "onebotGroupMessage": "그룹 메시지",
     "onebotPrivateMessage": "개인 메시지",
     "onebotUserOrGroupId": "그룹/사용자 ID",
-    "onebotSafetyTips": "안전을 위해 Access 토큰을 설정하세요.",
+    "onebotSafetyTips": "안전을 위해 Access 토큰을 설정하세요",
     "PushDeer Key": "PushDeer 키",
     "Footer Text": "Footer 문구",
     "Show Powered By": "Powered By 문구 표시하기",
@@ -524,8 +524,172 @@
     "The resource is no longer available.": "더 이상 사용할 수 없어요...",
     "There might be a typing error in the address.": "주소에 오탈자가 있을 수 있어요.",
     "What you can try:": "해결 방법:",
-    "Retype the address.": "주소 다시 입력하기",
-    "Go back to the previous page.": "이전 페이지로 돌아가기",
-    "Coming Soon": "Coming Soon...",
-    "wayToGetClickSendSMSToken": "{0}에서 API 사용자 이름과 키를 얻을 수 있어요."
+    "Retype the address.": "주소 다시 입력하기.",
+    "Go back to the previous page.": "이전 페이지로 돌아가기.",
+    "Coming Soon": "Coming Soon",
+    "wayToGetClickSendSMSToken": "{0}에서 API 사용자 이름과 키를 얻을 수 있어요.",
+    "Custom Monitor Type": "커스텀 모니터링",
+    "deleteDockerHostMsg": "정말 이 도커 호스트를 모든 모니터링에서 삭제할까요?",
+    "trustProxyDescription": "'X-Forwarded-*' 헤더를 신뢰해요. 올바른 클라이언트 IP를 얻어야하고Uptime Kuma가 Nginx나 Apache 같은 프록시 뒤에 있다면 이 기능을 활성화해야 해요.",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "프로필 이름(왼쪽 아래)을 클릭하고 아래로 스크롤한 다음 토큰 만들기를 클릭하여 장기 액세스 토큰을 만들 수 있어요. ",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "그런 다음 동작을 선택해요, 예를 들어 장면을 RGB 조명이 빨간색인 곳으로 전환해요.",
+    "backupOutdatedWarning": "Deprecated: 많은 기능이 추가되었고 이 백업 기능은 유지 관리되지 않아 전체 백업을 생성하거나 복원할 수 없어요.",
+    "lastDay3": "매월 세 번째 마지막 날",
+    "maintenanceStatus-under-maintenance": "점검 중",
+    "dnsCacheDescription": "일부 IPv6 환경에서는 작동하지 않을 수 있어요. 문제가 발생하면 비활성화하세요.",
+    "dataRetentionTimeError": "저장 기간은 0 이상이어야 해요",
+    "wayToGetKookGuildID": "Kook 설정에서 'Developer Mode'를 활성화하고 길드를 우클릭해 ID를 얻어요",
+    "You can divide numbers with": "다음과 같이 숫자를 구분할 수 있어요:",
+    "goAlertInfo": "GoAlert는 온콜 스케줄링, 자동 에스컬레이션 및 알림(SMS 또는 음성 통화와 같은)을 위한 오픈 소스 응용 프로그램이에요. 올바른 사람, 올바른 방법, 적절한 시간에 자동으로 참여하세요! {0}",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "휴대전화 번호",
+    "smseagleRecipient": "받는 사람 (쉼표로 구분)",
+    "Maintenance": "점검",
+    "statusMaintenance": "점검 중",
+    "resendEveryXTimes": "{0}번마다 다시 보내요",
+    "resendDisabled": "다시 보내지 않아요",
+    "loadingError": "데이터를 가져올 수 없어요, 나중에 다시 시도하세요.",
+    "plugin": "플러그인",
+    "install": "설치",
+    "installing": "설치 중",
+    "uninstall": "삭제",
+    "uninstalling": "삭제 중",
+    "confirmUninstallPlugin": "정말 이 플러그인을 삭제할까요?",
+    "Guild ID": "길드 ID",
+    "Strategy": "계획",
+    "Free Mobile User Identifier": "무료 모바일 사용자 식별",
+    "Free Mobile API Key": "무료 모바일 API 키",
+    "Enable TLS": "TLS 활성화",
+    "Proto Service Name": "Proto 서비스 이름",
+    "Proto Method": "Proto 메서드",
+    "Proto Content": "Proto Content",
+    "Economy": "경제적",
+    "high": "높음",
+    "Lowcost": "저비용",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API 문서 ",
+    "Gateway Type": "게이트웨이 종류",
+    "SMSManager": "SMSManager",
+    "Base URL": "베이스 URL",
+    "goAlertIntegrationKeyInfo": "일반적으로 복사된 URL의 토큰 매개 변수 값을 \"aaaaaa-bbb-ccccc-ddd-eeeeeeeee\" 형식으로 서비스에 대한 일반 API 통합 키를 가져와요.",
+    "goAlert": "GoAlert",
+    "Bark Group": "Bark 그룹",
+    "Bark Sound": "Bark 소리",
+    "promosmsAllowLongSMS": "긴 SMS 허용",
+    "smseagleGroup": "전화번호부 그룹 이름",
+    "smseagleContact": "전화번호부 연락처 이름",
+    "smseagleRecipientType": "받는 사람 종류",
+    "smseagleToken": "API 엑세스 토큰",
+    "smseagleUrl": "SMSEagle 기기 URL",
+    "smseagleEncoding": "유니코드로 보내기",
+    "smseaglePriority": "메시지 우선 순위 (0-9, 기본값= 0)",
+    "ntfy Topic": "ntfy 주제",
+    "HomeAssistant": "홈 어시스턴트",
+    "RadiusSecretDescription": "클라이언트와 서버 간의 비밀 키",
+    "RadiusSecret": "Radius 비밀 키",
+    "RadiusCalledStationId": "접속 스테이션의 Id",
+    "RadiusCalledStationIdDescription": "접속 스테이션의 식별자",
+    "RadiusCallingStationId": "접속 요청 스테이션의 Id",
+    "RadiusCallingStationIdDescription": "접속 요청 스테이션의 식별자",
+    "Query": "쿼리",
+    "settingsCertificateExpiry": "TLS 인증서 만료",
+    "certificationExpiryDescription": "HTTPS 모니터링 TLS 인증서가 만료되면 알림을 활성화해요:",
+    "Setup Docker Host": "도커 호스트 설정",
+    "Docker Daemon": "도커 데몬",
+    "socket": "소켓",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "도커 컨테이너",
+    "Container Name / ID": "컨테이너 이름 / ID",
+    "Docker Host": "도커 호스트",
+    "Docker Hosts": "도커 호스트",
+    "Domain": "도메인",
+    "Connection String": "연결 문자열",
+    "Workstation": "워크스테이션",
+    "Packet Size": "패킷 크기",
+    "ZohoCliq": "ZohoCliq",
+    "disableCloudflaredNoAuthMsg": "인증 없음 모드이므로 암호가 필요하지 않아요.",
+    "wayToGetLineNotifyToken": "토큰은 여기서 얻을 수 있어요: {0}",
+    "Examples": "예시",
+    "Home Assistant URL": "홈 어시스턴트 URL",
+    "Long-Lived Access Token": "장기 엑세스 토큰",
+    "Notification Service": "알림 서비스",
+    "default: notify all devices": "기본값: 모든 장치에 알림",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "알림 서비스 목록은 홈 어시스턴트의 \"개발자 도구 > 서비스\"에서 \"알림\" 검색해 장치/전화 이름을 찾을 수 있어요.",
+    "Automations can optionally be triggered in Home Assistant:": "자동화는 Home Assistant에서 선택적으로 트리거될 수 있어요:",
+    "Connection Type": "연결 종류",
+    "Trigger type:": "트리거 종류:",
+    "Event type:": "이벤트 종류:",
+    "Event data:": "이벤트 데이터:",
+    "Frontend Version": "프론트엔드 버전",
+    "Frontend Version do not match backend version!": "프론트엔드 버전이 백엔드 버전과 일치하지 않아요!",
+    "confirmDeleteTagMsg": "정말 이 태그를 삭제할까요? 이 태그와 연결된 모니터링은 삭제되지 않아요.",
+    "infiniteRetention": "무한히 저장하려면 0으로 설정하세요.",
+    "backupRecommend": "대신 볼륨 또는 데이터 폴더 (./data/) 를 직접 백업하세요.",
+    "Optional": "선택",
+    "squadcast": "Squadcast",
+    "or": "혹은",
+    "recurringInterval": "반복 - 주기적",
+    "Recurring": "반복",
+    "strategyManual": "직접 활성/비활성화 하기",
+    "warningTimezone": "서버 표준 시간대를 사용해요",
+    "weekdayShortMon": "월",
+    "weekdayShortTue": "화",
+    "weekdayShortWed": "수",
+    "weekdayShortThu": "목",
+    "weekdayShortFri": "금",
+    "weekdayShortSat": "토",
+    "weekdayShortSun": "일",
+    "dayOfWeek": "요일",
+    "dayOfMonth": "날짜",
+    "lastDay": "마지막 날",
+    "lastDay1": "매월 마지막 날",
+    "lastDay2": "매월 마지막 날",
+    "lastDay4": "매월 네 번째 마지막 날",
+    "No Maintenance": "점검 일정이 없어요",
+    "pauseMaintenanceMsg": "정말 일시 정지 할까요?",
+    "maintenanceStatus-inactive": "비활성화",
+    "maintenanceStatus-scheduled": "예약됨",
+    "maintenanceStatus-ended": "완료됨",
+    "maintenanceStatus-unknown": "알 수 없음",
+    "Server Timezone": "서버 시간대",
+    "Display Timezone": "표시 시간대",
+    "statusPageMaintenanceEndDate": "종료",
+    "IconUrl": "아이콘 URL",
+    "Enable DNS Cache": "DNS 캐시 활성화",
+    "Enable": "활성화",
+    "Disable": "비활성화",
+    "Single Maintenance Window": "단일 점검",
+    "Maintenance Time Window of a Day": "점검 시간",
+    "Effective Date Range": "유효 날짜 범위",
+    "Schedule Maintenance": "점검 예약하기",
+    "Date and Time": "날짜 및 시간",
+    "DateTime Range": "날짜 시간 범위",
+    "wayToGetZohoCliqURL": "{0}에서 Webhook을 어떻게 만드는지 배울 수 있어요.",
+    "enableGRPCTls": "TLS 연결 gRPC 요청 전송 허용",
+    "grpcMethodDescription": "메서드 이름은 sayHello, check와 같은 카멜 케이스로 변환되어요.",
+    "deleteMaintenanceMsg": "정말 이 점검을 삭제할까요?",
+    "recurringIntervalMessage": "매일 한 번 실행 | {0}일마다 한 번 실행",
+    "affectedMonitorsDescription": "현재 점검에 영향을 받는 모니터링 선택하기",
+    "affectedStatusPages": "점검 메시지를 표시할 상태 페이지 선택하기",
+    "Kook": "Kook",
+    "atLeastOneMonitor": "최소 1개의 모니터링을 선택하세요",
+    "wayToGetKookBotToken": "{0} 에서 애플리케이션을 만들고 봇 토큰을 얻어요",
+    "Help": "도움말",
+    "Game": "게임",
+    "General Monitor Type": "일반 모니터링",
+    "Passive Monitor Type": "수동 모니터링",
+    "Specific Monitor Type": "특정 모니터링",
+    "Monitor": "모니터",
+    "Resend Notification if Down X times consequently": "X번 중단될 경우 알림 다시 보내기",
+    "Schedule maintenance": "점검 예약하기",
+    "Affected Monitors": "영향을 받는 모니터링",
+    "Pick Affected Monitors...": "영향을 받는 모니터링 선택하기…",
+    "Start of maintenance": "점검 시작",
+    "All Status Pages": "모든 상태 페이지",
+    "Select status pages...": "상태 페이지 선택하기…",
+    "Custom": "커스텀",
+    "webhookAdditionalHeadersTitle": "추가 헤더",
+    "webhookAdditionalHeadersDesc": "웹훅과 함께 전송될 추가 헤더를 설정해요.",
+    "HTTP Headers": "HTTP 헤더",
+    "Trust Proxy": "프록시 신뢰"
 }

From b2ddb5c9eb47105d9855106960e44295e04e427c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Thu, 2 Feb 2023 19:50:14 +0300
Subject: [PATCH 532/803] Dummy commit for build

---
 src/lang/en.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index dc5663f1..e1d7abec 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -691,5 +691,5 @@
     "PushDeer Key": "PushDeer Key",
     "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
     "Custom Monitor Type": "Custom Monitor Type",
-    "Body Encoding": "Body Encoding"
+    "Body Encoding": "Body Encoding",
 }

From 603b3a7fb6145c196114f9786637430e65e6b561 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Thu, 2 Feb 2023 19:50:29 +0300
Subject: [PATCH 533/803] Dummy commit for build

---
 src/lang/en.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index e1d7abec..dc5663f1 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -691,5 +691,5 @@
     "PushDeer Key": "PushDeer Key",
     "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
     "Custom Monitor Type": "Custom Monitor Type",
-    "Body Encoding": "Body Encoding",
+    "Body Encoding": "Body Encoding"
 }

From 3819266fa83605fac57eed55bc003bb07f7f5c50 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Thu, 2 Feb 2023 17:55:40 +0000
Subject: [PATCH 534/803] Fixed style of links in markdown

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/assets/app.scss | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/assets/app.scss b/src/assets/app.scss
index 7da76fff..f550406f 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -35,6 +35,11 @@ textarea.form-control {
     color: $maintenance !important;
 }
 
+.incident a,
+.bg-maintenance a {
+    color: inherit;
+}
+
 .list-group {
     border-radius: 0.75rem;
 
@@ -248,6 +253,11 @@ optgroup {
         }
     }
 
+    .incident a,
+    .bg-maintenance a {
+        color: inherit;
+    }
+
     .form-control,
     .form-control:focus,
     .form-select,

From 29e24e0de96c20a598e41a8a500a8be5848664c4 Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Sun, 8 Jan 2023 17:19:07 +0000
Subject: [PATCH 535/803] Feature - Added Optional Google Analytics tag for
 Status Page.

---
 db/patch-add-google-analytics-status-page-tag.sql |  4 ++++
 server/database.js                                |  1 +
 server/model/status_page.js                       |  2 ++
 .../socket-handlers/status-page-socket-handler.js |  1 +
 src/pages/StatusPage.vue                          | 15 +++++++++++++++
 5 files changed, 23 insertions(+)
 create mode 100644 db/patch-add-google-analytics-status-page-tag.sql

diff --git a/db/patch-add-google-analytics-status-page-tag.sql b/db/patch-add-google-analytics-status-page-tag.sql
new file mode 100644
index 00000000..15305ae2
--- /dev/null
+++ b/db/patch-add-google-analytics-status-page-tag.sql
@@ -0,0 +1,4 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+ALTER TABLE status_page ADD google_analytics_tag_id TEXT;
+COMMIT;
diff --git a/server/database.js b/server/database.js
index 06b81153..52c701fb 100644
--- a/server/database.js
+++ b/server/database.js
@@ -69,6 +69,7 @@ class Database {
         "patch-ping-packet-size.sql": true,
         "patch-maintenance-table2.sql": true,
         "patch-add-gamedig-monitor.sql": true,
+        "patch-add-google-analytics-status-page-tag.sql": true
     };
 
     /**
diff --git a/server/model/status_page.js b/server/model/status_page.js
index 0dabf5ab..8dbf1a8c 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -225,6 +225,7 @@ class StatusPage extends BeanModel {
             customCSS: this.custom_css,
             footerText: this.footer_text,
             showPoweredBy: !!this.show_powered_by,
+            googleAnalyticsId: this.google_analytics_tag_id
         };
     }
 
@@ -245,6 +246,7 @@ class StatusPage extends BeanModel {
             customCSS: this.custom_css,
             footerText: this.footer_text,
             showPoweredBy: !!this.show_powered_by,
+            googleAnalyticsId: this.google_analytics_tag_id
         };
     }
 
diff --git a/server/socket-handlers/status-page-socket-handler.js b/server/socket-handlers/status-page-socket-handler.js
index 16d6ee73..717aba9c 100644
--- a/server/socket-handlers/status-page-socket-handler.js
+++ b/server/socket-handlers/status-page-socket-handler.js
@@ -163,6 +163,7 @@ module.exports.statusPageSocketHandler = (socket) => {
             statusPage.custom_css = config.customCSS;
             statusPage.show_powered_by = config.showPoweredBy;
             statusPage.modified_date = R.isoDateTime();
+            statusPage.google_analytics_tag_id = config.googleAnalyticsId;
 
             await R.store(statusPage);
 
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 6cecf668..40a8e7c9 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -64,6 +64,12 @@
                     </ul>
                 </div>
 
+                <!-- Google Analytics -->
+                <div class="my-3">
+                    <label for="googleAnalyticsTag" class="form-label">{{ $t("Google Analytics ID") }}</label>
+                    <input id="googleAnalyticsTag" v-model="config.googleAnalyticsId" type="text" class="form-control">
+                </div>
+
                 <!-- Custom CSS -->
                 <div class="my-3">
                     <div class="mb-1">{{ $t("Custom CSS") }}</div>
@@ -294,6 +300,15 @@
         <component is="style" v-if="config.customCSS" type="text/css">
             {{ config.customCSS }}
         </component>
+
+        <component :is="'script'" v-if="config.googleAnalyticsId" async :src="'https://www.googletagmanager.com/gtag/js?id=' + config.googleAnalyticsId" />
+
+        <component :is="'script'" v-if="config.googleAnalyticsId">
+            window.dataLayer = window.dataLayer || [];
+            function gtag(){dataLayer.push(arguments);}
+            gtag('js', new Date());
+            gtag('config', '{{ config.googleAnalyticsId }}');
+        </component>
     </div>
 </template>
 

From 99c0b8cb710a41f9cb09c26a3caa497daf48e635 Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Tue, 10 Jan 2023 20:25:45 +0000
Subject: [PATCH 536/803] Feature - Google Analytics - Addressing PR Comments.

---
 server/database.js                 |  2 +-
 server/model/status_page.js        | 11 +++++++++--
 server/modules/google-analytics.js | 11 +++++++++++
 src/languages/en.js                |  0
 src/pages/StatusPage.vue           |  9 ---------
 5 files changed, 21 insertions(+), 12 deletions(-)
 create mode 100644 server/modules/google-analytics.js
 create mode 100644 src/languages/en.js

diff --git a/server/database.js b/server/database.js
index 52c701fb..19c09a00 100644
--- a/server/database.js
+++ b/server/database.js
@@ -69,7 +69,7 @@ class Database {
         "patch-ping-packet-size.sql": true,
         "patch-maintenance-table2.sql": true,
         "patch-add-gamedig-monitor.sql": true,
-        "patch-add-google-analytics-status-page-tag.sql": true
+        "patch-add-google-analytics-status-page-tag.sql": true,
     };
 
     /**
diff --git a/server/model/status_page.js b/server/model/status_page.js
index 8dbf1a8c..2d90b639 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -4,6 +4,7 @@ const cheerio = require("cheerio");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const jsesc = require("jsesc");
 const Maintenance = require("./maintenance");
+const googleAnalytics = require("../modules/google-analytics");
 
 class StatusPage extends BeanModel {
 
@@ -53,6 +54,12 @@ class StatusPage extends BeanModel {
 
         const head = $("head");
 
+        await StatusPage.getStatusPageData(statusPage).then( (page) => {
+            if (page.config?.googleAnalyticsId) {
+                head.append($(googleAnalytics.getGoogleAnalyticsScript(page.config.googleAnalyticsId)));
+            }
+        });
+
         // OG Meta Tags
         head.append(`<meta property="og:title" content="${statusPage.title}" />`);
         head.append(`<meta property="og:description" content="${description155}" />`);
@@ -225,7 +232,7 @@ class StatusPage extends BeanModel {
             customCSS: this.custom_css,
             footerText: this.footer_text,
             showPoweredBy: !!this.show_powered_by,
-            googleAnalyticsId: this.google_analytics_tag_id
+            googleAnalyticsId: this.google_analytics_tag_id,
         };
     }
 
@@ -246,7 +253,7 @@ class StatusPage extends BeanModel {
             customCSS: this.custom_css,
             footerText: this.footer_text,
             showPoweredBy: !!this.show_powered_by,
-            googleAnalyticsId: this.google_analytics_tag_id
+            googleAnalyticsId: this.google_analytics_tag_id,
         };
     }
 
diff --git a/server/modules/google-analytics.js b/server/modules/google-analytics.js
new file mode 100644
index 00000000..55820a85
--- /dev/null
+++ b/server/modules/google-analytics.js
@@ -0,0 +1,11 @@
+let GoogleAnalytics = (() => {
+    function getGoogleAnalyticsScript(tagId) {
+        return "<script async src=\"https://www.googletagmanager.com/gtag/js?id=" + tagId + "\"></script>" +
+            "<script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', '" + tagId + "'); </script>";
+    }
+    return {
+        getGoogleAnalyticsScript: getGoogleAnalyticsScript
+    };
+})();
+
+module.exports = GoogleAnalytics;
diff --git a/src/languages/en.js b/src/languages/en.js
new file mode 100644
index 00000000..e69de29b
diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index 40a8e7c9..41aa7993 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -300,15 +300,6 @@
         <component is="style" v-if="config.customCSS" type="text/css">
             {{ config.customCSS }}
         </component>
-
-        <component :is="'script'" v-if="config.googleAnalyticsId" async :src="'https://www.googletagmanager.com/gtag/js?id=' + config.googleAnalyticsId" />
-
-        <component :is="'script'" v-if="config.googleAnalyticsId">
-            window.dataLayer = window.dataLayer || [];
-            function gtag(){dataLayer.push(arguments);}
-            gtag('js', new Date());
-            gtag('config', '{{ config.googleAnalyticsId }}');
-        </component>
     </div>
 </template>
 

From 2b3a3895b399c606e65aca83e5ebc4376ba86b02 Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Wed, 11 Jan 2023 21:44:31 +0000
Subject: [PATCH 537/803] Feature - Google Analytics - Use Regex to validate UA
 as per https://support.google.com/analytics/answer/9310895

---
 server/modules/google-analytics.js                   | 7 ++++++-
 server/socket-handlers/status-page-socket-handler.js | 3 ++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/server/modules/google-analytics.js b/server/modules/google-analytics.js
index 55820a85..0a40076d 100644
--- a/server/modules/google-analytics.js
+++ b/server/modules/google-analytics.js
@@ -3,8 +3,13 @@ let GoogleAnalytics = (() => {
         return "<script async src=\"https://www.googletagmanager.com/gtag/js?id=" + tagId + "\"></script>" +
             "<script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', '" + tagId + "'); </script>";
     }
+    function isValidTag(tagInput) {
+        const re = /^\w{1,2}-\d{8}$/g;
+        return tagInput.match(re) != null;
+    }
     return {
-        getGoogleAnalyticsScript: getGoogleAnalyticsScript
+        getGoogleAnalyticsScript: getGoogleAnalyticsScript,
+        isValidTag: isValidTag
     };
 })();
 
diff --git a/server/socket-handlers/status-page-socket-handler.js b/server/socket-handlers/status-page-socket-handler.js
index 717aba9c..359ed15b 100644
--- a/server/socket-handlers/status-page-socket-handler.js
+++ b/server/socket-handlers/status-page-socket-handler.js
@@ -7,6 +7,7 @@ const Database = require("../database");
 const apicache = require("../modules/apicache");
 const StatusPage = require("../model/status_page");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
+const googleAnalytics = require("../modules/google-analytics");
 
 /**
  * Socket handlers for status page
@@ -163,7 +164,7 @@ module.exports.statusPageSocketHandler = (socket) => {
             statusPage.custom_css = config.customCSS;
             statusPage.show_powered_by = config.showPoweredBy;
             statusPage.modified_date = R.isoDateTime();
-            statusPage.google_analytics_tag_id = config.googleAnalyticsId;
+            statusPage.google_analytics_tag_id = googleAnalytics.isValidTag(config.googleAnalyticsId) ? config.googleAnalyticsId : "";
 
             await R.store(statusPage);
 

From fb2999706c74de3c891ad8cd554fd1d82d895586 Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Thu, 12 Jan 2023 00:02:11 +0000
Subject: [PATCH 538/803] Feature - Google Analytics - Added JSDoc to Google
 Analytics functions.

---
 server/modules/google-analytics.js | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/server/modules/google-analytics.js b/server/modules/google-analytics.js
index 0a40076d..2c10e584 100644
--- a/server/modules/google-analytics.js
+++ b/server/modules/google-analytics.js
@@ -1,8 +1,22 @@
 let GoogleAnalytics = (() => {
+    /**
+     * Returns a string that represents the javascript that is required to insert the Google Analytics scripts
+     * into a webpage.
+     * @param tagId Google UA/G/AW/DC Property ID to use with the Google Analytics script.
+     * @returns {string}
+     */
     function getGoogleAnalyticsScript(tagId) {
         return "<script async src=\"https://www.googletagmanager.com/gtag/js?id=" + tagId + "\"></script>" +
             "<script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', '" + tagId + "'); </script>";
     }
+
+    /**
+     * Returns true if the tag conforms to the format of 1-2 Letters followed by a dash and 8 numbers.
+     * This should take care of the following property tag formats:
+     * UA-########, G-########, AW-########, DC-########
+     * @param {String} tagInput Google UA/G/AW/DC Property ID
+     * @returns {boolean}
+     */
     function isValidTag(tagInput) {
         const re = /^\w{1,2}-\d{8}$/g;
         return tagInput.match(re) != null;

From 3ff0cbe3116185afb316e3b14db33e701c52765b Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Thu, 12 Jan 2023 13:17:26 +0000
Subject: [PATCH 539/803] Feature - Google Analytics - Simplified Module &
 Escaped the Script to prevent XXS.

---
 server/model/status_page.js        |  5 ++-
 server/modules/google-analytics.js | 53 ++++++++++++++----------------
 2 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/server/model/status_page.js b/server/model/status_page.js
index 2d90b639..a65a7da1 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -56,7 +56,10 @@ class StatusPage extends BeanModel {
 
         await StatusPage.getStatusPageData(statusPage).then( (page) => {
             if (page.config?.googleAnalyticsId) {
-                head.append($(googleAnalytics.getGoogleAnalyticsScript(page.config.googleAnalyticsId)));
+                let escapedGoogleAnalyticsScript = jsesc(googleAnalytics.getGoogleAnalyticsScript(page.config.googleAnalyticsId), {
+                    "isScriptContext": true
+                });
+                head.append($(escapedGoogleAnalyticsScript));
             }
         });
 
diff --git a/server/modules/google-analytics.js b/server/modules/google-analytics.js
index 2c10e584..4e0c95b2 100644
--- a/server/modules/google-analytics.js
+++ b/server/modules/google-analytics.js
@@ -1,30 +1,27 @@
-let GoogleAnalytics = (() => {
-    /**
-     * Returns a string that represents the javascript that is required to insert the Google Analytics scripts
-     * into a webpage.
-     * @param tagId Google UA/G/AW/DC Property ID to use with the Google Analytics script.
-     * @returns {string}
-     */
-    function getGoogleAnalyticsScript(tagId) {
-        return "<script async src=\"https://www.googletagmanager.com/gtag/js?id=" + tagId + "\"></script>" +
-            "<script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', '" + tagId + "'); </script>";
-    }
+/**
+ * Returns true if the tag conforms to the format of 1-2 Letters followed by a dash and 8 numbers.
+ * This should take care of the following property tag formats:
+ * UA-########, G-########, AW-########, DC-########
+ * @param {String} tagInput Google UA/G/AW/DC Property ID
+ * @returns {boolean}
+ */
+function isValidTag(tagInput) {
+    const re = /^\w{1,2}-\d{8}$/g;
+    return tagInput.match(re) != null;
+}
 
-    /**
-     * Returns true if the tag conforms to the format of 1-2 Letters followed by a dash and 8 numbers.
-     * This should take care of the following property tag formats:
-     * UA-########, G-########, AW-########, DC-########
-     * @param {String} tagInput Google UA/G/AW/DC Property ID
-     * @returns {boolean}
-     */
-    function isValidTag(tagInput) {
-        const re = /^\w{1,2}-\d{8}$/g;
-        return tagInput.match(re) != null;
-    }
-    return {
-        getGoogleAnalyticsScript: getGoogleAnalyticsScript,
-        isValidTag: isValidTag
-    };
-})();
+/**
+ * Returns a string that represents the javascript that is required to insert the Google Analytics scripts
+ * into a webpage.
+ * @param tagId Google UA/G/AW/DC Property ID to use with the Google Analytics script.
+ * @returns {string}
+ */
+function getGoogleAnalyticsScript(tagId) {
+    return "<script async src=\"https://www.googletagmanager.com/gtag/js?id=" + tagId + "\"></script>" +
+        "<script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', '" + tagId + "'); </script>";
+}
 
-module.exports = GoogleAnalytics;
+module.exports = {
+    getGoogleAnalyticsScript,
+    isValidTag,
+};

From c08d8a5eaffc5b707ddb9a59d1125c44cb425c53 Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Sun, 22 Jan 2023 16:59:09 +0000
Subject: [PATCH 540/803] Google Analytics - Simplified retrieving Tag ID from
 Status Page.

---
 server/model/status_page.js | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/server/model/status_page.js b/server/model/status_page.js
index a65a7da1..5b1c1240 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -54,14 +54,12 @@ class StatusPage extends BeanModel {
 
         const head = $("head");
 
-        await StatusPage.getStatusPageData(statusPage).then( (page) => {
-            if (page.config?.googleAnalyticsId) {
-                let escapedGoogleAnalyticsScript = jsesc(googleAnalytics.getGoogleAnalyticsScript(page.config.googleAnalyticsId), {
-                    "isScriptContext": true
-                });
-                head.append($(escapedGoogleAnalyticsScript));
-            }
-        });
+        if (statusPage.googleAnalyticsTagId) {
+            let escapedGoogleAnalyticsScript = jsesc(googleAnalytics.getGoogleAnalyticsScript(statusPage.googleAnalyticsTagId), {
+                "isScriptContext": true
+            });
+            head.append($(escapedGoogleAnalyticsScript));
+        }
 
         // OG Meta Tags
         head.append(`<meta property="og:title" content="${statusPage.title}" />`);

From 5a94a3fe3c27d4b51469a71bab990d7232b70a3c Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Tue, 24 Jan 2023 14:09:56 +0000
Subject: [PATCH 541/803] Google Analytics - Moved string to updated file.

---
 src/lang/en.json | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 231fe29f..df8288d2 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -690,5 +690,6 @@
     "onebotSafetyTips": "For safety, must set access token",
     "PushDeer Key": "PushDeer Key",
     "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
-    "Custom Monitor Type": "Custom Monitor Type"
+    "Custom Monitor Type": "Custom Monitor Type",
+    "Google Analytics ID": "Google Analytics ID"
 }

From 3afe8013ca330545d194a8ccbbcb86721b4c2b67 Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Tue, 31 Jan 2023 13:17:43 +0000
Subject: [PATCH 542/803] Feature - Google Analytics - Change TEXT type to
 VARCHAR.

---
 db/patch-add-google-analytics-status-page-tag.sql | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/db/patch-add-google-analytics-status-page-tag.sql b/db/patch-add-google-analytics-status-page-tag.sql
index 15305ae2..5de6ff37 100644
--- a/db/patch-add-google-analytics-status-page-tag.sql
+++ b/db/patch-add-google-analytics-status-page-tag.sql
@@ -1,4 +1,4 @@
 -- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
 BEGIN TRANSACTION;
-ALTER TABLE status_page ADD google_analytics_tag_id TEXT;
+ALTER TABLE status_page ADD google_analytics_tag_id VARCHAR;
 COMMIT;

From 913bb611d589f70778ee80f6f0521bdb243e4652 Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Tue, 31 Jan 2023 13:18:02 +0000
Subject: [PATCH 543/803] Feature - Google Analytics - Removed regex to
 validate a Google Analytics tag.

---
 server/modules/google-analytics.js                  | 13 -------------
 .../socket-handlers/status-page-socket-handler.js   |  2 +-
 2 files changed, 1 insertion(+), 14 deletions(-)

diff --git a/server/modules/google-analytics.js b/server/modules/google-analytics.js
index 4e0c95b2..8b909b42 100644
--- a/server/modules/google-analytics.js
+++ b/server/modules/google-analytics.js
@@ -1,15 +1,3 @@
-/**
- * Returns true if the tag conforms to the format of 1-2 Letters followed by a dash and 8 numbers.
- * This should take care of the following property tag formats:
- * UA-########, G-########, AW-########, DC-########
- * @param {String} tagInput Google UA/G/AW/DC Property ID
- * @returns {boolean}
- */
-function isValidTag(tagInput) {
-    const re = /^\w{1,2}-\d{8}$/g;
-    return tagInput.match(re) != null;
-}
-
 /**
  * Returns a string that represents the javascript that is required to insert the Google Analytics scripts
  * into a webpage.
@@ -23,5 +11,4 @@ function getGoogleAnalyticsScript(tagId) {
 
 module.exports = {
     getGoogleAnalyticsScript,
-    isValidTag,
 };
diff --git a/server/socket-handlers/status-page-socket-handler.js b/server/socket-handlers/status-page-socket-handler.js
index 359ed15b..c973d7ed 100644
--- a/server/socket-handlers/status-page-socket-handler.js
+++ b/server/socket-handlers/status-page-socket-handler.js
@@ -164,7 +164,7 @@ module.exports.statusPageSocketHandler = (socket) => {
             statusPage.custom_css = config.customCSS;
             statusPage.show_powered_by = config.showPoweredBy;
             statusPage.modified_date = R.isoDateTime();
-            statusPage.google_analytics_tag_id = googleAnalytics.isValidTag(config.googleAnalyticsId) ? config.googleAnalyticsId : "";
+            statusPage.google_analytics_tag_id = config.googleAnalyticsId;
 
             await R.store(statusPage);
 

From f153082184bc7f220d23ae93acd38f123b028d32 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 31 Jan 2023 14:23:40 +0800
Subject: [PATCH 544/803] Drop en.js

---
 src/languages/en.js | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 src/languages/en.js

diff --git a/src/languages/en.js b/src/languages/en.js
deleted file mode 100644
index e69de29b..00000000

From 2a6d98ff01cd8fd4d43a1380b129df96c3371a17 Mon Sep 17 00:00:00 2001
From: Joseph <40335314+JRedOW@users.noreply.github.com>
Date: Thu, 2 Feb 2023 23:33:48 -0500
Subject: [PATCH 545/803] Feat: Expand and Simplify Badge Functionality (#2211)

* [expanding badges] added new configs

* [expanding badges] recieve ping in getPreviousHeartbeat()

* [expanding badges] re-added original new badges

* [expanding badges] recreate parity between old and new badges

* [expanding badges] fix linting
---
 server/config.js             |   6 +
 server/model/monitor.js      |   2 +-
 server/routers/api-router.js | 246 ++++++++++++++++++++++++++++++++++-
 3 files changed, 248 insertions(+), 6 deletions(-)

diff --git a/server/config.js b/server/config.js
index 0523e707..43a40f67 100644
--- a/server/config.js
+++ b/server/config.js
@@ -4,6 +4,7 @@ const demoMode = args["demo"] || false;
 const badgeConstants = {
     naColor: "#999",
     defaultUpColor: "#66c20a",
+    defaultWarnColor: "#eed202",
     defaultDownColor: "#c2290a",
     defaultPendingColor: "#f8a306",
     defaultMaintenanceColor: "#1747f5",
@@ -13,6 +14,11 @@ const badgeConstants = {
     defaultPingLabelSuffix: "h",
     defaultUptimeValueSuffix: "%",
     defaultUptimeLabelSuffix: "h",
+    defaultCertExpValueSuffix: " days",
+    defaultCertExpLabelSuffix: "h",
+    // Values Come From Default Notification Times
+    defaultCertExpireWarnDays: "14",
+    defaultCertExpireDownDays: "7"
 };
 
 module.exports = {
diff --git a/server/model/monitor.js b/server/model/monitor.js
index c3e91f93..4cbb56e1 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1255,7 +1255,7 @@ class Monitor extends BeanModel {
      */
     static async getPreviousHeartbeat(monitorID) {
         return await R.getRow(`
-            SELECT status, time FROM heartbeat
+            SELECT ping, status, time FROM heartbeat
             WHERE id = (select MAX(id) from heartbeat where monitor_id = ?)
         `, [
             monitorID
diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index e95fd045..665163ae 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -145,7 +145,7 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
             const heartbeat = await Monitor.getPreviousHeartbeat(requestedMonitorId);
             const state = overrideValue !== undefined ? overrideValue : heartbeat.status;
 
-            badgeValues.label = label ?? "";
+            badgeValues.label = label ?? "Status";
             switch (state) {
                 case DOWN:
                     badgeValues.color = downColor;
@@ -212,7 +212,7 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
         const badgeValues = { style };
 
         if (!publicMonitor) {
-            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non exsitant
+            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non existent
             badgeValues.message = "N/A";
             badgeValues.color = badgeConstants.naColor;
         } else {
@@ -228,8 +228,11 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
             badgeValues.color = color ?? percentageToColor(uptime);
             // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
             badgeValues.labelColor = labelColor ?? "";
-            // build a lable string. If a custom label is given, override the default one (requestedDuration)
-            badgeValues.label = filterAndJoin([ labelPrefix, label ?? requestedDuration, labelSuffix ]);
+            // build a label string. If a custom label is given, override the default one (requestedDuration)
+            badgeValues.label = filterAndJoin([
+                labelPrefix,
+                label ?? `Uptime (${requestedDuration}${labelSuffix})`,
+            ]);
             badgeValues.message = filterAndJoin([ prefix, `${cleanUptime * 100}`, suffix ]);
         }
 
@@ -290,7 +293,7 @@ router.get("/api/badge/:id/ping/:duration?", cache("5 minutes"), async (request,
             // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
             badgeValues.labelColor = labelColor ?? "";
             // build a lable string. If a custom label is given, override the default one (requestedDuration)
-            badgeValues.label = filterAndJoin([ labelPrefix, label ?? requestedDuration, labelSuffix ]);
+            badgeValues.label = filterAndJoin([ labelPrefix, label ?? `Avg. Ping (${requestedDuration}${labelSuffix})` ]);
             badgeValues.message = filterAndJoin([ prefix, avgPing, suffix ]);
         }
 
@@ -304,4 +307,237 @@ router.get("/api/badge/:id/ping/:duration?", cache("5 minutes"), async (request,
     }
 });
 
+router.get("/api/badge/:id/avg-response/:duration?", cache("5 minutes"), async (request, response) => {
+    allowAllOrigin(response);
+
+    const {
+        label,
+        labelPrefix,
+        labelSuffix,
+        prefix,
+        suffix = badgeConstants.defaultPingValueSuffix,
+        color = badgeConstants.defaultPingColor,
+        labelColor,
+        style = badgeConstants.defaultStyle,
+        value, // for demo purpose only
+    } = request.query;
+
+    try {
+        const requestedMonitorId = parseInt(request.params.id, 10);
+
+        // Default duration is 24 (h) if not defined in queryParam, limited to 720h (30d)
+        const requestedDuration = Math.min(
+            request.params.duration
+                ? parseInt(request.params.duration, 10)
+                : 24,
+            720
+        );
+        const overrideValue = value && parseFloat(value);
+
+        const publicAvgPing = parseInt(await R.getCell(`
+            SELECT AVG(ping) FROM monitor_group, \`group\`, heartbeat
+            WHERE monitor_group.group_id = \`group\`.id
+            AND heartbeat.time > DATETIME('now', ? || ' hours')
+            AND heartbeat.ping IS NOT NULL
+            AND public = 1
+            AND heartbeat.monitor_id = ?
+            `,
+        [ -requestedDuration, requestedMonitorId ]
+        ));
+
+        const badgeValues = { style };
+
+        if (!publicAvgPing) {
+            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non existent
+
+            badgeValues.message = "N/A";
+            badgeValues.color = badgeConstants.naColor;
+        } else {
+            const avgPing = parseInt(overrideValue ?? publicAvgPing);
+
+            badgeValues.color = color;
+            // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
+            badgeValues.labelColor = labelColor ?? "";
+            // build a label string. If a custom label is given, override the default one (requestedDuration)
+            badgeValues.label = filterAndJoin([
+                labelPrefix,
+                label ?? `Avg. Response (${requestedDuration}h)`,
+                labelSuffix,
+            ]);
+            badgeValues.message = filterAndJoin([ prefix, avgPing, suffix ]);
+        }
+
+        // build the SVG based on given values
+        const svg = makeBadge(badgeValues);
+
+        response.type("image/svg+xml");
+        response.send(svg);
+    } catch (error) {
+        send403(response, error.message);
+    }
+});
+
+router.get("/api/badge/:id/cert-exp", cache("5 minutes"), async (request, response) => {
+    allowAllOrigin(response);
+
+    const date = request.query.date;
+
+    const {
+        label,
+        labelPrefix,
+        labelSuffix,
+        prefix,
+        suffix = date ? "" : badgeConstants.defaultCertExpValueSuffix,
+        upColor = badgeConstants.defaultUpColor,
+        warnColor = badgeConstants.defaultWarnColor,
+        downColor = badgeConstants.defaultDownColor,
+        warnDays = badgeConstants.defaultCertExpireWarnDays,
+        downDays = badgeConstants.defaultCertExpireDownDays,
+        labelColor,
+        style = badgeConstants.defaultStyle,
+        value, // for demo purpose only
+    } = request.query;
+
+    try {
+        const requestedMonitorId = parseInt(request.params.id, 10);
+
+        const overrideValue = value && parseFloat(value);
+
+        let publicMonitor = await R.getRow(`
+            SELECT monitor_group.monitor_id FROM monitor_group, \`group\`
+            WHERE monitor_group.group_id = \`group\`.id
+            AND monitor_group.monitor_id = ?
+            AND public = 1
+            `,
+        [ requestedMonitorId ]
+        );
+
+        const badgeValues = { style };
+
+        if (!publicMonitor) {
+            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non existent
+
+            badgeValues.message = "N/A";
+            badgeValues.color = badgeConstants.naColor;
+        } else {
+            const tlsInfoBean = await R.findOne("monitor_tls_info", "monitor_id = ?", [
+                requestedMonitorId,
+            ]);
+
+            if (!tlsInfoBean) {
+                // return a "No/Bad Cert" badge in naColor (grey), if no cert saved (does not save bad certs?)
+                badgeValues.message = "No/Bad Cert";
+                badgeValues.color = badgeConstants.naColor;
+            } else {
+                const tlsInfo = JSON.parse(tlsInfoBean.info_json);
+
+                if (!tlsInfo.valid) {
+                    // return a "Bad Cert" badge in naColor (grey), when cert is not valid
+                    badgeValues.message = "Bad Cert";
+                    badgeValues.color = badgeConstants.downColor;
+                } else {
+                    const daysRemaining = parseInt(overrideValue ?? tlsInfo.certInfo.daysRemaining);
+
+                    if (daysRemaining > warnDays) {
+                        badgeValues.color = upColor;
+                    } else if (daysRemaining > downDays) {
+                        badgeValues.color = warnColor;
+                    } else {
+                        badgeValues.color = downColor;
+                    }
+                    // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
+                    badgeValues.labelColor = labelColor ?? "";
+                    // build a label string. If a custom label is given, override the default one
+                    badgeValues.label = filterAndJoin([
+                        labelPrefix,
+                        label ?? "Cert Exp.",
+                        labelSuffix,
+                    ]);
+                    badgeValues.message = filterAndJoin([ prefix, date ? tlsInfo.certInfo.validTo : daysRemaining, suffix ]);
+                }
+            }
+        }
+
+        // build the SVG based on given values
+        const svg = makeBadge(badgeValues);
+
+        response.type("image/svg+xml");
+        response.send(svg);
+    } catch (error) {
+        send403(response, error.message);
+    }
+});
+
+router.get("/api/badge/:id/response", cache("5 minutes"), async (request, response) => {
+    allowAllOrigin(response);
+
+    const {
+        label,
+        labelPrefix,
+        labelSuffix,
+        prefix,
+        suffix = badgeConstants.defaultPingValueSuffix,
+        color = badgeConstants.defaultPingColor,
+        labelColor,
+        style = badgeConstants.defaultStyle,
+        value, // for demo purpose only
+    } = request.query;
+
+    try {
+        const requestedMonitorId = parseInt(request.params.id, 10);
+
+        const overrideValue = value && parseFloat(value);
+
+        let publicMonitor = await R.getRow(`
+            SELECT monitor_group.monitor_id FROM monitor_group, \`group\`
+            WHERE monitor_group.group_id = \`group\`.id
+            AND monitor_group.monitor_id = ?
+            AND public = 1
+            `,
+        [ requestedMonitorId ]
+        );
+
+        const badgeValues = { style };
+
+        if (!publicMonitor) {
+            // return a "N/A" badge in naColor (grey), if monitor is not public / not available / non existent
+
+            badgeValues.message = "N/A";
+            badgeValues.color = badgeConstants.naColor;
+        } else {
+            const heartbeat = await Monitor.getPreviousHeartbeat(
+                requestedMonitorId
+            );
+
+            if (!heartbeat.ping) {
+                // return a "N/A" badge in naColor (grey), if previous heartbeat has no ping
+
+                badgeValues.message = "N/A";
+                badgeValues.color = badgeConstants.naColor;
+            } else {
+                const ping = parseInt(overrideValue ?? heartbeat.ping);
+
+                badgeValues.color = color;
+                // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
+                badgeValues.labelColor = labelColor ?? "";
+                // build a label string. If a custom label is given, override the default one
+                badgeValues.label = filterAndJoin([
+                    labelPrefix,
+                    label ?? "Response",
+                    labelSuffix,
+                ]);
+                badgeValues.message = filterAndJoin([ prefix, ping, suffix ]);
+            }
+        }
+
+        // build the SVG based on given values
+        const svg = makeBadge(badgeValues);
+
+        response.type("image/svg+xml");
+        response.send(svg);
+    } catch (error) {
+        send403(response, error.message);
+    }
+});
+
 module.exports = router;

From d39508a0073304f4dea294acec98973a3f982912 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 3 Feb 2023 13:19:51 +0800
Subject: [PATCH 546/803] Change nightly version format

---
 extra/mark-as-nightly.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/extra/mark-as-nightly.js b/extra/mark-as-nightly.js
index ebc67da3..ada2aca8 100644
--- a/extra/mark-as-nightly.js
+++ b/extra/mark-as-nightly.js
@@ -1,11 +1,12 @@
 const pkg = require("../package.json");
 const fs = require("fs");
 const util = require("../src/util");
+const dayjs = require("dayjs");
 
 util.polyfill();
 
 const oldVersion = pkg.version;
-const newVersion = oldVersion + "-nightly-" + util.genSecret(8);
+const newVersion = oldVersion + "-nightly-" + dayjs().format("YYYYMMDDHHmmss");
 
 console.log("Old Version: " + oldVersion);
 console.log("New Version: " + newVersion);

From e631db89b84e70402cfec90ecd987d1b953ab0cd Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 3 Feb 2023 13:21:19 +0800
Subject: [PATCH 547/803] Update to 1.20.0-beta.0

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

diff --git a/package.json b/package.json
index 38d55f4f..d5d1c5fd 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.6",
+    "version": "1.20.0-beta.0",
     "license": "MIT",
     "repository": {
         "type": "git",

From ff09276de203b36d6c043677f07cd043c3a60a9f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 3 Feb 2023 13:38:14 +0800
Subject: [PATCH 548/803] Update README.md

---
 README.md | 1 -
 1 file changed, 1 deletion(-)

diff --git a/README.md b/README.md
index f29622a6..b96edd36 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,6 @@ Uptime Kuma is an easy-to-use self-hosted monitoring tool.
 Try it!
 
 - Tokyo Demo Server: https://demo.uptime.kuma.pet (Sponsored by [Uptime Kuma Sponsors](https://github.com/louislam/uptime-kuma#%EF%B8%8F-sponsors))
-- Europe Demo Server: https://demo.uptime-kuma.karimi.dev:27000 (Provided by [@mhkarimi1383](https://github.com/mhkarimi1383))
 
 It is a temporary live demo, all data will be deleted after 10 minutes. Use the one that is closer to you, but I suggest that you should install and try it out for the best demo experience.
 

From ec78d2a39b686ab446cfd8399ebf9f1ba3cd885c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 3 Feb 2023 13:39:45 +0800
Subject: [PATCH 549/803] Update README.md

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

diff --git a/README.md b/README.md
index b96edd36..cdefe6a0 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # Uptime Kuma
 
 <a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/stars/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/pulls/louislam/uptime-kuma" /></a> <a target="_blank" href="https://hub.docker.com/r/louislam/uptime-kuma"><img src="https://img.shields.io/docker/v/louislam/uptime-kuma/latest?label=docker%20image%20ver." /></a> <a target="_blank" href="https://github.com/louislam/uptime-kuma"><img src="https://img.shields.io/github/last-commit/louislam/uptime-kuma" /></a>  <a target="_blank" href="https://opencollective.com/uptime-kuma"><img src="https://opencollective.com/uptime-kuma/total/badge.svg?label=Open%20Collective%20Backers&color=brightgreen" /></a>
-[![GitHub Sponsors](https://img.shields.io/github/sponsors/louislam?label=GitHub%20Sponsors)](https://github.com/sponsors/louislam) <a href="https://weblate.kuma.pet/engage/uptime-kuma/">
+[![GitHub Sponsors](https://img.shields.io/github/sponsors/louislam?label=GitHub%20Sponsors)](https://github.com/sponsors/louislam) <a href="https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/">
 <img src="https://weblate.kuma.pet/widgets/uptime-kuma/-/svg-badge.svg" alt="Translation status" />
 </a>
 

From e0f017864482088ff8b99a0f74fd5146f03014d3 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <adam.stachowicz@fingo.info>
Date: Fri, 3 Feb 2023 07:10:10 +0100
Subject: [PATCH 550/803] Do not run auto-test for markdown-only commits.
 Update versions

---
 .github/workflows/auto-test.yml             | 5 +++++
 .github/workflows/close-incorrect-issue.yml | 7 +++----
 .github/workflows/stale-bot.yml             | 4 ++--
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/auto-test.yml b/.github/workflows/auto-test.yml
index 273b1dba..94462712 100644
--- a/.github/workflows/auto-test.yml
+++ b/.github/workflows/auto-test.yml
@@ -6,8 +6,12 @@ name: Auto Test
 on:
   push:
     branches: [ master ]
+    paths-ignore:
+      - '*.md'
   pull_request:
     branches: [ master ]
+    paths-ignore:
+      - '*.md'
 
 jobs:
   auto-test:
@@ -36,6 +40,7 @@ jobs:
       env:
         HEADLESS_TEST: 1
         JUST_FOR_TEST: ${{ secrets.JUST_FOR_TEST }}
+
   check-linters:
     runs-on: ubuntu-latest
 
diff --git a/.github/workflows/close-incorrect-issue.yml b/.github/workflows/close-incorrect-issue.yml
index 026022df..762bc968 100644
--- a/.github/workflows/close-incorrect-issue.yml
+++ b/.github/workflows/close-incorrect-issue.yml
@@ -1,4 +1,3 @@
-
 name: Close Incorrect Issue
 
 on:
@@ -12,13 +11,13 @@ jobs:
     strategy:
       matrix:
         os: [ubuntu-latest]
-        node-version: [16.x]
+        node-version: [16]
 
     steps:
-    - uses: actions/checkout@v2
+    - uses: actions/checkout@v3
 
     - name: Use Node.js ${{ matrix.node-version }}
-      uses: actions/setup-node@v2
+      uses: actions/setup-node@v3
       with:
         node-version: ${{ matrix.node-version }}
         cache: 'npm'
diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml
index 5b4568e1..b39f68fc 100644
--- a/.github/workflows/stale-bot.yml
+++ b/.github/workflows/stale-bot.yml
@@ -3,13 +3,13 @@ on:
   workflow_dispatch:
   schedule:
     - cron: '0 */6 * * *'
-#Run every 6 hours 
+#Run every 6 hours
 
 jobs:
   stale:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/stale@v5
+      - uses: actions/stale@v7
         with:
           stale-issue-message: 'We are clearing up our old issues and your ticket has been open for 3 months with no activity. Remove stale label or comment or this will be closed in 2 days.'
           close-issue-message: 'This issue was closed because it has been stalled for 2 days with no activity.'

From a823ed8ccc4d85230a3dd90e6f78fc4b9259c8fe Mon Sep 17 00:00:00 2001
From: c <c@echo.local>
Date: Fri, 3 Feb 2023 11:49:25 +0000
Subject: [PATCH 551/803] Feature - Google Analytics - Removed unused import.

---
 server/socket-handlers/status-page-socket-handler.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/server/socket-handlers/status-page-socket-handler.js b/server/socket-handlers/status-page-socket-handler.js
index c973d7ed..717aba9c 100644
--- a/server/socket-handlers/status-page-socket-handler.js
+++ b/server/socket-handlers/status-page-socket-handler.js
@@ -7,7 +7,6 @@ const Database = require("../database");
 const apicache = require("../modules/apicache");
 const StatusPage = require("../model/status_page");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
-const googleAnalytics = require("../modules/google-analytics");
 
 /**
  * Socket handlers for status page

From 5f2affb38ccace2c41d637b2ce587b770270204a Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 4 Feb 2023 16:58:39 +0800
Subject: [PATCH 552/803] Relocate and fix jsesc issue

---
 server/google-analytics.js         | 19 +++++++++++++++++++
 server/model/status_page.js        |  6 ++----
 server/modules/google-analytics.js | 14 --------------
 3 files changed, 21 insertions(+), 18 deletions(-)
 create mode 100644 server/google-analytics.js
 delete mode 100644 server/modules/google-analytics.js

diff --git a/server/google-analytics.js b/server/google-analytics.js
new file mode 100644
index 00000000..b98ca862
--- /dev/null
+++ b/server/google-analytics.js
@@ -0,0 +1,19 @@
+const jsesc = require("jsesc");
+
+/**
+ * Returns a string that represents the javascript that is required to insert the Google Analytics scripts
+ * into a webpage.
+ * @param tagId Google UA/G/AW/DC Property ID to use with the Google Analytics script.
+ * @returns {string}
+ */
+function getGoogleAnalyticsScript(tagId) {
+    let escapedTagId = jsesc(tagId, { isScriptContext: true });
+    return `
+        <script async src="https://www.googletagmanager.com/gtag/js?id=${escapedTagId}"></script>
+        <script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', '${escapedTagId}'); </script>
+    `;
+}
+
+module.exports = {
+    getGoogleAnalyticsScript,
+};
diff --git a/server/model/status_page.js b/server/model/status_page.js
index 5b1c1240..d7185a2e 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -4,7 +4,7 @@ const cheerio = require("cheerio");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const jsesc = require("jsesc");
 const Maintenance = require("./maintenance");
-const googleAnalytics = require("../modules/google-analytics");
+const googleAnalytics = require("../google-analytics");
 
 class StatusPage extends BeanModel {
 
@@ -55,9 +55,7 @@ class StatusPage extends BeanModel {
         const head = $("head");
 
         if (statusPage.googleAnalyticsTagId) {
-            let escapedGoogleAnalyticsScript = jsesc(googleAnalytics.getGoogleAnalyticsScript(statusPage.googleAnalyticsTagId), {
-                "isScriptContext": true
-            });
+            let escapedGoogleAnalyticsScript = googleAnalytics.getGoogleAnalyticsScript(statusPage.googleAnalyticsTagId);
             head.append($(escapedGoogleAnalyticsScript));
         }
 
diff --git a/server/modules/google-analytics.js b/server/modules/google-analytics.js
deleted file mode 100644
index 8b909b42..00000000
--- a/server/modules/google-analytics.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Returns a string that represents the javascript that is required to insert the Google Analytics scripts
- * into a webpage.
- * @param tagId Google UA/G/AW/DC Property ID to use with the Google Analytics script.
- * @returns {string}
- */
-function getGoogleAnalyticsScript(tagId) {
-    return "<script async src=\"https://www.googletagmanager.com/gtag/js?id=" + tagId + "\"></script>" +
-        "<script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', '" + tagId + "'); </script>";
-}
-
-module.exports = {
-    getGoogleAnalyticsScript,
-};

From afadfe32d5b2a43940bf5b22e5985b206d4a808b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 4 Feb 2023 17:03:00 +0800
Subject: [PATCH 553/803] Trim

---
 server/google-analytics.js | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/server/google-analytics.js b/server/google-analytics.js
index b98ca862..fc9fbec8 100644
--- a/server/google-analytics.js
+++ b/server/google-analytics.js
@@ -8,6 +8,11 @@ const jsesc = require("jsesc");
  */
 function getGoogleAnalyticsScript(tagId) {
     let escapedTagId = jsesc(tagId, { isScriptContext: true });
+
+    if (escapedTagId) {
+        escapedTagId = escapedTagId.trim();
+    }
+
     return `
         <script async src="https://www.googletagmanager.com/gtag/js?id=${escapedTagId}"></script>
         <script>window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', '${escapedTagId}'); </script>

From 1bfb29071874651d1364edd5cd9d4138fe31d46e Mon Sep 17 00:00:00 2001
From: Haytham Salama <haythamasalama@gmail.com>
Date: Sat, 4 Feb 2023 22:53:38 +0200
Subject: [PATCH 554/803] feat: add message thread id for telegram nonfiction

---
 server/notification-providers/telegram.js | 1 +
 src/components/notifications/Telegram.vue | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/server/notification-providers/telegram.js b/server/notification-providers/telegram.js
index 2b057622..fb53b971 100644
--- a/server/notification-providers/telegram.js
+++ b/server/notification-providers/telegram.js
@@ -13,6 +13,7 @@ class Telegram extends NotificationProvider {
                 params: {
                     chat_id: notification.telegramChatID,
                     text: msg,
+                    message_thread_id: notification.telegramMessageThreadID,
                 },
             });
             return okMsg;
diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 723bd1be..3f446dc8 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -17,6 +17,11 @@
             </button>
         </div>
 
+
+        <label for="message_thread_id" class="form-label">{{ $t("Message Thread ID") }}</label>
+        <input id="message_thread_id" v-model="$parent.notification.telegramMessageThreadID" type="text" class="form-control">
+        <p class="form-text">Message Thread ID: Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only</p>
+
         <div class="form-text">
             {{ $t("supportTelegramChatID") }}
 

From 4323dee7815559ff22ff191ef56639c686015926 Mon Sep 17 00:00:00 2001
From: Haytham Salama <haythamasalama@gmail.com>
Date: Sat, 4 Feb 2023 22:54:19 +0200
Subject: [PATCH 555/803] feat: add message thread id to lang

---
 src/lang/ar-SY.json | 1 +
 src/lang/bg-BG.json | 1 +
 src/lang/cs-CZ.json | 1 +
 src/lang/da-DK.json | 1 +
 src/lang/de-CH.json | 1 +
 src/lang/de-DE.json | 1 +
 src/lang/el-GR.json | 1 +
 src/lang/en.json    | 1 +
 src/lang/nl-NL.json | 1 +
 src/lang/pl.json    | 1 +
 src/lang/ru-RU.json | 1 +
 src/lang/sl-SI.json | 1 +
 src/lang/th-TH.json | 1 +
 src/lang/tr-TR.json | 1 +
 src/lang/uk-UA.json | 1 +
 src/lang/vi-VN.json | 1 +
 src/lang/zh-CN.json | 1 +
 src/lang/zh-HK.json | 1 +
 src/lang/zh-TW.json | 1 +
 19 files changed, 19 insertions(+)

diff --git a/src/lang/ar-SY.json b/src/lang/ar-SY.json
index d852a690..98dacd5f 100644
--- a/src/lang/ar-SY.json
+++ b/src/lang/ar-SY.json
@@ -215,6 +215,7 @@
     "Bot Token": "رمز الروبوت",
     "wayToGetTelegramToken": "يمكنك الحصول على رمز من {0}.",
     "Chat ID": "معرف الدردشة",
+    "Message Thread ID": "معرف المواضيع",
     "supportTelegramChatID": "دعم الدردشة المباشرة / معرف الدردشة للقناة",
     "wayToGetTelegramChatID": "يمكنك الحصول على معرف الدردشة الخاص بك عن طريق إرسال رسالة إلى الروبوت والانتقال إلى عنوان URL هذا لعرض Chat_id",
     "YOUR BOT TOKEN HERE": "رمز الروبوت الخاص بك هنا",
diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 3a5f532d..db81e21f 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -210,6 +210,7 @@
     "Bot Token": "Бот токен",
     "wayToGetTelegramToken": "Можете да получите токен от {0}.",
     "Chat ID": "Чат ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Поддържа Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "Можете да получите вашето чат ID, като изпратите съобщение на бота, след което е нужно да посетите този URL адрес за да го видите:",
     "YOUR BOT TOKEN HERE": "ВАШИЯТ БОТ ТОКЕН ТУК",
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index c6b28312..6a0738da 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -215,6 +215,7 @@
     "Bot Token": "Token robota",
     "wayToGetTelegramToken": "Token můžete získat od {0}.",
     "Chat ID": "ID chatu",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Podpora přímého chatu / skupiny / ID chatu kanálu",
     "wayToGetTelegramChatID": "ID chatu můžete získat tak, že robotovi zašlete zprávu a přejdete na tuto adresu URL, kde zobrazíte chat_id:",
     "YOUR BOT TOKEN HERE": "SEM ZADEJTE TOKEN VAŠEHO CHATBOTA",
diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
index 679431c3..4cfc222c 100644
--- a/src/lang/da-DK.json
+++ b/src/lang/da-DK.json
@@ -208,6 +208,7 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Du kan få et token fra {0}.",
     "Chat ID": "Chat ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "Du kan få dit chat-ID ved at sende en besked til bot'en og gå til denne URL for at se chat_id'et:",
     "YOUR BOT TOKEN HERE": "DIT BOT TOKEN HER",
diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
index 85da35e0..42cb3c9e 100644
--- a/src/lang/de-CH.json
+++ b/src/lang/de-CH.json
@@ -214,6 +214,7 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Hier kannst du einen Token erhalten {0}.",
     "Chat ID": "Chat ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
     "wayToGetTelegramChatID": "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
     "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 45b5ae56..d4a023ec 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -214,6 +214,7 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Hier kannst du einen Token erhalten {0}.",
     "Chat ID": "Chat ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
     "wayToGetTelegramChatID": "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
     "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json
index c77d6158..7031290b 100644
--- a/src/lang/el-GR.json
+++ b/src/lang/el-GR.json
@@ -198,6 +198,7 @@
     "Bot Token": "Διακριτικό Bot",
     "wayToGetTelegramToken": "Μπορείτε να πάρετε ένα διακριτικό από {0}.",
     "Chat ID": "Chat ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "Μπορείτε να λάβετε το αναγνωριστικό συνομιλίας σας στέλνοντας ένα μήνυμα στο bot και μεταβαίνοντας σε αυτήν τη διεύθυνση URL για να προβάλετε το chat_id:",
     "YOUR BOT TOKEN HERE": "ΤΟ BOT ΣΑΣ ΔΙΑΚΡΙΤΙΚΌ ΕΔΩ",
diff --git a/src/lang/en.json b/src/lang/en.json
index 8a195a2a..6e26612d 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -364,6 +364,7 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "You can get a token from {0}.",
     "Chat ID": "Chat ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
     "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json
index 32c79545..e4c1da00 100644
--- a/src/lang/nl-NL.json
+++ b/src/lang/nl-NL.json
@@ -217,6 +217,7 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Je kunt een token krijgen van {0}.",
     "Chat ID": "Chat ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Ondersteuning Directe Chat / Groep / Kanaal Chat ID",
     "wayToGetTelegramChatID": "Je kunt je CHAT ID krijgen door een bericht te sturen naar de bot en naar deze URL te gaan om het chat_id te bekijken:",
     "YOUR BOT TOKEN HERE": "DE BOT TOKEN HIER",
diff --git a/src/lang/pl.json b/src/lang/pl.json
index ebc58797..50bb7fbf 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -189,6 +189,7 @@
     "Bot Token": "Token bota",
     "wayToGetTelegramToken": "Token można uzyskać z {0}.",
     "Chat ID": "Identyfikator czatu",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Czat wsparcia technicznego / Bezpośrednia rozmowa / Czat grupowy",
     "wayToGetTelegramChatID": "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:",
     "YOUR BOT TOKEN HERE": "TWÓJ TOKEN BOTA",
diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 8395eedb..c38b6808 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -216,6 +216,7 @@
     "Bot Token": "Токен бота",
     "wayToGetTelegramToken": "Вы можете взять токен здесь - {0}.",
     "Chat ID": "ID чата",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Поддерживаются ID чатов, групп и каналов",
     "wayToGetTelegramChatID": "Вы можете взять ID вашего чата, отправив сообщение боту и перейдя по этому URL для просмотра chat_id:",
     "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ЗДЕСЬ",
diff --git a/src/lang/sl-SI.json b/src/lang/sl-SI.json
index f4ca81bd..bf32cbed 100644
--- a/src/lang/sl-SI.json
+++ b/src/lang/sl-SI.json
@@ -193,6 +193,7 @@
     "Bot Token": "Robotkov žetonček",
     "wayToGetTelegramToken": "Lahko dobiš žeton od {0}.",
     "Chat ID": "ID pogovora",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Direkten pogovor pomoči / Skupina / ID kanala",
     "wayToGetTelegramChatID": "Id lahko dobiš, če pošlješ sporočilo robotku in odpreš ta URL, da bi videl chat_id:",
     "YOUR BOT TOKEN HERE": "ROBOTKOV ŽETON TUKAJ",
diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
index 7ad132f5..76c2afb3 100644
--- a/src/lang/th-TH.json
+++ b/src/lang/th-TH.json
@@ -194,6 +194,7 @@
     "Bot Token": "กุญแจของบอท",
     "wayToGetTelegramToken": "คุณสามารถรับกุญแจได้จาก {0}.",
     "Chat ID": "ไอดีแชท",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท",
     "wayToGetTelegramChatID": "คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :",
     "YOUR BOT TOKEN HERE": "กุญแจของบอทของคุณที่นี่",
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index b9bc8adc..a9070df3 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -197,6 +197,7 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "{0} adresinden bir token alabilirsiniz.",
     "Chat ID": "Chat ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Doğrudan Sohbet / Grup / Kanalın Sohbet Kimliğini Destekleyin",
     "wayToGetTelegramChatID": "Bot'a bir mesaj göndererek ve chat_id'yi görüntülemek için bu URL'ye giderek sohbet kimliğinizi alabilirsiniz:",
     "YOUR BOT TOKEN HERE": "BOT TOKENİNİZ BURADA",
diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
index fcd678a3..9ad37b66 100644
--- a/src/lang/uk-UA.json
+++ b/src/lang/uk-UA.json
@@ -216,6 +216,7 @@
     "Bot Token": "Токен бота",
     "wayToGetTelegramToken": "Ви можете взяти токен тут - {0}.",
     "Chat ID": "ID чату",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Підтримуються ID чатів, груп та каналів",
     "wayToGetTelegramChatID": "Ви можете взяти ID вашого чату, відправивши повідомлення боту і перейшовши по цьому URL для перегляду chat_id:",
     "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ТУТ",
diff --git a/src/lang/vi-VN.json b/src/lang/vi-VN.json
index 165bf1bb..4446a020 100644
--- a/src/lang/vi-VN.json
+++ b/src/lang/vi-VN.json
@@ -193,6 +193,7 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Bạn có thể lấy mã token từ",
     "Chat ID": "Chat ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Hỗ trợ chat trực tiếp / Nhóm / Kênh Chat ID",
     "wayToGetTelegramChatID": "Bạn có thể lấy chat id của mình bằng cách gửi tin nhắn tới bot và truy cập url này để xem chat_id:",
     "YOUR BOT TOKEN HERE": "MÃ BOT TOKEN CỦA BẠN",
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index a3393bd1..f52fab92 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -213,6 +213,7 @@
     "Bot Token": "机器人令牌",
     "wayToGetTelegramToken": "您可以从 {0} 获取 Token。",
     "Chat ID": "Chat ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "支持对话/群组/频道的 Chat ID",
     "wayToGetTelegramChatID": "您可以发送一条消息给您的机器人,然后访问此链接来查看 chat_id:",
     "YOUR BOT TOKEN HERE": "这里替换成您的 BOT TOKEN",
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 14f25b5e..3310c995 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -211,6 +211,7 @@
     "Bot Token": "機器人權杖",
     "wayToGetTelegramToken": "您可以從 {0} 取得 Token。",
     "Chat ID": "聊天 ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "支援 對話/群組/頻道的聊天 ID",
     "wayToGetTelegramChatID": "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
     "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
index 5eb0a699..992a2a0d 100644
--- a/src/lang/zh-TW.json
+++ b/src/lang/zh-TW.json
@@ -212,6 +212,7 @@
     "Bot Token": "機器人權杖",
     "wayToGetTelegramToken": "您可以從 {0} 取得權杖。",
     "Chat ID": "聊天 ID",
+    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "支援 對話/群組/頻道的聊天 ID",
     "wayToGetTelegramChatID": "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
     "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",

From c42e5503827b283ca2e76aee43f8029b1d371549 Mon Sep 17 00:00:00 2001
From: Haytham Salama <haythamasalama@gmail.com>
Date: Sat, 4 Feb 2023 23:46:19 +0200
Subject: [PATCH 556/803] style: formats

---
 src/components/notifications/Telegram.vue | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 3f446dc8..a1b74a8a 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -17,7 +17,6 @@
             </button>
         </div>
 
-
         <label for="message_thread_id" class="form-label">{{ $t("Message Thread ID") }}</label>
         <input id="message_thread_id" v-model="$parent.notification.telegramMessageThreadID" type="text" class="form-control">
         <p class="form-text">Message Thread ID: Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only</p>

From 5fff63cd5979efc7445518627f37193df60104ac Mon Sep 17 00:00:00 2001
From: cyril59310 <archas.cyril@hotmail.fr>
Date: Sun, 5 Feb 2023 01:07:20 +0100
Subject: [PATCH 557/803] add keys for translation

---
 src/lang/en.json                | 5 ++++-
 src/pages/ManageMaintenance.vue | 2 +-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 8a195a2a..d907f4e0 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -692,5 +692,8 @@
     "PushDeer Key": "PushDeer Key",
     "wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
     "Custom Monitor Type": "Custom Monitor Type",
-    "Google Analytics ID": "Google Analytics ID"
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Edit Tag",
+    "Server Address": "Server Address",
+    "Learn More": "Learn More"
 }
diff --git a/src/pages/ManageMaintenance.vue b/src/pages/ManageMaintenance.vue
index aaffbbf9..478927e8 100644
--- a/src/pages/ManageMaintenance.vue
+++ b/src/pages/ManageMaintenance.vue
@@ -62,7 +62,7 @@
             </div>
 
             <div class="text-center mt-3" style="font-size: 13px;">
-                <a href="https://github.com/louislam/uptime-kuma/wiki/Maintenance" target="_blank">Learn More</a>
+                <a href="https://github.com/louislam/uptime-kuma/wiki/Maintenance" target="_blank">{{ $t("Learn More") }}</a>
             </div>
 
             <Confirm ref="confirmPause" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="pauseMaintenance">

From 271cca0d234914fc37a92088433b385ab05ac78e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 6 Feb 2023 15:21:31 +0800
Subject: [PATCH 558/803] Add Romanian in the dropdown

---
 src/i18n.js      | 1 +
 src/lang/ro.json | 3 +++
 2 files changed, 4 insertions(+)
 create mode 100644 src/lang/ro.json

diff --git a/src/i18n.js b/src/i18n.js
index b6a7beee..f57408e4 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -38,6 +38,7 @@ const languageList = {
     "th-TH": "ไทย",
     "el-GR": "Ελληνικά",
     "yue": "繁體中文 (廣東話 / 粵語)",
+    "ro": "Limba română",
 };
 
 let messages = {
diff --git a/src/lang/ro.json b/src/lang/ro.json
new file mode 100644
index 00000000..a659e0be
--- /dev/null
+++ b/src/lang/ro.json
@@ -0,0 +1,3 @@
+{
+    "languageName": "Limba română"
+}

From 0197778af12ba240aa0e1a29b660193410d45356 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 6 Feb 2023 22:35:56 +0800
Subject: [PATCH 559/803] Fix change language issue in the setup page

---
 src/pages/Setup.vue | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/pages/Setup.vue b/src/pages/Setup.vue
index cba7f8fc..cd2d149c 100644
--- a/src/pages/Setup.vue
+++ b/src/pages/Setup.vue
@@ -14,7 +14,7 @@
                 </p>
 
                 <div class="form-floating">
-                    <select id="language" v-model="$i18n.locale" class="form-select">
+                    <select id="language" v-model="$root.language" class="form-select">
                         <option v-for="(lang, i) in $i18n.availableLocales" :key="`Lang${i}`" :value="lang">
                             {{ $i18n.messages[lang].languageName }}
                         </option>
@@ -59,9 +59,7 @@ export default {
         };
     },
     watch: {
-        "$i18n.locale"() {
-            localStorage.locale = this.$i18n.locale;
-        },
+
     },
     mounted() {
         this.$root.getSocket().emit("needSetup", (needSetup) => {

From ef54d9e3b648b7f7c538b512dcbe0b00b3a8a403 Mon Sep 17 00:00:00 2001
From: Austin Miller <austinrmiller1991@gmail.com>
Date: Mon, 6 Feb 2023 11:33:14 -0700
Subject: [PATCH 560/803] Add PagerTree Notification Provider

---
 server/notification-providers/pagertree.js | 91 ++++++++++++++++++++++
 server/notification.js                     |  2 +
 src/components/notifications/PagerTree.vue | 33 ++++++++
 src/components/notifications/index.js      |  2 +
 src/lang/en.json                           | 11 ++-
 5 files changed, 138 insertions(+), 1 deletion(-)
 create mode 100644 server/notification-providers/pagertree.js
 create mode 100644 src/components/notifications/PagerTree.vue

diff --git a/server/notification-providers/pagertree.js b/server/notification-providers/pagertree.js
new file mode 100644
index 00000000..c39f5681
--- /dev/null
+++ b/server/notification-providers/pagertree.js
@@ -0,0 +1,91 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const { UP, DOWN, getMonitorRelativeURL } = require("../../src/util");
+const { setting } = require("../util-server");
+let successMessage = "Sent Successfully.";
+
+class PagerTree extends NotificationProvider {
+    name = "PagerTree";
+
+    /**
+     * @inheritdoc
+     */
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        try {
+            if (heartbeatJSON == null) {
+                const title = "[Test] Uptime Kuma Alert";
+                return this.postNotification(notification, title, monitorJSON, heartbeatJSON);
+            }
+
+            if (heartbeatJSON.status === UP && notification.pagertreeAutoResolve === "resolve") {
+                return this.postNotification(notification, null, monitorJSON, heartbeatJSON, notification.pagertreeAutoResolve);
+            }
+
+            if (heartbeatJSON.status === DOWN) {
+                const title = `Uptime Kuma Monitor "${monitorJSON.name}" is DOWN`;
+                return this.postNotification(notification, title, monitorJSON, heartbeatJSON);
+            }
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+
+    /**
+     * Check if result is successful, result code should be in range 2xx
+     * @param {Object} result Axios response object
+     * @throws {Error} The status code is not in range 2xx
+     */
+    checkResult(result) {
+        if (result.status == null) {
+            throw new Error("PagerTree notification failed with invalid response!");
+        }
+        if (result.status < 200 || result.status >= 300) {
+            throw new Error("PagerTree notification failed with status code " + result.status);
+        }
+    }
+
+    /**
+     * Send the message
+     * @param {BeanModel} notification Message title
+     * @param {string} title Message title
+     * @param {Object} monitorJSON Monitor details (For Up/Down only)
+     * @param {?string} eventAction Action event for PagerTree (create, resolve)
+     * @returns {string}
+     */
+    async postNotification(notification, title, monitorJSON, heartbeatJSON, eventAction = "create") {
+
+        if (eventAction == null) {
+            return "No action required";
+        }
+
+        const options = {
+            method: "POST",
+            url: notification.pagertreeIntegrationUrl,
+            headers: { "Content-Type": "application/json" },
+            data: {
+                event_type: eventAction,
+                id: heartbeatJSON?.monitorID || "uptime-kuma-test",
+                title: title,
+                urgency: notification.pagertreeUrgency,
+                heartbeat: heartbeatJSON,
+                monitor: monitorJSON
+            }
+        };
+
+        const baseURL = await setting("primaryBaseURL");
+        if (baseURL && monitorJSON) {
+            options.client = "Uptime Kuma";
+            options.client_url = baseURL + getMonitorRelativeURL(monitorJSON.id);
+        }
+
+        let result = await axios.request(options);
+        this.checkResult(result);
+        if (result.statusText != null) {
+            return "PagerTree notification succeed: " + result.statusText;
+        }
+
+        return successMessage;
+    }
+}
+
+module.exports = PagerTree;
diff --git a/server/notification.js b/server/notification.js
index fd349123..1897f5cc 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -24,6 +24,7 @@ const Ntfy = require("./notification-providers/ntfy");
 const Octopush = require("./notification-providers/octopush");
 const OneBot = require("./notification-providers/onebot");
 const PagerDuty = require("./notification-providers/pagerduty");
+const PagerTree = require("./notification-providers/pagertree");
 const PromoSMS = require("./notification-providers/promosms");
 const Pushbullet = require("./notification-providers/pushbullet");
 const PushDeer = require("./notification-providers/pushdeer");
@@ -83,6 +84,7 @@ class Notification {
             new Octopush(),
             new OneBot(),
             new PagerDuty(),
+            new PagerTree(),
             new PromoSMS(),
             new Pushbullet(),
             new PushDeer(),
diff --git a/src/components/notifications/PagerTree.vue b/src/components/notifications/PagerTree.vue
new file mode 100644
index 00000000..823eb23b
--- /dev/null
+++ b/src/components/notifications/PagerTree.vue
@@ -0,0 +1,33 @@
+<template>
+    <div class="mb-3">
+        <label for="pagertree-integration-url" class="form-label">{{ $t("pagertreeIntegrationUrl") }}<span style="color: red;"><sup>*</sup></span></label>
+        <input id="pagertree-integration-url" v-model="$parent.notification.pagertreeIntegrationUrl" type="text" class="form-control" autocomplete="false">
+    </div>
+    <div class="mb-3">
+        <label for="pagertree-urgency" class="form-label">{{ $t("pagertreeUrgency") }}</label>
+        <select id="pagertree-urgency" v-model="$parent.notification.pagertreeUrgency" class="form-select">
+            <option value="silent">{{ $t("pagertreeSilent") }}</option>
+            <option value="low">{{ $t("pagertreeLow") }}</option>
+            <option value="medium" selected="selected">{{ $t("pagertreeMedium") }}</option>
+            <option value="high">{{ $t("pagertreeHigh") }}</option>
+            <option value="critical">{{ $t("pagertreeCritical") }}</option>
+        </select>
+    </div>
+    <div class="mb-3">
+        <label for="pagertree-resolve" class="form-label">{{ $t("pagertreeResolve") }}</label>
+        <select id="pagertree-resolve" v-model="$parent.notification.pagertreeAutoResolve" class="form-select">
+            <option value="resolve" selected="selected">{{ $t("pagertreeResolve") }}</option>
+            <option value="0">{{ $t("pagertreeDoNothing") }}</option>
+        </select>
+    </div>
+</template>
+
+<script>
+import HiddenInput from "../HiddenInput.vue";
+
+export default {
+    components: {
+        HiddenInput,
+    },
+};
+</script>
diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js
index 3c8b2621..ed9dde0f 100644
--- a/src/components/notifications/index.js
+++ b/src/components/notifications/index.js
@@ -22,6 +22,7 @@ import Ntfy from "./Ntfy.vue";
 import Octopush from "./Octopush.vue";
 import OneBot from "./OneBot.vue";
 import PagerDuty from "./PagerDuty.vue";
+import PagerTree from "./PagerTree.vue";
 import PromoSMS from "./PromoSMS.vue";
 import Pushbullet from "./Pushbullet.vue";
 import PushDeer from "./PushDeer.vue";
@@ -76,6 +77,7 @@ const NotificationFormList = {
     "octopush": Octopush,
     "OneBot": OneBot,
     "PagerDuty": PagerDuty,
+    "PagerTree": PagerTree,
     "promosms": PromoSMS,
     "pushbullet": Pushbullet,
     "PushByTechulus": TechulusPush,
diff --git a/src/lang/en.json b/src/lang/en.json
index d907f4e0..4383aca9 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -695,5 +695,14 @@
     "Google Analytics ID": "Google Analytics ID",
     "Edit Tag": "Edit Tag",
     "Server Address": "Server Address",
-    "Learn More": "Learn More"
+    "Learn More": "Learn More",
+    "pagertreeIntegrationUrl": "Integration URL",
+    "pagertreeUrgency": "Urgency",
+    "pagertreeSilent": "Silent",
+    "pagertreeLow": "Low",
+    "pagertreeMedium": "Medium",
+    "pagertreeHigh": "High",
+    "pagertreeCritical": "Critical",
+    "pagertreeResolve": "Auto Resolve",
+    "pagertreeDoNothing": "Do Nothing"
 }

From 1c0174c3192f862aa5bd17bad7c381e4a94fb638 Mon Sep 17 00:00:00 2001
From: Austin Miller <austinrmiller1991@gmail.com>
Date: Mon, 6 Feb 2023 13:07:56 -0700
Subject: [PATCH 561/803] ESLint and verbiage changes

---
 src/components/notifications/PagerTree.vue | 8 +++-----
 src/lang/en.json                           | 3 ++-
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/components/notifications/PagerTree.vue b/src/components/notifications/PagerTree.vue
index 823eb23b..0121f65e 100644
--- a/src/components/notifications/PagerTree.vue
+++ b/src/components/notifications/PagerTree.vue
@@ -2,6 +2,9 @@
     <div class="mb-3">
         <label for="pagertree-integration-url" class="form-label">{{ $t("pagertreeIntegrationUrl") }}<span style="color: red;"><sup>*</sup></span></label>
         <input id="pagertree-integration-url" v-model="$parent.notification.pagertreeIntegrationUrl" type="text" class="form-control" autocomplete="false">
+        <i18n-t tag="div" keypath="wayToGetPagerTreeIntegrationURL" class="form-text">
+            <a href="https://pagertree.com/docs/integration-guides/introduction#copy-the-endpoint-url" target="_blank">{{ $t("here") }}</a>
+        </i18n-t>
     </div>
     <div class="mb-3">
         <label for="pagertree-urgency" class="form-label">{{ $t("pagertreeUrgency") }}</label>
@@ -23,11 +26,6 @@
 </template>
 
 <script>
-import HiddenInput from "../HiddenInput.vue";
-
 export default {
-    components: {
-        HiddenInput,
-    },
 };
 </script>
diff --git a/src/lang/en.json b/src/lang/en.json
index 4383aca9..f29f0646 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -704,5 +704,6 @@
     "pagertreeHigh": "High",
     "pagertreeCritical": "Critical",
     "pagertreeResolve": "Auto Resolve",
-    "pagertreeDoNothing": "Do Nothing"
+    "pagertreeDoNothing": "Do Nothing",
+    "wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}"
 }

From e1f956879d4545e288ae5d769b4e876a441b265f Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Tue, 7 Feb 2023 05:01:53 +0800
Subject: [PATCH 562/803] Fix: Use .destroy() instead of .end()

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

diff --git a/server/util-server.js b/server/util-server.js
index a2f1aa46..edce2890 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -323,7 +323,7 @@ exports.mysqlQuery = function (connectionString, query) {
                 reject(err);
             })
             .finally(() => {
-                connection.end();
+                connection.destroy();
             });
     });
 };

From ab3b2bddba0843e7bec6e66bb5d3907bf914bf00 Mon Sep 17 00:00:00 2001
From: Suriya Soutmun <suriya.s@linecorp.com>
Date: Wed, 4 Jan 2023 14:33:05 +0700
Subject: [PATCH 563/803] [empty commit] pull request for http/http keyword
 mTLS authen


From faa78443d6d41659029ce8d3b1c988637c97021d Mon Sep 17 00:00:00 2001
From: Suriya Soutmun <suriya.s@linecorp.com>
Date: Wed, 4 Jan 2023 14:37:03 +0700
Subject: [PATCH 564/803] chore: alter table monitor add column tls_ca,
 tls_cert, tls_key for certificate data

---
 db/patch-monitor-tls.sql | 13 +++++++++++++
 server/database.js       |  1 +
 2 files changed, 14 insertions(+)
 create mode 100644 db/patch-monitor-tls.sql

diff --git a/db/patch-monitor-tls.sql b/db/patch-monitor-tls.sql
new file mode 100644
index 00000000..ac4edb79
--- /dev/null
+++ b/db/patch-monitor-tls.sql
@@ -0,0 +1,13 @@
+-- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
+BEGIN TRANSACTION;
+
+ALTER TABLE monitor
+    ADD tls_ca TEXT default null;
+
+ALTER TABLE monitor
+    ADD tls_cert TEXT default null;
+
+ALTER TABLE monitor
+    ADD tls_key TEXT default null;
+
+COMMIT;
diff --git a/server/database.js b/server/database.js
index 19c09a00..859f12ff 100644
--- a/server/database.js
+++ b/server/database.js
@@ -70,6 +70,7 @@ class Database {
         "patch-maintenance-table2.sql": true,
         "patch-add-gamedig-monitor.sql": true,
         "patch-add-google-analytics-status-page-tag.sql": true,
+        "patch-monitor-tls.sql": true,
     };
 
     /**

From 43941fa2c60fbd9370699ff4e304188e176a067d Mon Sep 17 00:00:00 2001
From: Suriya Soutmun <suriya.s@linecorp.com>
Date: Wed, 4 Jan 2023 14:37:30 +0700
Subject: [PATCH 565/803] feat: add mtls authen method in http/http keyword

---
 server/model/monitor.js   | 16 ++++++++++++-
 server/server.js          |  3 +++
 src/pages/EditMonitor.vue | 47 +++++++++++++++++++++++++++------------
 3 files changed, 51 insertions(+), 15 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 4cbb56e1..2cb309e0 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -131,6 +131,9 @@ class Monitor extends BeanModel {
                 mqttPassword: this.mqttPassword,
                 authWorkstation: this.authWorkstation,
                 authDomain: this.authDomain,
+                tlsCa: this.tlsCa,
+                tlsCert: this.tlsCert,
+                tlsKey: this.tlsKey,
             };
         }
 
@@ -308,6 +311,18 @@ class Monitor extends BeanModel {
                         options.httpsAgent = new https.Agent(httpsAgentOptions);
                     }
 
+                    if (this.auth_method === "mtls") {
+                        if (this.tlsCert !== null && this.tlsCert !== "") {
+                            options.httpsAgent.options.cert = Buffer.from(this.tlsCert);
+                        }
+                        if (this.tlsCa !== null && this.tlsCa !== "") {
+                            options.httpsAgent.options.ca = Buffer.from(this.tlsCa);
+                        }
+                        if (this.tlsKey !== null && this.tlsKey !== "") {
+                            options.httpsAgent.options.key = Buffer.from(this.tlsKey);
+                        }
+                    }
+
                     log.debug("monitor", `[${this.name}] Axios Options: ${JSON.stringify(options)}`);
                     log.debug("monitor", `[${this.name}] Axios Request`);
 
@@ -813,7 +828,6 @@ class Monitor extends BeanModel {
                     domain: this.authDomain,
                     workstation: this.authWorkstation ? this.authWorkstation : undefined
                 });
-
             } else {
                 res = await axios.request(options);
             }
diff --git a/server/server.js b/server/server.js
index 1073f3be..91b0a944 100644
--- a/server/server.js
+++ b/server/server.js
@@ -688,6 +688,9 @@ let needSetup = false;
                 bean.headers = monitor.headers;
                 bean.basic_auth_user = monitor.basic_auth_user;
                 bean.basic_auth_pass = monitor.basic_auth_pass;
+                bean.tlsCa = monitor.tlsCa;
+                bean.tlsCert = monitor.tlsCert;
+                bean.tlsKey = monitor.tlsKey;
                 bean.interval = monitor.interval;
                 bean.retryInterval = monitor.retryInterval;
                 bean.resendInterval = monitor.resendInterval;
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index e9cbd824..6d7353fe 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -531,28 +531,47 @@
                                         <option value="ntlm">
                                             NTLM
                                         </option>
+                                        <option value="mtls">
+                                            mTLS
+                                        </option>
                                     </select>
                                 </div>
                                 <template v-if="monitor.authMethod && monitor.authMethod !== null ">
-                                    <div class="my-3">
-                                        <label for="basicauth" class="form-label">{{ $t("Username") }}</label>
-                                        <input id="basicauth-user" v-model="monitor.basic_auth_user" type="text" class="form-control" :placeholder="$t('Username')">
-                                    </div>
-
-                                    <div class="my-3">
-                                        <label for="basicauth" class="form-label">{{ $t("Password") }}</label>
-                                        <input id="basicauth-pass" v-model="monitor.basic_auth_pass" type="password" autocomplete="new-password" class="form-control" :placeholder="$t('Password')">
-                                    </div>
-                                    <template v-if="monitor.authMethod === 'ntlm' ">
+                                    <template v-if="monitor.authMethod === 'mtls' ">
                                         <div class="my-3">
-                                            <label for="basicauth" class="form-label">{{ $t("Domain") }}</label>
-                                            <input id="basicauth-domain" v-model="monitor.authDomain" type="text" class="form-control" :placeholder="$t('Domain')">
+                                            <label for="tls" class="form-label">{{ $t("Cert") }}</label>
+                                            <textarea id="tls-cert" v-model="monitor.tlsCert" class="form-control" :placeholder="$t('Cert body')" required></textarea>
+                                        </div>
+                                        <div class="my-3">
+                                            <label for="tls" class="form-label">{{ $t("Key") }}</label>
+                                            <textarea id="tls-key" v-model="monitor.tlsKey" class="form-control" :placeholder="$t('Key body')" required></textarea>
+                                        </div>
+                                        <div class="my-3">
+                                            <label for="tls" class="form-label">{{ $t("CA") }}</label>
+                                            <textarea id="tls-ca" v-model="monitor.tlsCa" class="form-control" :placeholder="$t('Server CA')"></textarea>
+                                        </div>
+                                    </template>
+                                    <template v-else>
+                                        <div class="my-3">
+                                            <label for="basicauth" class="form-label">{{ $t("Username") }}</label>
+                                            <input id="basicauth-user" v-model="monitor.basic_auth_user" type="text" class="form-control" :placeholder="$t('Username')">
                                         </div>
 
                                         <div class="my-3">
-                                            <label for="basicauth" class="form-label">{{ $t("Workstation") }}</label>
-                                            <input id="basicauth-workstation" v-model="monitor.authWorkstation" type="text" class="form-control" :placeholder="$t('Workstation')">
+                                            <label for="basicauth" class="form-label">{{ $t("Password") }}</label>
+                                            <input id="basicauth-pass" v-model="monitor.basic_auth_pass" type="password" autocomplete="new-password" class="form-control" :placeholder="$t('Password')">
                                         </div>
+                                        <template v-if="monitor.authMethod === 'ntlm' ">
+                                            <div class="my-3">
+                                                <label for="basicauth" class="form-label">{{ $t("Domain") }}</label>
+                                                <input id="basicauth-domain" v-model="monitor.authDomain" type="text" class="form-control" :placeholder="$t('Domain')">
+                                            </div>
+
+                                            <div class="my-3">
+                                                <label for="basicauth" class="form-label">{{ $t("Workstation") }}</label>
+                                                <input id="basicauth-workstation" v-model="monitor.authWorkstation" type="text" class="form-control" :placeholder="$t('Workstation')">
+                                            </div>
+                                        </template>
                                     </template>
                                 </template>
                             </template>

From 727acb32bf8423a5c56cf64776ce33eded9e5aa7 Mon Sep 17 00:00:00 2001
From: Brayan Lozano <brayan@mytide.io>
Date: Tue, 7 Feb 2023 21:18:26 -0500
Subject: [PATCH 566/803] Adds name + status + message to slack notification

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

diff --git a/server/notification-providers/slack.js b/server/notification-providers/slack.js
index 5a5d40cb..64a58738 100644
--- a/server/notification-providers/slack.js
+++ b/server/notification-providers/slack.js
@@ -42,7 +42,7 @@ class Slack extends NotificationProvider {
             const time = heartbeatJSON["time"];
             const textMsg = "Uptime Kuma Alert";
             let data = {
-                "text": monitorJSON ? textMsg + `: ${monitorJSON.name}` : textMsg,
+                "text": monitorJSON ? `${textMsg}\n${msg}` : textMsg,
                 "channel": notification.slackchannel,
                 "username": notification.slackusername,
                 "icon_emoji": notification.slackiconemo,

From d45aee450d3e01a9ee7a4a784ff99268e05fff76 Mon Sep 17 00:00:00 2001
From: Brayan Lozano <brayan@mytide.io>
Date: Tue, 7 Feb 2023 22:34:10 -0500
Subject: [PATCH 567/803] Removes unecessary ternary operator

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

diff --git a/server/notification-providers/slack.js b/server/notification-providers/slack.js
index 64a58738..da89f0f7 100644
--- a/server/notification-providers/slack.js
+++ b/server/notification-providers/slack.js
@@ -42,7 +42,7 @@ class Slack extends NotificationProvider {
             const time = heartbeatJSON["time"];
             const textMsg = "Uptime Kuma Alert";
             let data = {
-                "text": monitorJSON ? `${textMsg}\n${msg}` : textMsg,
+                "text": `${textMsg}\n${msg}`,
                 "channel": notification.slackchannel,
                 "username": notification.slackusername,
                 "icon_emoji": notification.slackiconemo,

From 8725e5daf91399fd59a5d016fcb3ae7ac98b9e25 Mon Sep 17 00:00:00 2001
From: Bobby Ore <bobby.ore@while1.us>
Date: Wed, 8 Feb 2023 14:08:25 -0600
Subject: [PATCH 568/803] Add ability to use User ID for LunaSea notifications

---
 server/notification-providers/lunasea.js | 15 ++++++++++-----
 src/components/notifications/LunaSea.vue | 13 +++++++++++--
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/server/notification-providers/lunasea.js b/server/notification-providers/lunasea.js
index 2985425e..48f7b4f2 100644
--- a/server/notification-providers/lunasea.js
+++ b/server/notification-providers/lunasea.js
@@ -8,15 +8,20 @@ class LunaSea extends NotificationProvider {
 
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
-        let lunaseadevice = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaDevice;
-
+        let lunaseaurl = "";
+        if(notification.lunaseaNotificationType === "device") {
+            lunaseaurl = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaId;
+        } else {
+            lunaseaurl = "https://notify.lunasea.app/v1/custom/user/" + notification.lunaseaId;
+        }
+        
         try {
             if (heartbeatJSON == null) {
                 let testdata = {
                     "title": "Uptime Kuma Alert",
                     "body": msg,
                 };
-                await axios.post(lunaseadevice, testdata);
+                await axios.post(lunaseaurl, testdata);
                 return okMsg;
             }
 
@@ -25,7 +30,7 @@ class LunaSea extends NotificationProvider {
                     "title": "UptimeKuma Alert: " + monitorJSON["name"],
                     "body": "[🔴 Down] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"],
                 };
-                await axios.post(lunaseadevice, downdata);
+                await axios.post(lunaseaurl, downdata);
                 return okMsg;
             }
 
@@ -34,7 +39,7 @@ class LunaSea extends NotificationProvider {
                     "title": "UptimeKuma Alert: " + monitorJSON["name"],
                     "body": "[✅ Up] " + heartbeatJSON["msg"] + "\nTime (UTC): " + heartbeatJSON["time"],
                 };
-                await axios.post(lunaseadevice, updata);
+                await axios.post(lunaseaurl, updata);
                 return okMsg;
             }
 
diff --git a/src/components/notifications/LunaSea.vue b/src/components/notifications/LunaSea.vue
index 34a98688..6367af7e 100644
--- a/src/components/notifications/LunaSea.vue
+++ b/src/components/notifications/LunaSea.vue
@@ -1,7 +1,16 @@
 <template>
     <div class="mb-3">
-        <label for="lunasea-device" class="form-label">{{ $t("LunaSea Device ID") }}<span style="color: red;"><sup>*</sup></span></label>
-        <input id="lunasea-device" v-model="$parent.notification.lunaseaDevice" type="text" class="form-control" required>
+        <label for="lunasea-notification-type" class="form-label">{{ $t("Device ID or User ID") }}<span style="color: red;"><sup>*</sup></span></label>
+        <div class="form-text">
+            <p>
+                <select class="form-select" id="lunasea-notification-type" v-model="$parent.notification.lunaseaNotificationType">
+                    <option value="device">Device</option>
+                    <option value="user">User</option>
+                </select>
+            </p>
+        </div>
+        <label for="lunasea-device" class="form-label">{{ $t("LunaSea ID") }}<span style="color: red;"><sup>*</sup></span></label>
+        <input id="lunasea-device" v-model="$parent.notification.lunaseaId" type="text" class="form-control" required>
         <div class="form-text">
             <p><span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}</p>
         </div>

From 53d9e98e47d3f3619d6159d91189a3789af83a75 Mon Sep 17 00:00:00 2001
From: Bobby Ore <bobby.ore@while1.us>
Date: Wed, 8 Feb 2023 14:13:41 -0600
Subject: [PATCH 569/803] Added required to LunaSea notification type select
 field

---
 src/components/notifications/LunaSea.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/notifications/LunaSea.vue b/src/components/notifications/LunaSea.vue
index 6367af7e..57947183 100644
--- a/src/components/notifications/LunaSea.vue
+++ b/src/components/notifications/LunaSea.vue
@@ -3,7 +3,7 @@
         <label for="lunasea-notification-type" class="form-label">{{ $t("Device ID or User ID") }}<span style="color: red;"><sup>*</sup></span></label>
         <div class="form-text">
             <p>
-                <select class="form-select" id="lunasea-notification-type" v-model="$parent.notification.lunaseaNotificationType">
+                <select id="lunasea-notification-type" v-model="$parent.notification.lunaseaNotificationType" class="form-select" required>
                     <option value="device">Device</option>
                     <option value="user">User</option>
                 </select>

From 3a361d26210b6db8dc27d0e67956bbfa58bd87c5 Mon Sep 17 00:00:00 2001
From: Bobby Ore <bobby.ore@while1.us>
Date: Wed, 8 Feb 2023 14:16:02 -0600
Subject: [PATCH 570/803] lint fix

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

diff --git a/server/notification-providers/lunasea.js b/server/notification-providers/lunasea.js
index 48f7b4f2..0d9bb26a 100644
--- a/server/notification-providers/lunasea.js
+++ b/server/notification-providers/lunasea.js
@@ -9,12 +9,12 @@ class LunaSea extends NotificationProvider {
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
         let lunaseaurl = "";
-        if(notification.lunaseaNotificationType === "device") {
+        if (notification.lunaseaNotificationType === "device") {
             lunaseaurl = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaId;
         } else {
             lunaseaurl = "https://notify.lunasea.app/v1/custom/user/" + notification.lunaseaId;
         }
-        
+
         try {
             if (heartbeatJSON == null) {
                 let testdata = {

From 36d160ad022706a4d4f29d22af7eb6c00df7c983 Mon Sep 17 00:00:00 2001
From: OidaTiftla <chm.stephan@outlook.com>
Date: Thu, 9 Feb 2023 09:04:47 +0100
Subject: [PATCH 571/803] Rename "consequently" to "consecutively" as suggested
 by @skylarv

https://github.com/louislam/uptime-kuma/pull/1212#issuecomment-1423373045
---
 src/lang/ar-SY.json       | 2 +-
 src/lang/bg-BG.json       | 2 +-
 src/lang/cs-CZ.json       | 2 +-
 src/lang/de-CH.json       | 2 +-
 src/lang/de-DE.json       | 2 +-
 src/lang/el-GR.json       | 2 +-
 src/lang/en.json          | 2 +-
 src/lang/es-ES.json       | 2 +-
 src/lang/fr-FR.json       | 2 +-
 src/lang/he-IL.json       | 2 +-
 src/lang/hr-HR.json       | 2 +-
 src/lang/id-ID.json       | 2 +-
 src/lang/ko-KR.json       | 2 +-
 src/lang/pl.json          | 2 +-
 src/lang/pt-BR.json       | 2 +-
 src/lang/th-TH.json       | 2 +-
 src/lang/tr-TR.json       | 2 +-
 src/lang/zh-CN.json       | 2 +-
 src/lang/zh-HK.json       | 2 +-
 src/lang/zh-TW.json       | 2 +-
 src/pages/EditMonitor.vue | 2 +-
 21 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/src/lang/ar-SY.json b/src/lang/ar-SY.json
index d852a690..fe2910dd 100644
--- a/src/lang/ar-SY.json
+++ b/src/lang/ar-SY.json
@@ -90,7 +90,7 @@
     "Heartbeat Interval": "فاصل نبضات القلب",
     "Retries": "يحاول مجدداً",
     "Heartbeat Retry Interval": "الفاصل الزمني لإعادة محاكمة نبضات القلب",
-    "Resend Notification if Down X times consequently": "إعادة تقديم الإخطار إذا انخفض x مرات بالتالي",
+    "Resend Notification if Down X times consecutively": "إعادة تقديم الإخطار إذا انخفض x مرات بالتالي",
     "Advanced": "متقدم",
     "Upside Down Mode": "وضع أسفل أسفل",
     "Max. Redirects": "الأعلى. إعادة التوجيه",
diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 3a5f532d..5bbebf9c 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -539,7 +539,7 @@
     "wayToGetLineNotifyToken": "Може да получите токен код за достъп от {0}",
     "resendEveryXTimes": "Изпращай повторно на всеки {0} пъти",
     "resendDisabled": "Повторното изпращане е изключено",
-    "Resend Notification if Down X times consequently": "Повторно изпращане на известие, ако е недостъпен X пъти последователно",
+    "Resend Notification if Down X times consecutively": "Повторно изпращане на известие, ако е недостъпен X пъти последователно",
     "Bark Group": "Bark група",
     "Bark Sound": "Bark звук",
     "HTTP Headers": "HTTP хедъри",
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index c6b28312..28ca79ee 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -90,7 +90,7 @@
     "Heartbeat Interval": "Heartbeat interval",
     "Retries": "Počet pokusů",
     "Heartbeat Retry Interval": "Interval opakování heartbeatu",
-    "Resend Notification if Down X times consequently": "Znovu zaslat oznámení, pokud je služba nedostupná Xkrát za sebou",
+    "Resend Notification if Down X times consecutively": "Znovu zaslat oznámení, pokud je služba nedostupná Xkrát za sebou",
     "Advanced": "Rozšířené",
     "Upside Down Mode": "Inverzní režim",
     "Max. Redirects": "Max. přesměrování",
diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
index 85da35e0..d8a46562 100644
--- a/src/lang/de-CH.json
+++ b/src/lang/de-CH.json
@@ -165,7 +165,7 @@
     "Pink": "Pink",
     "Search...": "Suchen…",
     "Heartbeat Retry Interval": "Überprüfungsintervall",
-    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
+    "Resend Notification if Down X times consecutively": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
     "retryCheckEverySecond": "Alle {0} Sekunden neu versuchen",
     "resendEveryXTimes": "Erneut versenden alle {0} mal",
     "resendDisabled": "Erneut versenden deaktiviert",
diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 45b5ae56..f6671598 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -165,7 +165,7 @@
     "Pink": "Pink",
     "Search...": "Suchen…",
     "Heartbeat Retry Interval": "Überprüfungsintervall",
-    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
+    "Resend Notification if Down X times consecutively": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
     "retryCheckEverySecond": "Alle {0} Sekunden neu versuchen",
     "resendEveryXTimes": "Erneut versenden alle {0} mal",
     "resendDisabled": "Erneut versenden deaktiviert",
diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json
index c77d6158..fbd8a369 100644
--- a/src/lang/el-GR.json
+++ b/src/lang/el-GR.json
@@ -74,7 +74,7 @@
     "Heartbeat Interval": "Διάστημα καρδιακών παλμών",
     "Retries": "Επαναλήψεις",
     "Heartbeat Retry Interval": "Διάστημα επανάληψης παλμών καρδιάς",
-    "Resend Notification if Down X times consequently": "Αποστολή νέας ειδοποίησης εάν κατω X φορές κατά συνέχεια",
+    "Resend Notification if Down X times consecutively": "Αποστολή νέας ειδοποίησης εάν κατω X φορές κατά συνέχεια",
     "Advanced": "Προχωρημένα",
     "Upside Down Mode": "Ανάποδη λειτουργία",
     "Max. Redirects": "Μέγιστη. Ανακατευθύνσεις",
diff --git a/src/lang/en.json b/src/lang/en.json
index d907f4e0..0fed82c0 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -55,7 +55,7 @@
     "Heartbeat Interval": "Heartbeat Interval",
     "Retries": "Retries",
     "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Resend Notification if Down X times consequently": "Resend Notification if Down X times consequently",
+    "Resend Notification if Down X times consecutively": "Resend Notification if Down X times consecutively",
     "Advanced": "Advanced",
     "checkEverySecond": "Check every {0} seconds",
     "retryCheckEverySecond": "Retry every {0} seconds",
diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index 8fa80158..a9c8e34f 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -304,7 +304,7 @@
     "General Monitor Type": "Monitor Tipo General",
     "Specific Monitor Type": "Monitor Tipo Específico",
     "Monitor": "Monitores",
-    "Resend Notification if Down X times consequently": "Reenviar Notificación si Caído X veces consecutivas",
+    "Resend Notification if Down X times consecutively": "Reenviar Notificación si Caído X veces consecutivas",
     "resendEveryXTimes": "Reenviar cada {0} veces",
     "resendDisabled": "Reenvío deshabilitado",
     "needPushEvery": "Debe llamar a esta URL cada {0} segundos.",
diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index ae39af3c..3580cca1 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -89,7 +89,7 @@
     "Heartbeat Interval": "Intervalle de vérification",
     "Retries": "Essais",
     "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
-    "Resend Notification if Down X times consequently": "Renvoyer une notification si hors ligne X fois",
+    "Resend Notification if Down X times consecutively": "Renvoyer une notification si hors ligne X fois",
     "Advanced": "Avancé",
     "Upside Down Mode": "Mode inversé",
     "Max. Redirects": "Nombre maximum de redirections",
diff --git a/src/lang/he-IL.json b/src/lang/he-IL.json
index c8219ff5..c61ad77c 100644
--- a/src/lang/he-IL.json
+++ b/src/lang/he-IL.json
@@ -89,7 +89,7 @@
     "Heartbeat Interval": "מרווח פעימות",
     "Retries": "נסיונות חוזרים",
     "Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות",
-    "Resend Notification if Down X times consequently": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך",
+    "Resend Notification if Down X times consecutively": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך",
     "Advanced": "מתקדם",
     "Upside Down Mode": "מצב הפוך",
     "Max. Redirects": "מקסימום הפניות מחדש",
diff --git a/src/lang/hr-HR.json b/src/lang/hr-HR.json
index 417b689e..b909ed55 100644
--- a/src/lang/hr-HR.json
+++ b/src/lang/hr-HR.json
@@ -378,7 +378,7 @@
     "resendEveryXTimes": "Ponovno pošalji svakih {0} puta",
     "resendDisabled": "Ponovno slanje je onemogućeno",
     "dnsPortDescription": "Port DNS poslužitelja. Zadana vrijednost je 53. Moguće je promijeniti ga u svakom trenutku.",
-    "Resend Notification if Down X times consequently": "Ponovno pošalji obavijest ako je usluga nedostupna više puta zaredom",
+    "Resend Notification if Down X times consecutively": "Ponovno pošalji obavijest ako je usluga nedostupna više puta zaredom",
     "topic": "Tema",
     "topicExplanation": "MQTT tema koja će se monitorirati",
     "successMessage": "Poruka o uspjehu",
diff --git a/src/lang/id-ID.json b/src/lang/id-ID.json
index 59a06521..ecd50672 100644
--- a/src/lang/id-ID.json
+++ b/src/lang/id-ID.json
@@ -74,7 +74,7 @@
     "Heartbeat Interval": "Jarak Waktu Heartbeat ",
     "Retries": "Coba lagi",
     "Heartbeat Retry Interval": "Jarak Waktu Heartbeat Mencoba kembali ",
-    "Resend Notification if Down X times consequently": "Kirim Ulang Notifikasi jika Tidak Aktif X kali",
+    "Resend Notification if Down X times consecutively": "Kirim Ulang Notifikasi jika Tidak Aktif X kali",
     "Advanced": "Tingkat Lanjut",
     "Upside Down Mode": "Mode Terbalik",
     "Max. Redirects": "Maksimal Pengalihan",
diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
index 2c2297c6..079c9f58 100644
--- a/src/lang/ko-KR.json
+++ b/src/lang/ko-KR.json
@@ -680,7 +680,7 @@
     "Passive Monitor Type": "수동 모니터링",
     "Specific Monitor Type": "특정 모니터링",
     "Monitor": "모니터",
-    "Resend Notification if Down X times consequently": "X번 중단될 경우 알림 다시 보내기",
+    "Resend Notification if Down X times consecutively": "X번 중단될 경우 알림 다시 보내기",
     "Schedule maintenance": "점검 예약하기",
     "Affected Monitors": "영향을 받는 모니터링",
     "Pick Affected Monitors...": "영향을 받는 모니터링 선택하기…",
diff --git a/src/lang/pl.json b/src/lang/pl.json
index ebc58797..27b5d72b 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -494,7 +494,7 @@
     "atLeastOneMonitor": "Wybierz co najmniej jeden monitor, którego dotyczy problem",
     "deleteMaintenanceMsg": "Czy na pewno chcesz usunąć tę konserwację?",
     "dnsPortDescription": "Port serwera DNS. Domyślnie 53. Możesz zmienić port w dowolnym momencie.",
-    "Resend Notification if Down X times consequently": "Wyślij ponownie powiadomienie, jeśli nie działa X razy pod rząd",
+    "Resend Notification if Down X times consecutively": "Wyślij ponownie powiadomienie, jeśli nie działa X razy pod rząd",
     "error": "błąd",
     "critical": "krytyczny",
     "wayToGetPagerDutyKey": "Możesz to uzyskać, przechodząc do Service -> Service Directory -> (wybierz usługę) -> Integrations -> Add integration. Tutaj możesz wyszukać \"Events API V2\". Więcej informacji {0}",
diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json
index b7ebdbd4..a0c6d1fd 100644
--- a/src/lang/pt-BR.json
+++ b/src/lang/pt-BR.json
@@ -249,7 +249,7 @@
     "enabled": "Ativado",
     "setAsDefault": "Definir como padrão",
     "Primary Base URL": "URL base principal",
-    "Resend Notification if Down X times consequently": "Reenviar notificação se OFFLINE X vezes consecutivamente",
+    "Resend Notification if Down X times consecutively": "Reenviar notificação se OFFLINE X vezes consecutivamente",
     "pushOptionalParams": "Parâmetros opcionais: {0}",
     "webhookFormDataDesc": "{multipart} é bom para PHP. O JSON precisará ser analisado com {decodeFunction}",
     "HeadersInvalidFormat": "Os cabeçalhos da solicitação não são um JSON válidos: ",
diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
index 7ad132f5..1895a153 100644
--- a/src/lang/th-TH.json
+++ b/src/lang/th-TH.json
@@ -522,7 +522,7 @@
     "resendEveryXTimes": "ส่งซ้ำทุก {0} ครั้ง",
     "resendDisabled": "การส่งซ้ำถูกปิดใช้งาน",
     "dnsPortDescription": "พอร์ตของเซิร์ฟเวอร์ DNS, ค่าเริ่มต้นคือ 53, คุณสามารถเปลี่ยนพอร์ตตอนไหนก็ได้",
-    "Resend Notification if Down X times consequently": "ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง",
+    "Resend Notification if Down X times consecutively": "ส่งการแจ้งเตือนซ้ำถ้าออฟไลน์ครบ X ครั้ง",
     "error": "เกิดข้อผิดพลาด",
     "critical": "วิกฤต",
     "wayToGetPagerDutyKey": "คุณสามารถรับคีย์ได้โดยการไปที่ Service -> Service Directory -> (Select a service) -> Integrations -> Add integration, และค้นหา \"Events API V2\", สำหรับข้อมูลเพิ่มเติม {0}",
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index b9bc8adc..13ddd373 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -74,7 +74,7 @@
     "Heartbeat Interval": "Servis Test Aralığı",
     "Retries": "Yeniden deneme",
     "Heartbeat Retry Interval": "Sağlık Durumları Tekrar Deneme Sıklığı",
-    "Resend Notification if Down X times consequently": "Sonuç olarak X kez düşerse bildirimi yeniden gönder",
+    "Resend Notification if Down X times consecutively": "Sonuç olarak X kez düşerse bildirimi yeniden gönder",
     "Advanced": "Gelişmiş",
     "Upside Down Mode": "Ters/Düz Modu",
     "Max. Redirects": "Maksimum Yönlendirme",
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index a3393bd1..45529c6d 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -89,7 +89,7 @@
     "Heartbeat Interval": "心跳间隔",
     "Retries": "重试次数",
     "Heartbeat Retry Interval": "心跳重试间隔",
-    "Resend Notification if Down X times consequently": "连续失败时重复发送通知的间隔次数",
+    "Resend Notification if Down X times consecutively": "连续失败时重复发送通知的间隔次数",
     "Advanced": "高级",
     "Upside Down Mode": "反转监控",
     "Max. Redirects": "最大重定向次数",
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 14f25b5e..024781a3 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -397,7 +397,7 @@
     "affectedStatusPages": "在已選取的狀態頁中顯示此維護訊息",
     "Primary Base URL": "主要 Base URL",
     "Passive Monitor Type": "被動監測器類型",
-    "Resend Notification if Down X times consequently": "若 X 次心跳皆離線,重新傳送通知",
+    "Resend Notification if Down X times consecutively": "若 X 次心跳皆離線,重新傳送通知",
     "Game": "遊戲",
     "Specific Monitor Type": "特定監測器類型",
     "Monitor": "監測器 | 監測器",
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
index 5eb0a699..3e208215 100644
--- a/src/lang/zh-TW.json
+++ b/src/lang/zh-TW.json
@@ -89,7 +89,7 @@
     "Heartbeat Interval": "心跳間隔",
     "Retries": "重試次數",
     "Heartbeat Retry Interval": "心跳重試間隔",
-    "Resend Notification if Down X times consequently": "若 X 次心跳皆離線,重新傳送通知",
+    "Resend Notification if Down X times consecutively": "若 X 次心跳皆離線,重新傳送通知",
     "Advanced": "進階",
     "Upside Down Mode": "顛倒模式",
     "Max. Redirects": "最大重新導向次數",
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index e9cbd824..297759c5 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -340,7 +340,7 @@
 
                             <div class="my-3">
                                 <label for="resend-interval" class="form-label">
-                                    {{ $t("Resend Notification if Down X times consequently") }}
+                                    {{ $t("Resend Notification if Down X times consecutively") }}
                                     <span v-if="monitor.resendInterval > 0">({{ $t("resendEveryXTimes", [ monitor.resendInterval ]) }})</span>
                                     <span v-else>({{ $t("resendDisabled") }})</span>
                                 </label>

From 3439074835d1f40dd56ca2b6531dcbbec53071b0 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Thu, 9 Feb 2023 17:42:02 +0800
Subject: [PATCH 572/803] Feat: Use message to improve errror status code

---
 server/routers/api-router.js         | 14 +++++++-------
 server/routers/status-page-router.js | 18 ++++++------------
 server/util-server.js                | 24 ++++++++++++++++++------
 3 files changed, 31 insertions(+), 25 deletions(-)

diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 665163ae..2d5f9661 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -1,5 +1,5 @@
 let express = require("express");
-const { allowDevAllOrigin, allowAllOrigin, percentageToColor, filterAndJoin, send403 } = require("../util-server");
+const { allowDevAllOrigin, allowAllOrigin, percentageToColor, filterAndJoin, sendHttpError } = require("../util-server");
 const { R } = require("redbean-node");
 const apicache = require("../modules/apicache");
 const Monitor = require("../model/monitor");
@@ -175,7 +175,7 @@ router.get("/api/badge/:id/status", cache("5 minutes"), async (request, response
         response.type("image/svg+xml");
         response.send(svg);
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -242,7 +242,7 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
         response.type("image/svg+xml");
         response.send(svg);
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -303,7 +303,7 @@ router.get("/api/badge/:id/ping/:duration?", cache("5 minutes"), async (request,
         response.type("image/svg+xml");
         response.send(svg);
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -373,7 +373,7 @@ router.get("/api/badge/:id/avg-response/:duration?", cache("5 minutes"), async (
         response.type("image/svg+xml");
         response.send(svg);
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -464,7 +464,7 @@ router.get("/api/badge/:id/cert-exp", cache("5 minutes"), async (request, respon
         response.type("image/svg+xml");
         response.send(svg);
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -536,7 +536,7 @@ router.get("/api/badge/:id/response", cache("5 minutes"), async (request, respon
         response.type("image/svg+xml");
         response.send(svg);
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
diff --git a/server/routers/status-page-router.js b/server/routers/status-page-router.js
index de075db8..28cf5f4c 100644
--- a/server/routers/status-page-router.js
+++ b/server/routers/status-page-router.js
@@ -2,7 +2,7 @@ let express = require("express");
 const apicache = require("../modules/apicache");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
 const StatusPage = require("../model/status_page");
-const { allowDevAllOrigin, send403 } = require("../util-server");
+const { allowDevAllOrigin, sendHttpError } = require("../util-server");
 const { R } = require("redbean-node");
 const Monitor = require("../model/monitor");
 
@@ -44,10 +44,7 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
         let statusPageData = await StatusPage.getStatusPageData(statusPage);
 
         if (!statusPageData) {
-            response.statusCode = 404;
-            response.json({
-                msg: "Not Found"
-            });
+            sendHttpError(response, "Not Found");
             return;
         }
 
@@ -55,7 +52,7 @@ router.get("/api/status-page/:slug", cache("5 minutes"), async (request, respons
         response.json(statusPageData);
 
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -103,7 +100,7 @@ router.get("/api/status-page/heartbeat/:slug", cache("1 minutes"), async (reques
         });
 
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
@@ -119,10 +116,7 @@ router.get("/api/status-page/:slug/manifest.json", cache("1440 minutes"), async
         ]);
 
         if (!statusPage) {
-            response.statusCode = 404;
-            response.json({
-                msg: "Not Found"
-            });
+            sendHttpError(response, "Not Found");
             return;
         }
 
@@ -141,7 +135,7 @@ router.get("/api/status-page/:slug/manifest.json", cache("1440 minutes"), async
         });
 
     } catch (error) {
-        send403(response, error.message);
+        sendHttpError(response, error.message);
     }
 });
 
diff --git a/server/util-server.js b/server/util-server.js
index edce2890..c83c8cd1 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -730,15 +730,27 @@ exports.filterAndJoin = (parts, connector = "") => {
 };
 
 /**
- * Send a 403 response
+ * Send an Error response
  * @param {Object} res Express response object
  * @param {string} [msg=""] Message to send
  */
-module.exports.send403 = (res, msg = "") => {
-    res.status(403).json({
-        "status": "fail",
-        "msg": msg,
-    });
+module.exports.sendHttpError = (res, msg = "") => {
+    if (msg.includes("SQLITE_BUSY") || msg.includes("SQLITE_LOCKED")) {
+        res.status(503).json({
+            "status": "fail",
+            "msg": msg,
+        });
+    } else if (msg.toLowerCase().includes("not found")) {
+        res.status(404).json({
+            "status": "fail",
+            "msg": msg,
+        });
+    } else {
+        res.status(403).json({
+            "status": "fail",
+            "msg": msg,
+        });
+    }
 };
 
 function timeObjectConvertTimezone(obj, timezone, timeObjectToUTC = true) {

From 48b637d4c8c70ef1f55521bb34ec42037820c81a Mon Sep 17 00:00:00 2001
From: Bobby Ore <bobby.ore@while1.us>
Date: Thu, 9 Feb 2023 08:49:19 -0600
Subject: [PATCH 573/803] Refactor to not introduce a breaking change

---
 server/notification-providers/lunasea.js | 6 +++---
 src/components/notifications/LunaSea.vue | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/server/notification-providers/lunasea.js b/server/notification-providers/lunasea.js
index 0d9bb26a..3df6fe1a 100644
--- a/server/notification-providers/lunasea.js
+++ b/server/notification-providers/lunasea.js
@@ -9,10 +9,10 @@ class LunaSea extends NotificationProvider {
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
         let lunaseaurl = "";
-        if (notification.lunaseaNotificationType === "device") {
-            lunaseaurl = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaId;
+        if (notification.lunaseaNotificationType === "user") {
+            lunaseaurl = "https://notify.lunasea.app/v1/custom/user/" + notification.lunaseaDevice;
         } else {
-            lunaseaurl = "https://notify.lunasea.app/v1/custom/user/" + notification.lunaseaId;
+            lunaseaurl = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaDevice;
         }
 
         try {
diff --git a/src/components/notifications/LunaSea.vue b/src/components/notifications/LunaSea.vue
index 57947183..230e3b0d 100644
--- a/src/components/notifications/LunaSea.vue
+++ b/src/components/notifications/LunaSea.vue
@@ -10,7 +10,7 @@
             </p>
         </div>
         <label for="lunasea-device" class="form-label">{{ $t("LunaSea ID") }}<span style="color: red;"><sup>*</sup></span></label>
-        <input id="lunasea-device" v-model="$parent.notification.lunaseaId" type="text" class="form-control" required>
+        <input id="lunasea-device" v-model="$parent.notification.lunaseaDevice" type="text" class="form-control" required>
         <div class="form-text">
             <p><span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}</p>
         </div>

From c12b06348b500834d3f6ae9b242d180f062d59d3 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 10 Feb 2023 17:29:32 +0800
Subject: [PATCH 574/803] Fix parsing issues of status page's og tags

---
 server/model/status_page.js | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/server/model/status_page.js b/server/model/status_page.js
index d7185a2e..84af99e8 100644
--- a/server/model/status_page.js
+++ b/server/model/status_page.js
@@ -60,8 +60,11 @@ class StatusPage extends BeanModel {
         }
 
         // OG Meta Tags
-        head.append(`<meta property="og:title" content="${statusPage.title}" />`);
-        head.append(`<meta property="og:description" content="${description155}" />`);
+        let ogTitle = $("<meta property=\"og:title\" content=\"\" />").attr("content", statusPage.title);
+        head.append(ogTitle);
+
+        let ogDescription = $("<meta property=\"og:description\" content=\"\" />").attr("content", description155);
+        head.append(ogDescription);
 
         // Preload data
         // Add jsesc, fix https://github.com/louislam/uptime-kuma/issues/2186

From cb953361b149397ba0b5ad168d963fc4a9079bad Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 10 Feb 2023 17:46:44 +0800
Subject: [PATCH 575/803] Update SECURITY.md

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

diff --git a/SECURITY.md b/SECURITY.md
index 657aa3eb..c30e5f4f 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -6,6 +6,10 @@ Please report security issues to https://github.com/louislam/uptime-kuma/securit
 
 Do not use the public issue tracker or discuss it in the public as it will cause more damage.
 
+## Do you accept other 3rd-party bug bounty platforms?
+
+At this moment, I DO NOT accept other bug bounty platforms, because I am not familiar with these platforms and someone have tried to send a phishing link to me by this already. To minimize my own risk, please report through GitHub Advisories only. I will ignore all 3rd-party bug bounty platforms emails.
+
 ## Supported Versions
 
 ### Uptime Kuma Versions

From c30e88ece2a654c27248b7d18709801d5ed479ba Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 10 Feb 2023 17:52:08 +0800
Subject: [PATCH 576/803] Update dependencies

---
 package-lock.json | 3184 ++++++++++++++++++++++++---------------------
 1 file changed, 1693 insertions(+), 1491 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index fec23fe9..5d172288 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.19.6",
+    "version": "1.20.0-beta.0",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.19.6",
+            "version": "1.20.0-beta.0",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
@@ -176,9 +176,9 @@
             }
         },
         "node_modules/@aws-crypto/ie11-detection": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz",
-            "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
+            "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
             "optional": true,
             "dependencies": {
                 "tslib": "^1.11.1"
@@ -191,16 +191,16 @@
             "optional": true
         },
         "node_modules/@aws-crypto/sha256-browser": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
-            "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
+            "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
             "optional": true,
             "dependencies": {
-                "@aws-crypto/ie11-detection": "^2.0.0",
-                "@aws-crypto/sha256-js": "^2.0.0",
-                "@aws-crypto/supports-web-crypto": "^2.0.0",
-                "@aws-crypto/util": "^2.0.0",
-                "@aws-sdk/types": "^3.1.0",
+                "@aws-crypto/ie11-detection": "^3.0.0",
+                "@aws-crypto/sha256-js": "^3.0.0",
+                "@aws-crypto/supports-web-crypto": "^3.0.0",
+                "@aws-crypto/util": "^3.0.0",
+                "@aws-sdk/types": "^3.222.0",
                 "@aws-sdk/util-locate-window": "^3.0.0",
                 "@aws-sdk/util-utf8-browser": "^3.0.0",
                 "tslib": "^1.11.1"
@@ -213,13 +213,13 @@
             "optional": true
         },
         "node_modules/@aws-crypto/sha256-js": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
-            "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
+            "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
             "optional": true,
             "dependencies": {
-                "@aws-crypto/util": "^2.0.0",
-                "@aws-sdk/types": "^3.1.0",
+                "@aws-crypto/util": "^3.0.0",
+                "@aws-sdk/types": "^3.222.0",
                 "tslib": "^1.11.1"
             }
         },
@@ -230,9 +230,9 @@
             "optional": true
         },
         "node_modules/@aws-crypto/supports-web-crypto": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz",
-            "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
+            "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
             "optional": true,
             "dependencies": {
                 "tslib": "^1.11.1"
@@ -245,12 +245,12 @@
             "optional": true
         },
         "node_modules/@aws-crypto/util": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz",
-            "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
+            "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "^3.110.0",
+                "@aws-sdk/types": "^3.222.0",
                 "@aws-sdk/util-utf8-browser": "^3.0.0",
                 "tslib": "^1.11.1"
             }
@@ -262,12 +262,12 @@
             "optional": true
         },
         "node_modules/@aws-sdk/abort-controller": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz",
-            "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.267.0.tgz",
+            "integrity": "sha512-5R7OSnHFV/f+qQpMf1RuSQoVdXroK94Vl6naWjMOAhMyofHykVhEok9hmFPac86AVx8rVX/vuA7u9GKI6/EE7g==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -275,46 +275,45 @@
             }
         },
         "node_modules/@aws-sdk/client-cognito-identity": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.245.0.tgz",
-            "integrity": "sha512-c5briTS05rAioO5b84bVng9M1KyAXcxJtDHeuoeAAZBuU+Dd0Scg3vyXyAFlGI+TsNyxqHAqqRdAoG4WNxJo/Q==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.267.0.tgz",
+            "integrity": "sha512-jEE5aw7wp7VhiaU0vCbNQbEIhiaNZnBhRj+vJVCd2HQBI9IVLVXAoyExWxLruAXKEO+A1w1df+fwZAOo0M7aQQ==",
             "optional": true,
             "dependencies": {
-                "@aws-crypto/sha256-browser": "2.0.0",
-                "@aws-crypto/sha256-js": "2.0.0",
-                "@aws-sdk/client-sts": "3.245.0",
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/credential-provider-node": "3.245.0",
-                "@aws-sdk/fetch-http-handler": "3.226.0",
-                "@aws-sdk/hash-node": "3.226.0",
-                "@aws-sdk/invalid-dependency": "3.226.0",
-                "@aws-sdk/middleware-content-length": "3.226.0",
-                "@aws-sdk/middleware-endpoint": "3.226.0",
-                "@aws-sdk/middleware-host-header": "3.226.0",
-                "@aws-sdk/middleware-logger": "3.226.0",
-                "@aws-sdk/middleware-recursion-detection": "3.226.0",
-                "@aws-sdk/middleware-retry": "3.235.0",
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/middleware-signing": "3.226.0",
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/middleware-user-agent": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/node-http-handler": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/smithy-client": "3.234.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/client-sts": "3.267.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "@aws-sdk/util-body-length-browser": "3.188.0",
                 "@aws-sdk/util-body-length-node": "3.208.0",
-                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
-                "@aws-sdk/util-defaults-mode-node": "3.234.0",
-                "@aws-sdk/util-endpoints": "3.245.0",
-                "@aws-sdk/util-retry": "3.229.0",
-                "@aws-sdk/util-user-agent-browser": "3.226.0",
-                "@aws-sdk/util-user-agent-node": "3.226.0",
-                "@aws-sdk/util-utf8-browser": "3.188.0",
-                "@aws-sdk/util-utf8-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -322,43 +321,42 @@
             }
         },
         "node_modules/@aws-sdk/client-sso": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.245.0.tgz",
-            "integrity": "sha512-dxzRwRo55ZNQ4hQigC+cishxLSWlBrbr3iszG0FLviavLDOlnVG5UUxWpOIGvwr8pYiSfM4jnfMxiwYwiCLg1g==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.267.0.tgz",
+            "integrity": "sha512-/475/mT0gYhimpCdK4iZW+eX0DT6mkTgVk5P9ARpQGzEblFM6i2pE7GQnlGeLyHVOtA0cNAyGrWUuj2pyigUaA==",
             "optional": true,
             "dependencies": {
-                "@aws-crypto/sha256-browser": "2.0.0",
-                "@aws-crypto/sha256-js": "2.0.0",
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/fetch-http-handler": "3.226.0",
-                "@aws-sdk/hash-node": "3.226.0",
-                "@aws-sdk/invalid-dependency": "3.226.0",
-                "@aws-sdk/middleware-content-length": "3.226.0",
-                "@aws-sdk/middleware-endpoint": "3.226.0",
-                "@aws-sdk/middleware-host-header": "3.226.0",
-                "@aws-sdk/middleware-logger": "3.226.0",
-                "@aws-sdk/middleware-recursion-detection": "3.226.0",
-                "@aws-sdk/middleware-retry": "3.235.0",
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/middleware-user-agent": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/node-http-handler": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/smithy-client": "3.234.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "@aws-sdk/util-body-length-browser": "3.188.0",
                 "@aws-sdk/util-body-length-node": "3.208.0",
-                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
-                "@aws-sdk/util-defaults-mode-node": "3.234.0",
-                "@aws-sdk/util-endpoints": "3.245.0",
-                "@aws-sdk/util-retry": "3.229.0",
-                "@aws-sdk/util-user-agent-browser": "3.226.0",
-                "@aws-sdk/util-user-agent-node": "3.226.0",
-                "@aws-sdk/util-utf8-browser": "3.188.0",
-                "@aws-sdk/util-utf8-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -366,43 +364,42 @@
             }
         },
         "node_modules/@aws-sdk/client-sso-oidc": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.245.0.tgz",
-            "integrity": "sha512-0pGPA00kEsu2Yq1Ul+OwftHxws5YVllm4iZrPtGnqmXr7wmf6B9lOtrMQF44y7Tfw53po6+bKz08OKTEWkkjUA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.267.0.tgz",
+            "integrity": "sha512-Jdq0v0mJSJbG/CKLfHC1L0cjCot48Y6lLMQV1lfkYE65xD0ZSs8Gl7P/T391ZH7cLO6ifVoPdsYnwzhi1ZPXSQ==",
             "optional": true,
             "dependencies": {
-                "@aws-crypto/sha256-browser": "2.0.0",
-                "@aws-crypto/sha256-js": "2.0.0",
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/fetch-http-handler": "3.226.0",
-                "@aws-sdk/hash-node": "3.226.0",
-                "@aws-sdk/invalid-dependency": "3.226.0",
-                "@aws-sdk/middleware-content-length": "3.226.0",
-                "@aws-sdk/middleware-endpoint": "3.226.0",
-                "@aws-sdk/middleware-host-header": "3.226.0",
-                "@aws-sdk/middleware-logger": "3.226.0",
-                "@aws-sdk/middleware-recursion-detection": "3.226.0",
-                "@aws-sdk/middleware-retry": "3.235.0",
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/middleware-user-agent": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/node-http-handler": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/smithy-client": "3.234.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "@aws-sdk/util-body-length-browser": "3.188.0",
                 "@aws-sdk/util-body-length-node": "3.208.0",
-                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
-                "@aws-sdk/util-defaults-mode-node": "3.234.0",
-                "@aws-sdk/util-endpoints": "3.245.0",
-                "@aws-sdk/util-retry": "3.229.0",
-                "@aws-sdk/util-user-agent-browser": "3.226.0",
-                "@aws-sdk/util-user-agent-node": "3.226.0",
-                "@aws-sdk/util-utf8-browser": "3.188.0",
-                "@aws-sdk/util-utf8-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -410,46 +407,45 @@
             }
         },
         "node_modules/@aws-sdk/client-sts": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.245.0.tgz",
-            "integrity": "sha512-E+7v2sy34TLni/Dmz6bTU20NWvbHYH9sVUHKQ9kHhmFopUWrs4Nt77f85PbuiKJz/irjUh9ppT5q1odJNRKRVQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.267.0.tgz",
+            "integrity": "sha512-bJ+SwJZAP3DuDUgToDV89HsB80IhSfB1rhzLG9csqs6h7uMLO8H1/fymElYKT4VMMAA+rpWJ3pznyGiCK7w28A==",
             "optional": true,
             "dependencies": {
-                "@aws-crypto/sha256-browser": "2.0.0",
-                "@aws-crypto/sha256-js": "2.0.0",
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/credential-provider-node": "3.245.0",
-                "@aws-sdk/fetch-http-handler": "3.226.0",
-                "@aws-sdk/hash-node": "3.226.0",
-                "@aws-sdk/invalid-dependency": "3.226.0",
-                "@aws-sdk/middleware-content-length": "3.226.0",
-                "@aws-sdk/middleware-endpoint": "3.226.0",
-                "@aws-sdk/middleware-host-header": "3.226.0",
-                "@aws-sdk/middleware-logger": "3.226.0",
-                "@aws-sdk/middleware-recursion-detection": "3.226.0",
-                "@aws-sdk/middleware-retry": "3.235.0",
-                "@aws-sdk/middleware-sdk-sts": "3.226.0",
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/middleware-signing": "3.226.0",
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/middleware-user-agent": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/node-http-handler": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/smithy-client": "3.234.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-sdk-sts": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "@aws-sdk/util-body-length-browser": "3.188.0",
                 "@aws-sdk/util-body-length-node": "3.208.0",
-                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
-                "@aws-sdk/util-defaults-mode-node": "3.234.0",
-                "@aws-sdk/util-endpoints": "3.245.0",
-                "@aws-sdk/util-retry": "3.229.0",
-                "@aws-sdk/util-user-agent-browser": "3.226.0",
-                "@aws-sdk/util-user-agent-node": "3.226.0",
-                "@aws-sdk/util-utf8-browser": "3.188.0",
-                "@aws-sdk/util-utf8-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "fast-xml-parser": "4.0.11",
                 "tslib": "^2.3.1"
             },
@@ -458,15 +454,15 @@
             }
         },
         "node_modules/@aws-sdk/config-resolver": {
-            "version": "3.234.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz",
-            "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.267.0.tgz",
+            "integrity": "sha512-UMvJY548xOkamU9ZuZk336VX9r3035CAbttagiPJ/FXy9S8jcQ7N722PAovtxs69nNBQf56cmWsnOHphLCGG9w==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/signature-v4": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-config-provider": "3.208.0",
-                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-middleware": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -474,14 +470,14 @@
             }
         },
         "node_modules/@aws-sdk/credential-provider-cognito-identity": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.245.0.tgz",
-            "integrity": "sha512-DkiPv7Yb9iw3yAzvWUAkXrI23F1+kV8grdXzlSzob5suqv/dVON5pFXK9Siz62WwWsa2FeCEpgEF7RA0mrWLtA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.267.0.tgz",
+            "integrity": "sha512-H97VsbiTcb4tbY/LQMZNglJIHt7CHso7RtGgctmdsEA7Rha79fV/egF0Vqo2OQHDgEEpgQDWCeHbXO1P5ibR/A==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/client-cognito-identity": "3.245.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/client-cognito-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -489,13 +485,13 @@
             }
         },
         "node_modules/@aws-sdk/credential-provider-env": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz",
-            "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.267.0.tgz",
+            "integrity": "sha512-oiem2UtaFe4CQHscUCImJjPhYWd4iF8fqXhlq6BqHs1wsO6A0vnIUGh+Srut/2q7Xeegl/SRU34HK0hh8JCbxg==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -503,15 +499,15 @@
             }
         },
         "node_modules/@aws-sdk/credential-provider-imds": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz",
-            "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.267.0.tgz",
+            "integrity": "sha512-Afd5+LdJ9QyeI5L4iyVmI4MLV+0JBtRLmRy0LdinwJaP0DyKyv9+uaIaorKfWihQpe8hwjEfQWTlTz2A3JMJtw==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -519,19 +515,19 @@
             }
         },
         "node_modules/@aws-sdk/credential-provider-ini": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.245.0.tgz",
-            "integrity": "sha512-1SjfVc5Wg0lLRUvwMrfjGgFkl+zfxn74gnkPr6by1QyMAoTzmeUkalPLAIqd+uHtFom9e3K633BQtX7zVPZ5XQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.267.0.tgz",
+            "integrity": "sha512-pHHlqZqZXA4cTssTyRmbYtrjxS2BEy2KFYHEEHNUrd82pUHnj70n+lrpVnT5pRhPPDacpNzxq0KZGeNgmETpbw==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/credential-provider-env": "3.226.0",
-                "@aws-sdk/credential-provider-imds": "3.226.0",
-                "@aws-sdk/credential-provider-process": "3.226.0",
-                "@aws-sdk/credential-provider-sso": "3.245.0",
-                "@aws-sdk/credential-provider-web-identity": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -539,20 +535,20 @@
             }
         },
         "node_modules/@aws-sdk/credential-provider-node": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.245.0.tgz",
-            "integrity": "sha512-Dwv8zmRLTDLeEkGrK/sLNFZSC+ahXZxr07CuID054QKACIdUEvkqYlnalRiTeXngiHGQ54u8wU7f0D32R2oL0g==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.267.0.tgz",
+            "integrity": "sha512-uo8VyZ/L8HBXskYZC65bR1ZUJ5mBn8JarrGHt6vMG2A+uM7AuryTsKn2wdhPfuCUGKuQLXmix5K4VW/wzq11kQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/credential-provider-env": "3.226.0",
-                "@aws-sdk/credential-provider-imds": "3.226.0",
-                "@aws-sdk/credential-provider-ini": "3.245.0",
-                "@aws-sdk/credential-provider-process": "3.226.0",
-                "@aws-sdk/credential-provider-sso": "3.245.0",
-                "@aws-sdk/credential-provider-web-identity": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-ini": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -560,14 +556,14 @@
             }
         },
         "node_modules/@aws-sdk/credential-provider-process": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz",
-            "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.267.0.tgz",
+            "integrity": "sha512-pd1OOB1Mm+QdPv3sPfO+1G8HBaPAAYXxjLcOK5z/myBeZAsLR12Xcaft4RR1XWwXXKEQqq42cbAINWQdyVykqQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -575,16 +571,16 @@
             }
         },
         "node_modules/@aws-sdk/credential-provider-sso": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.245.0.tgz",
-            "integrity": "sha512-txWrJc0WNBhXMi7q+twjx7cs/qzgTfbQ+vbag5idRmdoUeiR8rfLvihCab2NaGg50xhh+TaoUCXrgJp3E/XjYQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.267.0.tgz",
+            "integrity": "sha512-JqwxelzeRhVdloNi+VUUXhJdziTtNrrwMuhds9wj4KPfl1S2EIzkRxHSjwDz1wtSyuIPOOo6pPJiaVbwvLpkVg==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/client-sso": "3.245.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/token-providers": "3.245.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/client-sso": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/token-providers": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -592,13 +588,13 @@
             }
         },
         "node_modules/@aws-sdk/credential-provider-web-identity": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz",
-            "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.267.0.tgz",
+            "integrity": "sha512-za5UsQmj3sYRhd4h5eStj3GCHHfAAjfx2x5FmgQ9ldOp+s0wHEqSL1g+OL9v6o8otf9JnWha+wfUYq3yVGfufQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -606,25 +602,25 @@
             }
         },
         "node_modules/@aws-sdk/credential-providers": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.245.0.tgz",
-            "integrity": "sha512-6Uhsxk6MOuWplejhPJf7XDhegHmcZfj8hwnF4mXFJ6u4b2RxWPQCnqPcA0+VoAzIMUqbjqvkSzmVjQelGFtjNg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.267.0.tgz",
+            "integrity": "sha512-Og70E1eHGcxShMbrmm8lOepF82Hg5Fe7WXv0pnUKFFUxr+pf89bCjxGwktZIDM7ZMMXGIyladeIgTjsJkhpjRQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/client-cognito-identity": "3.245.0",
-                "@aws-sdk/client-sso": "3.245.0",
-                "@aws-sdk/client-sts": "3.245.0",
-                "@aws-sdk/credential-provider-cognito-identity": "3.245.0",
-                "@aws-sdk/credential-provider-env": "3.226.0",
-                "@aws-sdk/credential-provider-imds": "3.226.0",
-                "@aws-sdk/credential-provider-ini": "3.245.0",
-                "@aws-sdk/credential-provider-node": "3.245.0",
-                "@aws-sdk/credential-provider-process": "3.226.0",
-                "@aws-sdk/credential-provider-sso": "3.245.0",
-                "@aws-sdk/credential-provider-web-identity": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/client-cognito-identity": "3.267.0",
+                "@aws-sdk/client-sso": "3.267.0",
+                "@aws-sdk/client-sts": "3.267.0",
+                "@aws-sdk/credential-provider-cognito-identity": "3.267.0",
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-ini": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -632,26 +628,27 @@
             }
         },
         "node_modules/@aws-sdk/fetch-http-handler": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz",
-            "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.267.0.tgz",
+            "integrity": "sha512-u8v8OvWvLVfifmETCAj+DCTot900AsdO1b+N+O8nXiTm2v99rtEoNRJW+no/5vJKNqR+95OAz4NWjFep8nzseg==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/querystring-builder": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/querystring-builder": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "tslib": "^2.3.1"
             }
         },
         "node_modules/@aws-sdk/hash-node": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz",
-            "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.267.0.tgz",
+            "integrity": "sha512-N3xeChdJg4V4jh2vrRN521EMJYxjUOo/LpvpisFyQHE/p31AfcOLb05upYFoYLvyeder9RHBIyNsvvnMYYoCsA==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-buffer-from": "3.208.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -659,12 +656,12 @@
             }
         },
         "node_modules/@aws-sdk/invalid-dependency": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz",
-            "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.267.0.tgz",
+            "integrity": "sha512-I95IR/eDLC54+9qrL6uh64nhpLVHwxxbBhhEUZKDACp86eXulO8T/DOwUX31ps4+2lI7tbEhQT7f9WDOO3fN8Q==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
@@ -681,13 +678,13 @@
             }
         },
         "node_modules/@aws-sdk/middleware-content-length": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz",
-            "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.267.0.tgz",
+            "integrity": "sha512-b6MBIK12iwcATKnWIhsh50xWVMmZOXZFIo9D4io6D+JM6j/U+GZrSWqxhHzb3SjavuwVgA2hwq4mUCh2WJPJKA==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -695,18 +692,18 @@
             }
         },
         "node_modules/@aws-sdk/middleware-endpoint": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz",
-            "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.267.0.tgz",
+            "integrity": "sha512-pGICM/qlQVfixtfKZt8zHq54KvLG2MmOAgNWj2MXB7oirPs/3rC9Kz9ITFXJgjlRFyfssgP/feKhs2yZkI8lhw==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/signature-v4": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-config-provider": "3.208.0",
-                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-middleware": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -714,13 +711,13 @@
             }
         },
         "node_modules/@aws-sdk/middleware-host-header": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz",
-            "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.267.0.tgz",
+            "integrity": "sha512-D8TfjMeuQXTsB7Ni8liMmNqb3wz+T6t/tYUHtsMo0j++94KAPPj1rhkkTAjR4Rc+IYGCS4YyyCuCXjGB6gkjnA==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -728,12 +725,12 @@
             }
         },
         "node_modules/@aws-sdk/middleware-logger": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz",
-            "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.267.0.tgz",
+            "integrity": "sha512-wnLeZYWbgGCuNmRl0Pmky0cSXBWmMTaQBgq90WfwyM0V8wzcoeaovTWA5/qe8oJzusOgUMFoVia4Ew20k3lu8w==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -741,13 +738,13 @@
             }
         },
         "node_modules/@aws-sdk/middleware-recursion-detection": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz",
-            "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.267.0.tgz",
+            "integrity": "sha512-NCBkTLxaW7XtfQoVBqQCaQZqec5XDtEylkw7g0tGjYDcl934fzu3ciH9MsJ34QFe9slYM6g4v+eC9f1w9K/19g==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -755,16 +752,16 @@
             }
         },
         "node_modules/@aws-sdk/middleware-retry": {
-            "version": "3.235.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz",
-            "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.267.0.tgz",
+            "integrity": "sha512-MiiNtddZXVhtSAnJFyChwNxnhzMYmv6qWl8qgSjuIOw9SczkHPCoANTfUdRlzG6RfPYhgYtzMGqqnrficJ6mVg==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/service-error-classification": "3.229.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/util-middleware": "3.226.0",
-                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/service-error-classification": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
                 "tslib": "^2.3.1",
                 "uuid": "^8.3.2"
             },
@@ -773,16 +770,16 @@
             }
         },
         "node_modules/@aws-sdk/middleware-sdk-sts": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz",
-            "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.267.0.tgz",
+            "integrity": "sha512-JLDNNvV7Hr0CQrf1vSmflvPbfDFIx5lFf8tY7DZwYWEE920ZzbJTfUsTW9iZHJGeIe8dAQX1tmfYL68+++nvEQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/middleware-signing": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/signature-v4": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -790,12 +787,12 @@
             }
         },
         "node_modules/@aws-sdk/middleware-serde": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz",
-            "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.267.0.tgz",
+            "integrity": "sha512-9qspxiZs+JShukzKMAameBSubfvtUOGZviu9GT5OfRekY2dBbwWcfchP2WvlwxZ/CcC+GwO1HcPqKDCMGsNoow==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -803,16 +800,16 @@
             }
         },
         "node_modules/@aws-sdk/middleware-signing": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz",
-            "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.267.0.tgz",
+            "integrity": "sha512-thkFEBiFW0M/73dIzl7hQmyAONb8zyD2ZYUFyGm7cIM60sRDUKejPHV6Izonll+HbBZgiBdwUi42uu8O+LfFGQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/signature-v4": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-middleware": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -820,9 +817,9 @@
             }
         },
         "node_modules/@aws-sdk/middleware-stack": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz",
-            "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.267.0.tgz",
+            "integrity": "sha512-52uH3JO3ceI15dgzt8gU7lpJf59qbRUQYJ7pAmTMiHtyEawZ39Puv6sGheY3fAffhqd/aQvup6wn18Q1fRIQUA==",
             "optional": true,
             "dependencies": {
                 "tslib": "^2.3.1"
@@ -832,13 +829,13 @@
             }
         },
         "node_modules/@aws-sdk/middleware-user-agent": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz",
-            "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.267.0.tgz",
+            "integrity": "sha512-eaReMnoB1Cx3OY8WDSiUMNDz/EkdAo4w/m3d5CizckKQNmB29gUrgyFs7g7sHTcShQAduZzlsfRPzc6NmKYaWQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -846,14 +843,14 @@
             }
         },
         "node_modules/@aws-sdk/node-config-provider": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz",
-            "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.267.0.tgz",
+            "integrity": "sha512-wNX+Cu0x+kllng253j5dvmLm4opDRr7YehJ0rNGAV24X+UPJPluN9HrBFly+z4+bH16TpJEPKx7AayiWZGFE1w==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -861,15 +858,15 @@
             }
         },
         "node_modules/@aws-sdk/node-http-handler": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz",
-            "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.267.0.tgz",
+            "integrity": "sha512-wtt3O+e8JEKaLFtmQd74HSZj2TyiApPkwMJ3R50hyboVswt8RcdMWdFbzLnPVpT1AqskG3fMECSKbu8AC/xvBQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/abort-controller": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/querystring-builder": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/abort-controller": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/querystring-builder": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -877,12 +874,12 @@
             }
         },
         "node_modules/@aws-sdk/property-provider": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz",
-            "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.267.0.tgz",
+            "integrity": "sha512-/BD1Zar9PCQSV8VZTAWOJmtojAeMIl16ljZX3Kix84r45qqNNxuPST2AhNVN+p97Js4x9kBFCHkdFOpW94wr4Q==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -890,12 +887,12 @@
             }
         },
         "node_modules/@aws-sdk/protocol-http": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz",
-            "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.267.0.tgz",
+            "integrity": "sha512-8HhOZXMCZ0nsJC/FoifX7YrTYGP91tCpSxIHkr7HxQcTdBMI7QakMtIIWK9Qjsy6tUI98aAdEo5PNCbzdpozmQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -903,12 +900,12 @@
             }
         },
         "node_modules/@aws-sdk/querystring-builder": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz",
-            "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.267.0.tgz",
+            "integrity": "sha512-SKo8V3oPV1wZy4r4lccH7R2LT0PUK/WGaXkKR30wyrtDjJRWVJDYef9ysOpRP+adCTt3G5XO0SzyPQUW5dXYVA==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-uri-escape": "3.201.0",
                 "tslib": "^2.3.1"
             },
@@ -917,12 +914,12 @@
             }
         },
         "node_modules/@aws-sdk/querystring-parser": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz",
-            "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.267.0.tgz",
+            "integrity": "sha512-Krq36GXqEfRfzJ9wOzkkzpbb4SWjgSYydTIgK6KtKapme0HPcB24kmmsjsUVuHzKuQMCHHDRWm+b47iBmHGpSQ==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -930,21 +927,21 @@
             }
         },
         "node_modules/@aws-sdk/service-error-classification": {
-            "version": "3.229.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.229.0.tgz",
-            "integrity": "sha512-dnzWWQ0/NoWMUZ5C0DW3dPm0wC1O76Y/SpKbuJzWPkx1EYy6r8p32Ly4D9vUzrKDbRGf48YHIF2kOkBmu21CLg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.267.0.tgz",
+            "integrity": "sha512-fOWg7bcItmJqD/YQbGvN9o03ucoBzvWNTQEB81mLKMSKr1Cf/ms0f8oa94LlImgqjjfjvAqHh6rUBTpSmSEyaw==",
             "optional": true,
             "engines": {
                 "node": ">=14.0.0"
             }
         },
         "node_modules/@aws-sdk/shared-ini-file-loader": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz",
-            "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.267.0.tgz",
+            "integrity": "sha512-Jz9R5hXKSk+aRoBKi4Bnf6T/FZUBYrIibbLnhiNxpQ1FY9mTggJR/rxuIdOE23LtfW+CRqqEYOtAtmC1oYE6tw==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -952,16 +949,17 @@
             }
         },
         "node_modules/@aws-sdk/signature-v4": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz",
-            "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.267.0.tgz",
+            "integrity": "sha512-Je1e7rum2zvxa3jWfwq4E+fyBdFJmSJAwGtWYz3+/rWipwXFlSAPeSVqtNjHdfzakgabvzLp7aesG4yQTrO2YQ==",
             "optional": true,
             "dependencies": {
                 "@aws-sdk/is-array-buffer": "3.201.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-hex-encoding": "3.201.0",
-                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-middleware": "3.267.0",
                 "@aws-sdk/util-uri-escape": "3.201.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -969,13 +967,13 @@
             }
         },
         "node_modules/@aws-sdk/smithy-client": {
-            "version": "3.234.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz",
-            "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.267.0.tgz",
+            "integrity": "sha512-WdgXHqKmFQIkAWETO/I5boX9u6QbMLC4X74OVSBaBLhRjqYmvolMFtNrQzvSKGB3FaxAN9Do41amC0mGoeLC8A==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -983,15 +981,15 @@
             }
         },
         "node_modules/@aws-sdk/token-providers": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.245.0.tgz",
-            "integrity": "sha512-m/spXR/vEXGb+zMqRUMQYVMwFZSTdK5RkddYqamYkNhIoLm60EYeRu57JsMMs5djKi8dBRSKiXwVHx0l2rXMjg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.267.0.tgz",
+            "integrity": "sha512-CGayGrPl4ONG4RuGbNv+QS4oVuItx4hK2FCbFS7d6V7h53rkDrcFd34NsvbicQ2KVFobE7fKs6ZaripJbJbLHA==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/client-sso-oidc": "3.245.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/client-sso-oidc": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -999,9 +997,9 @@
             }
         },
         "node_modules/@aws-sdk/types": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz",
-            "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.267.0.tgz",
+            "integrity": "sha512-fICTbSeIfXlTHnciQgDt37R0kXoKxgh0a3prnLWVvTcmf7NFujdZmg5YTAZT3KJJ7SuKsIgnI8azBYioVY8BVQ==",
             "optional": true,
             "dependencies": {
                 "tslib": "^2.3.1"
@@ -1011,13 +1009,13 @@
             }
         },
         "node_modules/@aws-sdk/url-parser": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz",
-            "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.267.0.tgz",
+            "integrity": "sha512-xoQ5Fd11moiE82QTL9GGE6e73SFuD0Wi73tA75TAwKuY12OP5vDJ4oBC86A1G2T+OzeHJQmYyqiA5j48CzqB6A==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/querystring-parser": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/querystring-parser": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
@@ -1081,13 +1079,13 @@
             }
         },
         "node_modules/@aws-sdk/util-defaults-mode-browser": {
-            "version": "3.234.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz",
-            "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.267.0.tgz",
+            "integrity": "sha512-MgrqpedA58HVR8RpT2A42//5Lb3M0JwEiYlDaA7EvIVsMx1NzO+cng4MDJi03YBAP5hwCVQmO9Sf5Au4dm+m0g==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "bowser": "^2.11.0",
                 "tslib": "^2.3.1"
             },
@@ -1096,16 +1094,16 @@
             }
         },
         "node_modules/@aws-sdk/util-defaults-mode-node": {
-            "version": "3.234.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz",
-            "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.267.0.tgz",
+            "integrity": "sha512-JyFk95T77sGM4q386id/mDt9/7HvoQySAygPyv/lj//WEJJIRKiefB277CKKJPT8nRAsO4mIyAT+YO/xGCxkQA==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/credential-provider-imds": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -1113,12 +1111,12 @@
             }
         },
         "node_modules/@aws-sdk/util-endpoints": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.245.0.tgz",
-            "integrity": "sha512-UNOFquB1tKx+8RT8n82Zb5tIwDyZHVPBg/m0LB0RsLETjr6krien5ASpqWezsXKIR1hftN9uaxN4bvf2dZrWHg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.267.0.tgz",
+            "integrity": "sha512-c6miY83Eo0erqXY+YiS2sOg3izURqvaWHd9przJzBQea9XRCN4ANT2P8AhoC0BPIORutaaOSoCSp/crHG0XLLg==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -1150,9 +1148,9 @@
             }
         },
         "node_modules/@aws-sdk/util-middleware": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz",
-            "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.267.0.tgz",
+            "integrity": "sha512-7nvqBZVz3RdwYv6lU958g6sWI2Qt8lzxDVn0uwfnPH+fAiX7Ln1Hen2A0XeW5cL5uYUJy6wNM5cyfTzFZosE0A==",
             "optional": true,
             "dependencies": {
                 "tslib": "^2.3.1"
@@ -1162,12 +1160,12 @@
             }
         },
         "node_modules/@aws-sdk/util-retry": {
-            "version": "3.229.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.229.0.tgz",
-            "integrity": "sha512-0zKTqi0P1inD0LzIMuXRIYYQ/8c1lWMg/cfiqUcIAF1TpatlpZuN7umU0ierpBFud7S+zDgg0oemh+Nj8xliJw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.267.0.tgz",
+            "integrity": "sha512-ZXo1ICG2HgxkIZWlnPteh2R90kwmhRwvbP282CwrrYgTKuMZmW2R/+o6vqhWyPkjoNFN/pno0FxuDA3IYau3Sw==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/service-error-classification": "3.229.0",
+                "@aws-sdk/service-error-classification": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -1187,24 +1185,24 @@
             }
         },
         "node_modules/@aws-sdk/util-user-agent-browser": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz",
-            "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.267.0.tgz",
+            "integrity": "sha512-SmI6xInnPPa0gFhCqhtWOUMTxLeRbm7X5HXzeprhK1d8aNNlUVyALAV7K8ovIjnv3a97lIJSekyb78oTuYITCA==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "bowser": "^2.11.0",
                 "tslib": "^2.3.1"
             }
         },
         "node_modules/@aws-sdk/util-user-agent-node": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz",
-            "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.267.0.tgz",
+            "integrity": "sha512-nfmyffA1yIypJ30CIMO6Tc16t8dFJzdztzoowjmnfb8/LzTZECERM3GICq0DvZDPfSo+jbuz634VtS2K7tVZjA==",
             "optional": true,
             "dependencies": {
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             },
             "engines": {
@@ -1219,19 +1217,10 @@
                 }
             }
         },
-        "node_modules/@aws-sdk/util-utf8-browser": {
-            "version": "3.188.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz",
-            "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==",
-            "optional": true,
-            "dependencies": {
-                "tslib": "^2.3.1"
-            }
-        },
-        "node_modules/@aws-sdk/util-utf8-node": {
-            "version": "3.208.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz",
-            "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==",
+        "node_modules/@aws-sdk/util-utf8": {
+            "version": "3.254.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz",
+            "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==",
             "optional": true,
             "dependencies": {
                 "@aws-sdk/util-buffer-from": "3.208.0",
@@ -1241,6 +1230,15 @@
                 "node": ">=14.0.0"
             }
         },
+        "node_modules/@aws-sdk/util-utf8-browser": {
+            "version": "3.259.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+            "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.3.1"
+            }
+        },
         "node_modules/@azure/abort-controller": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
@@ -1265,9 +1263,9 @@
             }
         },
         "node_modules/@azure/core-client": {
-            "version": "1.6.1",
-            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.1.tgz",
-            "integrity": "sha512-mZ1MSKhZBYoV8GAWceA+PEJFWV2VpdNSpxxcj1wjIAOi00ykRuIQChT99xlQGZWLY3/NApWhSImlFwsmCEs4vA==",
+            "version": "1.7.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.7.1.tgz",
+            "integrity": "sha512-85igXpc5V7ns6rvMEpLmIcBDftjUgTWD+0tmYPyQEfPfkAwpPTs1X5rhCDsfqvUZGA8Ksid1hdZGu62r6XXeHg==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -1278,7 +1276,7 @@
                 "tslib": "^2.2.0"
             },
             "engines": {
-                "node": ">=12.0.0"
+                "node": ">=14.0.0"
             }
         },
         "node_modules/@azure/core-http-compat": {
@@ -1295,22 +1293,22 @@
             }
         },
         "node_modules/@azure/core-lro": {
-            "version": "2.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.4.0.tgz",
-            "integrity": "sha512-F65+rYkll1dpw3RGm8/SSiSj+/QkMeYDanzS/QKlM1dmuneVyXbO46C88V1MRHluLGdMP6qfD3vDRYALn0z0tQ==",
+            "version": "2.5.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.1.tgz",
+            "integrity": "sha512-JHQy/bA3NOz2WuzOi5zEk6n/TJdAropupxUT521JIJvW7EXV2YN2SFYZrf/2RHeD28QAClGdynYadZsbmP+nyQ==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/logger": "^1.0.0",
                 "tslib": "^2.2.0"
             },
             "engines": {
-                "node": ">=12.0.0"
+                "node": ">=14.0.0"
             }
         },
         "node_modules/@azure/core-paging": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.4.0.tgz",
-            "integrity": "sha512-tabFtZTg8D9XqZKEfNUOGh63SuYeOxmvH4GDcOJN+R1bZWZ1FZskctgY9Pmuwzhn+0Xvq9rmimK9hsvtLkeBsw==",
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz",
+            "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==",
             "dependencies": {
                 "tslib": "^2.2.0"
             },
@@ -1319,9 +1317,9 @@
             }
         },
         "node_modules/@azure/core-rest-pipeline": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.0.tgz",
-            "integrity": "sha512-m6c4iAalfaf6sytOOQhLKFprEHSkSjQuRgkW7MTMnAN+GENDDL4XZJp7WKFnq9VpKUE+ggq+rp5xX9GI93lumw==",
+            "version": "1.10.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz",
+            "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -1439,20 +1437,20 @@
             }
         },
         "node_modules/@azure/msal-browser": {
-            "version": "2.32.1",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.1.tgz",
-            "integrity": "sha512-2G3B12ZEIpiimi6/Yqq7KLk4ud1zZWoHvVd2kJ2VthN1HjMsZjdMUxeHkwMWaQ6RzO6mv9rZiuKmRX64xkXW9g==",
+            "version": "2.33.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.33.0.tgz",
+            "integrity": "sha512-c7CVh1tfUfxiWkEIhoIb11hL4PGo4hz0M+gMy34ATagAKdLK7qyEu/5AXJWAf5lz5eE+vQhm7+LKiuETrcXXGw==",
             "dependencies": {
-                "@azure/msal-common": "^9.0.1"
+                "@azure/msal-common": "^10.0.0"
             },
             "engines": {
                 "node": ">=0.8.0"
             }
         },
         "node_modules/@azure/msal-browser/node_modules/@azure/msal-common": {
-            "version": "9.0.1",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.1.tgz",
-            "integrity": "sha512-eNNHIW/cwPTZDWs9KtYgb1X6gtQ+cC+FGX2YN+t4AUVsBdUbqlMTnUs6/c/VBxC2AAGIhgLREuNnO3F66AN2zQ==",
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-10.0.0.tgz",
+            "integrity": "sha512-/LghpT93jsZLy55QzTsRZWMx6R1Mjc1Aktwps8sKSGE3WbrGwbSsh2uhDlpl6FMcKChYjJ0ochThWwwOodrQNg==",
             "engines": {
                 "node": ">=0.8.0"
             }
@@ -1466,11 +1464,11 @@
             }
         },
         "node_modules/@azure/msal-node": {
-            "version": "1.14.6",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.6.tgz",
-            "integrity": "sha512-em/qqFL5tLMxMPl9vormAs13OgZpmQoJbiQ/GlWr+BA77eCLoL+Ehr5xRHowYo+LFe5b+p+PJVkRvT+mLvOkwA==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.15.0.tgz",
+            "integrity": "sha512-fwC5M0c8pxOAzmScPbpx7j28YVTDebUaizlVF7bR0xvlU0r3VWW5OobCcr9ybqKS6wGyO7u4EhXJS9rjRWAuwA==",
             "dependencies": {
-                "@azure/msal-common": "^9.0.2",
+                "@azure/msal-common": "^10.0.0",
                 "jsonwebtoken": "^9.0.0",
                 "uuid": "^8.3.0"
             },
@@ -1479,9 +1477,9 @@
             }
         },
         "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
-            "version": "9.0.2",
-            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.2.tgz",
-            "integrity": "sha512-qzwxuF8kZAp+rNUactMCgJh8fblq9D4lSqrrIxMDzLjgSZtjN32ix7r/HBe8QdOr76II9SVVPcMkX4sPzPfQ7w==",
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-10.0.0.tgz",
+            "integrity": "sha512-/LghpT93jsZLy55QzTsRZWMx6R1Mjc1Aktwps8sKSGE3WbrGwbSsh2uhDlpl6FMcKChYjJ0ochThWwwOodrQNg==",
             "engines": {
                 "node": ">=0.8.0"
             }
@@ -1499,34 +1497,34 @@
             }
         },
         "node_modules/@babel/compat-data": {
-            "version": "7.20.10",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz",
-            "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==",
+            "version": "7.20.14",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz",
+            "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/core": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz",
-            "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==",
+            "version": "7.20.12",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
+            "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
             "dev": true,
             "dependencies": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
                 "@babel/generator": "^7.20.7",
                 "@babel/helper-compilation-targets": "^7.20.7",
-                "@babel/helper-module-transforms": "^7.20.7",
+                "@babel/helper-module-transforms": "^7.20.11",
                 "@babel/helpers": "^7.20.7",
                 "@babel/parser": "^7.20.7",
                 "@babel/template": "^7.20.7",
-                "@babel/traverse": "^7.20.7",
+                "@babel/traverse": "^7.20.12",
                 "@babel/types": "^7.20.7",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
-                "json5": "^2.2.1",
+                "json5": "^2.2.2",
                 "semver": "^6.3.0"
             },
             "engines": {
@@ -1556,9 +1554,9 @@
             }
         },
         "node_modules/@babel/generator": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
-            "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
+            "version": "7.20.14",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz",
+            "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==",
             "dev": true,
             "dependencies": {
                 "@babel/types": "^7.20.7",
@@ -1626,9 +1624,9 @@
             }
         },
         "node_modules/@babel/helper-create-class-features-plugin": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz",
-            "integrity": "sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w==",
+            "version": "7.20.12",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz",
+            "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
@@ -1637,6 +1635,7 @@
                 "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
                 "@babel/helper-replace-supers": "^7.20.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             },
             "engines": {
@@ -1903,13 +1902,13 @@
             }
         },
         "node_modules/@babel/helpers": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
-            "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz",
+            "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
             "dev": true,
             "dependencies": {
                 "@babel/template": "^7.20.7",
-                "@babel/traverse": "^7.20.7",
+                "@babel/traverse": "^7.20.13",
                 "@babel/types": "^7.20.7"
             },
             "engines": {
@@ -1931,9 +1930,9 @@
             }
         },
         "node_modules/@babel/parser": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
-            "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz",
+            "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==",
             "dev": true,
             "bin": {
                 "parser": "bin/babel-parser.js"
@@ -2502,9 +2501,9 @@
             }
         },
         "node_modules/@babel/plugin-transform-block-scoping": {
-            "version": "7.20.11",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz",
-            "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz",
+            "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==",
             "dev": true,
             "dependencies": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -3066,10 +3065,16 @@
                 "@babel/core": "^7.0.0-0"
             }
         },
+        "node_modules/@babel/regjsgen": {
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+            "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+            "dev": true
+        },
         "node_modules/@babel/runtime": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
-            "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
+            "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
             "dependencies": {
                 "regenerator-runtime": "^0.13.11"
             },
@@ -3078,9 +3083,9 @@
             }
         },
         "node_modules/@babel/standalone": {
-            "version": "7.20.11",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.11.tgz",
-            "integrity": "sha512-WUPlwwXFk3iViGE7QFVVp423eVtT+eoXu1940Xu4QJgqgHBF6WWtlwO1Ip5rIWQnp7OHrGdwrwKLtLhUVfOZbA==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.15.tgz",
+            "integrity": "sha512-B3LmZ1NHlTb2eFEaw8rftZc730Wh9MlmsH8ubb6IjsNoIk9+SQ2aAA0nrm/1806+PftPRAACPClmKTu8PG7Tew==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
@@ -3101,9 +3106,9 @@
             }
         },
         "node_modules/@babel/traverse": {
-            "version": "7.20.10",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz",
-            "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
+            "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.18.6",
@@ -3112,7 +3117,7 @@
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.20.7",
+                "@babel/parser": "^7.20.13",
                 "@babel/types": "^7.20.7",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
@@ -3160,9 +3165,9 @@
             }
         },
         "node_modules/@cypress/request": {
-            "version": "2.88.10",
-            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
-            "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
+            "version": "2.88.11",
+            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz",
+            "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
             "dev": true,
             "dependencies": {
                 "aws-sign2": "~0.7.0",
@@ -3178,7 +3183,7 @@
                 "json-stringify-safe": "~5.0.1",
                 "mime-types": "~2.1.19",
                 "performance-now": "^2.1.0",
-                "qs": "~6.5.2",
+                "qs": "~6.10.3",
                 "safe-buffer": "^5.1.2",
                 "tough-cookie": "~2.5.0",
                 "tunnel-agent": "^0.6.0",
@@ -3277,9 +3282,9 @@
             }
         },
         "node_modules/@eslint/eslintrc/node_modules/globals": {
-            "version": "13.19.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
-            "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
+            "version": "13.20.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+            "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -3353,9 +3358,9 @@
             }
         },
         "node_modules/@fortawesome/vue-fontawesome": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.2.tgz",
-            "integrity": "sha512-xHVtVY8ASUeEvgcA/7vULUesENhD+pi/EirRHdMBqooHlXBqK+yrV6d8tUye1m5UKQKVgYAHMhUBfOnoiwvc8Q==",
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz",
+            "integrity": "sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==",
             "dev": true,
             "peerDependencies": {
                 "@fortawesome/fontawesome-svg-core": "~1 || ~6",
@@ -4200,9 +4205,9 @@
             }
         },
         "node_modules/@js-joda/core": {
-            "version": "5.5.1",
-            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.1.tgz",
-            "integrity": "sha512-oTFmkyv5MhgkHdZhoe5lwRoKW0t4njPvK3g7ODvK/prkoC5bwylKcyQJMsmjvgHBXoy4u5iLnB5yQ7AljouHAA=="
+            "version": "5.5.2",
+            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.2.tgz",
+            "integrity": "sha512-retLUN4TwCJ0QJDi9OCJwYVaXAz93NeOkEtEQL98M2bykBOxmURlP0YlfsuE46kItOOVZIWRYC3KsSLhQ1R2Qw=="
         },
         "node_modules/@louislam/ping": {
             "version": "0.4.2-mod.1",
@@ -4644,13 +4649,13 @@
             }
         },
         "node_modules/@types/babel__core": {
-            "version": "7.1.20",
-            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
-            "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
+            "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
             "dev": true,
             "dependencies": {
-                "@babel/parser": "^7.1.0",
-                "@babel/types": "^7.0.0",
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7",
                 "@types/babel__generator": "*",
                 "@types/babel__template": "*",
                 "@types/babel__traverse": "*"
@@ -4748,20 +4753,20 @@
             }
         },
         "node_modules/@types/express": {
-            "version": "4.17.15",
-            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz",
-            "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==",
+            "version": "4.17.17",
+            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+            "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
             "dependencies": {
                 "@types/body-parser": "*",
-                "@types/express-serve-static-core": "^4.17.31",
+                "@types/express-serve-static-core": "^4.17.33",
                 "@types/qs": "*",
                 "@types/serve-static": "*"
             }
         },
         "node_modules/@types/express-serve-static-core": {
-            "version": "4.17.32",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz",
-            "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==",
+            "version": "4.17.33",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+            "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
             "dependencies": {
                 "@types/node": "*",
                 "@types/qs": "*",
@@ -4769,9 +4774,9 @@
             }
         },
         "node_modules/@types/graceful-fs": {
-            "version": "4.1.5",
-            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-            "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+            "version": "4.1.6",
+            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+            "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
             "dev": true,
             "dependencies": {
                 "@types/node": "*"
@@ -4866,9 +4871,9 @@
             "dev": true
         },
         "node_modules/@types/node": {
-            "version": "18.11.18",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
-            "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
+            "version": "18.13.0",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz",
+            "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg=="
         },
         "node_modules/@types/normalize-package-data": {
             "version": "2.4.1",
@@ -4998,39 +5003,39 @@
             }
         },
         "node_modules/@vue/compiler-core": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
-            "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
+            "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.45",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "node_modules/@vue/compiler-dom": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
-            "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
+            "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
             "dev": true,
             "dependencies": {
-                "@vue/compiler-core": "3.2.45",
-                "@vue/shared": "3.2.45"
+                "@vue/compiler-core": "3.2.47",
+                "@vue/shared": "3.2.47"
             }
         },
         "node_modules/@vue/compiler-sfc": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
-            "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
+            "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.45",
-                "@vue/compiler-dom": "3.2.45",
-                "@vue/compiler-ssr": "3.2.45",
-                "@vue/reactivity-transform": "3.2.45",
-                "@vue/shared": "3.2.45",
+                "@vue/compiler-core": "3.2.47",
+                "@vue/compiler-dom": "3.2.47",
+                "@vue/compiler-ssr": "3.2.47",
+                "@vue/reactivity-transform": "3.2.47",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7",
                 "postcss": "^8.1.10",
@@ -5047,19 +5052,19 @@
             }
         },
         "node_modules/@vue/compiler-ssr": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
-            "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
+            "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
             "dev": true,
             "dependencies": {
-                "@vue/compiler-dom": "3.2.45",
-                "@vue/shared": "3.2.45"
+                "@vue/compiler-dom": "3.2.47",
+                "@vue/shared": "3.2.47"
             }
         },
         "node_modules/@vue/devtools-api": {
-            "version": "6.4.5",
-            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz",
-            "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==",
+            "version": "6.5.0",
+            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
+            "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==",
             "dev": true
         },
         "node_modules/@vue/reactivity": {
@@ -5072,14 +5077,14 @@
             }
         },
         "node_modules/@vue/reactivity-transform": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
-            "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
+            "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.45",
-                "@vue/shared": "3.2.45",
+                "@vue/compiler-core": "3.2.47",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             }
@@ -5184,9 +5189,9 @@
             "dev": true
         },
         "node_modules/@vue/shared": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
-            "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
+            "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==",
             "dev": true
         },
         "node_modules/@vuepic/vue-datepicker": {
@@ -5228,9 +5233,9 @@
             }
         },
         "node_modules/acorn": {
-            "version": "8.8.1",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
-            "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
+            "version": "8.8.2",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+            "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
             "dev": true,
             "bin": {
                 "acorn": "bin/acorn"
@@ -5577,6 +5582,17 @@
                 "node": ">= 4.0.0"
             }
         },
+        "node_modules/available-typed-arrays": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+            "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/await-lock": {
             "version": "2.2.2",
             "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
@@ -5592,9 +5608,9 @@
             }
         },
         "node_modules/aws4": {
-            "version": "1.11.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-            "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+            "version": "1.12.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+            "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
             "devOptional": true
         },
         "node_modules/axios": {
@@ -5889,11 +5905,6 @@
                 "readable-stream": "~1.0.2"
             }
         },
-        "node_modules/barse/node_modules/isarray": {
-            "version": "0.0.1",
-            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-            "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
-        },
         "node_modules/barse/node_modules/readable-stream": {
             "version": "1.0.34",
             "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
@@ -6150,9 +6161,9 @@
             "dev": true
         },
         "node_modules/browserslist": {
-            "version": "4.21.4",
-            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
-            "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+            "version": "4.21.5",
+            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+            "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
             "dev": true,
             "funding": [
                 {
@@ -6165,10 +6176,10 @@
                 }
             ],
             "dependencies": {
-                "caniuse-lite": "^1.0.30001400",
-                "electron-to-chromium": "^1.4.251",
-                "node-releases": "^2.0.6",
-                "update-browserslist-db": "^1.0.9"
+                "caniuse-lite": "^1.0.30001449",
+                "electron-to-chromium": "^1.4.284",
+                "node-releases": "^2.0.8",
+                "update-browserslist-db": "^1.0.10"
             },
             "bin": {
                 "browserslist": "cli.js"
@@ -6274,13 +6285,13 @@
             }
         },
         "node_modules/cacheable-request": {
-            "version": "10.2.5",
-            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.5.tgz",
-            "integrity": "sha512-5RwYYCfzjNPsyJxb/QpaM0bfzx+kw5/YpDhZPm9oMIDntHFQ9YXeyV47ZvzlTE0XrrrbyO2UITJH4GF9eRLdXQ==",
+            "version": "10.2.7",
+            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.7.tgz",
+            "integrity": "sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==",
             "dependencies": {
                 "@types/http-cache-semantics": "^4.0.1",
                 "get-stream": "^6.0.1",
-                "http-cache-semantics": "^4.1.0",
+                "http-cache-semantics": "^4.1.1",
                 "keyv": "^4.5.2",
                 "mimic-response": "^4.0.0",
                 "normalize-url": "^8.0.0",
@@ -6357,10 +6368,19 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/camelcase-keys/node_modules/quick-lru": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+            "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/caniuse-lite": {
-            "version": "1.0.30001441",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
-            "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==",
+            "version": "1.0.30001451",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz",
+            "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==",
             "dev": true,
             "funding": [
                 {
@@ -7032,9 +7052,9 @@
             ]
         },
         "node_modules/content-type": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-            "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+            "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
             "engines": {
                 "node": ">= 0.6"
             }
@@ -7070,9 +7090,9 @@
             }
         },
         "node_modules/core-js-compat": {
-            "version": "3.27.1",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz",
-            "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==",
+            "version": "3.27.2",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz",
+            "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==",
             "dev": true,
             "dependencies": {
                 "browserslist": "^4.21.4"
@@ -7586,9 +7606,9 @@
             "dev": true
         },
         "node_modules/deepmerge": {
-            "version": "4.2.2",
-            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-            "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
+            "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==",
             "dev": true,
             "engines": {
                 "node": ">=0.10.0"
@@ -7865,9 +7885,9 @@
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
         },
         "node_modules/electron-to-chromium": {
-            "version": "1.4.284",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
-            "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+            "version": "1.4.294",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.294.tgz",
+            "integrity": "sha512-PuHZB3jEN7D8WPPjLmBQAsqQz8tWHlkkB4n0E2OYw8RwVdmBYV0Wn+rUFH8JqYyIRb4HQhhedgxlZL163wqLrQ==",
             "dev": true
         },
         "node_modules/emittery": {
@@ -7962,9 +7982,9 @@
             }
         },
         "node_modules/engine.io-parser": {
-            "version": "5.0.4",
-            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
-            "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
+            "version": "5.0.6",
+            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz",
+            "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==",
             "engines": {
                 "node": ">=10.0.0"
             }
@@ -8031,26 +8051,32 @@
             }
         },
         "node_modules/es-abstract": {
-            "version": "1.20.5",
-            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
-            "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
+            "version": "1.21.1",
+            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+            "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
             "dependencies": {
+                "available-typed-arrays": "^1.0.5",
                 "call-bind": "^1.0.2",
+                "es-set-tostringtag": "^2.0.1",
                 "es-to-primitive": "^1.2.1",
                 "function-bind": "^1.1.1",
                 "function.prototype.name": "^1.1.5",
                 "get-intrinsic": "^1.1.3",
                 "get-symbol-description": "^1.0.0",
+                "globalthis": "^1.0.3",
                 "gopd": "^1.0.1",
                 "has": "^1.0.3",
                 "has-property-descriptors": "^1.0.0",
+                "has-proto": "^1.0.1",
                 "has-symbols": "^1.0.3",
-                "internal-slot": "^1.0.3",
+                "internal-slot": "^1.0.4",
+                "is-array-buffer": "^3.0.1",
                 "is-callable": "^1.2.7",
                 "is-negative-zero": "^2.0.2",
                 "is-regex": "^1.1.4",
                 "is-shared-array-buffer": "^1.0.2",
                 "is-string": "^1.0.7",
+                "is-typed-array": "^1.1.10",
                 "is-weakref": "^1.0.2",
                 "object-inspect": "^1.12.2",
                 "object-keys": "^1.1.1",
@@ -8059,7 +8085,9 @@
                 "safe-regex-test": "^1.0.0",
                 "string.prototype.trimend": "^1.0.6",
                 "string.prototype.trimstart": "^1.0.6",
-                "unbox-primitive": "^1.0.2"
+                "typed-array-length": "^1.0.4",
+                "unbox-primitive": "^1.0.2",
+                "which-typed-array": "^1.1.9"
             },
             "engines": {
                 "node": ">= 0.4"
@@ -8088,6 +8116,19 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/es-set-tostringtag": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+            "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+            "dependencies": {
+                "get-intrinsic": "^1.1.3",
+                "has": "^1.0.3",
+                "has-tostringtag": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
         "node_modules/es-to-primitive": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
@@ -8803,9 +8844,9 @@
             }
         },
         "node_modules/eslint/node_modules/globals": {
-            "version": "13.19.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
-            "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
+            "version": "13.20.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+            "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
             "dev": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
@@ -9448,6 +9489,14 @@
                 }
             }
         },
+        "node_modules/for-each": {
+            "version": "0.3.3",
+            "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+            "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+            "dependencies": {
+                "is-callable": "^1.1.3"
+            }
+        },
         "node_modules/forever-agent": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -9504,6 +9553,12 @@
                 "readable-stream": "^2.0.0"
             }
         },
+        "node_modules/from2/node_modules/isarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+            "dev": true
+        },
         "node_modules/from2/node_modules/readable-stream": {
             "version": "2.3.7",
             "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -9626,9 +9681,9 @@
             }
         },
         "node_modules/gamedig": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.0.5.tgz",
-            "integrity": "sha512-ROwljeTH8fcF44wi+NfTBdYSmiwtI5f1CJyGUx1DGVDvx7w2bfTxYSwR8FFFLCpNr78mtSwhsBONz1WZ5ucVig==",
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.0.6.tgz",
+            "integrity": "sha512-h0k9n/e5vNrd9Mh2wyFUp2Vo7ABWbDkdBxKC6FNJLOZiU5d9Z29bntGeYbXtOkcRWoV6Q63wSAJ3jLWxYQkpZw==",
             "dependencies": {
                 "cheerio": "^1.0.0-rc.10",
                 "compressjs": "^1.0.2",
@@ -9720,9 +9775,9 @@
             }
         },
         "node_modules/get-intrinsic": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
-            "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+            "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
             "dependencies": {
                 "function-bind": "^1.1.1",
                 "has": "^1.0.3",
@@ -10080,6 +10135,17 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/has-proto": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+            "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/has-symbols": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
@@ -10204,9 +10270,9 @@
             }
         },
         "node_modules/http-cache-semantics": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-            "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+            "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
         },
         "node_modules/http-errors": {
             "version": "1.8.1",
@@ -10273,17 +10339,6 @@
                 "node": ">=10.19.0"
             }
         },
-        "node_modules/http2-wrapper/node_modules/quick-lru": {
-            "version": "5.1.1",
-            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
         "node_modules/https-proxy-agent": {
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -10314,9 +10369,9 @@
             }
         },
         "node_modules/hyperid": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.0.1.tgz",
-            "integrity": "sha512-I+tl7TS5nsoVhkxqX1rS3Qmqlq44eoPUcgPthW8v3IW8CvWL7lwtd6HQbkDUMrBKJTG0vgEaRsjT35imW/D+9Q==",
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.1.1.tgz",
+            "integrity": "sha512-RveV33kIksycSf7HLkq1sHB5wW0OwuX8ot8MYnY++gaaPXGFfKpBncHrAWxdpuEeRlazUMGWefwP1w6o6GaumA==",
             "dev": true,
             "dependencies": {
                 "uuid": "^8.3.2",
@@ -10448,11 +10503,11 @@
             }
         },
         "node_modules/internal-slot": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
-            "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+            "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
             "dependencies": {
-                "get-intrinsic": "^1.1.3",
+                "get-intrinsic": "^1.2.0",
                 "has": "^1.0.3",
                 "side-channel": "^1.0.4"
             },
@@ -10481,6 +10536,19 @@
                 "node": ">= 0.10"
             }
         },
+        "node_modules/is-array-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
+            "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "get-intrinsic": "^1.1.3",
+                "is-typed-array": "^1.1.10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/is-arrayish": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -10834,6 +10902,24 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/is-typed-array": {
+            "version": "1.1.10",
+            "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+            "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+            "dependencies": {
+                "available-typed-arrays": "^1.0.5",
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "gopd": "^1.0.1",
+                "has-tostringtag": "^1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/is-typedarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -10886,9 +10972,9 @@
             }
         },
         "node_modules/isarray": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+            "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
         },
         "node_modules/isemail": {
             "version": "3.2.0",
@@ -12810,9 +12896,13 @@
             "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
         },
         "node_modules/js-sdsl": {
-            "version": "4.1.4",
-            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
-            "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw=="
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+            "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/js-sdsl"
+            }
         },
         "node_modules/js-tokens": {
             "version": "4.0.0",
@@ -13142,9 +13232,9 @@
             }
         },
         "node_modules/knex": {
-            "version": "2.4.0",
-            "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.0.tgz",
-            "integrity": "sha512-i0GWwqYp1Hs2yvc2rlDO6nzzkLhwdyOZKRdsMTB8ZxOs2IXQyL5rBjSbS1krowCh6V65T4X9CJaKtuIfkaPGSA==",
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz",
+            "integrity": "sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==",
             "dependencies": {
                 "colorette": "2.0.19",
                 "commander": "^9.1.0",
@@ -13822,9 +13912,9 @@
             }
         },
         "node_modules/minimist": {
-            "version": "1.2.7",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
-            "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+            "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
             "funding": {
                 "url": "https://github.com/sponsors/ljharb"
             }
@@ -13844,21 +13934,13 @@
             }
         },
         "node_modules/minipass": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz",
-            "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz",
+            "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==",
             "engines": {
                 "node": ">=8"
             }
         },
-        "node_modules/minipass/node_modules/yallist": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-        },
         "node_modules/minizlib": {
             "version": "2.1.2",
             "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
@@ -14062,9 +14144,9 @@
             }
         },
         "node_modules/mssql/node_modules/commander": {
-            "version": "9.4.1",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
-            "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==",
+            "version": "9.5.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+            "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
             "engines": {
                 "node": "^12.20.0 || >=14"
             }
@@ -14104,30 +14186,24 @@
             "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
         },
         "node_modules/named-placeholders": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
-            "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
+            "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
             "dependencies": {
-                "lru-cache": "^4.1.3"
+                "lru-cache": "^7.14.1"
             },
             "engines": {
-                "node": ">=6.0.0"
+                "node": ">=12.0.0"
             }
         },
         "node_modules/named-placeholders/node_modules/lru-cache": {
-            "version": "4.1.5",
-            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-            "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-            "dependencies": {
-                "pseudomap": "^1.0.2",
-                "yallist": "^2.1.2"
+            "version": "7.14.1",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz",
+            "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==",
+            "engines": {
+                "node": ">=12"
             }
         },
-        "node_modules/named-placeholders/node_modules/yallist": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-            "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
-        },
         "node_modules/nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -14165,9 +14241,9 @@
             }
         },
         "node_modules/node-abort-controller": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz",
-            "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw=="
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
+            "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="
         },
         "node_modules/node-addon-api": {
             "version": "4.3.0",
@@ -14183,9 +14259,9 @@
             }
         },
         "node_modules/node-fetch": {
-            "version": "2.6.7",
-            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-            "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+            "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
             "dependencies": {
                 "whatwg-url": "^5.0.0"
             },
@@ -14297,6 +14373,12 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/node-gyp/node_modules/isarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+            "optional": true
+        },
         "node_modules/node-gyp/node_modules/lru-cache": {
             "version": "6.0.0",
             "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -14414,9 +14496,9 @@
             "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
         },
         "node_modules/node-releases": {
-            "version": "2.0.8",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz",
-            "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==",
+            "version": "2.0.10",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+            "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
             "dev": true
         },
         "node_modules/nodemailer": {
@@ -14558,12 +14640,12 @@
             }
         },
         "node_modules/number-allocator": {
-            "version": "1.0.12",
-            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.12.tgz",
-            "integrity": "sha512-sGB0qoQGmKimery9JubBQ9pQUr1V/LixJAk3Ygp7obZf6mpSXime8d7XHEobbIimkdZpgjkNlLt6G7LPEWFYWg==",
+            "version": "1.0.14",
+            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz",
+            "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==",
             "dependencies": {
                 "debug": "^4.3.1",
-                "js-sdsl": "4.1.4"
+                "js-sdsl": "4.3.0"
             }
         },
         "node_modules/number-is-nan": {
@@ -14604,9 +14686,9 @@
             }
         },
         "node_modules/object-inspect": {
-            "version": "1.12.2",
-            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
-            "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+            "version": "1.12.3",
+            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+            "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
             "funding": {
                 "url": "https://github.com/sponsors/ljharb"
             }
@@ -14679,9 +14761,9 @@
             }
         },
         "node_modules/open": {
-            "version": "8.4.0",
-            "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
-            "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+            "version": "8.4.1",
+            "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz",
+            "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==",
             "dependencies": {
                 "define-lazy-prop": "^2.0.0",
                 "is-docker": "^2.1.1",
@@ -14990,9 +15072,9 @@
             }
         },
         "node_modules/pg-protocol": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
-            "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
+            "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="
         },
         "node_modules/pg-types": {
             "version": "2.2.0",
@@ -15091,9 +15173,9 @@
             }
         },
         "node_modules/postcss": {
-            "version": "8.4.20",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
-            "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
+            "version": "8.4.21",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+            "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
             "dev": true,
             "funding": [
                 {
@@ -15130,9 +15212,9 @@
             }
         },
         "node_modules/postcss-html/node_modules/js-tokens": {
-            "version": "8.0.0",
-            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.0.tgz",
-            "integrity": "sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==",
+            "version": "8.0.1",
+            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.1.tgz",
+            "integrity": "sha512-3AGrZT6tuMm1ZWWn9mLXh7XMfi2YtiLNPALCVxBCiUVq0LD1OQMxV/AdS/s7rLJU5o9i/jBZw/N4vXXL5dm29A==",
             "dev": true
         },
         "node_modules/postcss-media-query-parser": {
@@ -15414,11 +15496,6 @@
             "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
             "dev": true
         },
-        "node_modules/pseudomap": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-            "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
-        },
         "node_modules/psl": {
             "version": "1.9.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -15435,9 +15512,9 @@
             }
         },
         "node_modules/punycode": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+            "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
             "engines": {
                 "node": ">=6"
             }
@@ -15578,12 +15655,18 @@
             }
         },
         "node_modules/qs": {
-            "version": "6.5.3",
-            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-            "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
-            "devOptional": true,
+            "version": "6.10.4",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
+            "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
+            "dev": true,
+            "dependencies": {
+                "side-channel": "^1.0.4"
+            },
             "engines": {
                 "node": ">=0.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
             }
         },
         "node_modules/querystringify": {
@@ -15613,12 +15696,14 @@
             ]
         },
         "node_modules/quick-lru": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
-            "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
-            "dev": true,
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
             "engines": {
-                "node": ">=8"
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
             }
         },
         "node_modules/radius": {
@@ -15894,14 +15979,14 @@
             }
         },
         "node_modules/regexpu-core": {
-            "version": "5.2.2",
-            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz",
-            "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==",
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.0.tgz",
+            "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==",
             "dev": true,
             "dependencies": {
+                "@babel/regjsgen": "^0.8.0",
                 "regenerate": "^1.4.2",
                 "regenerate-unicode-properties": "^10.1.0",
-                "regjsgen": "^0.7.1",
                 "regjsparser": "^0.9.1",
                 "unicode-match-property-ecmascript": "^2.0.0",
                 "unicode-match-property-value-ecmascript": "^2.1.0"
@@ -15910,12 +15995,6 @@
                 "node": ">=4"
             }
         },
-        "node_modules/regjsgen": {
-            "version": "0.7.1",
-            "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz",
-            "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==",
-            "dev": true
-        },
         "node_modules/regjsparser": {
             "version": "0.9.1",
             "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
@@ -16027,6 +16106,15 @@
                 "node": ">=0.6.0"
             }
         },
+        "node_modules/request/node_modules/qs": {
+            "version": "6.5.3",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+            "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+            "optional": true,
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
         "node_modules/request/node_modules/uuid": {
             "version": "3.4.0",
             "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -16118,9 +16206,9 @@
             }
         },
         "node_modules/resolve.exports": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
-            "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+            "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
             "dev": true,
             "engines": {
                 "node": ">=10"
@@ -16554,9 +16642,9 @@
             }
         },
         "node_modules/shell-quote": {
-            "version": "1.7.4",
-            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz",
-            "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==",
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
+            "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==",
             "dev": true,
             "funding": {
                 "url": "https://github.com/sponsors/ljharb"
@@ -16687,9 +16775,9 @@
             }
         },
         "node_modules/socket.io-parser": {
-            "version": "4.2.1",
-            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
-            "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
+            "version": "4.2.2",
+            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz",
+            "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==",
             "dependencies": {
                 "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.1"
@@ -16959,6 +17047,11 @@
                 "readable-stream": "^2.1.0"
             }
         },
+        "node_modules/string-to-stream/node_modules/isarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+        },
         "node_modules/string-to-stream/node_modules/readable-stream": {
             "version": "2.3.7",
             "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -17659,9 +17752,9 @@
             }
         },
         "node_modules/tslib": {
-            "version": "2.4.1",
-            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
-            "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+            "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
         },
         "node_modules/tunnel": {
             "version": "0.0.6",
@@ -17735,6 +17828,19 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/typed-array-length": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+            "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+            "dependencies": {
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "is-typed-array": "^1.1.9"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/typedarray": {
             "version": "0.0.6",
             "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -18349,9 +18455,9 @@
             }
         },
         "node_modules/vue-multiselect": {
-            "version": "3.0.0-alpha.2",
-            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-alpha.2.tgz",
-            "integrity": "sha512-Xp9fGJECns45v+v8jXbCIsAkCybYkEg0lNwr7Z6HDUSMyx2TEIK2giipPE+qXiShEc1Ipn+ZtttH2iq9hwXP4Q==",
+            "version": "3.0.0-beta.1",
+            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-beta.1.tgz",
+            "integrity": "sha512-V+jpydtjyHcQ+yjHsEWEBrDAopOx/pufNkSAXNVDAGQ+ESDEJ7wYejNd9H1RiCnFOYK4yf1XSGqE+Mp3HJXmdg==",
             "dev": true,
             "engines": {
                 "node": ">= 4.0.0",
@@ -18555,15 +18661,15 @@
             }
         },
         "node_modules/wait-on/node_modules/joi": {
-            "version": "17.7.0",
-            "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz",
-            "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==",
+            "version": "17.7.1",
+            "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.1.tgz",
+            "integrity": "sha512-teoLhIvWE298R6AeJywcjR4sX2hHjB3/xJX4qPjg+gTg+c0mzUDsziYlqPmLomq9gVsfaMcgPaGc7VxtD/9StA==",
             "dev": true,
             "dependencies": {
                 "@hapi/hoek": "^9.0.0",
                 "@hapi/topo": "^5.0.0",
                 "@sideway/address": "^4.1.3",
-                "@sideway/formula": "^3.0.0",
+                "@sideway/formula": "^3.0.1",
                 "@sideway/pinpoint": "^2.0.0"
             }
         },
@@ -18662,6 +18768,25 @@
             "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
             "dev": true
         },
+        "node_modules/which-typed-array": {
+            "version": "1.1.9",
+            "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+            "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+            "dependencies": {
+                "available-typed-arrays": "^1.0.5",
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "gopd": "^1.0.1",
+                "has-tostringtag": "^1.0.0",
+                "is-typed-array": "^1.1.10"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
         "node_modules/wide-align": {
             "version": "1.1.5",
             "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
@@ -18944,9 +19069,9 @@
             }
         },
         "@aws-crypto/ie11-detection": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz",
-            "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
+            "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
             "optional": true,
             "requires": {
                 "tslib": "^1.11.1"
@@ -18961,16 +19086,16 @@
             }
         },
         "@aws-crypto/sha256-browser": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
-            "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
+            "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
             "optional": true,
             "requires": {
-                "@aws-crypto/ie11-detection": "^2.0.0",
-                "@aws-crypto/sha256-js": "^2.0.0",
-                "@aws-crypto/supports-web-crypto": "^2.0.0",
-                "@aws-crypto/util": "^2.0.0",
-                "@aws-sdk/types": "^3.1.0",
+                "@aws-crypto/ie11-detection": "^3.0.0",
+                "@aws-crypto/sha256-js": "^3.0.0",
+                "@aws-crypto/supports-web-crypto": "^3.0.0",
+                "@aws-crypto/util": "^3.0.0",
+                "@aws-sdk/types": "^3.222.0",
                 "@aws-sdk/util-locate-window": "^3.0.0",
                 "@aws-sdk/util-utf8-browser": "^3.0.0",
                 "tslib": "^1.11.1"
@@ -18985,13 +19110,13 @@
             }
         },
         "@aws-crypto/sha256-js": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
-            "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
+            "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
             "optional": true,
             "requires": {
-                "@aws-crypto/util": "^2.0.0",
-                "@aws-sdk/types": "^3.1.0",
+                "@aws-crypto/util": "^3.0.0",
+                "@aws-sdk/types": "^3.222.0",
                 "tslib": "^1.11.1"
             },
             "dependencies": {
@@ -19004,9 +19129,9 @@
             }
         },
         "@aws-crypto/supports-web-crypto": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz",
-            "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
+            "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
             "optional": true,
             "requires": {
                 "tslib": "^1.11.1"
@@ -19021,12 +19146,12 @@
             }
         },
         "@aws-crypto/util": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz",
-            "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==",
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
+            "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "^3.110.0",
+                "@aws-sdk/types": "^3.222.0",
                 "@aws-sdk/util-utf8-browser": "^3.0.0",
                 "tslib": "^1.11.1"
             },
@@ -19040,361 +19165,358 @@
             }
         },
         "@aws-sdk/abort-controller": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz",
-            "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.267.0.tgz",
+            "integrity": "sha512-5R7OSnHFV/f+qQpMf1RuSQoVdXroK94Vl6naWjMOAhMyofHykVhEok9hmFPac86AVx8rVX/vuA7u9GKI6/EE7g==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/client-cognito-identity": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.245.0.tgz",
-            "integrity": "sha512-c5briTS05rAioO5b84bVng9M1KyAXcxJtDHeuoeAAZBuU+Dd0Scg3vyXyAFlGI+TsNyxqHAqqRdAoG4WNxJo/Q==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.267.0.tgz",
+            "integrity": "sha512-jEE5aw7wp7VhiaU0vCbNQbEIhiaNZnBhRj+vJVCd2HQBI9IVLVXAoyExWxLruAXKEO+A1w1df+fwZAOo0M7aQQ==",
             "optional": true,
             "requires": {
-                "@aws-crypto/sha256-browser": "2.0.0",
-                "@aws-crypto/sha256-js": "2.0.0",
-                "@aws-sdk/client-sts": "3.245.0",
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/credential-provider-node": "3.245.0",
-                "@aws-sdk/fetch-http-handler": "3.226.0",
-                "@aws-sdk/hash-node": "3.226.0",
-                "@aws-sdk/invalid-dependency": "3.226.0",
-                "@aws-sdk/middleware-content-length": "3.226.0",
-                "@aws-sdk/middleware-endpoint": "3.226.0",
-                "@aws-sdk/middleware-host-header": "3.226.0",
-                "@aws-sdk/middleware-logger": "3.226.0",
-                "@aws-sdk/middleware-recursion-detection": "3.226.0",
-                "@aws-sdk/middleware-retry": "3.235.0",
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/middleware-signing": "3.226.0",
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/middleware-user-agent": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/node-http-handler": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/smithy-client": "3.234.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/client-sts": "3.267.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "@aws-sdk/util-body-length-browser": "3.188.0",
                 "@aws-sdk/util-body-length-node": "3.208.0",
-                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
-                "@aws-sdk/util-defaults-mode-node": "3.234.0",
-                "@aws-sdk/util-endpoints": "3.245.0",
-                "@aws-sdk/util-retry": "3.229.0",
-                "@aws-sdk/util-user-agent-browser": "3.226.0",
-                "@aws-sdk/util-user-agent-node": "3.226.0",
-                "@aws-sdk/util-utf8-browser": "3.188.0",
-                "@aws-sdk/util-utf8-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/client-sso": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.245.0.tgz",
-            "integrity": "sha512-dxzRwRo55ZNQ4hQigC+cishxLSWlBrbr3iszG0FLviavLDOlnVG5UUxWpOIGvwr8pYiSfM4jnfMxiwYwiCLg1g==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.267.0.tgz",
+            "integrity": "sha512-/475/mT0gYhimpCdK4iZW+eX0DT6mkTgVk5P9ARpQGzEblFM6i2pE7GQnlGeLyHVOtA0cNAyGrWUuj2pyigUaA==",
             "optional": true,
             "requires": {
-                "@aws-crypto/sha256-browser": "2.0.0",
-                "@aws-crypto/sha256-js": "2.0.0",
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/fetch-http-handler": "3.226.0",
-                "@aws-sdk/hash-node": "3.226.0",
-                "@aws-sdk/invalid-dependency": "3.226.0",
-                "@aws-sdk/middleware-content-length": "3.226.0",
-                "@aws-sdk/middleware-endpoint": "3.226.0",
-                "@aws-sdk/middleware-host-header": "3.226.0",
-                "@aws-sdk/middleware-logger": "3.226.0",
-                "@aws-sdk/middleware-recursion-detection": "3.226.0",
-                "@aws-sdk/middleware-retry": "3.235.0",
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/middleware-user-agent": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/node-http-handler": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/smithy-client": "3.234.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "@aws-sdk/util-body-length-browser": "3.188.0",
                 "@aws-sdk/util-body-length-node": "3.208.0",
-                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
-                "@aws-sdk/util-defaults-mode-node": "3.234.0",
-                "@aws-sdk/util-endpoints": "3.245.0",
-                "@aws-sdk/util-retry": "3.229.0",
-                "@aws-sdk/util-user-agent-browser": "3.226.0",
-                "@aws-sdk/util-user-agent-node": "3.226.0",
-                "@aws-sdk/util-utf8-browser": "3.188.0",
-                "@aws-sdk/util-utf8-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/client-sso-oidc": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.245.0.tgz",
-            "integrity": "sha512-0pGPA00kEsu2Yq1Ul+OwftHxws5YVllm4iZrPtGnqmXr7wmf6B9lOtrMQF44y7Tfw53po6+bKz08OKTEWkkjUA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.267.0.tgz",
+            "integrity": "sha512-Jdq0v0mJSJbG/CKLfHC1L0cjCot48Y6lLMQV1lfkYE65xD0ZSs8Gl7P/T391ZH7cLO6ifVoPdsYnwzhi1ZPXSQ==",
             "optional": true,
             "requires": {
-                "@aws-crypto/sha256-browser": "2.0.0",
-                "@aws-crypto/sha256-js": "2.0.0",
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/fetch-http-handler": "3.226.0",
-                "@aws-sdk/hash-node": "3.226.0",
-                "@aws-sdk/invalid-dependency": "3.226.0",
-                "@aws-sdk/middleware-content-length": "3.226.0",
-                "@aws-sdk/middleware-endpoint": "3.226.0",
-                "@aws-sdk/middleware-host-header": "3.226.0",
-                "@aws-sdk/middleware-logger": "3.226.0",
-                "@aws-sdk/middleware-recursion-detection": "3.226.0",
-                "@aws-sdk/middleware-retry": "3.235.0",
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/middleware-user-agent": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/node-http-handler": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/smithy-client": "3.234.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "@aws-sdk/util-body-length-browser": "3.188.0",
                 "@aws-sdk/util-body-length-node": "3.208.0",
-                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
-                "@aws-sdk/util-defaults-mode-node": "3.234.0",
-                "@aws-sdk/util-endpoints": "3.245.0",
-                "@aws-sdk/util-retry": "3.229.0",
-                "@aws-sdk/util-user-agent-browser": "3.226.0",
-                "@aws-sdk/util-user-agent-node": "3.226.0",
-                "@aws-sdk/util-utf8-browser": "3.188.0",
-                "@aws-sdk/util-utf8-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/client-sts": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.245.0.tgz",
-            "integrity": "sha512-E+7v2sy34TLni/Dmz6bTU20NWvbHYH9sVUHKQ9kHhmFopUWrs4Nt77f85PbuiKJz/irjUh9ppT5q1odJNRKRVQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.267.0.tgz",
+            "integrity": "sha512-bJ+SwJZAP3DuDUgToDV89HsB80IhSfB1rhzLG9csqs6h7uMLO8H1/fymElYKT4VMMAA+rpWJ3pznyGiCK7w28A==",
             "optional": true,
             "requires": {
-                "@aws-crypto/sha256-browser": "2.0.0",
-                "@aws-crypto/sha256-js": "2.0.0",
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/credential-provider-node": "3.245.0",
-                "@aws-sdk/fetch-http-handler": "3.226.0",
-                "@aws-sdk/hash-node": "3.226.0",
-                "@aws-sdk/invalid-dependency": "3.226.0",
-                "@aws-sdk/middleware-content-length": "3.226.0",
-                "@aws-sdk/middleware-endpoint": "3.226.0",
-                "@aws-sdk/middleware-host-header": "3.226.0",
-                "@aws-sdk/middleware-logger": "3.226.0",
-                "@aws-sdk/middleware-recursion-detection": "3.226.0",
-                "@aws-sdk/middleware-retry": "3.235.0",
-                "@aws-sdk/middleware-sdk-sts": "3.226.0",
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/middleware-signing": "3.226.0",
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/middleware-user-agent": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/node-http-handler": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/smithy-client": "3.234.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-crypto/sha256-browser": "3.0.0",
+                "@aws-crypto/sha256-js": "3.0.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/fetch-http-handler": "3.267.0",
+                "@aws-sdk/hash-node": "3.267.0",
+                "@aws-sdk/invalid-dependency": "3.267.0",
+                "@aws-sdk/middleware-content-length": "3.267.0",
+                "@aws-sdk/middleware-endpoint": "3.267.0",
+                "@aws-sdk/middleware-host-header": "3.267.0",
+                "@aws-sdk/middleware-logger": "3.267.0",
+                "@aws-sdk/middleware-recursion-detection": "3.267.0",
+                "@aws-sdk/middleware-retry": "3.267.0",
+                "@aws-sdk/middleware-sdk-sts": "3.267.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/middleware-user-agent": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/node-http-handler": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/smithy-client": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "@aws-sdk/util-body-length-browser": "3.188.0",
                 "@aws-sdk/util-body-length-node": "3.208.0",
-                "@aws-sdk/util-defaults-mode-browser": "3.234.0",
-                "@aws-sdk/util-defaults-mode-node": "3.234.0",
-                "@aws-sdk/util-endpoints": "3.245.0",
-                "@aws-sdk/util-retry": "3.229.0",
-                "@aws-sdk/util-user-agent-browser": "3.226.0",
-                "@aws-sdk/util-user-agent-node": "3.226.0",
-                "@aws-sdk/util-utf8-browser": "3.188.0",
-                "@aws-sdk/util-utf8-node": "3.208.0",
+                "@aws-sdk/util-defaults-mode-browser": "3.267.0",
+                "@aws-sdk/util-defaults-mode-node": "3.267.0",
+                "@aws-sdk/util-endpoints": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
+                "@aws-sdk/util-user-agent-browser": "3.267.0",
+                "@aws-sdk/util-user-agent-node": "3.267.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "fast-xml-parser": "4.0.11",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/config-resolver": {
-            "version": "3.234.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz",
-            "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.267.0.tgz",
+            "integrity": "sha512-UMvJY548xOkamU9ZuZk336VX9r3035CAbttagiPJ/FXy9S8jcQ7N722PAovtxs69nNBQf56cmWsnOHphLCGG9w==",
             "optional": true,
             "requires": {
-                "@aws-sdk/signature-v4": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-config-provider": "3.208.0",
-                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-middleware": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/credential-provider-cognito-identity": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.245.0.tgz",
-            "integrity": "sha512-DkiPv7Yb9iw3yAzvWUAkXrI23F1+kV8grdXzlSzob5suqv/dVON5pFXK9Siz62WwWsa2FeCEpgEF7RA0mrWLtA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.267.0.tgz",
+            "integrity": "sha512-H97VsbiTcb4tbY/LQMZNglJIHt7CHso7RtGgctmdsEA7Rha79fV/egF0Vqo2OQHDgEEpgQDWCeHbXO1P5ibR/A==",
             "optional": true,
             "requires": {
-                "@aws-sdk/client-cognito-identity": "3.245.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/client-cognito-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/credential-provider-env": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz",
-            "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.267.0.tgz",
+            "integrity": "sha512-oiem2UtaFe4CQHscUCImJjPhYWd4iF8fqXhlq6BqHs1wsO6A0vnIUGh+Srut/2q7Xeegl/SRU34HK0hh8JCbxg==",
             "optional": true,
             "requires": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/credential-provider-imds": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz",
-            "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.267.0.tgz",
+            "integrity": "sha512-Afd5+LdJ9QyeI5L4iyVmI4MLV+0JBtRLmRy0LdinwJaP0DyKyv9+uaIaorKfWihQpe8hwjEfQWTlTz2A3JMJtw==",
             "optional": true,
             "requires": {
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/credential-provider-ini": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.245.0.tgz",
-            "integrity": "sha512-1SjfVc5Wg0lLRUvwMrfjGgFkl+zfxn74gnkPr6by1QyMAoTzmeUkalPLAIqd+uHtFom9e3K633BQtX7zVPZ5XQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.267.0.tgz",
+            "integrity": "sha512-pHHlqZqZXA4cTssTyRmbYtrjxS2BEy2KFYHEEHNUrd82pUHnj70n+lrpVnT5pRhPPDacpNzxq0KZGeNgmETpbw==",
             "optional": true,
             "requires": {
-                "@aws-sdk/credential-provider-env": "3.226.0",
-                "@aws-sdk/credential-provider-imds": "3.226.0",
-                "@aws-sdk/credential-provider-process": "3.226.0",
-                "@aws-sdk/credential-provider-sso": "3.245.0",
-                "@aws-sdk/credential-provider-web-identity": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/credential-provider-node": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.245.0.tgz",
-            "integrity": "sha512-Dwv8zmRLTDLeEkGrK/sLNFZSC+ahXZxr07CuID054QKACIdUEvkqYlnalRiTeXngiHGQ54u8wU7f0D32R2oL0g==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.267.0.tgz",
+            "integrity": "sha512-uo8VyZ/L8HBXskYZC65bR1ZUJ5mBn8JarrGHt6vMG2A+uM7AuryTsKn2wdhPfuCUGKuQLXmix5K4VW/wzq11kQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/credential-provider-env": "3.226.0",
-                "@aws-sdk/credential-provider-imds": "3.226.0",
-                "@aws-sdk/credential-provider-ini": "3.245.0",
-                "@aws-sdk/credential-provider-process": "3.226.0",
-                "@aws-sdk/credential-provider-sso": "3.245.0",
-                "@aws-sdk/credential-provider-web-identity": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-ini": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/credential-provider-process": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz",
-            "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.267.0.tgz",
+            "integrity": "sha512-pd1OOB1Mm+QdPv3sPfO+1G8HBaPAAYXxjLcOK5z/myBeZAsLR12Xcaft4RR1XWwXXKEQqq42cbAINWQdyVykqQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/credential-provider-sso": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.245.0.tgz",
-            "integrity": "sha512-txWrJc0WNBhXMi7q+twjx7cs/qzgTfbQ+vbag5idRmdoUeiR8rfLvihCab2NaGg50xhh+TaoUCXrgJp3E/XjYQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.267.0.tgz",
+            "integrity": "sha512-JqwxelzeRhVdloNi+VUUXhJdziTtNrrwMuhds9wj4KPfl1S2EIzkRxHSjwDz1wtSyuIPOOo6pPJiaVbwvLpkVg==",
             "optional": true,
             "requires": {
-                "@aws-sdk/client-sso": "3.245.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/token-providers": "3.245.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/client-sso": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/token-providers": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/credential-provider-web-identity": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz",
-            "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.267.0.tgz",
+            "integrity": "sha512-za5UsQmj3sYRhd4h5eStj3GCHHfAAjfx2x5FmgQ9ldOp+s0wHEqSL1g+OL9v6o8otf9JnWha+wfUYq3yVGfufQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/credential-providers": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.245.0.tgz",
-            "integrity": "sha512-6Uhsxk6MOuWplejhPJf7XDhegHmcZfj8hwnF4mXFJ6u4b2RxWPQCnqPcA0+VoAzIMUqbjqvkSzmVjQelGFtjNg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.267.0.tgz",
+            "integrity": "sha512-Og70E1eHGcxShMbrmm8lOepF82Hg5Fe7WXv0pnUKFFUxr+pf89bCjxGwktZIDM7ZMMXGIyladeIgTjsJkhpjRQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/client-cognito-identity": "3.245.0",
-                "@aws-sdk/client-sso": "3.245.0",
-                "@aws-sdk/client-sts": "3.245.0",
-                "@aws-sdk/credential-provider-cognito-identity": "3.245.0",
-                "@aws-sdk/credential-provider-env": "3.226.0",
-                "@aws-sdk/credential-provider-imds": "3.226.0",
-                "@aws-sdk/credential-provider-ini": "3.245.0",
-                "@aws-sdk/credential-provider-node": "3.245.0",
-                "@aws-sdk/credential-provider-process": "3.226.0",
-                "@aws-sdk/credential-provider-sso": "3.245.0",
-                "@aws-sdk/credential-provider-web-identity": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/client-cognito-identity": "3.267.0",
+                "@aws-sdk/client-sso": "3.267.0",
+                "@aws-sdk/client-sts": "3.267.0",
+                "@aws-sdk/credential-provider-cognito-identity": "3.267.0",
+                "@aws-sdk/credential-provider-env": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/credential-provider-ini": "3.267.0",
+                "@aws-sdk/credential-provider-node": "3.267.0",
+                "@aws-sdk/credential-provider-process": "3.267.0",
+                "@aws-sdk/credential-provider-sso": "3.267.0",
+                "@aws-sdk/credential-provider-web-identity": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/fetch-http-handler": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz",
-            "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.267.0.tgz",
+            "integrity": "sha512-u8v8OvWvLVfifmETCAj+DCTot900AsdO1b+N+O8nXiTm2v99rtEoNRJW+no/5vJKNqR+95OAz4NWjFep8nzseg==",
             "optional": true,
             "requires": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/querystring-builder": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/querystring-builder": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-base64": "3.208.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/hash-node": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz",
-            "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.267.0.tgz",
+            "integrity": "sha512-N3xeChdJg4V4jh2vrRN521EMJYxjUOo/LpvpisFyQHE/p31AfcOLb05upYFoYLvyeder9RHBIyNsvvnMYYoCsA==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-buffer-from": "3.208.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/invalid-dependency": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz",
-            "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.267.0.tgz",
+            "integrity": "sha512-I95IR/eDLC54+9qrL6uh64nhpLVHwxxbBhhEUZKDACp86eXulO8T/DOwUX31ps4+2lI7tbEhQT7f9WDOO3fN8Q==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
@@ -19408,274 +19530,275 @@
             }
         },
         "@aws-sdk/middleware-content-length": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz",
-            "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.267.0.tgz",
+            "integrity": "sha512-b6MBIK12iwcATKnWIhsh50xWVMmZOXZFIo9D4io6D+JM6j/U+GZrSWqxhHzb3SjavuwVgA2hwq4mUCh2WJPJKA==",
             "optional": true,
             "requires": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/middleware-endpoint": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz",
-            "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.267.0.tgz",
+            "integrity": "sha512-pGICM/qlQVfixtfKZt8zHq54KvLG2MmOAgNWj2MXB7oirPs/3rC9Kz9ITFXJgjlRFyfssgP/feKhs2yZkI8lhw==",
             "optional": true,
             "requires": {
-                "@aws-sdk/middleware-serde": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/signature-v4": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/url-parser": "3.226.0",
+                "@aws-sdk/middleware-serde": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/url-parser": "3.267.0",
                 "@aws-sdk/util-config-provider": "3.208.0",
-                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-middleware": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/middleware-host-header": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz",
-            "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.267.0.tgz",
+            "integrity": "sha512-D8TfjMeuQXTsB7Ni8liMmNqb3wz+T6t/tYUHtsMo0j++94KAPPj1rhkkTAjR4Rc+IYGCS4YyyCuCXjGB6gkjnA==",
             "optional": true,
             "requires": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/middleware-logger": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz",
-            "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.267.0.tgz",
+            "integrity": "sha512-wnLeZYWbgGCuNmRl0Pmky0cSXBWmMTaQBgq90WfwyM0V8wzcoeaovTWA5/qe8oJzusOgUMFoVia4Ew20k3lu8w==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/middleware-recursion-detection": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz",
-            "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.267.0.tgz",
+            "integrity": "sha512-NCBkTLxaW7XtfQoVBqQCaQZqec5XDtEylkw7g0tGjYDcl934fzu3ciH9MsJ34QFe9slYM6g4v+eC9f1w9K/19g==",
             "optional": true,
             "requires": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/middleware-retry": {
-            "version": "3.235.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz",
-            "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.267.0.tgz",
+            "integrity": "sha512-MiiNtddZXVhtSAnJFyChwNxnhzMYmv6qWl8qgSjuIOw9SczkHPCoANTfUdRlzG6RfPYhgYtzMGqqnrficJ6mVg==",
             "optional": true,
             "requires": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/service-error-classification": "3.229.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/util-middleware": "3.226.0",
-                "@aws-sdk/util-retry": "3.229.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/service-error-classification": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-middleware": "3.267.0",
+                "@aws-sdk/util-retry": "3.267.0",
                 "tslib": "^2.3.1",
                 "uuid": "^8.3.2"
             }
         },
         "@aws-sdk/middleware-sdk-sts": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz",
-            "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.267.0.tgz",
+            "integrity": "sha512-JLDNNvV7Hr0CQrf1vSmflvPbfDFIx5lFf8tY7DZwYWEE920ZzbJTfUsTW9iZHJGeIe8dAQX1tmfYL68+++nvEQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/middleware-signing": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/signature-v4": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/middleware-signing": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/middleware-serde": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz",
-            "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.267.0.tgz",
+            "integrity": "sha512-9qspxiZs+JShukzKMAameBSubfvtUOGZviu9GT5OfRekY2dBbwWcfchP2WvlwxZ/CcC+GwO1HcPqKDCMGsNoow==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/middleware-signing": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz",
-            "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.267.0.tgz",
+            "integrity": "sha512-thkFEBiFW0M/73dIzl7hQmyAONb8zyD2ZYUFyGm7cIM60sRDUKejPHV6Izonll+HbBZgiBdwUi42uu8O+LfFGQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/signature-v4": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
-                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/signature-v4": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "@aws-sdk/util-middleware": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/middleware-stack": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz",
-            "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.267.0.tgz",
+            "integrity": "sha512-52uH3JO3ceI15dgzt8gU7lpJf59qbRUQYJ7pAmTMiHtyEawZ39Puv6sGheY3fAffhqd/aQvup6wn18Q1fRIQUA==",
             "optional": true,
             "requires": {
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/middleware-user-agent": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz",
-            "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.267.0.tgz",
+            "integrity": "sha512-eaReMnoB1Cx3OY8WDSiUMNDz/EkdAo4w/m3d5CizckKQNmB29gUrgyFs7g7sHTcShQAduZzlsfRPzc6NmKYaWQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/node-config-provider": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz",
-            "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.267.0.tgz",
+            "integrity": "sha512-wNX+Cu0x+kllng253j5dvmLm4opDRr7YehJ0rNGAV24X+UPJPluN9HrBFly+z4+bH16TpJEPKx7AayiWZGFE1w==",
             "optional": true,
             "requires": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/node-http-handler": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz",
-            "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.267.0.tgz",
+            "integrity": "sha512-wtt3O+e8JEKaLFtmQd74HSZj2TyiApPkwMJ3R50hyboVswt8RcdMWdFbzLnPVpT1AqskG3fMECSKbu8AC/xvBQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/abort-controller": "3.226.0",
-                "@aws-sdk/protocol-http": "3.226.0",
-                "@aws-sdk/querystring-builder": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/abort-controller": "3.267.0",
+                "@aws-sdk/protocol-http": "3.267.0",
+                "@aws-sdk/querystring-builder": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/property-provider": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz",
-            "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.267.0.tgz",
+            "integrity": "sha512-/BD1Zar9PCQSV8VZTAWOJmtojAeMIl16ljZX3Kix84r45qqNNxuPST2AhNVN+p97Js4x9kBFCHkdFOpW94wr4Q==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/protocol-http": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz",
-            "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.267.0.tgz",
+            "integrity": "sha512-8HhOZXMCZ0nsJC/FoifX7YrTYGP91tCpSxIHkr7HxQcTdBMI7QakMtIIWK9Qjsy6tUI98aAdEo5PNCbzdpozmQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/querystring-builder": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz",
-            "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.267.0.tgz",
+            "integrity": "sha512-SKo8V3oPV1wZy4r4lccH7R2LT0PUK/WGaXkKR30wyrtDjJRWVJDYef9ysOpRP+adCTt3G5XO0SzyPQUW5dXYVA==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-uri-escape": "3.201.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/querystring-parser": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz",
-            "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.267.0.tgz",
+            "integrity": "sha512-Krq36GXqEfRfzJ9wOzkkzpbb4SWjgSYydTIgK6KtKapme0HPcB24kmmsjsUVuHzKuQMCHHDRWm+b47iBmHGpSQ==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/service-error-classification": {
-            "version": "3.229.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.229.0.tgz",
-            "integrity": "sha512-dnzWWQ0/NoWMUZ5C0DW3dPm0wC1O76Y/SpKbuJzWPkx1EYy6r8p32Ly4D9vUzrKDbRGf48YHIF2kOkBmu21CLg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.267.0.tgz",
+            "integrity": "sha512-fOWg7bcItmJqD/YQbGvN9o03ucoBzvWNTQEB81mLKMSKr1Cf/ms0f8oa94LlImgqjjfjvAqHh6rUBTpSmSEyaw==",
             "optional": true
         },
         "@aws-sdk/shared-ini-file-loader": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz",
-            "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.267.0.tgz",
+            "integrity": "sha512-Jz9R5hXKSk+aRoBKi4Bnf6T/FZUBYrIibbLnhiNxpQ1FY9mTggJR/rxuIdOE23LtfW+CRqqEYOtAtmC1oYE6tw==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/signature-v4": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz",
-            "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.267.0.tgz",
+            "integrity": "sha512-Je1e7rum2zvxa3jWfwq4E+fyBdFJmSJAwGtWYz3+/rWipwXFlSAPeSVqtNjHdfzakgabvzLp7aesG4yQTrO2YQ==",
             "optional": true,
             "requires": {
                 "@aws-sdk/is-array-buffer": "3.201.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "@aws-sdk/util-hex-encoding": "3.201.0",
-                "@aws-sdk/util-middleware": "3.226.0",
+                "@aws-sdk/util-middleware": "3.267.0",
                 "@aws-sdk/util-uri-escape": "3.201.0",
+                "@aws-sdk/util-utf8": "3.254.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/smithy-client": {
-            "version": "3.234.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz",
-            "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.267.0.tgz",
+            "integrity": "sha512-WdgXHqKmFQIkAWETO/I5boX9u6QbMLC4X74OVSBaBLhRjqYmvolMFtNrQzvSKGB3FaxAN9Do41amC0mGoeLC8A==",
             "optional": true,
             "requires": {
-                "@aws-sdk/middleware-stack": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/middleware-stack": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/token-providers": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.245.0.tgz",
-            "integrity": "sha512-m/spXR/vEXGb+zMqRUMQYVMwFZSTdK5RkddYqamYkNhIoLm60EYeRu57JsMMs5djKi8dBRSKiXwVHx0l2rXMjg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.267.0.tgz",
+            "integrity": "sha512-CGayGrPl4ONG4RuGbNv+QS4oVuItx4hK2FCbFS7d6V7h53rkDrcFd34NsvbicQ2KVFobE7fKs6ZaripJbJbLHA==",
             "optional": true,
             "requires": {
-                "@aws-sdk/client-sso-oidc": "3.245.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/shared-ini-file-loader": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/client-sso-oidc": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/shared-ini-file-loader": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/types": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz",
-            "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.267.0.tgz",
+            "integrity": "sha512-fICTbSeIfXlTHnciQgDt37R0kXoKxgh0a3prnLWVvTcmf7NFujdZmg5YTAZT3KJJ7SuKsIgnI8azBYioVY8BVQ==",
             "optional": true,
             "requires": {
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/url-parser": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz",
-            "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.267.0.tgz",
+            "integrity": "sha512-xoQ5Fd11moiE82QTL9GGE6e73SFuD0Wi73tA75TAwKuY12OP5vDJ4oBC86A1G2T+OzeHJQmYyqiA5j48CzqB6A==",
             "optional": true,
             "requires": {
-                "@aws-sdk/querystring-parser": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/querystring-parser": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
@@ -19727,38 +19850,38 @@
             }
         },
         "@aws-sdk/util-defaults-mode-browser": {
-            "version": "3.234.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz",
-            "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.267.0.tgz",
+            "integrity": "sha512-MgrqpedA58HVR8RpT2A42//5Lb3M0JwEiYlDaA7EvIVsMx1NzO+cng4MDJi03YBAP5hwCVQmO9Sf5Au4dm+m0g==",
             "optional": true,
             "requires": {
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "bowser": "^2.11.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/util-defaults-mode-node": {
-            "version": "3.234.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz",
-            "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.267.0.tgz",
+            "integrity": "sha512-JyFk95T77sGM4q386id/mDt9/7HvoQySAygPyv/lj//WEJJIRKiefB277CKKJPT8nRAsO4mIyAT+YO/xGCxkQA==",
             "optional": true,
             "requires": {
-                "@aws-sdk/config-resolver": "3.234.0",
-                "@aws-sdk/credential-provider-imds": "3.226.0",
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/property-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/config-resolver": "3.267.0",
+                "@aws-sdk/credential-provider-imds": "3.267.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/property-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/util-endpoints": {
-            "version": "3.245.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.245.0.tgz",
-            "integrity": "sha512-UNOFquB1tKx+8RT8n82Zb5tIwDyZHVPBg/m0LB0RsLETjr6krien5ASpqWezsXKIR1hftN9uaxN4bvf2dZrWHg==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.267.0.tgz",
+            "integrity": "sha512-c6miY83Eo0erqXY+YiS2sOg3izURqvaWHd9przJzBQea9XRCN4ANT2P8AhoC0BPIORutaaOSoCSp/crHG0XLLg==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
@@ -19781,21 +19904,21 @@
             }
         },
         "@aws-sdk/util-middleware": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz",
-            "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.267.0.tgz",
+            "integrity": "sha512-7nvqBZVz3RdwYv6lU958g6sWI2Qt8lzxDVn0uwfnPH+fAiX7Ln1Hen2A0XeW5cL5uYUJy6wNM5cyfTzFZosE0A==",
             "optional": true,
             "requires": {
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/util-retry": {
-            "version": "3.229.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.229.0.tgz",
-            "integrity": "sha512-0zKTqi0P1inD0LzIMuXRIYYQ/8c1lWMg/cfiqUcIAF1TpatlpZuN7umU0ierpBFud7S+zDgg0oemh+Nj8xliJw==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.267.0.tgz",
+            "integrity": "sha512-ZXo1ICG2HgxkIZWlnPteh2R90kwmhRwvbP282CwrrYgTKuMZmW2R/+o6vqhWyPkjoNFN/pno0FxuDA3IYau3Sw==",
             "optional": true,
             "requires": {
-                "@aws-sdk/service-error-classification": "3.229.0",
+                "@aws-sdk/service-error-classification": "3.267.0",
                 "tslib": "^2.3.1"
             }
         },
@@ -19809,46 +19932,46 @@
             }
         },
         "@aws-sdk/util-user-agent-browser": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz",
-            "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.267.0.tgz",
+            "integrity": "sha512-SmI6xInnPPa0gFhCqhtWOUMTxLeRbm7X5HXzeprhK1d8aNNlUVyALAV7K8ovIjnv3a97lIJSekyb78oTuYITCA==",
             "optional": true,
             "requires": {
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/types": "3.267.0",
                 "bowser": "^2.11.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/util-user-agent-node": {
-            "version": "3.226.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz",
-            "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==",
+            "version": "3.267.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.267.0.tgz",
+            "integrity": "sha512-nfmyffA1yIypJ30CIMO6Tc16t8dFJzdztzoowjmnfb8/LzTZECERM3GICq0DvZDPfSo+jbuz634VtS2K7tVZjA==",
             "optional": true,
             "requires": {
-                "@aws-sdk/node-config-provider": "3.226.0",
-                "@aws-sdk/types": "3.226.0",
+                "@aws-sdk/node-config-provider": "3.267.0",
+                "@aws-sdk/types": "3.267.0",
+                "tslib": "^2.3.1"
+            }
+        },
+        "@aws-sdk/util-utf8": {
+            "version": "3.254.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz",
+            "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==",
+            "optional": true,
+            "requires": {
+                "@aws-sdk/util-buffer-from": "3.208.0",
                 "tslib": "^2.3.1"
             }
         },
         "@aws-sdk/util-utf8-browser": {
-            "version": "3.188.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz",
-            "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==",
+            "version": "3.259.0",
+            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+            "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
             "optional": true,
             "requires": {
                 "tslib": "^2.3.1"
             }
         },
-        "@aws-sdk/util-utf8-node": {
-            "version": "3.208.0",
-            "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz",
-            "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==",
-            "optional": true,
-            "requires": {
-                "@aws-sdk/util-buffer-from": "3.208.0",
-                "tslib": "^2.3.1"
-            }
-        },
         "@azure/abort-controller": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
@@ -19867,9 +19990,9 @@
             }
         },
         "@azure/core-client": {
-            "version": "1.6.1",
-            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.1.tgz",
-            "integrity": "sha512-mZ1MSKhZBYoV8GAWceA+PEJFWV2VpdNSpxxcj1wjIAOi00ykRuIQChT99xlQGZWLY3/NApWhSImlFwsmCEs4vA==",
+            "version": "1.7.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.7.1.tgz",
+            "integrity": "sha512-85igXpc5V7ns6rvMEpLmIcBDftjUgTWD+0tmYPyQEfPfkAwpPTs1X5rhCDsfqvUZGA8Ksid1hdZGu62r6XXeHg==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -19891,9 +20014,9 @@
             }
         },
         "@azure/core-lro": {
-            "version": "2.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.4.0.tgz",
-            "integrity": "sha512-F65+rYkll1dpw3RGm8/SSiSj+/QkMeYDanzS/QKlM1dmuneVyXbO46C88V1MRHluLGdMP6qfD3vDRYALn0z0tQ==",
+            "version": "2.5.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.1.tgz",
+            "integrity": "sha512-JHQy/bA3NOz2WuzOi5zEk6n/TJdAropupxUT521JIJvW7EXV2YN2SFYZrf/2RHeD28QAClGdynYadZsbmP+nyQ==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/logger": "^1.0.0",
@@ -19901,17 +20024,17 @@
             }
         },
         "@azure/core-paging": {
-            "version": "1.4.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.4.0.tgz",
-            "integrity": "sha512-tabFtZTg8D9XqZKEfNUOGh63SuYeOxmvH4GDcOJN+R1bZWZ1FZskctgY9Pmuwzhn+0Xvq9rmimK9hsvtLkeBsw==",
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz",
+            "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==",
             "requires": {
                 "tslib": "^2.2.0"
             }
         },
         "@azure/core-rest-pipeline": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.0.tgz",
-            "integrity": "sha512-m6c4iAalfaf6sytOOQhLKFprEHSkSjQuRgkW7MTMnAN+GENDDL4XZJp7WKFnq9VpKUE+ggq+rp5xX9GI93lumw==",
+            "version": "1.10.1",
+            "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz",
+            "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==",
             "requires": {
                 "@azure/abort-controller": "^1.0.0",
                 "@azure/core-auth": "^1.4.0",
@@ -20013,17 +20136,17 @@
             }
         },
         "@azure/msal-browser": {
-            "version": "2.32.1",
-            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.1.tgz",
-            "integrity": "sha512-2G3B12ZEIpiimi6/Yqq7KLk4ud1zZWoHvVd2kJ2VthN1HjMsZjdMUxeHkwMWaQ6RzO6mv9rZiuKmRX64xkXW9g==",
+            "version": "2.33.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.33.0.tgz",
+            "integrity": "sha512-c7CVh1tfUfxiWkEIhoIb11hL4PGo4hz0M+gMy34ATagAKdLK7qyEu/5AXJWAf5lz5eE+vQhm7+LKiuETrcXXGw==",
             "requires": {
-                "@azure/msal-common": "^9.0.1"
+                "@azure/msal-common": "^10.0.0"
             },
             "dependencies": {
                 "@azure/msal-common": {
-                    "version": "9.0.1",
-                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.1.tgz",
-                    "integrity": "sha512-eNNHIW/cwPTZDWs9KtYgb1X6gtQ+cC+FGX2YN+t4AUVsBdUbqlMTnUs6/c/VBxC2AAGIhgLREuNnO3F66AN2zQ=="
+                    "version": "10.0.0",
+                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-10.0.0.tgz",
+                    "integrity": "sha512-/LghpT93jsZLy55QzTsRZWMx6R1Mjc1Aktwps8sKSGE3WbrGwbSsh2uhDlpl6FMcKChYjJ0ochThWwwOodrQNg=="
                 }
             }
         },
@@ -20033,19 +20156,19 @@
             "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q=="
         },
         "@azure/msal-node": {
-            "version": "1.14.6",
-            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.6.tgz",
-            "integrity": "sha512-em/qqFL5tLMxMPl9vormAs13OgZpmQoJbiQ/GlWr+BA77eCLoL+Ehr5xRHowYo+LFe5b+p+PJVkRvT+mLvOkwA==",
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.15.0.tgz",
+            "integrity": "sha512-fwC5M0c8pxOAzmScPbpx7j28YVTDebUaizlVF7bR0xvlU0r3VWW5OobCcr9ybqKS6wGyO7u4EhXJS9rjRWAuwA==",
             "requires": {
-                "@azure/msal-common": "^9.0.2",
+                "@azure/msal-common": "^10.0.0",
                 "jsonwebtoken": "^9.0.0",
                 "uuid": "^8.3.0"
             },
             "dependencies": {
                 "@azure/msal-common": {
-                    "version": "9.0.2",
-                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.2.tgz",
-                    "integrity": "sha512-qzwxuF8kZAp+rNUactMCgJh8fblq9D4lSqrrIxMDzLjgSZtjN32ix7r/HBe8QdOr76II9SVVPcMkX4sPzPfQ7w=="
+                    "version": "10.0.0",
+                    "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-10.0.0.tgz",
+                    "integrity": "sha512-/LghpT93jsZLy55QzTsRZWMx6R1Mjc1Aktwps8sKSGE3WbrGwbSsh2uhDlpl6FMcKChYjJ0ochThWwwOodrQNg=="
                 }
             }
         },
@@ -20059,31 +20182,31 @@
             }
         },
         "@babel/compat-data": {
-            "version": "7.20.10",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz",
-            "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==",
+            "version": "7.20.14",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz",
+            "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==",
             "dev": true
         },
         "@babel/core": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz",
-            "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==",
+            "version": "7.20.12",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
+            "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
             "dev": true,
             "requires": {
                 "@ampproject/remapping": "^2.1.0",
                 "@babel/code-frame": "^7.18.6",
                 "@babel/generator": "^7.20.7",
                 "@babel/helper-compilation-targets": "^7.20.7",
-                "@babel/helper-module-transforms": "^7.20.7",
+                "@babel/helper-module-transforms": "^7.20.11",
                 "@babel/helpers": "^7.20.7",
                 "@babel/parser": "^7.20.7",
                 "@babel/template": "^7.20.7",
-                "@babel/traverse": "^7.20.7",
+                "@babel/traverse": "^7.20.12",
                 "@babel/types": "^7.20.7",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
-                "json5": "^2.2.1",
+                "json5": "^2.2.2",
                 "semver": "^6.3.0"
             }
         },
@@ -20099,9 +20222,9 @@
             }
         },
         "@babel/generator": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
-            "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
+            "version": "7.20.14",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz",
+            "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==",
             "dev": true,
             "requires": {
                 "@babel/types": "^7.20.7",
@@ -20150,9 +20273,9 @@
             }
         },
         "@babel/helper-create-class-features-plugin": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz",
-            "integrity": "sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w==",
+            "version": "7.20.12",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz",
+            "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==",
             "dev": true,
             "requires": {
                 "@babel/helper-annotate-as-pure": "^7.18.6",
@@ -20161,6 +20284,7 @@
                 "@babel/helper-member-expression-to-functions": "^7.20.7",
                 "@babel/helper-optimise-call-expression": "^7.18.6",
                 "@babel/helper-replace-supers": "^7.20.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
                 "@babel/helper-split-export-declaration": "^7.18.6"
             }
         },
@@ -20355,13 +20479,13 @@
             }
         },
         "@babel/helpers": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
-            "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz",
+            "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
             "dev": true,
             "requires": {
                 "@babel/template": "^7.20.7",
-                "@babel/traverse": "^7.20.7",
+                "@babel/traverse": "^7.20.13",
                 "@babel/types": "^7.20.7"
             }
         },
@@ -20377,9 +20501,9 @@
             }
         },
         "@babel/parser": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
-            "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz",
+            "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==",
             "dev": true
         },
         "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
@@ -20753,9 +20877,9 @@
             }
         },
         "@babel/plugin-transform-block-scoping": {
-            "version": "7.20.11",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz",
-            "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz",
+            "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==",
             "dev": true,
             "requires": {
                 "@babel/helper-plugin-utils": "^7.20.2"
@@ -21134,18 +21258,24 @@
                 "esutils": "^2.0.2"
             }
         },
+        "@babel/regjsgen": {
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+            "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+            "dev": true
+        },
         "@babel/runtime": {
-            "version": "7.20.7",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
-            "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
+            "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
             "requires": {
                 "regenerator-runtime": "^0.13.11"
             }
         },
         "@babel/standalone": {
-            "version": "7.20.11",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.11.tgz",
-            "integrity": "sha512-WUPlwwXFk3iViGE7QFVVp423eVtT+eoXu1940Xu4QJgqgHBF6WWtlwO1Ip5rIWQnp7OHrGdwrwKLtLhUVfOZbA==",
+            "version": "7.20.15",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.15.tgz",
+            "integrity": "sha512-B3LmZ1NHlTb2eFEaw8rftZc730Wh9MlmsH8ubb6IjsNoIk9+SQ2aAA0nrm/1806+PftPRAACPClmKTu8PG7Tew==",
             "dev": true
         },
         "@babel/template": {
@@ -21160,9 +21290,9 @@
             }
         },
         "@babel/traverse": {
-            "version": "7.20.10",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz",
-            "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==",
+            "version": "7.20.13",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
+            "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.18.6",
@@ -21171,7 +21301,7 @@
                 "@babel/helper-function-name": "^7.19.0",
                 "@babel/helper-hoist-variables": "^7.18.6",
                 "@babel/helper-split-export-declaration": "^7.18.6",
-                "@babel/parser": "^7.20.7",
+                "@babel/parser": "^7.20.13",
                 "@babel/types": "^7.20.7",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
@@ -21207,9 +21337,9 @@
             "optional": true
         },
         "@cypress/request": {
-            "version": "2.88.10",
-            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz",
-            "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==",
+            "version": "2.88.11",
+            "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz",
+            "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
             "dev": true,
             "requires": {
                 "aws-sign2": "~0.7.0",
@@ -21225,7 +21355,7 @@
                 "json-stringify-safe": "~5.0.1",
                 "mime-types": "~2.1.19",
                 "performance-now": "^2.1.0",
-                "qs": "~6.5.2",
+                "qs": "~6.10.3",
                 "safe-buffer": "^5.1.2",
                 "tough-cookie": "~2.5.0",
                 "tunnel-agent": "^0.6.0",
@@ -21298,9 +21428,9 @@
             },
             "dependencies": {
                 "globals": {
-                    "version": "13.19.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
-                    "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
+                    "version": "13.20.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+                    "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -21348,9 +21478,9 @@
             }
         },
         "@fortawesome/vue-fontawesome": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.2.tgz",
-            "integrity": "sha512-xHVtVY8ASUeEvgcA/7vULUesENhD+pi/EirRHdMBqooHlXBqK+yrV6d8tUye1m5UKQKVgYAHMhUBfOnoiwvc8Q==",
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz",
+            "integrity": "sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==",
             "dev": true
         },
         "@grpc/grpc-js": {
@@ -22001,9 +22131,9 @@
             }
         },
         "@js-joda/core": {
-            "version": "5.5.1",
-            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.1.tgz",
-            "integrity": "sha512-oTFmkyv5MhgkHdZhoe5lwRoKW0t4njPvK3g7ODvK/prkoC5bwylKcyQJMsmjvgHBXoy4u5iLnB5yQ7AljouHAA=="
+            "version": "5.5.2",
+            "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.2.tgz",
+            "integrity": "sha512-retLUN4TwCJ0QJDi9OCJwYVaXAz93NeOkEtEQL98M2bykBOxmURlP0YlfsuE46kItOOVZIWRYC3KsSLhQ1R2Qw=="
         },
         "@louislam/ping": {
             "version": "0.4.2-mod.1",
@@ -22374,13 +22504,13 @@
             }
         },
         "@types/babel__core": {
-            "version": "7.1.20",
-            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
-            "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
+            "version": "7.20.0",
+            "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
+            "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
             "dev": true,
             "requires": {
-                "@babel/parser": "^7.1.0",
-                "@babel/types": "^7.0.0",
+                "@babel/parser": "^7.20.7",
+                "@babel/types": "^7.20.7",
                 "@types/babel__generator": "*",
                 "@types/babel__template": "*",
                 "@types/babel__traverse": "*"
@@ -22478,20 +22608,20 @@
             }
         },
         "@types/express": {
-            "version": "4.17.15",
-            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz",
-            "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==",
+            "version": "4.17.17",
+            "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+            "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
             "requires": {
                 "@types/body-parser": "*",
-                "@types/express-serve-static-core": "^4.17.31",
+                "@types/express-serve-static-core": "^4.17.33",
                 "@types/qs": "*",
                 "@types/serve-static": "*"
             }
         },
         "@types/express-serve-static-core": {
-            "version": "4.17.32",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz",
-            "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==",
+            "version": "4.17.33",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+            "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
             "requires": {
                 "@types/node": "*",
                 "@types/qs": "*",
@@ -22499,9 +22629,9 @@
             }
         },
         "@types/graceful-fs": {
-            "version": "4.1.5",
-            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-            "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+            "version": "4.1.6",
+            "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+            "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
             "dev": true,
             "requires": {
                 "@types/node": "*"
@@ -22596,9 +22726,9 @@
             "dev": true
         },
         "@types/node": {
-            "version": "18.11.18",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
-            "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
+            "version": "18.13.0",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz",
+            "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg=="
         },
         "@types/normalize-package-data": {
             "version": "2.4.1",
@@ -22714,39 +22844,39 @@
             "dev": true
         },
         "@vue/compiler-core": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
-            "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
+            "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/shared": "3.2.45",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "@vue/compiler-dom": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
-            "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
+            "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
             "dev": true,
             "requires": {
-                "@vue/compiler-core": "3.2.45",
-                "@vue/shared": "3.2.45"
+                "@vue/compiler-core": "3.2.47",
+                "@vue/shared": "3.2.47"
             }
         },
         "@vue/compiler-sfc": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
-            "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
+            "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.45",
-                "@vue/compiler-dom": "3.2.45",
-                "@vue/compiler-ssr": "3.2.45",
-                "@vue/reactivity-transform": "3.2.45",
-                "@vue/shared": "3.2.45",
+                "@vue/compiler-core": "3.2.47",
+                "@vue/compiler-dom": "3.2.47",
+                "@vue/compiler-ssr": "3.2.47",
+                "@vue/reactivity-transform": "3.2.47",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7",
                 "postcss": "^8.1.10",
@@ -22765,19 +22895,19 @@
             }
         },
         "@vue/compiler-ssr": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
-            "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
+            "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
             "dev": true,
             "requires": {
-                "@vue/compiler-dom": "3.2.45",
-                "@vue/shared": "3.2.45"
+                "@vue/compiler-dom": "3.2.47",
+                "@vue/shared": "3.2.47"
             }
         },
         "@vue/devtools-api": {
-            "version": "6.4.5",
-            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz",
-            "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==",
+            "version": "6.5.0",
+            "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
+            "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==",
             "dev": true
         },
         "@vue/reactivity": {
@@ -22798,14 +22928,14 @@
             }
         },
         "@vue/reactivity-transform": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
-            "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
+            "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.16.4",
-                "@vue/compiler-core": "3.2.45",
-                "@vue/shared": "3.2.45",
+                "@vue/compiler-core": "3.2.47",
+                "@vue/shared": "3.2.47",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             },
@@ -22909,9 +23039,9 @@
             }
         },
         "@vue/shared": {
-            "version": "3.2.45",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
-            "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
+            "version": "3.2.47",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
+            "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==",
             "dev": true
         },
         "@vuepic/vue-datepicker": {
@@ -22944,9 +23074,9 @@
             }
         },
         "acorn": {
-            "version": "8.8.1",
-            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
-            "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
+            "version": "8.8.2",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+            "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
             "dev": true
         },
         "acorn-globals": {
@@ -23207,6 +23337,11 @@
             "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
             "dev": true
         },
+        "available-typed-arrays": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+            "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
+        },
         "await-lock": {
             "version": "2.2.2",
             "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
@@ -23219,9 +23354,9 @@
             "devOptional": true
         },
         "aws4": {
-            "version": "1.11.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-            "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+            "version": "1.12.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+            "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
             "devOptional": true
         },
         "axios": {
@@ -23462,11 +23597,6 @@
                 "readable-stream": "~1.0.2"
             },
             "dependencies": {
-                "isarray": {
-                    "version": "0.0.1",
-                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-                    "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
-                },
                 "readable-stream": {
                     "version": "1.0.34",
                     "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
@@ -23676,15 +23806,15 @@
             "dev": true
         },
         "browserslist": {
-            "version": "4.21.4",
-            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
-            "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+            "version": "4.21.5",
+            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+            "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
             "dev": true,
             "requires": {
-                "caniuse-lite": "^1.0.30001400",
-                "electron-to-chromium": "^1.4.251",
-                "node-releases": "^2.0.6",
-                "update-browserslist-db": "^1.0.9"
+                "caniuse-lite": "^1.0.30001449",
+                "electron-to-chromium": "^1.4.284",
+                "node-releases": "^2.0.8",
+                "update-browserslist-db": "^1.0.10"
             }
         },
         "bser": {
@@ -23755,13 +23885,13 @@
             "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A=="
         },
         "cacheable-request": {
-            "version": "10.2.5",
-            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.5.tgz",
-            "integrity": "sha512-5RwYYCfzjNPsyJxb/QpaM0bfzx+kw5/YpDhZPm9oMIDntHFQ9YXeyV47ZvzlTE0XrrrbyO2UITJH4GF9eRLdXQ==",
+            "version": "10.2.7",
+            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.7.tgz",
+            "integrity": "sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==",
             "requires": {
                 "@types/http-cache-semantics": "^4.0.1",
                 "get-stream": "^6.0.1",
-                "http-cache-semantics": "^4.1.0",
+                "http-cache-semantics": "^4.1.1",
                 "keyv": "^4.5.2",
                 "mimic-response": "^4.0.0",
                 "normalize-url": "^8.0.0",
@@ -23811,12 +23941,20 @@
                 "camelcase": "^5.3.1",
                 "map-obj": "^4.0.0",
                 "quick-lru": "^4.0.1"
+            },
+            "dependencies": {
+                "quick-lru": {
+                    "version": "4.0.1",
+                    "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+                    "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+                    "dev": true
+                }
             }
         },
         "caniuse-lite": {
-            "version": "1.0.30001441",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
-            "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==",
+            "version": "1.0.30001451",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz",
+            "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==",
             "dev": true
         },
         "caseless": {
@@ -24321,9 +24459,9 @@
             }
         },
         "content-type": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-            "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+            "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
         },
         "convert-source-map": {
             "version": "1.9.0",
@@ -24348,9 +24486,9 @@
             "dev": true
         },
         "core-js-compat": {
-            "version": "3.27.1",
-            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz",
-            "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==",
+            "version": "3.27.2",
+            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz",
+            "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==",
             "dev": true,
             "requires": {
                 "browserslist": "^4.21.4"
@@ -24747,9 +24885,9 @@
             "dev": true
         },
         "deepmerge": {
-            "version": "4.2.2",
-            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-            "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
+            "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==",
             "dev": true
         },
         "defer-to-connect": {
@@ -24956,9 +25094,9 @@
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
         },
         "electron-to-chromium": {
-            "version": "1.4.284",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
-            "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+            "version": "1.4.294",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.294.tgz",
+            "integrity": "sha512-PuHZB3jEN7D8WPPjLmBQAsqQz8tWHlkkB4n0E2OYw8RwVdmBYV0Wn+rUFH8JqYyIRb4HQhhedgxlZL163wqLrQ==",
             "dev": true
         },
         "emittery": {
@@ -25035,9 +25173,9 @@
             }
         },
         "engine.io-parser": {
-            "version": "5.0.4",
-            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
-            "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
+            "version": "5.0.6",
+            "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz",
+            "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw=="
         },
         "enquirer": {
             "version": "2.3.6",
@@ -25069,26 +25207,32 @@
             }
         },
         "es-abstract": {
-            "version": "1.20.5",
-            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
-            "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
+            "version": "1.21.1",
+            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+            "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
             "requires": {
+                "available-typed-arrays": "^1.0.5",
                 "call-bind": "^1.0.2",
+                "es-set-tostringtag": "^2.0.1",
                 "es-to-primitive": "^1.2.1",
                 "function-bind": "^1.1.1",
                 "function.prototype.name": "^1.1.5",
                 "get-intrinsic": "^1.1.3",
                 "get-symbol-description": "^1.0.0",
+                "globalthis": "^1.0.3",
                 "gopd": "^1.0.1",
                 "has": "^1.0.3",
                 "has-property-descriptors": "^1.0.0",
+                "has-proto": "^1.0.1",
                 "has-symbols": "^1.0.3",
-                "internal-slot": "^1.0.3",
+                "internal-slot": "^1.0.4",
+                "is-array-buffer": "^3.0.1",
                 "is-callable": "^1.2.7",
                 "is-negative-zero": "^2.0.2",
                 "is-regex": "^1.1.4",
                 "is-shared-array-buffer": "^1.0.2",
                 "is-string": "^1.0.7",
+                "is-typed-array": "^1.1.10",
                 "is-weakref": "^1.0.2",
                 "object-inspect": "^1.12.2",
                 "object-keys": "^1.1.1",
@@ -25097,7 +25241,9 @@
                 "safe-regex-test": "^1.0.0",
                 "string.prototype.trimend": "^1.0.6",
                 "string.prototype.trimstart": "^1.0.6",
-                "unbox-primitive": "^1.0.2"
+                "typed-array-length": "^1.0.4",
+                "unbox-primitive": "^1.0.2",
+                "which-typed-array": "^1.1.9"
             }
         },
         "es-aggregate-error": {
@@ -25114,6 +25260,16 @@
                 "has-property-descriptors": "^1.0.0"
             }
         },
+        "es-set-tostringtag": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+            "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+            "requires": {
+                "get-intrinsic": "^1.1.3",
+                "has": "^1.0.3",
+                "has-tostringtag": "^1.0.0"
+            }
+        },
         "es-to-primitive": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
@@ -25476,9 +25632,9 @@
                     "dev": true
                 },
                 "globals": {
-                    "version": "13.19.0",
-                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
-                    "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
+                    "version": "13.20.0",
+                    "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+                    "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
                     "dev": true,
                     "requires": {
                         "type-fest": "^0.20.2"
@@ -26032,6 +26188,14 @@
             "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
             "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
         },
+        "for-each": {
+            "version": "0.3.3",
+            "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+            "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+            "requires": {
+                "is-callable": "^1.1.3"
+            }
+        },
         "forever-agent": {
             "version": "0.6.1",
             "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -26073,6 +26237,12 @@
                 "readable-stream": "^2.0.0"
             },
             "dependencies": {
+                "isarray": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+                    "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+                    "dev": true
+                },
                 "readable-stream": {
                     "version": "2.3.7",
                     "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -26174,9 +26344,9 @@
             "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
         },
         "gamedig": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.0.5.tgz",
-            "integrity": "sha512-ROwljeTH8fcF44wi+NfTBdYSmiwtI5f1CJyGUx1DGVDvx7w2bfTxYSwR8FFFLCpNr78mtSwhsBONz1WZ5ucVig==",
+            "version": "4.0.6",
+            "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.0.6.tgz",
+            "integrity": "sha512-h0k9n/e5vNrd9Mh2wyFUp2Vo7ABWbDkdBxKC6FNJLOZiU5d9Z29bntGeYbXtOkcRWoV6Q63wSAJ3jLWxYQkpZw==",
             "requires": {
                 "cheerio": "^1.0.0-rc.10",
                 "compressjs": "^1.0.2",
@@ -26249,9 +26419,9 @@
             "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
         },
         "get-intrinsic": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
-            "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+            "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
             "requires": {
                 "function-bind": "^1.1.1",
                 "has": "^1.0.3",
@@ -26510,6 +26680,11 @@
                 "get-intrinsic": "^1.1.1"
             }
         },
+        "has-proto": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+            "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="
+        },
         "has-symbols": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
@@ -26601,9 +26776,9 @@
             }
         },
         "http-cache-semantics": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-            "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+            "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
         },
         "http-errors": {
             "version": "1.8.1",
@@ -26653,13 +26828,6 @@
             "requires": {
                 "quick-lru": "^5.1.1",
                 "resolve-alpn": "^1.2.0"
-            },
-            "dependencies": {
-                "quick-lru": {
-                    "version": "5.1.1",
-                    "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-                    "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
-                }
             }
         },
         "https-proxy-agent": {
@@ -26686,9 +26854,9 @@
             "dev": true
         },
         "hyperid": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.0.1.tgz",
-            "integrity": "sha512-I+tl7TS5nsoVhkxqX1rS3Qmqlq44eoPUcgPthW8v3IW8CvWL7lwtd6HQbkDUMrBKJTG0vgEaRsjT35imW/D+9Q==",
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.1.1.tgz",
+            "integrity": "sha512-RveV33kIksycSf7HLkq1sHB5wW0OwuX8ot8MYnY++gaaPXGFfKpBncHrAWxdpuEeRlazUMGWefwP1w6o6GaumA==",
             "dev": true,
             "requires": {
                 "uuid": "^8.3.2",
@@ -26773,11 +26941,11 @@
             "dev": true
         },
         "internal-slot": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
-            "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+            "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
             "requires": {
-                "get-intrinsic": "^1.1.3",
+                "get-intrinsic": "^1.2.0",
                 "has": "^1.0.3",
                 "side-channel": "^1.0.4"
             }
@@ -26797,6 +26965,16 @@
             "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
             "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
         },
+        "is-array-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
+            "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
+            "requires": {
+                "call-bind": "^1.0.2",
+                "get-intrinsic": "^1.1.3",
+                "is-typed-array": "^1.1.10"
+            }
+        },
         "is-arrayish": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -27029,6 +27207,18 @@
                 "has-symbols": "^1.0.2"
             }
         },
+        "is-typed-array": {
+            "version": "1.1.10",
+            "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+            "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+            "requires": {
+                "available-typed-arrays": "^1.0.5",
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "gopd": "^1.0.1",
+                "has-tostringtag": "^1.0.0"
+            }
+        },
         "is-typedarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -27066,9 +27256,9 @@
             }
         },
         "isarray": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+            "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
         },
         "isemail": {
             "version": "3.2.0",
@@ -28505,9 +28695,9 @@
             "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
         },
         "js-sdsl": {
-            "version": "4.1.4",
-            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
-            "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw=="
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+            "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ=="
         },
         "js-tokens": {
             "version": "4.0.0",
@@ -28776,9 +28966,9 @@
             "dev": true
         },
         "knex": {
-            "version": "2.4.0",
-            "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.0.tgz",
-            "integrity": "sha512-i0GWwqYp1Hs2yvc2rlDO6nzzkLhwdyOZKRdsMTB8ZxOs2IXQyL5rBjSbS1krowCh6V65T4X9CJaKtuIfkaPGSA==",
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz",
+            "integrity": "sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==",
             "requires": {
                 "colorette": "2.0.19",
                 "commander": "^9.1.0",
@@ -29273,9 +29463,9 @@
             }
         },
         "minimist": {
-            "version": "1.2.7",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
-            "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+            "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
         },
         "minimist-options": {
             "version": "4.1.0",
@@ -29289,19 +29479,9 @@
             }
         },
         "minipass": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz",
-            "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==",
-            "requires": {
-                "yallist": "^4.0.0"
-            },
-            "dependencies": {
-                "yallist": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-                }
-            }
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz",
+            "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw=="
         },
         "minizlib": {
             "version": "2.1.2",
@@ -29466,9 +29646,9 @@
             },
             "dependencies": {
                 "commander": {
-                    "version": "9.4.1",
-                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
-                    "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw=="
+                    "version": "9.5.0",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+                    "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
                 }
             }
         },
@@ -29503,26 +29683,17 @@
             }
         },
         "named-placeholders": {
-            "version": "1.1.2",
-            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
-            "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
+            "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
             "requires": {
-                "lru-cache": "^4.1.3"
+                "lru-cache": "^7.14.1"
             },
             "dependencies": {
                 "lru-cache": {
-                    "version": "4.1.5",
-                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-                    "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-                    "requires": {
-                        "pseudomap": "^1.0.2",
-                        "yallist": "^2.1.2"
-                    }
-                },
-                "yallist": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-                    "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
+                    "version": "7.14.1",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz",
+                    "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA=="
                 }
             }
         },
@@ -29554,9 +29725,9 @@
             "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
         },
         "node-abort-controller": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz",
-            "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw=="
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
+            "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="
         },
         "node-addon-api": {
             "version": "4.3.0",
@@ -29572,9 +29743,9 @@
             }
         },
         "node-fetch": {
-            "version": "2.6.7",
-            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-            "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+            "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
             "requires": {
                 "whatwg-url": "^5.0.0"
             },
@@ -29665,6 +29836,12 @@
                         "number-is-nan": "^1.0.0"
                     }
                 },
+                "isarray": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+                    "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+                    "optional": true
+                },
                 "lru-cache": {
                     "version": "6.0.0",
                     "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -29769,9 +29946,9 @@
             "integrity": "sha512-i3Sf6khnenl0aXumo0whAlfPWTaBqHxEnVBBxpu3dZ7q69NkPPv71rvPjlDZ5wkeKCTNNUTECljerS5kcYQxRw=="
         },
         "node-releases": {
-            "version": "2.0.8",
-            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz",
-            "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==",
+            "version": "2.0.10",
+            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+            "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
             "dev": true
         },
         "nodemailer": {
@@ -29876,12 +30053,12 @@
             }
         },
         "number-allocator": {
-            "version": "1.0.12",
-            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.12.tgz",
-            "integrity": "sha512-sGB0qoQGmKimery9JubBQ9pQUr1V/LixJAk3Ygp7obZf6mpSXime8d7XHEobbIimkdZpgjkNlLt6G7LPEWFYWg==",
+            "version": "1.0.14",
+            "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz",
+            "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==",
             "requires": {
                 "debug": "^4.3.1",
-                "js-sdsl": "4.1.4"
+                "js-sdsl": "4.3.0"
             }
         },
         "number-is-nan": {
@@ -29913,9 +30090,9 @@
             "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
         },
         "object-inspect": {
-            "version": "1.12.2",
-            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
-            "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
+            "version": "1.12.3",
+            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+            "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
         },
         "object-keys": {
             "version": "1.1.1",
@@ -29964,9 +30141,9 @@
             }
         },
         "open": {
-            "version": "8.4.0",
-            "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
-            "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+            "version": "8.4.1",
+            "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz",
+            "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==",
             "requires": {
                 "define-lazy-prop": "^2.0.0",
                 "is-docker": "^2.1.1",
@@ -30180,9 +30357,9 @@
             "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w=="
         },
         "pg-protocol": {
-            "version": "1.5.0",
-            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
-            "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+            "version": "1.6.0",
+            "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
+            "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="
         },
         "pg-types": {
             "version": "2.2.0",
@@ -30256,9 +30433,9 @@
             "dev": true
         },
         "postcss": {
-            "version": "8.4.20",
-            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
-            "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
+            "version": "8.4.21",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+            "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
             "dev": true,
             "requires": {
                 "nanoid": "^3.3.4",
@@ -30279,9 +30456,9 @@
             },
             "dependencies": {
                 "js-tokens": {
-                    "version": "8.0.0",
-                    "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.0.tgz",
-                    "integrity": "sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==",
+                    "version": "8.0.1",
+                    "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.1.tgz",
+                    "integrity": "sha512-3AGrZT6tuMm1ZWWn9mLXh7XMfi2YtiLNPALCVxBCiUVq0LD1OQMxV/AdS/s7rLJU5o9i/jBZw/N4vXXL5dm29A==",
                     "dev": true
                 }
             }
@@ -30487,11 +30664,6 @@
             "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
             "dev": true
         },
-        "pseudomap": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-            "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
-        },
         "psl": {
             "version": "1.9.0",
             "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -30508,9 +30680,9 @@
             }
         },
         "punycode": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+            "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
         },
         "q": {
             "version": "1.5.1",
@@ -30619,10 +30791,13 @@
             }
         },
         "qs": {
-            "version": "6.5.3",
-            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-            "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
-            "devOptional": true
+            "version": "6.10.4",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
+            "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
+            "dev": true,
+            "requires": {
+                "side-channel": "^1.0.4"
+            }
         },
         "querystringify": {
             "version": "2.2.0",
@@ -30637,10 +30812,9 @@
             "dev": true
         },
         "quick-lru": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
-            "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
-            "dev": true
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
         },
         "radius": {
             "version": "1.1.4",
@@ -30863,25 +31037,19 @@
             "dev": true
         },
         "regexpu-core": {
-            "version": "5.2.2",
-            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz",
-            "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==",
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.0.tgz",
+            "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==",
             "dev": true,
             "requires": {
+                "@babel/regjsgen": "^0.8.0",
                 "regenerate": "^1.4.2",
                 "regenerate-unicode-properties": "^10.1.0",
-                "regjsgen": "^0.7.1",
                 "regjsparser": "^0.9.1",
                 "unicode-match-property-ecmascript": "^2.0.0",
                 "unicode-match-property-value-ecmascript": "^2.1.0"
             }
         },
-        "regjsgen": {
-            "version": "0.7.1",
-            "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz",
-            "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==",
-            "dev": true
-        },
         "regjsparser": {
             "version": "0.9.1",
             "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
@@ -30966,6 +31134,12 @@
                         "verror": "1.10.0"
                     }
                 },
+                "qs": {
+                    "version": "6.5.3",
+                    "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+                    "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+                    "optional": true
+                },
                 "uuid": {
                     "version": "3.4.0",
                     "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -31045,9 +31219,9 @@
             "dev": true
         },
         "resolve.exports": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
-            "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+            "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
             "dev": true
         },
         "responselike": {
@@ -31364,9 +31538,9 @@
             "dev": true
         },
         "shell-quote": {
-            "version": "1.7.4",
-            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz",
-            "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==",
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
+            "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==",
             "dev": true
         },
         "side-channel": {
@@ -31468,9 +31642,9 @@
             }
         },
         "socket.io-parser": {
-            "version": "4.2.1",
-            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
-            "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
+            "version": "4.2.2",
+            "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz",
+            "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==",
             "requires": {
                 "@socket.io/component-emitter": "~3.1.0",
                 "debug": "~4.3.1"
@@ -31683,6 +31857,11 @@
                 "readable-stream": "^2.1.0"
             },
             "dependencies": {
+                "isarray": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+                    "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+                },
                 "readable-stream": {
                     "version": "2.3.7",
                     "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -32239,9 +32418,9 @@
             "dev": true
         },
         "tslib": {
-            "version": "2.4.1",
-            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
-            "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+            "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
         },
         "tunnel": {
             "version": "0.0.6",
@@ -32294,6 +32473,16 @@
                 "mime-types": "~2.1.24"
             }
         },
+        "typed-array-length": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+            "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+            "requires": {
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "is-typed-array": "^1.1.9"
+            }
+        },
         "typedarray": {
             "version": "0.0.6",
             "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -32807,9 +32996,9 @@
             }
         },
         "vue-multiselect": {
-            "version": "3.0.0-alpha.2",
-            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-alpha.2.tgz",
-            "integrity": "sha512-Xp9fGJECns45v+v8jXbCIsAkCybYkEg0lNwr7Z6HDUSMyx2TEIK2giipPE+qXiShEc1Ipn+ZtttH2iq9hwXP4Q==",
+            "version": "3.0.0-beta.1",
+            "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-3.0.0-beta.1.tgz",
+            "integrity": "sha512-V+jpydtjyHcQ+yjHsEWEBrDAopOx/pufNkSAXNVDAGQ+ESDEJ7wYejNd9H1RiCnFOYK4yf1XSGqE+Mp3HJXmdg==",
             "dev": true
         },
         "vue-prism-editor": {
@@ -32893,15 +33082,15 @@
                     }
                 },
                 "joi": {
-                    "version": "17.7.0",
-                    "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz",
-                    "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==",
+                    "version": "17.7.1",
+                    "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.1.tgz",
+                    "integrity": "sha512-teoLhIvWE298R6AeJywcjR4sX2hHjB3/xJX4qPjg+gTg+c0mzUDsziYlqPmLomq9gVsfaMcgPaGc7VxtD/9StA==",
                     "dev": true,
                     "requires": {
                         "@hapi/hoek": "^9.0.0",
                         "@hapi/topo": "^5.0.0",
                         "@sideway/address": "^4.1.3",
-                        "@sideway/formula": "^3.0.0",
+                        "@sideway/formula": "^3.0.1",
                         "@sideway/pinpoint": "^2.0.0"
                     }
                 }
@@ -32986,6 +33175,19 @@
             "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
             "dev": true
         },
+        "which-typed-array": {
+            "version": "1.1.9",
+            "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+            "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+            "requires": {
+                "available-typed-arrays": "^1.0.5",
+                "call-bind": "^1.0.2",
+                "for-each": "^0.3.3",
+                "gopd": "^1.0.1",
+                "has-tostringtag": "^1.0.0",
+                "is-typed-array": "^1.1.10"
+            }
+        },
         "wide-align": {
             "version": "1.1.5",
             "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",

From 8092640e2078bb6c85519f973d4cd3f1eb2a2bb8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 13 Feb 2023 00:33:37 +0800
Subject: [PATCH 577/803] Update security report guide (#2762)

---
 .github/ISSUE_TEMPLATE/security.md | 19 +++++++++++++++++++
 SECURITY.md                        |  3 ++-
 2 files changed, 21 insertions(+), 1 deletion(-)
 create mode 100644 .github/ISSUE_TEMPLATE/security.md

diff --git a/.github/ISSUE_TEMPLATE/security.md b/.github/ISSUE_TEMPLATE/security.md
new file mode 100644
index 00000000..26450ed3
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/security.md
@@ -0,0 +1,19 @@
+---
+
+name: "Security Issue"
+about: "Just for alerting @louislam, do not provide any details here"
+title: "Security Issue"
+ref: "main"
+labels:
+
+- security
+
+---
+
+DO NOT PROVIDE ANY DETAILS HERE. Please privately report to https://github.com/louislam/uptime-kuma/security/advisories/new.
+
+
+Why need this issue? It is because GitHub Advisory do not send a notification to @louislam, it is a workaround to do so.
+
+Your GitHub Advisory URL:
+
diff --git a/SECURITY.md b/SECURITY.md
index c30e5f4f..43dc7654 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,7 +2,8 @@
 
 ## Reporting a Vulnerability
 
-Please report security issues to https://github.com/louislam/uptime-kuma/security/advisories/new.
+1. Please report security issues to https://github.com/louislam/uptime-kuma/security/advisories/new.
+1. Please also create a empty security issues for alerting me, as GitHub Advisory do not send a notification, I probably will miss without this. https://github.com/louislam/uptime-kuma/issues/new?assignees=&labels=help&template=security.md
 
 Do not use the public issue tracker or discuss it in the public as it will cause more damage.
 

From 51dbb23230582124b97019006757686909235581 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Mon, 13 Feb 2023 05:05:30 +0800
Subject: [PATCH 578/803] Feat: Add "Add New Tag" button in settings

---
 src/components/TagEditDialog.vue | 59 ++++++++++++++++++++++++++++++--
 src/components/settings/Tags.vue | 23 +++++++++----
 2 files changed, 72 insertions(+), 10 deletions(-)

diff --git a/src/components/TagEditDialog.vue b/src/components/TagEditDialog.vue
index 80ca32bb..b77e1286 100644
--- a/src/components/TagEditDialog.vue
+++ b/src/components/TagEditDialog.vue
@@ -160,7 +160,7 @@ export default {
     watch: {
         // Set color option to "Custom" when a unknown color is entered
         "tag.color"(to, from) {
-            if (colorOptions(this).find(x => x.color === to) == null) {
+            if (to !== "" && colorOptions(this).find(x => x.color === to) == null) {
                 this.selectedColor.name = this.$t("Custom");
                 this.selectedColor.color = to;
             }
@@ -197,6 +197,21 @@ export default {
             this.$refs.confirmDelete.show();
         },
 
+        /**
+         * Reset the editTag form
+         */
+        reset() {
+            this.selectedColor = null;
+            this.tag = {
+                id: null,
+                name: "",
+                color: "",
+            };
+            this.monitors = [];
+            this.removingMonitor = [];
+            this.addingMonitor = [];
+        },
+
         /**
          * Load tag information for display in the edit dialog
          * @param {Object} tag tag object to edit
@@ -228,6 +243,22 @@ export default {
             this.processing = true;
             let editResult = true;
 
+            if (this.tag.id == null) {
+                await this.addTagAsync(this.tag).then((res) => {
+                    if (!res.ok) {
+                        this.$root.toastRes(res.msg);
+                        editResult = false;
+                    } else {
+                        this.tag.id = res.tag.id;
+                        this.updated();
+                    }
+                });
+            }
+
+            if (!editResult) {
+                return;
+            }
+
             for (let addId of this.addingMonitor) {
                 await this.addMonitorTagAsync(this.tag.id, addId, "").then((res) => {
                     if (!res.ok) {
@@ -263,9 +294,9 @@ export default {
          * Delete the editing tag from server
          * @returns {void}
          */
-        deleteTag() {
+        async deleteTag() {
             this.processing = true;
-            this.$root.getSocket().emit("deleteTag", this.tag.id, (res) => {
+            await this.deleteTagAsync(this.tag.id).then((res) => {
                 this.$root.toastRes(res);
                 this.processing = false;
 
@@ -309,6 +340,28 @@ export default {
             return getMonitorRelativeURL(id);
         },
 
+        /**
+         * Add a tag asynchronously
+         * @param {Object} newTag Object representing new tag to add
+         * @returns {Promise<void>}
+         */
+        addTagAsync(newTag) {
+            return new Promise((resolve) => {
+                this.$root.getSocket().emit("addTag", newTag, resolve);
+            });
+        },
+
+        /**
+         * Delete a tag asynchronously
+         * @param {number} tagId ID of tag to delete
+         * @returns {Promise<void>}
+         */
+        deleteTagAsync(tagId) {
+            return new Promise((resolve) => {
+                this.$root.getSocket().emit("deleteTag", tagId, resolve);
+            });
+        },
+
         /**
          * Add a tag to a monitor asynchronously
          * @param {number} tagId ID of tag to add
diff --git a/src/components/settings/Tags.vue b/src/components/settings/Tags.vue
index 347a6ef2..d54d0c49 100644
--- a/src/components/settings/Tags.vue
+++ b/src/components/settings/Tags.vue
@@ -1,5 +1,9 @@
 <template>
-    <div>
+    <div class="my-4">
+        <div class="mx-4 pt-1 my-3">
+            <button class="btn btn-primary" @click.stop="addTag"><font-awesome-icon icon="plus" /> {{ $t("Add New Tag") }}</button>
+        </div>
+
         <div class="tags-list my-3">
             <div v-for="(tag, index) in tagsList" :key="tag.id" class="d-flex align-items-center mx-4 py-1 tags-list-row" :disabled="processing" @click="editTag(index)">
                 <div class="col-5 ps-1">
@@ -100,6 +104,15 @@ export default {
             this.$refs.confirmDelete.show();
         },
 
+        /**
+         * Show dialog for adding a new tag
+         * @returns {void}
+         */
+        addTag() {
+            this.$refs.tagEditDialog.reset();
+            this.$refs.tagEditDialog.show();
+        },
+
         /**
          * Show dialog for editing a tag
          * @param {number} index index of the tag to edit in the local tagsList
@@ -149,10 +162,10 @@ export default {
 
 .tags-list .tags-list-row {
     cursor: pointer;
-    border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+    border-top: 1px solid rgba(0, 0, 0, 0.125);
 
     .dark & {
-        border-bottom: 1px solid $dark-border-color;
+        border-top: 1px solid $dark-border-color;
     }
 
     &:hover {
@@ -164,8 +177,4 @@ export default {
     }
 }
 
-.tags-list .tags-list-row:last-child {
-    border: none;
-}
-
 </style>

From f1bac7ce8ae0cc0f22ee89d98949568e7c000300 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 13 Feb 2023 16:26:45 +0800
Subject: [PATCH 579/803] Add a script that deploy to the demo server

---
 CONTRIBUTING.md             |   2 +-
 extra/deploy-demo-server.js |  54 ++++++++++++
 package-lock.json           | 167 ++++++++++++++++++++++++++++++++++++
 package.json                |   6 +-
 4 files changed, 226 insertions(+), 3 deletions(-)
 create mode 100644 extra/deploy-demo-server.js

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3f455092..09c94e71 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -240,7 +240,7 @@ https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc
 5. `git push`
 6. Publish the release note as 1.X.X 
 7. Press any key to continue
-8. SSH to demo site server and update to 1.X.X
+8. Deploy to the demo server: `npm run deploy-demo-server`
 
 Checking:
 
diff --git a/extra/deploy-demo-server.js b/extra/deploy-demo-server.js
new file mode 100644
index 00000000..210270f2
--- /dev/null
+++ b/extra/deploy-demo-server.js
@@ -0,0 +1,54 @@
+require("dotenv").config();
+const { NodeSSH } = require("node-ssh");
+const readline = require("readline");
+const rl = readline.createInterface({ input: process.stdin,
+    output: process.stdout });
+const prompt = (query) => new Promise((resolve) => rl.question(query, resolve));
+
+(async () => {
+    try {
+        console.log("SSH to demo server");
+        const ssh = new NodeSSH();
+        await ssh.connect({
+            host: process.env.UPTIME_KUMA_DEMO_HOST,
+            port: process.env.UPTIME_KUMA_DEMO_PORT,
+            username: process.env.UPTIME_KUMA_DEMO_USERNAME,
+            privateKeyPath: process.env.UPTIME_KUMA_DEMO_PRIVATE_KEY_PATH
+        });
+
+        let cwd = process.env.UPTIME_KUMA_DEMO_CWD;
+        let result;
+
+        const version = await prompt("Enter Version: ");
+
+        result = await ssh.execCommand("git fetch --all", {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
+        await prompt("Press any key to continue...");
+
+        result = await ssh.execCommand(`git checkout ${version} --force`, {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
+        result = await ssh.execCommand("npm install --production", {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
+        result = await ssh.execCommand("pm2 restart 1", {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
+    } catch (e) {
+        console.log(e);
+    } finally {
+        rl.close();
+    }
+})();
+
+// When done reading prompt, exit program
+rl.on("close", () => process.exit(0));
diff --git a/package-lock.json b/package-lock.json
index 5d172288..273cb480 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -95,6 +95,7 @@
                 "favico.js": "~0.3.10",
                 "jest": "~27.2.5",
                 "marked": "~4.2.5",
+                "node-ssh": "^13.0.1",
                 "postcss-html": "~1.5.0",
                 "postcss-rtlcss": "~3.7.2",
                 "postcss-scss": "~4.0.4",
@@ -6258,6 +6259,16 @@
                 "node": ">=4"
             }
         },
+        "node_modules/buildcheck": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz",
+            "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==",
+            "dev": true,
+            "optional": true,
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
         "node_modules/bulk-write-stream": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz",
@@ -7135,6 +7146,21 @@
                 "node": ">=10"
             }
         },
+        "node_modules/cpu-features": {
+            "version": "0.0.4",
+            "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz",
+            "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==",
+            "dev": true,
+            "hasInstallScript": true,
+            "optional": true,
+            "dependencies": {
+                "buildcheck": "0.0.3",
+                "nan": "^2.15.0"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
         "node_modules/cron-validate": {
             "version": "1.4.5",
             "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.5.tgz",
@@ -14204,6 +14230,13 @@
                 "node": ">=12"
             }
         },
+        "node_modules/nan": {
+            "version": "2.17.0",
+            "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+            "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
+            "dev": true,
+            "optional": true
+        },
         "node_modules/nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -14501,6 +14534,23 @@
             "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
             "dev": true
         },
+        "node_modules/node-ssh": {
+            "version": "13.0.1",
+            "resolved": "https://registry.npmjs.org/node-ssh/-/node-ssh-13.0.1.tgz",
+            "integrity": "sha512-prGXb9KXXtrienVBPiyOCm7F8KSsQciN8VCgrkZeJAlSEtF8HsXa/0uVE5a6MgwIBPa0etTgwiyj/lfiFdVK1Q==",
+            "dev": true,
+            "dependencies": {
+                "is-stream": "^2.0.0",
+                "make-dir": "^3.1.0",
+                "sb-promise-queue": "^2.1.0",
+                "sb-scandir": "^3.1.0",
+                "shell-escape": "^0.2.0",
+                "ssh2": "^1.5.0"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
         "node_modules/nodemailer": {
             "version": "6.6.5",
             "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.5.tgz",
@@ -16547,6 +16597,27 @@
                 "node": ">=10"
             }
         },
+        "node_modules/sb-promise-queue": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/sb-promise-queue/-/sb-promise-queue-2.1.0.tgz",
+            "integrity": "sha512-zwq4YuP1FQFkGx2Q7GIkZYZ6PqWpV+bg0nIO1sJhWOyGyhqbj0MsTvK6lCFo5TQwX5pZr6SCQ75e8PCDCuNvkg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/sb-scandir": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/sb-scandir/-/sb-scandir-3.1.0.tgz",
+            "integrity": "sha512-70BVm2xz9jn94zSQdpvYrEG101/UV9TVGcfWr9T5iob3QhCK4lYXeculfBqPGFv3XTeKgx4dpWyYIDeZUqo4kg==",
+            "dev": true,
+            "dependencies": {
+                "sb-promise-queue": "^2.1.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
         "node_modules/semver": {
             "version": "6.3.0",
             "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -16641,6 +16712,12 @@
                 "node": ">=8"
             }
         },
+        "node_modules/shell-escape": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz",
+            "integrity": "sha512-uRRBT2MfEOyxuECseCZd28jC1AJ8hmqqneWQ4VWUTgCAFvb3wKU1jLqj6egC4Exrr88ogg3dp+zroH4wJuaXzw==",
+            "dev": true
+        },
         "node_modules/shell-quote": {
             "version": "1.8.0",
             "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
@@ -16930,6 +17007,24 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/ssh2": {
+            "version": "1.11.0",
+            "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz",
+            "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==",
+            "dev": true,
+            "hasInstallScript": true,
+            "dependencies": {
+                "asn1": "^0.2.4",
+                "bcrypt-pbkdf": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=10.16.0"
+            },
+            "optionalDependencies": {
+                "cpu-features": "~0.0.4",
+                "nan": "^2.16.0"
+            }
+        },
         "node_modules/sshpk": {
             "version": "1.17.0",
             "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
@@ -23864,6 +23959,13 @@
             "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
             "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
         },
+        "buildcheck": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz",
+            "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==",
+            "dev": true,
+            "optional": true
+        },
         "bulk-write-stream": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-2.0.1.tgz",
@@ -24521,6 +24623,17 @@
                 "yaml": "^1.10.0"
             }
         },
+        "cpu-features": {
+            "version": "0.0.4",
+            "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz",
+            "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==",
+            "dev": true,
+            "optional": true,
+            "requires": {
+                "buildcheck": "0.0.3",
+                "nan": "^2.15.0"
+            }
+        },
         "cron-validate": {
             "version": "1.4.5",
             "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.5.tgz",
@@ -29697,6 +29810,13 @@
                 }
             }
         },
+        "nan": {
+            "version": "2.17.0",
+            "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+            "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
+            "dev": true,
+            "optional": true
+        },
         "nanoclone": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@@ -29951,6 +30071,20 @@
             "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
             "dev": true
         },
+        "node-ssh": {
+            "version": "13.0.1",
+            "resolved": "https://registry.npmjs.org/node-ssh/-/node-ssh-13.0.1.tgz",
+            "integrity": "sha512-prGXb9KXXtrienVBPiyOCm7F8KSsQciN8VCgrkZeJAlSEtF8HsXa/0uVE5a6MgwIBPa0etTgwiyj/lfiFdVK1Q==",
+            "dev": true,
+            "requires": {
+                "is-stream": "^2.0.0",
+                "make-dir": "^3.1.0",
+                "sb-promise-queue": "^2.1.0",
+                "sb-scandir": "^3.1.0",
+                "shell-escape": "^0.2.0",
+                "ssh2": "^1.5.0"
+            }
+        },
         "nodemailer": {
             "version": "6.6.5",
             "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.6.5.tgz",
@@ -31454,6 +31588,21 @@
                 "xmlchars": "^2.2.0"
             }
         },
+        "sb-promise-queue": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/sb-promise-queue/-/sb-promise-queue-2.1.0.tgz",
+            "integrity": "sha512-zwq4YuP1FQFkGx2Q7GIkZYZ6PqWpV+bg0nIO1sJhWOyGyhqbj0MsTvK6lCFo5TQwX5pZr6SCQ75e8PCDCuNvkg==",
+            "dev": true
+        },
+        "sb-scandir": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/sb-scandir/-/sb-scandir-3.1.0.tgz",
+            "integrity": "sha512-70BVm2xz9jn94zSQdpvYrEG101/UV9TVGcfWr9T5iob3QhCK4lYXeculfBqPGFv3XTeKgx4dpWyYIDeZUqo4kg==",
+            "dev": true,
+            "requires": {
+                "sb-promise-queue": "^2.1.0"
+            }
+        },
         "semver": {
             "version": "6.3.0",
             "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -31537,6 +31686,12 @@
             "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
             "dev": true
         },
+        "shell-escape": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz",
+            "integrity": "sha512-uRRBT2MfEOyxuECseCZd28jC1AJ8hmqqneWQ4VWUTgCAFvb3wKU1jLqj6egC4Exrr88ogg3dp+zroH4wJuaXzw==",
+            "dev": true
+        },
         "shell-quote": {
             "version": "1.8.0",
             "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz",
@@ -31774,6 +31929,18 @@
             "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
             "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
         },
+        "ssh2": {
+            "version": "1.11.0",
+            "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz",
+            "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==",
+            "dev": true,
+            "requires": {
+                "asn1": "^0.2.4",
+                "bcrypt-pbkdf": "^1.0.2",
+                "cpu-features": "~0.0.4",
+                "nan": "^2.16.0"
+            }
+        },
         "sshpk": {
             "version": "1.17.0",
             "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
diff --git a/package.json b/package.json
index d5d1c5fd..3d370aea 100644
--- a/package.json
+++ b/package.json
@@ -63,7 +63,8 @@
         "cy:run": "npx cypress run --browser chrome --headless --config-file ./config/cypress.config.js",
         "cy:run:unit": "npx cypress run --browser chrome --headless --config-file ./config/cypress.frontend.config.js",
         "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\"",
-        "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go"
+        "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go",
+        "depoly-demo-server": "node extra/deploy-demo-server.js"
     },
     "dependencies": {
         "@grpc/grpc-js": "~1.7.3",
@@ -150,8 +151,9 @@
         "eslint": "~8.14.0",
         "eslint-plugin-vue": "~8.7.1",
         "favico.js": "~0.3.10",
-        "marked": "~4.2.5",
         "jest": "~27.2.5",
+        "marked": "~4.2.5",
+        "node-ssh": "~13.0.1",
         "postcss-html": "~1.5.0",
         "postcss-rtlcss": "~3.7.2",
         "postcss-scss": "~4.0.4",

From 29976d8a034427dbb2d0b28d7b3f92b79c1b0e7c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 13 Feb 2023 16:35:12 +0800
Subject: [PATCH 580/803] minor

---
 docker/dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docker/dockerfile b/docker/dockerfile
index 775cec59..1799044a 100644
--- a/docker/dockerfile
+++ b/docker/dockerfile
@@ -71,7 +71,7 @@ RUN npm ci
 
 EXPOSE 3000 3001
 VOLUME ["/app/data"]
-HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD node extra/healthcheck.js
+HEALTHCHECK --interval=60s --timeout=30s --start-period=180s --retries=5 CMD extra/healthcheck
 CMD ["npm", "run", "start-pr-test"]
 
 ############################################

From c5ff0106692d3ceadbc5174248628db2e973b816 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 13 Feb 2023 16:48:05 +0800
Subject: [PATCH 581/803] Add loose dependency `qs` which is used by
 `aliyun-sms.js`

---
 package-lock.json | 5 ++---
 package.json      | 1 +
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 273cb480..baf9f4f2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -55,6 +55,7 @@
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
                 "protobufjs": "~7.1.1",
+                "qs": "~6.10.0",
                 "redbean-node": "~0.2.0",
                 "redis": "~4.5.1",
                 "socket.io": "~4.5.3",
@@ -95,7 +96,7 @@
                 "favico.js": "~0.3.10",
                 "jest": "~27.2.5",
                 "marked": "~4.2.5",
-                "node-ssh": "^13.0.1",
+                "node-ssh": "~13.0.1",
                 "postcss-html": "~1.5.0",
                 "postcss-rtlcss": "~3.7.2",
                 "postcss-scss": "~4.0.4",
@@ -15708,7 +15709,6 @@
             "version": "6.10.4",
             "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
             "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
-            "dev": true,
             "dependencies": {
                 "side-channel": "^1.0.4"
             },
@@ -30928,7 +30928,6 @@
             "version": "6.10.4",
             "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
             "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
-            "dev": true,
             "requires": {
                 "side-channel": "^1.0.4"
             }
diff --git a/package.json b/package.json
index 3d370aea..5093e5d6 100644
--- a/package.json
+++ b/package.json
@@ -113,6 +113,7 @@
         "prom-client": "~13.2.0",
         "prometheus-api-metrics": "~3.2.1",
         "protobufjs": "~7.1.1",
+        "qs": "~6.10.4",
         "redbean-node": "~0.2.0",
         "redis": "~4.5.1",
         "socket.io": "~4.5.3",

From 8f78c54ca28702a6ade3f0eacea3c3b090d28636 Mon Sep 17 00:00:00 2001
From: Federico Lazcano <federico.lazcano@gmail.com>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 582/803] Translated using Weblate (Spanish)

Currently translated at 96.8% (670 of 692 strings)

Co-authored-by: Federico Lazcano <federico.lazcano@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/es/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/es-ES.json | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index 8fa80158..44f28869 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -655,5 +655,28 @@
     "gorush": "Gorush",
     "squadcast": "Squadcast",
     "Maintenance Time Window of a Day": "Ventana de tiempo de mantenimiento de un día",
-    "Effective Date Range": "Rango de Fecha Efectivo"
+    "Effective Date Range": "Rango de Fecha Efectivo",
+    "Free Mobile User Identifier": "Identificador de Usuario de Free Mobile",
+    "Gateway Type": "Tipo de Puerta de Enlace",
+    "SMSManager": "SMSManager",
+    "goAlertInfo": "GoAlert es una aplicación de código abierto para la programación de guardias, escaladas automatizadas y notificaciones (como SMS o llamadas de voz). ¡Involucre automáticamente a la persona adecuada, de la manera correcta y en el momento adecuado! {0}",
+    "Free Mobile API Key": "Clave API de Free Mobile",
+    "high": "arriba",
+    "SMSManager API Docs": "Documentación API de SMSManager ",
+    "smseagleContact": "Nombre(s) de contacto de Guía Telefónica",
+    "smseagleToken": "Token de Acceso a la API",
+    "smseagleUrl": "URL del dispositivo SMSEagle",
+    "Legacy Octopush-DM": "Octopush-DM heredado",
+    "HomeAssistant": "Home Assistant",
+    "goAlertIntegrationKeyInfo": "Obtenga la clave de integración API genérica para el servicio en este formato \"aaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\", generalmente el valor del parámetro token de la URL copiada.",
+    "Topic": "Tema",
+    "matrix": "Matrix",
+    "Feishu WebHookUrl": "WebHookURL de Feishu",
+    "wayToGetPagerDutyKey": "Puede obtener esto yendo a Servicio -> Directorio de servicios -> (Seleccione un servicio) -> Integraciones -> Agregar integración. Aquí puede buscar \"API de eventos V2\". Más información {0}",
+    "alertaApiKey": "Clave API",
+    "alertaAlertState": "Estado de Alerta",
+    "alertaRecoverState": "Estado de Recuperación",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "Nombre de usuario de API (inc. webapi_ prefix)",
+    "smseagleGroup": "Nombre(s) de grupo de Guía Telefónica"
 }

From 7984a529293aa4ff019250f0623955cef974b73a Mon Sep 17 00:00:00 2001
From: Giuseppe Monaco <GMonaco260@gmail.com>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 583/803] Translated using Weblate (Italian)

Currently translated at 53.1% (368 of 692 strings)

Co-authored-by: Giuseppe Monaco <GMonaco260@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/it/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/it-IT.json | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json
index ccb8132f..ebf0f495 100644
--- a/src/lang/it-IT.json
+++ b/src/lang/it-IT.json
@@ -28,7 +28,7 @@
     "confirmDisableTwoFAMsg": "Sei sicuro di voler disabilitare l'autenticazione a due fattori?",
     "Settings": "Impostazioni",
     "Dashboard": "Dashboard",
-    "New Update": "Nuovo aggiornamento disponibile!",
+    "New Update": "Nuovo aggiornamento disponibile",
     "Language": "Lingua",
     "Appearance": "Aspetto",
     "Theme": "Tema",
@@ -55,7 +55,7 @@
     "Delete": "Elimina",
     "Current": "Corrente",
     "Uptime": "Tempo di attività",
-    "Cert Exp.": "Scadenza certificato",
+    "Cert Exp.": "Scadenza Certificato",
     "day": "giorno | giorni",
     "-day": "-giorni",
     "hour": "ora",
@@ -363,5 +363,13 @@
     "smtpDkimHashAlgo": "Algoritmo di hashing (opzionale)",
     "smtpDkimheaderFieldNames": "Campi Intestazione da firmare (opzionale)",
     "smtpDkimskipFields": "Campi Intestazione da non firmare (opzionale)",
-    "GoogleChat": "Google Chat (solo per Google Workspace)"
+    "GoogleChat": "Google Chat (solo per Google Workspace)",
+    "Help": "Aiuto",
+    "Maintenance": "Manutenzione",
+    "statusMaintenance": "In manutenzione",
+    "General Monitor Type": "Monitor Generico",
+    "Game": "Gioco",
+    "Passive Monitor Type": "Monitor Passivo",
+    "Specific Monitor Type": "Monitor Specifico",
+    "Monitor": "Monitor | Monitor"
 }

From e10ea1049d32f1ede69fe4c7d01810eea378fb55 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <saibamenppl@gmail.com>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 584/803] Translated using Weblate (Polish)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (693 of 693 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (692 of 692 strings)

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pl/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/pl.json | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/lang/pl.json b/src/lang/pl.json
index ebc58797..6d802185 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -208,7 +208,7 @@
     "smtpBCC": "UDW",
     "discord": "Discord",
     "Discord Webhook URL": "URL webhook Discorda",
-    "wayToGetDiscordURL": "Możesz go uzyskać, przechodząc do Ustawienia serwera -> Integracje -> Tworzenie webhooka",
+    "wayToGetDiscordURL": "Możesz go uzyskać, przechodząc do Ustawienia serwera -> Integracje -> Webhooki -> Tworzenie webhooka",
     "Bot Display Name": "Wyświetlana nazwa bota",
     "Prefix Custom Message": "Własny początek wiadomości",
     "Hello @everyone is...": "Hej {'@'}everyone…",
@@ -686,9 +686,11 @@
     "Packet Size": "Rozmiar pakietu",
     "uninstalling": "Odinstalowywanie",
     "loadingError": "Nie można pobrać danych, proszę spróbować ponownie później.",
-    "plugin": "Wtyczka | Wtyczki",
+    "plugin": "Plugin | Pluginy",
     "install": "Instaluj",
     "installing": "Instalowanie",
     "uninstall": "Odinstaluj",
-    "confirmUninstallPlugin": "Czy na pewno chcesz odinstalować tę wtyczkę?"
+    "confirmUninstallPlugin": "Czy na pewno chcesz odinstalować tę wtyczkę?",
+    "Custom Monitor Type": "Własny typ monitora",
+    "markdownSupported": "Obsługiwana składnia Markdown"
 }

From 46413a57e89f0a61d43306e89f3dd4e5e41075d5 Mon Sep 17 00:00:00 2001
From: MrEddX <mreddx@chatrix.one>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 585/803] Translated using Weblate (Bulgarian)

Currently translated at 99.8% (696 of 697 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (693 of 693 strings)

Co-authored-by: MrEddX <mreddx@chatrix.one>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/bg/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/bg-BG.json | 45 +++++++++++++++++++++++++--------------------
 1 file changed, 25 insertions(+), 20 deletions(-)

diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 3a5f532d..66ce48fe 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -227,7 +227,7 @@
     "smtpCC": "Явно копие до имейл адрес:",
     "smtpBCC": "Скрито копие до имейл адрес:",
     "Discord Webhook URL": "Discord URL адрес на уеб кука",
-    "wayToGetDiscordURL": "Може да създадете, от меню \"Настройки на сървъра\" -> \"Интеграции\" -> \"Уеб куки\" -> \"Нова уеб кука\"",
+    "wayToGetDiscordURL": "Можете да създадете, от меню \"Настройки на сървъра\" -> \"Интеграции\" -> \"Уеб куки\" -> \"Нова уеб кука\"",
     "Bot Display Name": "Име на бота, което да се показва",
     "Prefix Custom Message": "Модифицирано обръщение",
     "Hello @everyone is...": "Здравейте, {'@'}everyone е…",
@@ -236,8 +236,8 @@
     "Number": "Номер",
     "Recipients": "Получатели",
     "needSignalAPI": "Необходимо е да разполагате със Signal клиент с REST API.",
-    "wayToCheckSignalURL": "Може да посетите този URL адрес, ако се нуждаете от помощ при настройването:",
-    "signalImportant": "ВАЖНО: Не може да смесвате \"Групи\" и \"Номера\" в поле \"Получатели\"!",
+    "wayToCheckSignalURL": "Можете да посетите този URL адрес, ако се нуждаете от помощ при настройването:",
+    "signalImportant": "ВАЖНО: Не можете да смесвате \"Групи\" и \"Номера\" в поле \"Получатели\"!",
     "Application Token": "Токен код за приложението",
     "Server URL": "URL адрес на сървъра",
     "Priority": "Приоритет",
@@ -278,21 +278,21 @@
     "Basic Settings": "Основни настройки",
     "User ID": "Потребител ID",
     "Messaging API": "API за съобщаване",
-    "wayToGetLineChannelToken": "Необходимо е първо да посетите {0}, за да създадете (Messaging API) за доставчик и канал, след което може да вземете токен кода за канал и потребителско ID от споменатите по-горе елементи на менюто.",
+    "wayToGetLineChannelToken": "Необходимо е първо да посетите {0}, за да създадете (Messaging API) за доставчик и канал, след което можете да вземете токен кода за канал и потребителско ID от споменатите по-горе елементи на менюто.",
     "Icon URL": "URL адрес за иконка",
-    "aboutIconURL": "Може да предоставите линк към картинка в поле \"URL Адрес за иконка\" за да отмените картинката на профила по подразбиране. Няма да се използва, ако вече сте настроили емотикон.",
-    "aboutMattermostChannelName": "Може да замените канала по подразбиране, към който публикува уеб куката, като въведете името на канала в полето \"Канал име\". Трябва да бъде активирано в настройките за уеб кука на Mattermost. Например: #other-channel",
+    "aboutIconURL": "Можете да предоставите линк към картинка в поле \"URL Адрес за иконка\" за да отмените картинката на профила по подразбиране. Няма да се използва, ако вече сте настроили емотикон.",
+    "aboutMattermostChannelName": "Можете да замените канала по подразбиране, към който публикува уеб куката, като въведете името на канала в полето \"Канал име\". Трябва да бъде активирано в настройките за уеб кука на Mattermost. Например: #other-channel",
     "matrix": "Matrix",
     "promosmsTypeEco": "SMS ECO - евтин, но бавен. Често е претоварен. Само за получатели от Полша.",
     "promosmsTypeFlash": "SMS FLASH - Съобщението автоматично се показва на устройството на получателя. Само за получатели от Полша.",
-    "promosmsTypeFull": "SMS FULL - Високо ниво на SMS услуга. Може да използвате Вашето име като подател (Необходимо е първо да регистрирате името). Надежден метод за съобщения тип тревога.",
+    "promosmsTypeFull": "SMS FULL - Високо ниво на SMS услуга. Можете да използвате Вашето име като подател (Необходимо е първо да регистрирате името). Надежден метод за съобщения тип тревога.",
     "promosmsTypeSpeed": "SMS SPEED - Най-висок приоритет в системата. Много бърза и надеждна, но същевременно скъпа услуга. (Около два пъти по-висока цена в сравнение с SMS FULL).",
-    "promosmsPhoneNumber": "Телефонен номер (за получатели от Полша, може да пропуснете въвеждането на код за населено място)",
+    "promosmsPhoneNumber": "Телефонен номер (за получатели от Полша, можете да пропуснете въвеждането на код за населено място)",
     "promosmsSMSSender": "SMS Подател име: Предварително регистрирано име или някое от имената по подразбиране: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
     "Feishu WebHookUrl": "Feishu URL адрес за уеб кука",
     "matrixHomeserverURL": "Сървър URL адрес (започва с http(s):// и порт по желание)",
     "Internal Room Id": "ID на вътрешна стая",
-    "matrixDesc1": "Може да намерите \"ID на вътрешна стая\" в разширените настройки на стаята във вашия Matrix клиент. Примерен изглед: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc1": "Можете да намерите \"ID на вътрешна стая\" в разширените настройки на стаята във вашия Matrix клиент. Примерен изглед: !QMdRCpUIfLwsfjxye6:home.server.",
     "matrixDesc2": "Силно препоръчваме да създадете НОВ потребител и да НЕ използвате токен кодът на вашия личен Matrix потребител, т.к. той позволява пълен достъп до вашия акаунт и всички стаи към които сте се присъединили. Вместо това създайте нов потребител и го поканете само в стаята, където желаете да получавате известията. Токен код за достъп ще получите изпълнявайки {0}",
     "Method": "Метод",
     "Body": "Съобщение",
@@ -304,7 +304,7 @@
     "clearDataOlderThan": "Ще се съхранява за {0} дни.",
     "records": "записа",
     "One record": "Един запис",
-    "steamApiKeyDescription": "За да мониторирате Steam Gameserver се нуждаете от Steam Web-API ключ. Може да регистрирате Вашия API ключ тук: ",
+    "steamApiKeyDescription": "За да мониторирате Steam Game Server се нуждаете от Steam Web-API ключ. Можете да регистрирате Вашия API ключ тук: ",
     "clicksendsms": "ClickSend SMS",
     "apiCredentials": "API удостоверяване",
     "PasswordsDoNotMatch": "Паролите не съвпадат.",
@@ -379,8 +379,8 @@
     "setAsDefault": "Зададен по подразбиране",
     "deleteProxyMsg": "Сигурни ли сте, че желаете да изтриете това прокси за всички монитори?",
     "proxyDescription": "За да функционират трябва да бъдат зададени към монитор.",
-    "enableProxyDescription": "Това прокси няма да има ефект върху заявките за мониторинг, докато не бъде активирано. Може да контролирате временното деактивиране на проксито от всички монитори чрез статуса на активиране.",
-    "setAsDefaultProxyDescription": "Това прокси ще бъде активно по подразбиране за новите монитори. Може да го изключите по отделно за всеки един монитор.",
+    "enableProxyDescription": "Това прокси няма да има ефект върху заявките за мониторинг, докато не бъде активирано. Можете да контролирате временното деактивиране на проксито от всички монитори чрез статуса на активиране.",
+    "setAsDefaultProxyDescription": "Това прокси ще бъде активно по подразбиране за новите монитори. Можете да го изключвате отделно за всеки един монитор.",
     "Certificate Chain": "Верига на сертификата",
     "Valid": "Валиден",
     "Invalid": "Невалиден",
@@ -435,7 +435,7 @@
     "cloudflareWebsite": "Cloudflare уеб сайт",
     "Message:": "Съобщение:",
     "Don't know how to get the token? Please read the guide:": "Не знаете как да вземете токен? Моля, прочетете ръководството:",
-    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Текущата връзка може да прекъсне ако в момента сте свързани чрез \"Cloudflare Tunnel\". Сигурни ли сте, че желаете да го спрете? Въведете Вашата текуща парола за да потвърдите.",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Текущата връзка може да прекъсне ако в момента сте свързани чрез \"Cloudflare Tunnel\". Сигурни ли сте, че желаете да го спрете? Моля, въведете Вашата текуща парола за да потвърдите.",
     "Other Software": "Друг софтуер",
     "For example: nginx, Apache and Traefik.": "Например: Nginx, Apache и Traefik.",
     "Please read": "Моля, прочетете",
@@ -513,15 +513,15 @@
     "Most likely causes:": "Най-вероятни причини:",
     "The resource is no longer available.": "Ресурсът вече не е наличен.",
     "There might be a typing error in the address.": "Възможно е да е допусната грешка при изписването на адреса.",
-    "What you can try:": "Може да опитате:",
+    "What you can try:": "Какво можете да опитате:",
     "Retype the address.": "Повторно въвеждане на адреса.",
     "Go back to the previous page.": "Да се върнете към предишната страница.",
     "Coming Soon": "Очаквайте скоро",
-    "wayToGetClickSendSMSToken": "Може да получите API потребителско име и API ключ от {0} .",
-    "dnsPortDescription": "DNS порт на сървъра. По подразбиране е 53, но може да бъде променен по всяко време.",
+    "wayToGetClickSendSMSToken": "Можете да получите API потребителско име и API ключ от {0} .",
+    "dnsPortDescription": "DNS порт на сървъра. По подразбиране е 53. Можете да го промените по всяко време.",
     "error": "грешка",
     "critical": "критично",
-    "wayToGetPagerDutyKey": "Може да го получите като посетите Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тук трябва да потърсите \"Events API V2\". Повече информация {0}",
+    "wayToGetPagerDutyKey": "Можете да го получите като посетите Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тук трябва да потърсите \"Events API V2\". Повече информация {0}",
     "Integration Key": "Ключ за интегриране",
     "Integration URL": "URL адрес за интеграция",
     "Auto resolve or acknowledged": "Автоматично разрешаване или потвърждаване",
@@ -536,7 +536,7 @@
     "Domain": "Домейн",
     "Workstation": "Работна станция",
     "disableCloudflaredNoAuthMsg": "Тъй като сте в режим \"No Auth mode\", парола не се изисква.",
-    "wayToGetLineNotifyToken": "Може да получите токен код за достъп от {0}",
+    "wayToGetLineNotifyToken": "Можете да получите токен код за достъп от {0}",
     "resendEveryXTimes": "Изпращай повторно на всеки {0} пъти",
     "resendDisabled": "Повторното изпращане е изключено",
     "Resend Notification if Down X times consequently": "Повторно изпращане на известие, ако е недостъпен X пъти последователно",
@@ -601,7 +601,7 @@
     "SMSManager API Docs": "SMSManager API Документация ",
     "Gateway Type": "Тип на шлюза",
     "SMSManager": "SMSManager",
-    "You can divide numbers with": "Може да разделяте числата с",
+    "You can divide numbers with": "Можете да разделяте числата с",
     "or": "или",
     "recurringInterval": "Интервал",
     "Recurring": "Повтаряне",
@@ -691,5 +691,10 @@
     "installing": "Инсталиране",
     "uninstall": "Деинсталирай",
     "uninstalling": "Деинсталиране",
-    "confirmUninstallPlugin": "Сигурни ли сте, че желаете да деинсталирате този плъгин?"
+    "confirmUninstallPlugin": "Сигурни ли сте, че желаете да деинсталирате този плъгин?",
+    "markdownSupported": "Поддържа се Markdown синтаксис",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Редактиране на таг",
+    "Learn More": "Научете повече",
+    "Server Address": "Сървър адрес"
 }

From a16ea4c6f34dccfdfa6255de69d58a33c69522a5 Mon Sep 17 00:00:00 2001
From: Michal <black23@gmail.com>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 586/803] Translated using Weblate (Czech)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Czech)

Currently translated at 99.8% (696 of 697 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (693 of 693 strings)

Co-authored-by: Michal <black23@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/cs-CZ.json | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index c6b28312..18a3d333 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -90,7 +90,7 @@
     "Heartbeat Interval": "Heartbeat interval",
     "Retries": "Počet pokusů",
     "Heartbeat Retry Interval": "Interval opakování heartbeatu",
-    "Resend Notification if Down X times consequently": "Znovu zaslat oznámení, pokud je služba nedostupná Xkrát za sebou",
+    "Resend Notification if Down X times consequently": "Zaslat oznámení znovu, pokud je služba nedostupná Xkrát za sebou",
     "Advanced": "Rozšířené",
     "Upside Down Mode": "Inverzní režim",
     "Max. Redirects": "Max. přesměrování",
@@ -212,7 +212,7 @@
     "Required": "Vyžadováno",
     "telegram": "Telegram",
     "ZohoCliq": "ZohoCliq",
-    "Bot Token": "Token robota",
+    "Bot Token": "Token bota",
     "wayToGetTelegramToken": "Token můžete získat od {0}.",
     "Chat ID": "ID chatu",
     "supportTelegramChatID": "Podpora přímého chatu / skupiny / ID chatu kanálu",
@@ -237,7 +237,7 @@
     "smtpBCC": "Skrytá kopie",
     "discord": "Discord",
     "Discord Webhook URL": "URL Webhooku Discord",
-    "wayToGetDiscordURL": "Získáte tak, že přejdete do Nastavení serveru - > Integrace - > Vytvořit Webhook",
+    "wayToGetDiscordURL": "Získáte tak, že přejdete do Nastavení serveru - > Integrace - > Zobrazi webhooky -> Nový webhook",
     "Bot Display Name": "Zobrazované jméno robota",
     "Prefix Custom Message": "Předpona vlastní zprávy",
     "Hello @everyone is...": "Dobrý den, {'@'}všichni jsou…",
@@ -332,7 +332,7 @@
     "Body": "Tělo",
     "Headers": "Hlavičky",
     "PushUrl": "Push URL",
-    "HeadersInvalidFormat": "Hlaviča žádosti není platný JSON: ",
+    "HeadersInvalidFormat": "Hlavičky žádosti nejsou platný JSON: ",
     "BodyInvalidFormat": "Text žádosti není platný JSON: ",
     "Monitor History": "Historie dohledu",
     "clearDataOlderThan": "Historie dohledu bude uchovávána po dobu {0} dní.",
@@ -691,5 +691,10 @@
     "installing": "Instaluji",
     "uninstall": "Odinstalace",
     "uninstalling": "Odinstalování",
-    "Packet Size": "Velikost paketu"
+    "Packet Size": "Velikost paketu",
+    "markdownSupported": "Markdown syntaxe podporována",
+    "Google Analytics ID": "ID Google Analytics",
+    "Edit Tag": "Upravit štítek",
+    "Server Address": "Adresa serveru",
+    "Learn More": "Zjistěte více"
 }

From 727de9838b88f60de5a7c39cb420a2cdc2f55596 Mon Sep 17 00:00:00 2001
From: BlackScreen <florian@barthold.tv>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 587/803] Translated using Weblate (German)

Currently translated at 100.0% (693 of 693 strings)

Co-authored-by: BlackScreen <florian@barthold.tv>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/de-DE.json | 69 ++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 59 insertions(+), 10 deletions(-)

diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 45b5ae56..f1ffd8fd 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -135,7 +135,7 @@
     "Options": "Optionen",
     "confirmImportMsg": "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
     "Keep both": "Beide behalten",
-    "twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
+    "twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert:",
     "Verify Token": "Token verifizieren",
     "Setup 2FA": "2FA einrichten",
     "Enable 2FA": "2FA aktivieren",
@@ -206,7 +206,7 @@
     "mattermost": "Mattermost",
     "Primary Base URL": "Primäre Basis-URL",
     "Push URL": "Push URL",
-    "needPushEvery": "Du solltest diese URL alle {0} Sekunden aufrufen",
+    "needPushEvery": "Du solltest diese URL alle {0} Sekunden aufrufen.",
     "pushOptionalParams": "Optionale Parameter: {0}",
     "defaultNotificationName": "Mein {notification} Alarm ({number})",
     "here": "hier",
@@ -215,7 +215,7 @@
     "wayToGetTelegramToken": "Hier kannst du einen Token erhalten {0}.",
     "Chat ID": "Chat ID",
     "supportTelegramChatID": "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
-    "wayToGetTelegramChatID": "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
+    "wayToGetTelegramChatID": "Du kannst deine Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
     "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
     "chatIDNotFound": "Chat-ID wurde nicht gefunden: bitte sende zuerst eine Nachricht an diesen Bot",
     "Post URL": "Post URL",
@@ -298,9 +298,9 @@
     "Internal Room Id": "Interne Raum-ID",
     "matrixDesc1": "Die interne Raum-ID findest du im erweiterten Bereich der Raumeinstellungen im Matrix-Client. Es sollte aussehen wie z.B. !QMdRCpUIfLwsfjxye6:home.server.",
     "matrixDesc2": "Es wird dringend empfohlen einen neuen Benutzer anzulegen und nicht den Zugriffstoken deines eigenen Matrix-Benutzers zu verwenden. Anderenfalls ermöglicht es vollen Zugriff auf dein Konto und alle Räume, denen du beigetreten bist. Erstelle stattdessen einen neuen Benutzer und lade ihn nur in den Raum ein, in dem du die Benachrichtigung erhalten möchtest. Du kannst den Zugriffstoken erhalten, indem du Folgendes ausführst {0}",
-    "Method": "Method",
+    "Method": "Methode",
     "Body": "Body",
-    "Headers": "Headers",
+    "Headers": "Header",
     "PushUrl": "Push URL",
     "HeadersInvalidFormat": "Der Header ist kein gültiges JSON: ",
     "BodyInvalidFormat": "Der Body ist kein gültiges JSON: ",
@@ -315,7 +315,7 @@
     "Done": "Fertig",
     "Info": "Info",
     "Security": "Sicherheit",
-    "Steam API Key": "Steam API Key",
+    "Steam API Key": "Steam API-Schlüssel",
     "Shrink Database": "Datenbank verkleinern",
     "Pick a RR-Type...": "Wähle ein RR-Typ aus…",
     "Pick Accepted Status Codes...": "Wähle akzeptierte Statuscodes aus…",
@@ -560,7 +560,7 @@
     "Domain": "Domain",
     "Workstation": "Workstation",
     "disableCloudflaredNoAuthMsg": "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
-    "trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
+    "trustProxyDescription": "Vertraue 'X-Forwarded-*' Headern. Wenn man die richtige Client-IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx oder Apache läuft, sollte dies aktiviert werden.",
     "wayToGetLineNotifyToken": "Du kannst hier ein Token erhalten: {0}",
     "Examples": "Beispiele",
     "Home Assistant URL": "Home Assistant URL",
@@ -593,7 +593,7 @@
     "goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
     "goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
     "goAlert": "GoAlert",
-    "backupOutdatedWarning": "Veraltet: Da viele Funktionen hinzugefügt wurden und diese Sicherungsfunktion nicht mehr gepflegt wird, kann sie keine vollständige Sicherung erstellen oder wiederherstellen.",
+    "backupOutdatedWarning": "Veraltet: Da viele Funktionen hinzugefügt wurden und diese Sicherungsfunktion nicht mehr gepflegt wird, kann keine vollständige Sicherung erstellen oder wiederherstellen werden.",
     "backupRecommend": "Bitte sichere stattdessen das Volume oder den Datenordner (./data/) direkt.",
     "Optional": "Optional",
     "squadcast": "Squadcast",
@@ -641,7 +641,56 @@
     "Help": "Hilfe",
     "Game": "Spiel",
     "Custom": "Benutzerdefiniert",
-    "Enable DNS Cache": "DNS Cache aktivieren",
+    "Enable DNS Cache": "DNS-Cache aktivieren",
     "Enable": "Aktivieren",
-    "Disable": "Deaktivieren"
+    "Disable": "Deaktivieren",
+    "Custom Monitor Type": "Benutzerdefinierter Monitortyp",
+    "webhookAdditionalHeadersDesc": "Legt zusätzliche Header fest, die mit der Webhook gesendet wurden.",
+    "dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert diese Einstellung möglicherweise nicht. Deaktivieren, wenn es Probleme gibt.",
+    "loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.",
+    "confirmUninstallPlugin": "Möchten Sie dieses Plugin wirklich deinstallieren?",
+    "grpcMethodDescription": "Der Name der Methode wird in das \"cammelCase \"-Format konvertiert (z.B. sayHello, check, etc.)",
+    "Passive Monitor Type": "Passiver Monitortyp",
+    "Specific Monitor Type": "Spezifischer Monitortyp",
+    "webhookAdditionalHeadersTitle": "Zusätzliche Header",
+    "Packet Size": "Paketgröße",
+    "IconUrl": "Icon-URL",
+    "wayToGetZohoCliqURL": "Erfahren Sie, wie Sie eine Webhook-URL {0} erstellen.",
+    "dataRetentionTimeError": "Die Aufbewahrungsfrist muss 0 oder größer sein",
+    "infiniteRetention": "Für unendliche Speicherung auf 0 setzen.",
+    "confirmDeleteTagMsg": "Sind Sie sicher, dass Sie diesen Tag löschen möchten? Monitore, die mit diesem Tag verknüpft sind, werden nicht gelöscht.",
+    "enableGRPCTls": "Erlaube das Senden von gRPC-Anfragen mit TLS-Verbindung",
+    "ZohoCliq": "ZohoCliq",
+    "Monitor": "Monitor | Monitore",
+    "plugin": "Plugin | Plugins",
+    "install": "Installieren",
+    "installing": "Installiere",
+    "uninstall": "Deinstallieren",
+    "uninstalling": "Deinstallation",
+    "markdownSupported": "Markdown-Syntax unterstützt",
+    "wayToGetKookBotToken": "Anwendung erstellen und den Bot-Token {0} abrufen",
+    "wayToGetKookGuildID": "Schalten Sie den \"Entwicklermodus\" in den Kook-Einstellungen ein und klicken Sie mit der rechten Maustaste auf die Gilde, um ihre ID zu erhalten.",
+    "Guild ID": "Gilden-ID",
+    "Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung",
+    "Free Mobile API Key": "Kostenloser Mobile API-Schlüssel",
+    "Enable TLS": "Aktiviere TLS",
+    "Proto Service Name": "Proto Service Name",
+    "Proto Method": "Proto Methode",
+    "Proto Content": "Proto Inhalt",
+    "Economy": "Economy-Modus",
+    "Lowcost": "Lowcost-Modus",
+    "high": "High-Modus",
+    "promosmsAllowLongSMS": "Erlaube lange SMS",
+    "General Monitor Type": "Allgemeiner Monitortyp",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Telefonnummer(n)",
+    "smseagleGroup": "Telefonbuch Gruppenname(n)",
+    "smseagleContact": "Telefonbuch Kontaktname(n)",
+    "smseagleRecipientType": "Empfängertyp",
+    "smseagleRecipient": "Empfänger (mehrere müssen mit Komma getrennt werden)",
+    "smseagleToken": "API-Zugriffstoken",
+    "smseagleUrl": "Deine SMSEagle-Geräte-URL",
+    "Kook": "Kook",
+    "smseagleEncoding": "Als Unicode senden",
+    "smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)"
 }

From 48d89d8e61de1b5cc0e562d658d7b8f7d556adc3 Mon Sep 17 00:00:00 2001
From: Edoardo Ridolfi <edo2313@gmail.com>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 588/803] Translated using Weblate (Italian)

Currently translated at 60.3% (418 of 693 strings)

Translated using Weblate (Italian)

Currently translated at 55.4% (384 of 693 strings)

Co-authored-by: Edoardo Ridolfi <edo2313@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/it/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/it-IT.json | 48 ++++++++++++++++++++++++++-------------------
 1 file changed, 28 insertions(+), 20 deletions(-)

diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json
index ebf0f495..5b7da198 100644
--- a/src/lang/it-IT.json
+++ b/src/lang/it-IT.json
@@ -1,15 +1,15 @@
 {
     "languageName": "Italiano (Italian)",
     "checkEverySecond": "controlla ogni {0} secondi",
-    "retryCheckEverySecond": "Riprova ogni {0} secondi.",
-    "retriesDescription": "Tentativi prima che il servizio venga marcato come \"DOWN\" e che una notifica venga inviata.",
-    "ignoreTLSError": "Ignora gli errori TLS/SSL per i siti HTTPS.",
+    "retryCheckEverySecond": "Riprova ogni {0} secondi",
+    "retriesDescription": "Tentativi prima che il servizio venga marcato come \"DOWN\" e che una notifica venga inviata",
+    "ignoreTLSError": "Ignora gli errori TLS/SSL per i siti HTTPS",
     "upsideDownModeDescription": "Se il servizio risulta raggiungibile viene marcato come \"DOWN\".",
     "maxRedirectDescription": "Numero massimo di redirezionamenti consentito. Per disabilitare, impostare \"0\".",
     "acceptedStatusCodesDescription": "Elenco di codici di stato HTTP che sono considerati validi.",
     "passwordNotMatchMsg": "La password non corrisponde.",
     "notificationDescription": "Assegnare la notifica a uno o più oggetti monitorati per metterla in funzione.",
-    "keywordDescription": "Cerca la parola chiave nella risposta in html o JSON e fai distinzione tra maiuscole e minuscole",
+    "keywordDescription": "Cerca la parola chiave nella risposta in HTML o JSON. Distingue tra maiuscole e minuscole.",
     "pauseDashboardHome": "In Pausa",
     "deleteMonitorMsg": "Sei sicuro di voler eliminare questo oggetto monitorato?",
     "deleteNotificationMsg": "Sei sicuro di voler eliminare questa notifica per tutti gli oggetti monitorati?",
@@ -70,7 +70,7 @@
     "Port": "Porta",
     "Heartbeat Interval": "Intervallo di controllo",
     "Retries": "Tentativi",
-    "Heartbeat Retry Interval": "Intervallo tra i tentativo di controllo",
+    "Heartbeat Retry Interval": "Intervallo tra i tentativi di controllo",
     "Advanced": "Avanzate",
     "Upside Down Mode": "Modalità invertita",
     "Max. Redirects": "Reindirizzamenti massimi",
@@ -105,7 +105,7 @@
     "Please use this option carefully!": "Utilizzare con attenzione!",
     "Logout": "Esci",
     "Leave": "Annulla",
-    "I understand, please disable": "Lo capisco, disabilitare l'autenticazione.",
+    "I understand, please disable": "Lo capisco, disabilitare l'autenticazione",
     "Confirm": "Conferma",
     "Yes": "Sì",
     "No": "No",
@@ -114,7 +114,7 @@
     "Remember me": "Ricorda credenziali",
     "Login": "Accesso",
     "No Monitors, please": "Nessun monitor presente,",
-    "add one": "aggiungine uno!",
+    "add one": "aggiungine uno",
     "Notification Type": "Servizio di notifica",
     "Email": "E-mail",
     "Test": "Fai una prova",
@@ -138,8 +138,8 @@
     "Heartbeats": "Controlli",
     "Auto Get": "Rileva",
     "backupDescription": "È possibile fare il backup di tutti i monitoraggi e di tutte le notifiche in un file JSON.",
-    "backupDescription2": "NOTA: lo storico e i dati relativi agli eventi non saranno inclusi nel backup",
-    "backupDescription3": "Dati sensibili come i token di autenticazione saranno inclusi nel backup, custodisci il file in un luogo sicuro!",
+    "backupDescription2": "NOTA: lo storico e i dati relativi agli eventi non saranno inclusi nel backup.",
+    "backupDescription3": "Dati sensibili come i token di autenticazione saranno inclusi nel backup, custodisci il file in un luogo sicuro.",
     "alertNoFile": "Selezionare il file da importare.",
     "alertWrongFileType": "Selezionare un file JSON.",
     "Clear all statistics": "Cancella tutte le statistiche",
@@ -158,7 +158,7 @@
     "Token": "Token",
     "Show URI": "Mostra URI",
     "Tags": "Etichette",
-    "Add New below or Select...": "Aggiungi oppure scegli...",
+    "Add New below or Select...": "Aggiungi oppure scegli…",
     "Tag with this name already exist.": "Un'etichetta con questo nome già esiste.",
     "Tag with this value already exist.": "Un'etichetta con questo valore già esiste.",
     "color": "colore",
@@ -171,7 +171,7 @@
     "Indigo": "Indaco",
     "Purple": "Viola",
     "Pink": "Rosa",
-    "Search...": "Cerca...",
+    "Search...": "Cerca…",
     "Avg. Ping": "Tempo medio di risposta al ping",
     "Avg. Response": "Tempo medio di risposta",
     "Entry Page": "Pagina Principale",
@@ -193,7 +193,7 @@
     "Bot Token": "Token del bot",
     "wayToGetTelegramToken": "Puoi ottenere il token da {0}.",
     "Chat ID": "ID Chat",
-    "supportTelegramChatID": "Supporta chat private, gruppi e canali.",
+    "supportTelegramChatID": "Supporta ID di chat private, gruppi e canali",
     "wayToGetTelegramChatID": "È possibile ricereve l'ID chat mandando un messaggio al bot e poi andando in questo URL per visualizzare il chat_id:",
     "YOUR BOT TOKEN HERE": "QUI IL TOKEN DEL BOT",
     "chatIDNotFound": "Non trovo l'ID chat. Prima bisogna mandare un messaggio al bot",
@@ -216,7 +216,7 @@
     "wayToGetDiscordURL": "È possibile recuperarlo da Impostazioni server -> Integrazioni -> Creare Webhook",
     "Bot Display Name": "Nome del Bot",
     "Prefix Custom Message": "Prefisso per il messaggio personalizzato",
-    "Hello @everyone is...": "Ciao a {'@'}everyone ...",
+    "Hello @everyone is...": "Ciao a {'@'}everyone …",
     "teams": "Microsoft Teams",
     "Webhook URL": "URL Webhook",
     "wayToGetTeamsURL": "È possibile imparare a creare un URL Webhook {0}.",
@@ -287,7 +287,7 @@
     "matrix": "Matrix",
     "promosmsTypeEco": "SMS ECO - economico, ma lento e spesso sovraccarico. Limitato solamente a destinatari Polacchi.",
     "promosmsTypeFlash": "SMS FLASH - Il messaggio sarà automaticamente mostrato sul dispositivo dei destinatari. Limitato solo a destinatari Polacchi.",
-    "promosmsTypeFull": "SMS FULL - Premium, È possibile utilizzare il proprio come come mittente (è necessario prima registrare il nome). Affidabile per gli allarmi.",
+    "promosmsTypeFull": "SMS FULL - Premium, È possibile utilizzare il proprio nome come mittente (è necessario prima registrare il nome). Affidabile per gli allarmi.",
     "promosmsTypeSpeed": "SMS SPEED - Maggior priorità. Rapido, affidabile, ma costoso (costa il doppio di SMS FULL).",
     "promosmsPhoneNumber": "Numero di Telefono (per destinatari Polacchi si può omettere il codice area)",
     "promosmsSMSSender": "Mittente SMS : Nome preregistrato oppure uno dei seguenti: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
@@ -304,7 +304,7 @@
     "BodyInvalidFormat": "Il corpo di richiesta non è un JSON valido: ",
     "Monitor History": "Storico monitor",
     "clearDataOlderThan": "Mantieni lo storico per {0} giorni.",
-    "PasswordsDoNotMatch": "Le password non corrispondono!",
+    "PasswordsDoNotMatch": "Le password non corrispondono.",
     "records": "records",
     "One record": "One record",
     "steamApiKeyDescription": "Per monitorare un server di gioco Steam è necessaria una Web-API Key di Steam. È possibile registrarne una qui: ",
@@ -315,8 +315,8 @@
     "Security": "Sicurezza",
     "Steam API Key": "API Key di Steam",
     "Shrink Database": "Comprimi database",
-    "Pick a RR-Type...": "Scegli un tipo di RR...",
-    "Pick Accepted Status Codes...": "Scegli i codici di Stato Accettati...",
+    "Pick a RR-Type...": "Scegli un tipo di RR…",
+    "Pick Accepted Status Codes...": "Scegli i codici di Stato Accettati…",
     "Default": "Predefinito",
     "HTTP Options": "Opzioni HTTP",
     "Create Incident": "Segnala incidente",
@@ -340,8 +340,8 @@
     "Hide Tags": "Nascondi etichette",
     "Description": "Descrizione",
     "No monitors available.": "Nessun monitor disponibile.",
-    "Add one": "Aggiungine uno!",
-    "No Monitors": "Nessun monitor presente.",
+    "Add one": "Aggiungine uno",
+    "No Monitors": "Nessun monitor presente",
     "Untitled Group": "Gruppo senza titolo",
     "Services": "Servizi",
     "Discard": "Scarta modifiche",
@@ -371,5 +371,13 @@
     "Game": "Gioco",
     "Passive Monitor Type": "Monitor Passivo",
     "Specific Monitor Type": "Monitor Specifico",
-    "Monitor": "Monitor | Monitor"
+    "Monitor": "Monitor | Monitor",
+    "Topic": "Argomento",
+    "markdownSupported": "Sintassi markdown supportata",
+    "Proxy Server": "Server Proxy",
+    "Select status pages...": "Seleziona pagine di stato…",
+    "Schedule maintenance": "Pianifica manutenzione",
+    "Start of maintenance": "Inizio della manutenzione",
+    "All Status Pages": "Tutte le pagine di stato",
+    "webhookAdditionalHeadersTitle": "Headers aggiuntivi"
 }

From 73f85f4861c2cb92a2be84dc7e76128e0330f242 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Francesco=20Giuffr=C3=A9?= <ciccio.giuffre@gmail.com>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 589/803] Translated using Weblate (Italian)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 60.3% (418 of 693 strings)

Translated using Weblate (Italian)

Currently translated at 55.4% (384 of 693 strings)

Co-authored-by: Francesco Giuffré <ciccio.giuffre@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/it/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/it-IT.json | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json
index 5b7da198..cc6a397b 100644
--- a/src/lang/it-IT.json
+++ b/src/lang/it-IT.json
@@ -379,5 +379,42 @@
     "Schedule maintenance": "Pianifica manutenzione",
     "Start of maintenance": "Inizio della manutenzione",
     "All Status Pages": "Tutte le pagine di stato",
-    "webhookAdditionalHeadersTitle": "Headers aggiuntivi"
+    "webhookAdditionalHeadersTitle": "Headers aggiuntivi",
+    "resendEveryXTimes": "Reinvia ogni {0} volte",
+    "resendDisabled": "Reinvio disabilitato",
+    "Resend Notification if Down X times consequently": "Reinvia la notifica se Down X volte di seguito",
+    "Add New Status Page": "Aggiungi nuova pagina di stato",
+    "webhookAdditionalHeadersDesc": "Imposta gli header aggiuntivi inviati nel webhook.",
+    "topicExplanation": "MQTT topic da controllare",
+    "successMessage": "Messaggio con successo",
+    "successMessageExplanation": "Messaggio MQTT considerato come successo",
+    "error": "errore",
+    "critical": "critico",
+    "Customize": "Personalizza",
+    "Custom Footer": "Piè di pagina personalizzato",
+    "Custom CSS": "CSS personalizzato",
+    "deleteStatusPageMsg": "Confermi la cancellazione di questa pagina di stato?",
+    "default": "Predefinito",
+    "enabled": "Abilitato",
+    "setAsDefault": "Imposta come predefinito",
+    "deleteProxyMsg": "Confermi la cancellazione di questo proxy per tutti i monitoraggi?",
+    "proxyDescription": "I proxy devono essere assegnati ad un monitoraggio per essere operativi.",
+    "setAsDefaultProxyDescription": "Questo proxy sarà abilitato come predefinito per tutti i nuovi monitoraggi. E' possibile disabilitare il proxy in modo indipendente per ogni singolo monitoraggio.",
+    "Certificate Chain": "Catena di certificati",
+    "Invalid": "Non valido",
+    "User": "Utente",
+    "Installed": "Installato",
+    "Not installed": "Non installato",
+    "Running": "In esecuzione",
+    "Not running": "Fermo",
+    "Remove Token": "Rimuovere token",
+    "Start": "Avvio",
+    "Next": "Prossimo",
+    "No Proxy": "Nessun proxy",
+    "Authentication": "Autenticazione",
+    "New Status Page": "Nuova pagina di stato",
+    "Page Not Found": "Pagina non trovata",
+    "Affected Monitors": "Monitoraggi interessati",
+    "Pick Affected Monitors...": "Seleziona i monitoraggi interessati…",
+    "Valid": "Valido"
 }

From 0b9c5c70b2dd8b0660a2c725c5fff6acb1257458 Mon Sep 17 00:00:00 2001
From: Nikita Ganzikov <nganzikov@gmail.com>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 590/803] Translated using Weblate (Russian)

Currently translated at 84.7% (587 of 693 strings)

Co-authored-by: Nikita Ganzikov <nganzikov@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ru-RU.json | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 8395eedb..5caf74d6 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -208,7 +208,7 @@
     "mattermost": "Mattermost",
     "Primary Base URL": "Основной URL",
     "Push URL": "URL пуша",
-    "needPushEvery": "К этому URL необходимо обращаться каждые {0} секунд",
+    "needPushEvery": "К этому URL необходимо обращаться каждые {0} секунд.",
     "pushOptionalParams": "Опциональные параметры: {0}",
     "defaultNotificationName": "Моё уведомление {notification} ({number})",
     "here": "здесь",
@@ -596,5 +596,13 @@
     "resendEveryXTimes": "Повторная отправка каждые {0} раз",
     "resendDisabled": "Повторная отправка отключена",
     "deleteMaintenanceMsg": "Вы действительно хотите удалить это обслуживание?",
-    "critical": "критично"
+    "critical": "критично",
+    "Custom Monitor Type": "Собственный тип монитора",
+    "markdownSupported": "Поддерживает синтаксис Markdown",
+    "Passive Monitor Type": "Пассивный тип монитора",
+    "Specific Monitor Type": "Специфичный тип монитора",
+    "Help": "Помощь",
+    "Game": "Игра",
+    "Resend Notification if Down X times consequently": "Повторно отправить уведомление, если не работает X раз подряд",
+    "General Monitor Type": "Основной тип монитора"
 }

From 6bda8d0b5518e41d9696dd3990db2935aeba223f Mon Sep 17 00:00:00 2001
From: UfukArt <ufukatbas@gmail.com>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 591/803] Translated using Weblate (Turkish)

Currently translated at 100.0% (693 of 693 strings)

Co-authored-by: UfukArt <ufukatbas@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index b9bc8adc..e7927e4b 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -448,7 +448,7 @@
     "Message:": "Mesaj:",
     "Don't know how to get the token? Please read the guide:": "Tokeni nasıl alacağınızı bilmiyor musunuz? Lütfen kılavuzu okuyun:",
     "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Halihazırda Cloudflare Tüneli üzerinden bağlanıyorsanız mevcut bağlantı kesilebilir. Durdurmak istediğinden emin misin? Onaylamak için mevcut şifrenizi yazın.",
-    "HTTP Headers": "HTTP Headers",
+    "HTTP Headers": "HTTP Başlıkları",
     "Trust Proxy": "Trust Proxy",
     "Other Software": "Diğer Yazılımlar",
     "For example: nginx, Apache and Traefik.": "Örneğin: nginx, Apache ve Traefik.",
@@ -691,5 +691,6 @@
     "promosms": "PromoSMS",
     "lunasea": "LunaSea",
     "line": "Line Messenger",
-    "mattermost": "Mattermost"
+    "mattermost": "Mattermost",
+    "markdownSupported": "Markdown yazım formatı desteklenir"
 }

From 34b1169ad694096790530d3c93f266145cb602ac Mon Sep 17 00:00:00 2001
From: 401Unauthorized <yehowahliu@4o1.to>
Date: Mon, 13 Feb 2023 08:59:25 +0000
Subject: [PATCH 592/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (693 of 693 strings)

Co-authored-by: 401Unauthorized <yehowahliu@4o1.to>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index a3393bd1..043a2523 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -3,7 +3,7 @@
     "checkEverySecond": "检测频率 {0} 秒",
     "retryCheckEverySecond": "重试间隔 {0} 秒",
     "resendEveryXTimes": "每 {0} 次失败则重复发送一次",
-    "resendDisabled": "为 0 时禁用重复发送",
+    "resendDisabled": "禁用重复发送",
     "retriesDescription": "服务被标记为故障并发送通知之前的最大重试次数",
     "ignoreTLSError": "忽略 HTTPS 站点的 TLS/SSL 错误",
     "upsideDownModeDescription": "反转状态监控,如果服务可访问,则认为是故障。",
@@ -60,7 +60,7 @@
     "Quick Stats": "状态速览",
     "Up": "正常",
     "Down": "故障",
-    "Pending": "正在检测",
+    "Pending": "检测中",
     "Unknown": "未知",
     "Pause": "暂停",
     "Name": "名称",
@@ -85,13 +85,13 @@
     "Friendly Name": "显示名称",
     "URL": "URL",
     "Hostname": "主机名",
-    "Port": "端口号",
+    "Port": "端口",
     "Heartbeat Interval": "心跳间隔",
     "Retries": "重试次数",
     "Heartbeat Retry Interval": "心跳重试间隔",
     "Resend Notification if Down X times consequently": "连续失败时重复发送通知的间隔次数",
     "Advanced": "高级",
-    "Upside Down Mode": "反转监控",
+    "Upside Down Mode": "反转模式",
     "Max. Redirects": "最大重定向次数",
     "Accepted Status Codes": "有效状态码",
     "Push URL": "推送 URL",
@@ -679,7 +679,7 @@
     "high": "高价",
     "General Monitor Type": "常规监控类型",
     "Passive Monitor Type": "被动监控类型",
-    "Specific Monitor Type": "针对监控类型",
+    "Specific Monitor Type": "特殊监控类型",
     "dataRetentionTimeError": "保留期必须为0或更大",
     "Monitor": "监控项 | 监控项",
     "Custom": "自定义",
@@ -696,5 +696,9 @@
     "uninstall": "卸载",
     "uninstalling": "正在卸载",
     "confirmUninstallPlugin": "您确定要卸载此插件吗?",
-    "Custom Monitor Type": "自定义监控类型"
+    "Custom Monitor Type": "自定义监控类型",
+    "markdownSupported": "支持 Markdown 语法",
+    "Google Analytics ID": "Google Analytics(分析)ID",
+    "Learn More": "了解更多",
+    "Edit Tag": "编辑标签"
 }

From 050c388bc3e2a8e21a570770bd3e941be133fb40 Mon Sep 17 00:00:00 2001
From: Savvas Mantzouranidis <mohito6@hotmail.com>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 593/803] Translated using Weblate (Greek)

Currently translated at 99.8% (696 of 697 strings)

Translated using Weblate (Greek)

Currently translated at 99.4% (689 of 693 strings)

Co-authored-by: Savvas Mantzouranidis <mohito6@hotmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/el/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/el-GR.json | 160 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 136 insertions(+), 24 deletions(-)

diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json
index c77d6158..49a3da60 100644
--- a/src/lang/el-GR.json
+++ b/src/lang/el-GR.json
@@ -25,8 +25,8 @@
     "confirmClearStatisticsMsg": "Είστε βέβαιοι ότι θέλετε να διαγράψετε ΟΛΑ τα στατιστικά στοιχεία;?",
     "importHandleDescription": "Επιλέξτε «Παράλειψη υπάρχοντος» εάν θέλετε να παραλείψετε κάθε παρακολούθηση ή ειδοποίηση με το ίδιο όνομα. Το 'Overwrite' θα διαγράψει κάθε υπάρχουσα παρακολούθηση και ειδοποίηση.",
     "confirmImportMsg": "Είστε βέβαιοι ότι θέλετε να εισαγάγετε το αντίγραφο ασφαλείας; Επαληθεύστε ότι έχετε επιλέξει τη σωστή επιλογή.",
-    "twoFAVerifyLabel": "Εισαγάγετε το 2FA κωδικό για να επαληθεύσετε: ",
-    "tokenValidSettingsMsg": "Ο κωδικός 2FA είναι έγκυρο! Τώρα μπορείτε να αποθηκεύσετε τις ρυθμίσεις 2FA",
+    "twoFAVerifyLabel": "Εισαγάγετε το 2FA κωδικό για να επαληθεύσετε:",
+    "tokenValidSettingsMsg": "Ο κωδικός 2FA είναι έγκυρος! Τώρα μπορείτε να αποθηκεύσετε τις ρυθμίσεις 2FA.",
     "confirmEnableTwoFAMsg": "Είστε βέβαιοι ότι θέλετε να ενεργοποιήσετε το 2FA;",
     "confirmDisableTwoFAMsg": "Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε το 2FA;",
     "Settings": "Ρυθμίσεις",
@@ -56,9 +56,9 @@
     "Resume": "Συνέχιση",
     "Edit": "Επεξεργασία",
     "Delete": "Διαγράφη",
-    "Current": "Current",
+    "Current": "Τρέχον",
     "Uptime": "Χρόνος λειτουργίας",
-    "Cert Exp.": "Cert Exp.",
+    "Cert Exp.": "Λήξη Πιστοπ.",
     "day": "ημέρα | ημέρες",
     "-day": "-ημέρα",
     "hour": "ώρα",
@@ -162,11 +162,11 @@
     "Token": "Token",
     "Show URI": "Εμφάνιση URI",
     "Tags": "Ετικέτες",
-    "Add New below or Select...": "Προσθήκη νέου παρακάτω ή Επιλέξτε...",
+    "Add New below or Select...": "Προσθήκη νέου παρακάτω ή Επιλέξτε…",
     "Tag with this name already exist.": "Υπάρχει ήδη η ετικέτα με αυτό το όνομα.",
     "Tag with this value already exist.": "Υπάρχει ήδη ετικέτα με αυτό το value.",
     "color": "χρώμα",
-    "value (optional)": "value (optional)",
+    "value (optional)": "τιμή (προαιρετικό)",
     "Gray": "Γκρί",
     "Red": "Κόκκινο",
     "Orange": "Πορτοκάλι",
@@ -175,7 +175,7 @@
     "Indigo": "Indigo",
     "Purple": "Μωβ",
     "Pink": "Ροζ",
-    "Search...": "Αναζήτηση...",
+    "Search...": "Αναζήτηση…",
     "Avg. Ping": "Μέσo.Ping",
     "Avg. Response": "Μέσo. Aπάντηση",
     "Entry Page": "Σελίδα εισαγωγής",
@@ -218,10 +218,10 @@
     "smtpBCC": "BCC",
     "discord": "Discord",
     "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "Μπορείτε να το αποκτήσετε μεταβαίνοντας στις Ρυθμίσεις διακομιστή -> Ενσωματώσεις -> Δημιουργία Webhook",
+    "wayToGetDiscordURL": "Μπορείτε να το αποκτήσετε μεταβαίνοντας στις Ρυθμίσεις διακομιστή -> Ενσωματώσεις -> Προβολή των Webhooks -> Νέο Webhook",
     "Bot Display Name": "Εμφανιζόμενο όνομα bot",
     "Prefix Custom Message": "Προσαρμοσμένο μήνυμα",
-    "Hello @everyone is...": "Γεια {'@'}everyone ειναι...",
+    "Hello @everyone is...": "Γεια {'@'}everyone είναι…",
     "teams": "Microsoft Teams",
     "Webhook URL": "Webhook URL",
     "wayToGetTeamsURL": "Μπορείτε να μάθετε πώς να δημιουργείτε μια διεύθυνση URL webhook {0}.",
@@ -271,7 +271,7 @@
     "apiCredentials": "API credentials",
     "octopushLegacyHint": "Χρησιμοποιείτε την παλαιού τύπου έκδοση του Octopush (2011-2020) ή τη νέα έκδοση;",
     "Check octopush prices": "Ελέγξτε τις τιμές OctoPush {0}.",
-    "octopushPhoneNumber": "Αριθμός τηλεφώνου (διεθνής μορφή, π.χ.: +30694345678)",
+    "octopushPhoneNumber": "Αριθμός τηλεφώνου (διεθνής μορφή, π.χ.: +30694345678) ",
     "octopushSMSSender": "Όνομα αποστολέα SMS: 3-11 αλφαριθμητικοί χαρακτήρες και διάστημα (a-zA-Z0-9)",
     "LunaSea Device ID": "LunaSea Device ID",
     "Apprise URL": "Apprise URL",
@@ -306,10 +306,10 @@
     "matrixDesc2": "Συνιστάται ανεπιφύλακτα να δημιουργήσετε έναν νέο χρήστη και να μην χρησιμοποιήσετε το διακριτικό πρόσβασης του χρήστη Matrix, καθώς θα επιτρέψει την πλήρη πρόσβαση στον λογαριασμό σας και σε όλα τα δωμάτια στα οποία συμμετέχετε. Αντίθετα, δημιουργήστε έναν νέο χρήστη και προσκαλέστε τον μόνο στο δωμάτιο στο οποίο θέλετε να λαμβάνετε την ειδοποίηση. Μπορείτε να λάβετε το access token εκτελώντας {0}",
     "Method": "Μέθοδος",
     "Body": "Σώμα",
-    "Headers": "Headers",
+    "Headers": "Κεφαλίδες",
     "PushUrl": "Push URL",
-    "HeadersInvalidFormat": "The request headers are not valid JSON: ",
-    "BodyInvalidFormat": "The request body is not valid JSON: ",
+    "HeadersInvalidFormat": "Οι κεφαλίδες του αιτήματος δεν αποτελούν έγκυρο JSON: ",
+    "BodyInvalidFormat": "Το περιεχόμενο/σώμα του αιτήματος δεν αποτελεί έγκυρο JSON: ",
     "Monitor History": "Ιστορικο Παρακολούθησης",
     "clearDataOlderThan": "Διατηρήστε τα δεδομένα ιστορικού παρακολούθησης για {0} ημέρες.",
     "PasswordsDoNotMatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν.",
@@ -327,8 +327,8 @@
     "Security": "Ασφάλεια",
     "Steam API Key": "Steam API Key",
     "Shrink Database": "Συρρίκνωση βάσης δεδομένων",
-    "Pick a RR-Type...": "Επιλέξτε έναν τύπο RR...",
-    "Pick Accepted Status Codes...": "Επιλέξτε Αποδεκτούς κωδικούς κατάστασης...",
+    "Pick a RR-Type...": "Επιλέξτε έναν τύπο RR…",
+    "Pick Accepted Status Codes...": "Επιλέξτε Αποδεκτούς κωδικούς κατάστασης…",
     "Default": "Προκαθορισμένο",
     "HTTP Options": "Επιλογές HTTP",
     "Create Incident": "Δημιουργία περιστατικού",
@@ -340,9 +340,9 @@
     "danger": "κίνδυνος",
     "error": "σφάλμα",
     "critical": "κριτικό",
-    "primary": "primary",
-    "light": "light",
-    "dark": "dark",
+    "primary": "κύριο",
+    "light": "φωτεινό",
+    "dark": "σκοτεινό",
     "Post": "Δημοσίευση",
     "Please input title and content": "Παρακαλούμε εισαγάγετε τίτλο και περιεχόμενο",
     "Created": "Δημιουργήθηκε",
@@ -403,7 +403,7 @@
     "proxyDescription": "Πρέπει να εκχωρηθούν proxies σε μια οθπαρακολουθή για να λειτουργήσουν..",
     "enableProxyDescription": "Το proxy δεν θα επηρεάσει τα αιτήματα της παρακολουθήσεις μέχρι να ενεργοποιηθεί. Μπορείτε να ελέγξετε την προσωρινή απενεργοποίηση του proxy από όλες τις παρακολουθήσεις βάσει κατάστασης ενεργοποίησης.",
     "setAsDefaultProxyDescription": "Αυτός το proxy θα είναι ενεργοποιημένο από προεπιλογή για νέες παρακολουθήσεις. Μπορείτε ακόμα να απενεργοποιήσετε το proxy ξεχωριστά για κάθε οθόνη.",
-    "Certificate Chain": "Certificate Chain",
+    "Certificate Chain": "Αλυσίδα Πιστοποιητικών",
     "Valid": "Εγκυρο",
     "Invalid": "Μη έγκυρο",
     "AccessKeyId": "AccessKey ID",
@@ -460,7 +460,7 @@
     "Message:": "Μήνυμα:",
     "Don't know how to get the token? Please read the guide:": "Δεν ξέρετε πώς να αποκτήσετε το token; Διαβάστε τον οδηγό:",
     "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Η τρέχουσα σύνδεση μπορεί να χαθεί εάν αυτή τη στιγμή συνδέεστε μέσω του Cloudflare Tunnel. Θέλετε σίγουρα να το σταματήσετε; Πληκτρολογήστε τον τρέχοντα κωδικό πρόσβασής σας για να τον επιβεβαιώσετε.",
-    "HTTP Headers": "HTTP Headers",
+    "HTTP Headers": "Κεφαλίδες HTTP",
     "Trust Proxy": "Εμπιστοσύνη του Proxy",
     "Other Software": "Other Software",
     "For example: nginx, Apache and Traefik.": "Για παράδειγμα: nginx, Apache και Traefik.",
@@ -562,11 +562,11 @@
     "Domain": "Domain",
     "Workstation": "Workstation",
     "disableCloudflaredNoAuthMsg": "Βρίσκεστε σε λειτουργία No Auth, δεν απαιτείται κωδικός πρόσβασης.",
-    "trustProxyDescription": "Εμπιστευτείτε τις κεφαλίδες 'X-Forwarded-*'. Εάν θέλετε να λάβετε τη σωστή IP πελάτη και το Uptime Kuma σας βρίσκεται πίσω το Nginx ή το Apache, θα πρέπει να το ενεργοποιήσετε.",
+    "trustProxyDescription": "Εμπιστευτείτε τις κεφαλίδες 'X-Forwarded-*'. Εάν θέλετε να λάβετε τη σωστή IP πελάτη και το Uptime Kuma σας βρίσκεται πίσω κάποιος proxy όπως το Nginx ή το Apache, θα πρέπει να το ενεργοποιήσετε.",
     "wayToGetLineNotifyToken": "Μπορείτε να λάβετε ένα access token από το {0}",
     "Examples": "Παραδείγματα",
     "Home Assistant URL": "Home Assistant URL",
-    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token": "Μακράς-Διάρκειας Κλειδί Τόκεν",
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token μπορεί να δημιουργηθεί κάνοντας κλικ στο όνομα του προφίλ σας (κάτω αριστερά) και κάνοντας κύλιση προς τα κάτω και, στη συνέχεια, κάντε κλικ στο Create Token. ",
     "Notification Service": "Υπηρεσία ειδοποιήσεων",
     "default: notify all devices": "προεπιλογή: ειδοποίηση όλων των συσκευών",
@@ -582,6 +582,118 @@
     "goAlertInfo": "Το GoAlert είναι μια εφαρμογή ανοιχτού κώδικα για προγραμματισμό κλήσεων, αυτοματοποιημένες κλιμακώσεις και ειδοποιήσεις (όπως SMS ή φωνητικές κλήσεις). Αλληλεπιδράστε αυτόματα με το σωστό άτομο, με τον σωστό τρόπο και τη σωστή στιγμή! {0}",
     "goAlertIntegrationKeyInfo": "Λάβετε το generic API integration key για την υπηρεσία σε αυτήν τη μορφή \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" συνήθως την τιμή της παραμέτρου διακριτικού της αντιγραμμένης διεύθυνσης URL.",
     "goAlert": "GoAlert",
-    "backupOutdatedWarning": "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται πολη, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
-    "backupRecommend": "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του volume ή του φακέλου δεδομένων (./data/) απευθείας."
+    "backupOutdatedWarning": "Καταργήθηκε: Επειδή προστέθηκαν πολλές δυνατότητες και αυτή η δυνατότητα δημιουργίας αντιγράφων ασφαλείας δεν διατηρείται, δεν μπορεί να δημιουργήσει ή να επαναφέρει ένα πλήρες αντίγραφο ασφαλείας.",
+    "backupRecommend": "Παρακαλούμε δημιουργήστε αντίγραφα ασφαλείας του volume ή του φακέλου δεδομένων (./data/) απευθείας.",
+    "Maintenance": "Συντήρηση",
+    "General Monitor Type": "Επόπτης Γενικού Τύπου",
+    "maintenanceStatus-under-maintenance": "Υπό Συντήρηση",
+    "dnsCacheDescription": "Μπορεί να μη λειτουργεί σε κάποια IPv6 περιβάλλοντα, απενεργοποιήστε αν συναντήσετε προβλήματα.",
+    "uninstalling": "Γίνεται απεγκατάσταση",
+    "confirmUninstallPlugin": "Θέλετε σίγουρα να απεγκαταστήσετε αυτό το πρόσθετο;",
+    "smseagle": "SMSEagle",
+    "smseagleRecipientType": "Τύπος παραλήπτη",
+    "smseagleUrl": "Το URL της SMSEagle συσκευής σας",
+    "Start of maintenance": "Έναρξη συντήρησης",
+    "All Status Pages": "Όλες οι Σελίδες Κατάστασης",
+    "Select status pages...": "Επιλέξτε σελίδες κατάστασης…",
+    "Optional": "Προαιρετικό",
+    "weekdayShortMon": "Δευ",
+    "weekdayShortTue": "Τρι",
+    "weekdayShortWed": "Τετ",
+    "weekdayShortThu": "Πεμ",
+    "weekdayShortFri": "Παρ",
+    "weekdayShortSat": "Σαβ",
+    "Help": "Βοήθεια",
+    "Game": "Παιχνίδι",
+    "Specific Monitor Type": "Επόπτης Συγκεκριμένου Τύπου",
+    "Passive Monitor Type": "Επόπτης Παθητικού Τύπου",
+    "Monitor": "Επόπτης | Επόπτες",
+    "Schedule maintenance": "Προγραμματισμός συντήρησης",
+    "Affected Monitors": "Επηρεαζόμενοι Επόπτες",
+    "Pick Affected Monitors...": "Διαλέξτε Επηρεαζόμενους Επόπτες…",
+    "webhookAdditionalHeadersTitle": "Επιπρόσθετες Κεφαλίδες",
+    "webhookAdditionalHeadersDesc": "Ορίζει επιπρόσθετες κεφαλίδες που θα σταλθούν με το webhook.",
+    "weekdayShortSun": "Κυρ",
+    "dayOfWeek": "Ημέρα της Εβδομάδας",
+    "dayOfMonth": "Ημέρα του Μήνα",
+    "lastDay1": "Τελευταία Μέρα του Μήνα",
+    "lastDay2": "2η Τελευταία Μέρα του Μήνα",
+    "lastDay3": "3η Τελευταία Μέρα του Μήνα",
+    "lastDay4": "4η Τελευταία Μέρα του Μήνα",
+    "lastDay": "Τελευταία Μέρα",
+    "No Maintenance": "Όχι Συντήρηση",
+    "pauseMaintenanceMsg": "Είστε σίγουροι για την παύση;",
+    "maintenanceStatus-inactive": "Ανενεργό",
+    "maintenanceStatus-scheduled": "Προγραμματισμένο",
+    "maintenanceStatus-ended": "Ολοκληρωμένο",
+    "maintenanceStatus-unknown": "Άγνωστο",
+    "Display Timezone": "Προβολή Ζώνης Ώρας",
+    "Server Timezone": "Ζώνη Ώρας του Server",
+    "statusPageMaintenanceEndDate": "Λήξη",
+    "Custom": "Προσαρμοσμένο",
+    "Economy": "Οικονομία",
+    "loadingError": "Αδύνατη συλλογή δεδομένων, προσπαθήστε ξανά αργότερα.",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "API βιβλιογραφία του SMSManager ",
+    "Kook": "Kook",
+    "statusMaintenance": "Συντήρηση",
+    "markdownSupported": "Υποστήριξη markdown συντακτικού",
+    "Packet Size": "Μέγεθος Πακέτου",
+    "or": "ή",
+    "recurringInterval": "Χρονικό Διάστημα",
+    "Recurring": "Επαναλαμβανόμενο",
+    "strategyManual": "Ενεργό/Ανενεργό Χειροκίνητα",
+    "warningTimezone": "Χρησιμοποιεί την ζώνη ώρας του server",
+    "squadcast": "Squadcast",
+    "IconUrl": "URL εικονιδίου",
+    "Enable DNS Cache": "Ενεργοποίηση DNS Cache",
+    "Enable": "Ενεργοποίηση",
+    "Disable": "Απενεργοποίηση",
+    "Single Maintenance Window": "Μονό Παράθυρο Συντήρησης",
+    "Maintenance Time Window of a Day": "Ημερίσιο πρόγραμμα Συντήρησης",
+    "Effective Date Range": "Ημερομηνιακό Διάστημα Εφαρμογής",
+    "Schedule Maintenance": "Προγραμματισμός Συντήρησης",
+    "Date and Time": "Ημερομηνία και Ώρα",
+    "DateTime Range": "Ημερομηνιακό Πλαίσιο",
+    "plugin": "Πρόσθετο | Πρόσθετα",
+    "install": "Εγκατάσταση",
+    "installing": "Γίνεται εγκατάσταση",
+    "uninstall": "Απεγκατάσταση",
+    "dataRetentionTimeError": "Η περίοδος διατήρησης πρέπει να είναι 0 ή μεγαλύτερο",
+    "infiniteRetention": "Ορίστε 0 για μόνιμη διατήρηση.",
+    "confirmDeleteTagMsg": "Θέλετε σίγουρα να διαγράψετε αυτήν την ετικέτα; Οι επόπτες που σχετίζονται με αυτήν την ετικέτα δεν θα διαγραφούν.",
+    "enableGRPCTls": "Επιτρέψτε την αποστολή gRPC αιτημάτων μέσω TLS συνδέσεων",
+    "grpcMethodDescription": "Το όνομα της μεθόδου μετατρέπεται σε cammelCase μορφή όπως π.χ. sayHello, check, κλπ.",
+    "deleteMaintenanceMsg": "Θέλετε σίγουρα να διαγράψετε αυτή την συντήρηση;",
+    "recurringIntervalMessage": "Εκτέλεση μια φορά την ημέρα | Εκτέλεση μία φορά ανά {0} ημέρες",
+    "affectedMonitorsDescription": "Επιλέξτε τους επόπτες που επηρεάζονται από την τωρινή συντήρηση",
+    "affectedStatusPages": "Προβολή αυτού του μηνύματος συντήρησης σε επιλεγμένες σελίδες κατάστασης",
+    "atLeastOneMonitor": "Επιλέξτε τουλάχιστον έναν επηρεασμένο επόπτη",
+    "wayToGetKookBotToken": "Δημιουργήστε εφαρμογή και πάρτε το bot token στο {0}",
+    "wayToGetKookGuildID": "Ενεργοποιήστε την 'Λειτουργία Προγραμματιστή' στις ρυθμίσεις Kook, και κάντε δεξί κλικ στο guild για να πάρετε το ID του",
+    "Guild ID": "Guild ID",
+    "Strategy": "Στρατηγική",
+    "Enable TLS": "Ενεργοποίηση TLS",
+    "Proto Service Name": "Όνομα Υπηρεσίας Proto",
+    "Proto Method": "Μέθοδος Proto",
+    "Proto Content": "Περιεχόμενο Proto",
+    "Lowcost": "Χαμηλό κόστος",
+    "high": "υψηλό",
+    "Gateway Type": "Τύπος Πύλης",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Μπορείτε να διαιρέσετε αριθμούς με",
+    "promosmsAllowLongSMS": "Επέτρεψε SMS μεγάλου μεγέθους",
+    "smseagleTo": "Αριθμός(οί) τηλεφώνου",
+    "smseagleGroup": "Όνομα/Ονόματα γκρουπ καταλόγων",
+    "smseagleContact": "Όνομα/Ονόματα επαφών καταλόγου",
+    "smseagleRecipient": "Παραλήπτης(ες) (πολλαπλοί πρέπει να διαχωρίζονται με κόμμα)",
+    "smseagleToken": "API Κλειδί τόκεν",
+    "smseagleEncoding": "Αποστολή ως Unicode",
+    "Custom Monitor Type": "Προσαρμοσμένος Τύπος Επόπτη",
+    "Edit Tag": "Επεξεργασία Ετικέτας",
+    "Server Address": "Διεύθυνση Διακομιστή",
+    "Learn More": "Μάθετε περισσότερα",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "smseaglePriority": "Προτεραιότητα μηνύματος (0-9, προεπιλογή = 0)"
 }

From 25d50e7660952fa338de08e1b6b1920170b4468b Mon Sep 17 00:00:00 2001
From: Cyril59310 <archas.cyril@hotmail.fr>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 594/803] Translated using Weblate (French)

Currently translated at 100.0% (693 of 693 strings)

Co-authored-by: Cyril59310 <archas.cyril@hotmail.fr>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index ae39af3c..4bf755d3 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -691,5 +691,6 @@
     "uninstall": "Désinstaller",
     "uninstalling": "Désinstallation",
     "confirmUninstallPlugin": "Voulez-vous vraiment désinstaller ce plugin ?",
-    "Custom Monitor Type": "Type de sonde personnalisé"
+    "Custom Monitor Type": "Type de sonde personnalisé",
+    "markdownSupported": "Syntaxe Markdown prise en charge"
 }

From c70ccd1183e73641626e8a5f13e081d0ff43bfff Mon Sep 17 00:00:00 2001
From: Andriy Skoropad <scan4u@gmail.com>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 595/803] Translated using Weblate (Ukrainian)

Currently translated at 78.0% (541 of 693 strings)

Co-authored-by: Andriy Skoropad <scan4u@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/uk/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/uk-UA.json | 43 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
index fcd678a3..ad8e6936 100644
--- a/src/lang/uk-UA.json
+++ b/src/lang/uk-UA.json
@@ -45,9 +45,9 @@
     "Uptime": "Аптайм",
     "Cert Exp.": "Сертифікат спливає",
     "day": "день | днів",
-    "-day": " днів",
+    "-day": "днів",
     "hour": "година",
-    "-hour": " години",
+    "-hour": "години",
     "Response": "Відповідь",
     "Ping": "Пінг",
     "Monitor Type": "Тип монітора",
@@ -74,7 +74,7 @@
     "Bottom": "Знизу",
     "None": "Відсутня",
     "Timezone": "Часовий пояс",
-    "Search Engine Visibility": "Індексація пошуковими системами:",
+    "Search Engine Visibility": "Видимість для пошукових систем",
     "Allow indexing": "Дозволити індексування",
     "Discourage search engines from indexing site": "Заборонити індексування",
     "Change Password": "Змінити пароль",
@@ -86,7 +86,7 @@
     "Enable Auth": "Увімкнути авторизацію",
     "disableauth.message1": "Ви впевнені, що бажаєте <strong>вимкнути авторизацію</strong>?",
     "disableauth.message2": "Це підходить для <strong>тих, у кого встановлена інша авторизація</strong> пееред відкриттям Uptime Kuma, наприклад Cloudflare Access.",
-    "Please use this option carefully!": "Будь ласка, використовуйте з обережністю.",
+    "Please use this option carefully!": "Будь ласка, використовуйте з обережністю!",
     "Logout": "Вийти",
     "Leave": "Відміна",
     "I understand, please disable": "Я розумію, все одно відключити",
@@ -208,8 +208,8 @@
     "mattermost": "Mattermost",
     "Primary Base URL": "Основна URL",
     "Push URL": "URL пуша",
-    "needPushEvery": "До цієї URL необхідно звертатися кожні {0} секунд",
-    "pushOptionalParams": "Опціональні параметри: {0}",
+    "needPushEvery": "Цю URL необхідно викликати кожні {0} секунд",
+    "pushOptionalParams": "Додаткові параметри: {0}",
     "defaultNotificationName": "Моє сповіщення {notification} ({number})",
     "here": "тут",
     "Required": "Потрібно",
@@ -526,5 +526,34 @@
     "ntfy Topic": "ntfy Тема",
     "Domain": "Домен",
     "Workstation": "Робоча станція",
-    "disableCloudflaredNoAuthMsg": "Ви перебуваєте в режимі без авторизації, пароль не потрібен."
+    "disableCloudflaredNoAuthMsg": "Ви перебуваєте в режимі без авторизації, пароль не потрібен.",
+    "Schedule maintenance": "Графік обслуговування",
+    "Affected Monitors": "Задіяні монітори",
+    "HomeAssistant": "Home Assistant",
+    "smseaglePriority": "Пріоритет повідомлення (0-9, за замовчуванням = 0)",
+    "smseagleRecipient": "Отримувач(і) (декілька отримувачів повинні бути відокремлені комами)",
+    "markdownSupported": "Підтримується синтаксис розмітки",
+    "Resend Notification if Down X times consequently": "Повторно надсилати сповіщення, якщо падіння відбулося X разів підряд",
+    "resendEveryXTimes": "Повторно відправляти кожні {0} разів",
+    "resendDisabled": "Повторне надсилання вимкнено",
+    "Start of maintenance": "Початок обслуговування",
+    "Select status pages...": "Вибери сторінку стану…",
+    "All Status Pages": "Всі сторінки станів",
+    "Passive Monitor Type": "Пасивний моніторинг",
+    "Specific Monitor Type": "Специфічний моніторинг",
+    "Monitor": "Монітор | Монітори",
+    "smseagle": "SMSEagle",
+    "smseagleEncoding": "Надсилати в Unicode",
+    "smseagleUrl": "URL-адреса пристрою SMSEagle",
+    "smseagleToken": "Токен доступу API",
+    "smseagleRecipientType": "Тип одержувача",
+    "smseagleContact": "Телефонний контакт(и)",
+    "smseagleGroup": "Телефонна група(и)",
+    "smseagleTo": "Телефонний номер(и)",
+    "Help": "Допомога",
+    "Game": "Гра",
+    "Pick Affected Monitors...": "Виберіть задіяні монітори…",
+    "statusMaintenance": "Обслуговування",
+    "Maintenance": "Обслуговування",
+    "General Monitor Type": "Основний моніторинг"
 }

From b9dd04ab05e2e3528c40256dae89a942cd7274be Mon Sep 17 00:00:00 2001
From: Dim <DimitriDR@users.noreply.weblate.kuma.pet>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 596/803] Translated using Weblate (French)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (French)

Currently translated at 100.0% (693 of 693 strings)

Co-authored-by: Dim <DimitriDR@users.noreply.weblate.kuma.pet>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 4bf755d3..f89cd0a4 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -4,7 +4,7 @@
     "retryCheckEverySecond": "Réessayer toutes les {0} secondes",
     "resendEveryXTimes": "Renvoyez toutes les {0} fois",
     "resendDisabled": "Renvoi désactivé",
-    "retriesDescription": "Nombre d'essais avant que le service ne soit déclaré hors ligne et qu'une notification soit envoyée.",
+    "retriesDescription": "Nombre d'essais avant que le service ne soit déclaré hors ligne et qu'une notification soit envoyée",
     "ignoreTLSError": "Ignorer les erreurs liées au certificat SSL/TLS",
     "upsideDownModeDescription": "Si le service est en ligne, il sera alors noté hors ligne et vice-versa.",
     "maxRedirectDescription": "Nombre maximal de redirections avant que le service ne soit marqué comme hors ligne.",
@@ -23,7 +23,7 @@
     "affectedMonitorsDescription": "Sélectionnez les sondes concernées par la maintenance en cours",
     "affectedStatusPages": "Afficher ce message de maintenance sur les pages d'état sélectionnées",
     "atLeastOneMonitor": "Sélectionnez au moins une sonde concernée",
-    "passwordNotMatchMsg": "Les mots de passe ne correspondent pas",
+    "passwordNotMatchMsg": "Les mots de passe ne correspondent pas.",
     "notificationDescription": "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
     "keywordDescription": "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
     "pauseDashboardHome": "En pause",
@@ -40,7 +40,7 @@
     "confirmClearStatisticsMsg": "Êtes-vous sûr de vouloir supprimer toutes les statistiques ?",
     "importHandleDescription": "Choisissez « Ignorer l'existant » si vous voulez ignorer chaque sonde ou notification portant le même nom. L'option « Écraser » supprime toutes les sondes et notifications existantes.",
     "confirmImportMsg": "Êtes-vous sûr de vouloir importer la sauvegarde ? Veuillez vous assurer que vous avez sélectionné la bonne option d'importation.",
-    "twoFAVerifyLabel": "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne.",
+    "twoFAVerifyLabel": "Veuillez saisir votre jeton pour vérifier que le système 2FA fonctionne :",
     "tokenValidSettingsMsg": "Le jeton est valide. Vous pouvez maintenant sauvegarder les paramètres de double authentification (2FA).",
     "confirmEnableTwoFAMsg": "Êtes-vous sûr de vouloir activer la double authentification (2FA) ?",
     "confirmDisableTwoFAMsg": "Êtes-vous sûr de vouloir désactiver la double authentification (2FA) ?",
@@ -264,7 +264,7 @@
     "rocket.chat": "Rocket.chat",
     "pushover": "Pushover",
     "pushy": "Pushy",
-    "PushByTechulus": "Push by Techulus",
+    "PushByTechulus": "Push par Techulus",
     "octopush": "Octopush",
     "promosms": "PromoSMS",
     "clicksendsms": "ClickSend SMS",
@@ -292,7 +292,7 @@
     "apiCredentials": "Identifiants de l'API",
     "octopushLegacyHint": "Voulez-vous utiliser l'ancienne version d'Octopush (2011-2020) ou la nouvelle version ?",
     "Check octopush prices": "Vérifier les prix d'Octopush {0}.",
-    "octopushPhoneNumber": "Numéro de téléphone (format international, ex. : +33612345678)",
+    "octopushPhoneNumber": "Numéro de téléphone (format international, ex. : +33612345678) ",
     "octopushSMSSender": "Nom de l'expéditeur : 3-11 caractères alphanumériques avec espace (a-zA-Z0-9)",
     "LunaSea Device ID": "Identifiant d'appareil LunaSea",
     "Apprise URL": "URL d'Apprise",
@@ -442,7 +442,7 @@
     "PhoneNumbers": "Numéros de téléphone",
     "TemplateCode": "Modèle de code",
     "SignName": "Signature",
-    "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
+    "Sms template must contain parameters: ": "Le modèle de SMS doit contenir des paramètres : ",
     "Bark Endpoint": "Endpoint Bark",
     "Bark Group": "Groupe Bark",
     "Bark Sound": "Son Bark",
@@ -501,7 +501,7 @@
     "Days Remaining:": "Jours restants : ",
     "Issuer:": "Émetteur : ",
     "Fingerprint:": "Empreinte : ",
-    "No status pages": "Aucune page de statut.",
+    "No status pages": "Aucune page de statut",
     "Domain Name Expiry Notification": "Notification d'expiration du nom de domaine",
     "Proxy": "Proxy",
     "Date Created": "Date de création",
@@ -600,7 +600,7 @@
     "Long-Lived Access Token": "Jeton d'accès de longue durée",
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Un jeton d'accès de longue durée peut être créé en cliquant sur le nom de votre profil (en bas à gauche) et en faisant défiler vers le bas, puis cliquez sur Créer un jeton. ",
     "Notification Service": "Service de notifications",
-    "default: notify all devices": "par défaut: notifier tous les appareils",
+    "default: notify all devices": "par défaut : notifier tous les appareils",
     "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Une liste des services de notification peut être trouvée dans Home Assistant sous \"Outils de développement > Services\" recherchez \"notification\" pour trouver le nom de votre appareil/téléphone.",
     "Automations can optionally be triggered in Home Assistant:": "Les automatisations peuvent éventuellement être déclenchées dans Home Assistant : ",
     "Trigger type:": "Type de déclencheur : ",
@@ -618,7 +618,7 @@
     "Optional": "Optionnel",
     "squadcast": "Squadcast",
     "SendKey": "SendKey",
-    "SMSManager API Docs": "Documentations de l'API SMSManager ",
+    "SMSManager API Docs": "Documentations de l'API SMSManager ",
     "Gateway Type": "Type de passerelle",
     "SMSManager": "SMSManager",
     "You can divide numbers with": "Vous pouvez diviser des nombres avec",
@@ -692,5 +692,5 @@
     "uninstalling": "Désinstallation",
     "confirmUninstallPlugin": "Voulez-vous vraiment désinstaller ce plugin ?",
     "Custom Monitor Type": "Type de sonde personnalisé",
-    "markdownSupported": "Syntaxe Markdown prise en charge"
+    "markdownSupported": "Syntaxe Markdown supportée"
 }

From cb563950e5189b73c76e622598c50b19a246f7fa Mon Sep 17 00:00:00 2001
From: David F <me@thefourcraft.com>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 597/803] Translated using Weblate (Hebrew (Israel))

Currently translated at 99.8% (692 of 693 strings)

Co-authored-by: David F <me@thefourcraft.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/he_IL/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/he-IL.json | 44 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/lang/he-IL.json b/src/lang/he-IL.json
index c8219ff5..37c1a10e 100644
--- a/src/lang/he-IL.json
+++ b/src/lang/he-IL.json
@@ -15,10 +15,10 @@
     "statusMaintenance": "תחזוקה",
     "Schedule maintenance": "תחזוקה מתוכננת",
     "Affected Monitors": "מוניטורים מושפעים",
-    "Pick Affected Monitors...": "בחר המוניטרים מושפעים...",
+    "Pick Affected Monitors...": "בחר המוניטריים המושפעים…",
     "Start of maintenance": "תחילת תחזוקה",
     "All Status Pages": "כל דפי הסטטוס",
-    "Select status pages...": "בחר דפי סטטוס...",
+    "Select status pages...": "בחר דפי סטטוס…",
     "recurringIntervalMessage": "רוץ פעם ביום | הפעל אחת ל-{0} ימים",
     "affectedMonitorsDescription": "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית",
     "affectedStatusPages": "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו",
@@ -177,7 +177,7 @@
     "Token": "אסימון",
     "Show URI": "הצג URI",
     "Tags": "תגים",
-    "Add New below or Select...": "הוסף חדש למטה או בחר...",
+    "Add New below or Select...": "הוסף חדש למטה או בחר…",
     "Tag with this name already exist.": "תג בשם זה כבר קיים.",
     "Tag with this value already exist.": "תג עם ערך זה כבר קיים.",
     "color": "צבע",
@@ -190,7 +190,7 @@
     "Indigo": "כחול כהה",
     "Purple": "סגול",
     "Pink": "כתום",
-    "Search...": "לחפש...",
+    "Search...": "לחפש…",
     "Avg. Ping": "פינג ממוצע",
     "Avg. Response": "ממוצע תגובה",
     "Entry Page": "דף כניסה",
@@ -237,7 +237,7 @@
     "wayToGetDiscordURL": "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> צור Webhook",
     "Bot Display Name": "שם תצוגה של בוט",
     "Prefix Custom Message": "קידומת הודעה מותאמת אישית",
-    "Hello @everyone is...": "שלום {'@'}כולם...",
+    "Hello @everyone is...": "שלום {'@'}כולם…",
     "teams": "Microsoft Teams",
     "Webhook URL": "כתובת האתר של Webhook",
     "wayToGetTeamsURL": "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
@@ -342,8 +342,8 @@
     "Security": "אבטחה",
     "Steam API Key": "מפתח API Steam",
     "Shrink Database": "מסד נתונים מכווץ",
-    "Pick a RR-Type...": "בחר סוג RR ...",
-    "Pick Accepted Status Codes...": "בחר קודי סטטוס מקובלים ...",
+    "Pick a RR-Type...": "בחר סוג RR…",
+    "Pick Accepted Status Codes...": "בחר קודי סטטוס מקובלים…",
     "Default": "בְּרִירַת מֶחדָל",
     "HTTP Options": "אפשרויות HTTP",
     "Create Incident": "ליצור אירוע",
@@ -587,7 +587,7 @@
     "Domain": "תְחוּם",
     "Workstation": "עמדת עבודה",
     "disableCloudflaredNoAuthMsg": "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.",
-    "trustProxyDescription": "סמוך על כותרות 'x-forwarded-*'.אם אתה רוצה להשיג את ה- IP של הלקוח הנכון וה- Uptime Kuma שלך מאחור כמו Nginx או Apache, עליך לאפשר זאת.",
+    "trustProxyDescription": "סמוך על הכותרות 'X-Forwarded-*'. אם אתה רוצה לקבל את כתובת ה-IP של הלקוח וה- Uptime Kuma שלך עומד מאחורי פרוקסי כגון Nginx או Apache, עליך להפעיל זאת.",
     "wayToGetLineNotifyToken": "אתה יכול לקבל אסימון גישה מ- {0}",
     "Examples": "דוגמאות",
     "Home Assistant URL": "כתובת URL עוזרת ביתית",
@@ -607,7 +607,7 @@
     "goAlertInfo": "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}",
     "goAlertIntegrationKeyInfo": "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.",
     "goAlert": "GoAlert",
-    "backupOutdatedWarning": "מיושם: מכיוון שהרבה תכונות שנוספו ותכונת הגיבוי הזו מעט לא מצומצמת, היא לא יכולה לייצר או לשחזר גיבוי שלם.",
+    "backupOutdatedWarning": "הוצא משימוש: מכיוון שנוספו הרבה תכונות ותכונת הגיבוי הזו קצת לא מתוחזקת, היא לא יכולה ליצור או לשחזר גיבוי מלא.",
     "backupRecommend": "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.",
     "Optional": "אופציונאלי",
     "squadcast": "Squadcast",
@@ -668,5 +668,29 @@
     "high": "גבוהה",
     "General Monitor Type": "מוניטור כללי",
     "Passive Monitor Type": "מוניטור פסיבי",
-    "Specific Monitor Type": "סוג מוניטור ספציפי"
+    "Specific Monitor Type": "סוג מוניטור ספציפי",
+    "Custom Monitor Type": "סוג צג מותאם אישית",
+    "Monitor": "מוניטור | מוניטרים",
+    "promosmsAllowLongSMS": "אפשר SMS ארוך",
+    "loadingError": "לא ניתן לאחזר את הנתונים, אנא נסה שוב מאוחר יותר.",
+    "plugin": "תוסף | תוספים",
+    "install": "להתקין",
+    "installing": "מתקין",
+    "uninstall": "הסר את ההתקנה",
+    "uninstalling": "מסיר התקנה",
+    "confirmUninstallPlugin": "האם אתה בטוח שברצונך להסיר את התוסף הזה?",
+    "Help": "עזרה",
+    "Game": "משחק",
+    "Packet Size": "גודל חבילה",
+    "markdownSupported": "תחביר סימון נתמך (Markdown )",
+    "Custom": "מותאם אישית",
+    "ZohoCliq": "זוהו קליק",
+    "wayToGetZohoCliqURL": "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
+    "dataRetentionTimeError": "תקופת השמירה חייבת להיות 0 או יותר",
+    "infiniteRetention": "הגדר ל-0 לשמירה אינסופית.",
+    "confirmDeleteTagMsg": "האם אתה בטוח שברצונך למחוק תג זה? צגים המשויכים לתג זה לא יימחקו.",
+    "Kook": "קוק",
+    "wayToGetKookBotToken": "צור יישום וקבל את אסימון הבוט שלך ב-{0}",
+    "wayToGetKookGuildID": "הפעל את 'מצב מפתח' בהגדרת קוק, ולחץ לחיצה ימנית על הגילדה כדי לקבל את המזהה שלה",
+    "Guild ID": "מזהה גילד"
 }

From fe66a24f00feb74a61759832abdd451f2a0e7d09 Mon Sep 17 00:00:00 2001
From: Rachatat Bunpat <rbunpat@gmail.com>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 598/803] Translated using Weblate (Thai)

Currently translated at 86.7% (601 of 693 strings)

Co-authored-by: Rachatat Bunpat <rbunpat@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/th/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/th-TH.json | 49 ++++++++++++++++++++++++++++++++++-----------
 1 file changed, 37 insertions(+), 12 deletions(-)

diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
index 7ad132f5..9ae9a373 100644
--- a/src/lang/th-TH.json
+++ b/src/lang/th-TH.json
@@ -102,7 +102,7 @@
     "Disable Auth": "ปิดใช้งานการตรวจสอบสิทธิ์",
     "Enable Auth": "เปิดใช้งานการตรวจสอบสิทธิ์",
     "disableauth.message1": "คุณต้องการที่จะ <strong>ปิดใช้งานระบบรับรองความถูกต้องใช่หรือไม่</strong>?",
-    "disableauth.message2": "ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่น ๆ",
+    "disableauth.message2": "ระบบนี้ถูกออกแบบมาเพื่อการใช้งานกับระบบรับรองความถูกต้องของบุคคลที่สามเช่น Cloudflare Access, Authelia หรือวิธีการอื่นๆ",
     "Please use this option carefully!": "โปรดใช้ความระมัดระวังในการเลือกใช้งานระบบนี้ !",
     "Logout": "ออกจากระบบ",
     "Leave": "ออก",
@@ -159,7 +159,7 @@
     "Token": "กุญแจ",
     "Show URI": "แสดง URI",
     "Tags": "แท็ก",
-    "Add New below or Select...": "เพิ่มใหม่ด้านล่างหรือเลือก...",
+    "Add New below or Select...": "เพิ่มใหม่ด้านล่างหรือเลือก…",
     "Tag with this name already exist.": "แท็กที่มีชื่อนี้มีอยู่แล้ว",
     "Tag with this value already exist.": "แท็กที่มีข้อมูลนี้มีอยู่แล้ว",
     "color": "สี",
@@ -172,7 +172,7 @@
     "Indigo": "ม่วง",
     "Purple": "ม่วง",
     "Pink": "ชมพู",
-    "Search...": "ค้นหา...",
+    "Search...": "ค้นหา…",
     "Avg. Ping": "ค่า Ping เฉลี่ย",
     "Avg. Response": "ค่า Response เฉลี่ย",
     "Entry Page": "หน้าต้อนรับ",
@@ -217,7 +217,7 @@
     "wayToGetDiscordURL": "คุณสามารถรับได้โดยการไปที่ Server Settings -> Integrations -> Create Webhook",
     "Bot Display Name": "ชื่อบอท",
     "Prefix Custom Message": "คำนำหน้าข้อความที่กำหนดเอง",
-    "Hello @everyone is...": "สวัสดี {'@'}everyone นี่...",
+    "Hello @everyone is...": "สวัสดี {'@'}everyone นี่…",
     "teams": "Microsoft Teams",
     "Webhook URL": "Webhook URL",
     "wayToGetTeamsURL": "คุณสามารถเรียนรู้วิธีการสร้าง Webhook URL {0}",
@@ -303,7 +303,7 @@
     "Body": "เนื้อหา",
     "Headers": "ส่วนหัว",
     "PushUrl": "Push URL",
-    "HeadersInvalidFormat": "เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง :",
+    "HeadersInvalidFormat": "เนื้อหาคำขอส่วนหัวไม่ใช่ JSON ที่ถูกต้อง: ",
     "BodyInvalidFormat": "เนื้อหาคำขอไม่ใช่ JSON ที่ถูกต้อง : ",
     "Monitor History": "ประวัติมอนิเตอร์",
     "clearDataOlderThan": "เก็บข้อมูลมอนิเตอร์ {0} วัน",
@@ -323,7 +323,7 @@
     "Steam API Key": "Steam API Key",
     "Shrink Database": "ย่อฐานข้อมูล",
     "Pick a RR-Type...": "เลือกชนิด DNS Record",
-    "Pick Accepted Status Codes...": "เลือกสถานะที่ยอมรับ...",
+    "Pick Accepted Status Codes...": "เลือกเลขสถานะที่ยอมรับ…",
     "Default": "ค่าเริ่มต้น",
     "HTTP Options": "ตัวเลือก HTTP",
     "Create Incident": "สร้างเหตุการณ์",
@@ -441,9 +441,9 @@
     "wayToGetCloudflaredURL": "(ดาวโหลด cloudflared จาก {0})",
     "cloudflareWebsite": "เว็บไซต์ Cloudflare",
     "Message:": "ข้อความ :",
-    "Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ?, กรุณาอ่านคู่มือ",
+    "Don't know how to get the token? Please read the guide:": "ไม่รู้วิธีการรับกุญแจ? กรุณาอ่านคู่มือ:",
     "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "การเชื่อมต่อปัจุบันอาจขาดหายหากคุณกำลังเชื่อมต่อ Cloudflare Tunnel คุณแน่ใจหรือไม่ที่จะหยุด, พิมรหัสผ่านของคุณเพื่อยืนยัน",
-    "Other Software": "ซอฟต์แวร์อื่นๆ ",
+    "Other Software": "ซอฟต์แวร์อื่นๆ",
     "For example: nginx, Apache and Traefik.": "เช่น: nginx, Apache และ Traefik",
     "Please read": "กรุณาอ่าน",
     "Subject:": "เรื่อง :",
@@ -455,7 +455,7 @@
     "Domain Name Expiry Notification": "แจ้งเตือนการหมดอายุของโดเมน",
     "Proxy": "Proxy",
     "Date Created": "วันที่สร้าง",
-    "onebotHttpAddress": "ที่อยู่ HTTP OneBot ",
+    "onebotHttpAddress": "ที่อยู่ HTTP OneBot",
     "onebotMessageType": "ชนิดข้อความ OneBot",
     "onebotGroupMessage": "กลุ่ม",
     "onebotPrivateMessage": "ส่วนตัว",
@@ -562,11 +562,11 @@
     "Domain": "โดเมน",
     "Workstation": "Workstation",
     "disableCloudflaredNoAuthMsg": "คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน",
-    "trustProxyDescription": "เชื่อ Header 'X-Forwarded-*' ถ้าคุณต้องการไอพีที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache, คุณควรเปิดใช้งาน",
+    "trustProxyDescription": "เชื่อ Header 'X-Forwarded-*', คุณควรเปิดใช้งาน ถ้าคุณต้องการ IP ของผู้ใช้ที่ถูกต้องและ Uptime Kuma อยู่ข้างหลัง Nginx หรือ Apache",
     "Examples": "ตัวอย่าง",
     "Home Assistant URL": "Home Assistant URL",
     "Long-Lived Access Token": "Access Token แบบมีอายุนาน",
-    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก \"Create Token\"",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Access Token แบบมีอายุนานสามารถสร้างได้โดยคลิกชื่อบนโปรไฟล์ (ล่างซ้าย) และเลื่อนไปข้างล่างจากนั้นคลิก \"Create Token\" ",
     "Notification Service": "บริการแจ้งเตือน",
     "default: notify all devices": "ค่าเริ่มต้น: แจ้งเตือนทุกอุปกรณ์",
     "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "รายการแจ้งเตือนสามารถหาได้ใน Home Assistant ในเมนู \"Developer Tools > Services\" แล้วค้นหา \"notification\" เพื่อหาชื่ออุปกรณ์หรือชื่อโทรศัพท์",
@@ -576,5 +576,30 @@
     "Event data:": "ข้อมูลกิจกรรม:",
     "Then choose an action, for example switch the scene to where an RGB light is red.": "จากนั้นเลือกการกระทำ, ตัวอย่าง เช่น เปลี่ยนเป็นไฟสีแดง",
     "Frontend Version": "เวอร์ชั่น Frontend",
-    "Frontend Version do not match backend version!": "เวอร์ชั่น Frontend ไม่ตรงกับ Backend !"
+    "Frontend Version do not match backend version!": "เวอร์ชั่น Frontend ไม่ตรงกับ Backend !",
+    "webhookAdditionalHeadersTitle": "Header เพิ่มเติม",
+    "webhookAdditionalHeadersDesc": "กำหนด Header ที่จะส่งไปหร้อมกับ Webhook",
+    "Start of maintenance": "เริ่มการซ่อมบำรุง",
+    "All Status Pages": "หน้าสถานะทั้งหมด",
+    "Custom": "กำหนดเอง",
+    "Game": "เกม",
+    "statusMaintenance": "การซ่อมบำรุง",
+    "Maintenance": "การซ่อมบำรุง",
+    "Monitor": "มอนิเตอร์ | มอนิเตอร์",
+    "Select status pages...": "เลือกหน้าสถานะ",
+    "Schedule maintenance": "กำหนดเวลาบำรุงรักษา",
+    "Affected Monitors": "มอนิเตอร์ที่ได้รับผลกระทบ",
+    "markdownSupported": "รองรับ Markdown",
+    "Help": "ช่วยเหลือ",
+    "Pick Affected Monitors...": "เลือกมอนิเตอร์ที่ได้รับผลกระทบ",
+    "Packet Size": "ขนาดของ Packet",
+    "ZohoCliq": "ZohoCliq",
+    "backupOutdatedWarning": "ไม่ได้รับการพัฒนาแล้ว : ไม่สามารถสร้างหรือกูข้อมูลสำรองได้สมบูรณ์ เนื่องจากมีฟีเจอร์ใหม่เพิ่มขึ้นมากและการแบ็คอัพไม่ได้ถูกพัฒนา",
+    "backupRecommend": "กรุณาแบ็คอัพข้อมูลทั้งหมดหรือโฟลเดอร์ Data (./data/) โดยตรงแทน",
+    "Optional": "ไม่จำเป็น",
+    "squadcast": "Squadcast",
+    "or": "หรือ",
+    "recurringInterval": "ช่วงเวลา",
+    "Recurring": "ทำซ้ำ",
+    "General Monitor Type": "ชนิดมอนิเตอร์ทั่วไป"
 }

From 06d1309d78186eec47591b90908f9147fde4739c Mon Sep 17 00:00:00 2001
From: Cyril59310 <archas.cyril@hotmail.fr>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 599/803] Translated using Weblate (French)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (French)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (French)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (French)

Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: Cyril59310 <archas.cyril@hotmail.fr>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index f89cd0a4..4ab908b3 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -73,7 +73,7 @@
     "Delete": "Supprimer",
     "Current": "Actuellement",
     "Uptime": "Disponibilité",
-    "Cert Exp.": "Expiration SSL",
+    "Cert Exp.": "Expiration SSL.",
     "day": "jour | jours",
     "-day": " jours",
     "hour": "heure",
@@ -89,7 +89,7 @@
     "Heartbeat Interval": "Intervalle de vérification",
     "Retries": "Essais",
     "Heartbeat Retry Interval": "Réessayer l'intervalle de vérification",
-    "Resend Notification if Down X times consequently": "Renvoyer une notification si hors ligne X fois",
+    "Resend Notification if Down X times consequently": "Renvoyer la notification si en panne X fois consécutivement",
     "Advanced": "Avancé",
     "Upside Down Mode": "Mode inversé",
     "Max. Redirects": "Nombre maximum de redirections",
@@ -235,7 +235,7 @@
     "smtpBCC": "CCI",
     "discord": "Discord",
     "Discord Webhook URL": "URL vers le webhook Discord",
-    "wayToGetDiscordURL": "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Créer un Webhook »",
+    "wayToGetDiscordURL": "Vous pouvez l'obtenir en allant dans « Paramètres du serveur » -> « Intégrations » -> « Consulter les webhooks» -> « Nouveau Webhook »",
     "Bot Display Name": "Nom du robot (affiché)",
     "Prefix Custom Message": "Préfixe du message personnalisé",
     "Hello @everyone is...": "Bonjour {'@'}everyone il…",
@@ -692,5 +692,9 @@
     "uninstalling": "Désinstallation",
     "confirmUninstallPlugin": "Voulez-vous vraiment désinstaller ce plugin ?",
     "Custom Monitor Type": "Type de sonde personnalisé",
-    "markdownSupported": "Syntaxe Markdown supportée"
+    "markdownSupported": "Syntaxe Markdown supportée",
+    "Google Analytics ID": "Identifiant Google Analytics",
+    "Server Address": "Adresse du serveur",
+    "Learn More": "En savoir plus",
+    "Edit Tag": "Modifier l'étiquette"
 }

From bcac18cc2b2c1d726eb927eb7e80709db305c3df Mon Sep 17 00:00:00 2001
From: Jason Houk <dubsectordevelopment@gmail.com>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 600/803] Translated using Weblate (Japanese)

Currently translated at 25.2% (175 of 694 strings)

Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ja/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ja.json | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/lang/ja.json b/src/lang/ja.json
index 76ca4c23..3de54074 100644
--- a/src/lang/ja.json
+++ b/src/lang/ja.json
@@ -21,7 +21,7 @@
     "Language": "言語",
     "Appearance": "外観",
     "Theme": "テーマ",
-    "General": "General",
+    "General": "全般的",
     "Version": "バージョン",
     "Check Update On GitHub": "GitHubでアップデートを確認する",
     "List": "一覧",
@@ -167,5 +167,14 @@
     "Edit Status Page": "ステータスページ編集",
     "Go to Dashboard": "ダッシュボード",
     "Status Page": "ステータスページ",
-    "Status Pages": "ステータスページ"
+    "Status Pages": "ステータスページ",
+    "Shrink Database": "データベースの縮小",
+    "Start": "始める",
+    "Retry": "リトライ",
+    "Please read": "読んでください",
+    "Orange": "橙",
+    "Gateway Type": "ゲートウェイの種類",
+    "Game": "ゲーム",
+    "Help": "ヘルプ",
+    "Maintenance": "メンテナンス"
 }

From 5f71515253bbbbdfabfcca77b8eb6e3bf42f0b9a Mon Sep 17 00:00:00 2001
From: Eduard Dev <legocuedy09@gmail.com>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 601/803] Translated using Weblate (Romanian)

Currently translated at 80.3% (560 of 697 strings)

Translated using Weblate (English)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Eduard Dev <legocuedy09@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ro/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/en.json |   2 +-
 src/lang/ro.json | 562 ++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 562 insertions(+), 2 deletions(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index d907f4e0..9cf4c1e8 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -446,7 +446,7 @@
     "smtpCC": "CC",
     "smtpBCC": "BCC",
     "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> Create Webhook",
+    "wayToGetDiscordURL": "You can get this by going to Server Settings -> Integrations -> View Webhooks -> New Webhook",
     "Bot Display Name": "Bot Display Name",
     "Prefix Custom Message": "Prefix Custom Message",
     "Hello @everyone is...": "Hello {'@'}everyone is…",
diff --git a/src/lang/ro.json b/src/lang/ro.json
index a659e0be..066d1ed5 100644
--- a/src/lang/ro.json
+++ b/src/lang/ro.json
@@ -1,3 +1,563 @@
 {
-    "languageName": "Limba română"
+    "languageName": "Română",
+    "Dashboard": "Panou de Control",
+    "Help": "Ajutor",
+    "Appearance": "Aspect",
+    "Theme": "Temă",
+    "General": "General",
+    "Version": "Versiune",
+    "Check Update On GitHub": "Verifică Actualitatea pe GitHub",
+    "Quick Stats": "Statistici Rapide",
+    "Up": "Sus",
+    "Down": "Jos",
+    "statusMaintenance": "Mentenanță",
+    "Maintenance": "Mentenanță",
+    "General Monitor Type": "Monitor de Tip General",
+    "Passive Monitor Type": "Monitor de Tip Pasiv",
+    "markdownSupported": "Limbaj Markdown Acceptat",
+    "Pause": "Pauză",
+    "Name": "Nume",
+    "Status": "Status",
+    "DateTime": "DatăOră",
+    "Message": "Mesaj",
+    "No important events": "Niciun eveniment important",
+    "Resume": "Reia",
+    "Delete": "Șterge",
+    "Uptime": "Timpul de funcționare",
+    "Cert Exp.": "Expirarea Certificatului",
+    "Monitor": "Monitor | Monitoare",
+    "day": "zi | zile",
+    "-day": "-zi",
+    "hour": "oră",
+    "Edit": "Modifică",
+    "Ping": "Ping",
+    "Monitor Type": "Tipul Monitorului",
+    "Keyword": "Cuvânt Cheie",
+    "Friendly Name": "Nume Ușor de Recunoscut",
+    "URL": "URL",
+    "Hostname": "Hostname",
+    "Port": "Port",
+    "Retries": "Reîncercări",
+    "Heartbeat Retry Interval": "Intervalul Reîncercării Heartbeat-ului",
+    "Advanced": "Avansat",
+    "checkEverySecond": "Verifică la fiecare {0} secunde",
+    "retryCheckEverySecond": "Reîncearcă la fiecare {0} secunde",
+    "resendEveryXTimes": "Retrimite de {0} ori",
+    "resendDisabled": "Retrimiterea dezactivată",
+    "ignoreTLSError": "Ignoră erorile TLS/SSL pentru site-urile HTTPS",
+    "upsideDownModeDescription": "Întoarce statusul cu susul în jos. Dacă serviciul este contactabil, este OFFLINE.",
+    "Upside Down Mode": "Modul cu Susul in Jos",
+    "Max. Redirects": "Nr. Max. de Redirecționări",
+    "Accepted Status Codes": "Coduri de Status Acceptate",
+    "Push URL": "Împinge URL",
+    "needPushEvery": "Acest URL trebuie să fie contactat la fiecare {0} secunde.",
+    "pushOptionalParams": "Parametrii opționali: {0}",
+    "Save": "Salvează",
+    "Notifications": "Notificări",
+    "Not available, please setup.": "Indisponibil, trebuie configurat.",
+    "Setup Notification": "Configurare Notificări",
+    "Light": "Luminos",
+    "Dark": "Întunecat",
+    "Auto": "Automat",
+    "Normal": "Normal",
+    "Bottom": "Fund",
+    "None": "Nimic",
+    "Timezone": "Fus Orar",
+    "Search Engine Visibility": "Vizibilitate în Motoarele de Căutare",
+    "Allow indexing": "Permite Indexarea",
+    "Change Password": "Schimbă Parola",
+    "Current Password": "Parola Curentă",
+    "New Password": "Parolă Nouă",
+    "Repeat New Password": "Repetă Parola Nouă",
+    "Update Password": "Actualizează Parola",
+    "Disable Auth": "Dezactivează Autentificarea",
+    "Enable Auth": "Activează Autentificarea",
+    "disableauth.message1": "Ești sigur că vrei să <strong>dezactivezi autentificarea</strong>?",
+    "Please use this option carefully!": "Utilizează Această Opțiune cu Grijă!",
+    "Logout": "Delogare",
+    "Leave": "Părăsește",
+    "I understand, please disable": "Am luat la cunoștință, dezactivează",
+    "Confirm": "Confirmă",
+    "Yes": "Da",
+    "No": "Nu",
+    "Username": "Nume de Utilizator",
+    "Password": "Parolă",
+    "Remember me": "Ține-mă Minte",
+    "No Monitors, please": "Niciun monitor, te rog",
+    "add one": "adaugă unul",
+    "Resource Record Type": "Tipul de Înregistrare a Resurselor",
+    "Create your admin account": "Crează un Cont de Administrator",
+    "Repeat Password": "Repetă Parola",
+    "Import Backup": "Importează Backup-ul",
+    "Export Backup": "Exporta Backup-ul",
+    "Export": "Exportează",
+    "Import": "Importă",
+    "respTime": "Timp de Răspuns (ms)",
+    "Apply on all existing monitors": "Aplică pentru toate monitoarele existente",
+    "Clear Data": "Șterge Datele",
+    "Events": "Evenimente",
+    "Heartbeats": "Heartbeat-uri",
+    "Auto Get": "Obține Automat",
+    "Affected Monitors": "Monitoare Afectate",
+    "Pick Affected Monitors...": "Alege Monitoarele Afectate…",
+    "Start of maintenance": "Începerea Mentenanței",
+    "All Status Pages": "Toate Paginile de Status",
+    "Skip existing": "Sari Existente",
+    "Overwrite": "Suprascrie",
+    "Options": "Opțiuni",
+    "Keep both": "Păstrează Ambele",
+    "Verify Token": "Verifică Token-ul",
+    "Enable 2FA": "Activează Autentificarea în Doi Pași",
+    "Disable 2FA": "Dezactivează Autentificarea în Doi Pași",
+    "2FA Settings": "Setări Autentificare în Doi Pași",
+    "Active": "Activ",
+    "Token": "Token",
+    "Show URI": "Arată URI",
+    "Tags": "Etichete",
+    "Tag with this name already exist.": "Deja Există o Etichetă cu Acest Nume.",
+    "Tag with this value already exist.": "Deja Există o Etichetă cu Această Valoare.",
+    "color": "Culoare",
+    "value (optional)": "valoare (opțional)",
+    "Gray": "Gri",
+    "Red": "Roșu",
+    "Orange": "Portocaliu",
+    "Green": "Verde",
+    "Blue": "Albastru",
+    "Indigo": "Indigo",
+    "Purple": "Violet",
+    "Custom": "Personalizat",
+    "Entry Page": "Pagina de Implicită",
+    "No Services": "Niciun Serviciu",
+    "All Systems Operational": "Toate Sistemele Operaționale",
+    "Partially Degraded Service": "Servicii Parțial Degradate",
+    "Degraded Service": "Servicii Degradate",
+    "Add Group": "Adaugă Grup",
+    "Add a monitor": "Adaugă Monitor",
+    "Edit Status Page": "Modifică Pagina de Status",
+    "Status Page": "Pagina de Status",
+    "Status Pages": "Pagini de Status",
+    "defaultNotificationName": "A mea {notification} Alertă ({number})",
+    "here": "aici",
+    "Required": "Necesar",
+    "webhook": "Webhook",
+    "Post URL": "Postează URL",
+    "Content Type": "Tipul Conținutului",
+    "webhookFormDataDesc": "{multipart} este bun pentru PHP. JSON-ul va fi analizat cu {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "Antete adiționale",
+    "Webhook URL": "URL-ul Webhook-ului",
+    "Application Token": "Token-ul Aplicației",
+    "Server URL": "URL-ul Server-ului",
+    "Priority": "Prioritate",
+    "emojiCheatSheet": "Emoji-uri: {0}",
+    "Read more": "Vezi Mai Mult",
+    "appriseInstalled": "Apprise instalat.",
+    "appriseNotInstalled": "Apprise Neinstalat. {0}",
+    "Method": "Metodă",
+    "Body": "Corp",
+    "Headers": "Antete",
+    "PushUrl": "Împinge URL",
+    "BodyInvalidFormat": "Formatul corpului de request nu este valid: ",
+    "Monitor History": "Istoricul Monitorului",
+    "PasswordsDoNotMatch": "Parolele nu sunt la fel.",
+    "One record": "O înregistrare",
+    "Current User": "Utilizatorul Curent",
+    "topic": "Subiect",
+    "topicExplanation": "Subiectul MQTT către monitor",
+    "successMessage": "Mesaj de Succes",
+    "successMessageExplanation": "Mesajul MQTT care va fi considerat un succes",
+    "Done": "Terminat",
+    "Info": "Informații",
+    "Security": "Securitate",
+    "Shrink Database": "Miceste Baza de Date",
+    "Default": "Implicit",
+    "HTTP Options": "Opțiuni HTTP",
+    "Title": "Titlu",
+    "Content": "Conținut",
+    "Style": "Stil",
+    "info": "informații",
+    "warning": "avertizare",
+    "danger": "pericol",
+    "error": "eroare",
+    "critical": "critic",
+    "dark": "întunecat",
+    "Post": "Postează",
+    "Last Updated": "Actualizat",
+    "Unpin": "Desprinde",
+    "Switch to Light Theme": "Schimbă la Tema Luminoasă",
+    "Show Tags": "Arată Etichetele",
+    "Hide Tags": "Ascunde Etichetele",
+    "Description": "Descriere",
+    "No monitors available.": "Niciun monitor disponibil.",
+    "Discard": "Elimină",
+    "Cancel": "Anulează",
+    "Powered by": "Cu ajutorul",
+    "Customize": "Personalizează",
+    "Custom Footer": "Subsol Personalizat",
+    "Custom CSS": "CSS Personalizat",
+    "deleteStatusPageMsg": "Ești sigur că vrei să ștergi această pagină de status?",
+    "Proxies": "Proxy-uri",
+    "default": "Implicit",
+    "enabled": "Activat",
+    "setAsDefault": "Setează ca Implicit",
+    "deleteProxyMsg": "Ești sigur că vrei să ștergi acest proxy pentru toate monitoarele?",
+    "Certificate Chain": "Lanț-ul Certificatului",
+    "Valid": "Valid",
+    "Invalid": "Invalid",
+    "User": "Utilizator",
+    "Installed": "Instalat",
+    "Running": "Operează",
+    "Not running": "Nu operează",
+    "Remove Token": "Elimină token-ul",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Add New Status Page": "Adaugă o Pagină de Status Nouă",
+    "Slug": "Slug",
+    "startOrEndWithOnly": "Începe sau termină doar cu {0}",
+    "No consecutive dashes": "Fără cratime consecutive",
+    "Next": "Înainte",
+    "No Proxy": "Niciun Proxy",
+    "Authentication": "Autentificate",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Pagină de Status Nouă",
+    "Page Not Found": "Pagină Negăsită",
+    "Backup": "Backup",
+    "About": "Despre",
+    "wayToGetCloudflaredURL": "(Cloudflared a fost descărcat de la {0})",
+    "cloudflareWebsite": "Website-ul Cloudflare",
+    "Message:": "Mesaj:",
+    "HTTP Headers": "Antete HTTP",
+    "Trust Proxy": "Ai încredere în Proxy",
+    "Other Software": "Alt Software",
+    "For example: nginx, Apache and Traefik.": "De exemplu: nginx, Apache și Traefik.",
+    "Please read": "Te rog citește",
+    "Subject:": "Subiect:",
+    "Valid To:": "Valid Pâna la:",
+    "Days Remaining:": "Zile rămase:",
+    "Issuer:": "Emitent:",
+    "Fingerprint:": "Amprentă:",
+    "No status pages": "Nicio pagină de status",
+    "Domain Name Expiry Notification": "Notificare cu Privire la Expirarea Numelui de Domeniu",
+    "Proxy": "Proxy",
+    "Date Created": "Data Creării",
+    "Footer Text": "Text-ul pentru subsol",
+    "Show Powered By": "Arată ”Cu ajutorul”",
+    "Reverse Proxy": "Proxy invers",
+    "Domain Names": "Nume de domeniu",
+    "signedInDisp": "Autentificat ca {0}",
+    "signedInDispDisabled": "Autentificare Dezactivată.",
+    "RadiusSecret": "Secret Radius",
+    "RadiusSecretDescription": "Secret împărtășit cu client-ul și server-ul",
+    "RadiusCalledStationId": "ID-ul Stației Contactate",
+    "RadiusCalledStationIdDescription": "Identificatorul serviciului apelat",
+    "RadiusCallingStationId": "ID-ul Stației Contactante",
+    "RadiusCallingStationIdDescription": "Identificatorul dispozitivului contactant",
+    "API Username": "Nume de utilizator al API-ului",
+    "API Key": "Cheie API",
+    "Also check beta release": "Verifică și actualizările beta",
+    "Using a Reverse Proxy?": "Folosești un Proxy Invers?",
+    "Check how to config it for WebSocket": "Află cum să îl configurezi pentru WebSocket",
+    "Steam Game Server": "Server de Joc Steam",
+    "Most likely causes:": "Cea mai probabilă cauză:",
+    "There might be a typing error in the address.": "Ar putea exista o eroare de scriere în adresă.",
+    "What you can try:": "Ce poți încerca:",
+    "Retype the address.": "Rescrie adresa.",
+    "Go back to the previous page.": "Mergi la pagina precedentă.",
+    "Coming Soon": "În curând.",
+    "Connection String": "Connection String",
+    "Query": "Query",
+    "settingsCertificateExpiry": "Expirarea certificatului TLS",
+    "Setup Docker Host": "Configurează Docker Host",
+    "Connection Type": "Tipul Conexiunii",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Ești sigur că vrei să ștergi acest docker host pentru toate montoarele?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Container Docker",
+    "Container Name / ID": "Numele Container-ului / ID",
+    "Docker Host": "Docker Host",
+    "Domain": "Domeniu",
+    "Workstation": "Stație de lucru",
+    "Packet Size": "Mărime Pachet",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Token Robot",
+    "wayToGetTelegramToken": "Poți obține un token de la {0}.",
+    "Chat ID": "ID-ul Chat-ului",
+    "YOUR BOT TOKEN HERE": "TOKEN-UL TĂU DE ROBOT",
+    "chatIDNotFound": "ID-ul Chat-ului nu a fost găsit; te rog întâi trimite un mesaj către robot",
+    "disableCloudflaredNoAuthMsg": "Ești în modul fără autentificare, nu ai nevoie de o parola.",
+    "wayToGetLineNotifyToken": "Poți obține un token de acces de la {0}",
+    "Examples": "Exemple",
+    "Home Assistant URL": "URL-ul de la Home Assistant",
+    "Long-Lived Access Token": "Token de acces cu durata de viață mare",
+    "default: notify all devices": "implicit: notifică toate dispozitivele",
+    "Automations can optionally be triggered in Home Assistant:": "Automatizările pot fi declanșate opțional în Home Assistant:",
+    "Trigger type:": "Tipul Declanșatorului:",
+    "Event type:": "Tipul Evenimentului:",
+    "Event data:": "Datele Evenimentului:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Apoi alege o acțiune, de exemplu, schimbă un LED RGB în roșu.",
+    "Frontend Version": "Versiunea Frontend-ului",
+    "Frontend Version do not match backend version!": "Versiunea Frontend-ului nu este aceeași cu cea a backend-ului!",
+    "backupRecommend": "Te rog fă o copie a directorului (./data/) în loc.",
+    "Optional": "Opțional",
+    "squadcast": "Squadcast",
+    "or": "sau",
+    "recurringInterval": "Interval",
+    "Recurring": "Recurentă",
+    "strategyManual": "Activ/Inactiv Manual",
+    "warningTimezone": "Folosește fusul orar al server-ului",
+    "weekdayShortMon": "Luni",
+    "weekdayShortTue": "Marți",
+    "weekdayShortWed": "Miercuri",
+    "weekdayShortThu": "Joi",
+    "weekdayShortFri": "Vineri",
+    "weekdayShortSat": "Sâmbătă",
+    "weekdayShortSun": "Duminică",
+    "dayOfWeek": "Ziua săptămânii",
+    "dayOfMonth": "Ziua lunii",
+    "lastDay": "Ultima zi",
+    "lastDay1": "Ultima zi a Lunii",
+    "lastDay2": "Penultima zi a Lunii",
+    "lastDay3": "Antepenultima zi a Lunii",
+    "No Maintenance": "Fără mentenanță",
+    "pauseMaintenanceMsg": "Ești sigur că vrei sa pui pe pauză?",
+    "maintenanceStatus-under-maintenance": "În mentenanță",
+    "maintenanceStatus-inactive": "Inactiv",
+    "maintenanceStatus-scheduled": "Planificat",
+    "maintenanceStatus-ended": "Terminat",
+    "maintenanceStatus-unknown": "Necunoscut",
+    "Server Timezone": "Fusul Orar al Server-ului",
+    "statusPageMaintenanceEndDate": "Sfârșit",
+    "IconUrl": "URL-ul pictogramei",
+    "Enable DNS Cache": "Activează DNS Cache",
+    "Enable": "Activează",
+    "Disable": "Dezactivează",
+    "Effective Date Range": "Interval în care se aplică",
+    "Schedule Maintenance": "Planifică Mentenanță",
+    "Date and Time": "Dată și Oră",
+    "DateTime Range": "Interval DatăOră",
+    "loadingError": "Nu se pot obține datele, te rog încearcă mai târziu.",
+    "plugin": "Plugin | Plugin-uri",
+    "install": "Instalează",
+    "installing": "Instalare",
+    "uninstall": "Dezinstalează",
+    "confirmUninstallPlugin": "Ești sigur că vrei să dezinstalezi acest plugin?",
+    "smtp": "Email (SMTP)",
+    "secureOptionNone": "Niciunul / STARTTLS (25, 587)",
+    "secureOptionTLS": "TLS (456)",
+    "From Email": "De la Email",
+    "emailCustomSubject": "Subiect Personalizat",
+    "To Email": "La Email",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "URL-ul Webhook-ului Discord",
+    "Bot Display Name": "Numele Robotului",
+    "Prefix Custom Message": "Prefix Personalizat",
+    "Hello @everyone is...": "Salut {'@'}everyone sunt…",
+    "wayToGetTeamsURL": "Poți învăța cum să creezi un URL webhook {0}.",
+    "wayToGetZohoCliqURL": "Poți învăța cum să creezi un URL webhook {0}.",
+    "needSignalAPI": "Trebuie să ai un client signal cu API-ul REST.",
+    "Number": "Număr",
+    "Recipients": "Destinatari",
+    "Access Token": "Token de acces",
+    "Channel access token": "Token de acces al canalului",
+    "Line Developers Console": "Consola Dezvoltatorilor Line",
+    "lineDevConsoleTo": "Consola Dezvoltatorilor Line - {0}",
+    "Basic Settings": "Setări de Bază",
+    "User ID": "ID-ul Utilizatorului",
+    "Messaging API": "API-ul pentru Mesagerie",
+    "Icon URL": "URL-ul Pictogramei",
+    "dataRetentionTimeError": "Perioada de renenție trebuie să fie 0 sau mai mare",
+    "infiniteRetention": "Setează la „0” pentru retenție pe perioadă nedeterminată.",
+    "confirmDeleteTagMsg": "Ești sigur că vrei să ștergi această etichetă? Monitoarele asociate cu această etichetă nu vor fi șterse.",
+    "enableGRPCTls": "Permite trimiterea cererilor gRPC cu conexiune TLS",
+    "grpcMethodDescription": "Numele metodei este convert to cammelCase format cum ar fi sayHello, check, etc.",
+    "deleteMonitorMsg": "Ești sigur că vrei să ștergi acest monitor?",
+    "deleteMaintenanceMsg": "Ești sigur că vrei să ștergi această mentenanță?",
+    "dnsPortDescription": "Port-ul server-ului DNS. Este implicit 53. Poți schimba acest port oricând.",
+    "resolverserverDescription": "Cloudflare este server-ul implicit. Poți schimba asta oricând.",
+    "rrtypeDescription": "Selectează tipul RR pe care vrei să îl monitorizezi",
+    "pauseMonitorMsg": "Ești sigur că vrei să pui pe pauză?",
+    "clearEventsMsg": "Ești sigur că vrei să ștergi toate evenimentele asociate cu acest monitor?",
+    "clearHeartbeatsMsg": "Ești sigur că vrei să ștergi toate heartbeat-urile asociate cu acest monitor?",
+    "confirmClearStatisticsMsg": "Ești sigur că vrei să ștergi TOATE statisticile?",
+    "confirmImportMsg": "Ești sigur că vrei să importezi backup-ul? Te rog verifică dacă ai selectat varianta corectă de importare.",
+    "twoFAVerifyLabel": "Te rog introdu token-ul pentru a verifica Autentificarea în Doi Pași:",
+    "tokenValidSettingsMsg": "Token-ul este valid! Acum poți salva setările legate de Autentificarea în Doi Pași.",
+    "confirmEnableTwoFAMsg": "Ești sigur că vrei să activezi Autentificarea în Doi Pași?",
+    "recurringIntervalMessage": "Rulează o dată pe zi | Rulează o dată la {0} zile",
+    "affectedMonitorsDescription": "Selectează monitoarele afectate de această mentenanță",
+    "atLeastOneMonitor": "Selectează cel puțin un monitor afectat",
+    "passwordNotMatchMsg": "Parolele nu se potrivesc.",
+    "notificationDescription": "Notificările trebuie atribuite unui monitor pentru a funcționa.",
+    "backupDescription": "Acum poți face backup la toate monitoarele și notificările într-un fișier JSON.",
+    "backupDescription2": "Notă: istoricul și datele evenimentelor nu sunt incluse.",
+    "endpoint": "Punct final",
+    "octopushAPIKey": "„Cheia API” din credențialele HTTP API în panoul de control",
+    "octopushLogin": "„Logare” din credențialele HTTP API în panoul de control",
+    "promosmsLogin": "Numele de Login API",
+    "promosmsPassword": "Parola API",
+    "pushoversounds pushover": "Pushover (implicit)",
+    "pushoversounds bike": "Bicicletă",
+    "pushoversounds bugle": "Goarnă",
+    "pushoversounds cashregister": "Casă de marcat",
+    "pushoversounds classical": "Clasic",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Cădere",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Sosire",
+    "pushoversounds intermission": "Pauză",
+    "pushoversounds magic": "Magie",
+    "pushoversounds mechanical": "Mecanic",
+    "pushoversounds tugboat": "Remorcher",
+    "pushoversounds alien": "Alarmă Extraterestră (lung)",
+    "pushoversounds climb": "Urcare (lung)",
+    "pushoversounds echo": "Ecou Pushover (lung)",
+    "pushoversounds updown": "Sus Jos (lung)",
+    "pushoversounds vibrate": "Doar Vibrații",
+    "pushoversounds none": "Niciunul (silențios)",
+    "pushyAPIKey": "Cheie API secretă",
+    "pushyToken": "Token dispozitiv",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.Chat",
+    "pushover": "Pushover",
+    "pushy": "Pushy",
+    "PushByTechulus": "Pushy by Techulus",
+    "octopush": "Octopush",
+    "promosms": "PromoSMS",
+    "lunasea": "LunaSea",
+    "apprise": "Apprise (Suportă 50+ Servicii de Notificare)",
+    "GoogleChat": "Google Chat (Doar Google Workspace)",
+    "pushbullet": "Pushbullet",
+    "Kook": "Kook",
+    "Guild ID": "ID-ul Breslei (Guild-ului)",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Cheie Utilizator",
+    "Device": "Dispozitiv",
+    "Message Title": "Titlu Mesaj",
+    "Notification Sound": "Sunet Notificare",
+    "More info on:": "Mai multe informații la: {0}",
+    "pushoverDesc2": "Dacă vrei să trimiți notificări la dispozitive diferite, completează câmpul „Dispozitiv”",
+    "Settings": "Setări",
+    "New Update": "Update Nou",
+    "Language": "Limbă",
+    "Game": "Joc",
+    "Primary Base URL": "URL-ul de Bază",
+    "List": "Listă",
+    "Add": "Adaugă",
+    "Add New Monitor": "Adaugă Monitor Nou",
+    "Pending": "În așteptare",
+    "Unknown": "Necunoscut",
+    "Specific Monitor Type": "Monitor de Tip Specific",
+    "pauseDashboardHome": "Pauză",
+    "Current": "Curent",
+    "-hour": "-oră",
+    "Response": "Răspuns",
+    "Heartbeat Interval": "Interval Heartbeat",
+    "Resend Notification if Down X times consequently": "Retrimite Notificarea dacă se Întâmpină Eroarea de X ori consecutiv",
+    "retriesDescription": "Numărul Maxim de Reîncercări înainte ca serviciul să fie marcat offline și să se trimită o notificare",
+    "maxRedirectDescription": "Numărul maxim de redirecționări permise. Setează la „0” pentru a dezactiva redirecționările.",
+    "Theme - Heartbeat Bar": "Temă - Bara de Heartbeat",
+    "Discourage search engines from indexing site": "Descurajează Motoarele de Căutare din a Indexa Acest Site",
+    "disableauth.message2": "Este proiectat pentru scenarii <strong>în care intenționezi să implementezi soluții terțe de autentificare</strong> în fața Uptime Kuma, cum ar fi Cloudflare Access, Authelia, sau alt mecanism de autentificare.",
+    "Login": "Logare",
+    "Notification Type": "Tipul Notificării",
+    "Email": "Email",
+    "Test": "Test",
+    "Certificate Info": "Informațiile Certificatului",
+    "Resolver Server": "Server-ul de Rezolvare",
+    "Last Result": "Ultimul Rezultat",
+    "notAvailableShort": "N/A",
+    "Default enabled": "Implicit activat",
+    "Create": "Creează",
+    "Schedule maintenance": "Programează Mentenanță",
+    "Select status pages...": "Selectează pagina de status…",
+    "alertNoFile": "Te rog selectează un fișier de importat.",
+    "alertWrongFileType": "Te rog selectează un fișier de tip JSON.",
+    "Clear all statistics": "Șterge toate Statisticile",
+    "Setup 2FA": "Configurează Autentificarea în Doi Pași",
+    "Two Factor Authentication": "Autentificare în Doi Pași",
+    "Inactive": "Inactiv",
+    "Add New below or Select...": "Adaugă Nou Mai Jos sau Selectează…",
+    "Pink": "Roz",
+    "Search...": "Caută…",
+    "Avg. Ping": "Ping Mediu",
+    "Avg. Response": "Timp de Răspuns Mediu",
+    "statusPageNothing": "Nimic aici, te rog adaugă un grup sau un monitor.",
+    "Go to Dashboard": "Mergi la Panoul de Control",
+    "webhookJsonDesc": "{0} este bun pentru orice server HTTP modern cum ar fi Express.js",
+    "webhookAdditionalHeadersDesc": "Setează antete adiționale trimise împreună cu webhook-ul.",
+    "HeadersInvalidFormat": "Formatul header-urilor de request nu este valid: ",
+    "clearDataOlderThan": "Păstrează istoricul monitorului pentru {0} zile.",
+    "records": "înregistrări",
+    "steamApiKeyDescription": "Pentru a monitoriza un server de joc Steam, ai nevoie de un o cheie pentru „Web-API„-ul Steam. Poți înregistra o astfel de cheie aici: ",
+    "recent": "Recent",
+    "Steam API Key": "Cheia API Steam",
+    "Pick a RR-Type...": "Alege un Tip-RR…",
+    "Pick Accepted Status Codes...": "Alege Codurile de Status Acceptate…",
+    "Create Incident": "Creează un Incident",
+    "primary": "implicit",
+    "light": "luminos",
+    "Please input title and content": "Te rog adaugă un titlu și conținut",
+    "Created": "Creat",
+    "Switch to Dark Theme": "Schimbă la Tema Întunecată",
+    "Add one": "Adaugă unul",
+    "No Monitors": "Niciun monitor",
+    "Untitled Group": "Grup fără nume",
+    "Services": "Servicii",
+    "shrinkDatabaseDescription": "Declanșează database VACUUM pentru SQLite. Dacă baza ta de date a fost creată după 1.10.0, AUTO_VACUUM este deja activat și această acțiune nu este necesară.",
+    "proxyDescription": "Proxy-urile trebuie să fie atribuite unui monitor pentru a funcționa.",
+    "enableProxyDescription": "Acest proxy nu va afecta cererile monitoarelor până este activat. Poți dezactiva temporar proxy-ul pentru toate monitoarele.",
+    "setAsDefaultProxyDescription": "Acest proxy va fi activat implicit pentru toate monitoarele noi. Poți totuși să îl dezactivezi separat pentru fiecare monitor.",
+    "Not installed": "Neinstalat",
+    "Accept characters:": "Acceptă caractere:",
+    "The slug is already taken. Please choose another slug.": "Acest slug este deja luat. Te rog alege alt slug.",
+    "Don't know how to get the token? Please read the guide:": "Nu știi cum să obții token-ul? Te rog citește acest ghid:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Conexiunea curentă s-ar putea pierde dacă ești în proces de conectare printr-un tunel Cloudflare. Ești sigur că vrei să îl oprești? Tastează-ți parola curentă pentru a confirma.",
+    "Certificate Expiry Notification": "Notificare cu privire la expirarea certificatului",
+    "Show update if available": "Arată actualizarea dacă e disponibilă",
+    "The resource is no longer available.": "Această resursă nu mai este disponibilă.",
+    "certificationExpiryDescription": "Monitoarele HTTPS declanșează notificarea când certificatul TLS expiră în:",
+    "Docker Hosts": "Docker Hosts",
+    "supportTelegramChatID": "Suport Mesaje Directe / Grup / ID-ul Canalului de Text",
+    "wayToGetTelegramChatID": "Poți obține ID-ul chat-ului prin trimiterea unui mesaj către robot și mergând la acest URL pentru a vedea chat_id:",
+    "trustProxyDescription": "Ai incredere in antetele 'X-Forwarded-*'. Dacă vrei să obții IP-ul corect al client-ului și Uptime Kuma este în spatele unui proxy, cum ar fi Nginx sau Apache, trebuie să activezi asta.",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Token-ul de acces cu durată de viață mare poate fi creat dacă dai click pe numele tău de profil (stânga jos) și prin derularea până la capătul paginii și click pe „Creează Token”. ",
+    "Notification Service": "Serviciu de Notificări",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "O listă cu serviciile de notificare poate fi găsită în Home Assistant sub „Opțiuni Dezvoltator > Servicii” caută „notificare” pentru a găsi numele dispozitivului/telefonului.",
+    "backupOutdatedWarning": "Depășit: Pentru că au fost adăugate multe funcționalități, iar această funcție de backup este neîntreținută, nu poate genera sau restaura un backup complet.",
+    "lastDay4": "Răsantepenultima zi a Lunii",
+    "Display Timezone": "Afișează Fusul Orar",
+    "dnsCacheDescription": "Nu funcționează in anumite medii IPv6, dezactivează dacă întâmpini probleme.",
+    "Single Maintenance Window": "Fereastră unică de timp pentru mentennanță",
+    "Maintenance Time Window of a Day": "Fereastra de timp alocată pentru mentenanță dintr-o zi",
+    "uninstalling": "Dezinstalare",
+    "Ignore TLS Error": "Ignoră erorile TLS",
+    "wayToGetDiscordURL": "Poți obține asta mergând în Setări Server -> Integrări -> Vezi Webhook-urile -> Webhook nou",
+    "wayToCheckSignalURL": "Poți verifica acest URL pentru a vizualiza cum să configurezi unul:",
+    "wayToGetLineChannelToken": "Pentru început, accesează {0}, creează un furnizor și canal (API-ul Mesageriei), apoi poți obține token-ul de acces al canalului si ID-ul utilizatorului din itemii de meniu mentionati mai sus.",
+    "aboutIconURL": "Poți furniza un link către o pictogramă la secțiunea „URL-ul Pictogramei” pentru a suprascrie imaginea de profil implicită. Nu va fi folosită dacă există un emoticon configurat deja.",
+    "Channel Name": "Nume Canal",
+    "aboutMattermostChannelName": "Poți suprascrie canalul implicit pe care Webhook-ul îl folosește prin introducerea numelui canalului în câmpul „Nume Canal”. Acesta trebuie să fie activat în setările Webhook-ului Mattermost. Ex: #alt-canal",
+    "acceptedStatusCodesDescription": "Selectează codurile de status care sunt considerate un răspuns de succes.",
+    "deleteNotificationMsg": "Ești sigur că vrei să ștergi această notificare pentru toate monitoarele?",
+    "enableDefaultNotificationDescription": "Această notificare va fi activată implicit pentru toate monitoarele noi. Poți totuși să o dezactivezi individual pentru fiecare monitor.",
+    "importHandleDescription": "Alege „Sari Existente” dacă vrei să sari peste fiecare monitor sau notificare cu același nume. „Suprascrie” va șterge toate monitoarele și notificările existente.",
+    "confirmDisableTwoFAMsg": "Ești sigur că vrei să dezactivezi Autentificarea în Doi Pași?",
+    "affectedStatusPages": "Afișează acest mesaj de mentenanță pe paginile de status selectate",
+    "keywordDescription": "Caută cuvântul cheie în HTML simplu sau JSON. Această căutare ține cont de majuscule.",
+    "backupDescription3": "Datele importante, cum ar fi token-urile notificărilor sunt incluse în fișierul exportat; te rog stochează-l în siguranță.",
+    "pushoversounds pianobar": "Pian",
+    "pushoversounds siren": "Sirenă",
+    "pushoversounds spacealarm": "Alarmă Spațială",
+    "pushoversounds persistent": "Persistent (lung)",
+    "gotify": "Gotify",
+    "clicksendsms": "ClickSend SMS",
+    "wayToGetKookBotToken": "Creează o aplicație și obține token-ul robot la {0}",
+    "wayToGetKookGuildID": "Activează „Modul Dezvoltator” în setările Kook și dă click pe breaslă (guild) pentru a-i obține ID-ul",
+    "pushoverDesc1": "Prioritate de urgență (2) are o pauză implicită de 30 de secunde între reîncercări și expiră după o oră."
 }

From db918be12605d0ff95fdd3b0428249c8bcd51a0a Mon Sep 17 00:00:00 2001
From: Alex Javadi <dev@aljm.org>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 602/803] Translated using Weblate (Persian)

Currently translated at 28.1% (196 of 697 strings)

Co-authored-by: Alex Javadi <dev@aljm.org>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fa/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fa.json | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/lang/fa.json b/src/lang/fa.json
index 16effc34..b05d99e7 100644
--- a/src/lang/fa.json
+++ b/src/lang/fa.json
@@ -154,7 +154,7 @@
     "Token": "توکن",
     "Show URI": "نمایش آدرس (URI) ",
     "Tags": "برچسب‌ها",
-    "Add New below or Select...": "یک مورد جدید اضافه کنید و یا از لیست انتخاب کنید...",
+    "Add New below or Select...": "یک مورد جدید اضافه کنید و یا از لیست انتخاب کنید…",
     "Tag with this name already exist.": "یک برچسب با این «نام» از قبل وجود دارد",
     "Tag with this value already exist.": "یک برچسب با این «مقدار» از قبل وجود دارد.",
     "color": "رنگ",
@@ -187,5 +187,15 @@
     "One record": "یک مورد",
     "Info": "اطلاعات",
     "Powered by": "نیرو گرفته از",
-    "apprise": "Apprise (Support 50+ Notification services)"
+    "apprise": "Apprise (Support 50+ Notification services)",
+    "Monitor": "مانیتور | مانتیور ها",
+    "Help": "کمک",
+    "Game": "بازی",
+    "Primary Base URL": "آدرس URL اصلی",
+    "Passive Monitor Type": "حالت مانیتور غیرفعال",
+    "Specific Monitor Type": "حالت مانیتور شخصی",
+    "statusMaintenance": "در دست تعمیر",
+    "Maintenance": "در حال تعمیر",
+    "General Monitor Type": "حالت مانیتور عمومی",
+    "markdownSupported": "شیوه نگارشی Markdown پشتیبانی می شود"
 }

From 90d6fbd20b3bef72bd92df42758cbc22a63433e0 Mon Sep 17 00:00:00 2001
From: Tomasz Ad <djtms84@gmail.com>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 603/803] Translated using Weblate (Polish)

Currently translated at 99.8% (696 of 697 strings)

Co-authored-by: Tomasz Ad <djtms84@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pl/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/pl.json | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/lang/pl.json b/src/lang/pl.json
index 6d802185..de0acca2 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -508,7 +508,7 @@
     "Bark Sound": "Dźwięk Bark",
     "HTTP Headers": "Nagłówki HTTP",
     "Trust Proxy": "Ufaj proxy",
-    "HomeAssistant": "Home Assistant",
+    "HomeAssistant": "Asystent domowy",
     "RadiusSecret": "Sekretny klucz Radius",
     "RadiusSecretDescription": "Współdzielony sekretny klucz pomiędzy klientem a serwerem",
     "RadiusCalledStationId": "Id stacji wywoływanej",
@@ -692,5 +692,9 @@
     "uninstall": "Odinstaluj",
     "confirmUninstallPlugin": "Czy na pewno chcesz odinstalować tę wtyczkę?",
     "Custom Monitor Type": "Własny typ monitora",
-    "markdownSupported": "Obsługiwana składnia Markdown"
+    "markdownSupported": "Obsługiwana składnia Markdown",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Edytuj Tag",
+    "Server Address": "Adres Serwera",
+    "Learn More": "Dowiedz się więcej"
 }

From 49396e2ccc392c83ca246d2461f94473e690e758 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=96mer=20Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Mon, 13 Feb 2023 08:59:26 +0000
Subject: [PATCH 604/803] Translated using Weblate (Turkish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Ömer Faruk Genç <omer@farukgenc.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index e7927e4b..7091de1a 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -217,7 +217,7 @@
     "smtpBCC": "BCC",
     "discord": "Discord",
     "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhook Oluştur'a giderek alabilirsiniz.",
+    "wayToGetDiscordURL": "Bunu Sunucu Ayarları -> Entegrasyonlar -> Webhookları Görüntüle -> Yeni Webhook Oluştur adımını izleyerek alabilirsiniz.",
     "Bot Display Name": "Botun Görünecek Adı",
     "Prefix Custom Message": "Önek Özel Mesaj",
     "Hello @everyone is...": "Merhaba {'@'}everyone…",
@@ -692,5 +692,9 @@
     "lunasea": "LunaSea",
     "line": "Line Messenger",
     "mattermost": "Mattermost",
-    "markdownSupported": "Markdown yazım formatı desteklenir"
+    "markdownSupported": "Markdown yazım formatı desteklenir",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Etiketi Düzenle",
+    "Learn More": "Daha fazla bilgi edin",
+    "Server Address": "Sunucu Adresi"
 }

From 36c32c36363f300edcccdea3398d970ba6cff3e9 Mon Sep 17 00:00:00 2001
From: AnnAngela <naganjue@vip.qq.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 605/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: AnnAngela <naganjue@vip.qq.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index 043a2523..ed962ca1 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -681,7 +681,7 @@
     "Passive Monitor Type": "被动监控类型",
     "Specific Monitor Type": "特殊监控类型",
     "dataRetentionTimeError": "保留期必须为0或更大",
-    "Monitor": "监控项 | 监控项",
+    "Monitor": "监控项",
     "Custom": "自定义",
     "promosmsAllowLongSMS": "允许长的短信",
     "confirmDeleteTagMsg": "你确定你要删除这个标签?与此标签关联的监视器不会被删除。",

From 971977b29546edd925ad00d939135d291101c8bb Mon Sep 17 00:00:00 2001
From: Marcos <djoser.horus@gmail.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 606/803] Translated using Weblate (Spanish)

Currently translated at 96.4% (672 of 697 strings)

Co-authored-by: Marcos <djoser.horus@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/es/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/es-ES.json | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index 44f28869..36502911 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -678,5 +678,8 @@
     "alertaRecoverState": "Estado de Recuperación",
     "serwersms": "SerwerSMS.pl",
     "serwersmsAPIUser": "Nombre de usuario de API (inc. webapi_ prefix)",
-    "smseagleGroup": "Nombre(s) de grupo de Guía Telefónica"
+    "smseagleGroup": "Nombre(s) de grupo de Guía Telefónica",
+    "Unpin": "Quitar de destacados",
+    "Prefix Custom Message": "Prefijo personalizado",
+    "markdownSupported": "Soporta sintaxis Markdown"
 }

From d8a517e84390e4f1298a002ba18570462f0bfc46 Mon Sep 17 00:00:00 2001
From: Julien Millau <mxjulien@gmail.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 607/803] Translated using Weblate (French)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Julien Millau <mxjulien@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 4ab908b3..27ebddb6 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -75,9 +75,9 @@
     "Uptime": "Disponibilité",
     "Cert Exp.": "Expiration SSL.",
     "day": "jour | jours",
-    "-day": " jours",
+    "-day": "-jour",
     "hour": "heure",
-    "-hour": " heure",
+    "-hour": "-heure",
     "Response": "Temps de réponse",
     "Ping": "Ping",
     "Monitor Type": "Type de sonde",

From 51860261e98b3b6d9574b19376996e0f865a5b35 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ren=C3=A9=20Dyhr?= <bazzo39@gmail.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 608/803] Translated using Weblate (Danish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 50.6% (353 of 697 strings)

Co-authored-by: René Dyhr <bazzo39@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/da/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/da-DK.json | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
index 679431c3..9d6f0574 100644
--- a/src/lang/da-DK.json
+++ b/src/lang/da-DK.json
@@ -350,5 +350,13 @@
     "serwersmsAPIUser": "API Brugernavn (inkl. webapi_ prefix)",
     "serwersmsAPIPassword": "API Adgangskode",
     "serwersmsPhoneNumber": "Telefonnummer",
-    "serwersmsSenderName": "SMS Afsender Navn (registreret via kundeportal)"
+    "serwersmsSenderName": "SMS Afsender Navn (registreret via kundeportal)",
+    "statusMaintenance": "Vedligeholdelse",
+    "Maintenance": "Vedligeholdelse",
+    "No Maintenance": "Ingen vedligeholdelse",
+    "Examples": "Eksempler",
+    "High": "Høj",
+    "Recipient Number": "Modtager Nummer",
+    "From Name/Number": "Fra Navn/Nummer",
+    "Help": "Hjælp"
 }

From 3816c696cd646e76ee3a97c62b3235426778f3aa Mon Sep 17 00:00:00 2001
From: Ferenc <ferenc.y@tutanota.de>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 609/803] Translated using Weblate (German)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Ferenc <ferenc.y@tutanota.de>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/de-DE.json | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index f1ffd8fd..2d4c0e30 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -231,7 +231,7 @@
     "smtpCC": "CC",
     "smtpBCC": "BCC",
     "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
+    "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> WebHooks anzeigen -> Neuer WebHook",
     "Bot Display Name": "Bot-Anzeigename",
     "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
     "Hello @everyone is...": "Hallo {'@'}everyone ist…",
@@ -277,9 +277,9 @@
     "appriseNotInstalled": "Apprise ist nicht installiert. {0}",
     "Access Token": "Access Token",
     "Channel access token": "Channel access token",
-    "Line Developers Console": "Line Developers Console",
+    "Line Developers Console": "Zeile Entwickler Konsole",
     "lineDevConsoleTo": "Line Developers Console - {0}",
-    "Basic Settings": "Basic Settings",
+    "Basic Settings": "Grundeinstellungen",
     "User ID": "User ID",
     "Messaging API": "Messaging API",
     "wayToGetLineChannelToken": "Rufe zuerst {0} auf, erstelle dann einen Provider und Channel (Messaging API). Als nächstes kannst du den Channel access token und die User ID aus den oben genannten Menüpunkten abrufen.",
@@ -560,7 +560,7 @@
     "Domain": "Domain",
     "Workstation": "Workstation",
     "disableCloudflaredNoAuthMsg": "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
-    "trustProxyDescription": "Vertraue 'X-Forwarded-*' Headern. Wenn man die richtige Client-IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx oder Apache läuft, sollte dies aktiviert werden.",
+    "trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige Client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx oder Apache läuft, sollte dies aktiviert werden.",
     "wayToGetLineNotifyToken": "Du kannst hier ein Token erhalten: {0}",
     "Examples": "Beispiele",
     "Home Assistant URL": "Home Assistant URL",
@@ -646,7 +646,7 @@
     "Disable": "Deaktivieren",
     "Custom Monitor Type": "Benutzerdefinierter Monitortyp",
     "webhookAdditionalHeadersDesc": "Legt zusätzliche Header fest, die mit der Webhook gesendet wurden.",
-    "dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert diese Einstellung möglicherweise nicht. Deaktivieren, wenn es Probleme gibt.",
+    "dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert es möglicherweise nicht. Deaktivieren Sie es, wenn Sie auf Probleme stoßen.",
     "loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.",
     "confirmUninstallPlugin": "Möchten Sie dieses Plugin wirklich deinstallieren?",
     "grpcMethodDescription": "Der Name der Methode wird in das \"cammelCase \"-Format konvertiert (z.B. sayHello, check, etc.)",
@@ -654,14 +654,14 @@
     "Specific Monitor Type": "Spezifischer Monitortyp",
     "webhookAdditionalHeadersTitle": "Zusätzliche Header",
     "Packet Size": "Paketgröße",
-    "IconUrl": "Icon-URL",
+    "IconUrl": "Symbol-URL",
     "wayToGetZohoCliqURL": "Erfahren Sie, wie Sie eine Webhook-URL {0} erstellen.",
-    "dataRetentionTimeError": "Die Aufbewahrungsfrist muss 0 oder größer sein",
-    "infiniteRetention": "Für unendliche Speicherung auf 0 setzen.",
-    "confirmDeleteTagMsg": "Sind Sie sicher, dass Sie diesen Tag löschen möchten? Monitore, die mit diesem Tag verknüpft sind, werden nicht gelöscht.",
+    "dataRetentionTimeError": "Aufbewahrungszeit muss 0 oder größer sein",
+    "infiniteRetention": "Für unendliche Aufbewahrung auf 0 setzen.",
+    "confirmDeleteTagMsg": "Möchten Sie dieses Tag wirklich löschen? Mit diesem Tag verknüpfte Monitore werden nicht gelöscht.",
     "enableGRPCTls": "Erlaube das Senden von gRPC-Anfragen mit TLS-Verbindung",
     "ZohoCliq": "ZohoCliq",
-    "Monitor": "Monitor | Monitore",
+    "Monitor": "Überwachung | Monitore",
     "plugin": "Plugin | Plugins",
     "install": "Installieren",
     "installing": "Installiere",
@@ -692,5 +692,9 @@
     "smseagleUrl": "Deine SMSEagle-Geräte-URL",
     "Kook": "Kook",
     "smseagleEncoding": "Als Unicode senden",
-    "smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)"
+    "smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "bearbeite Tag",
+    "Server Address": "Server Adresse",
+    "Learn More": "Erfahre mehr"
 }

From fea33a6475d0fa650be95c88bdcb177ec8882092 Mon Sep 17 00:00:00 2001
From: Leonardo Lope <tutoriaisleo3@gmail.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 610/803] Translated using Weblate (Portuguese (Portugal))

Currently translated at 63.2% (441 of 697 strings)

Co-authored-by: Leonardo Lope <tutoriaisleo3@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pt_PT/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/pt-PT.json | 278 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 268 insertions(+), 10 deletions(-)

diff --git a/src/lang/pt-PT.json b/src/lang/pt-PT.json
index e3ce55e9..3fd370b9 100644
--- a/src/lang/pt-PT.json
+++ b/src/lang/pt-PT.json
@@ -1,7 +1,7 @@
 {
     "languageName": "Português (Portugal)",
-    "checkEverySecond": "Verificar a cada {0} segundos.",
-    "retryCheckEverySecond": "Tentar novamente a cada {0} segundos.",
+    "checkEverySecond": "Verificar a cada {0} segundos",
+    "retryCheckEverySecond": "Tentar novamente a cada {0} segundos",
     "retriesDescription": "Máximo de tentativas antes que o serviço seja marcado como inativo e uma notificação seja enviada",
     "ignoreTLSError": "Ignorar erros TLS/SSL para sites HTTPS",
     "upsideDownModeDescription": "Inverte o status de cabeça para baixo. Se o serviço estiver acessível, ele está OFFLINE.",
@@ -72,7 +72,7 @@
     "Heartbeat Retry Interval": "Intervalo de repetição de Heartbeats",
     "Advanced": "Avançado",
     "Upside Down Mode": "Modo de cabeça para baixo",
-    "Max. Redirects": "Redirecionamento Máx.",
+    "Max. Redirects": "Max. Redirecionamentos",
     "Accepted Status Codes": "Status Code Aceitáveis",
     "Save": "Guardar",
     "Notifications": "Notificações",
@@ -131,7 +131,7 @@
     "Create": "Criar",
     "Clear Data": "Limpar Dados",
     "Events": "Eventos",
-    "Heartbeats": "Heartbeats",
+    "Heartbeats": "Pings",
     "Auto Get": "Obter Automático",
     "backupDescription": "Podes fazer backup de todos os monitores e todas as notificações num arquivo JSON.",
     "backupDescription2": "OBS: Os dados do histórico e do evento não estão incluídos.",
@@ -147,14 +147,14 @@
     "Setup 2FA": "Configurar 2FA",
     "Enable 2FA": "Ativar 2FA",
     "Disable 2FA": "Desativar 2FA",
-    "2FA Settings": "Configurações do 2FA ",
+    "2FA Settings": "Configurações do 2FA",
     "Two Factor Authentication": "Autenticação de Dois Fatores",
     "Active": "Ativo",
     "Inactive": "Inativo",
     "Token": "Token",
     "Show URI": "Mostrar URI",
     "Tags": "Tag",
-    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar ...",
+    "Add New below or Select...": "Adicionar Novo abaixo ou Selecionar…",
     "Tag with this name already exist.": "Já existe uma etiqueta com este nome.",
     "Tag with this value already exist.": "Já existe uma etiqueta com este valor.",
     "color": "cor",
@@ -167,9 +167,9 @@
     "Indigo": "Índigo",
     "Purple": "Roxo",
     "Pink": "Rosa",
-    "Search...": "Pesquisa...",
-    "Avg. Ping": "Ping Médio.",
-    "Avg. Response": "Resposta Média. ",
+    "Search...": "Pesquisa…",
+    "Avg. Ping": "Ping Médio",
+    "Avg. Response": "Resposta Média",
     "Status Page": "Página de Status",
     "Status Pages": "Página de Status",
     "Entry Page": "Página de entrada",
@@ -181,5 +181,263 @@
     "Add Group": "Adicionar Grupo",
     "Add a monitor": "Adicionar um monitor",
     "Edit Status Page": "Editar Página de Status",
-    "Go to Dashboard": "Ir para o dashboard"
+    "Go to Dashboard": "Ir para o dashboard",
+    "backupOutdatedWarning": "Depreciado: Uma vez que muitas funcionalidades foram adicionadas e esta funcionalidade de backup é um pouco desmanchada, não pode gerar ou restaurar um backup completo.",
+    "Schedule maintenance": "Agendar manutenção",
+    "Affected Monitors": "Monitores Afetados",
+    "Pick Affected Monitors...": "Escolher Monitores Afetados…",
+    "All Status Pages": "Todas as Páginas de Status",
+    "Select status pages...": "Selecionar Páginas de Status…",
+    "defaultNotificationName": "Meu alerta de {notification} ({number})",
+    "here": "aqui",
+    "Required": "Obrigatório",
+    "Post URL": "Post URL",
+    "Content Type": "Tipo de Conteúdo",
+    "webhookFormDataDesc": "{multipart} é bom para PHP. O JSON precisará ser analisado com {decodeFunction}",
+    "webhookAdditionalHeadersTitle": "Headers Adicionais",
+    "Webhook URL": "URL do Webhook",
+    "Application Token": "Token do Aplicativo",
+    "Server URL": "URL do Servidor",
+    "Priority": "Prioridade",
+    "emojiCheatSheet": "Folha de dicas de emojis: {0}",
+    "Read more": "Ler Mais",
+    "Method": "Método",
+    "Body": "Body",
+    "Headers": "Headers",
+    "PushUrl": "Enviar URL",
+    "HeadersInvalidFormat": "Os headers da solicitação não são JSON válidos: ",
+    "BodyInvalidFormat": "O body da solicitação não é um JSON válido: ",
+    "Monitor History": "Histórico do Monitor",
+    "clearDataOlderThan": "Mantenha os dados do histórico do monitor por {0} dias.",
+    "PasswordsDoNotMatch": "As passwords não coincidem.",
+    "records": "registros",
+    "One record": "Um registro",
+    "steamApiKeyDescription": "Para monitorar um Steam Game Server, você precisa de uma chave Steam Web-API. Pode registrar a chave da API aqui: ",
+    "Current User": "Usuário Atual",
+    "topicExplanation": "Tópico MQTT para monitorar",
+    "successMessage": "Mensagem de Sucesso",
+    "recent": "Recente",
+    "Done": "Feito",
+    "Info": "Informações",
+    "Security": "Segurança",
+    "Steam API Key": "Steam API Key",
+    "Shrink Database": "Encolher Base de Dados",
+    "Pick a RR-Type...": "Escolha um tipo RR…",
+    "Pick Accepted Status Codes...": "Escolha Códigos de Status Aceitos…",
+    "HTTP Options": "Opções HTTP",
+    "Create Incident": "Criar Incidente",
+    "Content": "Conteúdo",
+    "Style": "Estilo",
+    "info": "informações",
+    "warning": "aviso",
+    "danger": "perigo",
+    "critical": "crítico",
+    "primary": "primário",
+    "light": "luz",
+    "dark": "escuro",
+    "Post": "Post",
+    "Created": "Criado",
+    "Last Updated": "Ultima Atualização",
+    "Unpin": "Desmarcar",
+    "Switch to Light Theme": "Alterar para Tema Claro",
+    "Switch to Dark Theme": "Alterar para Tema Escuro",
+    "Show Tags": "Mostrar Tags",
+    "appriseInstalled": "Apprise está instalado.",
+    "appriseNotInstalled": "Apprise não está instalado. {0}",
+    "No monitors available.": "Nenhum monitor disponível.",
+    "Add one": "Adicione um",
+    "No Monitors": "Sem Monitores",
+    "Untitled Group": "Grupo sem Título",
+    "Services": "Serviços",
+    "Discard": "Descartar",
+    "Cancel": "Cancelar",
+    "Powered by": "Powered by",
+    "Customize": "Customizar",
+    "Custom CSS": "CSS Customizado",
+    "Custom Footer": "Footer Customizado",
+    "deleteStatusPageMsg": "Tem certeza de que deseja excluir esta página de status?",
+    "Proxies": "Proxies",
+    "default": "Padrão",
+    "enabled": "Ativar",
+    "setAsDefault": "Definir como Padrão",
+    "deleteProxyMsg": "Tem a certeza que quer excluir este proxy para todos os monitores?",
+    "setAsDefaultProxyDescription": "Este proxy será ativado por padrão para novos monitores. Você ainda pode desabilitar o proxy separadamente para cada monitor.",
+    "Valid": "Válido",
+    "Invalid": "Inválido",
+    "Remove Token": "Remover Token",
+    "Running": "Em Execução",
+    "Not running": "Não está em execução",
+    "Start": "Iniciar",
+    "Stop": "Parar",
+    "Add New Status Page": "Adicionar Nova Página de Status",
+    "Next": "Próximo",
+    "No consecutive dashes": "Sem traços consecutivos",
+    "Slug": "URL",
+    "Accept characters:": "Caracteres aceites:",
+    "startOrEndWithOnly": "Iniciar ou terminar apenas com {0}",
+    "The slug is already taken. Please choose another slug.": "URL já existe. Por favor escolha outro URL.",
+    "No Proxy": "Sem Proxy",
+    "Authentication": "Autenticação",
+    "HTTP Basic Auth": "Autenticação Básica HTTP",
+    "New Status Page": "Nova Página de Status",
+    "Page Not Found": "Página Não Encontrada",
+    "Reverse Proxy": "Proxy Reverso",
+    "Backup": "Backup",
+    "About": "Sobre",
+    "wayToGetCloudflaredURL": "(Download cloudflared de {0})",
+    "cloudflareWebsite": "Site da Cloudflare",
+    "Message:": "Mensagem:",
+    "HTTP Headers": "Headers HTTP",
+    "Trust Proxy": "Proxy de Confiança",
+    "Other Software": "Outro Software",
+    "For example: nginx, Apache and Traefik.": "Por exemplo: nginx, Apache e Traefik.",
+    "Please read": "Por favor leia",
+    "Subject:": "Assunto:",
+    "Valid To:": "Valido para:",
+    "Days Remaining:": "Dias Restantes:",
+    "Issuer:": "Emissor:",
+    "Fingerprint:": "Impressão Digital:",
+    "No status pages": "Nenhuma página de status",
+    "Domain Name Expiry Notification": "Notificação de Expiração de Nome de Domínio",
+    "Proxy": "Proxy",
+    "Date Created": "Data da Criação",
+    "Footer Text": "Texto do Footer",
+    "Show Powered By": "Mostrar Powered By",
+    "Domain Names": "Nomes de Domínio",
+    "signedInDisp": "Conectado como {0}",
+    "signedInDispDisabled": "Autenticação Desativada.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Secret compartilhado entre cliente e servidor",
+    "RadiusCallingStationIdDescription": "Identificador do dispositivo de chamada",
+    "Certificate Expiry Notification": "Notificação de Expiração do Certificado",
+    "API Username": "Nome de utilizador da API",
+    "API Key": "Chave API",
+    "Using a Reverse Proxy?": "Utilizando um Proxy Reverso?",
+    "Check how to config it for WebSocket": "Verifique como configurá-lo para WebSocket",
+    "Steam Game Server": "Steam Game Server",
+    "Most likely causes:": "Causas mais prováveis:",
+    "The resource is no longer available.": "O recurso já não está disponível.",
+    "There might be a typing error in the address.": "Pode haver um erro de digitação no endereço.",
+    "What you can try:": "O que pode tentar:",
+    "Retype the address.": "Volte a escrever o endereço.",
+    "Go back to the previous page.": "Voltar à página anterior.",
+    "Coming Soon": "Em Breve",
+    "Connection String": "Linha de Conexão",
+    "Query": "Query",
+    "settingsCertificateExpiry": "Validade do Certificado TLS",
+    "certificationExpiryDescription": "Os monitores HTTPS ativam a notificação quando o certificado TLS expira:",
+    "Setup Docker Host": "Configuração do Docker Host",
+    "Connection Type": "Tipo de conexão",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "Tem a certeza de querer apagar este docker host para todos os monitores?",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "Domain": "Domínio",
+    "Workstation": "Estação de trabalho",
+    "Packet Size": "Tamanho do pacote",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Token do Bot",
+    "wayToGetTelegramToken": "Pode obter o token a partir de {0}.",
+    "Chat ID": "ID do Chat",
+    "wayToGetTelegramChatID": "Pode obter o seu ID de chat enviando uma mensagem para o bot e indo a este URL para ver o chat_id:",
+    "YOUR BOT TOKEN HERE": "O TOKEN DO BOT AQUI",
+    "disableCloudflaredNoAuthMsg": "Está no modo Sem Autenticação, não é necessária uma palavra-passe.",
+    "Examples": "Exemplos",
+    "Long-Lived Access Token": "Token de Acesso de Longa Duração",
+    "wayToGetLineNotifyToken": "Pode obter o código de acesso a partir de {0}",
+    "Notification Service": "Serviço de Notificação",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Uma lista de Serviços de Notificação pode ser encontrada em Home Assistant em \"Developer Tools > Services\" pesquisa por \"notificação\" para encontrar o seu dispositivo/nome do telefone.",
+    "Home Assistant URL": "URL do Home Assistant",
+    "Event type:": "Tipo de evento:",
+    "Event data:": "Dados do evento:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Depois de escolher uma ação, por exemplo mudar a cena para onde uma luz RGB é vermelha.",
+    "Frontend Version": "Versão Frontend",
+    "Frontend Version do not match backend version!": "Versão Frontend não corresponde à versão backend!",
+    "backupRecommend": "Por favor, faça o backup do volume ou da pasta de dados (./data/) diretamente.",
+    "Optional": "Opcional",
+    "squadcast": "Squadcast",
+    "recurringInterval": "Intervalo",
+    "Recurring": "Recurrente",
+    "strategyManual": "Ativar/Desativar Manualmente",
+    "warningTimezone": "Está a utilizar o fuso horário do servidor",
+    "weekdayShortMon": "Segunda",
+    "weekdayShortTue": "Terça",
+    "weekdayShortWed": "Quarta",
+    "weekdayShortThu": "Quinta",
+    "weekdayShortFri": "Sexta",
+    "weekdayShortSat": "Sábado",
+    "weekdayShortSun": "Domingo",
+    "dayOfWeek": "Dia da Semana",
+    "dayOfMonth": "Dia do Mês",
+    "lastDay": "Último Dia",
+    "lastDay2": "2º Último Dia do Mês",
+    "lastDay3": "3º Último Dia do Mês",
+    "lastDay4": "4º Último Dia do Mês",
+    "No Maintenance": "Nenhuma Manutenção",
+    "maintenanceStatus-under-maintenance": "Em Manutenção",
+    "maintenanceStatus-inactive": "Inativo",
+    "maintenanceStatus-scheduled": "Agendado",
+    "maintenanceStatus-ended": "Terminado",
+    "Display Timezone": "Mostrar Fuso horário",
+    "Server Timezone": "Fuso horário do Servidor",
+    "statusPageMaintenanceEndDate": "Acabou",
+    "Maintenance": "Manutenção",
+    "Specific Monitor Type": "Tipo de Monitor Específico",
+    "Resend Notification if Down X times consequently": "Reenviar notificação se Off X vezes consequentemente",
+    "resendEveryXTimes": "Reenviar a cada {0} vezes",
+    "resendDisabled": "Reenviar desativado",
+    "Push URL": "Enviar URL",
+    "webhook": "Webhook",
+    "topic": "Tema",
+    "RadiusCalledStationIdDescription": "Identificador do dispositivo chamado",
+    "Automations can optionally be triggered in Home Assistant:": "As automatizações podem opcionalmente ser ativadas em Home Assistant:",
+    "or": "ou",
+    "markdownSupported": "Sintaxe de redução suportada",
+    "Start of maintenance": "Início da manutenção",
+    "webhookJsonDesc": "{0} é bom para qualquer servidor HTTP moderno, como Express.js",
+    "webhookAdditionalHeadersDesc": "Define headers adicionais enviados com o webhook.",
+    "successMessageExplanation": "Mensagem MQTT que será considerada como sucesso",
+    "error": "erro",
+    "Please input title and content": "Por favor insira o título e o conteúdo",
+    "Hide Tags": "Ocultar Tags",
+    "Description": "Descrição",
+    "shrinkDatabaseDescription": "Acionar banco de dados VACUUM para SQLite. Se seu banco de dados for criado após 1.10.0, AUTO_VACUUM já está ativado e esta ação não é necessária.",
+    "proxyDescription": "Os proxies devem ser atribuídos a um monitor para funcionar.",
+    "enableProxyDescription": "Este proxy não afetará as solicitações do monitor até que seja ativado. Você pode controlar temporariamente a desativação do proxy de todos os monitores pelo status de ativação.",
+    "Don't know how to get the token? Please read the guide:": "Não sabe como obter o token? Por favor, leia o guia:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "A conexão atual pode ser perdida se estiver conectando via Cloudflare Tunnel. Tem certeza de que deseja pará-lo? Digite sua senha atual para confirmar.",
+    "Docker Container": "Contentor Docker",
+    "Container Name / ID": "Nome / ID do Contentor",
+    "supportTelegramChatID": "Chat de Apoio Direto / Grupo / ID do Chat do Canal",
+    "chatIDNotFound": "O ID do Chat não é encontrado; por favor envie uma mensagem a este bot primeiro",
+    "trustProxyDescription": "Confiar nos headers 'X-Forwarded-*'. Se quiser obter o IP correto do cliente e o seu Uptime Kuma está por detrás de um proxy como o Nginx ou Apache, deve activá-lo.",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "O Token de Acesso de Longa Duração pode ser criado clicando no nome do seu perfil (em baixo à esquerda) e descendo para o fundo da pagina e depois clicando em Criar Token. ",
+    "lastDay1": "Último Dia do Mês",
+    "pauseMaintenanceMsg": "Quer mesmo colocar em pausa?",
+    "maintenanceStatus-unknown": "Desconhecido",
+    "needPushEvery": "Deve chamar este URL a cada {0} segundos.",
+    "pushOptionalParams": "Parâmetros opcionais: {0}",
+    "Title": "Título",
+    "User": "Utilizador",
+    "Installed": "Instalado",
+    "Not installed": "Não instalado",
+    "RadiusCalledStationId": "Id da estação chamada",
+    "RadiusCallingStationId": "Id da estação de chamada",
+    "default: notify all devices": "padrão: notificar todos os dispositivos",
+    "Trigger type:": "Tipo de gatilho:",
+    "telegram": "Telegram",
+    "Help": "Ajuda",
+    "Game": "Jogo",
+    "Monitor": "Monitor | Monitores",
+    "Default": "Padrão",
+    "Certificate Chain": "Certificate Chain",
+    "Show update if available": "Mostrar atualização se disponível",
+    "Also check beta release": "Verifique também a versão beta",
+    "Primary Base URL": "URL Base Principal",
+    "statusMaintenance": "Manutenção",
+    "Passive Monitor Type": "Tipo de Monitor Passivo",
+    "Custom": "Personalizar",
+    "General Monitor Type": "Tipo de Monitor Geral"
 }

From 2ef98c1b1027e38d55ce1d33881a4cac168cc754 Mon Sep 17 00:00:00 2001
From: Super Admin <uptime@kuma.pet>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 611/803] Translated using Weblate (English)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Super Admin <uptime@kuma.pet>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/en.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 9cf4c1e8..15edee93 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -55,7 +55,7 @@
     "Heartbeat Interval": "Heartbeat Interval",
     "Retries": "Retries",
     "Heartbeat Retry Interval": "Heartbeat Retry Interval",
-    "Resend Notification if Down X times consequently": "Resend Notification if Down X times consequently",
+    "Resend Notification if Down X times consequently": "Resend Notification if Down X times consecutively",
     "Advanced": "Advanced",
     "checkEverySecond": "Check every {0} seconds",
     "retryCheckEverySecond": "Retry every {0} seconds",

From a6f68a2e06e3d674ac3d2345159d2ca502222b05 Mon Sep 17 00:00:00 2001
From: Asdrubal Duarte <magyarlatin@gmail.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 612/803] Translated using Weblate (Hungarian)

Currently translated at 58.8% (410 of 697 strings)

Translated using Weblate (Spanish)

Currently translated at 96.9% (676 of 697 strings)

Co-authored-by: Asdrubal Duarte <magyarlatin@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/es/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/hu/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/es-ES.json | 10 +++++++---
 src/lang/hu.json    |  6 +++++-
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index 36502911..5adca7b7 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -304,7 +304,7 @@
     "General Monitor Type": "Monitor Tipo General",
     "Specific Monitor Type": "Monitor Tipo Específico",
     "Monitor": "Monitores",
-    "Resend Notification if Down X times consequently": "Reenviar Notificación si Caído X veces consecutivas",
+    "Resend Notification if Down X times consequently": "Reenviar Notificación si Caído X veces consecutivamente",
     "resendEveryXTimes": "Reenviar cada {0} veces",
     "resendDisabled": "Reenvío deshabilitado",
     "needPushEvery": "Debe llamar a esta URL cada {0} segundos.",
@@ -392,7 +392,7 @@
     "webhookAdditionalHeadersDesc": "Establece encabezados adicionales enviados con el webhook.",
     "appriseInstalled": "Apprise está instalado.",
     "successMessage": "Mensaje de éxito",
-    "Pick Accepted Status Codes...": "Elija códigos de estado aceptados…",
+    "Pick Accepted Status Codes...": "Seleccione Códigos de Estado Aceptados…",
     "Post": "Post",
     "shrinkDatabaseDescription": "Activar ASPIRADORA para SQLite. Si tu base de datos fue creada después 1.10.0, AUTO_ASPIRADORA ya está habilitada y esta acción no es necesaria.",
     "deleteStatusPageMsg": "¿Estas seguro que quieres eliminar esta página de estado?",
@@ -681,5 +681,9 @@
     "smseagleGroup": "Nombre(s) de grupo de Guía Telefónica",
     "Unpin": "Quitar de destacados",
     "Prefix Custom Message": "Prefijo personalizado",
-    "markdownSupported": "Soporta sintaxis Markdown"
+    "markdownSupported": "Soporta sintaxis Markdown",
+    "Server Address": "Dirección del Servidor",
+    "Learn More": "Aprende Más",
+    "Pick a RR-Type...": "Seleccione un Tipo RR",
+    "onebotHttpAddress": "Dirección HTTP OneBot"
 }
diff --git a/src/lang/hu.json b/src/lang/hu.json
index a6424a0f..bc2ded73 100644
--- a/src/lang/hu.json
+++ b/src/lang/hu.json
@@ -410,5 +410,9 @@
     "IconUrl": "Ikon URL",
     "successMessage": "Sikeres üzenet",
     "lastDay1": "A hónap utolsó napja",
-    "Guild ID": "Guild ID"
+    "Guild ID": "Guild ID",
+    "Help": "Súgó",
+    "statusMaintenance": "Karbantartás",
+    "Maintenance": "Karbantartás",
+    "Game": "Játék"
 }

From 9d53db1504d6775a3b3883260aa30ac1c546d682 Mon Sep 17 00:00:00 2001
From: Marchel Fahrezi <marchel.ace@gmail.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 613/803] Translated using Weblate (Indonesian)

Currently translated at 82.3% (574 of 697 strings)

Co-authored-by: Marchel Fahrezi <marchel.ace@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/id/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/id-ID.json | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/lang/id-ID.json b/src/lang/id-ID.json
index 59a06521..220567f9 100644
--- a/src/lang/id-ID.json
+++ b/src/lang/id-ID.json
@@ -581,5 +581,7 @@
     "goAlertIntegrationKeyInfo": "Dapatkan kunci integrasi API generik untuk layanan dalam format ini \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" biasanya nilai parameter token dari URL yang disalin.",
     "goAlert": "GoAlert",
     "backupOutdatedWarning": "Tidak digunakan lagi: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
-    "backupRecommend": "Harap cadangkan volume atau folder data (./data/) secara langsung."
+    "backupRecommend": "Harap cadangkan volume atau folder data (./data/) secara langsung.",
+    "Help": "Bantuan",
+    "Game": "Gim/Permainan"
 }

From f1aa567a505623c111d2b66a42a2d710dfcc156b Mon Sep 17 00:00:00 2001
From: Istratov Dmitrii <funkill2@gmail.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 614/803] Translated using Weblate (Russian)

Currently translated at 86.6% (604 of 697 strings)

Co-authored-by: Istratov Dmitrii <funkill2@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ru-RU.json | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 5caf74d6..bed58a54 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -604,5 +604,24 @@
     "Help": "Помощь",
     "Game": "Игра",
     "Resend Notification if Down X times consequently": "Повторно отправить уведомление, если не работает X раз подряд",
-    "General Monitor Type": "Основной тип монитора"
+    "General Monitor Type": "Основной тип монитора",
+    "weekdayShortWed": "Ср",
+    "weekdayShortThu": "Чт",
+    "weekdayShortFri": "Пт",
+    "weekdayShortSat": "Сб",
+    "weekdayShortSun": "Вс",
+    "dayOfMonth": "День месяца",
+    "Pick Affected Monitors...": "Выберите затронутые мониторы…",
+    "Custom": "Пользовательский",
+    "successMessage": "Сообщение об успехе",
+    "successMessageExplanation": "Сообщение MQTT, которое может рассматриваться как успешное",
+    "Custom CSS": "Пользовательские CSS",
+    "weekdayShortTue": "Вт",
+    "dayOfWeek": "День недели",
+    "confirmDeleteTagMsg": "Вы уверены, что хотите удалить этот тег? Мониторы с этим тегом удалены не будут.",
+    "loadingError": "Не удаётся получить данные, пожалуйста попробуйте позже.",
+    "Packet Size": "Размер пакета",
+    "warningTimezone": "Используется часовой пояс сервера",
+    "weekdayShortMon": "Пн",
+    "ZohoCliq": "ZohoCliq"
 }

From 9268ad2f2cbec609e87c0cd44e2c372a21d3b9c6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 615/803] Translated using Weblate (Chinese (Traditional, Hong
 Kong))

Currently translated at 82.0% (572 of 697 strings)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-HK.json | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 14f25b5e..7069f95b 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -573,5 +573,6 @@
     "Maintenance Time Window of a Day": "每日維護時段",
     "Proxy": "Proxy",
     "backupOutdatedWarning": "過時:由於備份功能未顧及新功能的增加,因此備份功能無法產生或復原完整的備份。",
-    "Optional": "可選填"
+    "Optional": "可選填",
+    "markdownSupported": "支援 Markdown"
 }

From e9876986ebffb72a5c256ac5f92ac01ff6769a21 Mon Sep 17 00:00:00 2001
From: hamx01 <asolianik2015@gmail.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 616/803] Translated using Weblate (Ukrainian)

Currently translated at 78.6% (548 of 697 strings)

Translated using Weblate (Russian)

Currently translated at 94.4% (658 of 697 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: hamx01 <asolianik2015@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pl/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/uk/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/pl.json    | 30 ++++++++--------
 src/lang/ru-RU.json | 84 +++++++++++++++++++++++++++++++++------------
 src/lang/uk-UA.json | 18 +++++++---
 3 files changed, 91 insertions(+), 41 deletions(-)

diff --git a/src/lang/pl.json b/src/lang/pl.json
index de0acca2..e971a5ff 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -388,8 +388,8 @@
     "alertaApiEndpoint": "Punkt końcowy API",
     "alertaEnvironment": "Środowisko",
     "alertaApiKey": "Klucz API",
-    "alertaAlertState": "Alert State",
-    "alertaRecoverState": "Recover State",
+    "alertaAlertState": "Stan alarmowy",
+    "alertaRecoverState": "Stan odzyskania",
     "deleteStatusPageMsg": "Jesteś pewien, że chcesz usunąć tę stronę statusów?",
     "Proxies": "Proxy",
     "default": "Domyślny",
@@ -402,7 +402,7 @@
     "Certificate Chain": "Łańcuch certyfikatów",
     "Valid": "Ważny",
     "Invalid": "Nieważny",
-    "AccessKeyId": "AccessKey ID",
+    "AccessKeyId": "ID klucza dostępu",
     "SecretAccessKey": "AccessKey Sekret",
     "PhoneNumbers": "Numery telefonów",
     "TemplateCode": "Kod szablonu",
@@ -494,7 +494,7 @@
     "atLeastOneMonitor": "Wybierz co najmniej jeden monitor, którego dotyczy problem",
     "deleteMaintenanceMsg": "Czy na pewno chcesz usunąć tę konserwację?",
     "dnsPortDescription": "Port serwera DNS. Domyślnie 53. Możesz zmienić port w dowolnym momencie.",
-    "Resend Notification if Down X times consequently": "Wyślij ponownie powiadomienie, jeśli nie działa X razy pod rząd",
+    "Resend Notification if Down X times consequently": "Wyślij ponownie powiadomienie, jeśli nie działa X razy z rzędu",
     "error": "błąd",
     "critical": "krytyczny",
     "wayToGetPagerDutyKey": "Możesz to uzyskać, przechodząc do Service -> Service Directory -> (wybierz usługę) -> Integrations -> Add integration. Tutaj możesz wyszukać \"Events API V2\". Więcej informacji {0}",
@@ -529,21 +529,21 @@
     "promosmsLogin": "Nazwa logowania API",
     "promosmsPassword": "Hasło API",
     "pushoversounds pushover": "Pushover (domyślny)",
-    "pushoversounds bike": "Bike",
-    "pushoversounds bugle": "Bugle",
-    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds bike": "Rower",
+    "pushoversounds bugle": "chrząszcz",
+    "pushoversounds cashregister": "Kasa fiskalna",
     "pushoversounds classical": "Classical",
-    "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
+    "pushoversounds cosmic": "Kosmiczny",
+    "pushoversounds falling": "Spadek",
     "pushoversounds gamelan": "Gamelan",
     "pushoversounds incoming": "Incoming",
     "pushoversounds intermission": "Intermission",
-    "pushoversounds magic": "Magic",
-    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds magic": "Magia",
+    "pushoversounds mechanical": "Mechaniczny",
     "pushoversounds pianobar": "Piano Bar",
-    "pushoversounds siren": "Siren",
-    "pushoversounds spacealarm": "Space Alarm",
-    "pushoversounds tugboat": "Tug Boat",
+    "pushoversounds siren": "Syrena",
+    "pushoversounds spacealarm": "Alarm kosmiczny",
+    "pushoversounds tugboat": "Holownik",
     "pushoversounds alien": "Alien Alarm (długie)",
     "pushoversounds climb": "Climb (długie)",
     "pushoversounds persistent": "Persistent (długie)",
@@ -693,7 +693,7 @@
     "confirmUninstallPlugin": "Czy na pewno chcesz odinstalować tę wtyczkę?",
     "Custom Monitor Type": "Własny typ monitora",
     "markdownSupported": "Obsługiwana składnia Markdown",
-    "Google Analytics ID": "Google Analytics ID",
+    "Google Analytics ID": "Identyfikator Google Analytics",
     "Edit Tag": "Edytuj Tag",
     "Server Address": "Adres Serwera",
     "Learn More": "Dowiedz się więcej"
diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index bed58a54..7ea1f643 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -43,7 +43,7 @@
     "Delete": "Удалить",
     "Current": "Текущий",
     "Uptime": "Аптайм",
-    "Cert Exp.": "Сертификат истекает",
+    "Cert Exp.": "Сертификат истекает.",
     "day": "день | дней",
     "-day": " дней",
     "hour": "час",
@@ -74,7 +74,7 @@
     "Bottom": "Снизу",
     "None": "Отсутствует",
     "Timezone": "Часовой пояс",
-    "Search Engine Visibility": "Индексация поисковыми системами:",
+    "Search Engine Visibility": "Индексация поисковыми системами",
     "Allow indexing": "Разрешить индексирование",
     "Discourage search engines from indexing site": "Запретить индексирование",
     "Change Password": "Сменить пароль",
@@ -86,7 +86,7 @@
     "Enable Auth": "Включить авторизацию",
     "disableauth.message1": "Вы уверены, что хотите <strong>отключить авторизацию</strong>?",
     "disableauth.message2": "Это подходит для <strong>тех, у кого стоит другая авторизация</strong> перед открытием Uptime Kuma, например Cloudflare Access.",
-    "Please use this option carefully!": "Пожалуйста, используйте с осторожностью.",
+    "Please use this option carefully!": "Пожалуйста, используйте с осторожностью!",
     "Logout": "Выйти",
     "Leave": "Отмена",
     "I understand, please disable": "Я понимаю, всё равно отключить",
@@ -156,7 +156,7 @@
     "Options": "Опции",
     "Keep both": "Не проверять",
     "Tags": "Теги",
-    "Add New below or Select...": "Добавить новый или выбрать...",
+    "Add New below or Select...": "Добавить новый или выбрать…",
     "Tag with this name already exist.": "Такой тег уже существует.",
     "Tag with this value already exist.": "Тег с таким значением уже существует.",
     "color": "цвет",
@@ -169,7 +169,7 @@
     "Indigo": "Индиго",
     "Purple": "Пурпурный",
     "Pink": "Розовый",
-    "Search...": "Поиск...",
+    "Search...": "Поиск…",
     "Avg. Ping": "Среднее значение пинга",
     "Avg. Response": "Среднее время ответа",
     "Entry Page": "Главная страница",
@@ -233,12 +233,12 @@
     "smtpCC": "Копия",
     "smtpBCC": "Скрытая копия",
     "Discord Webhook URL": "Discord вебхук URL",
-    "wayToGetDiscordURL": "Вы можете создать его в Параметрах сервера -> Интеграции -> Создать вебхук",
+    "wayToGetDiscordURL": "Вы можете создать его в \"Настройки -> Интеграции -> Создать Вебхук\"",
     "Bot Display Name": "Отображаемое имя бота",
     "Prefix Custom Message": "Свой префикс сообщения",
-    "Hello @everyone is...": "Привет {'@'}everyone это...",
+    "Hello @everyone is...": "Привет {'@'} всем это…",
     "Webhook URL": "URL вебхука",
-    "wayToGetTeamsURL": "Как создать URL вебхука вы можете узнать здесь - {0}.",
+    "wayToGetTeamsURL": "Как создать URL Вебхука вы можете узнать здесь - {0}.",
     "Number": "Номер",
     "Recipients": "Получатели",
     "needSignalAPI": "Вам необходим клиент Signal с поддержкой REST API.",
@@ -270,7 +270,7 @@
     "octopushPhoneNumber": "Номер телефона (межд. формат, например: +79831234567) ",
     "octopushSMSSender": "Имя отправителя SMS: 3-11 символов алвафита, цифр и пробелов (a-zA-Z0-9)",
     "LunaSea Device ID": "ID устройства LunaSea",
-    "Apprise URL": "Apprise URL",
+    "Apprise URL": "Ссылка Уведомления",
     "Example:": "Пример: {0}",
     "Read more:": "Подробнее: {0}",
     "Status:": "Статус: {0}",
@@ -286,7 +286,7 @@
     "Messaging API": "API сообщений",
     "wayToGetLineChannelToken": "Сначала зайдите в {0}, создайте провайдера и канал (API сообщений), затем вы сможете получить токен доступа канала и ID пользователя из вышеупомянутых пунктов меню.",
     "Icon URL": "URL иконки",
-    "aboutIconURL": "Вы можете предоставить ссылку на иконку в поле \"URL иконки\" чтобы переопределить картинку профиля по умолчанию. Не используется, если задана иконка Emoji.",
+    "aboutIconURL": "Вы можете вставить ссылку на иконку в поле \"URL иконки\" чтобы изменить картинку профиля по умолчанию. Не используется, если задана иконка Emoji.",
     "aboutMattermostChannelName": "Вы можете переопределить канал по умолчанию, в который вебхук пишет, введя имя канала в поле \"Имя канала\". Это необходимо включить в настройках вебхука Mattermost. Например: #other-channel",
     "matrix": "Matrix",
     "promosmsTypeEco": "SMS ECO - дёшево и медленно, часто перегружен. Только для получателей из Польши.",
@@ -315,8 +315,8 @@
     "Certificate Chain": "Цепочка сертификатов",
     "Valid": "Действительный",
     "Hide Tags": "Скрыть тэги",
-    "Title": "Название инцидента:",
-    "Content": "Содержание инцидента:",
+    "Title": "Название инцидента",
+    "Content": "Содержание инцидента",
     "Post": "Опубликовать",
     "Cancel": "Отмена",
     "Created": "Создано",
@@ -327,7 +327,7 @@
     "6h": "6 часов",
     "24h": "24 часа",
     "1w": "1 неделя",
-    "No monitors available.": "Нет доступных мониторов",
+    "No monitors available.": "Нет доступных мониторов.",
     "Add one": "Добавить новый",
     "Backup": "Резервная копия",
     "Security": "Безопасность",
@@ -363,8 +363,8 @@
     "Done": "Готово",
     "Info": "Инфо",
     "Steam API Key": "Steam API-Ключ",
-    "Pick a RR-Type...": "Выберите RR-Тип...",
-    "Pick Accepted Status Codes...": "Выберите принятые коды состояния...",
+    "Pick a RR-Type...": "Выберите RR-Тип…",
+    "Pick Accepted Status Codes...": "Выберите принятые коды состояния…",
     "Default": "По умолчанию",
     "Please input title and content": "Пожалуйста, введите название и содержание",
     "Last Updated": "Последнее Обновление",
@@ -417,7 +417,7 @@
     "Bark Group": "Bark Group",
     "Bark Sound": "Bark Sound",
     "WebHookUrl": "WebHookUrl",
-    "SecretKey": "SecretKey",
+    "SecretKey": "Секретный Ключ",
     "For safety, must use secret key": "В целях безопасности необходимо использовать секретный ключ",
     "Device Token": "Токен устройства",
     "Platform": "Платформа",
@@ -556,7 +556,7 @@
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ",
     "Notification Service": "Служба уведомлений",
     "default: notify all devices": "по стандарту: уведомлять все устройства",
-    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Список служб уведомлений можно найти в Home Assistant в разделе \"Инструменты разработчика > Службы\", выполнив поиск по слову \"уведомление\", чтобы найти название вашего устройства/телефона.",
     "Automations can optionally be triggered in Home Assistant:": "При желании автоматизацию можно активировать в Home Assistant.:",
     "Trigger type:": "Тип триггера:",
     "Event type:": "Тип события:",
@@ -592,8 +592,8 @@
     "Affected Monitors": "Затронутые мониторы",
     "Start of maintenance": "Начало обслуживания",
     "All Status Pages": "Все страницы статусов",
-    "Select status pages...": "Выберите страницу статуса...",
-    "resendEveryXTimes": "Повторная отправка каждые {0} раз",
+    "Select status pages...": "Выберите страницу статуса…",
+    "resendEveryXTimes": "Повтор каждые {0} раз",
     "resendDisabled": "Повторная отправка отключена",
     "deleteMaintenanceMsg": "Вы действительно хотите удалить это обслуживание?",
     "critical": "критично",
@@ -619,9 +619,51 @@
     "weekdayShortTue": "Вт",
     "dayOfWeek": "День недели",
     "confirmDeleteTagMsg": "Вы уверены, что хотите удалить этот тег? Мониторы с этим тегом удалены не будут.",
-    "loadingError": "Не удаётся получить данные, пожалуйста попробуйте позже.",
+    "loadingError": "Невозможно получить данные, пожалуйста попробуйте позже.",
     "Packet Size": "Размер пакета",
     "warningTimezone": "Используется часовой пояс сервера",
     "weekdayShortMon": "Пн",
-    "ZohoCliq": "ZohoCliq"
+    "ZohoCliq": "ZohoCliq",
+    "strategyManual": "Активен/Неактивен Вручную",
+    "lastDay": "Последний день",
+    "lastDay1": "Последний день месяца",
+    "lastDay2": "Второй последний день месяца",
+    "lastDay3": "Третий последний день месяца",
+    "lastDay4": "Четвертый последний день месяца",
+    "No Maintenance": "Ничего не обслуживается",
+    "pauseMaintenanceMsg": "Вы уверены что хотите поставить на паузу?",
+    "maintenanceStatus-under-maintenance": "На техобслуживании",
+    "maintenanceStatus-inactive": "Неактивен",
+    "maintenanceStatus-scheduled": "Запланирован(о)",
+    "maintenanceStatus-ended": "Закончился(ось)",
+    "maintenanceStatus-unknown": "Неизвестен",
+    "Display Timezone": "Показать часовой пояс",
+    "Server Timezone": "Часовой пояс сервера",
+    "statusPageMaintenanceEndDate": "Конец",
+    "IconUrl": "URL Иконки",
+    "Enable DNS Cache": "Включить DNS кэш",
+    "Enable": "Включить",
+    "Disable": "Отключить",
+    "Single Maintenance Window": "Единое Окно Обслуживания",
+    "Schedule Maintenance": "Запланировать обслуживание",
+    "Date and Time": "Дата и Время",
+    "DateTime Range": "Промежуток Даты и Времени",
+    "uninstalling": "Удаляется",
+    "dataRetentionTimeError": "Период хранения должен быть равен 0 или больше",
+    "infiniteRetention": "Установите 0 для бессрочного хранения.",
+    "enableGRPCTls": "Разрешить отправлять gRPC запрос через TLS соединение",
+    "Free Mobile API Key": "API ключ Free Mobile",
+    "Edit Tag": "Редактировать тэг",
+    "webhookAdditionalHeadersDesc": "Устанавливает дополнительные заголовки, отправляемые с помощью веб-хука.",
+    "topic": "Тема",
+    "Customize": "Персонализировать",
+    "Custom Footer": "Пользовательский footer",
+    "dnsCacheDescription": "Это может не работать на некоторых IPv6 окружениях, отключите это, если у вас возникают проблемы.",
+    "confirmUninstallPlugin": "Вы уверены, что хотите удалить этот плагин?",
+    "plugin": "Плагин | Плагины",
+    "install": "Установить",
+    "installing": "Устанавливается",
+    "uninstall": "Удалить",
+    "Recurring": "Повторяющийся",
+    "recurringInterval": "Интервал"
 }
diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
index ad8e6936..9a63cfe0 100644
--- a/src/lang/uk-UA.json
+++ b/src/lang/uk-UA.json
@@ -156,7 +156,7 @@
     "Options": "Опції",
     "Keep both": "Не перевіряти",
     "Tags": "Теги",
-    "Add New below or Select...": "Додати новий або вибрати...",
+    "Add New below or Select...": "Додати новий або вибрати…",
     "Tag with this name already exist.": "Такий тег вже існує.",
     "Tag with this value already exist.": "Тег із таким значенням вже існує.",
     "color": "колір",
@@ -169,7 +169,7 @@
     "Indigo": "Індиго",
     "Purple": "Пурпурний",
     "Pink": "Рожевий",
-    "Search...": "Пошук...",
+    "Search...": "Пошук…",
     "Avg. Ping": "Середній пінг",
     "Avg. Response": "Середній час відповіді",
     "Entry Page": "Головна сторінка",
@@ -362,8 +362,8 @@
     "Done": "Готово",
     "Info": "Інфо",
     "Steam API Key": "Steam API-Ключ",
-    "Pick a RR-Type...": "Виберіть RR-тип...",
-    "Pick Accepted Status Codes...": "Виберіть прийняті коди стану...",
+    "Pick a RR-Type...": "Виберіть RR-тип…",
+    "Pick Accepted Status Codes...": "Виберіть прийняті коди стану…",
     "Default": "За замовчуванням",
     "Please input title and content": "Будь ласка, введіть назву та зміст",
     "Last Updated": "Останнє Оновлення",
@@ -555,5 +555,13 @@
     "Pick Affected Monitors...": "Виберіть задіяні монітори…",
     "statusMaintenance": "Обслуговування",
     "Maintenance": "Обслуговування",
-    "General Monitor Type": "Основний моніторинг"
+    "General Monitor Type": "Основний моніторинг",
+    "error": "Помилка",
+    "webhookAdditionalHeadersTitle": "Додаткові заголовки",
+    "webhookAdditionalHeadersDesc": "Задати додаткові заголовки, що за допомогою вебхука.",
+    "critical": "Критичний",
+    "Custom": "Нестандартний",
+    "successMessage": "Повідомлення про успіх",
+    "Customize": "Налаштувати",
+    "topic": "Тема"
 }

From b49e3b65c122759967e954014178522849f7c6ec Mon Sep 17 00:00:00 2001
From: Jonne Saloranta <saloranta.jonne@gmail.com>
Date: Mon, 13 Feb 2023 08:59:27 +0000
Subject: [PATCH 617/803] Translated using Weblate (Finnish)

Currently translated at 15.2% (106 of 697 strings)

Added translation using Weblate (Finnish)

Co-authored-by: Jonne Saloranta <saloranta.jonne@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fi/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fi.json | 108 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 108 insertions(+)
 create mode 100644 src/lang/fi.json

diff --git a/src/lang/fi.json b/src/lang/fi.json
new file mode 100644
index 00000000..193a95c8
--- /dev/null
+++ b/src/lang/fi.json
@@ -0,0 +1,108 @@
+{
+    "Dashboard": "Kojetaulu",
+    "Help": "Apua",
+    "New Update": "Uusi Päivitys",
+    "Language": "Kieli",
+    "Appearance": "Ulkonäkö",
+    "Theme": "Teema",
+    "General": "Yleinen",
+    "Game": "Peli",
+    "Version": "Versio",
+    "List": "Lista",
+    "Add": "Lisää",
+    "Add New Monitor": "Lisää uusi seurain",
+    "Quick Stats": "Nopeat tilastot",
+    "Up": "Ylös",
+    "Down": "Alas",
+    "Pending": "Odottaa",
+    "statusMaintenance": "Huolto",
+    "Maintenance": "Huolto",
+    "Unknown": "Tuntematon",
+    "General Monitor Type": "Yleinen seuranta tyyppi",
+    "Passive Monitor Type": "Passiivinen seuranta tyyppi",
+    "markdownSupported": "Markdown-syntaksi tuettu",
+    "pauseDashboardHome": "Tauko",
+    "Pause": "Tauko",
+    "Name": "Nimi",
+    "Status": "Tila",
+    "DateTime": "Päivämäärä",
+    "Message": "Viesti",
+    "No important events": "Ei tärkeitä tapahtumia",
+    "Resume": "Jatka",
+    "Edit": "Muokkaa",
+    "Delete": "Poista",
+    "Current": "Nykyinen",
+    "Uptime": "Päälläoloaika",
+    "Monitor": "Seurain | Seuraimet",
+    "day": "Päivä | Päivää",
+    "-day": "-päivä",
+    "hour": "Tunti",
+    "-hour": "-tunti",
+    "Response": "Vastaus",
+    "Ping": "Signaali",
+    "Monitor Type": "Seurain tyyppi",
+    "Keyword": "Avainsana",
+    "URL": "URL",
+    "Hostname": "Isäntänimi",
+    "Heartbeat Interval": "Sydämensyke intervalli",
+    "Retries": "Uusintayrityksiä",
+    "Resend Notification if Down X times consequently": "Uudelleen lähetä ilmoitus jos ei vastausta X määrä peräkkäin",
+    "Advanced": "Edistynyt",
+    "checkEverySecond": "Tarkista jokainen {0} sekuntti",
+    "retryCheckEverySecond": "Yritä uudelleen jokainen {0} sekuntti",
+    "resendEveryXTimes": "Uudelleen lähetä jokainen {0} kerta",
+    "ignoreTLSError": "Älä huomioi TLS/SSL virhettä HTTPS nettisivuilla",
+    "upsideDownModeDescription": "Pyöräytä tila ylösalaisin. Jos palvelu on saavutettavissa, merkitse se SAMMUNEEKSI.",
+    "maxRedirectDescription": "Maksimi määrä uudelleen ohjauksia joita seurata. Aseta 0 estääksesi uudelleenohjaukset.",
+    "Upside Down Mode": "Ylösalaisin-moodi",
+    "Max. Redirects": "Maksimi määrä uudelleenohjauksia",
+    "Accepted Status Codes": "Sallitut tila koodit",
+    "Push URL": "Työnnä URL",
+    "Save": "Tallenna",
+    "Notifications": "Ilmoitukset",
+    "Setup Notification": "Määritä ilmoitukset",
+    "Light": "Vaalea",
+    "Dark": "Tumma",
+    "Auto": "Automaattinen",
+    "Theme - Heartbeat Bar": "Teema - Sydänlyönti palkki",
+    "Normal": "Normaali",
+    "Bottom": "Pohja",
+    "None": "Ei mitään",
+    "Timezone": "Aikavyöhyke",
+    "Search Engine Visibility": "Hakukone näkyvyys",
+    "Allow indexing": "Salli indeksointi",
+    "Change Password": "Vaihda salasana",
+    "Current Password": "Nykyinen salasana",
+    "New Password": "Uusi salasana",
+    "Repeat New Password": "Toista uusi salasana",
+    "Update Password": "Päivätä salasana",
+    "Disable Auth": "Poista todennus käytöstä",
+    "Enable Auth": "Ota todennus käyttöön",
+    "Logout": "Kirjaudu ulos",
+    "Leave": "Poistu",
+    "I understand, please disable": "Ymmärrän, poista käytöstä",
+    "Confirm": "Hyväksy",
+    "Yes": "Kyllä",
+    "No": "Ei",
+    "Username": "Käyttäjänimi",
+    "Password": "Salasana",
+    "Login": "Kirjaudu",
+    "add one": "Lisää yksi",
+    "Notification Type": "Ilmoitus tyyppi",
+    "Email": "Sähköposti",
+    "Test": "Testi",
+    "Certificate Info": "Sertifikaatti tiedot",
+    "Settings": "Asetukset",
+    "Check Update On GitHub": "Tarkista päivitys GitHub:ssa",
+    "Specific Monitor Type": "Tietty seuranta tyyppi",
+    "Cert Exp.": "Sertifikaatti vanh.",
+    "Friendly Name": "Ystävällinen nimi",
+    "Port": "Portti",
+    "Heartbeat Retry Interval": "Sydämensyke uudelleen yritys intervalli",
+    "resendDisabled": "Uudelleen lähetys poissa käytöstä",
+    "retriesDescription": "Maksimi määrä uudelleen yrityksiä ennen kuin palvelu merkitään sammuneeksi ja ilmoitus lähetetään",
+    "Discourage search engines from indexing site": "Estä hakukoneita indeksoimasta sivua",
+    "disableauth.message1": "Oletko varma että haluat <strong>poistaa todennuksen käytöstä</strong>?",
+    "Please use this option carefully!": "Käytä tätä vaihtoehtoa varoen!",
+    "Remember me": "Muista minut"
+}

From aeea1ff03f6e6544780413665185be121aac02de Mon Sep 17 00:00:00 2001
From: aditya wahyudi <aditbaco@gmail.com>
Date: Mon, 13 Feb 2023 08:59:28 +0000
Subject: [PATCH 618/803] Translated using Weblate (Indonesian)

Currently translated at 83.3% (581 of 697 strings)

Co-authored-by: aditya wahyudi <aditbaco@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/id/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/id-ID.json | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/lang/id-ID.json b/src/lang/id-ID.json
index 220567f9..2538b977 100644
--- a/src/lang/id-ID.json
+++ b/src/lang/id-ID.json
@@ -1,7 +1,7 @@
 {
     "languageName": "Bahasa Indonesia (Indonesian)",
-    "checkEverySecond": "Cek Setiap {0} detik.",
-    "retryCheckEverySecond": "Coba lagi setiap {0} detik.",
+    "checkEverySecond": "Cek Setiap {0} detik",
+    "retryCheckEverySecond": "Coba lagi setiap {0} detik",
     "resendEveryXTimes": "Kirim ulang setiap {0} kali",
     "resendDisabled": "Kirim ulang dinonaktifkan",
     "retriesDescription": "Percobaan ulang maksimum sebelum layanan dinyatakan tidak aktif dan notifikasi dikirim",
@@ -71,9 +71,9 @@
     "URL": "URL",
     "Hostname": "Hostname",
     "Port": "Port",
-    "Heartbeat Interval": "Jarak Waktu Heartbeat ",
+    "Heartbeat Interval": "Jarak Waktu Heartbeat",
     "Retries": "Coba lagi",
-    "Heartbeat Retry Interval": "Jarak Waktu Heartbeat Mencoba kembali ",
+    "Heartbeat Retry Interval": "Jeda Pengulangan Heartbeat",
     "Resend Notification if Down X times consequently": "Kirim Ulang Notifikasi jika Tidak Aktif X kali",
     "Advanced": "Tingkat Lanjut",
     "Upside Down Mode": "Mode Terbalik",
@@ -583,5 +583,12 @@
     "backupOutdatedWarning": "Tidak digunakan lagi: Karena banyak fitur ditambahkan dan fitur cadangan ini agak tidak terawat, itu tidak dapat menghasilkan atau memulihkan cadangan lengkap.",
     "backupRecommend": "Harap cadangkan volume atau folder data (./data/) secara langsung.",
     "Help": "Bantuan",
-    "Game": "Gim/Permainan"
+    "Game": "Gim/Permainan",
+    "markdownSupported": "Dukungan sintaks markdown",
+    "statusMaintenance": "Pemeliharaan",
+    "Maintenance": "Pemeliharaan",
+    "General Monitor Type": "Tipe Monitor Umum",
+    "Passive Monitor Type": "Tipe Monitor Pasif",
+    "Specific Monitor Type": "Tipe Monitor Spesifik",
+    "Monitor": "Monitor"
 }

From 1bcca60574de15e883878645bcd2ebe9621f2286 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Mon, 13 Feb 2023 08:59:28 +0000
Subject: [PATCH 619/803] Translated using Weblate (Chinese (Traditional, Hong
 Kong))

Currently translated at 93.9% (655 of 697 strings)

Co-authored-by: Nelson Chan <chakflying@hotmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-HK.json | 104 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 93 insertions(+), 11 deletions(-)

diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 7069f95b..abf49727 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -102,9 +102,9 @@
     "deleteNotificationMsg": "是否確定刪除這個通知設定?如監測器啟用了這個通知,將會收不到通知。",
     "Resolver Server": "DNS 伺服器",
     "Resource Record Type": "DNS 記錄類型",
-    "resolverserverDescription": "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。",
+    "resolverserverDescription": "預設為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。",
     "rrtypeDescription": "請選擇 DNS 記錄類型",
-    "pauseMonitorMsg": "是否確定暫停?",
+    "pauseMonitorMsg": "是否確定要暫停?",
     "Last Result": "最後結果",
     "Create your admin account": "建立管理員帳號",
     "Repeat Password": "重複密碼",
@@ -128,10 +128,10 @@
     "backupDescription3": "此備份可能包含了一些敏感資料如通知裡的 Token,請小心保存備份。",
     "alertNoFile": "請選擇一個檔案",
     "alertWrongFileType": "請選擇 JSON 檔案",
-    "twoFAVerifyLabel": "Please type in your token to verify that 2FA is working",
-    "tokenValidSettingsMsg": "Token is valid! You can now save the 2FA settings.",
-    "confirmEnableTwoFAMsg": "Are you sure you want to enable 2FA?",
-    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "twoFAVerifyLabel": "請輸入 Token 以確認 2FA:",
+    "tokenValidSettingsMsg": "Token 有效!您現在可以儲存 2FA 設定。",
+    "confirmEnableTwoFAMsg": "您確定要啟用 2FA 嗎?",
+    "confirmDisableTwoFAMsg": "您確定要停用 2FA 嗎?",
     "Apply on all existing monitors": "套用至目前所有監測器",
     "Verify Token": "驗証 Token",
     "Setup 2FA": "設定 2FA",
@@ -145,8 +145,8 @@
     "Show URI": "顯示 URI",
     "Clear all statistics": "清除所有歷史記錄",
     "retryCheckEverySecond": "Retry every {0} seconds.",
-    "importHandleDescription": "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
-    "confirmImportMsg": "Are you sure to import the backup? Please make sure you've selected the right import option.",
+    "importHandleDescription": "\"略過已存在的\" 會跳過所有相同名稱的監測器或通知。 '覆蓋' 將刪除所有現有的監測器及通知。",
+    "confirmImportMsg": "您確定要匯入備份嗎?請確認你已選擇正確的匯入設定。",
     "Heartbeat Retry Interval": "Heartbeat Retry Interval",
     "Import Backup": "匯入備份",
     "Export Backup": "匯出備份",
@@ -360,7 +360,7 @@
     "smtpDkimDesc": "請參考 Nodemailer DKIM {0} 使用方式。",
     "documentation": "文件",
     "smtpDkimDomain": "網域名稱",
-    "smtpDkimKeySelector": "DKIM 選取器",
+    "smtpDkimKeySelector": "Key Selector",
     "smtpDkimPrivateKey": "私密金鑰",
     "smtpDkimHashAlgo": "雜湊演算法 (選填)",
     "smtpDkimheaderFieldNames": "要簽署的郵件標頭 (選填)",
@@ -397,7 +397,7 @@
     "affectedStatusPages": "在已選取的狀態頁中顯示此維護訊息",
     "Primary Base URL": "主要 Base URL",
     "Passive Monitor Type": "被動監測器類型",
-    "Resend Notification if Down X times consequently": "若 X 次心跳皆離線,重新傳送通知",
+    "Resend Notification if Down X times consequently": "每 X 次心跳皆離線,重新傳送通知",
     "Game": "遊戲",
     "Specific Monitor Type": "特定監測器類型",
     "Monitor": "監測器 | 監測器",
@@ -574,5 +574,87 @@
     "Proxy": "Proxy",
     "backupOutdatedWarning": "過時:由於備份功能未顧及新功能的增加,因此備份功能無法產生或復原完整的備份。",
     "Optional": "可選填",
-    "markdownSupported": "支援 Markdown"
+    "markdownSupported": "支援 Markdown",
+    "Custom Monitor Type": "自訂監測器",
+    "Google Analytics ID": "Google Analytics ID",
+    "Learn More": "了解更多",
+    "Server Address": "Server 地址",
+    "Edit Tag": "編輯標籤",
+    "confirmDeleteTagMsg": "你確定你要刪除此標籤?相關的監測器不會被刪除。",
+    "pushoversounds pushover": "Pushover (預設)",
+    "pushoversounds tugboat": "Tug Boat",
+    "pushyToken": "裝置 Token",
+    "Proto Content": "Proto 內容",
+    "onebotHttpAddress": "OneBot HTTP 地址",
+    "HomeAssistant": "Home Assistant",
+    "Leave blank to use a shared sender number.": "留空以使用平台共享的發送人號碼。",
+    "auto acknowledged": "自動標記已讀",
+    "wayToGetPagerDutyKey": "您可以前往 Service -> Service Directory -> (Select a service) -> Integrations -> Add integration 以取得。您可以搜尋 \"Events API V2\"。詳細資訊 {0}",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "到 {0} 創建應用並取得 Bot Token",
+    "grpcMethodDescription": "Method 名稱將被轉換成 cammelCase 命名,如 sayHello、check 等。",
+    "deleteMaintenanceMsg": "您確定要刪除此維護嗎?",
+    "dnsPortDescription": "DNS 伺服器 port。預設為 53。您可以隨時變更 port。",
+    "atLeastOneMonitor": "選擇至少一個受影響的監測器",
+    "endpoint": "endpoint",
+    "octopushAPIKey": "在控制台的 HTTP API 憑證取得的 \"API Key\"",
+    "octopushLogin": "在控制台的 HTTP API 憑證取得的 \"Login\"",
+    "promosmsLogin": "API 登入名稱",
+    "promosmsPassword": "API 密碼",
+    "pushoversounds bike": "Bike",
+    "pushoversounds bugle": "Bugle",
+    "pushoversounds cashregister": "Cash Register",
+    "pushoversounds classical": "Classical",
+    "pushoversounds cosmic": "Cosmic",
+    "pushoversounds falling": "Falling",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Incoming",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Magic",
+    "pushoversounds mechanical": "Mechanical",
+    "pushoversounds pianobar": "Piano Bar",
+    "pushoversounds siren": "Siren",
+    "pushoversounds spacealarm": "Space Alarm",
+    "pushoversounds alien": "Alien Alarm (long)",
+    "pushoversounds climb": "Climb (long)",
+    "pushoversounds persistent": "Persistent (long)",
+    "pushoversounds echo": "Pushover Echo (long)",
+    "pushoversounds updown": "Up Down (long)",
+    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds none": "None (silent)",
+    "pushyAPIKey": "Secret API Key",
+    "Guild ID": "Guild ID",
+    "Strategy": "策略",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Enable TLS": "使用 TLS",
+    "Proto Service Name": "Proto 服務名稱",
+    "Proto Method": "Proto 方式",
+    "onebotGroupMessage": "群組",
+    "onebotMessageType": "OneBot 訊息類型",
+    "ntfy Topic": "ntfy Topic",
+    "Legacy Octopush-DM": "舊版 Octopush-DM",
+    "Octopush API Version": "Octopush API 版本",
+    "From Name/Number": "發送人名稱/號碼",
+    "Recipient Number": "收件人號碼",
+    "smseaglePriority": "訊息優先度 (0-9,預設 = 0)",
+    "smseagleEncoding": "以 Unicode 傳送",
+    "smseagleUrl": "您的 SMSEagle 裝置 URL",
+    "smseagleToken": "API 存取 Token",
+    "smseagleRecipient": "收件者 (以逗號分隔)",
+    "smseagleRecipientType": "收件者類型",
+    "smseagleContact": "聯絡人名稱",
+    "smseagleGroup": "群組名稱",
+    "smseagleTo": "電話號碼",
+    "smseagle": "SMSEagle",
+    "auto resolve": "自動解決",
+    "do nothing": "不進行任何操作",
+    "Auto resolve or acknowledged": "自動解決或標記已讀",
+    "Integration URL": "Integration URL",
+    "Integration Key": "Integration Key",
+    "wayToGetClickSendSMSToken": "您可以到 {0} 取得 API 使用者名稱和 API Key。",
+    "PushDeer Key": "PushDeer Key",
+    "onebotSafetyTips": "為了安全起見,必須設置存取 Token",
+    "onebotUserOrGroupId": "群組/使用者 ID",
+    "onebotPrivateMessage": "私人"
 }

From 76bdb62a5b2a3f1dd53444a860615d1115f27d80 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 13 Feb 2023 17:23:55 +0800
Subject: [PATCH 620/803] Update to 1.20.0

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

diff --git a/package.json b/package.json
index 5093e5d6..5d4652d6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.20.0-beta.0",
+    "version": "1.20.0",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -39,7 +39,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.19.6 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.20.0 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From 5bf00fbe0b754575f317211867edb0472e34a553 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 13 Feb 2023 17:40:25 +0800
Subject: [PATCH 621/803] Fix deploy-demo-server.js do not download the dist

---
 extra/deploy-demo-server.js | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/extra/deploy-demo-server.js b/extra/deploy-demo-server.js
index 210270f2..d5a517f9 100644
--- a/extra/deploy-demo-server.js
+++ b/extra/deploy-demo-server.js
@@ -33,6 +33,11 @@ const prompt = (query) => new Promise((resolve) => rl.question(query, resolve));
         });
         console.log(result.stdout + result.stderr);
 
+        result = await ssh.execCommand("npm run download-dist", {
+            cwd,
+        });
+        console.log(result.stdout + result.stderr);
+
         result = await ssh.execCommand("npm install --production", {
             cwd,
         });

From 6048bc5dfc253f6cbd411170e6bf035ee1124dad Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 14 Feb 2023 00:46:22 +0800
Subject: [PATCH 622/803] Revert #2083's change of healthcheck.js

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

diff --git a/extra/healthcheck.js b/extra/healthcheck.js
index 40691418..9b95cf26 100644
--- a/extra/healthcheck.js
+++ b/extra/healthcheck.js
@@ -19,17 +19,17 @@ if (sslKey && sslCert) {
 
 // If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available and the unspecified IPv4 address (0.0.0.0) otherwise.
 // Dual-stack support for (::)
-let hostname = process.env.UPTIME_KUMA_SERVICE_HOST || process.env.UPTIME_KUMA_HOST || "::";
+let hostname = process.env.UPTIME_KUMA_HOST;
 
 // Also read HOST if not *BSD, as HOST is a system environment variable in FreeBSD
 if (!hostname && !FBSD) {
     hostname = process.env.HOST;
 }
 
-const port = parseInt(process.env.UPTIME_KUMA_SERVICE_PORT || process.env.UPTIME_KUMA_PORT || process.env.PORT || 3001);
+const port = parseInt(process.env.UPTIME_KUMA_PORT || process.env.PORT || 3001);
 
 let options = {
-    host: hostname,
+    host: hostname || "127.0.0.1",
     port: port,
     timeout: 28 * 1000,
 };

From 33bb9f1ade4d4f819434fb62b01807c12bbd2799 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Tue, 14 Feb 2023 07:16:18 +0800
Subject: [PATCH 623/803] Feat: Add simple validation on input

---
 src/components/TagEditDialog.vue | 43 ++++++++++++++++++++++++++++++--
 src/components/settings/Tags.vue |  2 +-
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/src/components/TagEditDialog.vue b/src/components/TagEditDialog.vue
index b77e1286..79558994 100644
--- a/src/components/TagEditDialog.vue
+++ b/src/components/TagEditDialog.vue
@@ -12,7 +12,17 @@
                     <div class="modal-body">
                         <div class="mb-3">
                             <label for="tag-name" class="form-label">{{ $t("Name") }}</label>
-                            <input id="tag-name" v-model="tag.name" type="text" class="form-control" required>
+                            <input
+                                id="tag-name"
+                                v-model="tag.name"
+                                type="text"
+                                class="form-control"
+                                :class="{'is-invalid': nameInvalid}"
+                                required
+                            >
+                            <div class="invalid-feedback">
+                                {{ $t("Tag with this name already exist.") }}
+                            </div>
                         </div>
 
                         <div class="mb-3">
@@ -112,7 +122,11 @@ export default {
         updated: {
             type: Function,
             default: () => {},
-        }
+        },
+        existingTags: {
+            type: Array,
+            default: () => [],
+        },
     },
     data() {
         return {
@@ -132,6 +146,7 @@ export default {
             removingMonitor: [],
             addingMonitor: [],
             selectedAddMonitor: null,
+            nameInvalid: false,
         };
     },
 
@@ -165,6 +180,11 @@ export default {
                 this.selectedColor.color = to;
             }
         },
+        "tag.name"(to, from) {
+            if (to != null) {
+                this.validate();
+            }
+        },
         selectedColor(to, from) {
             if (to != null) {
                 this.tag.color = to.color;
@@ -212,6 +232,20 @@ export default {
             this.addingMonitor = [];
         },
 
+        /**
+         * Check for existing tags of the same name, set invalid input
+         * @returns {boolean} True if editing tag is valid
+         */
+        validate() {
+            this.nameInvalid = false;
+            const sameName = this.existingTags.find((existingTag) => existingTag.name === this.tag.name);
+            if (sameName != null && sameName.id !== this.tag.id) {
+                this.nameInvalid = true;
+                return false;
+            }
+            return true;
+        },
+
         /**
          * Load tag information for display in the edit dialog
          * @param {Object} tag tag object to edit
@@ -243,6 +277,11 @@ export default {
             this.processing = true;
             let editResult = true;
 
+            if (!this.validate()) {
+                this.processing = false;
+                return;
+            }
+
             if (this.tag.id == null) {
                 await this.addTagAsync(this.tag).then((res) => {
                     if (!res.ok) {
diff --git a/src/components/settings/Tags.vue b/src/components/settings/Tags.vue
index d54d0c49..71ad9b7b 100644
--- a/src/components/settings/Tags.vue
+++ b/src/components/settings/Tags.vue
@@ -23,7 +23,7 @@
             </div>
         </div>
 
-        <TagEditDialog ref="tagEditDialog" :updated="tagsUpdated" />
+        <TagEditDialog ref="tagEditDialog" :updated="tagsUpdated" :existing-tags="tagsList" />
         <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteTag">
             {{ $t("confirmDeleteTagMsg") }}
         </Confirm>

From d9316f43ac26ff757680152aab5187959cf6b119 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Tue, 14 Feb 2023 08:51:55 +0800
Subject: [PATCH 624/803] Update README: Add npm as requirement (#2773)

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

diff --git a/README.md b/README.md
index cdefe6a0..a67007ce 100644
--- a/README.md
+++ b/README.md
@@ -51,6 +51,7 @@ Uptime Kuma is now running on http://localhost:3001
 
 Required Tools: 
 - [Node.js](https://nodejs.org/en/download/) >= 14
+- [npm](https://docs.npmjs.com/cli/) >= 7
 - [Git](https://git-scm.com/downloads) 
 - [pm2](https://pm2.keymetrics.io/) - For running Uptime Kuma in the background
 

From c19dcdba44002f74c0aa1451f511df18fec24cfd Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 14 Feb 2023 12:31:19 +0800
Subject: [PATCH 625/803] Add reminder to keep healthcheck.js

---
 extra/healthcheck.js | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/extra/healthcheck.js b/extra/healthcheck.js
index 9b95cf26..5e06c212 100644
--- a/extra/healthcheck.js
+++ b/extra/healthcheck.js
@@ -1,4 +1,8 @@
 /*
+ * ⚠️ ⚠️ ⚠️ ⚠️ Due to the weird issue in Portainer that the healthcheck script is still pointing to this script for unknown reason.
+ * IT CANNOT BE DROPPED, even though it looks like it is not used.
+ * See more: https://github.com/louislam/uptime-kuma/issues/2774#issuecomment-1429092359
+ *
  * ⚠️ Deprecated: Changed to healthcheck.go, it will be deleted in the future.
  * This script should be run after a period of time (180s), because the server may need some time to prepare.
  */

From cd18b96f69a24fc7ea98306d6f5867c9694e0dd3 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Tue, 14 Feb 2023 16:43:40 +0000
Subject: [PATCH 626/803] Added check to ensure backup exists when restoring
 (#2779)

A check to ensure that the backup database exists before deleting the
current database.

Fixes #2778

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/database.js | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/server/database.js b/server/database.js
index 19c09a00..449f16d5 100644
--- a/server/database.js
+++ b/server/database.js
@@ -496,6 +496,16 @@ class Database {
             const shmPath = Database.path + "-shm";
             const walPath = Database.path + "-wal";
 
+            // Make sure we have a backup to restore before deleting old db
+            if (
+                !fs.existsSync(this.backupPath)
+                && !fs.existsSync(shmPath)
+                && !fs.existsSync(walPath)
+            ) {
+                log.error("db", "Backup file not found! Leaving database in failed state.");
+                process.exit(1);
+            }
+
             // Delete patch failed db
             try {
                 if (fs.existsSync(Database.path)) {

From 0d6a8b2101449d394f7a9e44b3626d0a8fd37f37 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Tue, 14 Feb 2023 18:23:51 +0000
Subject: [PATCH 627/803] Added more options for confirm modal

The ability to set the title of the modal has been added, as well as
custom callbacks for the no option.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/components/Confirm.vue | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/components/Confirm.vue b/src/components/Confirm.vue
index 1a1addc6..4bc2217c 100644
--- a/src/components/Confirm.vue
+++ b/src/components/Confirm.vue
@@ -4,7 +4,7 @@
             <div class="modal-content">
                 <div class="modal-header">
                     <h5 id="exampleModalLabel" class="modal-title">
-                        {{ $t("Confirm") }}
+                        {{ title || $t("Confirm") }}
                     </h5>
                     <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" />
                 </div>
@@ -15,7 +15,7 @@
                     <button type="button" class="btn" :class="btnStyle" data-bs-dismiss="modal" @click="yes">
                         {{ yesText }}
                     </button>
-                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
+                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" @click="no">
                         {{ noText }}
                     </button>
                 </div>
@@ -44,8 +44,13 @@ export default {
             type: String,
             default: "No",
         },
+        /** Title to show on modal. Defaults to translated version of "Config" */
+        title: {
+            type: String,
+            default: null,
+        }
     },
-    emits: [ "yes" ],
+    emits: [ "yes", "no" ],
     data: () => ({
         modal: null,
     }),
@@ -63,6 +68,12 @@ export default {
         yes() {
             this.$emit("yes");
         },
+        /**
+         * @emits string "no" Notify the parent when No is pressed
+         */
+        no() {
+            this.$emit("no");
+        }
     },
 };
 </script>

From aad087caac48d5615676531d64de8bd4225406ac Mon Sep 17 00:00:00 2001
From: Jonne Saloranta <72470168+JonneSaloranta@users.noreply.github.com>
Date: Tue, 14 Feb 2023 20:34:00 +0200
Subject: [PATCH 628/803] Added Finnish language translation (#2770)

* Added Finnish language translation

* Changed fi-FI to fi
---
 src/i18n.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/i18n.js b/src/i18n.js
index f57408e4..c0c07797 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -15,6 +15,7 @@ const languageList = {
     "fa": "Farsi",
     "pt-PT": "Português (Portugal)",
     "pt-BR": "Português (Brasileiro)",
+    "fi": "Suomi",
     "fr-FR": "Français (France)",
     "hu": "Magyar",
     "hr-HR": "Hrvatski",

From d1175ff471ff814e652f48cb97132dae51939037 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 15 Feb 2023 02:50:49 +0800
Subject: [PATCH 629/803] Fix #2777

---
 server/util-server.js | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index edce2890..e099f673 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -292,14 +292,23 @@ exports.postgresQuery = function (connectionString, query) {
                 client.end();
             } else {
                 // Connected here
-                client.query(query, (err, res) => {
-                    if (err) {
-                        reject(err);
-                    } else {
-                        resolve(res);
+                try {
+                    // No query provided by user, use SELECT 1
+                    if (!query || (typeof query === "string" && query.trim() === "")) {
+                        query = "SELECT 1";
                     }
-                    client.end();
-                });
+
+                    client.query(query, (err, res) => {
+                        if (err) {
+                            reject(err);
+                        } else {
+                            resolve(res);
+                        }
+                        client.end();
+                    });
+                } catch (e) {
+                    reject(e);
+                }
             }
         });
 

From 7d363ea1469bb651de4ffaf641d8053fa98629be Mon Sep 17 00:00:00 2001
From: darkslash#2558 <janisschelling@protonmail.com>
Date: Tue, 14 Feb 2023 19:08:51 +0000
Subject: [PATCH 630/803] Translated using Weblate (Japanese)

Currently translated at 28.1% (196 of 697 strings)

Added translation using Weblate (Chinese (Literary))

Added translation using Weblate (Mongolian)

Co-authored-by: darkslash#2558 <janisschelling@protonmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ja/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ja.json  | 23 ++++++++++++++++++++++-
 src/lang/lzh.json |  1 +
 src/lang/mn.json  |  1 +
 3 files changed, 24 insertions(+), 1 deletion(-)
 create mode 100644 src/lang/lzh.json
 create mode 100644 src/lang/mn.json

diff --git a/src/lang/ja.json b/src/lang/ja.json
index 3de54074..06f0d3c3 100644
--- a/src/lang/ja.json
+++ b/src/lang/ja.json
@@ -176,5 +176,26 @@
     "Gateway Type": "ゲートウェイの種類",
     "Game": "ゲーム",
     "Help": "ヘルプ",
-    "Maintenance": "メンテナンス"
+    "Maintenance": "メンテナンス",
+    "resendDisabled": "再送信不可",
+    "Schedule maintenance": "メンテナンスのスケジュール",
+    "Affected Monitors": "影響を受けるモニター",
+    "Pick Affected Monitors...": "影響を受けるモニターを選択…",
+    "Start of maintenance": "メンテナンス開始",
+    "General Monitor Type": "汎用モニタータイプ",
+    "resendEveryXTimes": "{0}回ごとに再送信",
+    "markdownSupported": "マークダウン構文がサポートされています",
+    "All Status Pages": "すべてのステータス ページ",
+    "Monitor": "モニター |モニター",
+    "Resend Notification if Down X times consequently": "ダウンX回連続で通知再送",
+    "Push URL": "プッシュ URL",
+    "needPushEvery": "{0} 秒ごとにこの URL を呼び出す必要があります。",
+    "pushOptionalParams": "オプションのパラメーター: {0}",
+    "disableauth.message1": "<strong>認証を無効</strong>にしてもよろしいですか?",
+    "disableauth.message2": "これは、Cloudflare Access、Authelia、またはその他の認証メカニズムなど、Uptime Kuma の前に<strong>サードパーティ認証を実装するシナリオ向けに設計されています</strong>。",
+    "Please use this option carefully!": "このオプションは慎重に使用してください。",
+    "Primary Base URL": "プライマリ ベース URL",
+    "statusMaintenance": "メンテナンス",
+    "Passive Monitor Type": "パッシブモニタータイプ",
+    "Specific Monitor Type": "特定のモニターの種類"
 }
diff --git a/src/lang/lzh.json b/src/lang/lzh.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/src/lang/lzh.json
@@ -0,0 +1 @@
+{}
diff --git a/src/lang/mn.json b/src/lang/mn.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/src/lang/mn.json
@@ -0,0 +1 @@
+{}

From a518188e6f9dcb87c49382ed4fe3b4c68609c3c3 Mon Sep 17 00:00:00 2001
From: victorpahuus <dibbohh@gmail.com>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 631/803] Translated using Weblate (Danish)

Currently translated at 62.9% (439 of 697 strings)

Co-authored-by: victorpahuus <dibbohh@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/da/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/da-DK.json | 90 ++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 88 insertions(+), 2 deletions(-)

diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
index 9d6f0574..1b0fe210 100644
--- a/src/lang/da-DK.json
+++ b/src/lang/da-DK.json
@@ -29,7 +29,7 @@
     "Delete": "Slet",
     "Current": "Aktuelt",
     "Uptime": "Oppetid",
-    "Cert Exp.": "Certifikatets udløb",
+    "Cert Exp.": "Certifikatets udløb.",
     "day": "Dag | Dage",
     "-day": "-Dage",
     "hour": "Timer",
@@ -358,5 +358,91 @@
     "High": "Høj",
     "Recipient Number": "Modtager Nummer",
     "From Name/Number": "Fra Navn/Nummer",
-    "Help": "Hjælp"
+    "Help": "Hjælp",
+    "Please use this option carefully!": "Brug venligst denne funktion med forsigtighed!",
+    "disableauth.message1": "Er du sikker på, at du vil <strong>deaktivere authentication</strong>?",
+    "successMessage": "Succesmeddelelse",
+    "error": "fejl",
+    "critical": "kritisk",
+    "Customize": "Tilpas",
+    "Custom Footer": "Brugerdefineret Footer",
+    "Custom CSS": "Brugerdefineret CSS",
+    "deleteStatusPageMsg": "Er du sikker på, at du vil slette denne statusside?",
+    "Proxies": "Proxies",
+    "default": "Standard",
+    "enabled": "Aktiveret",
+    "setAsDefault": "Indstil som standard",
+    "Certificate Chain": "Certificate Chain",
+    "Days Remaining:": "Dage tilbage:",
+    "No status pages": "Ingen statussider",
+    "Proxy": "Proxy",
+    "default: notify all devices": "standard: underretter alle enheder",
+    "Automations can optionally be triggered in Home Assistant:": "Automatiseringer kan valgfrit udløses i Home Assistant:",
+    "Trigger type:": "Trigger type:",
+    "Event type:": "Event type:",
+    "Event data:": "Event data:",
+    "Frontend Version": "Frontend Version",
+    "or": "eller",
+    "Notification Service": "Notifikationstjeneste",
+    "Domain": "Domæne",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Ændre Tag",
+    "Learn More": "Lær mere",
+    "Schedule maintenance": "Planlæg vedligeholdelse",
+    "Invalid": "Ugyldig",
+    "User": "Bruger",
+    "Installed": "Installeret",
+    "Not installed": "Ikke installeret",
+    "Running": "Køre",
+    "Not running": "Køre ikke",
+    "Remove Token": "Fjern Token",
+    "Start": "Start",
+    "Stop": "Stop",
+    "Add New Status Page": "Tilføj ny statusside",
+    "Next": "Næste",
+    "No Proxy": "Ingen proxy",
+    "New Status Page": "Ny statusside",
+    "Page Not Found": "Side blev ikke fundet",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Backup",
+    "About": "Om",
+    "cloudflareWebsite": "Cloudflare hjemmeside",
+    "Message:": "Besked:",
+    "HTTP Headers": "HTTP Headers",
+    "Trust Proxy": "Trust Proxy",
+    "For example: nginx, Apache and Traefik.": "For eksempel: nginx, Apache og Traefik.",
+    "Please read": "Læs venligst",
+    "Show Powered By": "Vis Powered By",
+    "Domain Names": "Domænenavne",
+    "signedInDisp": "Logget ind som {0}",
+    "Certificate Expiry Notification": "Meddelelse om udløbsdato for certifikatet",
+    "API Username": "API Brugernavn",
+    "API Key": "API Key",
+    "Steam Game Server": "Steam Game Server",
+    "What you can try:": "Hvad du kan prøve:",
+    "Go back to the previous page.": "Gå tilbage til forrige side.",
+    "Coming Soon": "Kommer snart",
+    "settingsCertificateExpiry": "Udløb af TLS-certifikat",
+    "Setup Docker Host": "Opsæt Docker Host",
+    "Connection Type": "Forbindelsestype",
+    "Docker Daemon": "Docker Daemon",
+    "socket": "Socket",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Navn / ID",
+    "Packet Size": "Pakke størrelse",
+    "Home Assistant URL": "Home Assistant URL",
+    "Frontend Version do not match backend version!": "Frontend versionen stemmer ikke overens med backend versionen!",
+    "Optional": "Valgfri",
+    "HomeAssistant": "Home Assistant",
+    "disableauth.message2": "Den er beregnet til scenarier <strong>hvor du har tænkt dig at implementere tredjepartsgodkendelse</strong> foran Uptime Kuma, f.eks. Cloudflare Access, Authelia eller andre godkendelsesmekanismer.",
+    "deleteProxyMsg": "Er du sikker på, at du vil slette denne proxy for alle monitors?",
+    "Valid": "Gyldig",
+    "Don't know how to get the token? Please read the guide:": "Ved du ikke, hvordan du får fat i din Token? Læs venligst guiden:",
+    "Subject:": "Emne:",
+    "Footer Text": "Footer tekst",
+    "Using a Reverse Proxy?": "Bruger du en Reverse Proxy?",
+    "deleteDockerHostMsg": "Er du sikker på, at du vil slette denne docker host for alle monitors?",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts"
 }

From 379d54e5209913b31c3b66ac714e76e2854372d9 Mon Sep 17 00:00:00 2001
From: Denys Konovalov <privat@denyskon.de>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 632/803] Translated using Weblate (German)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Denys Konovalov <privat@denyskon.de>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/de-DE.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 2d4c0e30..a4081c4b 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -165,7 +165,7 @@
     "Pink": "Pink",
     "Search...": "Suchen…",
     "Heartbeat Retry Interval": "Überprüfungsintervall",
-    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn Inaktiv X mal hintereinander",
+    "Resend Notification if Down X times consequently": "Benachrichtigung erneut senden, wenn inaktiv X Mal hintereinander",
     "retryCheckEverySecond": "Alle {0} Sekunden neu versuchen",
     "resendEveryXTimes": "Erneut versenden alle {0} mal",
     "resendDisabled": "Erneut versenden deaktiviert",
@@ -275,7 +275,7 @@
     "Read more": "Weiterlesen",
     "appriseInstalled": "Apprise ist installiert.",
     "appriseNotInstalled": "Apprise ist nicht installiert. {0}",
-    "Access Token": "Access Token",
+    "Access Token": "Zugriffstoken",
     "Channel access token": "Channel access token",
     "Line Developers Console": "Zeile Entwickler Konsole",
     "lineDevConsoleTo": "Line Developers Console - {0}",
@@ -553,9 +553,9 @@
     "socket": "Socket",
     "tcp": "TCP / HTTP",
     "Docker Container": "Docker Container",
-    "Container Name / ID": "Container Name / ID",
-    "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts",
+    "Container Name / ID": "Container-Bezeichnung / ID",
+    "Docker Host": "Docker-Host",
+    "Docker Hosts": "Docker-Hosts",
     "ntfy Topic": "ntfy Thema",
     "Domain": "Domain",
     "Workstation": "Workstation",
@@ -574,7 +574,7 @@
     "Event type:": "Ereignistyp:",
     "Event data:": "Ereignis daten:",
     "Then choose an action, for example switch the scene to where an RGB light is red.": "Dann eine Aktion wählen, zum Beispiel eine Scene wählen in der ein RGB Licht rot ist.",
-    "Frontend Version": "Frontend Version",
+    "Frontend Version": "Frontend-Version",
     "Frontend Version do not match backend version!": "Die Frontend Version stimmt nicht mit der backend version überein!",
     "Maintenance": "Wartung",
     "statusMaintenance": "Wartung",

From 31fa074ffcf473fbd5e54159a685a4a36a74f594 Mon Sep 17 00:00:00 2001
From: Luiz Felipe Arcos Campos <dino.bsb@gmail.com>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 633/803] Translated using Weblate (Portuguese (Brazil))

Currently translated at 38.8% (271 of 697 strings)

Co-authored-by: Luiz Felipe Arcos Campos <dino.bsb@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pt_BR/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/pt-BR.json | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/lang/pt-BR.json b/src/lang/pt-BR.json
index b7ebdbd4..56c8f4f4 100644
--- a/src/lang/pt-BR.json
+++ b/src/lang/pt-BR.json
@@ -249,7 +249,7 @@
     "enabled": "Ativado",
     "setAsDefault": "Definir como padrão",
     "Primary Base URL": "URL base principal",
-    "Resend Notification if Down X times consequently": "Reenviar notificação se OFFLINE X vezes consecutivamente",
+    "Resend Notification if Down X times consequently": "Reenviar Notificação se OFFLINE X vezes consecutivamente",
     "pushOptionalParams": "Parâmetros opcionais: {0}",
     "webhookFormDataDesc": "{multipart} é bom para PHP. O JSON precisará ser analisado com {decodeFunction}",
     "HeadersInvalidFormat": "Os cabeçalhos da solicitação não são um JSON válidos: ",
@@ -269,5 +269,16 @@
     "Start of maintenance": "Iniciar manutenção",
     "All Status Pages": "Todas as Status Pages",
     "Method": "Método",
-    "General Monitor Type": "Tipo de monitoramento geral"
+    "General Monitor Type": "Tipo de monitoramento geral",
+    "markdownSupported": "Sintaxe Markdown suportada",
+    "emojiCheatSheet": "Folha de dicas de emojis: {0}",
+    "topic": "Tema",
+    "topicExplanation": "Tópico MQTT para monitorar",
+    "successMessageExplanation": "Mensagem MQTT que será considerada como sucesso",
+    "Content Type": "Tipo de Conteúdo",
+    "Shrink Database": "Encolher Banco de Dados",
+    "Content": "Conteúdo",
+    "Pick a RR-Type...": "Escolha um tipo RR…",
+    "Pick Accepted Status Codes...": "Escolha Códigos de Status Aceitos…",
+    "Pick Affected Monitors...": "Escolher Monitores Afetados…"
 }

From 8afc55db4e659e5d9b402327f3061576dd5dde61 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=96mer=20Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 634/803] Translated using Weblate (Turkish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Ömer Faruk Genç <omer@farukgenc.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 7091de1a..7fbf2948 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -74,7 +74,7 @@
     "Heartbeat Interval": "Servis Test Aralığı",
     "Retries": "Yeniden deneme",
     "Heartbeat Retry Interval": "Sağlık Durumları Tekrar Deneme Sıklığı",
-    "Resend Notification if Down X times consequently": "Sonuç olarak X kez düşerse bildirimi yeniden gönder",
+    "Resend Notification if Down X times consequently": "Art arda X kez düşerse bildirimi yeniden gönder",
     "Advanced": "Gelişmiş",
     "Upside Down Mode": "Ters/Düz Modu",
     "Max. Redirects": "Maksimum Yönlendirme",

From e3573ced65d40a2798db14dfe79a7f5c4f39f670 Mon Sep 17 00:00:00 2001
From: eltionb <eltion.it@gmail.com>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 635/803] Translated using Weblate (Albanian)

Currently translated at 3.2% (23 of 697 strings)

Added translation using Weblate (Albanian)

Co-authored-by: eltionb <eltion.it@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/sq/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/sq.json | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 src/lang/sq.json

diff --git a/src/lang/sq.json b/src/lang/sq.json
new file mode 100644
index 00000000..a513329a
--- /dev/null
+++ b/src/lang/sq.json
@@ -0,0 +1,25 @@
+{
+    "Settings": "Opsione",
+    "Dashboard": "FaqeKryesore",
+    "Help": "Ndihma",
+    "Language": "Gjuha",
+    "Appearance": "Paraqitja",
+    "Theme": "Theme",
+    "General": "Te pergjithshme",
+    "Game": "Loje",
+    "Primary Base URL": "ULR Baze Primare",
+    "List": "List",
+    "Add": "Shto",
+    "Add New Monitor": "Shto Monitor te Ri",
+    "Quick Stats": "Statistika Flash",
+    "Up": "Lart",
+    "Down": "Poshte",
+    "Pending": "Ne Pritje",
+    "statusMaintenance": "Mirembatje",
+    "Maintenance": "Mirembajtje",
+    "Unknown": "Panjohur",
+    "languageName": "Shqip",
+    "New Update": "Update i ri",
+    "Version": "Version",
+    "Check Update On GitHub": "Kontrollo Update ne GitHub"
+}

From fb2f7179e99069751fff747b0312e2efb9cfce81 Mon Sep 17 00:00:00 2001
From: Jonne Saloranta <saloranta.jonne@gmail.com>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 636/803] Translated using Weblate (Finnish)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Jonne Saloranta <saloranta.jonne@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fi/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fi.json | 593 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 592 insertions(+), 1 deletion(-)

diff --git a/src/lang/fi.json b/src/lang/fi.json
index 193a95c8..32454526 100644
--- a/src/lang/fi.json
+++ b/src/lang/fi.json
@@ -104,5 +104,596 @@
     "Discourage search engines from indexing site": "Estä hakukoneita indeksoimasta sivua",
     "disableauth.message1": "Oletko varma että haluat <strong>poistaa todennuksen käytöstä</strong>?",
     "Please use this option carefully!": "Käytä tätä vaihtoehtoa varoen!",
-    "Remember me": "Muista minut"
+    "Remember me": "Muista minut",
+    "languageName": "Englanti",
+    "Primary Base URL": "Ensisijainen perus-URL-osoite",
+    "pushOptionalParams": "Valinnaiset parametrit: {0}",
+    "Not available, please setup.": "Ei saatavilla, määritä ensin.",
+    "needPushEvery": "Sinun pitäisi kutsua tätä URL joka {0} sekuntti.",
+    "disableauth.message2": "Se on suunniteltu tilanteisiin <strong>jossa aiot käyttää kolmannen osapuolen todennnusta</strong> Uptime Kuma:n edessä, kuten Cloudflare Access, Authelia tai jotain muuta todennus mekanismia.",
+    "No Monitors, please": "Ei seuraimia, kiitos",
+    "Resolver Server": "Ratkaisija palvelin",
+    "Resource Record Type": "Resusrssi tallenne tyyppi",
+    "Last Result": "Viimeinen tulos",
+    "Create your admin account": "Luo sinun järjestelmänvalvoja käyttäjä",
+    "Repeat Password": "Toista salasana",
+    "Import Backup": "Tuo varmuuskopio",
+    "Export Backup": "Vie varmuuskopio",
+    "Export": "Vie",
+    "Import": "Tuo",
+    "respTime": "Vast. aika (ms)",
+    "notAvailableShort": "Ei käytössä",
+    "Default enabled": "Oletus käytössä",
+    "Apply on all existing monitors": "Aseta jokaiselle olemassa olevaan seuraimeen",
+    "Create": "Luo",
+    "Clear Data": "Tyhjennä data",
+    "Events": "Tapahtumat",
+    "Heartbeats": "Sydämensyke",
+    "Auto Get": "Automaattinen haku",
+    "Schedule maintenance": "Ajoita huolto",
+    "Affected Monitors": "Vaikutetut seuraimet",
+    "Pick Affected Monitors...": "Poimi vaikutetut seuraimet…",
+    "Start of maintenance": "Huollon aloitus",
+    "All Status Pages": "Kaikki tilanne sivut",
+    "Select status pages...": "Valitse tilanne sivu…",
+    "alertNoFile": "Valitse tuotava tiedosto.",
+    "alertWrongFileType": "Valitse JSON tiedosto.",
+    "Clear all statistics": "Tyhjennä kaikki tilastot",
+    "Skip existing": "Ohita olemassa oleva",
+    "Overwrite": "Päälle kirjoita",
+    "Options": "Vaihtoehdot",
+    "Keep both": "Pidä molemmat",
+    "Verify Token": "Vahvista tunnus",
+    "Setup 2FA": "Määritä 2FA",
+    "Enable 2FA": "Ota 2FA käyttöön",
+    "Disable 2FA": "Poista 2FA käytöstä",
+    "2FA Settings": "2FA asetukset",
+    "Two Factor Authentication": "kaksivaiheinen tunnistautuminen",
+    "Active": "Aktiivinen",
+    "Token": "Tokeni",
+    "Show URI": "Näytä URI",
+    "Tags": "Tunnisteet",
+    "Tag with this name already exist.": "Tunniste tällä nimellä on jo olemassa.",
+    "Tag with this value already exist.": "Tunniste tällä arvolla on jo olemassa.",
+    "color": "Väri",
+    "value (optional)": "Arvo (valinnainen)",
+    "Gray": "Harmaa",
+    "Red": "Punainen",
+    "Orange": "Oranssi",
+    "Green": "Vihreä",
+    "Indigo": "Indigo",
+    "Purple": "Purppura",
+    "Pink": "Vaaleanpunainen",
+    "Custom": "Mukautettu",
+    "Search...": "Etsi…",
+    "Avg. Ping": "kesk.arv. viive",
+    "Entry Page": "Sisääntulosivu",
+    "statusPageNothing": "Täällä ei ole mitään. Lisää ryhmä tai seurain.",
+    "No Services": "Ei palveluita",
+    "Partially Degraded Service": "Osittain heikentynyt palvelu",
+    "Degraded Service": "Heikentynyt palvelu",
+    "Add Group": "Lisää ryhmä",
+    "Add a monitor": "Lisää seurain",
+    "Edit Status Page": "Muokkaa tilanne sivua",
+    "Go to Dashboard": "Mene kojelaudalle",
+    "Status Page": "Tilanne sivu",
+    "Status Pages": "Tilanne sivut",
+    "here": "täällä",
+    "Required": "Vaadittu",
+    "webhook": "Webhookki",
+    "Post URL": "Lähetys URL",
+    "Content Type": "Sisältö tyyppi",
+    "webhookJsonDesc": "{0} on hyvä jokaisille modernilleille HTTP palvelimille kuten Express.js",
+    "webhookAdditionalHeadersTitle": "Lisä otsakkeet",
+    "webhookAdditionalHeadersDesc": "Asettaa lisäpäätteet, jotka on lähetetty webhookilla.",
+    "Webhook URL": "Webhookin URL",
+    "Application Token": "Sovellus tokeni",
+    "Server URL": "Palvelin URL",
+    "Priority": "Prioriteetti",
+    "emojiCheatSheet": "Emoji lunttilappu: {0}",
+    "Read more": "Lue lisää",
+    "appriseInstalled": "Apprise on asennettu.",
+    "appriseNotInstalled": "Apprisea ei ole asennettu. {0}",
+    "Method": "Menetelmä",
+    "Body": "Runko",
+    "Headers": "Otsikot",
+    "PushUrl": "Työntö URL",
+    "BodyInvalidFormat": "Pyynnön runko ei ole kelvollinen JSON: ",
+    "Monitor History": "Seuraa historiaa",
+    "PasswordsDoNotMatch": "Salasanat eivät täsmää.",
+    "records": "tallenteet",
+    "One record": "Yksi tallenne",
+    "Current User": "Nykyinen käyttäjä",
+    "topic": "Aihe",
+    "topicExplanation": "MQTT seurattava aihe",
+    "successMessage": "Onnistumis viesti",
+    "successMessageExplanation": "MQTT-viesti, jota pidetään onnistuneena",
+    "recent": "Viimeaikainen",
+    "Done": "Tehty",
+    "Info": "Tiedot",
+    "Security": "Turvallisuus",
+    "Steam API Key": "Steam API-avain",
+    "Shrink Database": "Pienennä tietokanta",
+    "Pick a RR-Type...": "Valitse RR-tyyppi…",
+    "Pick Accepted Status Codes...": "Valitse hyväksytyt tilakoodit…",
+    "Default": "Oletus",
+    "HTTP Options": "HTTP-asetukset",
+    "Create Incident": "Luo tapaus",
+    "Title": "Otsikko",
+    "Content": "Sisältö",
+    "Style": "Tyyli",
+    "info": "Tiedot",
+    "warning": "Varoitus",
+    "danger": "vaara",
+    "error": "virhe",
+    "critical": "kriittinen",
+    "primary": "ensisijainen",
+    "dark": "Tumma",
+    "Post": "Lähetä",
+    "Please input title and content": "Syötä otsikko ja sisältö",
+    "Created": "Luo",
+    "Last Updated": "Viimeksi päivitetty",
+    "Unpin": "Irroita",
+    "Switch to Dark Theme": "Vaihda tummaan teemaan",
+    "Show Tags": "Näytä tunnisteet",
+    "Hide Tags": "Piilota tunnisteet",
+    "Description": "Kuvaus",
+    "No monitors available.": "Ei seuraimia saatavilla.",
+    "Add one": "Lisää yksi",
+    "No Monitors": "Ei seuraimia",
+    "Untitled Group": "Nimetön ryhmä",
+    "Services": "Palvelut",
+    "Discard": "Hävitä",
+    "Cancel": "Peruuttaa",
+    "Customize": "Mukauta",
+    "Custom Footer": "Mukautettu alatunniste",
+    "Custom CSS": "Mukautettu CSS",
+    "deleteStatusPageMsg": "Haluatko varmasti poistaa tämän tilasivun?",
+    "Proxies": "Välityspalvelimet",
+    "default": "Oletus",
+    "enabled": "Käytössä",
+    "setAsDefault": "Oletusasetuksena",
+    "deleteProxyMsg": "Haluatko varmasti poistaa tämän välityspalvelimen kaikista seuraimista?",
+    "proxyDescription": "Välityspalvelimet on määritettävä seuraimelle toimiakseen.",
+    "enableProxyDescription": "Tämä välityspalvelin ei vaikuta valvontapyyntöihin ennen kuin se on aktivoitu. Voit hallita välityspalvelimen väliaikaista poistamista käytöstä kaikista seuraimista aktivointitilan perusteella.",
+    "setAsDefaultProxyDescription": "Tämä välityspalvelin on oletuksena käytössä uusissa seuraimissa. Voit silti poistaa välityspalvelimen käytöstä erikseen jokaisesta seuraimesta.",
+    "Certificate Chain": "Sertifikaattiketju",
+    "Valid": "Voimassa oleva",
+    "Invalid": "Pätemätön",
+    "User": "Käyttäjä",
+    "Installed": "Asennettu",
+    "Not installed": "Ei asennettu",
+    "Running": "Käynnissä",
+    "Not running": "Ei käynnissä",
+    "Remove Token": "Poista token",
+    "Start": "Käynnistä",
+    "Stop": "Pysäytä",
+    "Add New Status Page": "Lisää uusi tilasivu",
+    "Slug": "Slug",
+    "startOrEndWithOnly": "Aloita tai lopeta vain {0}",
+    "No consecutive dashes": "Ei peräkkäisiä viivoja",
+    "Next": "Seuraava",
+    "No Proxy": "Ei välityspalvelinta",
+    "Authentication": "Todennus",
+    "HTTP Basic Auth": "HTTP-perustodennus",
+    "Page Not Found": "Sivua ei löydetty",
+    "Reverse Proxy": "Käänteinen välityspalvelin",
+    "Backup": "Varmuuskopio",
+    "About": "Tietoja",
+    "cloudflareWebsite": "Cloudflare verkkosivusto",
+    "Message:": "Viesti:",
+    "Don't know how to get the token? Please read the guide:": "Etkö tiedä kuinka saada tunnus? Ole hyvä ja lue opas:",
+    "HTTP Headers": "HTTP-otsikot",
+    "Trust Proxy": "Luota välityspalvelimeen",
+    "Other Software": "Muut ohjelmistot",
+    "For example: nginx, Apache and Traefik.": "Esimerkiksi: nginx, Apache ja Traefik.",
+    "Please read": "Ole hyvä ja lue",
+    "Subject:": "Aihe:",
+    "Valid To:": "Voimassa:",
+    "Days Remaining:": "Päiviä jäljellä:",
+    "Issuer:": "Myöntäjä:",
+    "Fingerprint:": "Sormenjälki:",
+    "No status pages": "Ei tilasivuja",
+    "Domain Name Expiry Notification": "Verkkotunnuksen vanhenemisilmoitus",
+    "Proxy": "Välityspalvelin",
+    "Date Created": "Luomis päivämäärä",
+    "Footer Text": "Alatunnisteen teksti",
+    "Show Powered By": "Näytä \"voimanlähteenä\"",
+    "Domain Names": "Verkkotunnus nimet",
+    "signedInDisp": "Kirjautunut sisään käyttäjänä {0}",
+    "signedInDispDisabled": "Todennus poistettu käytöstä.",
+    "RadiusSecretDescription": "Asiakkaan ja palvelimen välinen yhteinen salaisuus",
+    "RadiusCalledStationIdDescription": "Kutsutun laitteen tunniste",
+    "RadiusCallingStationId": "Kutsuaseman tunnus",
+    "Certificate Expiry Notification": "Varmenteen vanhenemisilmoitus",
+    "API Username": "API-käyttäjänimi",
+    "API Key": "API-avain",
+    "Show update if available": "Näytä päivitys, jos saatavilla",
+    "Also check beta release": "Tarkista myös betaversio",
+    "Using a Reverse Proxy?": "Käytätkö käänteistä välityspalvelinta?",
+    "The slug is already taken. Please choose another slug.": "Slug on jo otettu. Ole hyvä ja valitse toinen slug.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusCalledStationId": "Kutsuttu aseman tunnus",
+    "Steam Game Server": "Steam pelipalvelin",
+    "Most likely causes:": "todennäköisimmät syyt:",
+    "The resource is no longer available.": "Resurssi ei ole enää saatavilla.",
+    "There might be a typing error in the address.": "Osoitteessa saattaa olla kirjoitusvirhe.",
+    "What you can try:": "Mitä voit kokeilla:",
+    "Retype the address.": "Kirjoita osoite uudelleen.",
+    "Go back to the previous page.": "Palaa edelliselle sivulle.",
+    "Coming Soon": "Tulossa pian",
+    "Connection String": "Yhteysmerkkijono",
+    "Query": "Tiedustelu",
+    "settingsCertificateExpiry": "TLS-sertifikaatin vanheneminen",
+    "certificationExpiryDescription": "HTTPS-seuraimet käynnistävät ilmoituksen, kun TLS-varmenne vanhenee:",
+    "Setup Docker Host": "Asenna Docker-isäntä",
+    "Connection Type": "Yhteystyyppi",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker-kontti",
+    "Container Name / ID": "Säilön nimi/tunnus",
+    "Docker Host": "Docker-isäntä",
+    "Docker Hosts": "Docker-isännät",
+    "Domain": "Verkkotunnus",
+    "Workstation": "Työasema",
+    "socket": "kanta",
+    "Packet Size": "Paketin koko",
+    "telegram": "Telegram",
+    "ZohoCliq": "ZohoCliq",
+    "Bot Token": "Botti tokeni",
+    "wayToGetTelegramToken": "Voit saada tunnuksen osoitteesta {0}.",
+    "Chat ID": "Chat-tunnus",
+    "wayToGetTelegramChatID": "Saat chat-tunnuksesi lähettämällä viestin botille ja siirtymällä tähän URL-osoitteeseen nähdäksesi chat_id:",
+    "YOUR BOT TOKEN HERE": "BOT TOKENISI TÄHÄN",
+    "chatIDNotFound": "Chat ID:tä ei löydy; lähetä ensin viesti tälle botille",
+    "disableCloudflaredNoAuthMsg": "Olet No Auth -tilassa, salasanaa ei tarvita.",
+    "trustProxyDescription": "Luota \"X-Forwarded-*\"-otsikoihin. Jos haluat saada oikean asiakas-IP:n ja Uptime Kumasi on välityspalvelimen, kuten Nginx tai Apache, takana, sinun tulee ottaa tämä käyttöön.",
+    "wayToGetLineNotifyToken": "Voit saada käyttötunnuksen osoitteesta {0}",
+    "Examples": "Esimerkkejä",
+    "Home Assistant URL": "Home Assistantin URL-osoite",
+    "Long-Lived Access Token": "Pitkäikäinen pääsytunnus",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Pitkäikäinen pääsytunnus voidaan luoda napsauttamalla profiilisi nimeä (vasemmalla alareunassa) ja vierittämällä alas ja napsauttamalla sitten Luo tunnus. ",
+    "Notification Service": "Ilmoituspalvelu",
+    "default: notify all devices": "oletus: Ilmoita kaikille laitteille",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Luettelo ilmoituspalveluista löytyy Home Assistantin kohdasta \"Kehittäjätyökalut > Palvelut\". Hae hakusanalla \"ilmoitus\" löytääksesi laitteesi/puhelimesi nimen.",
+    "Automations can optionally be triggered in Home Assistant:": "Automaatiot voidaan vaihtoehtoisesti laukaista Home Assistantissa:",
+    "Trigger type:": "Triggerin tyyppi:",
+    "Event type:": "Tapahtumatyyppi:",
+    "Frontend Version": "Käyttöliittymän versio",
+    "Frontend Version do not match backend version!": "Käyttöliittymän versio ei vastaa taustaversiota!",
+    "backupRecommend": "Varmuuskopioi asema tai tietokansio (./data/) suoraan sen sijaan.",
+    "Optional": "Vapaaehtoinen",
+    "squadcast": "Squadcast",
+    "or": "tai",
+    "recurringInterval": "Aikaväli",
+    "Recurring": "Toistuva",
+    "strategyManual": "Aktiivinen/ei-aktiivinen manuaalisesti",
+    "warningTimezone": "Se käyttää palvelimen aikavyöhykettä",
+    "weekdayShortMon": "Ma",
+    "weekdayShortTue": "Ti",
+    "weekdayShortWed": "Ke",
+    "weekdayShortThu": "To",
+    "weekdayShortFri": "Pe",
+    "weekdayShortSat": "La",
+    "weekdayShortSun": "Su",
+    "dayOfWeek": "Viikonpäivä",
+    "dayOfMonth": "Kuukauden päivä",
+    "lastDay": "Viimeinen päivä",
+    "lastDay1": "Kuukauden viimeinen päivä",
+    "lastDay2": "Kuukauden toiseksi viimeinen päivä",
+    "lastDay3": "Kuukauden 3. viimeinen päivä",
+    "No Maintenance": "Ei huoltoa",
+    "pauseMaintenanceMsg": "Haluatko varmasti keskeyttää?",
+    "maintenanceStatus-under-maintenance": "Huollossa",
+    "maintenanceStatus-inactive": "Epäaktiivinen",
+    "maintenanceStatus-scheduled": "Aikataulutettu",
+    "maintenanceStatus-ended": "Päättyi",
+    "maintenanceStatus-unknown": "Tuntematon",
+    "Display Timezone": "Näytä aikavyöhyke",
+    "Server Timezone": "Palvelimen aikavyöhyke",
+    "statusPageMaintenanceEndDate": "Loppu",
+    "Enable": "Ota käyttöön",
+    "Disable": "Poista käytöstä",
+    "Single Maintenance Window": "Yksi huoltoikkuna",
+    "Maintenance Time Window of a Day": "Päivän huoltoaikaikkuna",
+    "Effective Date Range": "Voimassa oleva ajanjakso",
+    "Schedule Maintenance": "Ajoita huolto",
+    "Date and Time": "Päivämäärä ja aika",
+    "DateTime Range": "Päivämäärä-aika-alue",
+    "loadingError": "Tietoja ei voi noutaa, yritä myöhemmin uudelleen.",
+    "plugin": "Lisäosa | Lisäosat",
+    "install": "Asenna",
+    "installing": "Asennetaan",
+    "uninstall": "Poista asennus",
+    "uninstalling": "Poistetaan asennusta",
+    "smtp": "Sähköposti (SMTP)",
+    "secureOptionNone": "Ei mitään / STARTTLS (25 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "Ohita TLS-virhe",
+    "From Email": "Sähköpostista",
+    "emailCustomSubject": "Mukautettu aihe",
+    "To Email": "Sähköpostiin",
+    "smtpCC": "CC",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhookin URL-osoite",
+    "Bot Display Name": "Botin näyttönimi",
+    "Prefix Custom Message": "Mukautetun viestin etuliite",
+    "Hello @everyone is...": "Hei {'@'}kaikki ovat…",
+    "wayToGetTeamsURL": "Voit oppia luomaan webhookin URL-osoitteen {0}.",
+    "wayToGetZohoCliqURL": "Voit oppia luomaan webhookin URL-osoitteen {0}.",
+    "wayToCheckSignalURL": "Voit tarkistaa tämän URL-osoitteen nähdäksesi, kuinka se määritetään:",
+    "Number": "Numero",
+    "Recipients": "Vastaanottajat",
+    "Access Token": "Käyttöoikeustunnus",
+    "Channel access token": "Kanavan käyttöoikeustunnus",
+    "Basic Settings": "Perus asetukset",
+    "User ID": "käyttäjätunnus",
+    "Messaging API": "Viestintä API",
+    "Line Developers Console": "Line Developers Console",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "dataRetentionTimeError": "Säilytysajan on oltava 0 tai suurempi",
+    "infiniteRetention": "Aseta arvoon 0, jos haluat loputtoman säilytyksen.",
+    "confirmDeleteTagMsg": "Haluatko varmasti poistaa tämän tunnisteen? Tähän tunnisteeseen liittyviä näyttöjä ei poisteta.",
+    "enableGRPCTls": "Salli lähettää gRPC-pyyntö TLS-yhteydellä",
+    "grpcMethodDescription": "Menetelmän nimi muunnetaan cammelCase-muotoon, kuten sayHello, check jne.",
+    "acceptedStatusCodesDescription": "Valitse tilakoodit, jotka katsotaan onnistuneeksi vastaukseksi.",
+    "deleteMonitorMsg": "Haluatko varmasti poistaa tämän seuraimen?",
+    "deleteMaintenanceMsg": "Haluatko varmasti poistaa tämän huollon?",
+    "deleteNotificationMsg": "Haluatko varmasti poistaa tämän ilmoituksen kaikista seuraimista?",
+    "dnsPortDescription": "DNS-palvelimen portti. Oletusarvo on 53. Voit vaihtaa porttia milloin tahansa.",
+    "rrtypeDescription": "Valitse valvottava RR-tyyppi",
+    "pauseMonitorMsg": "Haluatko varmasti keskeyttää?",
+    "clearHeartbeatsMsg": "Haluatko varmasti poistaa kaikki tämän seuraimen sydämenlyönnit?",
+    "confirmImportMsg": "Haluatko varmasti tuoda varmuuskopion? Varmista, että olet valinnut oikean tuontivaihtoehdon.",
+    "twoFAVerifyLabel": "Anna tunnuksesi vahvistaaksesi 2FA:",
+    "tokenValidSettingsMsg": "Token on voimassa! Voit nyt tallentaa 2FA-asetukset.",
+    "confirmEnableTwoFAMsg": "Haluatko varmasti ottaa 2FA:n käyttöön?",
+    "confirmDisableTwoFAMsg": "Haluatko varmasti poistaa 2FA:n käytöstä?",
+    "recurringIntervalMessage": "Juokse kerran päivässä | Suorita kerran {0} päivässä",
+    "affectedMonitorsDescription": "Valitse seuraimet, joihin nykyinen huolto vaikuttaa",
+    "affectedStatusPages": "Näytä tämä huoltoviesti valituilla tilasivuilla",
+    "atLeastOneMonitor": "Valitse vähintään yksi seurain, johon vaikuttaa",
+    "notificationDescription": "Ilmoitukset on määritettävä seuraimelle toimiakseen.",
+    "keywordDescription": "Hae avainsanaa tavallisessa HTML- tai JSON-vastauksessa. Haussa kirjainkoolla on merkitystä.",
+    "backupDescription": "Voit varmuuskopioida kaikki näytöt ja ilmoitukset JSON-tiedostoon.",
+    "backupDescription2": "Huomaa: historia- ja tapahtumatiedot eivät sisälly.",
+    "octopushLogin": "\"Kirjaudu\" ohjauspaneelin HTTP API -tunnistetiedoista",
+    "promosmsLogin": "API-kirjautumisnimi",
+    "promosmsPassword": "API-salasana",
+    "pushoversounds pushover": "Työnnä yli (oletus)",
+    "pushoversounds bike": "Pyörä",
+    "pushoversounds bugle": "Merkkitorvi",
+    "pushoversounds cashregister": "Kassakone",
+    "pushoversounds classical": "Klassinen",
+    "pushoversounds cosmic": "Kosminen",
+    "pushoversounds falling": "Putoaminen",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "Saapuva",
+    "pushoversounds intermission": "Väliaika",
+    "pushoversounds magic": "Taika",
+    "pushoversounds mechanical": "Mekaaninen",
+    "pushoversounds pianobar": "Piano Baari",
+    "pushoversounds spacealarm": "Avaruushälytys",
+    "pushoversounds tugboat": "Hinaaja",
+    "pushoversounds alien": "Avaruusolio hälytys (pitkä)",
+    "pushoversounds climb": "Kiipeily (pitkä)",
+    "pushoversounds persistent": "Pysyvä (pitkä)",
+    "pushoversounds updown": "Ylös Alas (pitkä)",
+    "pushoversounds vibrate": "Vain värinä",
+    "pushoversounds none": "Ei mitään (hiljainen)",
+    "pushyAPIKey": "Salainen API-avain",
+    "pushyToken": "Laitteen tunnus",
+    "discord": "Discord",
+    "teams": "Microsoft Teams",
+    "signal": "Signal",
+    "gotify": "Gotify",
+    "slack": "Slack",
+    "rocket.chat": "Rocket.Chat",
+    "pushy": "Päällekäyvä",
+    "PushByTechulus": "Techuluksen työntö",
+    "octopush": "Mustekala",
+    "promosms": "PromoSMS",
+    "clicksendsms": "ClickSend SMS",
+    "lunasea": "LunaSea",
+    "GoogleChat": "Google Chat (vain Google Workspace)",
+    "Kook": "Kook",
+    "wayToGetKookGuildID": "Ota 'Kehittäjätila' käyttöön Kook-asetuksissa ja napsauta kiltaa hiiren kakkospainikkeella saadaksesi sen tunnuksen",
+    "Guild ID": "Killan tunnus",
+    "line": "Line Messenger",
+    "mattermost": "Mattermost",
+    "User Key": "Käyttäjäavain",
+    "Device": "Laite",
+    "Message Title": "Viestin otsikko",
+    "More info on:": "Lisätietoja: {0}",
+    "pushoverDesc2": "Jos haluat lähettää ilmoituksia eri laitteille, täytä Laite-kenttä.",
+    "SMS Type": "SMS-tyyppi",
+    "octopushTypePremium": "Premium (nopea - suositellaan hälytykseen)",
+    "octopushTypeLowCost": "Alhaiset kustannukset (hidas - joskus operaattori estää)",
+    "checkPrice": "Tarkista kohteen {0} hinnat:",
+    "apiCredentials": "API-tunnistetiedot",
+    "Check octopush prices": "Tarkista octopush hinnat {0}.",
+    "octopushPhoneNumber": "Puhelinnumero (Intl-muoto, esim.: +33612345678) ",
+    "octopushSMSSender": "Tekstiviestin lähettäjän nimi: 3-11 aakkosnumeerista merkkiä ja välilyönti (a-zA-Z0-9)",
+    "LunaSea Device ID": "LunaSea laitetunnus",
+    "Apprise URL": "Apprise URL-osoite",
+    "Example:": "Esimerkki: {0}",
+    "Read more:": "Lue lisää: {0}",
+    "Status:": "Tila: {0}",
+    "Strategy": "strategia",
+    "Free Mobile User Identifier": "Ilmainen mobiilikäyttäjätunnus",
+    "Enable TLS": "Ota TLS käyttöön",
+    "Proto Service Name": "Proto-palvelun nimi",
+    "Proto Method": "Proto-menetelmä",
+    "Proto Content": "Proto-sisältö",
+    "Economy": "Talous",
+    "Lowcost": "Halpa",
+    "high": "korkea",
+    "SendKey": "LähetäAvain",
+    "SMSManager API Docs": "SMSManager API Dokumentointi ",
+    "Gateway Type": "Yhdyskäytävän tyyppi",
+    "SMSManager": "SMSManager",
+    "Base URL": "Perus-URL-osoite",
+    "goAlertIntegrationKeyInfo": "Hanki yleinen API-integrointiavain palvelulle tässä muodossa \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" yleensä kopioidun URL-osoitteen tunnusparametrin arvona.",
+    "goAlert": "GoAlert",
+    "AccessKeyId": "Pääsyn avaimen tunnus",
+    "SecretAccessKey": "Pääsyn avaimen salaisuus",
+    "PhoneNumbers": "PuhelinNumerot",
+    "TemplateCode": "Mallikoodi",
+    "SignName": "AllekirjoitusNimi",
+    "Sms template must contain parameters: ": "Tekstiviestimallin tulee sisältää parametrit: ",
+    "Bark Group": "Bark ryhmä",
+    "Bark Sound": "Bark ääni",
+    "WebHookUrl": "WebHookUrl-osoite",
+    "SecretKey": "Salainen avain",
+    "For safety, must use secret key": "Turvallisuuden vuoksi on käytettävä salaista avainta",
+    "Device Token": "Laitteen tunnus",
+    "Platform": "Alusta",
+    "iOS": "iOS",
+    "Bark Endpoint": "Bark päätepiste",
+    "Huawei": "Huawei",
+    "High": "Korkea",
+    "Topic": "Aihe",
+    "WeCom Bot Key": "WeCom-bottiavain",
+    "Setup Proxy": "Asenna välityspalvelin",
+    "Proxy Protocol": "Välityspalvelinprotokolla",
+    "Proxy Server": "Välityspalvelin",
+    "matrix": "Matriisi",
+    "promosmsTypeFlash": "SMS FLASH - Viesti näkyy automaattisesti vastaanottajan laitteessa. Rajoitettu vain puolalaisille vastaanottajille.",
+    "promosmsTypeSpeed": "SMS SPEED - Järjestelmän korkein prioriteetti. Erittäin nopea ja luotettava, mutta kallis (noin kaksi kertaa SMS TÄYSI hinta).",
+    "promosmsPhoneNumber": "Puhelinnumero (puolalaiselle vastaanottajalle voit ohittaa suuntanumerot)",
+    "promosmsSMSSender": "Tekstiviestin lähettäjän nimi: Esirekisteröity nimi tai jokin oletusasetuksista: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "promosmsAllowLongSMS": "Salli pitkät tekstiviestit",
+    "Feishu WebHookUrl": "Feishu WebHookURL-osoite",
+    "Internal Room Id": "Huoneen sisäinen tunnus",
+    "Android": "Android",
+    "Channel Name": "Kanavan nimi",
+    "Uptime Kuma URL": "Uptime Kuma URL-osoite",
+    "Icon Emoji": "Ikoni Emoji",
+    "signalImportant": "TÄRKEÄÄ: Et voi sekoittaa ryhmiä ja numeroita vastaanottajissa!",
+    "aboutWebhooks": "Lisätietoja Webhooksista osoitteessa: {0}",
+    "aboutChannelName": "Kirjoita kanavan nimi {0} Kanavan nimi -kenttään, jos haluat ohittaa Webhook-kanavan. Esimerkki: #muu-kanava",
+    "aboutKumaURL": "Jos jätät Uptime Kuma URL -kentän tyhjäksi, se on oletuksena Project GitHub -sivu.",
+    "smtpDkimSettings": "DKIM-asetukset",
+    "smtpDkimDesc": "Katso Nodemailer DKIM {0} -sovelluksen käytöstä.",
+    "documentation": "dokumentointi",
+    "smtpDkimDomain": "Verkkotunnus nimi",
+    "smtpDkimKeySelector": "Näppäinvalitsin",
+    "smtpDkimPrivateKey": "Yksityinen avain",
+    "smtpDkimHashAlgo": "Hash-algoritmi (valinnainen)",
+    "smtpDkimheaderFieldNames": "Allekirjoitettavat otsikkoavaimet (valinnainen)",
+    "smtpDkimskipFields": "Otsikkonäppäimet, joita ei allekirjoiteta (valinnainen)",
+    "Integration Key": "Integrointiavain",
+    "Integration URL": "Integroinnin URL-osoite",
+    "Auto resolve or acknowledged": "Automaattinen ratkaisu tai kuittaus",
+    "do nothing": "Älä tee mitään",
+    "auto acknowledged": "automaattisesti kuitattu",
+    "auto resolve": "automaattinen ratkaisu",
+    "gorush": "Gorush",
+    "alerta": "Alerta",
+    "alertaApiEndpoint": "API-päätepiste",
+    "alertaEnvironment": "Ympäristö",
+    "alertaApiKey": "API-avain",
+    "alertaRecoverState": "Palautustila",
+    "serwersms": "SerwerSMS.pl",
+    "serwersmsAPIUser": "API-käyttäjänimi (sis. webapi_-etuliite)",
+    "serwersmsAPIPassword": "API-salasana",
+    "serwersmsPhoneNumber": "Puhelinnumero",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Puhelinnumero(t)",
+    "smseagleGroup": "Puhelinmuistioryhmän nimi/nimet",
+    "smseagleContact": "Puhelinmuistion yhteyshenkilön nimet",
+    "smseagleRecipientType": "Vastaanottajan tyyppi",
+    "smseagleRecipient": "Vastaanottaja(t) (jos useita, ne on erotettava pilkulla)",
+    "smseagleToken": "API-käyttöoikeustunnus",
+    "smseagleUrl": "SMSEagle-laitteesi URL-osoite",
+    "smseagleEncoding": "Lähetä Unicodena",
+    "smseaglePriority": "Viestin prioriteetti (0-9, oletus = 0)",
+    "stackfield": "Stackfield",
+    "Recipient Number": "Vastaanottajan numero",
+    "From Name/Number": "Nimestä/numerosta",
+    "Leave blank to use a shared sender number.": "Jätä tyhjäksi, jos haluat käyttää jaettua lähettäjän numeroa.",
+    "Octopush API Version": "Octopush API -versio",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "ntfy Topic": "ntfy aihe",
+    "HomeAssistant": "Home Assistant",
+    "onebotHttpAddress": "OneBot HTTP-osoite",
+    "onebotGroupMessage": "Ryhmä",
+    "onebotPrivateMessage": "Yksityinen",
+    "onebotUserOrGroupId": "Ryhmä/käyttäjätunnus",
+    "onebotSafetyTips": "Käyttöoikeustunnus on asetettava turvallisuuden vuoksi",
+    "PushDeer Key": "PushDeer avain",
+    "wayToGetClickSendSMSToken": "Voit saada API-käyttäjänimen ja API-avaimen osoitteesta {0}.",
+    "Custom Monitor Type": "Mukautettu seurain tyyppi",
+    "Google Analytics ID": "Google Analytics -tunnus",
+    "Edit Tag": "Muokkaa tunnistetta",
+    "Server Address": "Palvelimen osoite",
+    "Learn More": "Lisätietoja",
+    "Inactive": "Epäaktiivinen",
+    "Add New below or Select...": "Lisää uusi alapuolella tai valitse…",
+    "Blue": "Sininen",
+    "Avg. Response": "Kesk.arv. vastaus",
+    "All Systems Operational": "Kaikki järjestelmät toiminnassa",
+    "defaultNotificationName": "Minun {ilmoitus} Hälytys ({numero})",
+    "webhookFormDataDesc": "{multipart} on hyvä PHP:lle. JSON pitää parsia {decodeFunction} avulla",
+    "HeadersInvalidFormat": "Pyynnön otsikot eivät ole kelvollisia JSON-tiedostoja: ",
+    "clearDataOlderThan": "Säilytä seuraimen historiatiedot {0} päivää.",
+    "steamApiKeyDescription": "Steam peli palveliment valvontaa varten tarvitset Steam Web-API -avaimen. Voit rekisteröidä API-avaimesi täällä: ",
+    "light": "Vaalea",
+    "Switch to Light Theme": "Vaihda vaaleaan teemaan",
+    "Powered by": "Voimanlähteenä",
+    "shrinkDatabaseDescription": "Käynnistä tietokanta VACUUM SQLitelle. Jos tietokanta on luotu 1.10.0:n jälkeen, AUTO_VACUUM on jo käytössä eikä tätä toimintoa tarvita.",
+    "Accept characters:": "Hyväksy merkit:",
+    "New Status Page": "Uusi tilasivu",
+    "wayToGetCloudflaredURL": "(Lataa cloudflared osoitteesta {0})",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Nykyinen yhteys saattaa katketa, jos muodostat parhaillaan yhteyttä Cloudflare-tunnelin kautta. Haluatko varmasti lopettaa sen? Vahvista se kirjoittamalla nykyinen salasanasi.",
+    "RadiusCallingStationIdDescription": "Kutsu laitteen tunniste",
+    "Check how to config it for WebSocket": "Tarkista, kuinka se määritetään WebSocketille",
+    "Docker Daemon": "Docker taustatoiminta",
+    "deleteDockerHostMsg": "Haluatko varmasti poistaa tämän docker-isännän kaikista seuraimista?",
+    "supportTelegramChatID": "Tukee suoraa chattia / ryhmää / kanavan chat-tunnusta",
+    "Event data:": "Tapahtumatyyppi:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Valitse sitten toiminto, esimerkiksi vaihda kohtaus sellaiseen, jossa RGB-valo on punainen.",
+    "backupOutdatedWarning": "Vanhentunut: Koska monia ominaisuuksia lisättiin ja tätä varmuuskopiointitoimintoa ei ole ylläpidetty, se ei voi luoda tai palauttaa täydellistä varmuuskopiota.",
+    "lastDay4": "Kuukauden 4. viimeinen päivä",
+    "IconUrl": "Kuvakkeen URL-osoite",
+    "Enable DNS Cache": "Ota DNS-välimuisti käyttöön",
+    "dnsCacheDescription": "Se ei ehkä toimi joissakin IPv6-ympäristöissä, poista se käytöstä, jos kohtaat ongelmia.",
+    "confirmUninstallPlugin": "Haluatko varmasti poistaa tämän laajennuksen?",
+    "wayToGetDiscordURL": "Saat tämän siirtymällä kohtaan Palvelinasetukset -> Integraatiot -> Näytä Webhookit -> Uusi Webhook",
+    "needSignalAPI": "Sinulla on oltava signaaliasiakas, jossa on REST API.",
+    "wayToGetLineChannelToken": "Avaa ensin {0}, luo palveluntarjoaja ja kanava (Viestintä API), sitten saat kanavan käyttö tokenin ja käyttäjätunnuksen yllä mainituista valikon kohdista.",
+    "Icon URL": "Kuvakkeen URL-osoite",
+    "aboutIconURL": "Voit ohittaa oletusprofiilikuvan antamalla linkin kuvaan kohdassa \"kuvakeen URL\". Ei käytetä, jos kuvake emoji on asetettu.",
+    "aboutMattermostChannelName": "Voit ohittaa oletuskanavan, jolle Webhook lähettää viestejä, kirjoittamalla kanavan nimen Kanavan nimi -kenttään. Tämä on otettava käyttöön Mattermost Webhook -asetuksissa. Esimerkki: #muu-kanava",
+    "resolverserverDescription": "Cloudflare on oletuspalvelin. Voit vaihtaa ratkaisijapalvelinta milloin tahansa.",
+    "enableDefaultNotificationDescription": "Tämä ilmoitus on oletuksena käytössä uusissa seuraimissa. Voit silti poistaa ilmoituksen käytöstä erikseen jokaiselta seuraimelta.",
+    "clearEventsMsg": "Haluatko varmasti poistaa kaikki tämän seuraimen tapahtumat?",
+    "confirmClearStatisticsMsg": "Haluatko varmasti poistaa KAIKKI tilastot?",
+    "importHandleDescription": "Valitse \"Ohita olemassa oleva\", jos haluat ohittaa jokaisen samannimisen seuraimen tai ilmoituksen. \"Korvaa\" poistaa kaikki olemassa olevat seuraimet ja ilmoitukset.",
+    "passwordNotMatchMsg": "Toistettu salasana ei täsmää.",
+    "backupDescription3": "Arkaluonteiset tiedot, kuten ilmoitustunnukset, sisältyvät vientitiedostoon. säilytä vienti turvallisesti.",
+    "endpoint": "päätepiste",
+    "octopushAPIKey": "\"API-avain\" ohjauspaneelin HTTP API -tunnistetiedoista",
+    "pushoversounds siren": "Sireeni",
+    "pushoversounds echo": "Ylityöntö kaiku (pitkä)",
+    "pushover": "Ylityöntö",
+    "apprise": "Apprise (tukee yli 50 ilmoituspalvelua)",
+    "pushbullet": "Pushbullet",
+    "wayToGetKookBotToken": "Luo sovellus ja hanki bot-tunnus osoitteessa {0}",
+    "Notification Sound": "Ilmoitusääni",
+    "pushoverDesc1": "Hätäprioriteetilla (2) on oletusarvoisesti 30 sekunnin aikakatkaisu uudelleenyritysten välillä, ja se vanhenee 1 tunnin kuluttua.",
+    "octopushLegacyHint": "Käytätkö Octopushin (2011-2020) vanhaa versiota vai uutta versiota?",
+    "Free Mobile API Key": "Ilmainen mobiilisovellusliittymäavain",
+    "You can divide numbers with": "Voit jakaa numerot",
+    "goAlertInfo": "GoAlert on avoimen lähdekoodin sovellus päivystykseen, automatisoituihin eskalaatioihin ja ilmoituksiin (kuten tekstiviestit tai äänipuhelut). Ota automaattisesti mukaan oikea henkilö, oikealla tavalla ja oikeaan aikaan! {0}",
+    "Retry": "Yritä uudelleen",
+    "Proxy server has authentication": "Välityspalvelimella on todennus",
+    "promosmsTypeEco": "SMS ECO - halpa mutta hidas ja usein ylikuormitettu. Rajoitettu vain puolalaisille vastaanottajille.",
+    "promosmsTypeFull": "SMS FULL - Premium-tason tekstiviestit, voit käyttää lähettäjän nimeäsi (sinun on rekisteröitävä nimi ensin). Luotettava hälytyksiä varten.",
+    "matrixHomeserverURL": "Kotipalvelimen URL-osoite (http(s):// ja valinnaisesti portti)",
+    "matrixDesc1": "Löydät sisäisen huonetunnuksen katsomalla Matrix-asiakasohjelman huoneasetusten lisäosaa. Sen pitäisi näyttää tältä: !QMdRCpUIfLwsfjxye6:home.server.",
+    "matrixDesc2": "On erittäin suositeltavaa, että luot uuden käyttäjän etkä käytä omaa Matrix-käyttäjätunnustasi, koska se antaa täyden pääsyn tilillesi ja kaikkiin huoneisiin, joihin liityit. Luo sen sijaan uusi käyttäjä ja kutsu se vain siihen huoneeseen, josta haluat saada ilmoituksen. Saat käyttöoikeustunnuksen suorittamalla {0}",
+    "wayToGetPagerDutyKey": "Saat tämän siirtymällä kohtaan Palvelu -> Palveluhakemisto -> (Valitse palvelu) -> Integraatiot -> Lisää integraatio. Täältä voit etsiä \"Events API V2\". Lisätietoja {0}",
+    "alertaAlertState": "Varoitustila",
+    "serwersmsSenderName": "Tekstiviestin lähettäjän nimi (rekisteröity asiakasportaalin kautta)",
+    "onebotMessageType": "OneBot-viestityyppi"
 }

From 11b45dd274faca74fcd134402746ddace58e29a8 Mon Sep 17 00:00:00 2001
From: AmadeusGraves <angelfx19@gmail.com>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 637/803] Translated using Weblate (Spanish)

Currently translated at 97.7% (681 of 697 strings)

Co-authored-by: AmadeusGraves <angelfx19@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/es/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/es-ES.json | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index 5adca7b7..429582de 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -534,7 +534,7 @@
     "smtpCC": "CC",
     "smtpBCC": "CCO",
     "Discord Webhook URL": "URL Webhook de Discord",
-    "wayToGetDiscordURL": "Puede obtener esto yendo a Configuración del servidor -> Integraciones -> Crear webhook",
+    "wayToGetDiscordURL": "Puede obtener esto yendo a Configuración del servidor -> Integraciones -> Ver Webhooks -> Crear Webhook",
     "Bot Display Name": "Nombre para mostrar del Bot",
     "Hello @everyone is...": "Hola {'@'}todos están…",
     "wayToGetTeamsURL": "Puedes aprender cómo crear una URL webhook {0}.",
@@ -591,7 +591,7 @@
     "Kook": "Kook",
     "wayToGetKookBotToken": "Crea aplicación y obtén tu token de bot en {0}",
     "wayToGetKookGuildID": "Activa 'Modo Desarrollador' en los ajustes de Kook, y haz click derecho en la unión para obtener su ID",
-    "Guild ID": "",
+    "Guild ID": "ID de Gremio",
     "User Key": "Key de Usuario",
     "octopushTypePremium": "Premium (Rápido - recomendado para alertas)",
     "octopushTypeLowCost": "Bajo Coste (Lento - algunas veces bloqueado por operador)",
@@ -661,7 +661,7 @@
     "SMSManager": "SMSManager",
     "goAlertInfo": "GoAlert es una aplicación de código abierto para la programación de guardias, escaladas automatizadas y notificaciones (como SMS o llamadas de voz). ¡Involucre automáticamente a la persona adecuada, de la manera correcta y en el momento adecuado! {0}",
     "Free Mobile API Key": "Clave API de Free Mobile",
-    "high": "arriba",
+    "high": "alto",
     "SMSManager API Docs": "Documentación API de SMSManager ",
     "smseagleContact": "Nombre(s) de contacto de Guía Telefónica",
     "smseagleToken": "Token de Acceso a la API",
@@ -685,5 +685,8 @@
     "Server Address": "Dirección del Servidor",
     "Learn More": "Aprende Más",
     "Pick a RR-Type...": "Seleccione un Tipo RR",
-    "onebotHttpAddress": "Dirección HTTP OneBot"
+    "onebotHttpAddress": "Dirección HTTP OneBot",
+    "SendKey": "SendKey",
+    "octopushAPIKey": "\"Clave API\" de las credenciales HTTP API en el panel de control",
+    "octopushLogin": "\"Inicio de Sesión\" a partir de las credenciales API HTTP en el panel de control"
 }

From 32ddff4e643706200559850d1441354652fa5fce Mon Sep 17 00:00:00 2001
From: MrEddX <mreddx@chatrix.one>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 638/803] Translated using Weblate (Bulgarian)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: MrEddX <mreddx@chatrix.one>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/bg/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/bg-BG.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 66ce48fe..eb6ec700 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -676,7 +676,7 @@
     "wayToGetKookGuildID": "Превключете в 'Developer Mode' в 'Kook' настройките, след което десен клик върху 'guild' за да вземете неговото 'ID'",
     "Guild ID": "Guild ID",
     "Help": "Помощ",
-    "Game": "игрови",
+    "Game": "Игра",
     "Custom": "Потребителски",
     "infiniteRetention": "Задайте стойност 0 за безкрайно съхранение.",
     "Monitor": "Монитор | Монитори",

From 609a61e6007c49a4d20bc46dcb7ea05652b75e44 Mon Sep 17 00:00:00 2001
From: Michal <black23@gmail.com>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 639/803] Translated using Weblate (Czech)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Michal <black23@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/cs-CZ.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index 18a3d333..afcb6f1b 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -674,7 +674,7 @@
     "Proto Content": "Proto obsah",
     "Economy": "Úsporná",
     "Lowcost": "Nízkonákladová",
-    "high": "high",
+    "high": "vysoká",
     "General Monitor Type": "Obecný typ dohledu",
     "Passive Monitor Type": "Pasivní typ dohledu",
     "Specific Monitor Type": "Konkrétní typ dohledu",

From 1877b90b3ac592fbd7a5b7fbfb4876451aad504b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 14 Feb 2023 19:08:52 +0000
Subject: [PATCH 640/803] Translated using Weblate (Finnish)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fi/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fi.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/fi.json b/src/lang/fi.json
index 32454526..5a7ce409 100644
--- a/src/lang/fi.json
+++ b/src/lang/fi.json
@@ -105,7 +105,7 @@
     "disableauth.message1": "Oletko varma että haluat <strong>poistaa todennuksen käytöstä</strong>?",
     "Please use this option carefully!": "Käytä tätä vaihtoehtoa varoen!",
     "Remember me": "Muista minut",
-    "languageName": "Englanti",
+    "languageName": "Suomi",
     "Primary Base URL": "Ensisijainen perus-URL-osoite",
     "pushOptionalParams": "Valinnaiset parametrit: {0}",
     "Not available, please setup.": "Ei saatavilla, määritä ensin.",

From e04a8203dcf8c1cf905f56e0ad834343e152c7ed Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 15 Feb 2023 03:20:40 +0800
Subject: [PATCH 641/803] Fix npm issue for deploy script

---
 extra/beta/update-version.js | 3 ++-
 extra/update-version.js      | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/extra/beta/update-version.js b/extra/beta/update-version.js
index 7abac5ef..3dafbe8d 100644
--- a/extra/beta/update-version.js
+++ b/extra/beta/update-version.js
@@ -22,7 +22,8 @@ if (! exists) {
     fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n");
 
     // Also update package-lock.json
-    childProcess.spawnSync("npm", [ "install" ]);
+    const npm = /^win/.test(process.platform) ? "npm.cmd" : "npm";
+    childProcess.spawnSync(npm, [ "install" ]);
 
     commit(version);
     tag(version);
diff --git a/extra/update-version.js b/extra/update-version.js
index 246e1c1c..8d78f17d 100644
--- a/extra/update-version.js
+++ b/extra/update-version.js
@@ -26,7 +26,8 @@ if (! exists) {
     fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n");
 
     // Also update package-lock.json
-    childProcess.spawnSync("npm", [ "install" ]);
+    const npm = /^win/.test(process.platform) ? "npm.cmd" : "npm";
+    childProcess.spawnSync(npm, [ "install" ]);
 
     commit(newVersion);
     tag(newVersion);

From fdc3b2d57a9037c4415d18fe01762e7960a7fd43 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 15 Feb 2023 03:23:59 +0800
Subject: [PATCH 642/803] Update to 1.20.1

---
 package-lock.json | 6 +++---
 package.json      | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index baf9f4f2..5e57a932 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.20.0-beta.0",
+    "version": "1.20.1",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.20.0-beta.0",
+            "version": "1.20.1",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
@@ -55,7 +55,7 @@
                 "prom-client": "~13.2.0",
                 "prometheus-api-metrics": "~3.2.1",
                 "protobufjs": "~7.1.1",
-                "qs": "~6.10.0",
+                "qs": "~6.10.4",
                 "redbean-node": "~0.2.0",
                 "redis": "~4.5.1",
                 "socket.io": "~4.5.3",
diff --git a/package.json b/package.json
index 5d4652d6..a3f6066b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.20.0",
+    "version": "1.20.1",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -39,7 +39,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.20.0 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.20.1 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From ee2eb5109b7784a253e8955bfd31e0548dd71d3a Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Tue, 14 Feb 2023 19:49:04 +0000
Subject: [PATCH 643/803] Added basic web interface for API keys

Web interfaces for manging API keys have been added however translation
keys are still required.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 db/patch-api-key-table.sql                    |   2 +-
 server/client.js                              |  26 ++
 server/model/api_key.js                       |  75 ++++++
 server/server.js                              |   5 +-
 .../socket-handlers/api-key-socket-handler.js | 144 ++++++++++
 src/icon.js                                   |   2 +
 src/layouts/Layout.vue                        |   6 +
 src/mixins/socket.js                          |  36 ++-
 src/pages/AddAPIKey.vue                       | 198 ++++++++++++++
 src/pages/ManageAPIKeys.vue                   | 255 ++++++++++++++++++
 src/pages/Settings.vue                        |   3 +
 src/router.js                                 |  10 +
 12 files changed, 759 insertions(+), 3 deletions(-)
 create mode 100644 server/model/api_key.js
 create mode 100644 server/socket-handlers/api-key-socket-handler.js
 create mode 100644 src/pages/AddAPIKey.vue
 create mode 100644 src/pages/ManageAPIKeys.vue

diff --git a/db/patch-api-key-table.sql b/db/patch-api-key-table.sql
index 151b6918..fc3a405b 100644
--- a/db/patch-api-key-table.sql
+++ b/db/patch-api-key-table.sql
@@ -10,4 +10,4 @@ CREATE TABLE [api_key] (
     [expires] DATETIME DEFAULT NULL,
     CONSTRAINT FK_user FOREIGN KEY ([user_id]) REFERENCES [user]([id]) ON DELETE CASCADE ON UPDATE CASCADE
 );
-COMMIT;
\ No newline at end of file
+COMMIT;
diff --git a/server/client.js b/server/client.js
index ef96c7f4..3efbe8fd 100644
--- a/server/client.js
+++ b/server/client.js
@@ -113,6 +113,31 @@ async function sendProxyList(socket) {
     return list;
 }
 
+/**
+ * Emit API key list to client
+ * @param {Socket} socket Socket.io socket instance
+ * @returns {Promise<void>}
+ */
+async function sendAPIKeyList(socket) {
+    const timeLogger = new TimeLogger();
+
+    let result = [];
+    const list = await R.find(
+        "api_key",
+        "user_id=?",
+        [ socket.userID ],
+    );
+
+    for (let bean of list) {
+        result.push(bean.toPublicJSON());
+    }
+
+    io.to(socket.userID).emit("apiKeyList", result);
+    timeLogger.print("Sent API Key List");
+
+    return list;
+}
+
 /**
  * Emits the version information to the client.
  * @param {Socket} socket Socket.io socket instance
@@ -157,6 +182,7 @@ module.exports = {
     sendImportantHeartbeatList,
     sendHeartbeatList,
     sendProxyList,
+    sendAPIKeyList,
     sendInfo,
     sendDockerHostList
 };
diff --git a/server/model/api_key.js b/server/model/api_key.js
new file mode 100644
index 00000000..777519b9
--- /dev/null
+++ b/server/model/api_key.js
@@ -0,0 +1,75 @@
+const { BeanModel } = require("redbean-node/dist/bean-model");
+const { R } = require("redbean-node");
+
+class APIKey extends BeanModel {
+    /**
+     * Get the current status of this API key
+     */
+    getStatus() {
+        let expired = false;
+        if (expired) {
+            return "expired";
+        } else if (this.active) {
+            return "active";
+        } else if (!this.active) {
+            return "inactive";
+        }
+    }
+
+    /**
+     * Returns an object that ready to parse to JSON
+     * @returns {Object}
+     */
+    toJSON() {
+        return {
+            id: this.id,
+            key: this.key,
+            name: this.name,
+            userID: this.user_id,
+            createdDate: this.created_date,
+            active: this.active,
+            expires: this.expires,
+            status: this.getStatus(),
+        };
+    }
+
+    /**
+     * Returns an object that ready to parse to JSON with sensitive fields
+     * removed
+     * @returns {Object}
+     */
+    toPublicJSON() {
+        return {
+            id: this.id,
+            name: this.name,
+            userID: this.user_id,
+            createdDate: this.created_date,
+            active: this.active,
+            expires: this.expires,
+            status: this.getStatus(),
+        };
+    }
+
+    /**
+     * Create a new API Key and store it in the database
+     * @param {Object} key Object sent by client
+     * @param {int} userID ID of socket user
+     * @returns {Promise<bean>}
+     */
+    static async save(key, userID) {
+        let bean;
+        bean = R.dispense("api_key");
+
+        bean.key = key.key;
+        bean.name = key.name;
+        bean.user_id = userID;
+        bean.active = key.active;
+        bean.expires = key.expires;
+
+        await R.store(bean);
+
+        return bean;
+    }
+}
+
+module.exports = APIKey;
diff --git a/server/server.js b/server/server.js
index 5473cecd..a13fe466 100644
--- a/server/server.js
+++ b/server/server.js
@@ -126,7 +126,7 @@ if (config.demoMode) {
 }
 
 // Must be after io instantiation
-const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo, sendProxyList, sendDockerHostList } = require("./client");
+const { sendNotificationList, sendHeartbeatList, sendImportantHeartbeatList, sendInfo, sendProxyList, sendDockerHostList, sendAPIKeyList } = require("./client");
 const { statusPageSocketHandler } = require("./socket-handlers/status-page-socket-handler");
 const databaseSocketHandler = require("./socket-handlers/database-socket-handler");
 const TwoFA = require("./2fa");
@@ -135,6 +135,7 @@ const { cloudflaredSocketHandler, autoStart: cloudflaredAutoStart, stop: cloudfl
 const { proxySocketHandler } = require("./socket-handlers/proxy-socket-handler");
 const { dockerSocketHandler } = require("./socket-handlers/docker-socket-handler");
 const { maintenanceSocketHandler } = require("./socket-handlers/maintenance-socket-handler");
+const { apiKeySocketHandler } = require("./socket-handlers/api-key-socket-handler");
 const { generalSocketHandler } = require("./socket-handlers/general-socket-handler");
 const { Settings } = require("./settings");
 const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
@@ -1490,6 +1491,7 @@ let needSetup = false;
         proxySocketHandler(socket);
         dockerSocketHandler(socket);
         maintenanceSocketHandler(socket);
+        apiKeySocketHandler(socket);
         generalSocketHandler(socket, server);
 
         log.debug("server", "added all socket handlers");
@@ -1597,6 +1599,7 @@ async function afterLogin(socket, user) {
     sendNotificationList(socket);
     sendProxyList(socket);
     sendDockerHostList(socket);
+    sendAPIKeyList(socket);
 
     await sleep(500);
 
diff --git a/server/socket-handlers/api-key-socket-handler.js b/server/socket-handlers/api-key-socket-handler.js
new file mode 100644
index 00000000..a80dca83
--- /dev/null
+++ b/server/socket-handlers/api-key-socket-handler.js
@@ -0,0 +1,144 @@
+const { checkLogin } = require("../util-server");
+const { log } = require("../../src/util");
+const { R } = require("redbean-node");
+const crypto = require("crypto");
+const passwordHash = require("../password-hash");
+const apicache = require("../modules/apicache");
+const APIKey = require("../model/api_key");
+const { sendAPIKeyList } = require("../client");
+
+/**
+ * Handlers for Maintenance
+ * @param {Socket} socket Socket.io instance
+ */
+module.exports.apiKeySocketHandler = (socket) => {
+    // Add a new api key
+    socket.on("addAPIKey", async (key, callback) => {
+        try {
+            checkLogin(socket);
+            let clearKey = crypto.randomUUID();
+            let hashedKey = passwordHash.generate(clearKey);
+            key["key"] = hashedKey;
+            let bean = await APIKey.save(key, socket.userID);
+
+            log.debug("apikeys", "Added API Key");
+            log.debug("apikeys", key);
+
+            // Append key ID to start of key seperated by -, used to get
+            // correct hash when validating key.
+            let formattedKey = bean.id + "-" + clearKey;
+            await sendAPIKeyList(socket);
+
+            callback({
+                ok: true,
+                msg: "Added Successfully.",
+                key: formattedKey,
+                keyID: bean.id,
+            });
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    socket.on("getAPIKeyList", async (callback) => {
+        try {
+            checkLogin(socket);
+            await sendAPIKeyList(socket);
+            callback({
+                ok: true,
+            });
+        } catch (e) {
+            console.error(e);
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    socket.on("deleteAPIKey", async (keyID, callback) => {
+        try {
+            checkLogin(socket);
+
+            log.debug("apikeys", `Deleted API Key: ${keyID} User ID: ${socket.userID}`);
+
+            await R.exec("DELETE FROM api_key WHERE id = ? AND user_id = ? ", [
+                keyID,
+                socket.userID,
+            ]);
+
+            apicache.clear();
+
+            callback({
+                ok: true,
+                msg: "Deleted Successfully.",
+            });
+
+            await sendAPIKeyList(socket);
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    socket.on("disableAPIKey", async (keyID, callback) => {
+        try {
+            checkLogin(socket);
+
+            log.debug("apikeys", `Disabled Key: ${keyID} User ID: ${socket.userID}`);
+
+            await R.exec("UPDATE api_key SET active = 0 WHERE id = ? ", [
+                keyID,
+            ]);
+
+            apicache.clear();
+
+            callback({
+                ok: true,
+                msg: "Disabled Successfully.",
+            });
+
+            await sendAPIKeyList(socket);
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+
+    socket.on("enableAPIKey", async (keyID, callback) => {
+        try {
+            checkLogin(socket);
+
+            log.debug("apikeys", `Enabled Key: ${keyID} User ID: ${socket.userID}`);
+
+            await R.exec("UPDATE api_key SET active = 1 WHERE id = ? ", [
+                keyID,
+            ]);
+
+            apicache.clear();
+
+            callback({
+                ok: true,
+                msg: "Enabled Successfully",
+            });
+
+            await sendAPIKeyList(socket);
+
+        } catch (e) {
+            callback({
+                ok: false,
+                msg: e.message,
+            });
+        }
+    });
+};
diff --git a/src/icon.js b/src/icon.js
index b38bef3c..fd2d1b7f 100644
--- a/src/icon.js
+++ b/src/icon.js
@@ -44,6 +44,7 @@ import {
     faWrench,
     faHeartbeat,
     faFilter,
+    faKey,
 } from "@fortawesome/free-solid-svg-icons";
 
 library.add(
@@ -88,6 +89,7 @@ library.add(
     faWrench,
     faHeartbeat,
     faFilter,
+    faKey,
 );
 
 export { FontAwesomeIcon };
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index d8e96aa8..dfc540fa 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -57,6 +57,12 @@
                                 </router-link>
                             </li>
 
+                            <li>
+                                <router-link to="/apikeys" class="dropdown-item" :class="{ active: $route.path.includes('manage-apikeys') }">
+                                    <font-awesome-icon icon="key" /> {{ $t("API Keys") }}
+                                </router-link>
+                            </li>
+
                             <li>
                                 <router-link to="/settings/general" class="dropdown-item" :class="{ active: $route.path.includes('settings') }">
                                     <font-awesome-icon icon="cog" /> {{ $t("Settings") }}
diff --git a/src/mixins/socket.js b/src/mixins/socket.js
index 378af06a..114fd647 100644
--- a/src/mixins/socket.js
+++ b/src/mixins/socket.js
@@ -34,7 +34,8 @@ export default {
             allowLoginDialog: false,        // Allowed to show login dialog, but "loggedIn" have to be true too. This exists because prevent the login dialog show 0.1s in first before the socket server auth-ed.
             loggedIn: false,
             monitorList: { },
-            maintenanceList: { },
+            maintenanceList: {},
+            apiKeyList: {},
             heartbeatList: { },
             importantHeartbeatList: { },
             avgPingList: { },
@@ -134,6 +135,10 @@ export default {
                 this.maintenanceList = data;
             });
 
+            socket.on("apiKeyList", (data) => {
+                this.apiKeyList = data;
+            });
+
             socket.on("notificationList", (data) => {
                 this.notificationList = data;
             });
@@ -461,6 +466,17 @@ export default {
             socket.emit("getMaintenanceList", callback);
         },
 
+        /**
+         * Send list of API keys
+         * @param {socketCB} callback
+         */
+        getAPIKeyList(callback) {
+            if (!callback) {
+                callback = () => { };
+            }
+            socket.emit("getAPIKeyList", callback);
+        },
+
         /**
          * Add a monitor
          * @param {Object} monitor Object representing monitor to add
@@ -503,6 +519,24 @@ export default {
             socket.emit("deleteMaintenance", maintenanceID, callback);
         },
 
+        /**
+         * Add an API key
+         * @param {Object} key API key to add
+         * @param {socketCB} callback
+         */
+        addAPIKey(key, callback) {
+            socket.emit("addAPIKey", key, callback);
+        },
+
+        /**
+         * Delete specified API key
+         * @param {int} keyID ID of key to delete
+         * @param {socketCB} callback
+         */
+        deleteAPIKey(keyID, callback) {
+            socket.emit("deleteAPIKey", keyID, callback);
+        },
+
         /** Clear the hearbeat list */
         clearData() {
             console.log("reset heartbeat list");
diff --git a/src/pages/AddAPIKey.vue b/src/pages/AddAPIKey.vue
new file mode 100644
index 00000000..9633f007
--- /dev/null
+++ b/src/pages/AddAPIKey.vue
@@ -0,0 +1,198 @@
+<template>
+    <transition name="slide-fade" appear>
+        <div>
+            <h1 class="mb-3">{{ $t("Add API Key") }}</h1>
+            <form @submit.prevent="submit">
+                <div class="shadow-box">
+                    <div class="row">
+                        <div class="col-xl-10">
+                            <!-- Title -->
+                            <div class="mb-3">
+                                <label for="name" class="form-label">{{ $t("Title") }}</label>
+                                <input
+                                    id="name" v-model="key.name" type="text" class="form-control"
+                                    required
+                                >
+                            </div>
+
+                            <h2 class="mt-5">{{ $t("Expiry") }}</h2>
+
+                            <!-- Expiry -->
+                            <div class="my-3">
+                                <label class="form-label">{{ $t("Expiry date") }}</label>
+                                <Datepicker
+                                    v-model="key.expires"
+                                    :dark="$root.isDark"
+                                    :monthChangeOnScroll="false"
+                                    :minDate="minDate"
+                                    format="yyyy-MM-dd HH:mm"
+                                    modelType="yyyy-MM-dd HH:mm:ss"
+                                    :required="!noExpire"
+                                />
+
+                                <div class="form-check mb-2">
+                                    <input
+                                        id="no-expire" v-model="noExpire" class="form-check-input"
+                                        type="checkbox"
+                                    >
+                                    <label class="form-check-label" for="no-expire">{{
+                                        $t("Don't expire")
+                                    }}</label>
+                                </div>
+                            </div>
+
+                            <div class="mt-4 mb-1">
+                                <button
+                                    id="monitor-submit-btn" class="btn btn-primary" type="submit"
+                                    :disabled="processing"
+                                >
+                                    {{ $t("Save") }}
+                                </button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </form>
+            <Confirm
+                ref="keyAdded"
+                :yes-text="$t('Continue')"
+                :no-text="$t('Add Another')"
+                :title="$t('Key Added')"
+                @yes="postAdd"
+                @no="clearForm"
+            >
+                <p>{{ $t("apiKeyAddedMsg") }}</p>
+                <p>{{ clearKey }}</p>
+            </Confirm>
+        </div>
+    </transition>
+</template>
+
+<script>
+
+import { useToast } from "vue-toastification";
+import dayjs from "dayjs";
+import Datepicker from "@vuepic/vue-datepicker";
+import Confirm from "../components/Confirm.vue";
+
+const toast = useToast();
+
+export default {
+    components: {
+        Confirm,
+        Datepicker
+    },
+
+    data() {
+        return {
+            processing: false,
+            key: {},
+            dark: (this.$root.theme === "dark"),
+            minDate: this.$root.date(dayjs()) + " 00:00",
+            clearKey: null,
+            noExpire: false,
+        };
+    },
+
+    watch: {
+        "$route.fullPath"() {
+            this.init();
+        },
+    },
+
+    mounted() {
+        this.init();
+    },
+
+    methods: {
+        /** Initialise page */
+        init() {
+            this.clearForm();
+        },
+
+        /** Redirect user to apikey list */
+        postAdd() {
+            this.$router.push("/apikeys");
+        },
+
+        /** Clear the form */
+        clearForm() {
+            this.key = {
+                name: "",
+                expires: this.minDate,
+                active: 1,
+            };
+            this.noExpire = false;
+        },
+
+        /** Submit data to server */
+        async submit() {
+            this.processing = true;
+
+            if (this.noExpire) {
+                this.key.expires = null;
+            }
+
+            this.$root.addAPIKey(this.key, async (res) => {
+                if (res.ok) {
+                    this.clearKey = res.key;
+                    this.$refs.keyAdded.show();
+                    this.clearForm();
+
+                } else {
+                    toast.error(res.msg);
+                }
+                this.processing = false;
+            });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+.shadow-box {
+    padding: 20px;
+}
+
+textarea {
+    min-height: 150px;
+}
+
+.dark-calendar::-webkit-calendar-picker-indicator {
+    filter: invert(1);
+}
+
+.weekday-picker {
+    display: flex;
+    gap: 10px;
+
+    & > div {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        width: 40px;
+
+        .form-check-inline {
+            margin-right: 0;
+        }
+    }
+}
+
+.day-picker {
+    display: flex;
+    gap: 10px;
+    flex-wrap: wrap;
+
+    & > div {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        width: 40px;
+
+        .form-check-inline {
+            margin-right: 0;
+        }
+    }
+}
+
+</style>
diff --git a/src/pages/ManageAPIKeys.vue b/src/pages/ManageAPIKeys.vue
new file mode 100644
index 00000000..9203e276
--- /dev/null
+++ b/src/pages/ManageAPIKeys.vue
@@ -0,0 +1,255 @@
+<template>
+    <transition name="slide-fade" appear>
+        <div>
+            <h1 class="mb-3">
+                {{ $t("API Keys") }}
+            </h1>
+
+            <div>
+                <router-link to="/apikeys/add" class="btn btn-primary mb-3">
+                    <font-awesome-icon icon="plus" /> {{ $t("Add API Key") }}
+                </router-link>
+            </div>
+
+            <div class="shadow-box">
+                <span v-if="Object.keys(keyList).length === 0" class="d-flex align-items-center justify-content-center my-3">
+                    {{ $t("No API Keys") }}
+                </span>
+
+                <div
+                    v-for="(item, index) in keyList"
+                    :key="index"
+                    class="item"
+                    :class="item.status"
+                >
+                    <div class="left-part">
+                        <div
+                            class="circle"
+                        ></div>
+                        <div class="info">
+                            <div class="title">{{ item.name }}</div>
+                            <div class="status">
+                                {{ $t("apiKey-" + item.status) }}
+                            </div>
+                            <div class="date">
+                                {{ $t("Created") }}: {{ item.createdDate }}
+                            </div>
+                            <div class="date">
+                                {{ $t("Expires") }}: {{ item.expires || $t("Never") }}
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="buttons">
+                        <div class="btn-group" role="group">
+                            <button v-if="item.active" class="btn btn-normal" @click="disableDialog(item.id)">
+                                <font-awesome-icon icon="pause" /> {{ $t("Disable") }}
+                            </button>
+
+                            <button v-if="!item.active" class="btn btn-primary" @click="enableKey(item.id)">
+                                <font-awesome-icon icon="play" /> {{ $t("Enable") }}
+                            </button>
+
+                            <button class="btn btn-danger" @click="deleteDialog(item.id)">
+                                <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="text-center mt-3" style="font-size: 13px;">
+                <a href="https://github.com/louislam/uptime-kuma/wiki/Maintenance" target="_blank">Learn More</a>
+            </div>
+
+            <Confirm ref="confirmPause" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="disableKey">
+                {{ $t("disableAPIKeyMsg") }}
+            </Confirm>
+
+            <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteKey">
+                {{ $t("deleteAPIKeyMsg") }}
+            </Confirm>
+        </div>
+    </transition>
+</template>
+
+<script>
+import Confirm from "../components/Confirm.vue";
+import { useToast } from "vue-toastification";
+const toast = useToast();
+
+export default {
+    components: {
+        Confirm,
+    },
+    data() {
+        return {
+            selectedKeyID: null,
+        };
+    },
+    computed: {
+        keyList() {
+            let result = Object.values(this.$root.apiKeyList);
+            return result;
+        },
+    },
+
+    methods: {
+        /**
+         * Show dialog to confirm deletion
+         * @param {number} keyID ID of monitor that is being deleted
+         */
+        deleteDialog(keyID) {
+            this.selectedKeyID = keyID;
+            this.$refs.confirmDelete.show();
+        },
+
+        /**
+         * Delete a key
+         */
+        deleteKey() {
+            this.$root.deleteAPIKey(this.selectedKeyID, (res) => {
+                if (res.ok) {
+                    toast.success(res.msg);
+                    this.$router.push("/apikeys");
+                } else {
+                    toast.error(res.msg);
+                }
+            });
+        },
+
+        /**
+         * Show dialog to confirm pause
+         */
+        disableDialog(keyID) {
+            this.selectedKeyID = keyID;
+            this.$refs.confirmPause.show();
+        },
+
+        /**
+         * Pause maintenance
+         */
+        disableKey() {
+            this.$root.getSocket().emit("disableAPIKey", this.selectedKeyID, (res) => {
+                this.$root.toastRes(res);
+            });
+        },
+
+        /**
+         * Resume maintenance
+         */
+        enableKey(id) {
+            this.$root.getSocket().emit("enableAPIKey", id, (res) => {
+                this.$root.toastRes(res);
+            });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+    @import "../assets/vars.scss";
+
+    .mobile {
+        .item {
+            flex-direction: column;
+            align-items: flex-start;
+            margin-bottom: 20px;
+        }
+    }
+
+    .item {
+        display: flex;
+        align-items: center;
+        gap: 10px;
+        text-decoration: none;
+        border-radius: 10px;
+        transition: all ease-in-out 0.15s;
+        justify-content: space-between;
+        padding: 10px;
+        min-height: 90px;
+        margin-bottom: 5px;
+
+        &:hover {
+            background-color: $highlight-white;
+        }
+
+        &.active {
+            .circle {
+                background-color: $primary;
+            }
+        }
+
+        &.inactive {
+            .circle {
+                background-color: $danger;
+            }
+        }
+
+        &.expired {
+            .left-part {
+                opacity: 0.3;
+            }
+
+            .circle {
+                background-color: $dark-font-color;
+            }
+        }
+
+        .left-part {
+            display: flex;
+            gap: 12px;
+            align-items: center;
+
+            .circle {
+                width: 25px;
+                height: 25px;
+                border-radius: 50rem;
+            }
+
+            .info {
+                .title {
+                    font-weight: bold;
+                    font-size: 20px;
+                }
+
+                .status {
+                    font-size: 14px;
+                }
+            }
+        }
+
+        .buttons {
+            display: flex;
+            gap: 8px;
+            flex-direction: row-reverse;
+
+            .btn-group {
+                width: 310px;
+            }
+        }
+    }
+
+    .date {
+        margin-top: 5px;
+        display: block;
+        font-size: 14px;
+        background-color: rgba(255, 255, 255, 0.5);
+        border-radius: 20px;
+        padding: 0 10px;
+        width: fit-content;
+
+        .dark & {
+            color: white;
+            background-color: rgba(255, 255, 255, 0.1);
+        }
+    }
+
+    .dark {
+        .item {
+            &:hover {
+                background-color: $dark-bg2;
+            }
+        }
+    }
+</style>
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 87404968..9251085d 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -7,6 +7,9 @@
             <router-link to="/maintenance" class="nav-link">
                 <font-awesome-icon icon="wrench" /> {{ $t("Maintenance") }}
             </router-link>
+            <router-link to="/apikeys" class="nav-link" :class="{ active: $route.path.includes('manage-apikeys') }">
+                <font-awesome-icon icon="key" /> {{ $t("API Keys") }}
+            </router-link>
         </div>
 
         <h1 v-show="show" class="mb-3">
diff --git a/src/router.js b/src/router.js
index 38048826..50b394c9 100644
--- a/src/router.js
+++ b/src/router.js
@@ -18,6 +18,8 @@ import NotFound from "./pages/NotFound.vue";
 import DockerHosts from "./components/settings/Docker.vue";
 import MaintenanceDetails from "./pages/MaintenanceDetails.vue";
 import ManageMaintenance from "./pages/ManageMaintenance.vue";
+import ManageAPIKeys from "./pages/ManageAPIKeys.vue";
+import AddAPIKey from "./pages/AddAPIKey.vue";
 
 // Settings - Sub Pages
 import Appearance from "./components/settings/Appearance.vue";
@@ -145,6 +147,14 @@ const routes = [
                         path: "/maintenance/edit/:id",
                         component: EditMaintenance,
                     },
+                    {
+                        path: "/apikeys",
+                        component: ManageAPIKeys
+                    },
+                    {
+                        path: "/apikeys/add",
+                        component: AddAPIKey
+                    },
                 ],
             },
         ],

From 05443f9bb7972970a8c3aa1c23d0ce36f50bf11f Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Tue, 14 Feb 2023 22:16:41 +0000
Subject: [PATCH 644/803] Added language keys

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/lang/en.json            | 16 +++++++++++++++-
 src/pages/AddAPIKey.vue     |  2 +-
 src/pages/ManageAPIKeys.vue |  2 +-
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 15edee93..15b77cb4 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -695,5 +695,19 @@
     "Google Analytics ID": "Google Analytics ID",
     "Edit Tag": "Edit Tag",
     "Server Address": "Server Address",
-    "Learn More": "Learn More"
+    "Learn More": "Learn More",
+    "API Keys": "API Keys",
+    "Expiry": "Expiry",
+    "Expiry date": "Expiry date",
+    "Don't expire": "Don't expire",
+    "Continue": "Continue",
+    "Add Another": "Add Another",
+    "Key Added": "Key Added",
+    "apiKeyAddedMsg": "Your API key has been added. Please make a note of it as it will not be shown again.",
+    "Add API Key": "Add API Key",
+    "No API Keys": "No API Keys",
+    "apiKey-active": "Active",
+    "apiKey-expired": "Expired",
+    "apiKey-inactive": "Inactive",
+    "Expires": "Expires"
 }
diff --git a/src/pages/AddAPIKey.vue b/src/pages/AddAPIKey.vue
index 9633f007..a2e4434e 100644
--- a/src/pages/AddAPIKey.vue
+++ b/src/pages/AddAPIKey.vue
@@ -8,7 +8,7 @@
                         <div class="col-xl-10">
                             <!-- Title -->
                             <div class="mb-3">
-                                <label for="name" class="form-label">{{ $t("Title") }}</label>
+                                <label for="name" class="form-label">{{ $t("Name") }}</label>
                                 <input
                                     id="name" v-model="key.name" type="text" class="form-control"
                                     required
diff --git a/src/pages/ManageAPIKeys.vue b/src/pages/ManageAPIKeys.vue
index 9203e276..c4050592 100644
--- a/src/pages/ManageAPIKeys.vue
+++ b/src/pages/ManageAPIKeys.vue
@@ -59,7 +59,7 @@
             </div>
 
             <div class="text-center mt-3" style="font-size: 13px;">
-                <a href="https://github.com/louislam/uptime-kuma/wiki/Maintenance" target="_blank">Learn More</a>
+                <a href="https://github.com/louislam/uptime-kuma/wiki/APIKeys" target="_blank">{{ $t("Learn More") }}</a>
             </div>
 
             <Confirm ref="confirmPause" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="disableKey">

From cd796898d037babde1ea062d72a6054d0eb518c3 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Tue, 14 Feb 2023 22:41:06 +0000
Subject: [PATCH 645/803] Added expiry check for frontend

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/model/api_key.js | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/server/model/api_key.js b/server/model/api_key.js
index 777519b9..4f786cd2 100644
--- a/server/model/api_key.js
+++ b/server/model/api_key.js
@@ -1,19 +1,19 @@
 const { BeanModel } = require("redbean-node/dist/bean-model");
 const { R } = require("redbean-node");
+const dayjs = require("dayjs");
 
 class APIKey extends BeanModel {
     /**
      * Get the current status of this API key
      */
     getStatus() {
-        let expired = false;
-        if (expired) {
+        let current = dayjs();
+        let expiry = dayjs(this.expires);
+        if (expiry.diff(current) < 0) {
             return "expired";
-        } else if (this.active) {
-            return "active";
-        } else if (!this.active) {
-            return "inactive";
         }
+
+        return this.active ? "active" : "inactive";
     }
 
     /**

From e7feca1cd661b2215e4c08aadd7985f988b145b8 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 15 Feb 2023 00:39:29 +0000
Subject: [PATCH 646/803] Added API key authentication handler

API key authentication is now possible by making use of the X-API-Key
header. API authentication will only be enabled when a user adds their
first API key, up until this point, they can still use their username
and password to authenticate with API endpoints. After the user adds
their first API key, they may only use API keys in future to
authenticate with the API.

In this commit, the prometheus /metrics endpoint has been changed over
to the new authentication system.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/auth.js                                | 61 +++++++++++++++++++
 server/server.js                              |  4 +-
 .../socket-handlers/api-key-socket-handler.js |  5 ++
 3 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/server/auth.js b/server/auth.js
index fd19b0e4..f2c59d66 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -3,6 +3,8 @@ const passwordHash = require("./password-hash");
 const { R } = require("redbean-node");
 const { setting } = require("./util-server");
 const { loginRateLimiter } = require("./rate-limiter");
+const { Settings } = require("./settings");
+const dayjs = require("dayjs");
 
 /**
  * Login to web app
@@ -33,6 +35,32 @@ exports.login = async function (username, password) {
     return null;
 };
 
+/**
+ * Validate a provided API key
+ * @param {string} key API Key passed by client
+ * @returns {Promise<bool>}
+ */
+async function validateAPIKey(key) {
+    if (typeof key !== "string") {
+        return false;
+    }
+
+    let index = key.substring(0, key.indexOf("-"));
+    let clear = key.substring(key.indexOf("-") + 1, key.length);
+    console.log(index);
+    console.log(clear);
+
+    let hash = await R.findOne("api_key", " id=? ", [ index ]);
+
+    let current = dayjs();
+    let expiry = dayjs(hash.expires);
+    if (expiry.diff(current) < 0, !hash.active) {
+        return false;
+    }
+
+    return hash && passwordHash.verify(clear, hash.key);
+}
+
 /**
  * Callback for myAuthorizer
  * @callback myAuthorizerCB
@@ -84,3 +112,36 @@ exports.basicAuth = async function (req, res, next) {
         next();
     }
 };
+
+/**
+ * Use X-API-Key header if API keys enabled, else use basic auth
+ * @param {express.Request} req Express request object
+ * @param {express.Response} res Express response object
+ * @param {express.NextFunction} next
+ */
+exports.apiAuth = async function (req, res, next) {
+    if (!await Settings.get("disableAuth")) {
+        let usingAPIKeys = await Settings.get("apiKeysEnabled");
+
+        loginRateLimiter.pass(null, 0).then((pass) => {
+            if (usingAPIKeys) {
+                let pwd = req.get("X-API-Key");
+                if (pwd !== null && pwd !== undefined) {
+                    validateAPIKey(pwd).then((valid) => {
+                        if (valid) {
+                            next();
+                        } else {
+                            res.status(401).send();
+                        }
+                    });
+                } else {
+                    res.status(401).send();
+                }
+            } else {
+                exports.basicAuth(req, res, next);
+            }
+        });
+    } else {
+        next();
+    }
+};
diff --git a/server/server.js b/server/server.js
index 183a5bb3..8696aa70 100644
--- a/server/server.js
+++ b/server/server.js
@@ -87,7 +87,7 @@ log.debug("server", "Importing Background Jobs");
 const { initBackgroundJobs, stopBackgroundJobs } = require("./jobs");
 const { loginRateLimiter, twoFaRateLimiter } = require("./rate-limiter");
 
-const { basicAuth } = require("./auth");
+const { apiAuth } = require("./auth");
 const { login } = require("./auth");
 const passwordHash = require("./password-hash");
 
@@ -230,7 +230,7 @@ let needSetup = false;
 
     // Prometheus API metrics  /metrics
     // With Basic Auth using the first user's username/password
-    app.get("/metrics", basicAuth, prometheusAPIMetrics());
+    app.get("/metrics", apiAuth, prometheusAPIMetrics());
 
     app.use("/", expressStaticGzip("dist", {
         enableBrotli: true,
diff --git a/server/socket-handlers/api-key-socket-handler.js b/server/socket-handlers/api-key-socket-handler.js
index a80dca83..cf124cad 100644
--- a/server/socket-handlers/api-key-socket-handler.js
+++ b/server/socket-handlers/api-key-socket-handler.js
@@ -5,6 +5,7 @@ const crypto = require("crypto");
 const passwordHash = require("../password-hash");
 const apicache = require("../modules/apicache");
 const APIKey = require("../model/api_key");
+const { Settings } = require("../settings");
 const { sendAPIKeyList } = require("../client");
 
 /**
@@ -29,6 +30,10 @@ module.exports.apiKeySocketHandler = (socket) => {
             let formattedKey = bean.id + "-" + clearKey;
             await sendAPIKeyList(socket);
 
+            // Enable API auth if the user creates a key, otherwise only basic
+            // auth will be used for API.
+            await Settings.set("apiKeysEnabled", true);
+
             callback({
                 ok: true,
                 msg: "Added Successfully.",

From d553c4c4f75801c53c93236cd253dd9415c03cac Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 15 Feb 2023 00:53:42 +0000
Subject: [PATCH 647/803] Added missing translation keys

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/lang/en.json | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 15b77cb4..2dc487cb 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -709,5 +709,7 @@
     "apiKey-active": "Active",
     "apiKey-expired": "Expired",
     "apiKey-inactive": "Inactive",
-    "Expires": "Expires"
+    "Expires": "Expires",
+    "disableAPIKeyMsg": "Are you sure you want to disable this API key?",
+    "deleteAPIKeyMsg": "Are you sure you want to delete this API key?"
 }

From 01c71a0242a87e4957ee1c793be5c01c60f1f23d Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 15 Feb 2023 11:15:15 +0000
Subject: [PATCH 648/803] Fixed logic errors, removed dev leftovers

Fixed a logic error where a comma was used instead of an or, also
removed leftover console.logs from testing.

Date picker is now dissabled when don't expire is checked.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/auth.js          | 8 +++++---
 src/lang/en.json        | 3 ++-
 src/pages/AddAPIKey.vue | 3 ++-
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/server/auth.js b/server/auth.js
index f2c59d66..99084d16 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -47,14 +47,16 @@ async function validateAPIKey(key) {
 
     let index = key.substring(0, key.indexOf("-"));
     let clear = key.substring(key.indexOf("-") + 1, key.length);
-    console.log(index);
-    console.log(clear);
 
     let hash = await R.findOne("api_key", " id=? ", [ index ]);
 
+    if (hash === null) {
+        return false;
+    }
+
     let current = dayjs();
     let expiry = dayjs(hash.expires);
-    if (expiry.diff(current) < 0, !hash.active) {
+    if (expiry.diff(current) < 0 || !hash.active) {
         return false;
     }
 
diff --git a/src/lang/en.json b/src/lang/en.json
index 2dc487cb..007d8072 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -711,5 +711,6 @@
     "apiKey-inactive": "Inactive",
     "Expires": "Expires",
     "disableAPIKeyMsg": "Are you sure you want to disable this API key?",
-    "deleteAPIKeyMsg": "Are you sure you want to delete this API key?"
+    "deleteAPIKeyMsg": "Are you sure you want to delete this API key?",
+    "Generate": "Generate"
 }
diff --git a/src/pages/AddAPIKey.vue b/src/pages/AddAPIKey.vue
index a2e4434e..e6b60233 100644
--- a/src/pages/AddAPIKey.vue
+++ b/src/pages/AddAPIKey.vue
@@ -28,6 +28,7 @@
                                     format="yyyy-MM-dd HH:mm"
                                     modelType="yyyy-MM-dd HH:mm:ss"
                                     :required="!noExpire"
+                                    :disabled="noExpire"
                                 />
 
                                 <div class="form-check mb-2">
@@ -46,7 +47,7 @@
                                     id="monitor-submit-btn" class="btn btn-primary" type="submit"
                                     :disabled="processing"
                                 >
-                                    {{ $t("Save") }}
+                                    {{ $t("Generate") }}
                                 </button>
                             </div>
                         </div>

From dd1d71530fc3eeb435e669b2c31cc6daf7710a38 Mon Sep 17 00:00:00 2001
From: Luke Hamburg <1992842+luckman212@users.noreply.github.com>
Date: Wed, 15 Feb 2023 14:06:29 -0500
Subject: [PATCH 649/803] sorted tags on dashboard

see https://github.com/louislam/uptime-kuma/issues/2785
---
 server/model/monitor.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 4cbb56e1..bbeb0da0 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -143,7 +143,7 @@ class Monitor extends BeanModel {
      * @returns {Promise<LooseObject<any>[]>}
      */
     async getTags() {
-        return await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [ this.id ]);
+        return await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ? ORDER BY tag.name", [ this.id ]);
     }
 
     /**

From 1d4af39820540371094a9fe2c9a7a857a7632eb1 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 15 Feb 2023 19:31:22 +0000
Subject: [PATCH 650/803] Fixed JSDoc for one method

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/model/api_key.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/server/model/api_key.js b/server/model/api_key.js
index 4f786cd2..1b27a60f 100644
--- a/server/model/api_key.js
+++ b/server/model/api_key.js
@@ -5,6 +5,7 @@ const dayjs = require("dayjs");
 class APIKey extends BeanModel {
     /**
      * Get the current status of this API key
+     * @returns {string} active, inactive or expired
      */
     getStatus() {
         let current = dayjs();

From b8720b46c3d0e0332e85a00a177a1001423a6f40 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Wed, 15 Feb 2023 21:53:49 +0000
Subject: [PATCH 651/803] Switched to using Authorization header

Prometheus doesn't support using custom headers for exporters, however
it does support using the Authorisation header with basic auth. As
such, we switched from using X-API-Key to Authorization with the basic
scheme and an empty username field.

Also added a rate limit for API endpoints of 60 requests in a minute

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/auth.js         | 73 ++++++++++++++++++++++++++----------------
 server/rate-limiter.js |  8 +++++
 2 files changed, 53 insertions(+), 28 deletions(-)

diff --git a/server/auth.js b/server/auth.js
index 99084d16..eddae4c3 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -2,7 +2,7 @@ const basicAuth = require("express-basic-auth");
 const passwordHash = require("./password-hash");
 const { R } = require("redbean-node");
 const { setting } = require("./util-server");
-const { loginRateLimiter } = require("./rate-limiter");
+const { loginRateLimiter, apiRateLimiter } = require("./rate-limiter");
 const { Settings } = require("./settings");
 const dayjs = require("dayjs");
 
@@ -37,10 +37,9 @@ exports.login = async function (username, password) {
 
 /**
  * Validate a provided API key
- * @param {string} key API Key passed by client
- * @returns {Promise<bool>}
+ * @param {string} key API key to verify
  */
-async function validateAPIKey(key) {
+async function verifyAPIKey(key) {
     if (typeof key !== "string") {
         return false;
     }
@@ -64,8 +63,8 @@ async function validateAPIKey(key) {
 }
 
 /**
- * Callback for myAuthorizer
- * @callback myAuthorizerCB
+ * Callback for basic auth authorizers
+ * @callback authCallback
  * @param {any} err Any error encountered
  * @param {boolean} authorized Is the client authorized?
  */
@@ -74,9 +73,31 @@ async function validateAPIKey(key) {
  * Custom authorizer for express-basic-auth
  * @param {string} username
  * @param {string} password
- * @param {myAuthorizerCB} callback
+ * @param {authCallback} callback
  */
-function myAuthorizer(username, password, callback) {
+function apiAuthorizer(username, password, callback) {
+    // API Rate Limit
+    apiRateLimiter.pass(null, 0).then((pass) => {
+        if (pass) {
+            verifyAPIKey(password).then((valid) => {
+                callback(null, valid);
+                // Only allow a set number of api requests per minute
+                // (currently set to 60)
+                apiRateLimiter.removeTokens(1);
+            });
+        } else {
+            callback(null, false);
+        }
+    });
+}
+
+/**
+ * Custom authorizer for express-basic-auth
+ * @param {string} username
+ * @param {string} password
+ * @param {authCallback} callback
+ */
+function userAuthorizer(username, password, callback) {
     // Login Rate Limit
     loginRateLimiter.pass(null, 0).then((pass) => {
         if (pass) {
@@ -101,7 +122,7 @@ function myAuthorizer(username, password, callback) {
  */
 exports.basicAuth = async function (req, res, next) {
     const middleware = basicAuth({
-        authorizer: myAuthorizer,
+        authorizer: userAuthorizer,
         authorizeAsync: true,
         challenge: true,
     });
@@ -124,25 +145,21 @@ exports.basicAuth = async function (req, res, next) {
 exports.apiAuth = async function (req, res, next) {
     if (!await Settings.get("disableAuth")) {
         let usingAPIKeys = await Settings.get("apiKeysEnabled");
-
-        loginRateLimiter.pass(null, 0).then((pass) => {
-            if (usingAPIKeys) {
-                let pwd = req.get("X-API-Key");
-                if (pwd !== null && pwd !== undefined) {
-                    validateAPIKey(pwd).then((valid) => {
-                        if (valid) {
-                            next();
-                        } else {
-                            res.status(401).send();
-                        }
-                    });
-                } else {
-                    res.status(401).send();
-                }
-            } else {
-                exports.basicAuth(req, res, next);
-            }
-        });
+        let middleware;
+        if (usingAPIKeys) {
+            middleware = basicAuth({
+                authorizer: apiAuthorizer,
+                authorizeAsync: true,
+                challenge: true,
+            });
+        } else {
+            middleware = basicAuth({
+                authorizer: userAuthorizer,
+                authorizeAsync: true,
+                challenge: true,
+            });
+        }
+        middleware(req, res, next);
     } else {
         next();
     }
diff --git a/server/rate-limiter.js b/server/rate-limiter.js
index 6f185beb..ec77f1a4 100644
--- a/server/rate-limiter.js
+++ b/server/rate-limiter.js
@@ -54,6 +54,13 @@ const loginRateLimiter = new KumaRateLimiter({
     errorMessage: "Too frequently, try again later."
 });
 
+const apiRateLimiter = new KumaRateLimiter({
+    tokensPerInterval: 60,
+    interval: "minute",
+    fireImmediately: true,
+    errorMessage: "Too frequently, try again later."
+});
+
 const twoFaRateLimiter = new KumaRateLimiter({
     tokensPerInterval: 30,
     interval: "minute",
@@ -63,5 +70,6 @@ const twoFaRateLimiter = new KumaRateLimiter({
 
 module.exports = {
     loginRateLimiter,
+    apiRateLimiter,
     twoFaRateLimiter,
 };

From 4df8db3f5429c481bbc6e127683c8ff366c60449 Mon Sep 17 00:00:00 2001
From: DevMirza <53424436+Zaid-maker@users.noreply.github.com>
Date: Thu, 16 Feb 2023 19:12:18 +0500
Subject: [PATCH 652/803] Add new Language: Urdu

---
 src/i18n.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/i18n.js b/src/i18n.js
index c0c07797..ffbf78f6 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -40,6 +40,7 @@ const languageList = {
     "el-GR": "Ελληνικά",
     "yue": "繁體中文 (廣東話 / 粵語)",
     "ro": "Limba română",
+    "ur": "Urdu"
 };
 
 let messages = {

From bd2c1d9c3416ce8a6f9706b2a224e317a1dc7f28 Mon Sep 17 00:00:00 2001
From: DevMirza <53424436+Zaid-maker@users.noreply.github.com>
Date: Fri, 17 Feb 2023 15:43:49 +0500
Subject: [PATCH 653/803] Add Urdu to right to left language array <3

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

diff --git a/src/i18n.js b/src/i18n.js
index ffbf78f6..2fbbfccc 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -53,7 +53,7 @@ for (let lang in languageList) {
     };
 }
 
-const rtlLangs = [ "fa", "ar-SY" ];
+const rtlLangs = [ "fa", "ar-SY", "ur" ];
 
 export const currentLocale = () => localStorage.locale
     || languageList[navigator.language] && navigator.language

From c9b4a7f53ef502a5ea58faf970102b6098d0b479 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Fri, 17 Feb 2023 17:59:43 +0300
Subject: [PATCH 654/803] Change column type

---
 db/patch-http-body-encoding.sql | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/db/patch-http-body-encoding.sql b/db/patch-http-body-encoding.sql
index de02bede..fa75ae90 100644
--- a/db/patch-http-body-encoding.sql
+++ b/db/patch-http-body-encoding.sql
@@ -1,6 +1,6 @@
 -- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
 BEGIN TRANSACTION;
 
-ALTER TABLE [monitor] ADD http_body_encoding TEXT;
+ALTER TABLE [monitor] ADD http_body_encoding VARCHAR(25);
 
 COMMIT;

From 3b74f5f3590d094864770c5b81ed2c3a3f01e443 Mon Sep 17 00:00:00 2001
From: cyril59310 <archas.cyril@hotmail.fr>
Date: Fri, 17 Feb 2023 19:50:18 +0100
Subject: [PATCH 655/803] empty

---
 empty | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 empty

diff --git a/empty b/empty
new file mode 100644
index 00000000..e69de29b

From 9e3a77f4194b43bc617fb22756521f99b05e1aa1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Sat, 18 Feb 2023 17:02:56 +0300
Subject: [PATCH 656/803] Customize body placeholder for body encoding

---
 src/pages/EditMonitor.vue | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index d36693bb..2d28195e 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -732,6 +732,15 @@ message HealthCheckResponse {
             ` ]);
         },
         bodyPlaceholder() {
+            if (this.monitor && this.monitor.httpBodyEncoding && this.monitor.httpBodyEncoding === "xml") {
+                return this.$t("Example:", [ `
+<?xml version="1.0" encoding="utf-8"?>
+<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
+  <soap:Body>
+    <Uptime>Kuma</Uptime>
+  </soap:Body>
+</soap:Envelope>` ]);
+            }
             return this.$t("Example:", [ `
 {
     "key": "value"

From 3ab0faee91d5aae3b0d0dc6a54b8ceeafa64e337 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Sat, 18 Feb 2023 22:18:48 +0300
Subject: [PATCH 657/803] Add update query for old monitors and save new data
 correctly

---
 db/patch-http-body-encoding.sql | 8 +++++++-
 src/pages/EditMonitor.vue       | 5 +++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/db/patch-http-body-encoding.sql b/db/patch-http-body-encoding.sql
index fa75ae90..322c8b89 100644
--- a/db/patch-http-body-encoding.sql
+++ b/db/patch-http-body-encoding.sql
@@ -1,6 +1,12 @@
 -- You should not modify if this have pushed to Github, unless it does serious wrong with the db.
 BEGIN TRANSACTION;
 
-ALTER TABLE [monitor] ADD http_body_encoding VARCHAR(25);
+ALTER TABLE monitor ADD http_body_encoding VARCHAR(25);
+
+COMMIT;
+
+BEGIN TRANSACTION;
+
+UPDATE monitor SET http_body_encoding = 'json' WHERE (type = 'http' or type = 'keyword') AND http_body_encoding IS NULL;
 
 COMMIT;
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 2d28195e..dbf44d73 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -952,6 +952,7 @@ message HealthCheckResponse {
          * @returns {void}
          */
         async submit() {
+
             this.processing = true;
 
             if (!this.isInputValid()) {
@@ -964,6 +965,10 @@ message HealthCheckResponse {
                 this.monitor.body = JSON.stringify(JSON.parse(this.monitor.body), null, 4);
             }
 
+            if (this.monitor.type && this.monitor.type !== "http" && this.monitor.type !== "keyword") {
+                this.monitor.httpBodyEncoding = null;
+            }
+
             if (this.monitor.headers) {
                 this.monitor.headers = JSON.stringify(JSON.parse(this.monitor.headers), null, 4);
             }

From cf32b8bc64b866c9d050aa1747a123bc78d81e9e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 20 Feb 2023 20:26:53 +0800
Subject: [PATCH 658/803] Read latest version from website and add `Run when
 system starts`

---
 extra/exe-builder/.gitignore        |   1 +
 extra/exe-builder/App.config        |  26 ++++-
 extra/exe-builder/DownloadForm.cs   |  14 ++-
 extra/exe-builder/FodyWeavers.xml   |   3 +
 extra/exe-builder/FodyWeavers.xsd   | 141 ++++++++++++++++++++++++++++
 extra/exe-builder/Program.cs        |  28 +++++-
 extra/exe-builder/UptimeKuma.csproj | 104 +++++++++++++++++++-
 extra/exe-builder/Version.cs        |   9 ++
 extra/exe-builder/packages.config   |  52 ++++++++++
 9 files changed, 373 insertions(+), 5 deletions(-)
 create mode 100644 extra/exe-builder/.gitignore
 create mode 100644 extra/exe-builder/FodyWeavers.xml
 create mode 100644 extra/exe-builder/FodyWeavers.xsd
 create mode 100644 extra/exe-builder/Version.cs
 create mode 100644 extra/exe-builder/packages.config

diff --git a/extra/exe-builder/.gitignore b/extra/exe-builder/.gitignore
new file mode 100644
index 00000000..d52874b6
--- /dev/null
+++ b/extra/exe-builder/.gitignore
@@ -0,0 +1 @@
+packages/
diff --git a/extra/exe-builder/App.config b/extra/exe-builder/App.config
index 09265d8b..e1ab3695 100644
--- a/extra/exe-builder/App.config
+++ b/extra/exe-builder/App.config
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
     <startup>
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
@@ -7,4 +7,28 @@
     <System.Windows.Forms.ApplicationConfigurationSection>
         <add key="DpiAwareness" value="PerMonitorV2" />
     </System.Windows.Forms.ApplicationConfigurationSection>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
 </configuration>
diff --git a/extra/exe-builder/DownloadForm.cs b/extra/exe-builder/DownloadForm.cs
index f16af422..aed8bd29 100644
--- a/extra/exe-builder/DownloadForm.cs
+++ b/extra/exe-builder/DownloadForm.cs
@@ -8,6 +8,7 @@ using System.Net;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Windows.Forms;
+using Newtonsoft.Json;
 
 namespace UptimeKuma {
     public partial class DownloadForm : Form {
@@ -23,9 +24,18 @@ namespace UptimeKuma {
             webClient.DownloadProgressChanged += DownloadProgressChanged;
             webClient.DownloadFileCompleted += DownloadFileCompleted;
 
+            label.Text = "Reading latest version...";
+
+            // Read json from https://uptime.kuma.pet/version
+            var versionObj = JsonConvert.DeserializeObject<Version>(new WebClient().DownloadString("https://uptime.kuma.pet/version"));
+
+
+            var nodeVersion = versionObj.nodejs;
+            var uptimeKumaVersion = versionObj.latest;
+
             if (!Directory.Exists("node")) {
                 downloadQueue.Enqueue(new DownloadItem {
-                    URL = "https://nodejs.org/dist/v16.17.1/node-v16.17.1-win-x64.zip",
+                    URL = $"https://nodejs.org/dist/v{nodeVersion}/node-v{nodeVersion}-win-x64.zip",
                     Filename = "node.zip",
                     TargetFolder = "node"
                 });
@@ -33,7 +43,7 @@ namespace UptimeKuma {
 
             if (!Directory.Exists("node")) {
                 downloadQueue.Enqueue(new DownloadItem {
-                    URL = "https://github.com/louislam/uptime-kuma/archive/refs/tags/1.18.3.zip",
+                    URL = $"https://github.com/louislam/uptime-kuma/archive/refs/tags/{uptimeKumaVersion}.zip",
                     Filename = "core.zip",
                     TargetFolder = "core"
                 });
diff --git a/extra/exe-builder/FodyWeavers.xml b/extra/exe-builder/FodyWeavers.xml
new file mode 100644
index 00000000..f1dea8fc
--- /dev/null
+++ b/extra/exe-builder/FodyWeavers.xml
@@ -0,0 +1,3 @@
+<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
+  <Costura />
+</Weavers>
\ No newline at end of file
diff --git a/extra/exe-builder/FodyWeavers.xsd b/extra/exe-builder/FodyWeavers.xsd
new file mode 100644
index 00000000..ff119f71
--- /dev/null
+++ b/extra/exe-builder/FodyWeavers.xsd
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
+  <xs:element name="Weavers">
+    <xs:complexType>
+      <xs:all>
+        <xs:element name="Costura" minOccurs="0" maxOccurs="1">
+          <xs:complexType>
+            <xs:all>
+              <xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="ExcludeRuntimeAssemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="IncludeRuntimeAssemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+              <xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
+                <xs:annotation>
+                  <xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation>
+                </xs:annotation>
+              </xs:element>
+            </xs:all>
+            <xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IncludeDebugSymbols" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IncludeRuntimeReferences" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Controls if runtime assemblies are also embedded.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="UseRuntimeReferencePaths" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisableCompression" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="DisableCleanup" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="LoadAtModuleInit" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean">
+              <xs:annotation>
+                <xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExcludeAssemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IncludeAssemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="ExcludeRuntimeAssemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="IncludeRuntimeAssemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Unmanaged32Assemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="Unmanaged64Assemblies" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="PreloadOrder" type="xs:string">
+              <xs:annotation>
+                <xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation>
+              </xs:annotation>
+            </xs:attribute>
+          </xs:complexType>
+        </xs:element>
+      </xs:all>
+      <xs:attribute name="VerifyAssembly" type="xs:boolean">
+        <xs:annotation>
+          <xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="VerifyIgnoreCodes" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+      <xs:attribute name="GenerateXsd" type="xs:boolean">
+        <xs:annotation>
+          <xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
+        </xs:annotation>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
\ No newline at end of file
diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 82c76b05..27e345b7 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -8,6 +8,7 @@ using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Threading.Tasks;
 using System.Windows.Forms;
+using Microsoft.Win32;
 using UptimeKuma.Properties;
 
 namespace UptimeKuma {
@@ -25,17 +26,27 @@ namespace UptimeKuma {
 
     public class UptimeKumaApplicationContext : ApplicationContext
     {
+        const string appName = "Uptime Kuma";
+
         private NotifyIcon trayIcon;
         private Process process;
 
+        private MenuItem runWhenStarts;
+
+        private RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
+
         public UptimeKumaApplicationContext()
         {
             trayIcon = new NotifyIcon();
 
+            runWhenStarts = new MenuItem("Run when system starts", RunWhenStarts);
+            runWhenStarts.Checked = registryKey.GetValue(appName) != null;
+
             trayIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
             trayIcon.ContextMenu = new ContextMenu(new MenuItem[] {
                 new("Open", Open),
                 //new("Debug Console", DebugConsole),
+                runWhenStarts,
                 new("Check for Update...", CheckForUpdate),
                 new("Visit GitHub...", VisitGitHub),
                 new("About", About),
@@ -59,6 +70,21 @@ namespace UptimeKuma {
             form.Show();
         }
 
+        private void RunWhenStarts(object sender, EventArgs e) {
+            if (registryKey == null) {
+                MessageBox.Show("Error: Unable to set startup registry key.");
+                return;
+            }
+
+            if (runWhenStarts.Checked) {
+                registryKey.DeleteValue(appName, false);
+                runWhenStarts.Checked = false;
+            } else {
+                registryKey.SetValue(appName, Application.ExecutablePath);
+                runWhenStarts.Checked = true;
+            }
+        }
+
         void StartProcess() {
             var startInfo = new ProcessStartInfo {
                 FileName = "node/node.exe",
@@ -103,7 +129,7 @@ namespace UptimeKuma {
 
         void About(object sender, EventArgs e)
         {
-            MessageBox.Show("Uptime Kuma v1.0.0" + Environment.NewLine + "© 2022 Louis Lam", "Info");
+            MessageBox.Show("Uptime Kuma Windows Runtime v1.0.0" + Environment.NewLine + "© 2023 Louis Lam", "Info");
         }
 
         void Exit(object sender, EventArgs e)
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
index 2ad857b2..3f55649e 100644
--- a/extra/exe-builder/UptimeKuma.csproj
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
     <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
     <PropertyGroup>
         <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -38,18 +39,104 @@
       <PostBuildEvent>COPY "$(SolutionDir)bin\Debug\uptime-kuma.exe" "%UserProfile%\Desktop\uptime-kuma-win64\"</PostBuildEvent>
     </PropertyGroup>
     <ItemGroup>
+        <Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
+          <HintPath>packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
+        </Reference>
+        <Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
+        </Reference>
+        <Reference Include="mscorlib" />
+        <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+          <HintPath>packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
+        </Reference>
         <Reference Include="System" />
+        <Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
+        </Reference>
+        <Reference Include="System.ComponentModel.Composition" />
+        <Reference Include="System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
+        </Reference>
         <Reference Include="System.Core" />
+        <Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+          <HintPath>packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
+        </Reference>
         <Reference Include="System.IO.Compression.FileSystem" />
+        <Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Numerics" />
+        <Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll</HintPath>
+        </Reference>
         <Reference Include="System.Xml.Linq" />
         <Reference Include="System.Data.DataSetExtensions" />
         <Reference Include="Microsoft.CSharp" />
         <Reference Include="System.Data" />
         <Reference Include="System.Deployment" />
         <Reference Include="System.Drawing" />
-        <Reference Include="System.Net.Http" />
         <Reference Include="System.Windows.Forms" />
         <Reference Include="System.Xml" />
+        <Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
+        </Reference>
     </ItemGroup>
     <ItemGroup>
         <Compile Include="DownloadForm.cs">
@@ -60,6 +147,7 @@
         </Compile>
         <Compile Include="Program.cs" />
         <Compile Include="Properties\AssemblyInfo.cs" />
+        <Compile Include="Version.cs" />
         <EmbeddedResource Include="DownloadForm.resx">
           <DependentUpon>DownloadForm.cs</DependentUpon>
         </EmbeddedResource>
@@ -75,6 +163,7 @@
         <None Include="..\..\public\favicon.ico">
           <Link>favicon.ico</Link>
         </None>
+        <None Include="packages.config" />
         <None Include="Properties\Settings.settings">
             <Generator>SettingsSingleFileGenerator</Generator>
             <LastGenOutput>Settings.Designer.cs</LastGenOutput>
@@ -88,5 +177,18 @@
     <ItemGroup>
         <None Include="App.config" />
     </ItemGroup>
+    <ItemGroup>
+      <Content Include=".gitignore" />
+    </ItemGroup>
     <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+    <Import Project="packages\Fody.6.5.5\build\Fody.targets" Condition="Exists('packages\Fody.6.5.5\build\Fody.targets')" />
+    <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+      <PropertyGroup>
+        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}.</ErrorText>
+      </PropertyGroup>
+      <Error Condition="!Exists('packages\Fody.6.5.5\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.5.5\build\Fody.targets'))" />
+      <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
+      <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
+    </Target>
+    <Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
 </Project>
\ No newline at end of file
diff --git a/extra/exe-builder/Version.cs b/extra/exe-builder/Version.cs
new file mode 100644
index 00000000..896c7a24
--- /dev/null
+++ b/extra/exe-builder/Version.cs
@@ -0,0 +1,9 @@
+namespace UptimeKuma {
+    public class Version {
+        public string latest { get; set; }
+        public string slow { get; set; }
+        public string beta { get; set; }
+        public string nodejs { get; set; }
+        public string exe { get; set; }
+    }
+}
diff --git a/extra/exe-builder/packages.config b/extra/exe-builder/packages.config
new file mode 100644
index 00000000..82dd7c3b
--- /dev/null
+++ b/extra/exe-builder/packages.config
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Costura.Fody" version="5.7.0" targetFramework="net472" developmentDependency="true" />
+  <package id="Fody" version="6.5.5" targetFramework="net472" developmentDependency="true" />
+  <package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net472" />
+  <package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net472" />
+  <package id="NETStandard.Library" version="1.6.1" targetFramework="net472" />
+  <package id="Newtonsoft.Json" version="13.0.2" targetFramework="net472" />
+  <package id="System.AppContext" version="4.3.0" targetFramework="net472" />
+  <package id="System.Collections" version="4.3.0" targetFramework="net472" />
+  <package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net472" />
+  <package id="System.Console" version="4.3.0" targetFramework="net472" />
+  <package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net472" />
+  <package id="System.Diagnostics.DiagnosticSource" version="4.3.0" targetFramework="net472" />
+  <package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net472" />
+  <package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net472" />
+  <package id="System.Globalization" version="4.3.0" targetFramework="net472" />
+  <package id="System.Globalization.Calendars" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO.Compression" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO.FileSystem" version="4.3.0" targetFramework="net472" />
+  <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net472" />
+  <package id="System.Linq" version="4.3.0" targetFramework="net472" />
+  <package id="System.Linq.Expressions" version="4.3.0" targetFramework="net472" />
+  <package id="System.Net.Http" version="4.3.0" targetFramework="net472" />
+  <package id="System.Net.Primitives" version="4.3.0" targetFramework="net472" />
+  <package id="System.Net.Sockets" version="4.3.0" targetFramework="net472" />
+  <package id="System.ObjectModel" version="4.3.0" targetFramework="net472" />
+  <package id="System.Reflection" version="4.3.0" targetFramework="net472" />
+  <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net472" />
+  <package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net472" />
+  <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.Handles" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net472" />
+  <package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net472" />
+  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
+  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
+  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net472" />
+  <package id="System.Text.Encoding" version="4.3.0" targetFramework="net472" />
+  <package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net472" />
+  <package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="net472" />
+  <package id="System.Threading" version="4.3.0" targetFramework="net472" />
+  <package id="System.Threading.Tasks" version="4.3.0" targetFramework="net472" />
+  <package id="System.Threading.Timer" version="4.3.0" targetFramework="net472" />
+  <package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="net472" />
+  <package id="System.Xml.XDocument" version="4.3.0" targetFramework="net472" />
+</packages>
\ No newline at end of file

From 372c6b90783ec3fdc7ac0ebbd7a58f6a0de2ecdd Mon Sep 17 00:00:00 2001
From: Andreas Brett <andreasbrett@users.noreply.github.com>
Date: Mon, 20 Feb 2023 16:09:17 +0100
Subject: [PATCH 659/803] add markdown support for description

---
 src/pages/StatusPage.vue | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index dcee15e7..f4a6eb76 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -20,6 +20,9 @@
                 <div class="my-3">
                     <label for="description" class="form-label">{{ $t("Description") }}</label>
                     <textarea id="description" v-model="config.description" class="form-control"></textarea>
+                    <div class="form-text">
+                        {{ $t("markdownSupported") }}
+                    </div>
                 </div>
 
                 <!-- Footer Text -->
@@ -258,7 +261,9 @@
 
             <!-- Description -->
             <strong v-if="editMode">{{ $t("Description") }}:</strong>
-            <Editable v-model="config.description" :contenteditable="editMode" tag="div" class="mb-4 description" />
+            <Editable v-if="enableEditMode" v-model="config.description" :contenteditable="editMode" tag="div" class="mb-4 description" />
+            <!-- eslint-disable-next-line vue/no-v-html-->
+            <div v-if="! enableEditMode" class="alert-heading p-2" v-html="descriptionHTML"></div>
 
             <div v-if="editMode" class="mb-4">
                 <div>
@@ -500,6 +505,10 @@ export default {
             return DOMPurify.sanitize(marked(this.incident.content));
         },
 
+        descriptionHTML() {
+            return DOMPurify.sanitize(marked(this.config.description));
+        },
+
         footerHTML() {
             return DOMPurify.sanitize(marked(this.config.footerText));
         },

From 4642f9be0af92e6e8cde9a67b8c460541b665ffa Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 20 Feb 2023 23:15:49 +0800
Subject: [PATCH 660/803] Fix download-dist.js do not exit sometimes

---
 extra/download-dist.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/extra/download-dist.js b/extra/download-dist.js
index b04beec7..a854ca8b 100644
--- a/extra/download-dist.js
+++ b/extra/download-dist.js
@@ -47,6 +47,7 @@ function download(url) {
                     });
                 }
                 console.log("Done");
+                process.exit(0);
             });
 
             tarStream.on("error", () => {

From 22902139d2885fea7ee3d985f6755835f5f095a8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 21 Feb 2023 02:50:25 +0800
Subject: [PATCH 661/803] Implement update

---
 extra/exe-builder/DownloadForm.cs | 39 ++++++++++++++++++++++--------
 extra/exe-builder/Program.cs      | 40 +++++++++++++++++++++++++++++--
 2 files changed, 67 insertions(+), 12 deletions(-)

diff --git a/extra/exe-builder/DownloadForm.cs b/extra/exe-builder/DownloadForm.cs
index aed8bd29..28a57c52 100644
--- a/extra/exe-builder/DownloadForm.cs
+++ b/extra/exe-builder/DownloadForm.cs
@@ -27,11 +27,12 @@ namespace UptimeKuma {
             label.Text = "Reading latest version...";
 
             // Read json from https://uptime.kuma.pet/version
-            var versionObj = JsonConvert.DeserializeObject<Version>(new WebClient().DownloadString("https://uptime.kuma.pet/version"));
-
+            var versionJson = new WebClient().DownloadString("https://uptime.kuma.pet/version");
+            var versionObj = JsonConvert.DeserializeObject<Version>(versionJson);
 
             var nodeVersion = versionObj.nodejs;
             var uptimeKumaVersion = versionObj.latest;
+            var hasUpdateFile = File.Exists("update");
 
             if (!Directory.Exists("node")) {
                 downloadQueue.Enqueue(new DownloadItem {
@@ -41,12 +42,30 @@ namespace UptimeKuma {
                 });
             }
 
-            if (!Directory.Exists("node")) {
+            if (!Directory.Exists("core") || hasUpdateFile) {
+
+                // It is update, rename the core folder to core.old
+                if (Directory.Exists("core")) {
+                    // Remove the old core.old folder
+                    if (Directory.Exists("core.old")) {
+                        Directory.Delete("core.old", true);
+                    }
+
+                    Directory.Move("core", "core.old");
+                }
+
                 downloadQueue.Enqueue(new DownloadItem {
                     URL = $"https://github.com/louislam/uptime-kuma/archive/refs/tags/{uptimeKumaVersion}.zip",
                     Filename = "core.zip",
                     TargetFolder = "core"
                 });
+
+                File.WriteAllText("version.json", versionJson);
+
+                // Delete the update file
+                if (hasUpdateFile) {
+                    File.Delete("update");
+                }
             }
 
             DownloadNextFile();
@@ -75,9 +94,12 @@ namespace UptimeKuma {
         void npmSetup() {
             labelData.Text = "";
 
+            var npm = "..\\node\\npm.cmd";
+            var cmd = $"{npm} ci --production & {npm} run download-dist & exit";
+
             var startInfo = new ProcessStartInfo {
                 FileName = "cmd.exe",
-                Arguments = "run setup",
+                Arguments = $"/k \"{cmd}\"",
                 RedirectStandardOutput = false,
                 RedirectStandardError = false,
                 RedirectStandardInput = true,
@@ -89,11 +111,11 @@ namespace UptimeKuma {
             var process = new Process();
             process.StartInfo = startInfo;
             process.EnableRaisingEvents = true;
-            process.Exited += (object _, EventArgs e) => {
+            process.Exited += (_, e) => {
                 progressBar.Value = 100;
 
                if (process.ExitCode == 0) {
-                   Task.Delay(2000).ContinueWith((task) => {
+                   Task.Delay(2000).ContinueWith(_ => {
                        Application.Restart();
                    });
                    label.Text = "Done";
@@ -105,10 +127,7 @@ namespace UptimeKuma {
             process.Start();
             label.Text = "Installing dependencies and download dist files";
             progressBar.Value = 50;
-
-            process.StandardInput.WriteLine("\"../node/npm\" ci --production");
-            process.StandardInput.WriteLine("\"../node/npm\" run download-dist");
-            process.StandardInput.WriteLine("exit");
+            process.WaitForExit();
         }
 
         void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 27e345b7..1385e830 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -4,11 +4,13 @@ using System.Diagnostics;
 using System.Drawing;
 using System.IO;
 using System.Linq;
+using System.Net;
 using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using Microsoft.Win32;
+using Newtonsoft.Json;
 using UptimeKuma.Properties;
 
 namespace UptimeKuma {
@@ -56,7 +58,9 @@ namespace UptimeKuma {
             trayIcon.MouseDoubleClick += new MouseEventHandler(Open);
             trayIcon.Visible = true;
 
-            if (Directory.Exists("core") && Directory.Exists("node") && Directory.Exists("core/node_modules") && Directory.Exists("core/dist")) {
+            var hasUpdateFile = File.Exists("update");
+
+            if (!hasUpdateFile && Directory.Exists("core") && Directory.Exists("node") && Directory.Exists("core/node_modules") && Directory.Exists("core/dist")) {
                 // Go go go
                 StartProcess();
             } else {
@@ -110,6 +114,10 @@ namespace UptimeKuma {
             }
         }
 
+        void StopProcess() {
+            process?.Kill();
+        }
+
         void Open(object sender, EventArgs e) {
             Process.Start("http://localhost:3001");
         }
@@ -119,7 +127,35 @@ namespace UptimeKuma {
         }
 
         void CheckForUpdate(object sender, EventArgs e) {
-            Process.Start("https://github.com/louislam/uptime-kuma/releases");
+            var needUpdate = false;
+
+            // Check version.json exists
+            if (File.Exists("version.json")) {
+                // Load version.json and compare with the latest version from GitHub
+                var currentVersionObj = JsonConvert.DeserializeObject<Version>(File.ReadAllText("version.json"));
+
+                var versionJson = new WebClient().DownloadString("https://uptime.kuma.pet/version");
+                var latestVersionObj = JsonConvert.DeserializeObject<Version>(versionJson);
+
+                // Compare version, if the latest version is newer, then update
+                if (new System.Version(latestVersionObj.latest).CompareTo(new System.Version(currentVersionObj.latest)) > 0) {
+                    var result = MessageBox.Show("A new version is available. Do you want to update?", "Update", MessageBoxButtons.YesNo);
+                    if (result == DialogResult.Yes) {
+                        // Create a empty file `update`, so the app will download the core files again at startup
+                        File.Create("update").Close();
+
+                        trayIcon.Visible = false;
+                        process?.Kill();
+
+                        // Restart the app, it will download the core files again at startup
+                        Application.Restart();
+                    }
+                } else {
+                    MessageBox.Show("You are using the latest version.");
+                }
+            }
+
+
         }
 
         void VisitGitHub(object sender, EventArgs e)

From 0e38391454f012c6f0e87ab0e768b6aa15ab0ee8 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 21 Feb 2023 03:11:29 +0800
Subject: [PATCH 662/803] Fix dpi issue using app.manifest

---
 extra/exe-builder/App.config        |   5 +-
 extra/exe-builder/UptimeKuma.csproj | 390 ++++++++++++++--------------
 extra/exe-builder/app.manifest      |  28 ++
 3 files changed, 226 insertions(+), 197 deletions(-)
 create mode 100644 extra/exe-builder/app.manifest

diff --git a/extra/exe-builder/App.config b/extra/exe-builder/App.config
index e1ab3695..2514085c 100644
--- a/extra/exe-builder/App.config
+++ b/extra/exe-builder/App.config
@@ -1,12 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
     <startup>
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
     </startup>
 
-    <System.Windows.Forms.ApplicationConfigurationSection>
-        <add key="DpiAwareness" value="PerMonitorV2" />
-    </System.Windows.Forms.ApplicationConfigurationSection>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
index 3f55649e..6b7534af 100644
--- a/extra/exe-builder/UptimeKuma.csproj
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -1,194 +1,198 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-    <Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
-    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
-    <PropertyGroup>
-        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-        <ProjectGuid>{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}</ProjectGuid>
-        <OutputType>WinExe</OutputType>
-        <RootNamespace>UptimeKuma</RootNamespace>
-        <AssemblyName>uptime-kuma</AssemblyName>
-        <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
-        <FileAlignment>512</FileAlignment>
-        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
-        <Deterministic>true</Deterministic>
-        <ApplicationIcon>..\..\public\favicon.ico</ApplicationIcon>
-        <LangVersion>9</LangVersion>
-    </PropertyGroup>
-    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-        <PlatformTarget>AnyCPU</PlatformTarget>
-        <DebugSymbols>true</DebugSymbols>
-        <DebugType>full</DebugType>
-        <Optimize>false</Optimize>
-        <OutputPath>bin\Debug\</OutputPath>
-        <DefineConstants>DEBUG;TRACE</DefineConstants>
-        <ErrorReport>prompt</ErrorReport>
-        <WarningLevel>4</WarningLevel>
-    </PropertyGroup>
-    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-        <PlatformTarget>AnyCPU</PlatformTarget>
-        <DebugType>pdbonly</DebugType>
-        <Optimize>true</Optimize>
-        <OutputPath>bin\Release\</OutputPath>
-        <DefineConstants>TRACE</DefineConstants>
-        <ErrorReport>prompt</ErrorReport>
-        <WarningLevel>4</WarningLevel>
-    </PropertyGroup>
-    <PropertyGroup>
-      <PostBuildEvent>COPY "$(SolutionDir)bin\Debug\uptime-kuma.exe" "%UserProfile%\Desktop\uptime-kuma-win64\"</PostBuildEvent>
-    </PropertyGroup>
-    <ItemGroup>
-        <Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
-          <HintPath>packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
-        </Reference>
-        <Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
-        </Reference>
-        <Reference Include="mscorlib" />
-        <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-          <HintPath>packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
-        </Reference>
-        <Reference Include="System" />
-        <Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
-        </Reference>
-        <Reference Include="System.ComponentModel.Composition" />
-        <Reference Include="System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Core" />
-        <Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
-          <HintPath>packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
-        </Reference>
-        <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
-        </Reference>
-        <Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
-          <HintPath>packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
-        </Reference>
-        <Reference Include="System.IO.Compression.FileSystem" />
-        <Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
-          <HintPath>packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
-        </Reference>
-        <Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
-        </Reference>
-        <Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Numerics" />
-        <Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll</HintPath>
-        </Reference>
-        <Reference Include="System.Xml.Linq" />
-        <Reference Include="System.Data.DataSetExtensions" />
-        <Reference Include="Microsoft.CSharp" />
-        <Reference Include="System.Data" />
-        <Reference Include="System.Deployment" />
-        <Reference Include="System.Drawing" />
-        <Reference Include="System.Windows.Forms" />
-        <Reference Include="System.Xml" />
-        <Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
-        </Reference>
-    </ItemGroup>
-    <ItemGroup>
-        <Compile Include="DownloadForm.cs">
-          <SubType>Form</SubType>
-        </Compile>
-        <Compile Include="DownloadForm.Designer.cs">
-          <DependentUpon>DownloadForm.cs</DependentUpon>
-        </Compile>
-        <Compile Include="Program.cs" />
-        <Compile Include="Properties\AssemblyInfo.cs" />
-        <Compile Include="Version.cs" />
-        <EmbeddedResource Include="DownloadForm.resx">
-          <DependentUpon>DownloadForm.cs</DependentUpon>
-        </EmbeddedResource>
-        <EmbeddedResource Include="Properties\Resources.resx">
-            <Generator>ResXFileCodeGenerator</Generator>
-            <LastGenOutput>Resources.Designer.cs</LastGenOutput>
-            <SubType>Designer</SubType>
-        </EmbeddedResource>
-        <Compile Include="Properties\Resources.Designer.cs">
-            <AutoGen>True</AutoGen>
-            <DependentUpon>Resources.resx</DependentUpon>
-        </Compile>
-        <None Include="..\..\public\favicon.ico">
-          <Link>favicon.ico</Link>
-        </None>
-        <None Include="packages.config" />
-        <None Include="Properties\Settings.settings">
-            <Generator>SettingsSingleFileGenerator</Generator>
-            <LastGenOutput>Settings.Designer.cs</LastGenOutput>
-        </None>
-        <Compile Include="Properties\Settings.Designer.cs">
-            <AutoGen>True</AutoGen>
-            <DependentUpon>Settings.settings</DependentUpon>
-            <DesignTimeSharedInput>True</DesignTimeSharedInput>
-        </Compile>
-    </ItemGroup>
-    <ItemGroup>
-        <None Include="App.config" />
-    </ItemGroup>
-    <ItemGroup>
-      <Content Include=".gitignore" />
-    </ItemGroup>
-    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-    <Import Project="packages\Fody.6.5.5\build\Fody.targets" Condition="Exists('packages\Fody.6.5.5\build\Fody.targets')" />
-    <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
-      <PropertyGroup>
-        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}.</ErrorText>
-      </PropertyGroup>
-      <Error Condition="!Exists('packages\Fody.6.5.5\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.5.5\build\Fody.targets'))" />
-      <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
-      <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
-    </Target>
-    <Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
+    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+    <PropertyGroup>
+        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+        <ProjectGuid>{2DB53988-1D93-4AC0-90C4-96ADEAAC5C04}</ProjectGuid>
+        <OutputType>WinExe</OutputType>
+        <RootNamespace>UptimeKuma</RootNamespace>
+        <AssemblyName>uptime-kuma</AssemblyName>
+        <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+        <FileAlignment>512</FileAlignment>
+        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+        <Deterministic>true</Deterministic>
+        <ApplicationIcon>..\..\public\favicon.ico</ApplicationIcon>
+        <LangVersion>9</LangVersion>
+    </PropertyGroup>
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+        <PlatformTarget>AnyCPU</PlatformTarget>
+        <DebugSymbols>true</DebugSymbols>
+        <DebugType>full</DebugType>
+        <Optimize>false</Optimize>
+        <OutputPath>bin\Debug\</OutputPath>
+        <DefineConstants>DEBUG;TRACE</DefineConstants>
+        <ErrorReport>prompt</ErrorReport>
+        <WarningLevel>4</WarningLevel>
+    </PropertyGroup>
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+        <PlatformTarget>AnyCPU</PlatformTarget>
+        <DebugType>pdbonly</DebugType>
+        <Optimize>true</Optimize>
+        <OutputPath>bin\Release\</OutputPath>
+        <DefineConstants>TRACE</DefineConstants>
+        <ErrorReport>prompt</ErrorReport>
+        <WarningLevel>4</WarningLevel>
+    </PropertyGroup>
+    <PropertyGroup>
+        <ApplicationManifest>app.manifest</ApplicationManifest>
+    </PropertyGroup>
+    <PropertyGroup>
+      <PostBuildEvent>COPY "$(SolutionDir)bin\Debug\uptime-kuma.exe" "%UserProfile%\Desktop\uptime-kuma-win64\"</PostBuildEvent>
+    </PropertyGroup>
+    <ItemGroup>
+        <Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
+          <HintPath>packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
+        </Reference>
+        <Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
+        </Reference>
+        <Reference Include="mscorlib" />
+        <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+          <HintPath>packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
+        </Reference>
+        <Reference Include="System" />
+        <Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
+        </Reference>
+        <Reference Include="System.ComponentModel.Composition" />
+        <Reference Include="System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Core" />
+        <Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+          <HintPath>packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.Compression.FileSystem" />
+        <Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
+        </Reference>
+        <Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Numerics" />
+        <Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Xml.Linq" />
+        <Reference Include="System.Data.DataSetExtensions" />
+        <Reference Include="Microsoft.CSharp" />
+        <Reference Include="System.Data" />
+        <Reference Include="System.Deployment" />
+        <Reference Include="System.Drawing" />
+        <Reference Include="System.Windows.Forms" />
+        <Reference Include="System.Xml" />
+        <Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
+        </Reference>
+    </ItemGroup>
+    <ItemGroup>
+        <Compile Include="DownloadForm.cs">
+          <SubType>Form</SubType>
+        </Compile>
+        <Compile Include="DownloadForm.Designer.cs">
+          <DependentUpon>DownloadForm.cs</DependentUpon>
+        </Compile>
+        <Compile Include="Program.cs" />
+        <Compile Include="Properties\AssemblyInfo.cs" />
+        <Compile Include="Version.cs" />
+        <EmbeddedResource Include="DownloadForm.resx">
+          <DependentUpon>DownloadForm.cs</DependentUpon>
+        </EmbeddedResource>
+        <EmbeddedResource Include="Properties\Resources.resx">
+            <Generator>ResXFileCodeGenerator</Generator>
+            <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+            <SubType>Designer</SubType>
+        </EmbeddedResource>
+        <Compile Include="Properties\Resources.Designer.cs">
+            <AutoGen>True</AutoGen>
+            <DependentUpon>Resources.resx</DependentUpon>
+        </Compile>
+        <None Include="..\..\public\favicon.ico">
+          <Link>favicon.ico</Link>
+        </None>
+        <None Include="packages.config" />
+        <None Include="Properties\Settings.settings">
+            <Generator>SettingsSingleFileGenerator</Generator>
+            <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+        </None>
+        <Compile Include="Properties\Settings.Designer.cs">
+            <AutoGen>True</AutoGen>
+            <DependentUpon>Settings.settings</DependentUpon>
+            <DesignTimeSharedInput>True</DesignTimeSharedInput>
+        </Compile>
+    </ItemGroup>
+    <ItemGroup>
+        <None Include="App.config" />
+    </ItemGroup>
+    <ItemGroup>
+      <Content Include=".gitignore" />
+      <Content Include="app.manifest" />
+    </ItemGroup>
+    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+    <Import Project="packages\Fody.6.5.5\build\Fody.targets" Condition="Exists('packages\Fody.6.5.5\build\Fody.targets')" />
+    <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+      <PropertyGroup>
+        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}.</ErrorText>
+      </PropertyGroup>
+      <Error Condition="!Exists('packages\Fody.6.5.5\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.5.5\build\Fody.targets'))" />
+      <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
+      <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
+    </Target>
+    <Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
 </Project>
\ No newline at end of file
diff --git a/extra/exe-builder/app.manifest b/extra/exe-builder/app.manifest
new file mode 100644
index 00000000..4a48528f
--- /dev/null
+++ b/extra/exe-builder/app.manifest
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
+    <asmv3:application>
+        <asmv3:windowsSettings>
+            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
+            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
+        </asmv3:windowsSettings>
+    </asmv3:application>
+    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+        <security>
+            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
+                <!-- UAC Manifest Options
+                     If you want to change the Windows User Account Control level replace the
+                     requestedExecutionLevel node with one of the following.
+
+                <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
+                <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
+                <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
+
+                    Specifying requestedExecutionLevel element will disable file and registry virtualization.
+                    Remove this element if your application requires this virtualization for backwards
+                    compatibility.
+                -->
+                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
+            </requestedPrivileges>
+        </security>
+    </trustInfo>
+</assembly>

From 02ddb58686a56146aa3545307067350a45eb2de5 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 21 Feb 2023 15:16:54 +0800
Subject: [PATCH 663/803] Fix cwd issues

---
 extra/exe-builder/FS.cs             | 65 +++++++++++++++++++++++++++++
 extra/exe-builder/UptimeKuma.csproj |  1 +
 2 files changed, 66 insertions(+)
 create mode 100644 extra/exe-builder/FS.cs

diff --git a/extra/exe-builder/FS.cs b/extra/exe-builder/FS.cs
new file mode 100644
index 00000000..99a63694
--- /dev/null
+++ b/extra/exe-builder/FS.cs
@@ -0,0 +1,65 @@
+using System.IO;
+using System.Reflection;
+
+namespace UptimeKuma {
+
+    /**
+     * Current Directory using App location
+     */
+    public class Directory {
+        private static string baseDir;
+
+        public static string FullPath(string path) {
+            return Path.Combine(GetBaseDir(), path);
+        }
+
+        public static string GetBaseDir() {
+            if (baseDir == null) {
+                baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+            }
+            return baseDir;
+        }
+
+        public static bool Exists(string path) {
+            return System.IO.Directory.Exists(FullPath(path));
+        }
+
+        public static void Delete(string path, bool recursive) {
+            System.IO.Directory.Delete(FullPath(path), recursive);
+        }
+
+        public static void Move(string src, string dest) {
+            System.IO.Directory.Move(FullPath(src), FullPath(dest));
+        }
+
+        public static string[] GetDirectories(string path) {
+            return System.IO.Directory.GetDirectories(FullPath(path));
+        }
+    }
+
+    public class File {
+
+        private static string FullPath(string path) {
+            return Directory.FullPath(path);
+        }
+        public static bool Exists(string path) {
+            return System.IO.File.Exists(FullPath(path));
+        }
+
+        public static FileStream Create(string path) {
+            return System.IO.File.Create(FullPath(path));
+        }
+
+        public static string ReadAllText(string path) {
+            return System.IO.File.ReadAllText(FullPath(path));
+        }
+
+        public static void Delete(string path) {
+            System.IO.File.Delete(FullPath(path));
+        }
+
+        public static void WriteAllText(string path, string content) {
+            System.IO.File.WriteAllText(FullPath(path), content);
+        }
+    }
+}
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
index 6b7534af..1b484d7a 100644
--- a/extra/exe-builder/UptimeKuma.csproj
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -148,6 +148,7 @@
         <Compile Include="DownloadForm.Designer.cs">
           <DependentUpon>DownloadForm.cs</DependentUpon>
         </Compile>
+        <Compile Include="FS.cs" />
         <Compile Include="Program.cs" />
         <Compile Include="Properties\AssemblyInfo.cs" />
         <Compile Include="Version.cs" />

From dad21065cf3e6045bd3a6fcf6a2b5d20f0b9d08b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 21 Feb 2023 15:45:18 +0800
Subject: [PATCH 664/803] Update release procedures

---
 CONTRIBUTING.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 09c94e71..4c6a5587 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -235,6 +235,7 @@ https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc
 
 1. Draft a release note
 2. Make sure the repo is cleared
+3. If the healthcheck is updated, remember to re-compile it: `npm run build-docker-builder-go`
 3. `npm run release-final with env vars: `VERSION` and `GITHUB_TOKEN`
 4. Wait until the `Press any key to continue`
 5. `git push`

From 2c62d197a08462fa7fb044f23395eb1464e9a031 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 21 Feb 2023 16:03:41 +0800
Subject: [PATCH 665/803] [exe] Update dependencies

---
 extra/exe-builder/App.config        |  6 +++-
 extra/exe-builder/UptimeKuma.csproj | 48 +++++++++++++++++++----------
 extra/exe-builder/packages.config   | 30 ++++++++++--------
 3 files changed, 53 insertions(+), 31 deletions(-)

diff --git a/extra/exe-builder/App.config b/extra/exe-builder/App.config
index 2514085c..97eb34af 100644
--- a/extra/exe-builder/App.config
+++ b/extra/exe-builder/App.config
@@ -20,12 +20,16 @@
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.1" newVersion="4.1.1.1" />
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
         <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
       </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+      </dependentAssembly>
     </assemblyBinding>
   </runtime>
 </configuration>
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
index 1b484d7a..bd4e0dea 100644
--- a/extra/exe-builder/UptimeKuma.csproj
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -56,13 +56,16 @@
         <Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
           <HintPath>packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll</HintPath>
         </Reference>
+        <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+          <HintPath>packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
+        </Reference>
         <Reference Include="System.ComponentModel.Composition" />
-        <Reference Include="System.Console, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
+        <Reference Include="System.Console, Version=4.0.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Console.4.3.1\lib\net46\System.Console.dll</HintPath>
         </Reference>
         <Reference Include="System.Core" />
-        <Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
-          <HintPath>packages\System.Diagnostics.DiagnosticSource.4.3.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
+        <Reference Include="System.Diagnostics.DiagnosticSource, Version=7.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+          <HintPath>packages\System.Diagnostics.DiagnosticSource.7.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
         </Reference>
         <Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
           <HintPath>packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
@@ -92,21 +95,30 @@
         <Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
           <HintPath>packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
         </Reference>
-        <Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
+        <Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+          <HintPath>packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
         </Reference>
         <Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
           <HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
         </Reference>
         <Reference Include="System.Numerics" />
+        <Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
+        </Reference>
         <Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
           <HintPath>packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
         </Reference>
-        <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
+        <Reference Include="System.Runtime, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.4.3.1\lib\net462\System.Runtime.dll</HintPath>
         </Reference>
-        <Reference Include="System.Runtime.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Runtime.Extensions.4.3.0\lib\net462\System.Runtime.Extensions.dll</HintPath>
+        <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+        </Reference>
+        <Reference Include="System.Runtime.Extensions, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Runtime.Extensions.4.3.1\lib\net462\System.Runtime.Extensions.dll</HintPath>
         </Reference>
         <Reference Include="System.Runtime.InteropServices, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
           <HintPath>packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll</HintPath>
@@ -115,7 +127,7 @@
           <HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
         </Reference>
         <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
+          <HintPath>packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
         </Reference>
         <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
           <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
@@ -123,11 +135,11 @@
         <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
           <HintPath>packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
         </Reference>
-        <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
+        <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
         </Reference>
         <Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Text.RegularExpressions.4.3.0\lib\net463\System.Text.RegularExpressions.dll</HintPath>
+          <HintPath>packages\System.Text.RegularExpressions.4.3.1\lib\net463\System.Text.RegularExpressions.dll</HintPath>
         </Reference>
         <Reference Include="System.Xml.Linq" />
         <Reference Include="System.Data.DataSetExtensions" />
@@ -138,7 +150,7 @@
         <Reference Include="System.Windows.Forms" />
         <Reference Include="System.Xml" />
         <Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
-          <HintPath>packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
+          <HintPath>packages\System.Xml.ReaderWriter.4.3.1\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
         </Reference>
     </ItemGroup>
     <ItemGroup>
@@ -186,14 +198,16 @@
       <Content Include="app.manifest" />
     </ItemGroup>
     <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-    <Import Project="packages\Fody.6.5.5\build\Fody.targets" Condition="Exists('packages\Fody.6.5.5\build\Fody.targets')" />
     <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
       <PropertyGroup>
         <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}.</ErrorText>
       </PropertyGroup>
-      <Error Condition="!Exists('packages\Fody.6.5.5\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.5.5\build\Fody.targets'))" />
       <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
       <Error Condition="!Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
+      <Error Condition="!Exists('packages\Fody.6.6.4\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fody.6.6.4\build\Fody.targets'))" />
+      <Error Condition="!Exists('packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
     </Target>
     <Import Project="packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
+    <Import Project="packages\Fody.6.6.4\build\Fody.targets" Condition="Exists('packages\Fody.6.6.4\build\Fody.targets')" />
+    <Import Project="packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
 </Project>
\ No newline at end of file
diff --git a/extra/exe-builder/packages.config b/extra/exe-builder/packages.config
index 82dd7c3b..aca26d67 100644
--- a/extra/exe-builder/packages.config
+++ b/extra/exe-builder/packages.config
@@ -1,17 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="Costura.Fody" version="5.7.0" targetFramework="net472" developmentDependency="true" />
-  <package id="Fody" version="6.5.5" targetFramework="net472" developmentDependency="true" />
-  <package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net472" />
+  <package id="Fody" version="6.6.4" targetFramework="net472" developmentDependency="true" />
+  <package id="Microsoft.NETCore.Platforms" version="7.0.0" targetFramework="net472" />
   <package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net472" />
-  <package id="NETStandard.Library" version="1.6.1" targetFramework="net472" />
+  <package id="NETStandard.Library" version="2.0.3" targetFramework="net472" />
   <package id="Newtonsoft.Json" version="13.0.2" targetFramework="net472" />
   <package id="System.AppContext" version="4.3.0" targetFramework="net472" />
+  <package id="System.Console" version="4.3.1" targetFramework="net472" />
+  <package id="System.Diagnostics.DiagnosticSource" version="7.0.1" targetFramework="net472" />
+  <package id="System.Net.Http" version="4.3.4" targetFramework="net472" />
+  <package id="System.Runtime.Extensions" version="4.3.1" targetFramework="net472" />
+  <package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net472" />
+  <package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net472" />
+  <package id="System.Text.RegularExpressions" version="4.3.1" targetFramework="net472" />
+  <package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="net472" />
+  <package id="System.Memory" version="4.5.5" targetFramework="net472" />
+  <package id="System.Net.Primitives" version="4.3.1" targetFramework="net472" />
+  <package id="System.Runtime" version="4.3.1" targetFramework="net472" />
+  <package id="System.Buffers" version="4.5.1" targetFramework="net472" />
   <package id="System.Collections" version="4.3.0" targetFramework="net472" />
   <package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net472" />
-  <package id="System.Console" version="4.3.0" targetFramework="net472" />
   <package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net472" />
-  <package id="System.Diagnostics.DiagnosticSource" version="4.3.0" targetFramework="net472" />
   <package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net472" />
   <package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net472" />
   <package id="System.Globalization" version="4.3.0" targetFramework="net472" />
@@ -23,30 +33,24 @@
   <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net472" />
   <package id="System.Linq" version="4.3.0" targetFramework="net472" />
   <package id="System.Linq.Expressions" version="4.3.0" targetFramework="net472" />
-  <package id="System.Net.Http" version="4.3.0" targetFramework="net472" />
-  <package id="System.Net.Primitives" version="4.3.0" targetFramework="net472" />
   <package id="System.Net.Sockets" version="4.3.0" targetFramework="net472" />
+  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
   <package id="System.ObjectModel" version="4.3.0" targetFramework="net472" />
   <package id="System.Reflection" version="4.3.0" targetFramework="net472" />
   <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net472" />
   <package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net472" />
   <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net472" />
-  <package id="System.Runtime" version="4.3.0" targetFramework="net472" />
-  <package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net472" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />
   <package id="System.Runtime.Handles" version="4.3.0" targetFramework="net472" />
   <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net472" />
   <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net472" />
   <package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net472" />
-  <package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net472" />
   <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
   <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
-  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net472" />
   <package id="System.Text.Encoding" version="4.3.0" targetFramework="net472" />
   <package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net472" />
-  <package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="net472" />
   <package id="System.Threading" version="4.3.0" targetFramework="net472" />
   <package id="System.Threading.Tasks" version="4.3.0" targetFramework="net472" />
   <package id="System.Threading.Timer" version="4.3.0" targetFramework="net472" />
-  <package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="net472" />
   <package id="System.Xml.XDocument" version="4.3.0" targetFramework="net472" />
 </packages>
\ No newline at end of file

From de7df46aa801c725426489a951d5f777d9ef55c7 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 22 Feb 2023 04:27:12 +0800
Subject: [PATCH 666/803] Sort the notification list by name and remove
 translation keys of brand names or product names

---
 src/components/NotificationDialog.vue   | 74 +++++++++++++++++++++++--
 src/components/notifications/Gorush.vue |  2 +-
 src/lang/en.json                        | 29 ----------
 src/lang/zh-CN.json                     |  2 -
 4 files changed, 71 insertions(+), 36 deletions(-)

diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue
index 0ca95c22..02ddce80 100644
--- a/src/components/NotificationDialog.vue
+++ b/src/components/NotificationDialog.vue
@@ -13,7 +13,7 @@
                         <div class="mb-3">
                             <label for="notification-type" class="form-label">{{ $t("Notification Type") }}</label>
                             <select id="notification-type" v-model="notification.type" class="form-select">
-                                <option v-for="type in notificationTypes" :key="type" :value="type">{{ $t(type) }}</option>
+                                <option v-for="(name, type) in notificationNameList" :key="type" :value="type">{{ name }}</option>
                             </select>
                         </div>
 
@@ -67,7 +67,7 @@
     </Confirm>
 </template>
 
-<script lang="ts">
+<script>
 import { Modal } from "bootstrap";
 
 import Confirm from "./Confirm.vue";
@@ -103,7 +103,71 @@ export default {
                 return null;
             }
             return NotificationFormList[this.notification.type];
-        }
+        },
+
+        notificationNameList() {
+            let list = {
+                "alerta": "Alerta",
+                "AlertNow": "AlertNow",
+                "AliyunSMS": "AliyunSMS (阿里云短信服务)",
+                "apprise": this.$t("apprise"),
+                "Bark": "Bark",
+                "clicksendsms": "ClickSend SMS",
+                "DingDing": "DingDing (钉钉自定义机器人)",
+                "discord": "Discord",
+                "Feishu": "Feishu (飞书)",
+                "FreeMobile": "FreeMobile",
+                "GoogleChat": "Google Chat (Google Workspace)",
+                "gorush": "Gorush",
+                "gotify": "Gotify",
+                "HomeAssistant": "Home Assistant",
+                "Kook": "Kook",
+                "line": "LINE Messenger",
+                "LineNotify": "LINE Notify",
+                "lunasea": "LunaSea",
+                "matrix": "Matrix",
+                "mattermost": "Mattermost",
+                "ntfy": "Ntfy",
+                "octopush": "Octopush",
+                "OneBot": "OneBot",
+                "PagerDuty": "PagerDuty",
+                "promosms": "PromoSMS",
+                "pushbullet": "Pushbullet",
+                "PushByTechulus": "Push by Techulus",
+                "PushDeer": "PushDeer",
+                "pushover": "Pushover",
+                "pushy": "Pushy",
+                "rocket.chat": "Rocket.Chat",
+                "serwersms": "SerwerSMS.pl",
+                "signal": "Signal",
+                "SMSManager": "SmsManager (smsmanager.cz)",
+                "slack": "Slack",
+                "squadcast": "SquadCast",
+                "SMSEagle": "SMSEagle",
+                "smtp": this.$t("smtp"),
+                "stackfield": "Stackfield",
+                "teams": "Microsoft Teams",
+                "telegram": "Telegram",
+                "Splunk": "Splunk",
+                "webhook": "Webhook",
+                "WeCom": "WeCom (企业微信群机器人)",
+                "GoAlert": "GoAlert",
+                "ServerChan": "ServerChan (Server酱)",
+                "ZohoCliq": "ZohoCliq"
+            };
+
+            // Sort by notification name
+            // No idea how, but it works
+            // https://stackoverflow.com/questions/1069666/sorting-object-property-by-values
+            const sortable = Object.entries(list)
+                .sort(([ , a ], [ , b ]) => a - b)
+                .reduce((r, [ k, v ]) => ({
+                    ...r,
+                    [k]: v
+                }), {});
+
+            return sortable;
+        },
     },
 
     watch: {
@@ -203,6 +267,7 @@ export default {
          * @return {string}
          */
         getUniqueDefaultName(notificationKey) {
+            /*
             let index = 1;
             let name = "";
             do {
@@ -211,7 +276,8 @@ export default {
                     number: index++
                 });
             } while (this.$root.notificationList.find(it => it.name === name));
-            return name;
+            return name;*/
+            return "123";
         }
     },
 };
diff --git a/src/components/notifications/Gorush.vue b/src/components/notifications/Gorush.vue
index b53be2d2..315ee677 100644
--- a/src/components/notifications/Gorush.vue
+++ b/src/components/notifications/Gorush.vue
@@ -16,7 +16,7 @@
     <div class="mb-3">
         <label for="gorush-platform" class="form-label">{{ $t("Platform") }}</label><span style="color: red;"><sup>*</sup></span>
         <select id="gorush-platform" v-model="$parent.notification.gorushPlatform" class="form-select">
-            <option value="ios">{{ $t("iOS") }}</option>
+            <option value="ios">iOS</option>
             <option value="android">{{ $t("Android") }}</option>
             <option value="huawei">{{ $t("Huawei") }}</option>
         </select>
diff --git a/src/lang/en.json b/src/lang/en.json
index 1e3242ca..97941a5b 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -186,7 +186,6 @@
     "defaultNotificationName": "My {notification} Alert ({number})",
     "here": "here",
     "Required": "Required",
-    "webhook": "Webhook",
     "Post URL": "Post URL",
     "Content Type": "Content Type",
     "webhookJsonDesc": "{0} is good for any modern HTTP servers such as Express.js",
@@ -360,7 +359,6 @@
     "Workstation": "Workstation",
     "Packet Size": "Packet Size",
     "telegram": "Telegram",
-    "ZohoCliq": "ZohoCliq",
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "You can get a token from {0}.",
     "Chat ID": "Chat ID",
@@ -388,7 +386,6 @@
     "backupOutdatedWarning": "Deprecated: Since a lot of features were added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
     "backupRecommend": "Please backup the volume or the data folder (./data/) directly instead.",
     "Optional": "Optional",
-    "squadcast": "Squadcast",
     "or": "or",
     "recurringInterval": "Interval",
     "Recurring": "Recurring",
@@ -530,28 +527,11 @@
     "pushoversounds none": "None (silent)",
     "pushyAPIKey": "Secret API Key",
     "pushyToken": "Device token",
-    "discord": "Discord",
-    "teams": "Microsoft Teams",
-    "signal": "Signal",
-    "gotify": "Gotify",
-    "slack": "Slack",
-    "rocket.chat": "Rocket.Chat",
-    "pushover": "Pushover",
-    "pushy": "Pushy",
-    "PushByTechulus": "Push by Techulus",
-    "octopush": "Octopush",
-    "promosms": "PromoSMS",
-    "clicksendsms": "ClickSend SMS",
-    "lunasea": "LunaSea",
     "apprise": "Apprise (Support 50+ Notification services)",
     "GoogleChat": "Google Chat (Google Workspace only)",
-    "pushbullet": "Pushbullet",
-    "Kook": "Kook",
     "wayToGetKookBotToken": "Create application and get your bot token at {0}",
     "wayToGetKookGuildID": "Switch on 'Developer Mode' in Kook setting, and right click the guild to get its ID",
     "Guild ID": "Guild ID",
-    "line": "Line Messenger",
-    "mattermost": "Mattermost",
     "User Key": "User Key",
     "Device": "Device",
     "Message Title": "Message Title",
@@ -586,12 +566,10 @@
     "SendKey": "SendKey",
     "SMSManager API Docs": "SMSManager API Docs ",
     "Gateway Type": "Gateway Type",
-    "SMSManager": "SMSManager",
     "You can divide numbers with": "You can divide numbers with",
     "Base URL": "Base URL",
     "goAlertInfo": "GoAlert is a An open source application for on-call scheduling, automated escalations and notifications (like SMS or voice calls). Automatically engage the right person, the right way, and at the right time! {0}",
     "goAlertIntegrationKeyInfo": "Get generic API integration key for the service in this format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" usually the value of token parameter of copied URL.",
-    "goAlert": "GoAlert",
     "AccessKeyId": "AccessKey ID",
     "SecretAccessKey": "AccessKey Secret",
     "PhoneNumbers": "PhoneNumbers",
@@ -606,7 +584,6 @@
     "For safety, must use secret key": "For safety, must use secret key",
     "Device Token": "Device Token",
     "Platform": "Platform",
-    "iOS": "iOS",
     "Android": "Android",
     "Huawei": "Huawei",
     "High": "High",
@@ -617,7 +594,6 @@
     "Proxy Protocol": "Proxy Protocol",
     "Proxy Server": "Proxy Server",
     "Proxy server has authentication": "Proxy server has authentication",
-    "matrix": "Matrix",
     "promosmsTypeEco": "SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.",
     "promosmsTypeFlash": "SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.",
     "promosmsTypeFull": "SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.",
@@ -653,19 +629,15 @@
     "do nothing": "do nothing",
     "auto acknowledged": "auto acknowledged",
     "auto resolve": "auto resolve",
-    "gorush": "Gorush",
-    "alerta": "Alerta",
     "alertaApiEndpoint": "API Endpoint",
     "alertaEnvironment": "Environment",
     "alertaApiKey": "API Key",
     "alertaAlertState": "Alert State",
     "alertaRecoverState": "Recover State",
-    "serwersms": "SerwerSMS.pl",
     "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
     "serwersmsAPIPassword": "API Password",
     "serwersmsPhoneNumber": "Phone number",
     "serwersmsSenderName": "SMS Sender Name (registered via customer portal)",
-    "smseagle": "SMSEagle",
     "smseagleTo": "Phone number(s)",
     "smseagleGroup": "Phonebook group name(s)",
     "smseagleContact": "Phonebook contact name(s)",
@@ -675,7 +647,6 @@
     "smseagleUrl": "Your SMSEagle device URL",
     "smseagleEncoding": "Send as Unicode",
     "smseaglePriority": "Message priority (0-9, default = 0)",
-    "stackfield": "Stackfield",
     "Recipient Number": "Recipient Number",
     "From Name/Number": "From Name/Number",
     "Leave blank to use a shared sender number.": "Leave blank to use a shared sender number.",
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index f3a222dc..a0539593 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -272,7 +272,6 @@
     "apprise": "Apprise (支持 50+ 种通知服务)",
     "GoogleChat": "Google Chat(仅 Google Workspace)",
     "pushbullet": "Pushbullet",
-    "AliyunSMS": "阿里云短信服务",
     "Kook": "Kook",
     "wayToGetKookBotToken": "在 {0} 创建应用并获取机器人 Token",
     "wayToGetKookGuildID": "在 Kook 设置中打开“开发者模式”,然后右键点击频道可获取其 ID",
@@ -448,7 +447,6 @@
     "Bark Endpoint": "Bark 接入点",
     "Bark Group": "Bark 群组",
     "Bark Sound": "Bark 铃声",
-    "DingDing": "钉钉自定义机器人",
     "WebHookUrl": "钉钉自定义机器人 Webhook 地址",
     "SecretKey": "钉钉自定义机器人加签密钥",
     "For safety, must use secret key": "出于安全考虑,必须使用加签密钥",

From 7da48b27a57015d83341070bff1aa7cd9376ed47 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 22 Feb 2023 04:29:43 +0800
Subject: [PATCH 667/803] Fix `getUniqueDefaultName`

---
 src/components/NotificationDialog.vue | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue
index 02ddce80..9631538e 100644
--- a/src/components/NotificationDialog.vue
+++ b/src/components/NotificationDialog.vue
@@ -267,17 +267,16 @@ export default {
          * @return {string}
          */
         getUniqueDefaultName(notificationKey) {
-            /*
+
             let index = 1;
             let name = "";
             do {
                 name = this.$t("defaultNotificationName", {
-                    notification: this.$t(notificationKey).replace(/\(.+\)/, "").trim(),
+                    notification: this.notificationNameList[notificationKey].replace(/\(.+\)/, "").trim(),
                     number: index++
                 });
             } while (this.$root.notificationList.find(it => it.name === name));
-            return name;*/
-            return "123";
+            return name;
         }
     },
 };

From df5da0054e8b12ba44e8a9ec0a5d8ad9d1ee790d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 22 Feb 2023 04:40:03 +0800
Subject: [PATCH 668/803] Remove more keys

---
 src/lang/en.json | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 97941a5b..cfbad0b6 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -358,7 +358,6 @@
     "Domain": "Domain",
     "Workstation": "Workstation",
     "Packet Size": "Packet Size",
-    "telegram": "Telegram",
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "You can get a token from {0}.",
     "Chat ID": "Chat ID",
@@ -653,7 +652,6 @@
     "Octopush API Version": "Octopush API Version",
     "Legacy Octopush-DM": "Legacy Octopush-DM",
     "ntfy Topic": "ntfy Topic",
-    "HomeAssistant": "Home Assistant",
     "onebotHttpAddress": "OneBot HTTP Address",
     "onebotMessageType": "OneBot Message Type",
     "onebotGroupMessage": "Group",

From 5e1489a6edcd14370d5c4f86125e1931ea350d63 Mon Sep 17 00:00:00 2001
From: Austin Miller <austinrmiller1991@gmail.com>
Date: Wed, 22 Feb 2023 14:32:02 -0700
Subject: [PATCH 669/803] PagerTree Notification - Send msg when heartbeatJSON
 null

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

diff --git a/server/notification-providers/pagertree.js b/server/notification-providers/pagertree.js
index c39f5681..8a0c4e36 100644
--- a/server/notification-providers/pagertree.js
+++ b/server/notification-providers/pagertree.js
@@ -13,8 +13,8 @@ class PagerTree extends NotificationProvider {
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         try {
             if (heartbeatJSON == null) {
-                const title = "[Test] Uptime Kuma Alert";
-                return this.postNotification(notification, title, monitorJSON, heartbeatJSON);
+                // general messages
+                return this.postNotification(notification, msg, monitorJSON, heartbeatJSON);
             }
 
             if (heartbeatJSON.status === UP && notification.pagertreeAutoResolve === "resolve") {
@@ -64,7 +64,7 @@ class PagerTree extends NotificationProvider {
             headers: { "Content-Type": "application/json" },
             data: {
                 event_type: eventAction,
-                id: heartbeatJSON?.monitorID || "uptime-kuma-test",
+                id: heartbeatJSON?.monitorID || "uptime-kuma",
                 title: title,
                 urgency: notification.pagertreeUrgency,
                 heartbeat: heartbeatJSON,

From 7c8cff7708cef68017875175eaae2d02e15a15af Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Thu, 23 Feb 2023 17:02:16 +0800
Subject: [PATCH 670/803] Fix: Add null check for injected HTML

---
 src/pages/StatusPage.vue | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue
index f4a6eb76..edf32561 100644
--- a/src/pages/StatusPage.vue
+++ b/src/pages/StatusPage.vue
@@ -502,15 +502,27 @@ export default {
         },
 
         incidentHTML() {
-            return DOMPurify.sanitize(marked(this.incident.content));
+            if (this.incident.content != null) {
+                return DOMPurify.sanitize(marked(this.incident.content));
+            } else {
+                return "";
+            }
         },
 
         descriptionHTML() {
-            return DOMPurify.sanitize(marked(this.config.description));
+            if (this.config.description != null) {
+                return DOMPurify.sanitize(marked(this.config.description));
+            } else {
+                return "";
+            }
         },
 
         footerHTML() {
-            return DOMPurify.sanitize(marked(this.config.footerText));
+            if (this.config.footerText != null) {
+                return DOMPurify.sanitize(marked(this.config.footerText));
+            } else {
+                return "";
+            }
         },
     },
     watch: {

From fa7f75a930606d4365039395eb2894cb739ec674 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 23 Feb 2023 18:01:42 +0800
Subject: [PATCH 671/803] Organize notification list

---
 src/components/NotificationDialog.vue | 63 ++++++++++++++++++---------
 src/lang/en.json                      |  1 +
 2 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue
index 9631538e..c3851b56 100644
--- a/src/components/NotificationDialog.vue
+++ b/src/components/NotificationDialog.vue
@@ -13,7 +13,10 @@
                         <div class="mb-3">
                             <label for="notification-type" class="form-label">{{ $t("Notification Type") }}</label>
                             <select id="notification-type" v-model="notification.type" class="form-select">
-                                <option v-for="(name, type) in notificationNameList" :key="type" :value="type">{{ name }}</option>
+                                <option v-for="(name, type) in notificationNameList.regularList" :key="type" :value="type">{{ name }}</option>
+                                <optgroup :label="$t('notificationRegional')">
+                                    <option v-for="(name, type) in notificationNameList.regionalList" :key="type" :value="type">{{ name }}</option>
+                                </optgroup>
                             </select>
                         </div>
 
@@ -106,17 +109,13 @@ export default {
         },
 
         notificationNameList() {
-            let list = {
+            let regularList = {
                 "alerta": "Alerta",
                 "AlertNow": "AlertNow",
-                "AliyunSMS": "AliyunSMS (阿里云短信服务)",
                 "apprise": this.$t("apprise"),
                 "Bark": "Bark",
                 "clicksendsms": "ClickSend SMS",
-                "DingDing": "DingDing (钉钉自定义机器人)",
                 "discord": "Discord",
-                "Feishu": "Feishu (飞书)",
-                "FreeMobile": "FreeMobile",
                 "GoogleChat": "Google Chat (Google Workspace)",
                 "gorush": "Gorush",
                 "gotify": "Gotify",
@@ -131,16 +130,12 @@ export default {
                 "octopush": "Octopush",
                 "OneBot": "OneBot",
                 "PagerDuty": "PagerDuty",
-                "promosms": "PromoSMS",
                 "pushbullet": "Pushbullet",
                 "PushByTechulus": "Push by Techulus",
-                "PushDeer": "PushDeer",
                 "pushover": "Pushover",
                 "pushy": "Pushy",
                 "rocket.chat": "Rocket.Chat",
-                "serwersms": "SerwerSMS.pl",
                 "signal": "Signal",
-                "SMSManager": "SmsManager (smsmanager.cz)",
                 "slack": "Slack",
                 "squadcast": "SquadCast",
                 "SMSEagle": "SMSEagle",
@@ -150,23 +145,51 @@ export default {
                 "telegram": "Telegram",
                 "Splunk": "Splunk",
                 "webhook": "Webhook",
-                "WeCom": "WeCom (企业微信群机器人)",
                 "GoAlert": "GoAlert",
-                "ServerChan": "ServerChan (Server酱)",
                 "ZohoCliq": "ZohoCliq"
             };
 
+            // Put notifications here if it's not supported in most regions or its documentation is not in English
+            let regionalList = {
+                "AliyunSMS": "AliyunSMS (阿里云短信服务)",
+                "DingDing": "DingDing (钉钉自定义机器人)",
+                "Feishu": "Feishu (飞书)",
+                "FreeMobile": "FreeMobile (mobile.free.fr)",
+                "PushDeer": "PushDeer",
+                "promosms": "PromoSMS",
+                "serwersms": "SerwerSMS.pl",
+                "SMSManager": "SmsManager (smsmanager.cz)",
+                "WeCom": "WeCom (企业微信群机器人)",
+                "ServerChan": "ServerChan (Server酱)",
+            };
+
             // Sort by notification name
             // No idea how, but it works
             // https://stackoverflow.com/questions/1069666/sorting-object-property-by-values
-            const sortable = Object.entries(list)
-                .sort(([ , a ], [ , b ]) => a - b)
-                .reduce((r, [ k, v ]) => ({
-                    ...r,
-                    [k]: v
-                }), {});
+            let sort = (list2) => {
+                return Object.entries(list2)
+                    .sort(([ , a ], [ , b ]) => a.localeCompare(b))
+                    .reduce((r, [ k, v ]) => ({
+                        ...r,
+                        [k]: v
+                    }), {});
+            };
 
-            return sortable;
+            return {
+                regularList: sort(regularList),
+                regionalList: sort(regionalList),
+            };
+        },
+
+        notificationFullNameList() {
+            let list = {};
+            for (let [ key, value ] of Object.entries(this.notificationNameList.regularList)) {
+                list[key] = value;
+            }
+            for (let [ key, value ] of Object.entries(this.notificationNameList.regionalList)) {
+                list[key] = value;
+            }
+            return list;
         },
     },
 
@@ -272,7 +295,7 @@ export default {
             let name = "";
             do {
                 name = this.$t("defaultNotificationName", {
-                    notification: this.notificationNameList[notificationKey].replace(/\(.+\)/, "").trim(),
+                    notification: this.notificationFullNameList[notificationKey].replace(/\(.+\)/, "").trim(),
                     number: index++
                 });
             } while (this.$root.notificationList.find(it => it.name === name));
diff --git a/src/lang/en.json b/src/lang/en.json
index cfbad0b6..de86111a 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -432,6 +432,7 @@
     "uninstall": "Uninstall",
     "uninstalling": "Uninstalling",
     "confirmUninstallPlugin": "Are you sure want to uninstall this plugin?",
+    "notificationRegional": "Regional",
     "smtp": "Email (SMTP)",
     "secureOptionNone": "None / STARTTLS (25, 587)",
     "secureOptionTLS": "TLS (465)",

From 7e3734af53458f086df0a3daa79425532ea393e5 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 23 Feb 2023 20:59:24 +0800
Subject: [PATCH 672/803] Better handling

---
 server/notification-providers/telegram.js | 14 +++++++++-----
 src/components/notifications/Telegram.vue |  8 ++++----
 src/lang/ar-SY.json                       |  2 +-
 src/lang/bg-BG.json                       |  1 -
 src/lang/cs-CZ.json                       |  1 -
 src/lang/da-DK.json                       |  1 -
 src/lang/de-CH.json                       |  1 -
 src/lang/de-DE.json                       |  1 -
 src/lang/el-GR.json                       |  1 -
 src/lang/en.json                          |  3 ++-
 src/lang/nl-NL.json                       |  1 -
 src/lang/pl.json                          |  1 -
 src/lang/ru-RU.json                       |  1 -
 src/lang/sl-SI.json                       |  1 -
 src/lang/th-TH.json                       |  1 -
 src/lang/tr-TR.json                       |  1 -
 src/lang/uk-UA.json                       |  1 -
 src/lang/vi-VN.json                       |  1 -
 src/lang/zh-CN.json                       |  1 -
 src/lang/zh-HK.json                       |  1 -
 src/lang/zh-TW.json                       |  1 -
 21 files changed, 16 insertions(+), 28 deletions(-)

diff --git a/server/notification-providers/telegram.js b/server/notification-providers/telegram.js
index fb53b971..7f46b3fc 100644
--- a/server/notification-providers/telegram.js
+++ b/server/notification-providers/telegram.js
@@ -9,12 +9,16 @@ class Telegram extends NotificationProvider {
         let okMsg = "Sent Successfully.";
 
         try {
+            let params = {
+                chat_id: notification.telegramChatID,
+                text: msg,
+            };
+            if (notification.telegramMessageThreadID) {
+                params.message_thread_id = notification.telegramMessageThreadID;
+            }
+
             await axios.get(`https://api.telegram.org/bot${notification.telegramBotToken}/sendMessage`, {
-                params: {
-                    chat_id: notification.telegramChatID,
-                    text: msg,
-                    message_thread_id: notification.telegramMessageThreadID,
-                },
+                params: params,
             });
             return okMsg;
 
diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index a1b74a8a..042774ac 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -17,10 +17,6 @@
             </button>
         </div>
 
-        <label for="message_thread_id" class="form-label">{{ $t("Message Thread ID") }}</label>
-        <input id="message_thread_id" v-model="$parent.notification.telegramMessageThreadID" type="text" class="form-control">
-        <p class="form-text">Message Thread ID: Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only</p>
-
         <div class="form-text">
             {{ $t("supportTelegramChatID") }}
 
@@ -32,6 +28,10 @@
                 <a :href="telegramGetUpdatesURL('withToken')" target="_blank" style="word-break: break-word;">{{ telegramGetUpdatesURL("masked") }}</a>
             </p>
         </div>
+
+        <label for="message_thread_id" class="form-label">{{ $t("telegramMessageThreadID") }}</label>
+        <input id="message_thread_id" v-model="$parent.notification.telegramMessageThreadID" type="text" class="form-control">
+        <p class="form-text">{{ $t("telegramMessageThreadIDDescription") }}</p>
     </div>
 </template>
 
diff --git a/src/lang/ar-SY.json b/src/lang/ar-SY.json
index b44ed206..3a4cf140 100644
--- a/src/lang/ar-SY.json
+++ b/src/lang/ar-SY.json
@@ -215,7 +215,7 @@
     "Bot Token": "رمز الروبوت",
     "wayToGetTelegramToken": "يمكنك الحصول على رمز من {0}.",
     "Chat ID": "معرف الدردشة",
-    "Message Thread ID": "معرف المواضيع",
+    "telegramMessageThreadID": "معرف المواضيع",
     "supportTelegramChatID": "دعم الدردشة المباشرة / معرف الدردشة للقناة",
     "wayToGetTelegramChatID": "يمكنك الحصول على معرف الدردشة الخاص بك عن طريق إرسال رسالة إلى الروبوت والانتقال إلى عنوان URL هذا لعرض Chat_id",
     "YOUR BOT TOKEN HERE": "رمز الروبوت الخاص بك هنا",
diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index 23e0e549..ae2cdce6 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -210,7 +210,6 @@
     "Bot Token": "Бот токен",
     "wayToGetTelegramToken": "Можете да получите токен от {0}.",
     "Chat ID": "Чат ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Поддържа Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "Можете да получите вашето чат ID, като изпратите съобщение на бота, след което е нужно да посетите този URL адрес за да го видите:",
     "YOUR BOT TOKEN HERE": "ВАШИЯТ БОТ ТОКЕН ТУК",
diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index 5981971d..dc8e2637 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -215,7 +215,6 @@
     "Bot Token": "Token bota",
     "wayToGetTelegramToken": "Token můžete získat od {0}.",
     "Chat ID": "ID chatu",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Podpora přímého chatu / skupiny / ID chatu kanálu",
     "wayToGetTelegramChatID": "ID chatu můžete získat tak, že robotovi zašlete zprávu a přejdete na tuto adresu URL, kde zobrazíte chat_id:",
     "YOUR BOT TOKEN HERE": "SEM ZADEJTE TOKEN VAŠEHO CHATBOTA",
diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
index 02a63220..1b0fe210 100644
--- a/src/lang/da-DK.json
+++ b/src/lang/da-DK.json
@@ -208,7 +208,6 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Du kan få et token fra {0}.",
     "Chat ID": "Chat ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "Du kan få dit chat-ID ved at sende en besked til bot'en og gå til denne URL for at se chat_id'et:",
     "YOUR BOT TOKEN HERE": "DIT BOT TOKEN HER",
diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
index 7e0f0ebd..d8a46562 100644
--- a/src/lang/de-CH.json
+++ b/src/lang/de-CH.json
@@ -214,7 +214,6 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Hier kannst du einen Token erhalten {0}.",
     "Chat ID": "Chat ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
     "wayToGetTelegramChatID": "Du kannst die Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
     "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 37d27a6e..2e7bbb5f 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -214,7 +214,6 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Hier kannst du einen Token erhalten {0}.",
     "Chat ID": "Chat ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Unterstützt Direkt Chat / Gruppe / Kanal Chat-ID's",
     "wayToGetTelegramChatID": "Du kannst deine Chat-ID erhalten, indem du eine Nachricht an den Bot sendest und zu dieser URL gehst, um die chat_id: zu sehen.",
     "YOUR BOT TOKEN HERE": "HIER DEIN BOT TOKEN",
diff --git a/src/lang/el-GR.json b/src/lang/el-GR.json
index 1f8459f1..19a9bd4c 100644
--- a/src/lang/el-GR.json
+++ b/src/lang/el-GR.json
@@ -198,7 +198,6 @@
     "Bot Token": "Διακριτικό Bot",
     "wayToGetTelegramToken": "Μπορείτε να πάρετε ένα διακριτικό από {0}.",
     "Chat ID": "Chat ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "Μπορείτε να λάβετε το αναγνωριστικό συνομιλίας σας στέλνοντας ένα μήνυμα στο bot και μεταβαίνοντας σε αυτήν τη διεύθυνση URL για να προβάλετε το chat_id:",
     "YOUR BOT TOKEN HERE": "ΤΟ BOT ΣΑΣ ΔΙΑΚΡΙΤΙΚΌ ΕΔΩ",
diff --git a/src/lang/en.json b/src/lang/en.json
index e70dbb38..c1249d31 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -361,7 +361,8 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "You can get a token from {0}.",
     "Chat ID": "Chat ID",
-    "Message Thread ID": "Message Thread ID",
+    "telegramMessageThreadID": "(Optional) Message Thread ID",
+    "telegramMessageThreadIDDescription": "Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only",
     "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
     "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json
index e4c1da00..32c79545 100644
--- a/src/lang/nl-NL.json
+++ b/src/lang/nl-NL.json
@@ -217,7 +217,6 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Je kunt een token krijgen van {0}.",
     "Chat ID": "Chat ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Ondersteuning Directe Chat / Groep / Kanaal Chat ID",
     "wayToGetTelegramChatID": "Je kunt je CHAT ID krijgen door een bericht te sturen naar de bot en naar deze URL te gaan om het chat_id te bekijken:",
     "YOUR BOT TOKEN HERE": "DE BOT TOKEN HIER",
diff --git a/src/lang/pl.json b/src/lang/pl.json
index 6996e761..472b595c 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -189,7 +189,6 @@
     "Bot Token": "Token bota",
     "wayToGetTelegramToken": "Token można uzyskać z {0}.",
     "Chat ID": "Identyfikator czatu",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Czat wsparcia technicznego / Bezpośrednia rozmowa / Czat grupowy",
     "wayToGetTelegramChatID": "Możesz uzyskać swój identyfikator czatu, wysyłając wiadomość do bota i przechodząc pod ten adres URL, aby wyświetlić identyfikator czatu:",
     "YOUR BOT TOKEN HERE": "TWÓJ TOKEN BOTA",
diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 96ad8661..7ea1f643 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -216,7 +216,6 @@
     "Bot Token": "Токен бота",
     "wayToGetTelegramToken": "Вы можете взять токен здесь - {0}.",
     "Chat ID": "ID чата",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Поддерживаются ID чатов, групп и каналов",
     "wayToGetTelegramChatID": "Вы можете взять ID вашего чата, отправив сообщение боту и перейдя по этому URL для просмотра chat_id:",
     "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ЗДЕСЬ",
diff --git a/src/lang/sl-SI.json b/src/lang/sl-SI.json
index bf32cbed..f4ca81bd 100644
--- a/src/lang/sl-SI.json
+++ b/src/lang/sl-SI.json
@@ -193,7 +193,6 @@
     "Bot Token": "Robotkov žetonček",
     "wayToGetTelegramToken": "Lahko dobiš žeton od {0}.",
     "Chat ID": "ID pogovora",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Direkten pogovor pomoči / Skupina / ID kanala",
     "wayToGetTelegramChatID": "Id lahko dobiš, če pošlješ sporočilo robotku in odpreš ta URL, da bi videl chat_id:",
     "YOUR BOT TOKEN HERE": "ROBOTKOV ŽETON TUKAJ",
diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
index 2146c734..9f5c78a1 100644
--- a/src/lang/th-TH.json
+++ b/src/lang/th-TH.json
@@ -194,7 +194,6 @@
     "Bot Token": "กุญแจของบอท",
     "wayToGetTelegramToken": "คุณสามารถรับกุญแจได้จาก {0}.",
     "Chat ID": "ไอดีแชท",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "รองรับ แชทส่วนตัว, แชทกลุ่ม, ไอดีแชท",
     "wayToGetTelegramChatID": "คุณสามารถรับ ID แชทของคุณได้โดยส่งข้อความไปยังบอทและไปที่ URL นี้เพื่อดู chat_id :",
     "YOUR BOT TOKEN HERE": "กุญแจของบอทของคุณที่นี่",
diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index d55f2aab..80d273e1 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -197,7 +197,6 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "{0} adresinden bir token alabilirsiniz.",
     "Chat ID": "Chat ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Doğrudan Sohbet / Grup / Kanalın Sohbet Kimliğini Destekleyin",
     "wayToGetTelegramChatID": "Bot'a bir mesaj göndererek ve chat_id'yi görüntülemek için bu URL'ye giderek sohbet kimliğinizi alabilirsiniz:",
     "YOUR BOT TOKEN HERE": "BOT TOKENİNİZ BURADA",
diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
index 7de6829c..9a63cfe0 100644
--- a/src/lang/uk-UA.json
+++ b/src/lang/uk-UA.json
@@ -216,7 +216,6 @@
     "Bot Token": "Токен бота",
     "wayToGetTelegramToken": "Ви можете взяти токен тут - {0}.",
     "Chat ID": "ID чату",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Підтримуються ID чатів, груп та каналів",
     "wayToGetTelegramChatID": "Ви можете взяти ID вашого чату, відправивши повідомлення боту і перейшовши по цьому URL для перегляду chat_id:",
     "YOUR BOT TOKEN HERE": "ВАШ ТОКЕН БОТА ТУТ",
diff --git a/src/lang/vi-VN.json b/src/lang/vi-VN.json
index 4446a020..165bf1bb 100644
--- a/src/lang/vi-VN.json
+++ b/src/lang/vi-VN.json
@@ -193,7 +193,6 @@
     "Bot Token": "Bot Token",
     "wayToGetTelegramToken": "Bạn có thể lấy mã token từ",
     "Chat ID": "Chat ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "Hỗ trợ chat trực tiếp / Nhóm / Kênh Chat ID",
     "wayToGetTelegramChatID": "Bạn có thể lấy chat id của mình bằng cách gửi tin nhắn tới bot và truy cập url này để xem chat_id:",
     "YOUR BOT TOKEN HERE": "MÃ BOT TOKEN CỦA BẠN",
diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index 8bad70ab..a0539593 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -213,7 +213,6 @@
     "Bot Token": "机器人令牌",
     "wayToGetTelegramToken": "您可以从 {0} 获取 Token。",
     "Chat ID": "Chat ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "支持对话/群组/频道的 Chat ID",
     "wayToGetTelegramChatID": "您可以发送一条消息给您的机器人,然后访问此链接来查看 chat_id:",
     "YOUR BOT TOKEN HERE": "这里替换成您的 BOT TOKEN",
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 1d7e0e65..8111b73d 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -211,7 +211,6 @@
     "Bot Token": "機器人權杖",
     "wayToGetTelegramToken": "您可以從 {0} 取得 Token。",
     "Chat ID": "聊天 ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "支援 對話/群組/頻道的聊天 ID",
     "wayToGetTelegramChatID": "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
     "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",
diff --git a/src/lang/zh-TW.json b/src/lang/zh-TW.json
index 5a63ac54..3e208215 100644
--- a/src/lang/zh-TW.json
+++ b/src/lang/zh-TW.json
@@ -212,7 +212,6 @@
     "Bot Token": "機器人權杖",
     "wayToGetTelegramToken": "您可以從 {0} 取得權杖。",
     "Chat ID": "聊天 ID",
-    "Message Thread ID": "Message Thread ID",
     "supportTelegramChatID": "支援 對話/群組/頻道的聊天 ID",
     "wayToGetTelegramChatID": "傳送訊息給機器人,並前往以下網址以取得您的 chat ID:",
     "YOUR BOT TOKEN HERE": "在此填入您的機器人權杖",

From 10228874fa41c7afaf4cca8ac72f3edc9ab9f5bd Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 24 Feb 2023 16:54:58 +0800
Subject: [PATCH 673/803] Merge manually

---
 server/notification-providers/telegram.js | 1 +
 src/components/notifications/Telegram.vue | 2 +-
 src/lang/en.json                          | 2 ++
 3 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/server/notification-providers/telegram.js b/server/notification-providers/telegram.js
index 7f46b3fc..614e487e 100644
--- a/server/notification-providers/telegram.js
+++ b/server/notification-providers/telegram.js
@@ -12,6 +12,7 @@ class Telegram extends NotificationProvider {
             let params = {
                 chat_id: notification.telegramChatID,
                 text: msg,
+                disable_notification: notification.telegramSendSilently ?? false,
             };
             if (notification.telegramMessageThreadID) {
                 params.message_thread_id = notification.telegramMessageThreadID;
diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 7816de74..a90ceafc 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -35,7 +35,7 @@
 
         <div class="form-check form-switch">
             <input v-model="$parentnotification.telegramSendSilently" class="form-check-input" type="checkbox">
-            <label class="form-check-label">{{ $t("Send Silently") }}</label>
+            <label class="form-check-label">{{ $t("telegramSendSilently") }}</label>
         </div>
 
         <div class="form-text">
diff --git a/src/lang/en.json b/src/lang/en.json
index c1249d31..ef6cb688 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -363,6 +363,8 @@
     "Chat ID": "Chat ID",
     "telegramMessageThreadID": "(Optional) Message Thread ID",
     "telegramMessageThreadIDDescription": "Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only",
+    "telegramSendSilently": "Send Silently",
+    "telegramSendSilentlyDescription": "Sends the message silently. Users will receive a notification with no sound.",
     "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
     "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",

From 06278dc51fb89b3f7e323973fcc982c6b15cbd03 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 24 Feb 2023 17:03:40 +0800
Subject: [PATCH 674/803] Fix telegram silent issue

---
 src/components/notifications/Telegram.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index a90ceafc..52a63b8c 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -34,7 +34,7 @@
         <p class="form-text">{{ $t("telegramMessageThreadIDDescription") }}</p>
 
         <div class="form-check form-switch">
-            <input v-model="$parentnotification.telegramSendSilently" class="form-check-input" type="checkbox">
+            <input v-model="$parent.notification.telegramSendSilently" class="form-check-input" type="checkbox">
             <label class="form-check-label">{{ $t("telegramSendSilently") }}</label>
         </div>
 

From 2fa233ae7fa76eaf82bf7658c42dd61dc21cd22c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 24 Feb 2023 17:12:57 +0800
Subject: [PATCH 675/803] Fix prometheus null issues

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 4bb859e9..d6e1896a 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -755,7 +755,7 @@ class Monitor extends BeanModel {
             await R.store(bean);
 
             log.debug("monitor", `[${this.name}] prometheus.update`);
-            this.prometheus.update(bean, tlsInfo);
+            this.prometheus?.update(bean, tlsInfo);
 
             previousBeat = bean;
 
@@ -840,7 +840,7 @@ class Monitor extends BeanModel {
         clearTimeout(this.heartbeatInterval);
         this.isStop = true;
 
-        this.prometheus.remove();
+        this.prometheus?.remove();
     }
 
     /**

From af82ea742cbe1559b0fbc8d4cf80f7d850d5ae30 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 24 Feb 2023 17:21:53 +0800
Subject: [PATCH 676/803] Merge manually

---
 src/components/notifications/Telegram.vue | 27 ++---------------------
 src/lang/en.json                          |  2 ++
 2 files changed, 4 insertions(+), 25 deletions(-)

diff --git a/src/components/notifications/Telegram.vue b/src/components/notifications/Telegram.vue
index 46824538..a7e46fde 100644
--- a/src/components/notifications/Telegram.vue
+++ b/src/components/notifications/Telegram.vue
@@ -43,37 +43,14 @@
         </div>
     </div>
 
-    <div class="mb-3">
-        <label for="telegram-chat-thread" class="form-label">{{ $t("Thread ID") }}</label>
-
-        <div class="input-group mb-3">
-            <input id="telegram-chat-thread" v-model="$parent.notification.telegramChatThread" type="text" class="form-control">
-        </div>
-
-        <div class="form-text">
-            {{ $t("Thread ID Description") }}
-        </div>
-    </div>
-
-    <div class="mb-3">
-        <div class="form-check form-switch">
-            <input v-model="$parent.notification.telegramSilentNotification" class="form-check-input" type="checkbox">
-            <label class="form-check-label">{{ $t("Silent Notification") }}</label>
-        </div>
-
-        <div class="form-text">
-            {{ $t("Silent Notification Description") }}
-        </div>
-    </div>
-
     <div class="mb-3">
         <div class="form-check form-switch">
             <input v-model="$parent.notification.telegramProtectContent" class="form-check-input" type="checkbox">
-            <label class="form-check-label">{{ $t("Protect Forwarding") }}</label>
+            <label class="form-check-label">{{ $t("telegramProtectContent") }}</label>
         </div>
 
         <div class="form-text">
-            {{ $t("Protect Forwarding Description") }}
+            {{ $t("telegramProtectContentDescription") }}
         </div>
     </div>
 </template>
diff --git a/src/lang/en.json b/src/lang/en.json
index ef6cb688..478ddddc 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -365,6 +365,8 @@
     "telegramMessageThreadIDDescription": "Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only",
     "telegramSendSilently": "Send Silently",
     "telegramSendSilentlyDescription": "Sends the message silently. Users will receive a notification with no sound.",
+    "telegramProtectContent": "Protect Forwarding/Saving",
+    "telegramProtectContentDescription": "If enabled, the bot messages in Telegram will be protected from forwarding and saving.",
     "supportTelegramChatID": "Support Direct Chat / Group / Channel's Chat ID",
     "wayToGetTelegramChatID": "You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id:",
     "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",

From 7b8ed01f272fc4c6b69ff6299185e936a5e63735 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Fri, 24 Feb 2023 21:06:00 +0800
Subject: [PATCH 677/803] Fix: getGameList returns nothing on first run

---
 server/socket-handlers/general-socket-handler.js | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/server/socket-handlers/general-socket-handler.js b/server/socket-handlers/general-socket-handler.js
index 11b47a5b..48412183 100644
--- a/server/socket-handlers/general-socket-handler.js
+++ b/server/socket-handlers/general-socket-handler.js
@@ -12,7 +12,7 @@ let gameList = null;
  * @returns {any[]}
  */
 function getGameList() {
-    if (!gameList) {
+    if (gameList == null) {
         gameList = gameResolver._readGames().games.sort((a, b) => {
             if ( a.pretty < b.pretty ) {
                 return -1;
@@ -22,9 +22,8 @@ function getGameList() {
             }
             return 0;
         });
-    } else {
-        return gameList;
     }
+    return gameList;
 }
 
 module.exports.generalSocketHandler = (socket, server) => {

From c65a920050688afed790a8bc6e400f45ee32f54c Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Fri, 24 Feb 2023 21:09:55 +0800
Subject: [PATCH 678/803] Chore: Fix code comment

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

diff --git a/server/socket-handlers/general-socket-handler.js b/server/socket-handlers/general-socket-handler.js
index 48412183..bb4a3808 100644
--- a/server/socket-handlers/general-socket-handler.js
+++ b/server/socket-handlers/general-socket-handler.js
@@ -9,7 +9,7 @@ let gameList = null;
 
 /**
  * Get a game list via GameDig
- * @returns {any[]}
+ * @returns {Object[]} list of games supported by GameDig
  */
 function getGameList() {
     if (gameList == null) {

From 46894793fc260158779e7002d7bd79eeb848903b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 00:44:12 +0800
Subject: [PATCH 679/803] Update Learn More url

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

diff --git a/src/pages/ManageAPIKeys.vue b/src/pages/ManageAPIKeys.vue
index c4050592..ccfc0ce6 100644
--- a/src/pages/ManageAPIKeys.vue
+++ b/src/pages/ManageAPIKeys.vue
@@ -59,7 +59,7 @@
             </div>
 
             <div class="text-center mt-3" style="font-size: 13px;">
-                <a href="https://github.com/louislam/uptime-kuma/wiki/APIKeys" target="_blank">{{ $t("Learn More") }}</a>
+                <a href="https://github.com/louislam/uptime-kuma/wiki/API-Keys" target="_blank">{{ $t("Learn More") }}</a>
             </div>
 
             <Confirm ref="confirmPause" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="disableKey">

From 54cd7a040293714fcf6edd494e95becaa40b1219 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 15:08:39 +0800
Subject: [PATCH 680/803] Merge manually

---
 src/lang/en.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/lang/en.json b/src/lang/en.json
index 83bc2231..29bd0bb5 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -439,6 +439,8 @@
     "uninstalling": "Uninstalling",
     "confirmUninstallPlugin": "Are you sure want to uninstall this plugin?",
     "notificationRegional": "Regional",
+    "Clone Monitor": "Clone Monitor",
+    "Clone": "Clone",
     "smtp": "Email (SMTP)",
     "secureOptionNone": "None / STARTTLS (25, 587)",
     "secureOptionTLS": "TLS (465)",

From f47f2d5c8712bb41a1daf111629144b7dbf0aff3 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 15:40:09 +0800
Subject: [PATCH 681/803] Better save button for edit/add monitor page

---
 .stylelintrc              |  1 +
 src/pages/EditMonitor.vue | 30 ++++++++++++++++++++++++++----
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/.stylelintrc b/.stylelintrc
index e590c98c..00ddcaae 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -10,5 +10,6 @@
         "color-function-notation": "legacy",
         "shorthand-property-no-redundant-values": null,
         "color-hex-length": null,
+        "declaration-block-no-redundant-longhand-properties": null
     }
 }
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index d2a418a5..2dffee5e 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -615,10 +615,10 @@
                                 </template>
                             </template>
                         </div>
+                    </div>
 
-                        <div class="col-md-12 mt-5 mb-1">
-                            <button id="monitor-submit-btn" class="btn btn-primary" type="submit" :disabled="processing">{{ $t("Save") }}</button>
-                        </div>
+                    <div class="fixed-bottom-bar p-3">
+                        <button id="monitor-submit-btn" class="btn btn-primary" type="submit" :disabled="processing">{{ $t("Save") }}</button>
                     </div>
                 </div>
             </form>
@@ -1036,11 +1036,33 @@ message HealthCheckResponse {
 </script>
 
 <style lang="scss" scoped>
+    @import "../assets/vars.scss";
+
+    $padding: 20px;
+
     .shadow-box {
-        padding: 20px;
+        padding-top: $padding;
+        padding-bottom: 0;
+        padding-right: $padding;
+        padding-left: $padding;
     }
 
     textarea {
         min-height: 200px;
     }
+
+    .fixed-bottom-bar {
+        position: sticky;
+        bottom: 0;
+        margin-left: -$padding;
+        margin-right: -$padding;
+        z-index: 100;
+        background-color: rgba(white, 0.2);
+        backdrop-filter: blur(2px);
+        border-radius: 0 0 10px 10px;
+
+        .dark & {
+            background-color: rgba($dark-header-bg, 0.9);
+        }
+    }
 </style>

From f9a6d7ec44b0e4cf4b3f7c8f572928b297a7cbd6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 16:19:48 +0800
Subject: [PATCH 682/803] Add a missing icon

---
 src/icon.js | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/icon.js b/src/icon.js
index 6cc997bb..a69b2a88 100644
--- a/src/icon.js
+++ b/src/icon.js
@@ -3,6 +3,9 @@ import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
 
 // Add Free Font Awesome Icons
 // https://fontawesome.com/v5.15/icons?d=gallery&p=2&s=solid&m=free
+// In order to add an icon, you have to:
+// 1) add the icon name in the import statement below;
+// 2) add the icon name to the library.add() statement below.
 import {
     faArrowAltCircleUp,
     faCog,
@@ -45,6 +48,7 @@ import {
     faHeartbeat,
     faFilter,
     faInfoCircle,
+    faClone,
 } from "@fortawesome/free-solid-svg-icons";
 
 library.add(
@@ -90,6 +94,7 @@ library.add(
     faHeartbeat,
     faFilter,
     faInfoCircle,
+    faClone,
 );
 
 export { FontAwesomeIcon };

From 43c797a34e2d08300386a06da6c04c8b5b57efe3 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 16:20:59 +0800
Subject: [PATCH 683/803] Do not active the old monitor in the clone page

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

diff --git a/src/router.js b/src/router.js
index f1cf8a08..b9ee2631 100644
--- a/src/router.js
+++ b/src/router.js
@@ -65,12 +65,12 @@ const routes = [
                                         path: "/edit/:id",
                                         component: EditMonitor,
                                     },
-                                    {
-                                        path: "/clone/:id",
-                                        component: EditMonitor,
-                                    },
                                 ],
                             },
+                            {
+                                path: "/clone/:id",
+                                component: EditMonitor,
+                            },
                             {
                                 path: "/add",
                                 component: EditMonitor,

From 4fed0c152e901477a42481e5a016c9cae6456c44 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 17:05:03 +0800
Subject: [PATCH 684/803] Show `Copy of` in front of the cloned monitor name

---
 src/lang/en.json          | 1 +
 src/pages/EditMonitor.vue | 9 +++++----
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 29bd0bb5..ad55fe6e 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -441,6 +441,7 @@
     "notificationRegional": "Regional",
     "Clone Monitor": "Clone Monitor",
     "Clone": "Clone",
+    "cloneOf": "Clone of {0}",
     "smtp": "Email (SMTP)",
     "secureOptionNone": "None / STARTTLS (25, 587)",
     "secureOptionTLS": "TLS (465)",
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index e7ecb58a..4a4ae982 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -922,13 +922,14 @@ message HealthCheckResponse {
                         this.monitor = res.monitor;
 
                         if (this.isClone) {
-                            /**
-                             * Cloning a monitor will include properties that can not be posted to backend
-                             * as they are not valid columns in the SQLite table.
-                             */
+                            /*
+                         * Cloning a monitor will include properties that can not be posted to backend
+                         * as they are not valid columns in the SQLite table.
+                         */
                             this.monitor.id = undefined; // Remove id when cloning as we want a new id
                             this.monitor.includeSensitiveData = undefined;
                             this.monitor.maintenance = undefined;
+                            this.monitor.name = this.$t("cloneOf", [ this.monitor.name ]);
                             this.monitor.tags = undefined; // FIXME: Cloning tags does not work yet
                         }
 

From a7b49fcd98b1f86db1ded571d252dc93fba14bab Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 17:28:32 +0800
Subject: [PATCH 685/803] Fix json body after xml body added

---
 server/model/monitor.js | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index b071a622..ef29ba3b 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -276,19 +276,24 @@ class Monitor extends BeanModel {
                     let contentType = null;
                     let bodyValue = null;
 
-                    if (this.body && !this.httpBodyEncoding || this.httpBodyEncoding === "json") {
-                        bodyValue = JSON.parse(this.body);
-                        contentType = "application/json";
-                    } else if (this.body && (this.httpBodyEncoding === "xml")) {
-                        bodyValue = this.body;
-                        contentType = "text/xml; charset=utf-8";
+                    if (this.body && (typeof this.body === "string" && this.body.trim().length > 0)) {
+                        if (!this.httpBodyEncoding || this.httpBodyEncoding === "json") {
+                            try {
+                                bodyValue = JSON.parse(this.body);
+                                contentType = "application/json";
+                            } catch (e) {
+                                throw new Error("Your JSON body is invalid. " + e.message);
+                            }
+                        } else if (this.httpBodyEncoding === "xml") {
+                            bodyValue = this.body;
+                            contentType = "text/xml; charset=utf-8";
+                        }
                     }
 
                     // Axios Options
                     const options = {
                         url: this.url,
                         method: (this.method || "get").toLowerCase(),
-                        ...(bodyValue ? { data: bodyValue } : {}),
                         timeout: this.interval * 1000 * 0.8,
                         headers: {
                             "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
@@ -303,6 +308,10 @@ class Monitor extends BeanModel {
                         },
                     };
 
+                    if (bodyValue) {
+                        options.data = bodyValue;
+                    }
+
                     if (this.proxy_id) {
                         const proxy = await R.load("proxy", this.proxy_id);
 

From 8a115670cd78845693214f5800d44b67fddaf82e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 17:55:40 +0800
Subject: [PATCH 686/803] Fix label and id

Co-authored-by: AlexKraus <alex.b.kraus@googlemail.com>
---
 src/pages/EditMonitor.vue | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index 6d7353fe..085a60db 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -539,37 +539,37 @@
                                 <template v-if="monitor.authMethod && monitor.authMethod !== null ">
                                     <template v-if="monitor.authMethod === 'mtls' ">
                                         <div class="my-3">
-                                            <label for="tls" class="form-label">{{ $t("Cert") }}</label>
+                                            <label for="tls-cert" class="form-label">{{ $t("Cert") }}</label>
                                             <textarea id="tls-cert" v-model="monitor.tlsCert" class="form-control" :placeholder="$t('Cert body')" required></textarea>
                                         </div>
                                         <div class="my-3">
-                                            <label for="tls" class="form-label">{{ $t("Key") }}</label>
+                                            <label for="tls-key" class="form-label">{{ $t("Key") }}</label>
                                             <textarea id="tls-key" v-model="monitor.tlsKey" class="form-control" :placeholder="$t('Key body')" required></textarea>
                                         </div>
                                         <div class="my-3">
-                                            <label for="tls" class="form-label">{{ $t("CA") }}</label>
+                                            <label for="tls-ca" class="form-label">{{ $t("CA") }}</label>
                                             <textarea id="tls-ca" v-model="monitor.tlsCa" class="form-control" :placeholder="$t('Server CA')"></textarea>
                                         </div>
                                     </template>
                                     <template v-else>
                                         <div class="my-3">
-                                            <label for="basicauth" class="form-label">{{ $t("Username") }}</label>
+                                            <label for="basicauth-user" class="form-label">{{ $t("Username") }}</label>
                                             <input id="basicauth-user" v-model="monitor.basic_auth_user" type="text" class="form-control" :placeholder="$t('Username')">
                                         </div>
 
                                         <div class="my-3">
-                                            <label for="basicauth" class="form-label">{{ $t("Password") }}</label>
+                                            <label for="basicauth-pass" class="form-label">{{ $t("Password") }}</label>
                                             <input id="basicauth-pass" v-model="monitor.basic_auth_pass" type="password" autocomplete="new-password" class="form-control" :placeholder="$t('Password')">
                                         </div>
                                         <template v-if="monitor.authMethod === 'ntlm' ">
                                             <div class="my-3">
-                                                <label for="basicauth" class="form-label">{{ $t("Domain") }}</label>
-                                                <input id="basicauth-domain" v-model="monitor.authDomain" type="text" class="form-control" :placeholder="$t('Domain')">
+                                                <label for="ntlm-domain" class="form-label">{{ $t("Domain") }}</label>
+                                                <input id="ntlm-domain" v-model="monitor.authDomain" type="text" class="form-control" :placeholder="$t('Domain')">
                                             </div>
 
                                             <div class="my-3">
-                                                <label for="basicauth" class="form-label">{{ $t("Workstation") }}</label>
-                                                <input id="basicauth-workstation" v-model="monitor.authWorkstation" type="text" class="form-control" :placeholder="$t('Workstation')">
+                                                <label for="ntlm-workstation" class="form-label">{{ $t("Workstation") }}</label>
+                                                <input id="ntlm-workstation" v-model="monitor.authWorkstation" type="text" class="form-control" :placeholder="$t('Workstation')">
                                             </div>
                                         </template>
                                     </template>

From d668812df1a9ef5f55e1a820e93430211d8f7c7a Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 17:59:25 +0800
Subject: [PATCH 687/803] Fix merge issue

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

diff --git a/server/database.js b/server/database.js
index 45af974e..7084f83c 100644
--- a/server/database.js
+++ b/server/database.js
@@ -70,7 +70,7 @@ class Database {
         "patch-maintenance-table2.sql": true,
         "patch-add-gamedig-monitor.sql": true,
         "patch-add-google-analytics-status-page-tag.sql": true,
-        "patch-http-body-encoding.sql": true
+        "patch-http-body-encoding.sql": true,
         "patch-monitor-tls.sql": true,
     };
 

From 48c6f0578cda06c6633d42684b8db3a1f70dc521 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 19:16:33 +0800
Subject: [PATCH 688/803] Merge manually

---
 src/lang/en.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/lang/en.json b/src/lang/en.json
index ad55fe6e..c9889fad 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -442,6 +442,7 @@
     "Clone Monitor": "Clone Monitor",
     "Clone": "Clone",
     "cloneOf": "Clone of {0}",
+    "Description": "Description",
     "smtp": "Email (SMTP)",
     "secureOptionNone": "None / STARTTLS (25, 587)",
     "secureOptionTLS": "TLS (465)",

From ea3b3abe367371797fc00b1d9934873522d510cb Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 25 Feb 2023 20:13:46 +0800
Subject: [PATCH 689/803] Fine tune

---
 server/model/monitor.js        |  1 -
 src/components/MonitorList.vue |  5 +----
 src/pages/EditMonitor.vue      | 12 ++++++------
 3 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 0d915c37..312ac732 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -39,7 +39,6 @@ class Monitor extends BeanModel {
             id: this.id,
             name: this.name,
             sendUrl: this.sendUrl,
-            description: this.description,
         };
 
         if (this.sendUrl) {
diff --git a/src/components/MonitorList.vue b/src/components/MonitorList.vue
index 5a6e5ef4..d64b43c1 100644
--- a/src/components/MonitorList.vue
+++ b/src/components/MonitorList.vue
@@ -19,15 +19,12 @@
                 {{ $t("No Monitors, please") }} <router-link to="/add">{{ $t("add one") }}</router-link>
             </div>
 
-            <router-link v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)" class="item" :class="{ 'disabled': ! item.active }">
+            <router-link v-for="(item, index) in sortedMonitorList" :key="index" :to="monitorURL(item.id)" class="item" :class="{ 'disabled': ! item.active }" :title="item.description">
                 <div class="row">
                     <div class="col-9 col-md-8 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
                         <div class="info">
                             <Uptime :monitor="item" type="24" :pill="true" />
                             {{ item.name }}
-                            <span v-if="item.description" :title="item.description">
-                                <font-awesome-icon icon="info-circle" />
-                            </span>
                         </div>
                         <div class="tags">
                             <Tag v-for="tag in item.tags" :key="tag" :item="tag" :size="'sm'" />
diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index f13060c2..fa1935b0 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -89,12 +89,6 @@
                                 <input id="name" v-model="monitor.name" type="text" class="form-control" required>
                             </div>
 
-                            <!-- Description -->
-                            <div class="my-3">
-                                <label for="description" class="form-label">{{ $t("Description") }}</label>
-                                <input id="description" v-model="monitor.description" type="text" class="form-control">
-                            </div>
-
                             <!-- URL -->
                             <div v-if="monitor.type === 'http' || monitor.type === 'keyword' || monitor.type === 'browser' " class="my-3">
                                 <label for="url" class="form-label">{{ $t("URL") }}</label>
@@ -420,6 +414,12 @@
                                 </div>
                             </template>
 
+                            <!-- Description -->
+                            <div class="my-3">
+                                <label for="description" class="form-label">{{ $t("Description") }}</label>
+                                <input id="description" v-model="monitor.description" type="text" class="form-control">
+                            </div>
+
                             <div class="my-3">
                                 <tags-manager ref="tagsManager" :pre-selected-tags="monitor.tags"></tags-manager>
                             </div>

From 3c5f9981912d8f8efd49e54852c414b039a6e72e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 26 Feb 2023 03:23:02 +0800
Subject: [PATCH 690/803] Update mongodb to 4.14.0, possibly fix #2820

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 5e57a932..e642d03b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -41,7 +41,7 @@
                 "jsonwebtoken": "~9.0.0",
                 "jwt-decode": "~3.1.2",
                 "limiter": "~2.1.0",
-                "mongodb": "~4.13.0",
+                "mongodb": "~4.14.0",
                 "mqtt": "~4.3.7",
                 "mssql": "~8.1.4",
                 "mysql2": "~2.3.3",
@@ -14008,9 +14008,9 @@
             }
         },
         "node_modules/mongodb": {
-            "version": "4.13.0",
-            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
-            "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
+            "version": "4.14.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.14.0.tgz",
+            "integrity": "sha512-coGKkWXIBczZPr284tYKFLg+KbGPPLlSbdgfKAb6QqCFt5bo5VFZ50O3FFzsw4rnkqjwT6D8Qcoo9nshYKM7Mg==",
             "dependencies": {
                 "bson": "^4.7.0",
                 "mongodb-connection-string-url": "^2.5.4",
@@ -29626,9 +29626,9 @@
             "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         },
         "mongodb": {
-            "version": "4.13.0",
-            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
-            "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
+            "version": "4.14.0",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.14.0.tgz",
+            "integrity": "sha512-coGKkWXIBczZPr284tYKFLg+KbGPPLlSbdgfKAb6QqCFt5bo5VFZ50O3FFzsw4rnkqjwT6D8Qcoo9nshYKM7Mg==",
             "requires": {
                 "@aws-sdk/credential-providers": "^3.186.0",
                 "bson": "^4.7.0",
diff --git a/package.json b/package.json
index a3f6066b..fa0614a8 100644
--- a/package.json
+++ b/package.json
@@ -99,7 +99,7 @@
         "jsonwebtoken": "~9.0.0",
         "jwt-decode": "~3.1.2",
         "limiter": "~2.1.0",
-        "mongodb": "~4.13.0",
+        "mongodb": "~4.14.0",
         "mqtt": "~4.3.7",
         "mssql": "~8.1.4",
         "mysql2": "~2.3.3",

From 5b0b743f81d1eb00f9dbca4acdbfc13a7da1683e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 26 Feb 2023 17:00:54 +0800
Subject: [PATCH 691/803] Update to 1.20.2

---
 package-lock.json | 4 ++--
 package.json      | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e642d03b..159d3366 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.20.1",
+    "version": "1.20.2",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.20.1",
+            "version": "1.20.2",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
diff --git a/package.json b/package.json
index fa0614a8..686947ec 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.20.1",
+    "version": "1.20.2",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -39,7 +39,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.20.1 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.20.2 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From b91c526d2e7c742d75a8179382c3b057adaa4f22 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 26 Feb 2023 17:56:01 +0800
Subject: [PATCH 692/803] [exe] Show server status

---
 extra/exe-builder/Program.cs                 | 28 ++++++++++++++++++--
 extra/exe-builder/Properties/AssemblyInfo.cs |  2 +-
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 1385e830..c120d6df 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -5,6 +5,7 @@ using System.Drawing;
 using System.IO;
 using System.Linq;
 using System.Net;
+using System.Net.Sockets;
 using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Threading.Tasks;
@@ -33,19 +34,26 @@ namespace UptimeKuma {
         private NotifyIcon trayIcon;
         private Process process;
 
+        private MenuItem statusMenuItem;
         private MenuItem runWhenStarts;
 
         private RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
 
-        public UptimeKumaApplicationContext()
-        {
+
+        public UptimeKumaApplicationContext() {
+            var startingText = "Starting server...";
             trayIcon = new NotifyIcon();
+            trayIcon.Text = startingText;
 
             runWhenStarts = new MenuItem("Run when system starts", RunWhenStarts);
             runWhenStarts.Checked = registryKey.GetValue(appName) != null;
 
+            statusMenuItem = new MenuItem(startingText);
+            statusMenuItem.Enabled = false;
+
             trayIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
             trayIcon.ContextMenu = new ContextMenu(new MenuItem[] {
+                statusMenuItem,
                 new("Open", Open),
                 //new("Debug Console", DebugConsole),
                 runWhenStarts,
@@ -109,6 +117,22 @@ namespace UptimeKuma {
                 process.Start();
                 //Open(null, null);
 
+                // Async task to check if the server is ready
+                Task.Run(() => {
+                    var runningText = "Server is running";
+                    using TcpClient tcpClient = new TcpClient();
+                    while (true) {
+                        try {
+                            tcpClient.Connect("127.0.0.1", 3001);
+                            statusMenuItem.Text = runningText;
+                            trayIcon.Text = runningText;
+                            break;
+                        } catch (Exception) {
+                            System.Threading.Thread.Sleep(2000);
+                        }
+                    }
+                });
+
             } catch (Exception e) {
                 MessageBox.Show("Startup failed: " + e.Message, "Uptime Kuma Error");
             }
diff --git a/extra/exe-builder/Properties/AssemblyInfo.cs b/extra/exe-builder/Properties/AssemblyInfo.cs
index 2552870b..59b36bb8 100644
--- a/extra/exe-builder/Properties/AssemblyInfo.cs
+++ b/extra/exe-builder/Properties/AssemblyInfo.cs
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("Uptime Kuma")]
-[assembly: AssemblyCopyright("Copyright © 2022 Louis Lam")]
+[assembly: AssemblyCopyright("Copyright © 2023 Louis Lam")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 

From 42a69c16ca42de0b34688b95e1f2e0188ad2811b Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sun, 26 Feb 2023 16:47:34 +0000
Subject: [PATCH 693/803] Switched to crypto.randomBytes fpr key generation

Keys are now 32 bytes long encoded in a URL safe base64 string

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 server/auth.js                                   | 7 ++++---
 server/socket-handlers/api-key-socket-handler.js | 6 +++---
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/server/auth.js b/server/auth.js
index eddae4c3..c42a74c4 100644
--- a/server/auth.js
+++ b/server/auth.js
@@ -44,8 +44,9 @@ async function verifyAPIKey(key) {
         return false;
     }
 
-    let index = key.substring(0, key.indexOf("-"));
-    let clear = key.substring(key.indexOf("-") + 1, key.length);
+    // uk prefix + key ID is before _
+    let index = key.substring(2, key.indexOf("_"));
+    let clear = key.substring(key.indexOf("_") + 1, key.length);
 
     let hash = await R.findOne("api_key", " id=? ", [ index ]);
 
@@ -137,7 +138,7 @@ exports.basicAuth = async function (req, res, next) {
 };
 
 /**
- * Use X-API-Key header if API keys enabled, else use basic auth
+ * Use use API Key if API keys enabled, else use basic auth
  * @param {express.Request} req Express request object
  * @param {express.Response} res Express response object
  * @param {express.NextFunction} next
diff --git a/server/socket-handlers/api-key-socket-handler.js b/server/socket-handlers/api-key-socket-handler.js
index cf124cad..546226f6 100644
--- a/server/socket-handlers/api-key-socket-handler.js
+++ b/server/socket-handlers/api-key-socket-handler.js
@@ -17,7 +17,7 @@ module.exports.apiKeySocketHandler = (socket) => {
     socket.on("addAPIKey", async (key, callback) => {
         try {
             checkLogin(socket);
-            let clearKey = crypto.randomUUID();
+            let clearKey = crypto.randomBytes(32).toString("base64url");
             let hashedKey = passwordHash.generate(clearKey);
             key["key"] = hashedKey;
             let bean = await APIKey.save(key, socket.userID);
@@ -25,9 +25,9 @@ module.exports.apiKeySocketHandler = (socket) => {
             log.debug("apikeys", "Added API Key");
             log.debug("apikeys", key);
 
-            // Append key ID to start of key seperated by -, used to get
+            // Append key ID and prefix to start of key seperated by _, used to get
             // correct hash when validating key.
-            let formattedKey = bean.id + "-" + clearKey;
+            let formattedKey = "uk" + bean.id + "_" + clearKey;
             await sendAPIKeyList(socket);
 
             // Enable API auth if the user creates a key, otherwise only basic

From 11fa690e0915b9be166b861cf704c76db864e59d Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sun, 26 Feb 2023 18:07:57 +0000
Subject: [PATCH 694/803] Updated API Keys UI

The UI has now been moved to the settings page.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/components/APIKeyDialog.vue               | 214 ++++++++++++++++++
 .../settings/APIKeys.vue}                     | 135 +++++------
 src/icon.js                                   |   2 -
 src/layouts/Layout.vue                        |   6 -
 src/pages/AddAPIKey.vue                       | 199 ----------------
 src/pages/Settings.vue                        |   6 +-
 src/router.js                                 |  15 +-
 7 files changed, 290 insertions(+), 287 deletions(-)
 create mode 100644 src/components/APIKeyDialog.vue
 rename src/{pages/ManageAPIKeys.vue => components/settings/APIKeys.vue} (56%)
 delete mode 100644 src/pages/AddAPIKey.vue

diff --git a/src/components/APIKeyDialog.vue b/src/components/APIKeyDialog.vue
new file mode 100644
index 00000000..106ad8c7
--- /dev/null
+++ b/src/components/APIKeyDialog.vue
@@ -0,0 +1,214 @@
+<template>
+    <form @submit.prevent="submit">
+        <div ref="keyaddmodal" class="modal fade" tabindex="-1" data-bs-backdrop="static">
+            <div class="modal-dialog">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title">
+                            {{ $t("Add API Key") }}
+                        </h5>
+                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" />
+                    </div>
+                    <div class="modal-body">
+                        <!-- Name -->
+                        <div class="mb-3">
+                            <label for="name" class="form-label">{{ $t("Name") }}</label>
+                            <input
+                                id="name" v-model="key.name" type="text" class="form-control"
+                                required
+                            >
+                        </div>
+
+                        <!-- Expiry -->
+                        <div class="my-3">
+                            <label class="form-label">{{ $t("Expiry date") }}</label>
+                            <Datepicker
+                                v-model="key.expires"
+                                :dark="$root.isDark"
+                                :monthChangeOnScroll="false"
+                                :minDate="minDate"
+                                format="yyyy-MM-dd HH:mm"
+                                modelType="yyyy-MM-dd HH:mm:ss"
+                                :required="!noExpire"
+                                :disabled="noExpire"
+                            />
+
+                            <div class="form-check mb-2">
+                                <input
+                                    id="no-expire" v-model="noExpire" class="form-check-input"
+                                    type="checkbox"
+                                >
+                                <label class="form-check-label" for="no-expire">{{
+                                    $t("Don't expire")
+                                }}</label>
+                            </div>
+                        </div>
+
+                        <div class="modal-footer">
+                            <button
+                                id="monitor-submit-btn" class="btn btn-primary" type="submit"
+                                :disabled="processing"
+                            >
+                                {{ $t("Generate") }}
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div ref="keymodal" class="modal fade" tabindex="-1" data-bs-backdrop="static">
+            <div class="modal-dialog">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title">
+                            {{ $t("Key Added") }}
+                        </h5>
+                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" />
+                    </div>
+
+                    <div class="modal-body">
+                        <div class="mb-3">
+                            {{ $t("apiKeyAddedMsg") }}
+                        </div>
+                        <div class="mb-3">
+                            <CopyableInput v-model="clearKey" disabled="disabled" />
+                        </div>
+                    </div>
+
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-primary" data-bs-dismiss="modal">
+                            {{ $t('Continue') }}
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </form>
+</template>
+
+<script lang="ts">
+import { Modal } from "bootstrap";
+import { useToast } from "vue-toastification";
+import dayjs from "dayjs";
+import Datepicker from "@vuepic/vue-datepicker";
+import CopyableInput from "./CopyableInput.vue";
+const toast = useToast();
+
+export default {
+    components: {
+        CopyableInput,
+        Datepicker
+    },
+    props: {},
+    // emits: [ "added" ],
+    data() {
+        return {
+            keyaddmodal: null,
+            keymodal: null,
+            processing: false,
+            key: {},
+            dark: (this.$root.theme === "dark"),
+            minDate: this.$root.date(dayjs()) + " 00:00",
+            clearKey: null,
+            noExpire: false,
+        };
+    },
+
+    mounted() {
+        this.keyaddmodal = new Modal(this.$refs.keyaddmodal);
+        this.keymodal = new Modal(this.$refs.keymodal);
+    },
+
+    methods: {
+        /**
+         * Show modal
+         */
+        show() {
+            this.id = null;
+            this.key = {
+                name: "",
+                expires: this.minDate,
+                active: 1,
+            };
+
+            this.keyaddmodal.show();
+        },
+
+        /** Submit data to server */
+        async submit() {
+            this.processing = true;
+
+            if (this.noExpire) {
+                this.key.expires = null;
+            }
+
+            this.$root.addAPIKey(this.key, async (res) => {
+                this.keyaddmodal.hide();
+                if (res.ok) {
+                    this.clearKey = res.key;
+                    this.keymodal.show();
+                    this.clearForm();
+                } else {
+                    toast.error(res.msg);
+                }
+                this.processing = false;
+            });
+        },
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../assets/vars.scss";
+
+.dark {
+    .modal-dialog .form-text, .modal-dialog p {
+        color: $dark-font-color;
+    }
+}
+
+.shadow-box {
+    padding: 20px;
+}
+
+textarea {
+    min-height: 150px;
+}
+
+.dark-calendar::-webkit-calendar-picker-indicator {
+    filter: invert(1);
+}
+
+.weekday-picker {
+    display: flex;
+    gap: 10px;
+
+    & > div {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        width: 40px;
+
+        .form-check-inline {
+            margin-right: 0;
+        }
+    }
+}
+
+.day-picker {
+    display: flex;
+    gap: 10px;
+    flex-wrap: wrap;
+
+    & > div {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        width: 40px;
+
+        .form-check-inline {
+            margin-right: 0;
+        }
+    }
+}
+</style>
diff --git a/src/pages/ManageAPIKeys.vue b/src/components/settings/APIKeys.vue
similarity index 56%
rename from src/pages/ManageAPIKeys.vue
rename to src/components/settings/APIKeys.vue
index ccfc0ce6..3ecd53b7 100644
--- a/src/pages/ManageAPIKeys.vue
+++ b/src/components/settings/APIKeys.vue
@@ -1,85 +1,83 @@
 <template>
-    <transition name="slide-fade" appear>
+    <div>
+        <div class="add-btn">
+            <button class="btn btn-primary me-2" type="button" @click="$refs.apiKeyDialog.show()">
+                <font-awesome-icon icon="plus" /> {{ $t("Add API Key") }}
+            </button>
+        </div>
+
         <div>
-            <h1 class="mb-3">
-                {{ $t("API Keys") }}
-            </h1>
+            <span v-if="Object.keys(keyList).length === 0" class="d-flex align-items-center justify-content-center my-3">
+                {{ $t("No API Keys") }}
+            </span>
 
-            <div>
-                <router-link to="/apikeys/add" class="btn btn-primary mb-3">
-                    <font-awesome-icon icon="plus" /> {{ $t("Add API Key") }}
-                </router-link>
-            </div>
-
-            <div class="shadow-box">
-                <span v-if="Object.keys(keyList).length === 0" class="d-flex align-items-center justify-content-center my-3">
-                    {{ $t("No API Keys") }}
-                </span>
-
-                <div
-                    v-for="(item, index) in keyList"
-                    :key="index"
-                    class="item"
-                    :class="item.status"
-                >
-                    <div class="left-part">
-                        <div
-                            class="circle"
-                        ></div>
-                        <div class="info">
-                            <div class="title">{{ item.name }}</div>
-                            <div class="status">
-                                {{ $t("apiKey-" + item.status) }}
-                            </div>
-                            <div class="date">
-                                {{ $t("Created") }}: {{ item.createdDate }}
-                            </div>
-                            <div class="date">
-                                {{ $t("Expires") }}: {{ item.expires || $t("Never") }}
-                            </div>
+            <div
+                v-for="(item, index) in keyList"
+                :key="index"
+                class="item"
+                :class="item.status"
+            >
+                <div class="left-part">
+                    <div
+                        class="circle"
+                    ></div>
+                    <div class="info">
+                        <div class="title">{{ item.name }}</div>
+                        <div class="status">
+                            {{ $t("apiKey-" + item.status) }}
                         </div>
-                    </div>
-
-                    <div class="buttons">
-                        <div class="btn-group" role="group">
-                            <button v-if="item.active" class="btn btn-normal" @click="disableDialog(item.id)">
-                                <font-awesome-icon icon="pause" /> {{ $t("Disable") }}
-                            </button>
-
-                            <button v-if="!item.active" class="btn btn-primary" @click="enableKey(item.id)">
-                                <font-awesome-icon icon="play" /> {{ $t("Enable") }}
-                            </button>
-
-                            <button class="btn btn-danger" @click="deleteDialog(item.id)">
-                                <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
-                            </button>
+                        <div class="date">
+                            {{ $t("Created") }}: {{ item.createdDate }}
+                        </div>
+                        <div class="date">
+                            {{ $t("Expires") }}: {{ item.expires || $t("Never") }}
                         </div>
                     </div>
                 </div>
+
+                <div class="buttons">
+                    <div class="btn-group" role="group">
+                        <button v-if="item.active" class="btn btn-normal" @click="disableDialog(item.id)">
+                            <font-awesome-icon icon="pause" /> {{ $t("Disable") }}
+                        </button>
+
+                        <button v-if="!item.active" class="btn btn-primary" @click="enableKey(item.id)">
+                            <font-awesome-icon icon="play" /> {{ $t("Enable") }}
+                        </button>
+
+                        <button class="btn btn-danger" @click="deleteDialog(item.id)">
+                            <font-awesome-icon icon="trash" /> {{ $t("Delete") }}
+                        </button>
+                    </div>
+                </div>
             </div>
-
-            <div class="text-center mt-3" style="font-size: 13px;">
-                <a href="https://github.com/louislam/uptime-kuma/wiki/API-Keys" target="_blank">{{ $t("Learn More") }}</a>
-            </div>
-
-            <Confirm ref="confirmPause" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="disableKey">
-                {{ $t("disableAPIKeyMsg") }}
-            </Confirm>
-
-            <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteKey">
-                {{ $t("deleteAPIKeyMsg") }}
-            </Confirm>
         </div>
-    </transition>
+
+        <div class="text-center mt-3" style="font-size: 13px;">
+            <a href="https://github.com/louislam/uptime-kuma/wiki/API-Keys" target="_blank">{{ $t("Learn More") }}</a>
+        </div>
+
+        <Confirm ref="confirmPause" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="disableKey">
+            {{ $t("disableAPIKeyMsg") }}
+        </Confirm>
+
+        <Confirm ref="confirmDelete" btn-style="btn-danger" :yes-text="$t('Yes')" :no-text="$t('No')" @yes="deleteKey">
+            {{ $t("deleteAPIKeyMsg") }}
+        </Confirm>
+
+        <APIKeyDialog ref="apiKeyDialog" />
+    </div>
 </template>
 
 <script>
-import Confirm from "../components/Confirm.vue";
+import APIKeyDialog from "../../components/APIKeyDialog.vue";
+import Confirm from "../Confirm.vue";
 import { useToast } from "vue-toastification";
 const toast = useToast();
 
 export default {
     components: {
+        APIKeyDialog,
         Confirm,
     },
     data() {
@@ -111,7 +109,6 @@ export default {
             this.$root.deleteAPIKey(this.selectedKeyID, (res) => {
                 if (res.ok) {
                     toast.success(res.msg);
-                    this.$router.push("/apikeys");
                 } else {
                     toast.error(res.msg);
                 }
@@ -148,7 +145,7 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-    @import "../assets/vars.scss";
+    @import "../../assets/vars.scss";
 
     .mobile {
         .item {
@@ -158,6 +155,10 @@ export default {
         }
     }
 
+    .add-btn {
+        padding-top: 20px;
+    }
+
     .item {
         display: flex;
         align-items: center;
diff --git a/src/icon.js b/src/icon.js
index ee62ce5e..6cc997bb 100644
--- a/src/icon.js
+++ b/src/icon.js
@@ -44,7 +44,6 @@ import {
     faWrench,
     faHeartbeat,
     faFilter,
-    faKey,
     faInfoCircle,
 } from "@fortawesome/free-solid-svg-icons";
 
@@ -90,7 +89,6 @@ library.add(
     faWrench,
     faHeartbeat,
     faFilter,
-    faKey,
     faInfoCircle,
 );
 
diff --git a/src/layouts/Layout.vue b/src/layouts/Layout.vue
index b35cc004..9069aef7 100644
--- a/src/layouts/Layout.vue
+++ b/src/layouts/Layout.vue
@@ -57,12 +57,6 @@
                                 </router-link>
                             </li>
 
-                            <li>
-                                <router-link to="/apikeys" class="dropdown-item" :class="{ active: $route.path.includes('manage-apikeys') }">
-                                    <font-awesome-icon icon="key" /> {{ $t("API Keys") }}
-                                </router-link>
-                            </li>
-
                             <li>
                                 <router-link to="/settings/general" class="dropdown-item" :class="{ active: $route.path.includes('settings') }">
                                     <font-awesome-icon icon="cog" /> {{ $t("Settings") }}
diff --git a/src/pages/AddAPIKey.vue b/src/pages/AddAPIKey.vue
deleted file mode 100644
index e6b60233..00000000
--- a/src/pages/AddAPIKey.vue
+++ /dev/null
@@ -1,199 +0,0 @@
-<template>
-    <transition name="slide-fade" appear>
-        <div>
-            <h1 class="mb-3">{{ $t("Add API Key") }}</h1>
-            <form @submit.prevent="submit">
-                <div class="shadow-box">
-                    <div class="row">
-                        <div class="col-xl-10">
-                            <!-- Title -->
-                            <div class="mb-3">
-                                <label for="name" class="form-label">{{ $t("Name") }}</label>
-                                <input
-                                    id="name" v-model="key.name" type="text" class="form-control"
-                                    required
-                                >
-                            </div>
-
-                            <h2 class="mt-5">{{ $t("Expiry") }}</h2>
-
-                            <!-- Expiry -->
-                            <div class="my-3">
-                                <label class="form-label">{{ $t("Expiry date") }}</label>
-                                <Datepicker
-                                    v-model="key.expires"
-                                    :dark="$root.isDark"
-                                    :monthChangeOnScroll="false"
-                                    :minDate="minDate"
-                                    format="yyyy-MM-dd HH:mm"
-                                    modelType="yyyy-MM-dd HH:mm:ss"
-                                    :required="!noExpire"
-                                    :disabled="noExpire"
-                                />
-
-                                <div class="form-check mb-2">
-                                    <input
-                                        id="no-expire" v-model="noExpire" class="form-check-input"
-                                        type="checkbox"
-                                    >
-                                    <label class="form-check-label" for="no-expire">{{
-                                        $t("Don't expire")
-                                    }}</label>
-                                </div>
-                            </div>
-
-                            <div class="mt-4 mb-1">
-                                <button
-                                    id="monitor-submit-btn" class="btn btn-primary" type="submit"
-                                    :disabled="processing"
-                                >
-                                    {{ $t("Generate") }}
-                                </button>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </form>
-            <Confirm
-                ref="keyAdded"
-                :yes-text="$t('Continue')"
-                :no-text="$t('Add Another')"
-                :title="$t('Key Added')"
-                @yes="postAdd"
-                @no="clearForm"
-            >
-                <p>{{ $t("apiKeyAddedMsg") }}</p>
-                <p>{{ clearKey }}</p>
-            </Confirm>
-        </div>
-    </transition>
-</template>
-
-<script>
-
-import { useToast } from "vue-toastification";
-import dayjs from "dayjs";
-import Datepicker from "@vuepic/vue-datepicker";
-import Confirm from "../components/Confirm.vue";
-
-const toast = useToast();
-
-export default {
-    components: {
-        Confirm,
-        Datepicker
-    },
-
-    data() {
-        return {
-            processing: false,
-            key: {},
-            dark: (this.$root.theme === "dark"),
-            minDate: this.$root.date(dayjs()) + " 00:00",
-            clearKey: null,
-            noExpire: false,
-        };
-    },
-
-    watch: {
-        "$route.fullPath"() {
-            this.init();
-        },
-    },
-
-    mounted() {
-        this.init();
-    },
-
-    methods: {
-        /** Initialise page */
-        init() {
-            this.clearForm();
-        },
-
-        /** Redirect user to apikey list */
-        postAdd() {
-            this.$router.push("/apikeys");
-        },
-
-        /** Clear the form */
-        clearForm() {
-            this.key = {
-                name: "",
-                expires: this.minDate,
-                active: 1,
-            };
-            this.noExpire = false;
-        },
-
-        /** Submit data to server */
-        async submit() {
-            this.processing = true;
-
-            if (this.noExpire) {
-                this.key.expires = null;
-            }
-
-            this.$root.addAPIKey(this.key, async (res) => {
-                if (res.ok) {
-                    this.clearKey = res.key;
-                    this.$refs.keyAdded.show();
-                    this.clearForm();
-
-                } else {
-                    toast.error(res.msg);
-                }
-                this.processing = false;
-            });
-        },
-    },
-};
-</script>
-
-<style lang="scss" scoped>
-.shadow-box {
-    padding: 20px;
-}
-
-textarea {
-    min-height: 150px;
-}
-
-.dark-calendar::-webkit-calendar-picker-indicator {
-    filter: invert(1);
-}
-
-.weekday-picker {
-    display: flex;
-    gap: 10px;
-
-    & > div {
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        width: 40px;
-
-        .form-check-inline {
-            margin-right: 0;
-        }
-    }
-}
-
-.day-picker {
-    display: flex;
-    gap: 10px;
-    flex-wrap: wrap;
-
-    & > div {
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        width: 40px;
-
-        .form-check-inline {
-            margin-right: 0;
-        }
-    }
-}
-
-</style>
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index a076a4d3..d3c153df 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -7,9 +7,6 @@
             <router-link to="/maintenance" class="nav-link">
                 <font-awesome-icon icon="wrench" /> {{ $t("Maintenance") }}
             </router-link>
-            <router-link to="/apikeys" class="nav-link" :class="{ active: $route.path.includes('manage-apikeys') }">
-                <font-awesome-icon icon="key" /> {{ $t("API Keys") }}
-            </router-link>
         </div>
 
         <h1 v-show="show" class="mb-3">
@@ -110,6 +107,9 @@ export default {
                 security: {
                     title: this.$t("Security"),
                 },
+                "api-keys": {
+                    title: this.$t("API Keys")
+                },
                 proxies: {
                     title: this.$t("Proxies"),
                 },
diff --git a/src/router.js b/src/router.js
index af86356e..b9493f09 100644
--- a/src/router.js
+++ b/src/router.js
@@ -18,8 +18,7 @@ import NotFound from "./pages/NotFound.vue";
 import DockerHosts from "./components/settings/Docker.vue";
 import MaintenanceDetails from "./pages/MaintenanceDetails.vue";
 import ManageMaintenance from "./pages/ManageMaintenance.vue";
-import ManageAPIKeys from "./pages/ManageAPIKeys.vue";
-import AddAPIKey from "./pages/AddAPIKey.vue";
+import APIKeys from "./components/settings/APIKeys.vue";
 import Plugins from "./components/settings/Plugins.vue";
 
 // Settings - Sub Pages
@@ -115,6 +114,10 @@ const routes = [
                                 path: "security",
                                 component: Security,
                             },
+                            {
+                                path: "api-keys",
+                                component: APIKeys,
+                            },
                             {
                                 path: "proxies",
                                 component: Proxies,
@@ -157,14 +160,6 @@ const routes = [
                         path: "/maintenance/edit/:id",
                         component: EditMaintenance,
                     },
-                    {
-                        path: "/apikeys",
-                        component: ManageAPIKeys
-                    },
-                    {
-                        path: "/apikeys/add",
-                        component: AddAPIKey
-                    },
                 ],
             },
         ],

From 669f8700b236cc7727b6485d5f6126ee6f88e233 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Sun, 26 Feb 2023 19:36:50 +0000
Subject: [PATCH 695/803] Switched to nanoid for key generation

To try and prevent any security issues, use an external package to
generate key instead of doing it ourselves. Note: we have to use nanoid
version 3 as nanoid version 4 requires ESM. Currently, nanoid v3 is
still supported.

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 package-lock.json                                | 5 ++---
 package.json                                     | 1 +
 server/socket-handlers/api-key-socket-handler.js | 5 +++--
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 5e57a932..328043b6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -45,6 +45,7 @@
                 "mqtt": "~4.3.7",
                 "mssql": "~8.1.4",
                 "mysql2": "~2.3.3",
+                "nanoid": "^3.3.4",
                 "node-cloudflared-tunnel": "~1.0.9",
                 "node-radius-client": "~1.0.0",
                 "nodemailer": "~6.6.5",
@@ -14247,7 +14248,6 @@
             "version": "3.3.4",
             "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
             "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
-            "dev": true,
             "bin": {
                 "nanoid": "bin/nanoid.cjs"
             },
@@ -29825,8 +29825,7 @@
         "nanoid": {
             "version": "3.3.4",
             "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
-            "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
-            "dev": true
+            "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
         },
         "native-duplexpair": {
             "version": "1.0.0",
diff --git a/package.json b/package.json
index a3f6066b..7b5facab 100644
--- a/package.json
+++ b/package.json
@@ -103,6 +103,7 @@
         "mqtt": "~4.3.7",
         "mssql": "~8.1.4",
         "mysql2": "~2.3.3",
+        "nanoid": "^3.3.4",
         "node-cloudflared-tunnel": "~1.0.9",
         "node-radius-client": "~1.0.0",
         "nodemailer": "~6.6.5",
diff --git a/server/socket-handlers/api-key-socket-handler.js b/server/socket-handlers/api-key-socket-handler.js
index 546226f6..69b0b60d 100644
--- a/server/socket-handlers/api-key-socket-handler.js
+++ b/server/socket-handlers/api-key-socket-handler.js
@@ -1,7 +1,7 @@
 const { checkLogin } = require("../util-server");
 const { log } = require("../../src/util");
 const { R } = require("redbean-node");
-const crypto = require("crypto");
+const { nanoid } = require("nanoid");
 const passwordHash = require("../password-hash");
 const apicache = require("../modules/apicache");
 const APIKey = require("../model/api_key");
@@ -17,7 +17,8 @@ module.exports.apiKeySocketHandler = (socket) => {
     socket.on("addAPIKey", async (key, callback) => {
         try {
             checkLogin(socket);
-            let clearKey = crypto.randomBytes(32).toString("base64url");
+
+            let clearKey = nanoid(40);
             let hashedKey = passwordHash.generate(clearKey);
             key["key"] = hashedKey;
             let bean = await APIKey.save(key, socket.userID);

From fee8fd932093aa466050fc49ea8fcdcf1912726b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 27 Feb 2023 18:45:54 +0800
Subject: [PATCH 696/803] [exe] Use `Environment.CurrentDirectory` instead of
 overriding fs

---
 extra/exe-builder/FS.cs             | 65 -----------------------------
 extra/exe-builder/Program.cs        |  6 +++
 extra/exe-builder/UptimeKuma.csproj |  1 -
 3 files changed, 6 insertions(+), 66 deletions(-)
 delete mode 100644 extra/exe-builder/FS.cs

diff --git a/extra/exe-builder/FS.cs b/extra/exe-builder/FS.cs
deleted file mode 100644
index 99a63694..00000000
--- a/extra/exe-builder/FS.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using System.IO;
-using System.Reflection;
-
-namespace UptimeKuma {
-
-    /**
-     * Current Directory using App location
-     */
-    public class Directory {
-        private static string baseDir;
-
-        public static string FullPath(string path) {
-            return Path.Combine(GetBaseDir(), path);
-        }
-
-        public static string GetBaseDir() {
-            if (baseDir == null) {
-                baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
-            }
-            return baseDir;
-        }
-
-        public static bool Exists(string path) {
-            return System.IO.Directory.Exists(FullPath(path));
-        }
-
-        public static void Delete(string path, bool recursive) {
-            System.IO.Directory.Delete(FullPath(path), recursive);
-        }
-
-        public static void Move(string src, string dest) {
-            System.IO.Directory.Move(FullPath(src), FullPath(dest));
-        }
-
-        public static string[] GetDirectories(string path) {
-            return System.IO.Directory.GetDirectories(FullPath(path));
-        }
-    }
-
-    public class File {
-
-        private static string FullPath(string path) {
-            return Directory.FullPath(path);
-        }
-        public static bool Exists(string path) {
-            return System.IO.File.Exists(FullPath(path));
-        }
-
-        public static FileStream Create(string path) {
-            return System.IO.File.Create(FullPath(path));
-        }
-
-        public static string ReadAllText(string path) {
-            return System.IO.File.ReadAllText(FullPath(path));
-        }
-
-        public static void Delete(string path) {
-            System.IO.File.Delete(FullPath(path));
-        }
-
-        public static void WriteAllText(string path, string content) {
-            System.IO.File.WriteAllText(FullPath(path), content);
-        }
-    }
-}
diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index c120d6df..69cb1a73 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -21,6 +21,12 @@ namespace UptimeKuma {
         /// </summary>
         [STAThread]
         static void Main(string[] args) {
+            var cwd = Path.GetDirectoryName(Application.ExecutablePath);
+
+            if (cwd != null) {
+                Environment.CurrentDirectory = cwd;
+            }
+            
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
             Application.Run(new UptimeKumaApplicationContext());
diff --git a/extra/exe-builder/UptimeKuma.csproj b/extra/exe-builder/UptimeKuma.csproj
index bd4e0dea..ecd6a46b 100644
--- a/extra/exe-builder/UptimeKuma.csproj
+++ b/extra/exe-builder/UptimeKuma.csproj
@@ -160,7 +160,6 @@
         <Compile Include="DownloadForm.Designer.cs">
           <DependentUpon>DownloadForm.cs</DependentUpon>
         </Compile>
-        <Compile Include="FS.cs" />
         <Compile Include="Program.cs" />
         <Compile Include="Properties\AssemblyInfo.cs" />
         <Compile Include="Version.cs" />

From bba8c6fe4ec917484031a68edade6cd793e8d489 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 27 Feb 2023 18:48:11 +0800
Subject: [PATCH 697/803] [exe] Open menu item is clickable after the server is
 ready

---
 extra/exe-builder/Program.cs | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 69cb1a73..31befa54 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -26,7 +26,7 @@ namespace UptimeKuma {
             if (cwd != null) {
                 Environment.CurrentDirectory = cwd;
             }
-            
+
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);
             Application.Run(new UptimeKumaApplicationContext());
@@ -42,6 +42,7 @@ namespace UptimeKuma {
 
         private MenuItem statusMenuItem;
         private MenuItem runWhenStarts;
+        private MenuItem openMenuItem;
 
         private RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
 
@@ -57,10 +58,13 @@ namespace UptimeKuma {
             statusMenuItem = new MenuItem(startingText);
             statusMenuItem.Enabled = false;
 
+            openMenuItem = new MenuItem("Open", Open);
+            openMenuItem.Enabled = false;
+
             trayIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
             trayIcon.ContextMenu = new ContextMenu(new MenuItem[] {
                 statusMenuItem,
-                new("Open", Open),
+                openMenuItem,
                 //new("Debug Console", DebugConsole),
                 runWhenStarts,
                 new("Check for Update...", CheckForUpdate),
@@ -131,6 +135,7 @@ namespace UptimeKuma {
                         try {
                             tcpClient.Connect("127.0.0.1", 3001);
                             statusMenuItem.Text = runningText;
+                            openMenuItem.Enabled = true;
                             trayIcon.Text = runningText;
                             break;
                         } catch (Exception) {

From fc8a324f41abe75cd60f0e482330ddfbec7d1c96 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 27 Feb 2023 18:52:19 +0800
Subject: [PATCH 698/803] [exe] single instance only

---
 extra/exe-builder/Program.cs | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/extra/exe-builder/Program.cs b/extra/exe-builder/Program.cs
index 31befa54..6004f6d4 100644
--- a/extra/exe-builder/Program.cs
+++ b/extra/exe-builder/Program.cs
@@ -8,6 +8,7 @@ using System.Net;
 using System.Net.Sockets;
 using System.Reflection;
 using System.Runtime.InteropServices;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using Microsoft.Win32;
@@ -35,6 +36,8 @@ namespace UptimeKuma {
 
     public class UptimeKumaApplicationContext : ApplicationContext
     {
+        private static Mutex mutex = null;
+
         const string appName = "Uptime Kuma";
 
         private NotifyIcon trayIcon;
@@ -48,6 +51,14 @@ namespace UptimeKuma {
 
 
         public UptimeKumaApplicationContext() {
+
+            // Single instance only
+            bool createdNew;
+            mutex = new Mutex(true, appName, out createdNew);
+            if (!createdNew) {
+                return;
+            }
+
             var startingText = "Starting server...";
             trayIcon = new NotifyIcon();
             trayIcon.Text = startingText;

From 97e276bdb5ae959bb0657e8961c14f86a5a51427 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Mon, 27 Feb 2023 18:19:56 +0000
Subject: [PATCH 699/803] Fixed processing error with add API key

Also added padding below add button

Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/components/APIKeyDialog.vue     | 2 +-
 src/components/settings/APIKeys.vue | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/components/APIKeyDialog.vue b/src/components/APIKeyDialog.vue
index 106ad8c7..7a4c2464 100644
--- a/src/components/APIKeyDialog.vue
+++ b/src/components/APIKeyDialog.vue
@@ -144,6 +144,7 @@ export default {
 
             this.$root.addAPIKey(this.key, async (res) => {
                 this.keyaddmodal.hide();
+                this.processing = false;
                 if (res.ok) {
                     this.clearKey = res.key;
                     this.keymodal.show();
@@ -151,7 +152,6 @@ export default {
                 } else {
                     toast.error(res.msg);
                 }
-                this.processing = false;
             });
         },
     }
diff --git a/src/components/settings/APIKeys.vue b/src/components/settings/APIKeys.vue
index 3ecd53b7..75778993 100644
--- a/src/components/settings/APIKeys.vue
+++ b/src/components/settings/APIKeys.vue
@@ -157,6 +157,7 @@ export default {
 
     .add-btn {
         padding-top: 20px;
+        padding-bottom: 20px;
     }
 
     .item {

From 7e178d93dfcd15f781c0c46b4368e057d160abf9 Mon Sep 17 00:00:00 2001
From: Matthew Nickson <mnickson@sidingsmedia.com>
Date: Mon, 27 Feb 2023 18:44:32 +0000
Subject: [PATCH 700/803] Moved location of disable expiry checkbox

Co-authored-by: Nelson Chan <chakflying@hotmail.com>
Signed-off-by: Matthew Nickson <mnickson@sidingsmedia.com>
---
 src/components/APIKeyDialog.vue | 43 ++++++++++++++++++---------------
 1 file changed, 24 insertions(+), 19 deletions(-)

diff --git a/src/components/APIKeyDialog.vue b/src/components/APIKeyDialog.vue
index 7a4c2464..745efd4a 100644
--- a/src/components/APIKeyDialog.vue
+++ b/src/components/APIKeyDialog.vue
@@ -22,25 +22,30 @@
                         <!-- Expiry -->
                         <div class="my-3">
                             <label class="form-label">{{ $t("Expiry date") }}</label>
-                            <Datepicker
-                                v-model="key.expires"
-                                :dark="$root.isDark"
-                                :monthChangeOnScroll="false"
-                                :minDate="minDate"
-                                format="yyyy-MM-dd HH:mm"
-                                modelType="yyyy-MM-dd HH:mm:ss"
-                                :required="!noExpire"
-                                :disabled="noExpire"
-                            />
-
-                            <div class="form-check mb-2">
-                                <input
-                                    id="no-expire" v-model="noExpire" class="form-check-input"
-                                    type="checkbox"
-                                >
-                                <label class="form-check-label" for="no-expire">{{
-                                    $t("Don't expire")
-                                }}</label>
+                            <div class="d-flex flex-row align-items-center">
+                                <div class="col-6">
+                                    <Datepicker
+                                        v-model="key.expires"
+                                        :dark="$root.isDark"
+                                        :monthChangeOnScroll="false"
+                                        :minDate="minDate"
+                                        format="yyyy-MM-dd HH:mm"
+                                        modelType="yyyy-MM-dd HH:mm:ss"
+                                        :required="!noExpire"
+                                        :disabled="noExpire"
+                                    />
+                                </div>
+                                <div class="col-6 ms-3">
+                                    <div class="form-check mb-0">
+                                        <input
+                                            id="no-expire" v-model="noExpire" class="form-check-input"
+                                            type="checkbox"
+                                        >
+                                        <label class="form-check-label" for="no-expire">{{
+                                            $t("Don't expire")
+                                        }}</label>
+                                    </div>
+                                </div>
                             </div>
                         </div>
 

From 958354e4db31eb59e7f054fb6a236c5ad1b9045f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 28 Feb 2023 16:58:36 +0800
Subject: [PATCH 701/803] Minor

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

diff --git a/server/database.js b/server/database.js
index e4e5e4bb..5a83e1fb 100644
--- a/server/database.js
+++ b/server/database.js
@@ -68,11 +68,11 @@ class Database {
         "patch-monitor-add-resend-interval.sql": true,
         "patch-ping-packet-size.sql": true,
         "patch-maintenance-table2.sql": true,
-        "patch-api-key-table.sql": true,
         "patch-add-gamedig-monitor.sql": true,
         "patch-add-google-analytics-status-page-tag.sql": true,
         "patch-http-body-encoding.sql": true,
         "patch-add-description-monitor.sql": true,
+        "patch-api-key-table.sql": true,
     };
 
     /**

From b21c2adcc2ec7808e0e8688ef6f25702f0af5c6a Mon Sep 17 00:00:00 2001
From: Bobby Ore <bobby.ore@while1.us>
Date: Tue, 28 Feb 2023 09:47:35 -0600
Subject: [PATCH 702/803] Rework lunasea notification to allow for device id
 and user id

---
 server/notification-providers/lunasea.js |  4 ++--
 src/components/notifications/LunaSea.vue | 27 ++++++++++++++++++------
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/server/notification-providers/lunasea.js b/server/notification-providers/lunasea.js
index 3df6fe1a..4d7136f7 100644
--- a/server/notification-providers/lunasea.js
+++ b/server/notification-providers/lunasea.js
@@ -9,8 +9,8 @@ class LunaSea extends NotificationProvider {
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
         let lunaseaurl = "";
-        if (notification.lunaseaNotificationType === "user") {
-            lunaseaurl = "https://notify.lunasea.app/v1/custom/user/" + notification.lunaseaDevice;
+        if (notification.lunaseaTarget === "user") {
+            lunaseaurl = "https://notify.lunasea.app/v1/custom/user/" + notification.lunaseaUserID;
         } else {
             lunaseaurl = "https://notify.lunasea.app/v1/custom/device/" + notification.lunaseaDevice;
         }
diff --git a/src/components/notifications/LunaSea.vue b/src/components/notifications/LunaSea.vue
index 230e3b0d..1ee4a8a5 100644
--- a/src/components/notifications/LunaSea.vue
+++ b/src/components/notifications/LunaSea.vue
@@ -1,18 +1,33 @@
 <template>
     <div class="mb-3">
-        <label for="lunasea-notification-type" class="form-label">{{ $t("Device ID or User ID") }}<span style="color: red;"><sup>*</sup></span></label>
+        <label for="lunasea-notification-target" class="form-label">{{ $t("Target") }}<span style="color: red;"><sup>*</sup></span></label>
         <div class="form-text">
             <p>
-                <select id="lunasea-notification-type" v-model="$parent.notification.lunaseaNotificationType" class="form-select" required>
+                <select id="lunasea-notification-target" v-model="$parent.notification.lunaseaTarget" class="form-select" required>
                     <option value="device">Device</option>
                     <option value="user">User</option>
                 </select>
             </p>
         </div>
-        <label for="lunasea-device" class="form-label">{{ $t("LunaSea ID") }}<span style="color: red;"><sup>*</sup></span></label>
-        <input id="lunasea-device" v-model="$parent.notification.lunaseaDevice" type="text" class="form-control" required>
-        <div class="form-text">
-            <p><span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}</p>
+        <div v-if="$parent.notification.lunaseaTarget === 'device'">
+            <label for="lunasea-device" class="form-label">{{ $t("Device ID") }}<span style="color: red;"><sup>*</sup></span></label>
+            <input id="lunasea-device" v-model="$parent.notification.lunaseaDevice" type="text" class="form-control">
+        </div>
+        <div v-if="$parent.notification.lunaseaTarget === 'user'">
+            <label for="lunasea-device" class="form-label">{{ $t("User ID") }}<span style="color: red;"><sup>*</sup></span></label>
+            <input id="lunasea-device" v-model="$parent.notification.lunaseaUserID" type="text" class="form-control">
         </div>
     </div>
 </template>
+
+<script lang="ts">
+
+export default {
+    mounted() {
+        if (typeof this.$parent.notification.lunaseaTarget === "undefined") {
+            this.$parent.notification.lunaseaTarget = "device";
+        }
+    }
+};
+
+</script>

From 098645701771ee6c4bb05ad6eb865e31703e4c55 Mon Sep 17 00:00:00 2001
From: Binyamin Yawitz <biny1000@gmail.com>
Date: Tue, 28 Feb 2023 12:45:35 -0500
Subject: [PATCH 703/803] Added Hebrew (he_IL) support

---
 src/i18n.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/i18n.js b/src/i18n.js
index c0c07797..2ab69c35 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -17,6 +17,7 @@ const languageList = {
     "pt-BR": "Português (Brasileiro)",
     "fi": "Suomi",
     "fr-FR": "Français (France)",
+    "he-IL": "עברית",
     "hu": "Magyar",
     "hr-HR": "Hrvatski",
     "it-IT": "Italiano (Italian)",

From 94c3861608e1bb606e7e4da31064933877880b0d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Wed, 1 Mar 2023 23:23:16 +0800
Subject: [PATCH 704/803] Update Apprise to 1.3.0

---
 docker/alpine-base.dockerfile | 2 +-
 docker/debian-base.dockerfile | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/docker/alpine-base.dockerfile b/docker/alpine-base.dockerfile
index 276d6e45..7aa0e8dc 100644
--- a/docker/alpine-base.dockerfile
+++ b/docker/alpine-base.dockerfile
@@ -4,5 +4,5 @@ WORKDIR /app
 
 # Install apprise, iputils for non-root ping, setpriv
 RUN apk add --no-cache iputils setpriv dumb-init python3 py3-cryptography py3-pip py3-six py3-yaml py3-click py3-markdown py3-requests py3-requests-oauthlib git && \
-    pip3 --no-cache-dir install apprise==1.2.1 && \
+    pip3 --no-cache-dir install apprise==1.3.0 && \
     rm -rf /root/.cache
diff --git a/docker/debian-base.dockerfile b/docker/debian-base.dockerfile
index 026189c4..e7c51ded 100644
--- a/docker/debian-base.dockerfile
+++ b/docker/debian-base.dockerfile
@@ -11,7 +11,7 @@ WORKDIR /app
 RUN apt update && \
     apt --yes --no-install-recommends install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib \
         sqlite3 iputils-ping util-linux dumb-init git && \
-    pip3 --no-cache-dir install apprise==1.2.1 && \
+    pip3 --no-cache-dir install apprise==1.3.0 && \
     rm -rf /var/lib/apt/lists/* && \
     apt --yes autoremove
 

From ad26f0e817dc76522b5d53655f05d6186a5f14c0 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Thu, 2 Mar 2023 06:44:16 +0800
Subject: [PATCH 705/803] Fix: assign tags when cloning monitor

---
 src/pages/EditMonitor.vue | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index fa1935b0..5d71ce1e 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -936,7 +936,16 @@ message HealthCheckResponse {
                             this.monitor.includeSensitiveData = undefined;
                             this.monitor.maintenance = undefined;
                             this.monitor.name = this.$t("cloneOf", [ this.monitor.name ]);
-                            this.monitor.tags = undefined; // FIXME: Cloning tags does not work yet
+                            this.$refs.tagsManager.newTags = this.monitor.tags.map((monitorTag) => {
+                                return {
+                                    id: monitorTag.tag_id,
+                                    name: monitorTag.name,
+                                    color: monitorTag.color,
+                                    value: monitorTag.value,
+                                    new: true,
+                                };
+                            });
+                            this.monitor.tags = undefined;
                         }
 
                         // Handling for monitors that are created before 1.7.0

From bc87abf5c2eb550784b424e76b6623ef029aa9e9 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Fri, 3 Mar 2023 05:57:36 +0800
Subject: [PATCH 706/803] Fix: Clear uptime cache on push beat

---
 server/routers/api-router.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/server/routers/api-router.js b/server/routers/api-router.js
index 2d5f9661..a36159ca 100644
--- a/server/routers/api-router.js
+++ b/server/routers/api-router.js
@@ -7,6 +7,7 @@ const dayjs = require("dayjs");
 const { UP, MAINTENANCE, DOWN, PENDING, flipStatus, log } = require("../../src/util");
 const StatusPage = require("../model/status_page");
 const { UptimeKumaServer } = require("../uptime-kuma-server");
+const { UptimeCacheList } = require("../uptime-cache-list");
 const { makeBadge } = require("badge-maker");
 const { badgeConstants } = require("../config");
 
@@ -86,6 +87,7 @@ router.get("/api/push/:pushToken", async (request, response) => {
         await R.store(bean);
 
         io.to(monitor.user_id).emit("heartbeat", bean.toJSON());
+        UptimeCacheList.clearCache(monitor.id);
         Monitor.sendStats(io, monitor.id, monitor.user_id);
 
         response.json({

From 5f1b58e8362ce1c2380a91c5a3b98e64afdf217f Mon Sep 17 00:00:00 2001
From: DevMirza <pzhafeez@gmail.com>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 707/803] Translated using Weblate (Arabic (ar_SY))

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Urdu)

Currently translated at 27.6% (193 of 697 strings)

Translated using Weblate (Urdu)

Currently translated at 17.7% (124 of 697 strings)

Translated using Weblate (Hungarian)

Currently translated at 74.0% (516 of 697 strings)

Translated using Weblate (English)

Currently translated at 100.0% (697 of 697 strings)

Added translation using Weblate (Urdu)

Co-authored-by: DevMirza <pzhafeez@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ar_SY/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/hu/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ur/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ar-SY.json |  55 ++++++++++---
 src/lang/en.json    |   2 +-
 src/lang/hu.json    |   2 +-
 src/lang/ur.json    | 195 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 240 insertions(+), 14 deletions(-)
 create mode 100644 src/lang/ur.json

diff --git a/src/lang/ar-SY.json b/src/lang/ar-SY.json
index 3a4cf140..a83c9a3c 100644
--- a/src/lang/ar-SY.json
+++ b/src/lang/ar-SY.json
@@ -1,5 +1,5 @@
 {
-    "languageName": "العربية",
+    "languageName": "إنجليزي",
     "checkEverySecond": "تحقق من كل {0} ثانية",
     "retryCheckEverySecond": "أعد محاولة كل {0} ثانية",
     "resendEveryXTimes": "إعادة تقديم كل {0} مرات",
@@ -15,10 +15,10 @@
     "statusMaintenance": "صيانة",
     "Schedule maintenance": "جدولة الصيانة",
     "Affected Monitors": "الشاشات المتأثرة",
-    "Pick Affected Monitors...": "اختيار الشاشات المتأثرة ...",
+    "Pick Affected Monitors...": "اختر الشاشات المتأثرة …",
     "Start of maintenance": "بداية الصيانة",
     "All Status Pages": "جميع صفحات الحالة",
-    "Select status pages...": "حدد صفحات الحالة ...",
+    "Select status pages...": "حدد صفحات الحالة …",
     "recurringIntervalMessage": "ركض مرة واحدة كل يوم | قم بالتشغيل مرة واحدة كل يوم {0}",
     "affectedMonitorsDescription": "حدد المراقبين المتأثرة بالصيانة الحالية",
     "affectedStatusPages": "إظهار رسالة الصيانة هذه على صفحات الحالة المحددة",
@@ -178,7 +178,7 @@
     "Token": "رمز",
     "Show URI": "أظهر URI",
     "Tags": "العلامات",
-    "Add New below or Select...": "أضف جديدًا أدناه أو حدد ...",
+    "Add New below or Select...": "إضافة جديد أدناه أو تحديد …",
     "Tag with this name already exist.": "علامة مع هذا الاسم موجود بالفعل.",
     "Tag with this value already exist.": "علامة مع هذه القيمة موجودة بالفعل.",
     "color": "اللون",
@@ -192,7 +192,7 @@
     "Purple": "نفسجي",
     "Pink": "لون القرنفل",
     "Custom": "العادة",
-    "Search...": "يبحث...",
+    "Search...": "يبحث…",
     "Avg. Ping": "متوسط. بينغ",
     "Avg. Response": "متوسط. إجابة",
     "Entry Page": "صفحة الدخول",
@@ -238,10 +238,10 @@
     "smtpBCC": "BCC",
     "discord": "خلاف",
     "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "يمكنك الحصول على هذا عن طريق الانتقال إلى إعدادات الخادم -> التكامل -> إنشاء WebHook",
+    "wayToGetDiscordURL": "يمكنك الحصول على هذا بالانتقال إلى إعدادات الخادم -> عمليات التكامل -> عرض الخطافات على الويب -> خطاف ويب جديد",
     "Bot Display Name": "اسم عرض الروبوت",
     "Prefix Custom Message": "بادئة رسالة مخصصة",
-    "Hello @everyone is...": "مرحبًا {'@'} الجميع ...",
+    "Hello @everyone is...": "مرحبًا {'@'} الجميع…",
     "teams": "فرق Microsoft",
     "Webhook URL": "Webhook URL",
     "wayToGetTeamsURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
@@ -352,8 +352,8 @@
     "Security": "حماية",
     "Steam API Key": "مفتاح API Steam",
     "Shrink Database": "تقلص قاعدة البيانات",
-    "Pick a RR-Type...": "اختر نوع RR ...",
-    "Pick Accepted Status Codes...": "اختيار رموز الحالة المقبولة ...",
+    "Pick a RR-Type...": "اختر نوع RR …",
+    "Pick Accepted Status Codes...": "اختر أكواد الحالة المقبولة …",
     "Default": "تقصير",
     "HTTP Options": "خيارات HTTP",
     "Create Incident": "إنشاء حادث",
@@ -597,7 +597,7 @@
     "Domain": "اِختِصاص",
     "Workstation": "محطة العمل",
     "disableCloudflaredNoAuthMsg": "أنت في وضع مصادقة لا توجد كلمة مرور غير مطلوبة.",
-    "trustProxyDescription": "الثقة 'x-forward-*'. إذا كنت ترغب في الحصول على IP العميل الصحيح وكوما في الوقت المناسب مثل Nginx أو Apache ، فيجب عليك تمكين ذلك.",
+    "trustProxyDescription": "ثق في رؤوس \"X-Forwarded- *\". إذا كنت ترغب في الحصول على عنوان IP الصحيح للعميل وكان Uptime Kuma خلف وكيل مثل Nginx أو Apache ، فيجب عليك تمكين هذا.",
     "wayToGetLineNotifyToken": "يمكنك الحصول على رمز الوصول من {0}",
     "Examples": "أمثلة",
     "Home Assistant URL": "Home Assistant URL",
@@ -617,7 +617,7 @@
     "goAlertInfo": "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}",
     "goAlertIntegrationKeyInfo": "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
     "goAlert": "المرمى",
-    "backupOutdatedWarning": "إهمال",
+    "backupOutdatedWarning": "مهمل: نظرًا لأنه تمت إضافة الكثير من الميزات وأن ميزة النسخ الاحتياطي هذه لم يتم الحفاظ عليها قليلاً ، فلا يمكنها إنشاء نسخة احتياطية كاملة أو استعادتها.",
     "backupRecommend": "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.",
     "Optional": "اختياري",
     "squadcast": "القاء فريقي",
@@ -681,5 +681,36 @@
     "Specific Monitor Type": "نوع شاشة محدد",
     "dataRetentionTimeError": "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
     "infiniteRetention": "ضبط على 0 للاحتفاظ لا نهائي.",
-    "confirmDeleteTagMsg": "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة."
+    "confirmDeleteTagMsg": "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة.",
+    "Custom Monitor Type": "نوع الشاشة المخصص",
+    "Game": "لعبة",
+    "Don't know how to get the token? Please read the guide:": "لا أعرف كيفية الحصول على الرمز المميز؟ يرجى قراءة الدليل:",
+    "Subject:": "موضوع:",
+    "Valid To:": "صالحة ل:",
+    "Days Remaining:": "الأيام المتبقية:",
+    "Issuer:": "المُصدر:",
+    "Fingerprint:": "بصمة:",
+    "Most likely causes:": "الأسباب المرجحة:",
+    "Help": "يساعد",
+    "Accept characters:": "قبول الأحرف:",
+    "plugin": "البرنامج المساعد | الإضافات",
+    "install": "ثَبَّتَ",
+    "installing": "التثبيت",
+    "uninstall": "الغاء التثبيت",
+    "uninstalling": "إلغاء التثبيت",
+    "loadingError": "لا يمكن جلب البيانات ، يرجى المحاولة مرة أخرى في وقت لاحق.",
+    "Example:": "مثال: {0}",
+    "Google Analytics ID": "معرف Google Analytics",
+    "markdownSupported": "دعم صيغة Markdown",
+    "Edit Tag": "تحرير العلامة",
+    "Server Address": "عنوان المستقبل",
+    "Learn More": "يتعلم أكثر",
+    "Automations can optionally be triggered in Home Assistant:": "يمكن تشغيل الأتمتة اختياريًا في Home Assistant:",
+    "Trigger type:": "نوع الزناد:",
+    "Event type:": "نوع الحدث:",
+    "Event data:": "بيانات الحدث:",
+    "More info on:": "مزيد من المعلومات حول: {0}",
+    "What you can try:": "ماذا تستطيع أن تجرب:",
+    "Packet Size": "حجم الحزمة",
+    "confirmUninstallPlugin": "هل أنت متأكد من أنك تريد إلغاء تثبيت هذا المكون الإضافي؟"
 }
diff --git a/src/lang/en.json b/src/lang/en.json
index 8f28c8e3..0034fc99 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -2,7 +2,7 @@
     "languageName": "English",
     "Settings": "Settings",
     "Dashboard": "Dashboard",
-    "Help": "Help",
+    "Help": "help",
     "New Update": "New Update",
     "Language": "Language",
     "Appearance": "Appearance",
diff --git a/src/lang/hu.json b/src/lang/hu.json
index bc2ded73..81694ce7 100644
--- a/src/lang/hu.json
+++ b/src/lang/hu.json
@@ -411,7 +411,7 @@
     "successMessage": "Sikeres üzenet",
     "lastDay1": "A hónap utolsó napja",
     "Guild ID": "Guild ID",
-    "Help": "Súgó",
+    "Help": "Segítség",
     "statusMaintenance": "Karbantartás",
     "Maintenance": "Karbantartás",
     "Game": "Játék"
diff --git a/src/lang/ur.json b/src/lang/ur.json
new file mode 100644
index 00000000..41dc56b6
--- /dev/null
+++ b/src/lang/ur.json
@@ -0,0 +1,195 @@
+{
+    "Dashboard": "ڈیش بورڈ",
+    "New Update": "نئی تازہ کاری",
+    "Language": "زبان",
+    "Appearance": "ظہور",
+    "Theme": "خیالیہ",
+    "General": "جنرل",
+    "Game": "کھیل",
+    "Version": "ورژن",
+    "List": "فہرست",
+    "Add": "شامل کریں۔",
+    "Add New Monitor": "نیا مانیٹر شامل کریں",
+    "Quick Stats": "فوری اعدادوشمار",
+    "Up": "اوپر",
+    "Down": "نیچے",
+    "statusMaintenance": "دیکھ بھال",
+    "Maintenance": "دیکھ بھال",
+    "Unknown": "نامعلوم",
+    "General Monitor Type": "جنرل مانیٹر کی قسم",
+    "Specific Monitor Type": "مانیٹر کی مخصوص قسم",
+    "markdownSupported": "مارک ڈاون نحو کی حمایت کی گئی",
+    "pauseDashboardHome": "توقف",
+    "Pause": "توقف",
+    "Name": "نام",
+    "Status": "حالت",
+    "DateTime": "تاریخ وقت",
+    "Message": "پیغام",
+    "Resume": "دوبارہ شروع کریں",
+    "Edit": "ترمیم",
+    "Delete": "حذف کریں",
+    "Current": "کرنٹ",
+    "Uptime": "اپ ٹائم",
+    "Cert Exp.": "Cert Exp .",
+    "Monitor": "مانیٹر | مانیٹر",
+    "day": "دن | دن",
+    "-day": "-دن",
+    "hour": "گھنٹہ",
+    "Response": "جواب",
+    "Check Update On GitHub": "GitHub پر اپ ڈیٹ چیک کریں",
+    "Ping": "پنگ",
+    "Monitor Type": "مانیٹر کی قسم",
+    "Friendly Name": "دوستانہ نام",
+    "URL": "URL",
+    "Hostname": "میزبان کا نام",
+    "Port": "بندرگاہ",
+    "Heartbeat Interval": "دل کی دھڑکن کا وقفہ",
+    "Heartbeat Retry Interval": "دل کی دھڑکن دوبارہ کوشش کا وقفہ",
+    "Advanced": "اعلی درجے کی",
+    "checkEverySecond": "ہر {0} سیکنڈ میں چیک کریں",
+    "retryCheckEverySecond": "ہر {0} سیکنڈ میں دوبارہ کوشش کریں",
+    "Help": "مدد",
+    "ignoreTLSError": "HTTPS ویب سائٹس کے لیے TLS/SSL کی خرابی کو نظر انداز کریں",
+    "upsideDownModeDescription": "اسٹیٹس کو الٹا پلٹائیں۔ اگر سروس قابل رسائی ہے، تو یہ نیچے ہے۔",
+    "Upside Down Mode": "الٹا ڈاؤن موڈ",
+    "Max. Redirects": "زیادہ سے زیادہ ری ڈائریکٹ کرتا ہے",
+    "Accepted Status Codes": "قبول شدہ اسٹیٹس کوڈز",
+    "Push URL": "یو آر ایل کو پش کریں",
+    "needPushEvery": "آپ کو اس URL کو ہر {0} سیکنڈ میں کال کرنا چاہیے۔",
+    "pushOptionalParams": "اختیاری پیرامیٹرز: {0}",
+    "Save": "محفوظ کریں",
+    "Notifications": "اطلاعات",
+    "Setup Notification": "سیٹ اپ نوٹیفکیشن",
+    "Light": "روشنی",
+    "Dark": "اندھیرا",
+    "Auto": "آٹو",
+    "Theme - Heartbeat Bar": "تھیم - دل کی دھڑکن بار",
+    "Normal": "نارمل",
+    "Bottom": "نیچے",
+    "None": "کوئی نہیں۔",
+    "Search Engine Visibility": "سرچ انجن کی مرئیت",
+    "Allow indexing": "اشاریہ سازی کی اجازت دیں",
+    "Change Password": "پاس ورڈ تبدیل کریں",
+    "Current Password": "موجودہ خفیہ لفظ",
+    "New Password": "نیا پاس ورڈ",
+    "Repeat New Password": "نیا پاس ورڈ دہرائیں",
+    "Update Password": "پاس ورڈ اپ ڈیٹ کریں",
+    "Disable Auth": "Auth کو غیر فعال کریں",
+    "Enable Auth": "Auth کو فعال کریں",
+    "Please use this option carefully!": "براہ کرم اس اختیار کو احتیاط سے استعمال کریں!",
+    "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": "سرٹیفکیٹ کی معلومات",
+    "Resource Record Type": "ریسورس ریکارڈ کی قسم",
+    "goAlert": "الرٹ جاؤ",
+    "SecretAccessKey": "کلیدی ID تک رسائی حاصل کریں",
+    "PhoneNumbers": "فون نمبر",
+    "TemplateCode": "ٹیمپلیٹ کوڈ",
+    "SignName": "سائن نام",
+    "Bark Endpoint": "بارک اینڈ پوائنٹ",
+    "Bark Group": "بارک گروپ",
+    "AccessKeyId": "کلیدی ID تک رسائی حاصل کریں",
+    "languageName": "انگریزی",
+    "Settings": "ترتیبات",
+    "Primary Base URL": "بنیادی بنیاد URL",
+    "Pending": "زیر التواء",
+    "Passive Monitor Type": "غیر فعال مانیٹر کی قسم",
+    "No important events": "کوئی اہم واقعات نہیں",
+    "-hour": "-گھنٹہ",
+    "shrinkDatabaseDescription": "SQLite کے لیے ڈیٹا بیس ویکیوم کو متحرک کریں۔ اگر آپ کا ڈیٹا بیس 1.10.0 کے بعد بنتا ہے، تو AUTO_VACUUM پہلے ہی فعال ہے اور اس کارروائی کی ضرورت نہیں ہے۔",
+    "goAlertIntegrationKeyInfo": "اس فارمیٹ میں سروس کے لیے عام API انٹیگریشن کلید حاصل کریں \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeee\" عام طور پر کاپی شدہ URL کے ٹوکن پیرامیٹر کی قدر۔",
+    "Sms template must contain parameters: ": "ایس ایم ایس ٹیمپلیٹ میں پیرامیٹرز ہونا ضروری ہے: ",
+    "Keyword": "کلیدی لفظ",
+    "Retries": "دوبارہ کوشش کرتا ہے",
+    "Resend Notification if Down X times consequently": "نوٹیفکیشن دوبارہ بھیجیں اگر X بار لگاتار نیچے جائیں",
+    "resendEveryXTimes": "ہر {0} بار دوبارہ بھیجیں",
+    "resendDisabled": "دوبارہ بھیجنا غیر فعال ہے",
+    "retriesDescription": "سروس کو ڈاؤن کے بطور نشان زد کرنے اور ایک اطلاع بھیجے جانے سے پہلے زیادہ سے زیادہ کوششیں کریں",
+    "maxRedirectDescription": "فالو کرنے کے لیے ری ڈائریکٹس کی زیادہ سے زیادہ تعداد۔ ری ڈائریکٹ کو غیر فعال کرنے کے لیے 0 پر سیٹ کریں۔",
+    "Not available, please setup.": "دستیاب نہیں، براہ کرم سیٹ اپ کریں۔",
+    "Timezone": "ٹائم زون",
+    "Discourage search engines from indexing site": "انڈیکسنگ سائٹ سے سرچ انجنوں کی حوصلہ شکنی کریں",
+    "disableauth.message1": "کیا آپ واقعی <strong>تصدیق کو غیر فعال</strong> کرنا چاہتے ہیں؟",
+    "disableauth.message2": "یہ ان منظرناموں کے لیے ڈیزائن کیا گیا ہے</strong> جہاں آپ کا ارادہ ہے کہ آپ فریق ثالث کی توثیق کو لاگو کریں</strong> اپ ٹائم کوما جیسے کہ Cloudflare Access، Authelia یا دیگر تصدیقی میکانزم کے سامنے۔",
+    "Resolver Server": "حل کرنے والا سرور",
+    "Last Result": "آخری نتیجہ",
+    "Create your admin account": "اپنا ایڈمن اکاؤنٹ بنائیں",
+    "Repeat Password": "پاس ورڈ دوبارہ لکھیے",
+    "Import Backup": "بیک اپ درآمد کریں",
+    "Export Backup": "بیک اپ درآمد کریں",
+    "Import": "درآمد کریں",
+    "respTime": "ریسپ وقت (ایم ایس)",
+    "notAvailableShort": "N / A",
+    "Default enabled": "ڈیفالٹ فعال ہے",
+    "Create": "بنانا",
+    "Clear Data": "واضح اعداد و شمار",
+    "Events": "تقریبات",
+    "Heartbeats": "دل کی دھڑکنیں",
+    "Auto Get": "آٹو حاصل کریں",
+    "Schedule maintenance": "شیڈول کی بحالی",
+    "Affected Monitors": "متاثرہ مانیٹر",
+    "Start of maintenance": "بحالی کا آغاز",
+    "All Status Pages": "تمام اسٹیٹس پیجز",
+    "Select status pages...": "اسٹیٹس کے صفحات منتخب کریں…",
+    "alertWrongFileType": "براہ کرم ایک JSON فائل منتخب کریں۔",
+    "Clear all statistics": "تمام اعدادوشمار کو صاف کریں",
+    "Skip existing": "موجودہ کو چھوڑ دیں",
+    "Overwrite": "اوور رائٹ کریں",
+    "Options": "اختیارات",
+    "Verify Token": "ٹوکن کی تصدیق کریں",
+    "Setup 2FA": "2FA سیٹ اپ کریں",
+    "Enable 2FA": "2FA کو فعال کریں",
+    "2FA Settings": "2FA کی ترتیبات",
+    "Two Factor Authentication": "دو عنصر کی تصدیق",
+    "Active": "فعال",
+    "Inactive": "غیر فعال",
+    "Token": "ٹوکن",
+    "Show URI": "URI دکھائیں",
+    "Tags": "ٹیگز",
+    "Tag with this name already exist.": "اس نام کا ٹیگ پہلے سے موجود ہے۔",
+    "Tag with this value already exist.": "اس قدر کے ساتھ ٹیگ پہلے سے موجود ہے۔",
+    "color": "رنگ",
+    "value (optional)": "قدر (اختیاری)",
+    "Gray": "سرمئی",
+    "Red": "سرخ",
+    "Orange": "کینو",
+    "Blue": "نیلا",
+    "Indigo": "انڈگو",
+    "Purple": "جامنی",
+    "Pink": "گلابی",
+    "Custom": "اپنی مرضی کے مطابق",
+    "Avg. Response": "اوسط جواب",
+    "No Services": "کوئی خدمات نہیں",
+    "All Systems Operational": "تمام سسٹمز آپریشنل",
+    "Partially Degraded Service": "جزوی طور پر انحطاط شدہ سروس",
+    "Degraded Service": "ڈیگریڈڈ سروس",
+    "Add Group": "گروپ شامل کریں",
+    "Add a monitor": "مانیٹر شامل کریں",
+    "Edit Status Page": "اسٹیٹس پیج میں ترمیم کریں",
+    "Go to Dashboard": "ڈیش بورڈ پر جائیں",
+    "Export": "برآمد کریں",
+    "Apply on all existing monitors": "تمام موجودہ مانیٹر پر لاگو کریں",
+    "Pick Affected Monitors...": "متاثرہ مانیٹر منتخب کریں…",
+    "alertNoFile": "براہ کرم درآمد کرنے کے لیے ایک فائل منتخب کریں۔",
+    "Keep both": "دونوں رکھو",
+    "Disable 2FA": "2FA کو غیر فعال کریں",
+    "Add New below or Select...": "ذیل میں نیا شامل کریں یا منتخب کریں…",
+    "Green": "سبز",
+    "Search...": "تلاش کریں…",
+    "Avg. Ping": "دسمبر پنگ",
+    "Entry Page": "داخلہ صفحہ",
+    "statusPageNothing": "یہاں کچھ نہیں، براہ کرم ایک گروپ یا مانیٹر شامل کریں۔"
+}

From 9a1301d0a9a22ff384af0ae4d31c6e726f403c86 Mon Sep 17 00:00:00 2001
From: Michal <black23@gmail.com>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 708/803] Translated using Weblate (Czech)

Currently translated at 100.0% (704 of 704 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (704 of 704 strings)

Translated using Weblate (Czech)

Currently translated at 99.7% (692 of 694 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (677 of 677 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (667 of 667 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Czech)

Currently translated at 99.8% (696 of 697 strings)

Co-authored-by: Michal <black23@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/cs-CZ.json | 56 +++++++++++++++++++++++++++++++++++++--------
 1 file changed, 47 insertions(+), 9 deletions(-)

diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index dc8e2637..5680f4eb 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -12,7 +12,7 @@
     "grpcMethodDescription": "Název metody se převede do cammelCase formátu jako je sayHello, check, aj.",
     "acceptedStatusCodesDescription": "Vyberte stavové kódy, které jsou považovány za úspěšnou odpověď.",
     "Maintenance": "Údržba",
-    "statusMaintenance": "Údržba",
+    "statusMaintenance": "V údržbě",
     "Schedule maintenance": "Naplánovat údržbu",
     "Affected Monitors": "Dotčené dohledy",
     "Pick Affected Monitors...": "Vyberte dotčené dohledy…",
@@ -24,9 +24,9 @@
     "affectedStatusPages": "Zobrazit tuto zprávu o údržbě na vybraných stavových stránkách",
     "atLeastOneMonitor": "Vyberte alespoň jeden dotčený dohled",
     "passwordNotMatchMsg": "Hesla se neshodují.",
-    "notificationDescription": "Pro zajištění funkčnosti oznámení je nutné jej přiřadit dohledu.",
+    "notificationDescription": "Aby byla upozornění fungovalo, je nutné ho přiřadit k dohledu.",
     "keywordDescription": "Vyhledat klíčové slovo v prosté odpovědi HTML nebo JSON. Při hledání se rozlišuje velikost písmen.",
-    "pauseDashboardHome": "Pozastaveno",
+    "pauseDashboardHome": "Pauza",
     "deleteMonitorMsg": "Opravdu chcete odstranit tento dohled?",
     "deleteMaintenanceMsg": "Opravdu chcete odstranit tuto údržbu?",
     "deleteNotificationMsg": "Opravdu chcete odstranit toto oznámení pro všechny dohledy?",
@@ -59,7 +59,7 @@
     "Add New Monitor": "Přidat nový dohled",
     "Quick Stats": "Rychlý přehled",
     "Up": "Běží",
-    "Down": "Nedostupný",
+    "Down": "Nedostupné",
     "Pending": "Čekám",
     "Unknown": "Neznámý",
     "Pause": "Pauza",
@@ -74,7 +74,7 @@
     "Current": "Aktuální",
     "Uptime": "Doba provozu",
     "Cert Exp.": "Platnost certifikátu",
-    "Monitor": "Dohled | Dohledy",
+    "Monitor": "Dohled | Dohledů",
     "day": "den | dny/í",
     "-day": "-dní",
     "hour": "hodina",
@@ -581,7 +581,7 @@
     "Connection String": "Připojovací řetězec",
     "Query": "Dotaz",
     "settingsCertificateExpiry": "Platnost TLS certifikátu",
-    "certificationExpiryDescription": "Aktivovat oznámení nad HTTPS dohledy, pokud platnost TLS certifikátu vyprší za:",
+    "certificationExpiryDescription": "HTTPS dohledy upozorní na vypršení platnosti certifikátu TLS nastavenou dobu dopředu:",
     "Setup Docker Host": "Nastavit Docker hostitele",
     "Connection Type": "Typ připojení",
     "Docker Daemon": "Démon Dockeru",
@@ -620,8 +620,8 @@
     "backupRecommend": "Prosím, zálohujte si ručně celý svazek nebo datovou složku (./data/).",
     "Optional": "Volitelný",
     "squadcast": "Squadcast",
-    "SendKey": "SendKey",
-    "SMSManager API Docs": "Dokumentace SMSManager API ",
+    "SendKey": "Klíč k odesílání",
+    "SMSManager API Docs": "Dokumentace API služby SMSManager ",
     "Gateway Type": "Typ brány",
     "SMSManager": "SMSManager",
     "You can divide numbers with": "Čísla můžete oddělit pomocí",
@@ -696,5 +696,43 @@
     "Google Analytics ID": "ID Google Analytics",
     "Edit Tag": "Upravit štítek",
     "Server Address": "Adresa serveru",
-    "Learn More": "Zjistěte více"
+    "Learn More": "Zjistěte více",
+    "notificationRegional": "Místní",
+    "telegramMessageThreadID": "(Nepovinné) ID vlákna zprávy",
+    "telegramMessageThreadIDDescription": "Nepovinný jedinečný identifikátor cílového vlákna zprávy (tématu) fóra; pouze pro nadskupiny fóra",
+    "telegramProtectContentDescription": "Pokud je tato funkce povolena, budou zprávy bota v aplikaci Telegram chráněny před přeposíláním a ukládáním.",
+    "Body Encoding": "Kódování těla zprávy",
+    "telegramProtectContent": "Ochrana přeposílání/ukládání",
+    "telegramSendSilently": "Odeslat potichu",
+    "telegramSendSilentlyDescription": "Zprávu odešle tiše. Uživatelé obdrží oznámení bez zvuku.",
+    "Clone": "Klonovat",
+    "cloneOf": "Klonovat {0}",
+    "Clone Monitor": "Klonovat dohled",
+    "API Keys": "API klíče",
+    "Expiry": "Platnost",
+    "Don't expire": "Nevyprší",
+    "Continue": "Pokračovat",
+    "Add Another": "Přidat další",
+    "Key Added": "Klíč byl přidán",
+    "Expiry date": "Vyprší dne",
+    "No API Keys": "Žàdné API klíče",
+    "apiKey-active": "Aktivní",
+    "apiKey-expired": "Vypršel",
+    "Expires": "Vyprší",
+    "disableAPIKeyMsg": "Jste si jistý, že chcete deaktivovat tento API klíč?",
+    "Add API Key": "Přidat API klíč",
+    "apiKey-inactive": "Neaktivní",
+    "Generate": "Vygenerovat",
+    "apiKeyAddedMsg": "Váš klíč API byl přidán. Poznamenejte si jej, protože se již nebude zobrazovat.",
+    "deleteAPIKeyMsg": "Opravdu chcete tento klíč API odstranit?",
+    "pagertreeUrgency": "Urgence",
+    "pagertreeSilent": "Potichu",
+    "pagertreeLow": "Slabě",
+    "pagertreeCritical": "Kritické",
+    "pagertreeResolve": "Automatické řešení",
+    "pagertreeDoNothing": "Nedělej nic",
+    "pagertreeIntegrationUrl": "Integrační URL",
+    "pagertreeMedium": "Středně",
+    "pagertreeHigh": "Nahlas",
+    "wayToGetPagerTreeIntegrationURL": "Po vytvoření integrace Uptime Kuma v aplikaci PagerTree zkopírujte koncový bod. Zobrazit všechny podrobnosti {0}"
 }

From 8d31187a74add3e150bae2d757793329edac6b77 Mon Sep 17 00:00:00 2001
From: krolli <tuzoltoroli@gmail.com>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 709/803] Translated using Weblate (Hungarian)

Currently translated at 74.0% (516 of 697 strings)

Co-authored-by: krolli <tuzoltoroli@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/hu/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/hu.json | 159 ++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 130 insertions(+), 29 deletions(-)

diff --git a/src/lang/hu.json b/src/lang/hu.json
index 81694ce7..a59d8cd2 100644
--- a/src/lang/hu.json
+++ b/src/lang/hu.json
@@ -1,7 +1,7 @@
 {
     "languageName": "Magyar",
     "checkEverySecond": "Ellenőrzés {0} másodpercenként",
-    "retryCheckEverySecond": "Újrapróbál {0} másodpercenként.",
+    "retryCheckEverySecond": "Újrapróbálkozás minden {0} másodpercenként",
     "retriesDescription": "Maximális próbálkozás mielőtt a szolgáltatás 'Leállt' jelölést kap és értesítés kerül kiküldésre",
     "ignoreTLSError": "TLS/SSL hibák figyelmen kívül hagyása HTTPS weboldalaknál",
     "upsideDownModeDescription": "Az állapot megfordítása. Ha a szolgáltatás elérhető, akkor lesz leállt állapotú.",
@@ -22,7 +22,7 @@
     "confirmClearStatisticsMsg": "Biztos, hogy törölni akar MINDEN statisztikát?",
     "importHandleDescription": "Válassza a 'Meglévő kihagyását', ha ki szeretné hagyni az azonos nevő figyelőket vagy értesítésket. A 'Felülírás' törölni fog minden meglévő figyelőt és értesítést.",
     "confirmImportMsg": "Biztos, hogy importálja a mentést? Győződjön meg róla, hogy jól választotta ki az importálás opciót.",
-    "twoFAVerifyLabel": "Kérem, adja meg a token-t, hogy a 2FA működését ellenőrizzük",
+    "twoFAVerifyLabel": "Kérem add meg a token-t a 2FA ellenőrzéséhez:",
     "tokenValidSettingsMsg": "A token érvényes! El tudja menteni a 2FA beállításait.",
     "confirmEnableTwoFAMsg": "Biztosan engedélyezi a 2FA-t?",
     "confirmDisableTwoFAMsg": "Biztosan letiltja a 2FA-t?",
@@ -54,7 +54,7 @@
     "Delete": "Törlés",
     "Current": "Aktuális",
     "Uptime": "Uptime",
-    "Cert Exp.": "SSL lejárat",
+    "Cert Exp.": "Tanúsítvány Lejárata",
     "day": "nap",
     "-day": "-nap",
     "hour": "óra",
@@ -135,7 +135,7 @@
     "Auto Get": "Auto lekérd.",
     "backupDescription": "Mentheti az összes figyelőt és értesítést egy JSON fájlba.",
     "backupDescription2": "Megj: Történeti és esemény adatokat nem tartalmaz.",
-    "backupDescription3": "Érzékeny adatok, pl. szolgáltatás kulcsok is vannak az export fájlban. Figyeljen erre!",
+    "backupDescription3": "Érzékeny adatok, pl. értesítés tokenek is vannak az export fájlban. Figyeljen erre!",
     "alertNoFile": "Válaszzon ki egy fájlt az importáláshoz.",
     "alertWrongFileType": "Válasszon egy JSON fájlt.",
     "Clear all statistics": "Összes statisztika törlése",
@@ -154,7 +154,7 @@
     "Token": "Token",
     "Show URI": "URI megmutatása",
     "Tags": "Címkék",
-    "Add New below or Select...": "Adjon hozzá lentre vagy válasszon...",
+    "Add New below or Select...": "Új hozzáadása alább vagy Válasszon…",
     "Tag with this name already exist.": "Ilyen nevű címke már létezik.",
     "Tag with this value already exist.": "Ilyen értékű címke már létezik.",
     "color": "szín",
@@ -167,7 +167,7 @@
     "Indigo": "Indigó",
     "Purple": "Lila",
     "Pink": "Rózsaszín",
-    "Search...": "Keres...",
+    "Search...": "Keresés…",
     "Avg. Ping": "Átl. ping",
     "Avg. Response": "Átl. válasz",
     "Entry Page": "Nyitólap",
@@ -188,7 +188,7 @@
     "signal": "Signal",
     "gotify": "Gotify",
     "slack": "Slack",
-    "rocket.chat": "Rocket.chat",
+    "rocket.chat": "Rocket.Chat",
     "pushover": "Pushover",
     "pushy": "Pushy",
     "octopush": "Octopush",
@@ -197,7 +197,7 @@
     "apprise": "Apprise (50+ értesítési szolgáltatás)",
     "pushbullet": "Pushbullet",
     "line": "Line Messenger",
-    "mattermost": "A legfontosabb",
+    "mattermost": "Mattermost",
     "Status Page": "Státusz oldal",
     "Status Pages": "Státusz oldalak",
     "Primary Base URL": "Elsődleges URL",
@@ -211,7 +211,7 @@
     "wayToGetTelegramToken": "Innen kaphat token-t: {0}.",
     "Chat ID": "Csevegés ID",
     "supportTelegramChatID": "Támogatja a közvetlen csevegést, csoportnak küldést és csatona ID-t is",
-    "wayToGetTelegramChatID": "A csevegés ID-t kinyerheti azzal, hogy küld egy üzenetet a bot-nak és erre az URL-re ellátogat, ahol láthatja a chat_id:-t",
+    "wayToGetTelegramChatID": "A csevegés ID-t szerezhet ha küld egy üzenetet a bot-nak és ellátogat erre az URL-re, ahol láthatja a chat_id-t:",
     "YOUR BOT TOKEN HERE": "AZ ÖN BOT TOKENJE ITT",
     "chatIDNotFound": "Csevegés ID nem található, küldjön egy első üzenetet a bot-nak",
     "Post URL": "Cél URL (Post)",
@@ -227,17 +227,17 @@
     "smtpCC": "Másolat",
     "smtpBCC": "Titkos másolat",
     "Discord Webhook URL": "Discord cím (webhook URL)",
-    "wayToGetDiscordURL": "Kaphat egy ilyet, ha ellátogat a Server Settings -> Integrations -> Create Webhook oldalra",
+    "wayToGetDiscordURL": "Ezt itt szerezhetsz: Server Settings -> Integrations -> View Webhooks -> New Webhook",
     "Bot Display Name": "Bot megjelenő neve",
     "Prefix Custom Message": "Egyedi előtét üzenet",
-    "Hello @everyone is...": "Hello {'@'}mindenki...",
+    "Hello @everyone is...": "Hello {'@'}everyone …",
     "Webhook URL": "Cím (webhook URL)",
     "wayToGetTeamsURL": "Itt megnézheti, hogy kell ilyen URL-t készíteni: {0}.",
     "Number": "Szám",
     "Recipients": "Címzettek",
     "needSignalAPI": "Egy Signal kliensre van szüksége, amihez REST API tartozik.",
     "wayToCheckSignalURL": "Itt megnézheti, hogy hozhat létre egyet:",
-    "signalImportant": "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél.",
+    "signalImportant": "FONTOS! Nem keverheti a csoportokat és számokat a címzetteknél!",
     "Application Token": "Alkalmazás token",
     "Server URL": "Szerver URL",
     "Priority": "Prioritás",
@@ -249,20 +249,20 @@
     "aboutKumaURL": "Ha üresen hagyja a Uptime Kuma cím mezőt, akkor a projekt GitHub oldala lesz az alapértelmezett.",
     "emojiCheatSheet": "Emoji csalás: {0}",
     "clicksendsms": "ClickSend SMS",
-    "User Key": "Felhasználói kulcs",
+    "User Key": "Felhasználói Kulcs",
     "Device": "Eszköz",
-    "Message Title": "Üzenet címe",
-    "Notification Sound": "Értesítési hang",
+    "Message Title": "Üzenet Címe",
+    "Notification Sound": "Értesítési Hang",
     "More info on:": "További információ: {0}",
     "pushoverDesc1": "A vészhelyzeti prioritásnak (2) 30 másodperc az újrapróbálkozási alapértéke és egy óra után lejár.",
     "pushoverDesc2": "Ha különböző eszközökre szeretne értesítést küldeni, töltse ki az Eszköz mezőt.",
     "SMS Type": "SMS típusa",
     "octopushTypePremium": "Premium (Fast - recommended for alerting)",
     "octopushTypeLowCost": "Low Cost (Slow - sometimes blocked by operator)",
-    "checkPrice": "Nézze meg az {0} féle árat:",
+    "checkPrice": "Ellenőrizze {0} árat:",
     "apiCredentials": "API kulcsok",
-    "octopushLegacyHint": "Az Octopush régi (2011-2020) verzióját használja vagy az újat?",
-    "Check octopush prices": "Nézze meg az Octopush {0} féle árát.",
+    "octopushLegacyHint": "Az Octopush régi (2011-2020) verzióját használod vagy az újat?",
+    "Check octopush prices": "Csekkold az octopush {0} árakat.",
     "octopushPhoneNumber": "Telefonszám (nemz. formátum, pl : +36705554433) ",
     "octopushSMSSender": "SMS küldő neve : 3-11 betű/szám (a-zA-Z0-9) vagy szóköz",
     "LunaSea Device ID": "LunaSea eszköz ID",
@@ -315,24 +315,24 @@
     "Security": "Biztonság",
     "Steam API Key": "Steam API kulcs",
     "Shrink Database": "Adatbázis tömörítése",
-    "Pick a RR-Type...": "Válasszon egy RR-típust…",
-    "Pick Accepted Status Codes...": "Válasszon olyan kódot, ami elfogadottnak számít…",
-    "Default": "Alapért.",
+    "Pick a RR-Type...": "Válassz egy RR-típust…",
+    "Pick Accepted Status Codes...": "Válassz Elfogadható Állapot Kódokat…",
+    "Default": "Alapértelmezett",
     "HTTP Options": "HTTP beállítások",
     "Create Incident": "Incidens létrehozása",
     "Title": "Cím",
     "Content": "Tartalom",
     "Style": "Stílus",
     "info": "info",
-    "warning": "warning",
-    "danger": "danger",
-    "primary": "primary",
-    "light": "light",
-    "dark": "dark",
+    "warning": "figyelmeztetés",
+    "danger": "veszély",
+    "primary": "elsődleges",
+    "light": "világos",
+    "dark": "sötét",
     "Post": "Bejegyzés",
     "Please input title and content": "Adjon meg címet és tartalmat",
     "Created": "Létrehozva",
-    "Last Updated": "Utolsó mód.",
+    "Last Updated": "Utoljára Módosítva",
     "Unpin": "Leválaszt",
     "Switch to Light Theme": "Világos témára váltás",
     "Switch to Dark Theme": "Sötét témára váltás",
@@ -408,11 +408,112 @@
     "Affected Monitors": "Érintett monitorok",
     "Packet Size": "Csomag mérete",
     "IconUrl": "Ikon URL",
-    "successMessage": "Sikeres üzenet",
+    "successMessage": "Siker Üzenet",
     "lastDay1": "A hónap utolsó napja",
     "Guild ID": "Guild ID",
     "Help": "Segítség",
     "statusMaintenance": "Karbantartás",
     "Maintenance": "Karbantartás",
-    "Game": "Játék"
+    "Game": "Játék",
+    "markdownSupported": "Markdown szintaxis támogatott",
+    "Pick Affected Monitors...": "Érintett monitor(ok) kiválasztása…",
+    "All Status Pages": "Összes státusz oldal",
+    "topic": "Téma",
+    "topicExplanation": "MQTT téma a monitorhoz",
+    "webhookAdditionalHeadersDesc": "Hozzáad további fejléceket a webhook-hoz",
+    "error": "hiba",
+    "critical": "kritikus",
+    "Customize": "Testreszab",
+    "Custom Footer": "Egyedi Lábléc",
+    "Custom CSS": "Egyedi CSS",
+    "Proxies": "Proxyk",
+    "default": "Alapértelmezett",
+    "enabled": "Bekapcsolva",
+    "Certificate Chain": "Tanúsítvány Lánc",
+    "Valid": "Érvényes",
+    "Invalid": "Érvénytelen",
+    "User": "Felhasználó",
+    "Installed": "Telepítve",
+    "Not installed": "Nincs telepítve",
+    "Running": "Fut",
+    "Not running": "Nem fut",
+    "Remove Token": "Token Eltávolítása",
+    "Start": "Inditás",
+    "Stop": "Megállítás",
+    "Slug": "Slug",
+    "Accept characters:": "Karakterek engedélyezése:",
+    "Next": "Következő",
+    "The slug is already taken. Please choose another slug.": "Ez a slug már használatban van. Kérlek válassz másikat.",
+    "No Proxy": "Nincs Proxy",
+    "HTTP Basic Auth": "HTTP Basic Auth",
+    "New Status Page": "Új Állapot Oldal",
+    "Page Not Found": "Oldal Nem Található",
+    "Reverse Proxy": "Reverse Proxy",
+    "Backup": "Mentés",
+    "cloudflareWebsite": "Cloudflare Weboldal",
+    "Message:": "Üzenet:",
+    "Trust Proxy": "Trust Proxy",
+    "Other Software": "Egyébb Szoftware",
+    "Please read": "Olvasd el",
+    "Subject:": "Tárgy:",
+    "Valid To:": "Érvényes eddig:",
+    "Issuer:": "Kiállitó:",
+    "Fingerprint:": "Ujjlenyomat:",
+    "No status pages": "Nincsenek állapot oldalak",
+    "Domain Name Expiry Notification": "Domain Név Lejárás Értesítés",
+    "Date Created": "Létrehozva Ekkor",
+    "Footer Text": "Lábléc Szöveg",
+    "affectedMonitorsDescription": "Válaszd ki azokat a monitorokat amelyek a karbantartásban érintettek",
+    "affectedStatusPages": "Mutasd ezt az üzenetet a kiválasztott állapot oldalakon",
+    "atLeastOneMonitor": "Válassz legalább egy érintett monitort",
+    "endpoint": "végpont",
+    "promosmsLogin": "API Bejelentkezési Név",
+    "pushoversounds classical": "Klasszikus",
+    "pushoversounds cosmic": "Kozmikus",
+    "pushoversounds falling": "Esés",
+    "pushoversounds gamelan": "Gamelán",
+    "pushoversounds incoming": "Érkező",
+    "pushoversounds bike": "Bicikli",
+    "pushoversounds bugle": "Kürt",
+    "pushoversounds cashregister": "Pénztárgép",
+    "pushoversounds intermission": "Intermission",
+    "pushoversounds magic": "Varázslat",
+    "pushoversounds mechanical": "Mechanikus",
+    "pushoversounds pianobar": "Zongora",
+    "pushoversounds siren": "Sziréna",
+    "pushoversounds spacealarm": "Térriasztó",
+    "pushoversounds tugboat": "Vontatóhajó",
+    "pushoversounds alien": "Űrlény Riasztó (hosszú)",
+    "pushoversounds climb": "Mászás (hosszú)",
+    "pushoversounds persistent": "Állandó (hosszú)",
+    "pushoversounds echo": "Pushover Visszhang (hosszú)",
+    "pushoversounds updown": "Fent Lent (hosszú)",
+    "pushoversounds vibrate": "Csak Rezgés",
+    "pushoversounds none": "Egyik se (néma)",
+    "pushyAPIKey": "Titkos API Kulcs",
+    "pushyToken": "Eszköz token",
+    "Kook": "Kook",
+    "Free Mobile API Key": "Ingyenes Mobil API Kulcs",
+    "Enable TLS": "TLS bekapcsolása",
+    "proxyDescription": "A proxyk egy monitorhoz kell legyenek rendelve hogy működjenek.",
+    "Server Address": "Szerver Cím",
+    "resendEveryXTimes": "Újraküldés minden {0} időnként",
+    "resendDisabled": "Újraküldés kikapcsolva",
+    "Resend Notification if Down X times consequently": "Értesítés Újraküldése ha X-szer nem válaszol",
+    "Monitor": "Monitor | Monitorok",
+    "setAsDefault": "Beállítás Alapértelmezetnek",
+    "Proxy": "Proxy",
+    "Strategy": "Stratégia",
+    "Free Mobile User Identifier": "Ingyenes Mobil Felhasználó Azonosító",
+    "Schedule maintenance": "Karbantartás ütemezése",
+    "Select status pages...": "Státusz oldal kiválasztása…",
+    "Custom": "Egyedi",
+    "webhookAdditionalHeadersTitle": "További Fejlécek",
+    "deleteProxyMsg": "Biztos hogy kitörlöd ezt a proxy-t az összes monitorok-tól?",
+    "HTTP Headers": "HTTP Fejlécek",
+    "For example: nginx, Apache and Traefik.": "Például: nginx, Apache vagy Traefik.",
+    "dnsPortDescription": "DNS szerver portja. Alapéretelmezett az 53. Bármikor megváltoztathatja.",
+    "promosmsPassword": "API Jelszó",
+    "wayToGetKookBotToken": "Hozz létre egy app-ot és szerezz egy tokent itt: {0}",
+    "wayToGetKookGuildID": "Válts át 'Developer Mode'-ra a Kook beállításoknál majd jobb klikkelve a guildra megtalálod az ID-jét"
 }

From 61699bb238956b837b8a8622c52232eb353fc00b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Francesco=20Giuffr=C3=A9?= <ciccio.giuffre@gmail.com>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 710/803] Translated using Weblate (Italian)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 59.6% (416 of 697 strings)

Co-authored-by: Francesco Giuffré <ciccio.giuffre@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/it/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/it-IT.json | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lang/it-IT.json b/src/lang/it-IT.json
index cc6a397b..077bccfb 100644
--- a/src/lang/it-IT.json
+++ b/src/lang/it-IT.json
@@ -416,5 +416,6 @@
     "Page Not Found": "Pagina non trovata",
     "Affected Monitors": "Monitoraggi interessati",
     "Pick Affected Monitors...": "Seleziona i monitoraggi interessati…",
-    "Valid": "Valido"
+    "Valid": "Valido",
+    "Certificate Expiry Notification": "Notifica scadenza certificato"
 }

From 22577b88e994da934b4801785c62f07671521043 Mon Sep 17 00:00:00 2001
From: Zandor Smith <info@zsinfo.nl>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 711/803] Translated using Weblate (Dutch)

Currently translated at 99.7% (695 of 697 strings)

Translated using Weblate (Dutch)

Currently translated at 92.8% (647 of 697 strings)

Co-authored-by: Zandor Smith <info@zsinfo.nl>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/nl/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/nl-NL.json | 223 ++++++++++++++++++++++++++++++++++++++------
 1 file changed, 196 insertions(+), 27 deletions(-)

diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json
index 32c79545..ddd313e3 100644
--- a/src/lang/nl-NL.json
+++ b/src/lang/nl-NL.json
@@ -1,14 +1,14 @@
 {
     "languageName": "Nederlands",
-    "checkEverySecond": "Controleer elke {0} seconden.",
+    "checkEverySecond": "Controleer elke {0} seconden",
     "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.",
+    "upsideDownModeDescription": "Draai de status om. Als de service bereikbaar is, zal OFFLINE getoond worden.",
     "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",
+    "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?",
@@ -19,7 +19,7 @@
     "clearEventsMsg": "Weet je zeker dat je alle evenementen voor deze monitor wilt verwijderen?",
     "clearHeartbeatsMsg": "Weet je zeker dat je alle heartbeats voor deze monitor wilt verwijderen?",
     "confirmClearStatisticsMsg": "Weet u zeker dat u alle statistieken wilt verwijderen?",
-    "twoFAVerifyLabel": "Voer uw 2FA controle token in voor verificatie",
+    "twoFAVerifyLabel": "Voer uw 2FA controle token in voor verificatie:",
     "tokenValidSettingsMsg": "Token is geldig! U kunt nu de 2FA-instellingen opslaan.",
     "confirmEnableTwoFAMsg": "Weet je zeker dat je 2FA wilt inschakelen?",
     "confirmDisableTwoFAMsg": "Weet je zeker dat je 2FA wilt uitschakelen?",
@@ -58,7 +58,7 @@
     "-hour": "-uur",
     "Response": "Antwoord",
     "Ping": "Ping",
-    "Monitor Type": "Monitortype:",
+    "Monitor Type": "Monitortype",
     "Keyword": "Trefwoord",
     "Friendly Name": "Vriendelijke naam",
     "URL": "URL",
@@ -105,7 +105,7 @@
     "Password": "Wachtwoord",
     "Remember me": "Wachtwoord onthouden",
     "Login": "Inloggen",
-    "No Monitors, please": "Geen monitoren, ",
+    "No Monitors, please": "Geen monitoren, alstublieft",
     "add one": "voeg een toe",
     "Notification Type": "Melding type",
     "Email": "E-mail",
@@ -120,7 +120,7 @@
     "Import": "Importeren",
     "respTime": "reactietijd (ms)",
     "notAvailableShort": "N.v.t.",
-    "Default enabled": "Default enabled",
+    "Default enabled": "Standaard ingeschakeld",
     "Apply on all existing monitors": "Pas toe op alle bestaande monitors",
     "Create": "Aanmaken",
     "Clear Data": "Data wissen",
@@ -144,9 +144,9 @@
     "Token": "Token",
     "Show URI": "Toon URI",
     "Clear all statistics": "Wis alle statistieken",
-    "retryCheckEverySecond": "Probeer elke {0} seconden.",
+    "retryCheckEverySecond": "Probeer elke {0} seconden",
     "importHandleDescription": "Kies 'Sla bestaande over' als je elke monitor of melding met dezelfde naam wilt overslaan. Kies 'Overschrijf' als je elke monitor of notificatie wilt verwijderen.",
-    "confirmImportMsg": "Weet je zeker dat je dit bestand wilt importeren?",
+    "confirmImportMsg": "Weet je zeker dat je dit bestand wilt importeren? Controleer of je de correcte importeer optie hebt geselecteerd.",
     "Heartbeat Retry Interval": "Heartbeat Retry Interval",
     "Import Backup": "Importeer Backup",
     "Export Backup": "Exporteer Backup",
@@ -155,9 +155,9 @@
     "Options": "Opties",
     "Keep both": "Bewaar beide",
     "Tags": "Labels",
-    "Add New below or Select...": "Voeg nieuwe toe of selecteer...",
-    "Tag with this name already exist.": "Label met deze naam bestaat al",
-    "Tag with this value already exist.": "Label met deze waarde bestaat al",
+    "Add New below or Select...": "Voeg nieuwe toe of selecteer…",
+    "Tag with this name already exist.": "Label met deze naam bestaat al.",
+    "Tag with this value already exist.": "Label met deze waarde bestaat al.",
     "color": "Kleur",
     "value (optional)": "waarde (optioneel)",
     "Gray": "Grijs",
@@ -168,9 +168,9 @@
     "Indigo": "Indigo",
     "Purple": "Paars",
     "Pink": "Roze",
-    "Search...": "Zoeken...",
-    "Avg. Ping": "Gemiddelde Ping",
-    "Avg. Response": "Gemiddelde Response",
+    "Search...": "Zoeken…",
+    "Avg. Ping": "Gemiddelde ping",
+    "Avg. Response": "Gemiddelde response",
     "Entry Page": "Entry Page",
     "statusPageNothing": "Niets hier, voeg een groep of monitor toe.",
     "No Services": "Geen diensten",
@@ -234,10 +234,10 @@
     "smtpCC": "CC",
     "smtpBCC": "BCC",
     "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "Je kunt dit krijgen door te gaan naar Server Instellingen -> Integraties -> Creëer Webhook",
+    "wayToGetDiscordURL": "Je kunt dit krijgen door te gaan naar Server Instellingen -> Integraties -> Bekijk webhooks -> Nieuwe webhook",
     "Bot Display Name": "Bot Weergave Naam",
     "Prefix Custom Message": "Prefix Aangepast Bericht",
-    "Hello @everyone is...": "Hallo {'@'}iedereen is...",
+    "Hello @everyone is...": "Hallo {'@'}iedereen is…",
     "Webhook URL": "Webhook URL",
     "wayToGetTeamsURL": "Je kunt hier leren hoe je een webhook URL kunt maken {0}.",
     "Number": "Nummer",
@@ -300,14 +300,14 @@
     "promosmsTypeSpeed": "SMS SPEED - Hoogste prioriteit in systeem. Is veel sneller en betrouwbaarder maar kost meer (ongeveer twee keer zoveel als volle SMS prijs).",
     "promosmsPhoneNumber": "Telefoon nummer (voor Poolse ontvangers. Je kunt gebieds codes overslaan)",
     "promosmsSMSSender": "SMS Ontvanger naam : Voor geregistreerde naam of een van de standaarden: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "Feishu WebHookUrl": "Feishu Webhook URL",
     "matrixHomeserverURL": "Homeserver URL (met http(s):// en optioneel poort)",
     "Internal Room Id": "Interne Room ID",
     "matrixDesc1": "Je kunt de interne room ID vinden door in de geavanceerde sectie van de room instellingen in je Matrix client te kijken. Het zou moeten uitzien als !QMdRCpUIfLwsfjxye6:home.server.",
     "matrixDesc2": "Het wordt ten zeerste aanbevolen om een nieuwe gebruiker aan te maken en niet de access token van je account te gebruiken, aangezien dit volledige toegang geeft tot je account en alle kamers waar je lid van bent. Maak in plaats daarvan een nieuwe gebruiker aan en nodig deze alleen uit voor de ruimte waarin je de melding wilt ontvangen. Je kunt de access token krijgen door het volgende uit te voeren {0}",
     "Monitor History": "Monitor Geschiedenis",
     "clearDataOlderThan": "Bewaar monitor geschiedenis voor {0} dagen.",
-    "PasswordsDoNotMatch": "Wachtwoorden komen niet overeen",
+    "PasswordsDoNotMatch": "Wachtwoorden komen niet overeen.",
     "records": "records",
     "One record": "Een record",
     "steamApiKeyDescription": "Om een Steam Game Server te monitoren heb je een Steam Web-API key nodig. Je kunt hier je API key registreren: ",
@@ -315,15 +315,15 @@
     "topic": "Onderwerp",
     "topicExplanation": "MQTT onderwerp om te monitoren",
     "successMessage": "Succesbericht",
-    "successMessageExplanation": "MQTT bericht dat als succes wordt beschouwd.",
+    "successMessageExplanation": "MQTT bericht dat als succes wordt beschouwd",
     "recent": "Recent",
     "Done": "Klaar",
     "Info": "Info",
     "Security": "Beveiliging",
     "Steam API Key": "Steam API Sleutel",
     "Shrink Database": "Verklein Database",
-    "Pick a RR-Type...": "Kies een RR-Type...",
-    "Pick Accepted Status Codes...": "Kies geaccepteerde Status Codes...",
+    "Pick a RR-Type...": "Kies een RR-Type…",
+    "Pick Accepted Status Codes...": "Kies geaccepteerde Status Codes…",
     "Default": "Standaard",
     "HTTP Options": "HTTP Opties",
     "Create Incident": "Creëer Incident",
@@ -399,7 +399,7 @@
     "SignName": "SignName",
     "Sms template must contain parameters: ": "Sms sjabloon moet de volgende parameters bevatten: ",
     "Bark Endpoint": "Bark Endpoint",
-    "WebHookUrl": "WebHookUrl",
+    "WebHookUrl": "Webhook URL",
     "SecretKey": "SecretKey",
     "For safety, must use secret key": "Voor de veiligheid moet je de secret key gebruiken",
     "Device Token": "Apparaat Token",
@@ -464,7 +464,7 @@
     "Footer Text": "Footer Tekst",
     "Show Powered By": "Laat \"Mogeljik gemaakt door\" zien",
     "Domain Names": "Domein Namen",
-    "pushoversounds pushover": "Pushover (default)",
+    "pushoversounds pushover": "Pushover (standaard)",
     "pushoversounds bike": "Bike",
     "pushoversounds bugle": "Bugle",
     "pushoversounds cashregister": "Cash Register",
@@ -485,7 +485,7 @@
     "pushoversounds persistent": "Persistent (long)",
     "pushoversounds echo": "Pushover Echo (long)",
     "pushoversounds updown": "Up Down (long)",
-    "pushoversounds vibrate": "Vibrate Only",
+    "pushoversounds vibrate": "Alleen trillen",
     "pushoversounds none": "None (silent)",
     "dnsPortDescription": "DNS-serverpoort. Standaard ingesteld op 53. Je kunt de poort op elk moment wijzigen.",
     "error": "fout",
@@ -523,9 +523,178 @@
     "Connection String": "Connection String",
     "Query": "Query",
     "settingsCertificateExpiry": "TLS Certificate Expiry",
-    "certificationExpiryDescription": "HTTPS Monitors trigger notification when TLS certificate expires in:",
+    "certificationExpiryDescription": "Stuur een melding bij het verlopen van het HTTPS TLS certificaat in:",
     "ntfy Topic": "ntfy Topic",
     "Domain": "Domein",
     "Workstation": "Werkstation",
-    "disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist."
+    "disableCloudflaredNoAuthMsg": "De \"Geen authenticatie\" modus staat aan, wachtwoord is niet vereist.",
+    "backupOutdatedWarning": "Deprecated: Er zijn een hoop nieuwe functies toegevoegd en daarom is de backup functie niet onderhouden, het is op dit moment niet mogelijk om een volledige backup te maken en te herstellen.",
+    "RadiusSecret": "Radius Secret",
+    "RadiusSecretDescription": "Shared Secret tussen client en server",
+    "API Key": "API Key",
+    "Connection Type": "Verbindingstype",
+    "Docker Daemon": "Docker Daemon",
+    "Trust Proxy": "Trust Proxy",
+    "Setup Docker Host": "Docker Host instellen",
+    "tcp": "TCP / HTTP",
+    "Optional": "Optioneel",
+    "socket": "Socket",
+    "Docker Container": "Docker Container",
+    "Container Name / ID": "Container Naam / ID",
+    "Docker Host": "Docker Host",
+    "Docker Hosts": "Docker Hosts",
+    "Packet Size": "Packet Grootte",
+    "wayToGetLineNotifyToken": "Je kan een Access Token van {0} krijgen",
+    "Examples": "Voorbeelden",
+    "Home Assistant URL": "Home Assistant URL",
+    "default: notify all devices": "Standaard: stuur melding naar alle apparaten",
+    "Automations can optionally be triggered in Home Assistant:": "Automations kunnen optioneel worden getriggerd in Home Assistant:",
+    "Event data:": "Event data:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Kies een actie, bijvoorbeeld het activeren van een scene.",
+    "Frontend Version": "Frontend Versie",
+    "Frontend Version do not match backend version!": "Frontend versie komt niet overeen niet met de backend versie!",
+    "backupRecommend": "In plaats daarvan, maak een backup van je Docker volume of de data map (./data/).",
+    "squadcast": "Squadcast",
+    "or": "of",
+    "recurringInterval": "Interval",
+    "Recurring": "Terugkerend",
+    "strategyManual": "Actief/Inactief handmatig",
+    "warningTimezone": "De tijdzone van de server wordt gebruikt",
+    "weekdayShortMon": "ma",
+    "weekdayShortTue": "di",
+    "weekdayShortWed": "wo",
+    "weekdayShortThu": "do",
+    "weekdayShortFri": "vr",
+    "weekdayShortSat": "za",
+    "weekdayShortSun": "zo",
+    "dayOfWeek": "Dag van de week",
+    "dayOfMonth": "Dag van de maand",
+    "lastDay": "Laatste dag",
+    "lastDay2": "1 na laatste dag van de maand",
+    "lastDay4": "3 na laatste dag van de maand",
+    "No Maintenance": "Geen onderhoud",
+    "pauseMaintenanceMsg": "Weet je zeker dat je wilt pauzeren?",
+    "maintenanceStatus-under-maintenance": "In onderhoud",
+    "maintenanceStatus-inactive": "Inactief",
+    "maintenanceStatus-scheduled": "Ingepland",
+    "maintenanceStatus-ended": "Beëindigd",
+    "Display Timezone": "Toon tijdzone",
+    "Server Timezone": "Server tijdzone",
+    "statusPageMaintenanceEndDate": "Einde",
+    "IconUrl": "Icoon URL",
+    "Enable DNS Cache": "DNS Cache inschakelen",
+    "Enable": "Inschakelen",
+    "Disable": "Uitschakelen",
+    "Single Maintenance Window": "Enkel onderhoudsperiode",
+    "Effective Date Range": "Effectieve periode",
+    "Schedule Maintenance": "Onderhoud inplannen",
+    "Date and Time": "Datum en tijd",
+    "DateTime Range": "Datum en tijd periode",
+    "wayToGetZohoCliqURL": "Via deze link kun je uitvinden hoe je een webhook URL maakt {0}.",
+    "dataRetentionTimeError": "Bewaarperiode moet 0 of groter zijn",
+    "infiniteRetention": "Stel in op 0 voor oneindige bewaarperiode.",
+    "enableGRPCTls": "Toestaan om gRPC aanvragen te sturen over TLS verbinding",
+    "deleteMaintenanceMsg": "Weet je zeker dat je dit onderhoud wilt verwijderen?",
+    "recurringIntervalMessage": "1 keer per dag uitvoeren | 1 keer per elke {0} dagen uitvoeren",
+    "affectedStatusPages": "Toon het onderhoudsbericht op de geselecteerde status pagina's",
+    "promosmsPassword": "API Wachtwoord",
+    "Kook": "Kook",
+    "high": "hoog",
+    "Base URL": "Base URL",
+    "goAlert": "GoAlert",
+    "Octopush API Version": "Octopush API versie",
+    "HomeAssistant": "Home Assistant",
+    "affectedMonitorsDescription": "Selecteer de monitors die zullen worden aangetast door het huidige onderhoud",
+    "Custom": "Aangepast",
+    "Affected Monitors": "Aangetaste monitors",
+    "Resend Notification if Down X times consequently": "Verzend offline melding X keer opnieuw bij blijvend offline",
+    "Monitor": "Monitor | Monitors",
+    "Start of maintenance": "Start van onderhoud",
+    "All Status Pages": "Alle status pagina's",
+    "Select status pages...": "Selecteer status pagina's…",
+    "API Username": "API Gebruikersnaam",
+    "Trigger type:": "Trigger type:",
+    "Event type:": "Event type:",
+    "Guild ID": "Guild ID",
+    "uninstalling": "Aan het verwijderen",
+    "Lowcost": "Lowcost",
+    "Economy": "Economy",
+    "webhookAdditionalHeadersTitle": "Extra Headers",
+    "webhookAdditionalHeadersDesc": "Voegt extra headers toe die meegestuurd worden met de webhook.",
+    "Help": "Hulp",
+    "Game": "Game",
+    "statusMaintenance": "Onderhoud",
+    "Maintenance": "Onderhoud",
+    "Passive Monitor Type": "Passieve Monitor Type",
+    "Pick Affected Monitors...": "Kies aangetaste monitors…",
+    "Specific Monitor Type": "Specifieke Monitor Type",
+    "promosmsLogin": "API Login naam",
+    "Schedule maintenance": "Onderhoud inplannen",
+    "resendEveryXTimes": "Verstuur elke {0} keer opnieuw",
+    "resendDisabled": "Opnieuw versturen uitgeschakeld",
+    "General Monitor Type": "Algemeen Monitor Type",
+    "Notification Service": "Melding diensten",
+    "uninstall": "Verwijderen",
+    "HTTP Headers": "HTTP Headers",
+    "Domain Name Expiry Notification": "Domeinnaam verlopen melding",
+    "deleteDockerHostMsg": "Weet je zeker dat je deze Docker host wilt verwijderen voor alle monitors?",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Een lijst van melding diensten kan worden gevonden in Home Assistant onder \"Developer Tools > Services\" en zoek voor \"notification\" om je apparaat/telefoon naam te vinden.",
+    "lastDay1": "Laatste dag van de maand",
+    "lastDay3": "2 na laatste dag van de maand",
+    "maintenanceStatus-unknown": "Onbekend",
+    "dnsCacheDescription": "Het werkt niet in sommige IPv6 omgevingen, schakel het uit als je problemen ervaart.",
+    "confirmDeleteTagMsg": "Weet je zeker dat je dit label wilt verwijderen? Monitors die gekoppeld zijn aan dit label worden niet verwijderd.",
+    "atLeastOneMonitor": "Selecteer tenminste 1 aangetaste monitor",
+    "Enable TLS": "TLS inschakelen",
+    "smseagle": "SMSEagle",
+    "smseagleTo": "Telefoonnummer(s)",
+    "Custom Monitor Type": "Custom Monitor Type",
+    "trustProxyDescription": "'X-Forwarded-*' headers vertrouwen. Als je de correcte client IP wilt krijgen en de Uptime Kuma installatie is achter een proxy zoals Nginx of Apache, schakel dan dit in.",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCalledStationIdDescription": "Identifier of the called device",
+    "RadiusCallingStationId": "Calling Station Id",
+    "ZohoCliq": "ZohoCliq",
+    "Long-Lived Access Token": "Long-Lived Access Token",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token kan aangemaakt worden via je profiel naam (links onder) en door naar beneden te scrollen en te klikken op Token Aanmaken. ",
+    "Maintenance Time Window of a Day": "Onderhoud tijdsvak van een dag",
+    "octopushAPIKey": "\"API key\" van HTTP API inloggegevens van het controle paneel",
+    "octopushLogin": "\"Login\" van HTTP API inloggegevens controle paneel",
+    "grpcMethodDescription": "Methode naam moet in cammelCase formaat zijn zoals zegHallo, check, etc.",
+    "wayToGetKookBotToken": "Maak een applicatie en haal je bot token op bij {0}",
+    "wayToGetKookGuildID": "Switch naar 'Developer Mode' in de Kook instellingen, en klik met de rechter muisknop op de guild om de ID op te halen",
+    "Strategy": "Strategy",
+    "Free Mobile User Identifier": "Free Mobile User Identifier",
+    "Free Mobile API Key": "Free Mobile API Key",
+    "Proto Service Name": "Proto service naam",
+    "Proto Method": "Proto methode",
+    "Proto Content": "Proto inhoud",
+    "SendKey": "SendKey",
+    "SMSManager API Docs": "SMSManager API documentatie ",
+    "Gateway Type": "Gateway Type",
+    "SMSManager": "SMSManager",
+    "You can divide numbers with": "Je kunt nummers delen met",
+    "Bark Group": "Bark Group",
+    "Bark Sound": "Bark Sound",
+    "promosmsAllowLongSMS": "Sta lange SMS toe",
+    "smseagleRecipientType": "Ontvanger type",
+    "smseagleRecipient": "Ontvanger(s) (gescheiden met comma)",
+    "smseagleToken": "API access token",
+    "smseagleEncoding": "Stuur als Unicode",
+    "smseaglePriority": "Bericht prioriteit (0-9, standaard = 0)",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "smseagleGroup": "Telefoonboek groep namen",
+    "Google Analytics ID": "Google Analytics ID",
+    "Edit Tag": "Tag bewerken",
+    "Server Address": "Server Adres",
+    "Learn More": "Meer leren",
+    "RadiusCallingStationIdDescription": "Identifier of the calling device",
+    "plugin": "Plugin | Plugins",
+    "installing": "Installeren",
+    "install": "Installeer",
+    "confirmUninstallPlugin": "Weet je zeker dat je deze plugin wilt verwijderen?",
+    "smseagleUrl": "SMSEagle apparaat URL",
+    "markdownSupported": "Markdown syntax ondersteund",
+    "Resend Notification if Down X times consecutively": "Melding x keer opnieuw sturen als monitor offline is",
+    "loadingError": "Kan de data niet ophalen, probeer het later opnieuw.",
+    "smseagleContact": "Telefoonboek contact namen"
 }

From d1808fe9a3240142c32330c59f1d9a355a42c17b Mon Sep 17 00:00:00 2001
From: Lance <2124757129@qq.com>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 712/803] Translated using Weblate (English)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Lance <2124757129@qq.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/en.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/en.json b/src/lang/en.json
index 0034fc99..8f28c8e3 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -2,7 +2,7 @@
     "languageName": "English",
     "Settings": "Settings",
     "Dashboard": "Dashboard",
-    "Help": "help",
+    "Help": "Help",
     "New Update": "New Update",
     "Language": "Language",
     "Appearance": "Appearance",

From f75ff2da98373830b864c63ca223fe5488898f33 Mon Sep 17 00:00:00 2001
From: AmadeusGraves <angelfx19@gmail.com>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 713/803] Translated using Weblate (Spanish)

Currently translated at 98.9% (690 of 697 strings)

Co-authored-by: AmadeusGraves <angelfx19@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/es/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/es-ES.json | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/lang/es-ES.json b/src/lang/es-ES.json
index d8e46f8d..6065bdb3 100644
--- a/src/lang/es-ES.json
+++ b/src/lang/es-ES.json
@@ -158,7 +158,7 @@
     "Add New below or Select...": "Agregar nuevo a continuación o seleccionar…",
     "Tag with this name already exist.": "Una etiqueta con este nombre ya existe.",
     "Tag with this value already exist.": "Una etiqueta con este valor ya existe.",
-    "color": "color",
+    "color": "Color",
     "value (optional)": "valor (opcional)",
     "Gray": "Gris",
     "Red": "Rojo",
@@ -608,7 +608,7 @@
     "TemplateCode": "Código de Plantilla",
     "Bark Group": "Grupo de Bark",
     "Bark Sound": "Sonido de Bark",
-    "SecretKey": "Key Secreta",
+    "SecretKey": "Clave Secreta",
     "Huawei": "Huawei",
     "Retry": "Reintentar",
     "Proxy Server": "Servidor Proxy",
@@ -621,12 +621,12 @@
     "aboutKumaURL": "Si dejas vacío el campo URL Uptime Kuma, predeterminará la página GitHub del Proyecto.",
     "smtpDkimSettings": "Ajustes DKIM",
     "smtpDkimDomain": "Nombre de Dominio",
-    "smtpDkimKeySelector": "Selector de Key",
-    "smtpDkimPrivateKey": "Key Privada",
+    "smtpDkimKeySelector": "Selector de Clave",
+    "smtpDkimPrivateKey": "Clave Privada",
     "Integration Key": "Key de Integración",
     "Integration URL": "URL de Integración",
     "Device Token": "Token de Dispositivo",
-    "WeCom Bot Key": "Key de Bot WeCom",
+    "WeCom Bot Key": "Clave de Bot WeCom",
     "promosmsTypeEco": "SMS ECO - barato pero lento y a veces sobrecargado. Limitado sólo a destinatarios Polacos.",
     "promosmsTypeSpeed": "SMS SPEED - La mayor prioridad en el sistema. Muy rápido y confiable pero costoso (alrededor del doble del precio de SMS FULL).",
     "matrixHomeserverURL": "URL Servidor Casero (con http(s):// y opcionalmente el puerto)",
@@ -686,7 +686,15 @@
     "Learn More": "Aprende Más",
     "Pick a RR-Type...": "Seleccione un Tipo RR",
     "onebotHttpAddress": "Dirección HTTP OneBot",
-    "SendKey": "SendKey",
+    "SendKey": "Clave de Envío",
     "octopushAPIKey": "\"Clave API\" de las credenciales HTTP API en el panel de control",
-    "octopushLogin": "\"Inicio de Sesión\" a partir de las credenciales API HTTP en el panel de control"
+    "octopushLogin": "\"Inicio de Sesión\" a partir de las credenciales API HTTP en el panel de control",
+    "ntfy Topic": "Tema ntfy",
+    "Google Analytics ID": "ID Analíticas de Google",
+    "Edit Tag": "Editar Etiqueta",
+    "SignName": "Firma",
+    "Bark Endpoint": "Endpoint Bark",
+    "WebHookUrl": "WebHookUrl",
+    "High": "Alto",
+    "alertaApiEndpoint": "Endpoint API"
 }

From 2f5d9e7e461ce30b421d7c04181a73d16c9ae8b7 Mon Sep 17 00:00:00 2001
From: Zoe <me@s1lv3r.codes>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 714/803] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 41.1% (287 of 697 strings)

Co-authored-by: Zoe <me@s1lv3r.codes>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/nb_NO/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/nb-NO.json | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/lang/nb-NO.json b/src/lang/nb-NO.json
index 1ddc4d17..ca9a5f78 100644
--- a/src/lang/nb-NO.json
+++ b/src/lang/nb-NO.json
@@ -281,5 +281,13 @@
     "promosmsTypeFull": "SMS FULL - Premuimnivå SMS. Du kan bruke dit avsendernavn (Du må registerere et navn først). Pålitelig for alle varslinger.",
     "promosmsTypeSpeed": "SMS SPEED - Høyest prioritet i systemet.Veldig rask på pålitelig, men dyrt (omtrent det dobbeltet av SMS FULL pris).",
     "promosmsPhoneNumber": "Telefonnummber (for polske mottakere. Du trenger ikke områdekode.)",
-    "promosmsSMSSender": "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS"
+    "promosmsSMSSender": "SMS Avsendernavn : Forhåndsregistert navn eller en av standardnavnene: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
+    "Help": "Hjelp",
+    "Game": "Spill",
+    "statusMaintenance": "Vedlikehold",
+    "Maintenance": "Maintenance",
+    "Passive Monitor Type": "Passiv Monitor Type",
+    "Specific Monitor Type": "Spesifik Monitor Type",
+    "General Monitor Type": "Generisk Monitor Type",
+    "markdownSupported": "Markdown syntax støttet"
 }

From 16ce1f9ddf99bfff01e3ac01ab4cac976f8c5f0f Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 715/803] Translated using Weblate (Urdu)

Currently translated at 27.5% (192 of 697 strings)

Translated using Weblate (Hungarian)

Currently translated at 74.0% (516 of 697 strings)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/hu/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ur/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/hu.json | 3 ++-
 src/lang/ur.json | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/lang/hu.json b/src/lang/hu.json
index a59d8cd2..92beb228 100644
--- a/src/lang/hu.json
+++ b/src/lang/hu.json
@@ -515,5 +515,6 @@
     "dnsPortDescription": "DNS szerver portja. Alapéretelmezett az 53. Bármikor megváltoztathatja.",
     "promosmsPassword": "API Jelszó",
     "wayToGetKookBotToken": "Hozz létre egy app-ot és szerezz egy tokent itt: {0}",
-    "wayToGetKookGuildID": "Válts át 'Developer Mode'-ra a Kook beállításoknál majd jobb klikkelve a guildra megtalálod az ID-jét"
+    "wayToGetKookGuildID": "Válts át 'Developer Mode'-ra a Kook beállításoknál majd jobb klikkelve a guildra megtalálod az ID-jét",
+    "Resend Notification if Down X times consecutively": "Értesítés Újraküldése ha X-szer nem válaszol"
 }
diff --git a/src/lang/ur.json b/src/lang/ur.json
index 41dc56b6..d904ce3c 100644
--- a/src/lang/ur.json
+++ b/src/lang/ur.json
@@ -191,5 +191,6 @@
     "Search...": "تلاش کریں…",
     "Avg. Ping": "دسمبر پنگ",
     "Entry Page": "داخلہ صفحہ",
-    "statusPageNothing": "یہاں کچھ نہیں، براہ کرم ایک گروپ یا مانیٹر شامل کریں۔"
+    "statusPageNothing": "یہاں کچھ نہیں، براہ کرم ایک گروپ یا مانیٹر شامل کریں۔",
+    "Resend Notification if Down X times consecutively": "نوٹیفکیشن دوبارہ بھیجیں اگر X بار لگاتار نیچے جائیں"
 }

From a990dc89d88ab594140f88a022d466ebd4e9d161 Mon Sep 17 00:00:00 2001
From: Oleg Logvinov <oleglogwinow@gmail.com>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 716/803] Translated using Weblate (Russian)

Currently translated at 96.8% (675 of 697 strings)

Co-authored-by: Oleg Logvinov <oleglogwinow@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ru-RU.json | 41 +++++++++++++++++++++++++++++++++--------
 1 file changed, 33 insertions(+), 8 deletions(-)

diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 7ea1f643..8b1e3bf2 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -233,10 +233,10 @@
     "smtpCC": "Копия",
     "smtpBCC": "Скрытая копия",
     "Discord Webhook URL": "Discord вебхук URL",
-    "wayToGetDiscordURL": "Вы можете создать его в \"Настройки -> Интеграции -> Создать Вебхук\"",
+    "wayToGetDiscordURL": "Вы можете создать его в  настройках канала \"Настройки -> Интеграции -> Создать Вебхук\"",
     "Bot Display Name": "Отображаемое имя бота",
     "Prefix Custom Message": "Свой префикс сообщения",
-    "Hello @everyone is...": "Привет {'@'} всем это…",
+    "Hello @everyone is...": "Привет {'@'}everyone это…",
     "Webhook URL": "URL вебхука",
     "wayToGetTeamsURL": "Как создать URL Вебхука вы можете узнать здесь - {0}.",
     "Number": "Номер",
@@ -467,7 +467,7 @@
     "onebotMessageType": "OneBot Message Type",
     "onebotGroupMessage": "Группа",
     "onebotPrivateMessage": "Private",
-    "onebotUserOrGroupId": "Группа/ID пользователя",
+    "onebotUserOrGroupId": "ID группы или пользователя",
     "onebotSafetyTips": "В целях безопасности необходимо установить токен доступа",
     "PushDeer Key": "PushDeer Key",
     "Footer Text": "Текст нижнего колонтитула",
@@ -618,7 +618,7 @@
     "Custom CSS": "Пользовательские CSS",
     "weekdayShortTue": "Вт",
     "dayOfWeek": "День недели",
-    "confirmDeleteTagMsg": "Вы уверены, что хотите удалить этот тег? Мониторы с этим тегом удалены не будут.",
+    "confirmDeleteTagMsg": "Вы уверены,  что хотите удалить этот тег? Мониторы, связанные с этим тегом не будут удалены.",
     "loadingError": "Невозможно получить данные, пожалуйста попробуйте позже.",
     "Packet Size": "Размер пакета",
     "warningTimezone": "Используется часовой пояс сервера",
@@ -630,7 +630,7 @@
     "lastDay2": "Второй последний день месяца",
     "lastDay3": "Третий последний день месяца",
     "lastDay4": "Четвертый последний день месяца",
-    "No Maintenance": "Ничего не обслуживается",
+    "No Maintenance": "Без обслуживания",
     "pauseMaintenanceMsg": "Вы уверены что хотите поставить на паузу?",
     "maintenanceStatus-under-maintenance": "На техобслуживании",
     "maintenanceStatus-inactive": "Неактивен",
@@ -647,7 +647,7 @@
     "Single Maintenance Window": "Единое Окно Обслуживания",
     "Schedule Maintenance": "Запланировать обслуживание",
     "Date and Time": "Дата и Время",
-    "DateTime Range": "Промежуток Даты и Времени",
+    "DateTime Range": "Промежуток даты и времени",
     "uninstalling": "Удаляется",
     "dataRetentionTimeError": "Период хранения должен быть равен 0 или больше",
     "infiniteRetention": "Установите 0 для бессрочного хранения.",
@@ -664,6 +664,31 @@
     "install": "Установить",
     "installing": "Устанавливается",
     "uninstall": "Удалить",
-    "Recurring": "Повторяющийся",
-    "recurringInterval": "Интервал"
+    "Recurring": "Текущий",
+    "recurringInterval": "Интервал",
+    "smseagle": "SMSEagle",
+    "Google Analytics ID": "ID Google Аналитики",
+    "wayToGetZohoCliqURL": "Вы можете узнать как создать webhook URL тут {0}.",
+    "Effective Date Range": "Эффективный период",
+    "wayToGetKookGuildID": "Включите \"Developer mode\" в настройках Kook, а затем нажмите правой кнопкой по гильдии чтобы скопировать её ID.",
+    "Enable TLS": "Включить TLS",
+    "Integration Key": "Ключ интеграции",
+    "Integration URL": "URL интеграции",
+    "do nothing": "ничего не делать",
+    "smseagleTo": "Номер(а) телефона",
+    "smseagleGroup": "Имена групп в телефонной книжке",
+    "smseagleContact": "Имена контактов из телефонной книжки",
+    "smseagleRecipientType": "Тип получателя",
+    "smseagleRecipient": "Получатель (через запятую, если несколько)",
+    "smseagleToken": "Токен доступа API",
+    "smseagleUrl": "URL вашего SMSEagle устройства",
+    "smseagleEncoding": "Отправить в юникоде",
+    "smseaglePriority": "Приоритет сообщения (0-9, по умолчанию = 0)",
+    "Server Address": "Адрес сервера",
+    "Learn More": "Узнать больше",
+    "topicExplanation": "MQTT топик для мониторинга",
+    "Guild ID": "ID гильдии",
+    "Kook": "Kook",
+    "wayToGetKookBotToken": "Создайте приложение и получите токен вашего бота тут {0}.",
+    "Resend Notification if Down X times consecutively": "Повторная отправка уведомления при падении несколько раз"
 }

From 6cea6dc0019010474a2ed68c09dd527fd768baab Mon Sep 17 00:00:00 2001
From: DevMirza <pzhafeez@gmail.com>
Date: Fri, 3 Mar 2023 08:50:53 +0000
Subject: [PATCH 717/803] Translated using Weblate (Urdu)

Currently translated at 56.6% (379 of 669 strings)

Translated using Weblate (Urdu)

Currently translated at 38.4% (268 of 697 strings)

Co-authored-by: DevMirza <pzhafeez@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ur/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ur.json | 192 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 191 insertions(+), 1 deletion(-)

diff --git a/src/lang/ur.json b/src/lang/ur.json
index d904ce3c..bb0c3667 100644
--- a/src/lang/ur.json
+++ b/src/lang/ur.json
@@ -192,5 +192,195 @@
     "Avg. Ping": "دسمبر پنگ",
     "Entry Page": "داخلہ صفحہ",
     "statusPageNothing": "یہاں کچھ نہیں، براہ کرم ایک گروپ یا مانیٹر شامل کریں۔",
-    "Resend Notification if Down X times consecutively": "نوٹیفکیشن دوبارہ بھیجیں اگر X بار لگاتار نیچے جائیں"
+    "Resend Notification if Down X times consecutively": "نوٹیفکیشن دوبارہ بھیجیں اگر X بار لگاتار نیچے جائیں",
+    "Status Page": "اسٹیٹس پیج",
+    "Status Pages": "اسٹیٹس پیجز",
+    "defaultNotificationName": "میرا {notification} الرٹ ({number})",
+    "here": "یہاں",
+    "Required": "درکار ہے",
+    "webhook": "ویب ہُک",
+    "Post URL": "یو آر ایل پوسٹ کریں",
+    "Content Type": "مواد کی قسم",
+    "webhookJsonDesc": "{0} کسی بھی جدید HTTP سرورز جیسے Express.js کے لیے اچھا ہے",
+    "webhookFormDataDesc": "{multipart} پی ایچ پی کے لیے اچھا ہے۔ JSON کو {decodeFunction} کے ساتھ پارس کرنے کی ضرورت ہوگی",
+    "webhookAdditionalHeadersTitle": "اضافی ہیڈرز",
+    "webhookAdditionalHeadersDesc": "ویب ہک کے ساتھ بھیجے گئے اضافی ہیڈر سیٹ کرتا ہے۔",
+    "Webhook URL": "ابھوک دیہی",
+    "Application Token": "ایپلیکیشن ٹوکن",
+    "Server URL": "سرور URL",
+    "Priority": "ترجیح",
+    "emojiCheatSheet": "ایموجی چیٹ شیٹ: {0}",
+    "Read more": "مزید پڑھ",
+    "appriseInstalled": "اپرائز انسٹال ہے۔",
+    "appriseNotInstalled": "اپرائز انسٹال نہیں ہے۔ {0}",
+    "Method": "طریقہ",
+    "Body": "جسم",
+    "Headers": "ہیڈرز",
+    "PushUrl": "یو آر ایل کو پش کریں",
+    "HeadersInvalidFormat": "درخواست کے ہیڈر درست نہیں ہیں JSON: ",
+    "BodyInvalidFormat": "درخواست کا باڈی درست نہیں ہے JSON: ",
+    "Monitor History": "تاریخ کی نگرانی کریں",
+    "clearDataOlderThan": "مانیٹر کی سرگزشت کا ڈیٹا {0} دنوں تک رکھیں۔",
+    "PasswordsDoNotMatch": "پاس ورڈ میچ نہیں کرتے.",
+    "records": "ریکارڈز",
+    "One record": "ایک ریکارڈ",
+    "Current User": "موجودہ صارف",
+    "topic": "موضوع",
+    "topicExplanation": "نگرانی کے لیے MQTT موضوع",
+    "successMessage": "کامیابی کا پیغام",
+    "successMessageExplanation": "MQTT پیغام جسے کامیابی سمجھا جائے گا",
+    "recent": "حالیہ",
+    "Done": "ہو گیا",
+    "Info": "معلومات",
+    "Security": "سیکورٹی",
+    "Steam API Key": "بھاپ API کلید",
+    "Shrink Database": "ڈیٹا بیس کو سکڑیں",
+    "Pick a RR-Type...": "RR قسم کا انتخاب کریں…",
+    "Pick Accepted Status Codes...": "قبول شدہ اسٹیٹس کوڈز منتخب کریں…",
+    "Default": "طے شدہ",
+    "HTTP Options": "HTTP اختیارات",
+    "Create Incident": "واقعہ بنائیں",
+    "Title": "عنوان",
+    "Content": "مواد",
+    "Style": "انداز",
+    "info": "معلومات",
+    "danger": "خطرہ",
+    "error": "غلطی",
+    "critical": "تنقیدی",
+    "primary": "بنیادی",
+    "light": "روشنی",
+    "dark": "اندھیرا",
+    "Post": "پوسٹ",
+    "Created": "بنایا",
+    "Last Updated": "آخری تازہ کاری",
+    "Unpin": "بادل ساحل",
+    "Switch to Light Theme": "لائٹ تھیم پر سوئچ کریں",
+    "Switch to Dark Theme": "ڈارک تھیم پر سوئچ کریں",
+    "Hide Tags": "ٹیگز چھپائیں",
+    "Description": "تفصیل",
+    "No monitors available.": "کوئی مانیٹر دستیاب نہیں۔",
+    "Add one": "ایک شامل کریں",
+    "Untitled Group": "بلا عنوان گروپ",
+    "Services": "خدمات",
+    "Discard": "رد کر دیں",
+    "steamApiKeyDescription": "سٹیم گیم سرور کی نگرانی کے لیے آپ کو سٹیم ویب API کلید درکار ہے۔ آپ اپنی API کلید یہاں رجسٹر کر سکتے ہیں: ",
+    "warning": "انتباہ",
+    "Please input title and content": "براہ کرم عنوان اور مواد درج کریں",
+    "Show Tags": "ٹیگز دکھائیں",
+    "No Monitors": "کوئی مانیٹر نہیں",
+    "Cancel": "منسوخ کریں",
+    "Powered by": "کی طرف سے طاقت",
+    "Custom CSS": "حسب ضرورت سی ایس ایس",
+    "deleteProxyMsg": "کیا آپ واقعی اس پراکسی کو تمام مانیٹر کے لیے حذف کرنا چاہتے ہیں؟",
+    "enableProxyDescription": "یہ پراکسی مانیٹر کی درخواستوں پر اس وقت تک اثر نہیں کرے گی جب تک کہ اسے فعال نہ کیا جائے۔ آپ ایکٹیویشن اسٹیٹس کے ذریعے تمام مانیٹرس سے پراکسی کو عارضی طور پر غیر فعال کر سکتے ہیں۔",
+    "setAsDefaultProxyDescription": "یہ پراکسی نئے مانیٹرز کے لیے بطور ڈیفالٹ فعال ہو جائے گی۔ آپ اب بھی ہر مانیٹر کے لیے الگ الگ پراکسی کو غیر فعال کر سکتے ہیں۔",
+    "Page Not Found": "صفحہ نہیں ملا",
+    "wayToGetCloudflaredURL": "({0} سے کلاؤڈ فلارڈ ڈاؤن لوڈ کریں)",
+    "Don't know how to get the token? Please read the guide:": "ٹوکن حاصل کرنے کا طریقہ نہیں جانتے؟ براہ کرم گائیڈ پڑھیں:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "اگر آپ فی الحال Cloudflare ٹنل کے ذریعے جڑ رہے ہیں تو موجودہ کنکشن ختم ہو سکتا ہے۔ کیا آپ واقعی اسے روکنا چاہتے ہیں؟ اس کی تصدیق کے لیے اپنا موجودہ پاس ورڈ ٹائپ کریں۔",
+    "RadiusCalledStationId": "اسٹیشن آئی ڈی کو کہتے ہیں",
+    "Certificate Expiry Notification": "سرٹیفکیٹ ختم ہونے کی اطلاع",
+    "Check how to config it for WebSocket": "اسے WebSocket کے لیے ترتیب دینے کا طریقہ چیک کریں",
+    "There might be a typing error in the address.": "ایڈریس میں ٹائپنگ کی غلطی ہو سکتی ہے۔",
+    "certificationExpiryDescription": "جب TLS سرٹیفکیٹ کی میعاد ختم ہو جاتی ہے تو HTTPS مانیٹر نوٹیفکیشن کو متحرک کرتے ہیں:",
+    "telegramMessageThreadID": "(اختیاری) میسج تھریڈ آئی ڈی",
+    "telegramMessageThreadIDDescription": "فورم کے ٹارگٹ میسج تھریڈ (موضوع) کے لیے اختیاری منفرد شناخت کنندہ؛ صرف فورم کے سپر گروپس کے لیے",
+    "chatIDNotFound": "چیٹ آئی ڈی نہیں ملی۔ براہ کرم پہلے اس بوٹ کو پیغام بھیجیں",
+    "disableCloudflaredNoAuthMsg": "آپ No Auth موڈ میں ہیں، پاس ورڈ کی ضرورت نہیں ہے۔",
+    "trustProxyDescription": "'X-Forwarded-*' ہیڈر پر بھروسہ کریں۔ اگر آپ صحیح کلائنٹ آئی پی حاصل کرنا چاہتے ہیں اور آپ کا اپ ٹائم کوما پراکسی جیسے Nginx یا Apache کے پیچھے ہے، تو آپ کو اسے فعال کرنا چاہیے۔",
+    "supportTelegramChatID": "براہ راست چیٹ / گروپ / چینل کی چیٹ آئی ڈی کو سپورٹ کریں",
+    "wayToGetTelegramChatID": "آپ بوٹ کو پیغام بھیج کر اور chat_id دیکھنے کے لیے اس URL پر جا کر اپنی چیٹ ID حاصل کر سکتے ہیں:",
+    "YOUR BOT TOKEN HERE": "یہاں آپ کا بوٹ ٹوکن",
+    "wayToGetLineNotifyToken": "آپ {0} سے ایک رسائی ٹوکن حاصل کر سکتے ہیں",
+    "Examples": "مثالیں",
+    "Running": "چل رہا ہے",
+    "Not running": "نہیں چل رہا ہے",
+    "Customize": "حسب ضرورت بنائیں",
+    "Custom Footer": "حسب ضرورت فوٹر",
+    "deleteStatusPageMsg": "کیا آپ واقعی اس اسٹیٹس پیج کو حذف کرنا چاہتے ہیں؟",
+    "Proxies": "پراکسیز",
+    "default": "طے شدہ",
+    "enabled": "فعال",
+    "setAsDefault": "ڈیفالٹ کے طور پر مقرر",
+    "proxyDescription": "پراکسیز کو کام کرنے کے لیے مانیٹر کو تفویض کیا جانا چاہیے۔",
+    "Certificate Chain": "سرٹیفکیٹ چین",
+    "Valid": "درست",
+    "Invalid": "غلط",
+    "User": "صارف",
+    "Installed": "انسٹال",
+    "Not installed": "انسٹال نہیں ہے",
+    "Remove Token": "ٹوکن کو ہٹا دیں",
+    "Start": "شروع کریں",
+    "Stop": "رک جاؤ",
+    "Add New Status Page": "نیا اسٹیٹس پیج شامل کریں",
+    "Slug": "سلگ",
+    "Accept characters:": "حروف کو قبول کریں:",
+    "startOrEndWithOnly": "صرف {0} سے شروع یا ختم کریں",
+    "No consecutive dashes": "کوئی لگاتار ڈیش نہیں ہے",
+    "Next": "اگلے",
+    "The slug is already taken. Please choose another slug.": "سلگ پہلے ہی لی گئی ہے۔ براہ کرم کوئی اور سلگ منتخب کریں۔",
+    "No Proxy": "کوئی پراکسی نہیں",
+    "Authentication": "تصدیق",
+    "HTTP Basic Auth": "HTTP بنیادی توثیق",
+    "New Status Page": "نیا اسٹیٹس پیج",
+    "Reverse Proxy": "ریورس پراکسی",
+    "Backup": "بیک اپ",
+    "About": "کے بارے میں",
+    "cloudflareWebsite": "Cloudflare ویب سائٹ",
+    "Message:": "پیغام:",
+    "HTTP Headers": "HTTP ہیڈر",
+    "Trust Proxy": "پراکسی پر اعتماد کریں",
+    "Other Software": "دوسرے سافٹ ویئر",
+    "For example: nginx, Apache and Traefik.": "مثال کے طور پر: nginx، Apache اور Traefik.",
+    "Please read": "مہربانی کر کے پڑھیں",
+    "Subject:": "مضمون:",
+    "Valid To:": "اس تاریخ تک کارآمد ہ:",
+    "Days Remaining:": "باقی دنوں:",
+    "Issuer:": "جاری کنندہ:",
+    "Fingerprint:": "فنگر پرنٹ:",
+    "No status pages": "کوئی اسٹیٹس پیجز نہیں",
+    "Domain Name Expiry Notification": "ڈومین نام کی میعاد ختم ہونے کی اطلاع",
+    "Proxy": "پراکسی",
+    "Date Created": "تاریخ تخلیق",
+    "Footer Text": "فوٹر ٹیکسٹ",
+    "Show Powered By": "شو کے ذریعہ تقویت یافتہ",
+    "Domain Names": "ڈومین کے نام",
+    "signedInDisp": "بطور {0} سائن ان",
+    "signedInDispDisabled": "توثیق غیر فعال۔",
+    "RadiusSecret": "رداس راز",
+    "RadiusSecretDescription": "کلائنٹ اور سرور کے درمیان مشترکہ راز",
+    "RadiusCalledStationIdDescription": "کہلائے گئے آلے کا شناخت کنندہ",
+    "RadiusCallingStationId": "کالنگ اسٹیشن آئی ڈی",
+    "RadiusCallingStationIdDescription": "کالنگ ڈیوائس کا شناخت کنندہ",
+    "API Username": "API صارف نام",
+    "API Key": "API کلید",
+    "Show update if available": "اگر دستیاب ہو تو اپ ڈیٹ دکھائیں",
+    "Also check beta release": "بیٹا ریلیز بھی چیک کریں",
+    "Using a Reverse Proxy?": "ایک ریورس پراکسی کا استعمال کرتے ہوئے؟",
+    "Steam Game Server": "بھاپ گیم سرور",
+    "Most likely causes:": "زیادہ تر ممکنہ وجوہات:",
+    "The resource is no longer available.": "وسیلہ اب دستیاب نہیں ہے۔",
+    "What you can try:": "تم کیا کوشش کر سکتے ہو:",
+    "Retype the address.": "ایڈریس دوبارہ ٹائپ کریں۔",
+    "Go back to the previous page.": "پچھلے صفحے پر واپس جائیں۔",
+    "Coming Soon": "جلد آرہا ہے",
+    "Connection String": "کنکشن سٹرنگ",
+    "Query": "استفسار",
+    "settingsCertificateExpiry": "TLS سرٹیفکیٹ کی میعاد ختم",
+    "Setup Docker Host": "ڈوکر ہوسٹ سیٹ اپ کریں",
+    "Connection Type": "کنکشن کی قسم",
+    "Docker Daemon": "ڈوکر ڈیمون",
+    "deleteDockerHostMsg": "کیا آپ واقعی تمام مانیٹر کے لیے اس ڈاکر ہوسٹ کو حذف کرنا چاہتے ہیں؟",
+    "socket": "ساکٹ",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "ڈوکر کنٹینر",
+    "Container Name / ID": "کنٹینر کا نام / ID",
+    "Docker Host": "ڈاکر میزبان",
+    "Docker Hosts": "ڈاکر میزبان",
+    "Domain": "ڈومین",
+    "Workstation": "ورک سٹیشن",
+    "Packet Size": "پیکٹ کا سائز",
+    "Bot Token": "بوٹ ٹوکن",
+    "wayToGetTelegramToken": "آپ {0} سے ٹوکن حاصل کر سکتے ہیں۔",
+    "Chat ID": "چیٹ آئی ڈی"
 }

From 68ea65bbd98379bf5fbce3de242a72ff5e18416e Mon Sep 17 00:00:00 2001
From: Kurt S <mail@kurtys.de>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 718/803] Translated using Weblate (German)

Currently translated at 100.0% (697 of 697 strings)

Co-authored-by: Kurt S <mail@kurtys.de>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/de-DE.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 2e7bbb5f..8d20e094 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -677,7 +677,7 @@
     "Proto Service Name": "Proto Service Name",
     "Proto Method": "Proto Methode",
     "Proto Content": "Proto Inhalt",
-    "Economy": "Economy-Modus",
+    "Economy": "Economy",
     "Lowcost": "Lowcost-Modus",
     "high": "High-Modus",
     "promosmsAllowLongSMS": "Erlaube lange SMS",

From 3e97563ee45e099dbe2cd1bdb681487368313962 Mon Sep 17 00:00:00 2001
From: victorpahuus <dibbohh@gmail.com>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 719/803] Translated using Weblate (Danish)

Currently translated at 72.0% (502 of 697 strings)

Co-authored-by: victorpahuus <dibbohh@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/da/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/da-DK.json | 65 ++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 64 insertions(+), 1 deletion(-)

diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
index 1b0fe210..4aaa666c 100644
--- a/src/lang/da-DK.json
+++ b/src/lang/da-DK.json
@@ -444,5 +444,68 @@
     "Using a Reverse Proxy?": "Bruger du en Reverse Proxy?",
     "deleteDockerHostMsg": "Er du sikker på, at du vil slette denne docker host for alle monitors?",
     "Docker Host": "Docker Host",
-    "Docker Hosts": "Docker Hosts"
+    "Docker Hosts": "Docker Hosts",
+    "loadingError": "Kan ikke hente dataene, prøv igen senere.",
+    "Custom": "Brugerdefineret",
+    "Monitor": "Monitor | Monitors",
+    "Specific Monitor Type": "Specifik monitor-type",
+    "topic": "Emne",
+    "Fingerprint:": "Fingerprint:",
+    "Issuer:": "Udsteder:",
+    "dayOfWeek": "Ugedag",
+    "dayOfMonth": "Dag i måneden",
+    "lastDay": "Sidste dag",
+    "lastDay1": "Sidste dag i måneden",
+    "weekdayShortThu": "Tor",
+    "weekdayShortFri": "Fre",
+    "weekdayShortSat": "Lør",
+    "weekdayShortSun": "Søn",
+    "weekdayShortWed": "Ons",
+    "lastDay2": "Anden sidste dag i måneden",
+    "lastDay3": "Tredje sidste dag i måneden",
+    "lastDay4": "Fjerde sidste dag i måneden",
+    "maintenanceStatus-under-maintenance": "Under vedligeholdelse",
+    "maintenanceStatus-inactive": "Inaktiv",
+    "maintenanceStatus-scheduled": "Planlagt",
+    "maintenanceStatus-ended": "Afsluttet",
+    "maintenanceStatus-unknown": "Ukendt",
+    "Display Timezone": "Vis tidszone",
+    "Server Timezone": "Serverens tidszone",
+    "IconUrl": "Ikon URL",
+    "Enable DNS Cache": "Aktiver DNS Cache",
+    "Enable": "Aktiver",
+    "Disable": "Deaktiver",
+    "dnsCacheDescription": "Det fungerer muligvis ikke i alle IPv6-miljøer, så deaktiver det, hvis du støder på problemer.",
+    "Maintenance Time Window of a Day": "Tidsvindue for vedligeholdelse af en dag",
+    "Schedule Maintenance": "Planlæg vedligeholdelse",
+    "Date and Time": "Dato og klokkeslæt",
+    "plugin": "Plugin | Plugins",
+    "install": "Installer",
+    "uninstall": "Afinstaller",
+    "uninstalling": "Afinstallerer",
+    "confirmUninstallPlugin": "Er du sikker på, at du vil afinstallere dette plugin?",
+    "installing": "Installerer",
+    "markdownSupported": "Markdown syntax understøttet",
+    "Affected Monitors": "Berørte monitors",
+    "All Status Pages": "Alle statussider",
+    "Pick Affected Monitors...": "Vælg berørte monitors…",
+    "Select status pages...": "Vælg statusside…",
+    "proxyDescription": "Proxyer skal være tilknyttet en monitor for at fungere.",
+    "Accept characters:": "Accepter tegn:",
+    "Authentication": "Godkendelse",
+    "wayToGetCloudflaredURL": "(Download cloudflared fra {0})",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Den aktuelle forbindelse kan gå tabt, hvis du er forbundet via Cloudflare Tunnel. Er du sikker på, at du vil stoppe det? Indtast din nuværende adgangskode for at bekræfte den.",
+    "Other Software": "Anden software",
+    "Date Created": "Dato oprettet",
+    "signedInDispDisabled": "Auth Deaktiveret.",
+    "certificationExpiryDescription": "HTTPS Monitors sender en notifikation, når TLS-certifikatet udløber om:",
+    "Also check beta release": "Se også betaudgivelsen",
+    "Show update if available": "Vis opdatering, hvis tilgængelig",
+    "wayToGetZohoCliqURL": "Du kan lære, hvordan du opretter et webhook URL {0}.",
+    "recurringInterval": "Interval",
+    "weekdayShortMon": "Man",
+    "weekdayShortTue": "Tir",
+    "dnsPortDescription": "DNS server port. Standardværdien er 53. Du kan altid ændre porten.",
+    "Valid To:": "Gyldig til:",
+    "Domain Name Expiry Notification": "Notifikation om udløb af domænenavn"
 }

From fa2221781ee65d0beab3b49e6f76ee7b4f7beb77 Mon Sep 17 00:00:00 2001
From: MrEddX <mreddx@chatrix.one>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 720/803] Translated using Weblate (Bulgarian)

Currently translated at 100.0% (704 of 704 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (677 of 677 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (667 of 667 strings)

Co-authored-by: MrEddX <mreddx@chatrix.one>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/bg/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/bg-BG.json | 40 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index ae2cdce6..d60620a2 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -696,5 +696,43 @@
     "Google Analytics ID": "Google Analytics ID",
     "Edit Tag": "Редактиране на таг",
     "Learn More": "Научете повече",
-    "Server Address": "Сървър адрес"
+    "Server Address": "Сървър адрес",
+    "notificationRegional": "Регионални",
+    "Body Encoding": "Кодировка на тялото",
+    "telegramMessageThreadID": "(По избор) Thread ID на съобщението",
+    "telegramMessageThreadIDDescription": "Незадължителен уникален идентификатор за целевата нишка от съобщения (тема) на форума; само за форумни супергрупи",
+    "telegramProtectContent": "Защита на препращане/записване",
+    "telegramProtectContentDescription": "Ако е активирано, съобщенията от ботове в Telegram ще бъдат защитени от препращане и запазване.",
+    "telegramSendSilentlyDescription": "Изпраща съобщението тихо. Потребителите ще получат известие без звук.",
+    "telegramSendSilently": "Изпрати тихо",
+    "Clone Monitor": "Клониране на монитор",
+    "Clone": "Клонирай",
+    "cloneOf": "Клонинг на {0}",
+    "Expiry": "Валиден до",
+    "Expiry date": "Дата на изтичане",
+    "Add Another": "Добави друг",
+    "Key Added": "Ключът е добавен",
+    "Add API Key": "Добави API ключ",
+    "No API Keys": "Няма API ключове",
+    "apiKey-active": "Активен",
+    "Expires": "Изтича на",
+    "deleteAPIKeyMsg": "Сигурни ли сте, че желаете да изтриете този API ключ?",
+    "Generate": "Генерирай",
+    "API Keys": "API Ключове",
+    "Don't expire": "Не изтича",
+    "Continue": "Продължи",
+    "apiKeyAddedMsg": "Вашият API ключ е добавен. Моля, запишете го, тъй като той няма да бъде показан отново.",
+    "apiKey-expired": "Изтекъл",
+    "apiKey-inactive": "Неактивен",
+    "disableAPIKeyMsg": "Сигурни ли сте, че желаете да деактивирате този API ключ?",
+    "pagertreeUrgency": "Спешност",
+    "pagertreeSilent": "Тих",
+    "pagertreeLow": "Ниска",
+    "pagertreeHigh": "Висока",
+    "pagertreeResolve": "Автоматично разрешаване",
+    "pagertreeDoNothing": "Не прави нищо",
+    "wayToGetPagerTreeIntegrationURL": "След като създадете интеграция на Uptime Kuma в PagerTree, копирайте крайната точка. За пълни подробности вижте {0}",
+    "pagertreeIntegrationUrl": "URL Адрес за интеграция",
+    "pagertreeMedium": "Средна",
+    "pagertreeCritical": "Критична"
 }

From 482d2657ca8e3e1dedc43b6fa52664f316f6d859 Mon Sep 17 00:00:00 2001
From: Super Admin <uptime@kuma.pet>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 721/803] Translated using Weblate (Yue)

Currently translated at 14.9% (100 of 667 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 94.1% (628 of 667 strings)

Co-authored-by: Super Admin <uptime@kuma.pet>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/yue/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/yue.json   | 3 ++-
 src/lang/zh-HK.json | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/lang/yue.json b/src/lang/yue.json
index 98936dbc..f2a5c476 100644
--- a/src/lang/yue.json
+++ b/src/lang/yue.json
@@ -97,5 +97,6 @@
     "Monitor Type": "監測器類型",
     "Heartbeat Interval": "檢查間距",
     "Add New Monitor": "新增監測器",
-    "Quick Stats": "綜合數據"
+    "Quick Stats": "綜合數據",
+    "markdownSupported": "可以用 Markdown"
 }
diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 8111b73d..bc0f8cc7 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -656,5 +656,6 @@
     "PushDeer Key": "PushDeer Key",
     "onebotSafetyTips": "為了安全起見,必須設置存取 Token",
     "onebotUserOrGroupId": "群組/使用者 ID",
-    "onebotPrivateMessage": "私人"
+    "onebotPrivateMessage": "私人",
+    "notificationRegional": "地區性"
 }

From 3f3c5dca9f4b32ca5b20e1048b504ef316fbb59c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=96mer=20Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 722/803] Translated using Weblate (Turkish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (669 of 669 strings)

Co-authored-by: Ömer Faruk Genç <omer@farukgenc.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 80d273e1..3c78c4bd 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -696,5 +696,8 @@
     "Google Analytics ID": "Google Analytics ID",
     "Edit Tag": "Etiketi Düzenle",
     "Learn More": "Daha fazla bilgi edin",
-    "Server Address": "Sunucu Adresi"
+    "Server Address": "Sunucu Adresi",
+    "telegramMessageThreadIDDescription": "Forumun hedef ileti dizisi (konusu) için isteğe bağlı benzersiz kimlik; yalnızca forum üst grupları için geçerli",
+    "telegramMessageThreadID": "(İsteğe bağlı) Mesaj Thread ID",
+    "notificationRegional": "Bölgesel"
 }

From 2bb3b634c020eef9ebf7f45a65e0cd8d531d6038 Mon Sep 17 00:00:00 2001
From: 401Unauthorized <yehowahliu@4o1.to>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 723/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (669 of 669 strings)

Co-authored-by: 401Unauthorized <yehowahliu@4o1.to>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index a0539593..c4b42892 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -546,7 +546,7 @@
     "pushoversounds cashregister": "Cash Register",
     "pushoversounds classical": "Classical",
     "pushoversounds cosmic": "Cosmic",
-    "pushoversounds falling": "Falling",
+    "pushoversounds falling": "下落",
     "pushoversounds gamelan": "Gamelan",
     "pushoversounds incoming": "Incoming",
     "pushoversounds intermission": "Intermission",
@@ -698,5 +698,8 @@
     "markdownSupported": "支持 Markdown 语法",
     "Google Analytics ID": "Google Analytics(分析)ID",
     "Learn More": "了解更多",
-    "Edit Tag": "编辑标签"
+    "Edit Tag": "编辑标签",
+    "telegramMessageThreadID": "(可选)消息线程 ID",
+    "telegramMessageThreadIDDescription": "Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only",
+    "notificationRegional": "地区性"
 }

From f2dc27c8fad9b87107a5f30386b1f744d3ddc360 Mon Sep 17 00:00:00 2001
From: Donker_Jumala <weareh0711@gmail.com>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 724/803] Translated using Weblate (Japanese)

Currently translated at 40.8% (273 of 669 strings)

Co-authored-by: Donker_Jumala <weareh0711@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ja/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ja.json | 92 +++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 84 insertions(+), 8 deletions(-)

diff --git a/src/lang/ja.json b/src/lang/ja.json
index 06f0d3c3..d0d2f51b 100644
--- a/src/lang/ja.json
+++ b/src/lang/ja.json
@@ -1,6 +1,6 @@
 {
     "languageName": "日本語",
-    "checkEverySecond": "{0}秒ごとにチェックします。",
+    "checkEverySecond": "{0}秒ごとにチェックします",
     "retriesDescription": "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数",
     "ignoreTLSError": "HTTPS ウェブサイトの TLS/SSL エラーを無視する",
     "upsideDownModeDescription": "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。",
@@ -8,7 +8,7 @@
     "acceptedStatusCodesDescription": "成功した応答とみなされるステータスコードを選択する。",
     "passwordNotMatchMsg": "繰り返しのパスワードが一致しません。",
     "notificationDescription": "監視を機能させるには、監視に通知を割り当ててください。",
-    "keywordDescription": "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します",
+    "keywordDescription": "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します。",
     "pauseDashboardHome": "一時停止",
     "deleteMonitorMsg": "この監視を削除してよろしいですか?",
     "deleteNotificationMsg": "全ての監視のこの通知を削除してよろしいですか?",
@@ -137,7 +137,7 @@
     "2FA Settings": "2段階認証の設定",
     "Two Factor Authentication": "2段階認証",
     "Clear all statistics": "すべての記録を削除",
-    "retryCheckEverySecond": "Retry every {0} seconds.",
+    "retryCheckEverySecond": "{0} 秒ごとにリトライします",
     "importHandleDescription": "同じ名前のすべての監視または通知方法を上書きしない場合は、「既存のをスキップ」を選択します。 「上書きする」は、既存のすべてのモニターと通知を削除します。",
     "confirmImportMsg": "バックアップをインポートしてもよろしいですか?希望するオプションを選択してください。",
     "Heartbeat Retry Interval": "異常検知後の再試行間隔",
@@ -148,17 +148,17 @@
     "Options": "オプション",
     "Keep both": "どちらも保持する",
     "Tags": "タグ",
-    "Add New below or Select...": "新規追加または選択...",
+    "Add New below or Select...": "新規追加または選択…",
     "Tag with this name already exist.": "この名前のタグはすでに存在しています。",
     "Tag with this value already exist.": "この値のタグはすでに存在しています。",
     "color": "色",
     "value (optional)": "値 (optional)",
-    "Search...": "検索...",
+    "Search...": "検索…",
     "Avg. Ping": "平均Ping時間",
     "Avg. Response": "平均応答時間",
     "Entry Page": "エントリーページ",
     "statusPageNothing": "ここには何もありません。グループまたは監視を追加してください。",
-    "No Services": "No Services",
+    "No Services": "サービス無し",
     "All Systems Operational": "すべてのサービスが稼働中",
     "Partially Degraded Service": "部分的にサービスが停止中",
     "Degraded Service": "サービスが停止中",
@@ -193,9 +193,85 @@
     "pushOptionalParams": "オプションのパラメーター: {0}",
     "disableauth.message1": "<strong>認証を無効</strong>にしてもよろしいですか?",
     "disableauth.message2": "これは、Cloudflare Access、Authelia、またはその他の認証メカニズムなど、Uptime Kuma の前に<strong>サードパーティ認証を実装するシナリオ向けに設計されています</strong>。",
-    "Please use this option carefully!": "このオプションは慎重に使用してください。",
+    "Please use this option carefully!": "このオプションは慎重に使用してください!",
     "Primary Base URL": "プライマリ ベース URL",
     "statusMaintenance": "メンテナンス",
     "Passive Monitor Type": "パッシブモニタータイプ",
-    "Specific Monitor Type": "特定のモニターの種類"
+    "Specific Monitor Type": "特定のモニターの種類",
+    "Security": "セキュリティ",
+    "Steam API Key": "Steam API Key",
+    "Default": "デフォルト",
+    "Title": "タイトル",
+    "No status pages": "ステータスページがありません",
+    "Proxy": "プロキシ",
+    "Date Created": "作成日",
+    "Content Type": "コンテンツタイプ",
+    "webhookAdditionalHeadersTitle": "追加ヘッダー",
+    "Server URL": "Server URL",
+    "Priority": "優先順位",
+    "Read more": "続きを読む",
+    "Show Tags": "タグを表示",
+    "Switch to Dark Theme": "ダークテーマに切り替える",
+    "Token": "Token",
+    "Show URI": "URIを表示する",
+    "Gray": "灰色",
+    "Red": "赤色",
+    "Green": "緑色",
+    "Blue": "青色",
+    "Indigo": "藍色",
+    "Purple": "紫色",
+    "Pink": "ピンク",
+    "Required": "必須",
+    "Select status pages...": "ステータスページを選択してください…",
+    "webhookAdditionalHeadersDesc": "Webhook で送信される追加ヘッダーを設定します。",
+    "Webhook URL": "Webhook URL",
+    "Application Token": "Application Token",
+    "steamApiKeyDescription": "Steam Game Server を監視するためには、Steam Web-API キーが必要です。APIキーの登録はこちらから行えます。 ",
+    "Monitor History": "監視履歴",
+    "clearDataOlderThan": "監視履歴データを {0} 日間、保持します。",
+    "PasswordsDoNotMatch": "パスワードが一致していません。",
+    "Current User": "現在のユーザー",
+    "topic": "トピック",
+    "Info": "Info",
+    "Create Incident": "インシデントを作成",
+    "Content": "内容",
+    "Please input title and content": "タイトルと内容を入力してください",
+    "Last Updated": "最終アップデート日時",
+    "Unpin": "ピンを外す",
+    "Switch to Light Theme": "ライトテーマに切り替える",
+    "Hide Tags": "タグを隠す",
+    "Description": "概要",
+    "Untitled Group": "名前の無いグループ",
+    "Services": "サービス",
+    "Discard": "破棄",
+    "Cancel": "キャンセル",
+    "Powered by": "Powered by",
+    "Customize": "カスタマイズ",
+    "Custom Footer": "カスタムフッター",
+    "Custom CSS": "カスタム CSS",
+    "deleteStatusPageMsg": "本当にこのステータスページを削除しますか?",
+    "Proxies": "プロキシ",
+    "default": "デフォルト",
+    "enabled": "有効",
+    "setAsDefault": "デフォルトに設定する",
+    "deleteProxyMsg": "本当にすべてのモニターからこのプロキシを削除しますか?",
+    "proxyDescription": "プロキシはモニターに割り当てられていないと機能しません。",
+    "setAsDefaultProxyDescription": "このプロキシは、新しいモニターに対してデフォルトで有効になっています。モニターごとに個別にプロキシを無効にすることができます。",
+    "Remove Token": "Tokenを削除",
+    "Stop": "止める",
+    "Add New Status Page": "新しいステータスページを追加",
+    "Next": "次へ",
+    "No Proxy": "プロキシなし",
+    "Authentication": "認証",
+    "HTTP Basic Auth": "HTTPベーシック認証",
+    "New Status Page": "新しいステータスページ",
+    "Page Not Found": "ページが見つかりません",
+    "Reverse Proxy": "リバースプロキシ",
+    "Backup": "バックアップ",
+    "About": "About",
+    "cloudflareWebsite": "Cloudflare Website",
+    "Don't know how to get the token? Please read the guide:": "トークンの取得方法が分かりませんか?ガイドをお読みください。",
+    "Custom": "カスタム",
+    "Created": "作成日時",
+    "Resend Notification if Down X times consecutively": "X回連続でダウンしたら通知を再送する"
 }

From 40cd5d41e3d24eabb8031662ceb8cf7b16970b24 Mon Sep 17 00:00:00 2001
From: AnnAngela <naganjue@vip.qq.com>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 725/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (669 of 669 strings)

Co-authored-by: AnnAngela <naganjue@vip.qq.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index c4b42892..bd859a3f 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -699,7 +699,7 @@
     "Google Analytics ID": "Google Analytics(分析)ID",
     "Learn More": "了解更多",
     "Edit Tag": "编辑标签",
-    "telegramMessageThreadID": "(可选)消息线程 ID",
-    "telegramMessageThreadIDDescription": "Optional Unique identifier for the target message thread (topic) of the forum; for forum supergroups only",
-    "notificationRegional": "地区性"
+    "telegramMessageThreadID": "(可选)话题 ID",
+    "telegramMessageThreadIDDescription": "可选的唯一标识符,用以向该标识符对应的话题发送消息,仅限启用了话题功能的超级群组可用",
+    "notificationRegional": "地区性通知平台"
 }

From f02e8be3e20f68f1eed84e61b02dd469f2303c0d Mon Sep 17 00:00:00 2001
From: 401Unauthorized <yehowahliu@4o1.to>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 726/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.5% (670 of 673 strings)

Co-authored-by: 401Unauthorized <yehowahliu@4o1.to>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index bd859a3f..db0f1159 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -701,5 +701,10 @@
     "Edit Tag": "编辑标签",
     "telegramMessageThreadID": "(可选)话题 ID",
     "telegramMessageThreadIDDescription": "可选的唯一标识符,用以向该标识符对应的话题发送消息,仅限启用了话题功能的超级群组可用",
-    "notificationRegional": "地区性通知平台"
+    "notificationRegional": "地区性通知平台",
+    "telegramSendSilently": "静默发送",
+    "Body Encoding": "响应体编码",
+    "telegramSendSilentlyDescription": "静默地发送消息。消息发布后用户会收到无声通知。",
+    "telegramProtectContent": "阻止转发/保存",
+    "telegramProtectContentDescription": "如果启用,Telegram 中的机器人消息将受到保护,不会被转发和保存。"
 }

From db85f1758ad8f6032eaf7cca3b5d309270586723 Mon Sep 17 00:00:00 2001
From: Stian Meyer <stian@smeyer.no>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 727/803] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?=
 =?UTF-8?q?an=20Bokm=C3=A5l)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 40.2% (271 of 674 strings)

Co-authored-by: Stian Meyer <stian@smeyer.no>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/nb_NO/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/nb-NO.json | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lang/nb-NO.json b/src/lang/nb-NO.json
index ca9a5f78..343a129a 100644
--- a/src/lang/nb-NO.json
+++ b/src/lang/nb-NO.json
@@ -289,5 +289,6 @@
     "Passive Monitor Type": "Passiv Monitor Type",
     "Specific Monitor Type": "Spesifik Monitor Type",
     "General Monitor Type": "Generisk Monitor Type",
-    "markdownSupported": "Markdown syntax støttet"
+    "markdownSupported": "Markdown syntax støttet",
+    "Resend Notification if Down X times consecutively": "Send notifikasjon på nytt dersom nede X antall ganger på rad"
 }

From c8a830047b329b5e8d8cfcb64bd8adc37521f305 Mon Sep 17 00:00:00 2001
From: Cyril59310 <archas.cyril@hotmail.fr>
Date: Fri, 3 Mar 2023 08:50:54 +0000
Subject: [PATCH 728/803] Translated using Weblate (French)

Currently translated at 100.0% (677 of 677 strings)

Translated using Weblate (French)

Currently translated at 100.0% (674 of 674 strings)

Co-authored-by: Cyril59310 <archas.cyril@hotmail.fr>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 26d71345..f4511633 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -696,5 +696,16 @@
     "Google Analytics ID": "Identifiant Google Analytics",
     "Server Address": "Adresse du serveur",
     "Learn More": "En savoir plus",
-    "Edit Tag": "Modifier l'étiquette"
+    "Edit Tag": "Modifier l'étiquette",
+    "Body Encoding": "Encodage du corps",
+    "telegramMessageThreadID": "(Facultatif) ID du fil de message",
+    "telegramMessageThreadIDDescription": "(Facultatif) Identifiant unique pour le fil de discussion cible (sujet) du forum; pour les supergroupes du forum uniquement",
+    "telegramProtectContent": "Protéger le transfert/l'enregistrement",
+    "telegramProtectContentDescription": "S'il est activé, les messages du robot dans Telegram seront protégés contre le transfert et l'enregistrement.",
+    "telegramSendSilently": "Envoyer silencieusement",
+    "telegramSendSilentlyDescription": "Envoie le message silencieusement. Les utilisateurs recevront une notification sans son.",
+    "notificationRegional": "Régional",
+    "Clone Monitor": "Cloner la sonde",
+    "Clone": "Cloner",
+    "cloneOf": "Clone de {0}"
 }

From efd4dece1b2617fd1dfcd24ad5b0601734e5d2c7 Mon Sep 17 00:00:00 2001
From: Abin Abraham <iamabinabraham@gmail.com>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 729/803] Translated using Weblate (Malayalam)

Currently translated at 3.7% (25 of 674 strings)

Added translation using Weblate (Malayalam)

Co-authored-by: Abin Abraham <iamabinabraham@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ml/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ml.json | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 src/lang/ml.json

diff --git a/src/lang/ml.json b/src/lang/ml.json
new file mode 100644
index 00000000..8cbfd148
--- /dev/null
+++ b/src/lang/ml.json
@@ -0,0 +1,27 @@
+{
+    "Settings": "ക്രമീകരണം",
+    "Help": "സഹായം",
+    "New Update": "പുതിയ നവീകരണം",
+    "Language": "ഭാഷ",
+    "Appearance": "കാണപ്പെടുക",
+    "Theme": "ദൃശ്യക്രമീകരണം",
+    "General": "പൊതുവായത്",
+    "Version": "പതിപ്പ്",
+    "List": "പട്ടിക",
+    "Add": "ചേർക്കുക",
+    "Add New Monitor": "പുതിയ മോണിറ്റർ ചേർക്കുക",
+    "Quick Stats": "വേഗത്തിൽ ഇപ്പോളത്തെ അവസ്ഥ നോക്കുക",
+    "Up": "മുകളിൽ",
+    "Down": "താഴെ",
+    "statusMaintenance": "പരിപാലനം",
+    "Maintenance": "പരിപാലനം",
+    "Unknown": "അജ്ഞാതം",
+    "Passive Monitor Type": "പാർശമായ തിര നോട്ടം",
+    "Specific Monitor Type": "പ്രത്യേക തിര നോട്ടം",
+    "languageName": "മലയാളം",
+    "Dashboard": "നിയന്ത്രണോപകരണ സജ്ജീകരണം",
+    "Game": "കളികൾ",
+    "Check Update On GitHub": "പുതിയ മാറ്റങ്ങൾക്കായി GitHub നോക്കുക",
+    "Pending": "തീരുമാനം പ്രതീക്ഷിച്ചിരിക്കുന്ന",
+    "General Monitor Type": "പൊതുവരായ തിര നോട്ടം"
+}

From 1718890be7e34854b57dad3ba89c12e59e41813a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Furkan=20=C4=B0?= <developer@furkanipek.com.tr>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 730/803] Translated using Weblate (Turkish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (674 of 674 strings)

Co-authored-by: Furkan İ <developer@furkanipek.com.tr>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 3c78c4bd..8c6b30d4 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -379,7 +379,7 @@
     "alerta": "Alerta",
     "alertaApiEndpoint": "API Endpoint",
     "alertaEnvironment": "Environment",
-    "alertaApiKey": "API Key",
+    "alertaApiKey": "API Anahtarı",
     "alertaAlertState": "Uyarı Durumu",
     "alertaRecoverState": "Kurtarma Durumu",
     "deleteStatusPageMsg": "Bu durum sayfasını silmek istediğinizden emin misiniz?",
@@ -693,11 +693,16 @@
     "line": "Line Messenger",
     "mattermost": "Mattermost",
     "markdownSupported": "Markdown yazım formatı desteklenir",
-    "Google Analytics ID": "Google Analytics ID",
+    "Google Analytics ID": "Google Analytics Kodu",
     "Edit Tag": "Etiketi Düzenle",
     "Learn More": "Daha fazla bilgi edin",
     "Server Address": "Sunucu Adresi",
     "telegramMessageThreadIDDescription": "Forumun hedef ileti dizisi (konusu) için isteğe bağlı benzersiz kimlik; yalnızca forum üst grupları için geçerli",
     "telegramMessageThreadID": "(İsteğe bağlı) Mesaj Thread ID",
-    "notificationRegional": "Bölgesel"
+    "notificationRegional": "Bölgesel",
+    "telegramSendSilently": "Sessizce Gönder",
+    "telegramSendSilentlyDescription": "Mesajı sessizce gönderir. Kullanıcılar sessiz bir bildirim alacaktır.",
+    "telegramProtectContent": "Yönlendirmeyi/Kaydetmeyi Koru",
+    "telegramProtectContentDescription": "Etkinleştirilirse, Telegram'daki bot mesajları iletilmeye ve kaydedilmeye karşı korunacaktır.",
+    "Body Encoding": "JSON veya XML olabilen HTTP İstek Gövdesinin Kodlaması. İstek İçeriği Türü olarak da bilinir: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type"
 }

From a838432aefa4d5c9702bfe655aa2954dd52b199f Mon Sep 17 00:00:00 2001
From: AnnAngela <naganjue@vip.qq.com>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 731/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (677 of 677 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (674 of 674 strings)

Co-authored-by: AnnAngela <naganjue@vip.qq.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index db0f1159..40bfdd80 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -235,10 +235,10 @@
     "smtpBCC": "密送",
     "discord": "Discord",
     "Discord Webhook URL": "Discord Webhook 网址",
-    "wayToGetDiscordURL": "要获取,可以前往服务器设置 -> 整合 -> 创建 Webhook",
+    "wayToGetDiscordURL": "可在服务器设置 -> 整合 -> 创建 Webhook中获取",
     "Bot Display Name": "机器人显示名称",
     "Prefix Custom Message": "自定义消息前缀",
-    "Hello @everyone is...": "{'@'}everyone,…",
+    "Hello @everyone is...": "{'@'}everyone,……",
     "teams": "Microsoft Teams",
     "Webhook URL": "Webhook 网址",
     "wayToGetTeamsURL": "您可以在{0}了解如何获取 Webhook URL。",
@@ -703,8 +703,11 @@
     "telegramMessageThreadIDDescription": "可选的唯一标识符,用以向该标识符对应的话题发送消息,仅限启用了话题功能的超级群组可用",
     "notificationRegional": "地区性通知平台",
     "telegramSendSilently": "静默发送",
-    "Body Encoding": "响应体编码",
+    "Body Encoding": "请求体编码",
     "telegramSendSilentlyDescription": "静默地发送消息。消息发布后用户会收到无声通知。",
     "telegramProtectContent": "阻止转发/保存",
-    "telegramProtectContentDescription": "如果启用,Telegram 中的机器人消息将受到保护,不会被转发和保存。"
+    "telegramProtectContentDescription": "如果启用,Telegram 中的机器人消息将受到保护,不会被转发和保存。",
+    "Clone Monitor": "克隆监控项",
+    "Clone": "克隆",
+    "cloneOf": "{0} 的克隆"
 }

From 8b1affb9f4825832a6ce6fdcc881a17ccaf0e476 Mon Sep 17 00:00:00 2001
From: Ivan Dmitriev <dmitriev.ivan.a@gmail.com>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 732/803] Translated using Weblate (Russian)

Currently translated at 95.7% (648 of 677 strings)

Co-authored-by: Ivan Dmitriev <dmitriev.ivan.a@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ru-RU.json | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 8b1e3bf2..ec8f8008 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -690,5 +690,9 @@
     "Guild ID": "ID гильдии",
     "Kook": "Kook",
     "wayToGetKookBotToken": "Создайте приложение и получите токен вашего бота тут {0}.",
-    "Resend Notification if Down X times consecutively": "Повторная отправка уведомления при падении несколько раз"
+    "Resend Notification if Down X times consecutively": "Повторная отправка уведомления при падении несколько раз",
+    "telegramProtectContent": "Запретить пересылку/сохранение",
+    "telegramProtectContentDescription": "Если включено, сообщения бота в Telegram будут запрещены для пересылки и сохранения.",
+    "telegramSendSilently": "Отправить без звука",
+    "telegramSendSilentlyDescription": "Пользователи получат уведомление без звука."
 }

From cd61b28c85444662b5c58bfd7ad96a6ffdd3fb89 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=96mer=20Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 733/803] Translated using Weblate (Turkish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (677 of 677 strings)

Co-authored-by: Ömer Faruk Genç <omer@farukgenc.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 8c6b30d4..26283a84 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -704,5 +704,8 @@
     "telegramSendSilentlyDescription": "Mesajı sessizce gönderir. Kullanıcılar sessiz bir bildirim alacaktır.",
     "telegramProtectContent": "Yönlendirmeyi/Kaydetmeyi Koru",
     "telegramProtectContentDescription": "Etkinleştirilirse, Telegram'daki bot mesajları iletilmeye ve kaydedilmeye karşı korunacaktır.",
-    "Body Encoding": "JSON veya XML olabilen HTTP İstek Gövdesinin Kodlaması. İstek İçeriği Türü olarak da bilinir: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type"
+    "Body Encoding": "JSON veya XML olabilen HTTP İstek Gövdesinin Kodlaması. İstek İçeriği Türü olarak da bilinir: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type",
+    "Clone Monitor": "Klon Monitör",
+    "Clone": "Klon",
+    "cloneOf": "{0} Monitörünün Klonu"
 }

From 5005c56e5110f2e7f4e779ca0fa7890bbb01e1fc Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 734/803] Translated using Weblate (Chinese (Traditional, Hong
 Kong))

Currently translated at 96.9% (673 of 694 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 91.0% (632 of 694 strings)

Co-authored-by: Nelson Chan <chakflying@hotmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-HK.json | 47 ++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 46 insertions(+), 1 deletion(-)

diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index bc0f8cc7..de226c98 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -657,5 +657,50 @@
     "onebotSafetyTips": "為了安全起見,必須設置存取 Token",
     "onebotUserOrGroupId": "群組/使用者 ID",
     "onebotPrivateMessage": "私人",
-    "notificationRegional": "地區性"
+    "notificationRegional": "地區性",
+    "RadiusCalledStationIdDescription": "Called Device 識別碼",
+    "telegramSendSilently": "靜音發送",
+    "telegramMessageThreadID": "(選填) Message Thread ID",
+    "RadiusCallingStationIdDescription": "Calling Device 識別碼",
+    "Body Encoding": "Body Encoding",
+    "API Keys": "API Keys",
+    "deleteAPIKeyMsg": "你確定要刪除此 API Key?",
+    "disableAPIKeyMsg": "你確定要停用此 API Key?",
+    "apiKey-inactive": "已停用",
+    "apiKey-active": "有效",
+    "No API Keys": "沒有 API Keys",
+    "Add API Key": "新 API Key",
+    "Expiry date": "失效時間",
+    "Don't expire": "不會失效",
+    "apiKey-expired": "已失效",
+    "Expires": "失效時間",
+    "Key Added": "API Key 已產生",
+    "Add Another": "加另一個",
+    "Continue": "繼續",
+    "Generate": "產生",
+    "apiKeyAddedMsg": "你的 API Key 已被產生。此頁只會顯示一次,請適當保存。",
+    "Expiry": "過期",
+    "telegramSendSilentlyDescription": "選擇以靜音發送。用戶會收到無聲通知。",
+    "Clone Monitor": "復製監察器",
+    "Clone": "復製",
+    "cloneOf": "復製的 {0}",
+    "Proxy server has authentication": "Proxy 伺服器啟用了驗證功能",
+    "Proxy Server": "Proxy 伺服器",
+    "Proxy Protocol": "Proxy 通訊協定",
+    "Setup Proxy": "設定 Proxy",
+    "Topic": "Topic",
+    "Retry": "重試",
+    "High": "高",
+    "Huawei": "華為",
+    "Android": "Android",
+    "For safety, must use secret key": "為安全起見,必須使用 Secret Key",
+    "SecretKey": "SecretKey",
+    "WebHookUrl": "WebHookUrl",
+    "Bark Sound": "Bark 鈴聲",
+    "Bark Group": "Bark 群組",
+    "Bark Endpoint": "Bark Endpoint",
+    "Platform": "平台",
+    "Device Token": "裝置 Token",
+    "telegramProtectContent": "禁止轉發/儲存",
+    "telegramProtectContentDescription": "如果選擇,用戶將不能轉發/儲存收到的信息。"
 }

From 1d7883208aab124a5a0533051c720f87bbb24aa5 Mon Sep 17 00:00:00 2001
From: 401Unauthorized <yehowahliu@4o1.to>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 735/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: 401Unauthorized <yehowahliu@4o1.to>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index 40bfdd80..3a46e96d 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -709,5 +709,22 @@
     "telegramProtectContentDescription": "如果启用,Telegram 中的机器人消息将受到保护,不会被转发和保存。",
     "Clone Monitor": "克隆监控项",
     "Clone": "克隆",
-    "cloneOf": "{0} 的克隆"
+    "cloneOf": "{0} 的克隆",
+    "Expiry": "过期",
+    "Expiry date": "过期时间",
+    "Continue": "继续",
+    "Add Another": "添加另一个",
+    "Add API Key": "添加 API 密钥",
+    "No API Keys": "没有 API 密钥",
+    "apiKey-active": "有效",
+    "apiKey-expired": "已过期",
+    "Expires": "过期时间",
+    "apiKey-inactive": "已禁用",
+    "disableAPIKeyMsg": "你确定要禁用这个 API 密钥?",
+    "deleteAPIKeyMsg": "你确定要删除这个 API 密钥?",
+    "Generate": "生成",
+    "API Keys": "API 密钥",
+    "Don't expire": "从不过期",
+    "Key Added": "API 密钥已生成",
+    "apiKeyAddedMsg": "你的 API 密钥已生成。此页只会显示一次,请妥当保存。"
 }

From eed49fed59fcf9e0415eb27b6c02b5e74410e99b Mon Sep 17 00:00:00 2001
From: Samuel PERRIER <Samuel-Perrier@users.noreply.weblate.kuma.pet>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 736/803] Translated using Weblate (French)

Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: Samuel PERRIER <Samuel-Perrier@users.noreply.weblate.kuma.pet>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index f4511633..0552c298 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -707,5 +707,22 @@
     "notificationRegional": "Régional",
     "Clone Monitor": "Cloner la sonde",
     "Clone": "Cloner",
-    "cloneOf": "Clone de {0}"
+    "cloneOf": "Clone de {0}",
+    "Expiry date": "Date d'expiration",
+    "Add Another": "Ajouter un autre",
+    "Key Added": "Clé ajoutée",
+    "Expiry": "Expiration",
+    "Continue": "Continuer",
+    "Add API Key": "Ajouter une clé API",
+    "No API Keys": "Aucune clé API",
+    "apiKey-active": "Active",
+    "apiKey-expired": "Expirée",
+    "apiKey-inactive": "Inactive",
+    "Expires": "Expire",
+    "disableAPIKeyMsg": "Voulez-vous vraiment désactiver cette clé API ?",
+    "deleteAPIKeyMsg": "Voulez-vous vraiment supprimer cette clé API ?",
+    "Generate": "Générer",
+    "API Keys": "Clés API",
+    "apiKeyAddedMsg": "Votre clé API a été ajoutée. Veuillez la noter car elle ne pourra plus être affichée.",
+    "Don't expire": "N'expire pas"
 }

From 9758e1b71a82427deff1b48f3263e06338beff99 Mon Sep 17 00:00:00 2001
From: Binyamin Yawitz <biny1000@gmail.com>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 737/803] Translated using Weblate (Hebrew (Israel))

Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: Binyamin Yawitz <biny1000@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/he_IL/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/he-IL.json | 214 +++++++++++++++++++++++++-------------------
 1 file changed, 123 insertions(+), 91 deletions(-)

diff --git a/src/lang/he-IL.json b/src/lang/he-IL.json
index 1e4c01d3..c3b93559 100644
--- a/src/lang/he-IL.json
+++ b/src/lang/he-IL.json
@@ -1,13 +1,13 @@
 {
     "languageName": "עברית",
-    "checkEverySecond": "בדוק כל {0} שניות",
-    "retryCheckEverySecond": "נסה שוב כל {0} שניות",
-    "resendEveryXTimes": "התראה שוב כל {0} פעמים",
-    "resendDisabled": "השליחה מחדש מושבתת",
-    "retriesDescription": "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ונשלחת התראה",
+    "checkEverySecond": "בדיקה כל {0} שניות",
+    "retryCheckEverySecond": "ניסיון חוזר כל {0} שניות",
+    "resendEveryXTimes": "שליחה שוב כל {0} פעמים",
+    "resendDisabled": "שליחה מחדש מושבתת",
+    "retriesDescription": "מקסימום ניסיונות חוזרים לפני שהשירות יסומן כלא פעיל ותשלח התראה",
     "ignoreTLSError": "התעלם משגיאת TLS/SSL עבור אתרי HTTPS",
-    "upsideDownModeDescription": "הפוך את הסטטוס על הפוך. אם ניתן להגיע לשירות, הוא לא פעיל.",
-    "maxRedirectDescription": "המספר המרבי של הפניות מחדש לעקוב. הגדר ל-0 כדי להשבית הפניות מחדש.",
+    "upsideDownModeDescription": "הפוך את יעד הסטטוס. אם ניתן להגיע לשירות, הוא ייחשב כלא פעיל.",
+    "maxRedirectDescription": "המספר המרבי של הפניות מחדש למעקב. ערך 0 ישבית הפניות מחדש לגמרי.",
     "enableGRPCTls": "אפשר לשלוח בקשת gRPC עם חיבור TLS",
     "grpcMethodDescription": "שם השיטה מומר לפורמט cammelCase כגון sayHello, check וכו.",
     "acceptedStatusCodesDescription": "בחר קודי סטטוס שנחשבים לתגובה מוצלחת.",
@@ -23,7 +23,7 @@
     "affectedMonitorsDescription": "בחר מוניטורים שמושפעים מהתחזוקה הנוכחית",
     "affectedStatusPages": "הצג הודעת תחזוקה זו בדפי סטטוס שנבחרו",
     "atLeastOneMonitor": "בחר לפחות מוניטור אחד מושפע",
-    "passwordNotMatchMsg": "הסיסמאות לא תואמות",
+    "passwordNotMatchMsg": "הסיסמאות שהזנתם אינן תואמות.",
     "notificationDescription": "יש להקצות התראות למוניטור כדי שהן יעבדו.",
     "keywordDescription": "חפש מילת מפתח בתגובת HTML או JSON רגילה. החיפוש תלוי רישיות.",
     "pauseDashboardHome": "עצור",
@@ -43,37 +43,37 @@
     "twoFAVerifyLabel": "אנא הזן את האסימון שלך כדי לאמת מערכת אדוש:",
     "tokenValidSettingsMsg": "האסימון תקף! כעת אתה יכול לשמור את הגדרות האדוש.",
     "confirmEnableTwoFAMsg": "האם אתה בטוח שברצונך להפעיל את מערכת אדוש?",
-    "confirmDisableTwoFAMsg": "Are you sure you want to disable 2FA?",
+    "confirmDisableTwoFAMsg": "האם אתם בטוחים שאתם רוצים להשבית אימות 2FA (אימות כפול)?",
     "Settings": "הגדרות",
-    "Dashboard": "פאנל ניהול",
+    "Dashboard": "לוח בקרה",
     "New Update": "עדכון חדש",
     "Language": "שפה",
-    "Appearance": "נראות",
+    "Appearance": "תצוגה",
     "Theme": "ערכת נושא",
     "General": "כללי",
-    "Primary Base URL": "כתובת האתר הראשית של הבסיס",
+    "Primary Base URL": "כתובת האתר הראשית",
     "Version": "גרסה",
-    "Check Update On GitHub": "לבדוק עדכונים בגיטהאב",
+    "Check Update On GitHub": "בדיקה לעדכונים מ-GitHub",
     "List": "רשימה",
-    "Add": "הוסף",
+    "Add": "הוספה",
     "Add New Monitor": "הוספת מוניטור חדש",
-    "Quick Stats": "נתונים בקצרה",
-    "Up": "פעיל",
-    "Down": "לא פעיל",
+    "Quick Stats": "סטטיסטיקות בקצרה",
+    "Up": "זמין",
+    "Down": "לא זמין",
     "Pending": "ממתין",
     "Unknown": "לא יודע",
-    "Pause": "עצור",
+    "Pause": "עצירה",
     "Name": "שם",
     "Status": "סטטוס",
     "DateTime": "תאריך שעה",
     "Message": "הודעה",
     "No important events": "אין אירועים חשובים",
-    "Resume": "המשך",
+    "Resume": "הפעלה",
     "Edit": "עריכה",
     "Delete": "מחיקה",
-    "Current": "עכשיו",
+    "Current": "נוכחי",
     "Uptime": "זמן פעילות",
-    "Cert Exp.": "Cert Exp.",
+    "Cert Exp.": "תפוגת תעודה.",
     "day": "יום | ימים",
     "-day": "-יום",
     "hour": "שעה",
@@ -82,49 +82,49 @@
     "Ping": "פינג",
     "Monitor Type": "סוג מוניטור",
     "Keyword": "מילת מפתח",
-    "Friendly Name": "שם ידידותי",
+    "Friendly Name": "שם תצוגה",
     "URL": "כתובת אתר",
     "Hostname": "שם המארח",
     "Port": "פורט",
-    "Heartbeat Interval": "מרווח פעימות",
+    "Heartbeat Interval": "מרווח פעימות (בין קריאה לקריאה)",
     "Retries": "נסיונות חוזרים",
     "Heartbeat Retry Interval": "מרווח נסיונות חוזר של פעימות",
-    "Resend Notification if Down X times consecutively": "שלח שוב הודעה אם ירד X פעמים כתוצאה מכך",
+    "Resend Notification if Down X times consecutively": "שליחת הודעה שוב אם לא פעיל X פעמים ברציפות",
     "Advanced": "מתקדם",
     "Upside Down Mode": "מצב הפוך",
     "Max. Redirects": "מקסימום הפניות מחדש",
-    "Accepted Status Codes": "קודי סטטוס מקובלים",
-    "Push URL": "דחף כתובת URL",
-    "needPushEvery": "עליך להתקשר לכתובת האתר הזו כל {0} שניות.",
+    "Accepted Status Codes": "קודי סטטוס מאושרים",
+    "Push URL": "כתובת URL ל-Push",
+    "needPushEvery": "יש לקרוא לכתובת הזו כל {0} שניות.",
     "pushOptionalParams": "פרמטרים אופציונליים: {0}",
     "Save": "שמירה",
     "Notifications": "התראות",
-    "Not available, please setup.": "לא זמין, אנא הגדר.",
-    "Setup Notification": "הודעת הגדרה",
-    "Light": "בהיר",
-    "Dark": "חושך",
-    "Auto": "אוטומטי",
+    "Not available, please setup.": "לא זמין, נא להגדיר.",
+    "Setup Notification": "הגדרת התראה",
+    "Light": "בהירה",
+    "Dark": "כהה",
+    "Auto": "אוטומטית",
     "Theme - Heartbeat Bar": "ערכת נושא - Heartbeat Bar",
-    "Normal": "נורמלי",
-    "Bottom": "למטה",
-    "None": "כלום",
+    "Normal": "רגיל",
+    "Bottom": "בתחתית האתר",
+    "None": "ללא",
     "Timezone": "אזור זמן",
     "Search Engine Visibility": "נראות במנועי חיפוש",
-    "Allow indexing": "אפשר הוספה לאינדקס",
-    "Discourage search engines from indexing site": "לא לעודד מנועי חיפוש לאינדקס אתרים",
-    "Change Password": "שנה סיסמא",
+    "Allow indexing": "לאפשר הוספה לאינדקס",
+    "Discourage search engines from indexing site": "לעודד מנועי חיפוש שלא לאנדקס את האתר",
+    "Change Password": "שינוי סיסמה",
     "Current Password": "סיסמה נוכחית",
     "New Password": "סיסמה חדשה",
-    "Repeat New Password": "חזור על סיסמה חדשה",
-    "Update Password": "עדכן סיסמה",
-    "Disable Auth": "השבתת אבטחה",
-    "Enable Auth": "הפעלת אבטחה",
-    "disableauth.message1": "האם אתה בטוח שברצונך <strong>להשבית את האבטחה</strong>?",
-    "disableauth.message2": "הוא מיועד לתרחישים <strong>שבהם אתה מתכוון ליישם אימות של צד שלישי</strong> מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.",
-    "Please use this option carefully!": "אנא השתמש באפשרות זו בזהירות!",
+    "Repeat New Password": "חזרה על הסיסמה חדשה",
+    "Update Password": "עידכון סיסמה",
+    "Disable Auth": "השבתת התחברות",
+    "Enable Auth": "הפעלת התחברות",
+    "disableauth.message1": "האם אתם בטוחים שברצונכם<strong>להשבית את האבטחה</strong>?",
+    "disableauth.message2": "אופציה זו מיועדת לתרחישים <strong>בהם בכוונתכם ליישם אימות של צד שלישי</strong> מול Uptime Kuma כגון Cloudflare Access, Authelia או מנגנוני אימות אחרים.",
+    "Please use this option carefully!": "יש להשתמש באפשרות זו בזהירות!",
     "Logout": "התנתקות",
     "Leave": "יציאה",
-    "I understand, please disable": "אני מבין, אני רוצה להשבית",
+    "I understand, please disable": "מובן, אני רוצה להשבית",
     "Confirm": "אישור",
     "Yes": "כן",
     "No": "לא",
@@ -234,7 +234,7 @@
     "smtpBCC": "עותק מוסתר",
     "discord": "דיסקורד",
     "Discord Webhook URL": "כתובת אתר של Discord Webhook",
-    "wayToGetDiscordURL": "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> צור Webhook",
+    "wayToGetDiscordURL": "אתה יכול לקבל זאת על ידי מעבר להגדרות שרת -> אינטגרציות -> יצירת Webhook",
     "Bot Display Name": "שם תצוגה של בוט",
     "Prefix Custom Message": "קידומת הודעה מותאמת אישית",
     "Hello @everyone is...": "שלום {'@'}כולם…",
@@ -286,10 +286,10 @@
     "apiCredentials": "אישורי API",
     "octopushLegacyHint": "האם אתה משתמש בגרסה הישנה של Octopush (2011-2020) או בגרסה החדשה?",
     "Check octopush prices": "בדוק מחירי תמנון {0}.",
-    "octopushPhoneNumber": "מספר טלפון (פורמט אינטלי, למשל: +33612345678)",
+    "octopushPhoneNumber": "מספר טלפון (בפורמט בינלאומי, למשל: +972501234567) ",
     "octopushSMSSender": "שם שולח SMS: 3-11 תווים אלפאנומריים ורווח (a-zA-Z0-9)",
     "LunaSea Device ID": "מזהה מכשיר LunaSea",
-    "Apprise URL": "Apprise URL",
+    "Apprise URL": "כתובת URL ל-Apprize",
     "Example:": "דוגמה: {0}",
     "Read more:": "קרא עוד: {0}",
     "Status:": "סטטוס: {0}",
@@ -302,7 +302,7 @@
     "lineDevConsoleTo": "קו מפתחי קונסולת - {0}",
     "Basic Settings": "הגדרות בסיסיות",
     "User ID": "תעודת זהות של משתמש",
-    "Messaging API": "Messaging API",
+    "Messaging API": "API להודעות",
     "wayToGetLineChannelToken": "תחילה גש ל-{0}, צור ספק וערוץ (Messaging API), לאחר מכן תוכל לקבל את אסימון הגישה לערוץ ומזהה המשתמש מפריטי התפריט שהוזכרו לעיל.",
     "Icon URL": "כתובת אתר של סמל",
     "aboutIconURL": "אתה יכול לספק קישור לתמונה ב\"כתובת URL של סמל\" כדי לעקוף את תמונת הפרופיל המוגדרת כברירת מחדל. לא ישמש אם Icon Emoji מוגדר.",
@@ -314,23 +314,23 @@
     "promosmsTypeSpeed": "SMS SPEED - העדיפות הגבוהה ביותר במערכת. מאוד מהיר ואמין אבל יקר (בערך פי שניים ממחיר מלא של SMS).",
     "promosmsPhoneNumber": "מספר טלפון (לנמען פולני ניתן לדלג על אזורי חיוג)",
     "promosmsSMSSender": "שם שולח SMS: שם רשום מראש או אחת מברירות המחדל: InfoSMS, SMS Info, MaxSMS, INFO, SMS",
-    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "Feishu WebHookUrl": "כתובת WebHook עבור Feishu",
     "matrixHomeserverURL": "כתובת האתר של שרת הבית (עם http(s):// ויציאה אופציונלית)",
     "Internal Room Id": "מזהה חדר פנימי",
     "matrixDesc1": "אתה יכול למצוא את מזהה החדר הפנימי על ידי עיון בחלק המתקדם של לקוח Matrix שלך בהגדרות החדר. זה צריך להיראות כמו !QMdRCpUIfLwsfjxye6:home.server.",
     "matrixDesc2": "מומלץ מאוד ליצור משתמש חדש ולא להשתמש באסימון הגישה של משתמש מטריקס משלך שכן הוא יאפשר גישה מלאה לחשבון שלך ולכל החדרים שהצטרפת אליהם. במקום זאת, צור משתמש חדש והזמן אותו רק לחדר שבו תרצה לקבל את ההתראה. תוכל לקבל את אסימון הגישה על ידי הפעלת {0}",
-    "Method": "Method",
-    "Body": "Body",
-    "Headers": "Headers",
+    "Method": "שיטה",
+    "Body": "תוכן (Body)",
+    "Headers": "האדרים (Headers)",
     "PushUrl": "Push URL",
-    "HeadersInvalidFormat": "כותרות הבקשה אינן JSON חוקיות:",
-    "BodyInvalidFormat": "גוף הבקשה אינו JSON חוקי:",
+    "HeadersInvalidFormat": "ההאדרים בבקשה אינם בתחביר JSON תקני: ",
+    "BodyInvalidFormat": "גוף הבקשה (Body) אינו JSON תקני: ",
     "Monitor History": "מעקב אחר היסטוריה",
     "clearDataOlderThan": "שמור את נתוני היסטוריית הצג למשך {0} ימים.",
     "PasswordsDoNotMatch": "סיסמאות לא תואמות.",
     "records": "רשומות",
     "One record": "שיא אחד",
-    "steamApiKeyDescription": "לניטור שרת משחקי Steam אתה צריך מפתח Steam Web-API. אתה יכול לרשום את מפתח ה-API שלך כאן:",
+    "steamApiKeyDescription": "לניטור שרת משחקי Steam יש צורך במפתח Steam Web-API. ניתן לרשום ולקבל את מפתח ה-API כאן: ",
     "Current User": "משתמש נוכחי",
     "topic": "נושא",
     "topicExplanation": "נושא MQTT למעקב",
@@ -365,7 +365,7 @@
     "Unpin": "ענן חוף",
     "Switch to Light Theme": "לעבור לנושא האור",
     "Switch to Dark Theme": "לעבור לנושא אפל",
-    "Show Tags": "Show Tags",
+    "Show Tags": "הצגת תגיות",
     "Hide Tags": "הסתר תגיות",
     "Description": "תיאור",
     "No monitors available.": "אין צגים זמינים.",
@@ -378,7 +378,7 @@
     "Powered by": "פועל על",
     "shrinkDatabaseDescription": "ואקום מסד נתונים להפעיל עבור SQLITE.אם בסיס הנתונים שלך נוצר לאחר 1.10.0, Auto_VACUUM כבר מופעל ואין צורך בפעולה זו.",
     "serwersms": "SerwerSMS.pl",
-    "serwersmsAPIUser": "API Username (incl. webapi_ prefix)",
+    "serwersmsAPIUser": "שם משתמש ל-API (כולל webapi_prefix)",
     "serwersmsAPIPassword": "סיסמת API",
     "serwersmsPhoneNumber": "מספר טלפון",
     "serwersmsSenderName": "שם שולח SMS (רשום באמצעות פורטל לקוחות)",
@@ -420,12 +420,12 @@
     "alertaAlertState": "מצב התראה",
     "alertaRecoverState": "לשחזר מדינה",
     "deleteStatusPageMsg": "האם אתה בטוח רוצה למחוק את דף הסטטוס הזה?",
-    "Proxies": "Proxies",
+    "Proxies": "מתווכים",
     "default": "בְּרִירַת מֶחדָל",
     "enabled": "מופעל",
     "setAsDefault": "נקבע כברירת מחדל",
     "deleteProxyMsg": "האם אתה בטוח רוצה למחוק את הפרוקסי הזה לכל המסכים?",
-    "proxyDescription": "Proxies must be assigned to a monitor to function.",
+    "proxyDescription": "מתווכים חייבים להיות משויכים למוניטור בשביל שיעבדו.",
     "enableProxyDescription": "פרוקסי זה לא ישפיע על בקשות צג עד שהוא יופעל.אתה יכול לשלוט באופן זמני להשבית את ה- Proxy מכל המסכים לפי מצב ההפעלה.",
     "setAsDefaultProxyDescription": "פרוקסי זה יופעל כברירת מחדל עבור צגים חדשים.אתה עדיין יכול להשבית את ה- Proxy בנפרד עבור כל צג.",
     "Certificate Chain": "שרשרת אישורים",
@@ -434,13 +434,13 @@
     "AccessKeyId": "מזהה AccessKey",
     "SecretAccessKey": "גישהלמפתחסוד",
     "PhoneNumbers": "מספר טלפוןs",
-    "TemplateCode": "TemplateCode",
-    "SignName": "שם שם",
+    "TemplateCode": "מזהה TemplateCode",
+    "SignName": "מזהה SignName",
     "Sms template must contain parameters: ": "תבנית SMS חייבת להכיל פרמטרים: ",
-    "Bark Endpoint": "Bark Endpoint",
-    "Bark Group": "Bark Group",
-    "Bark Sound": "Bark Sound",
-    "WebHookUrl": "WebHookUrl",
+    "Bark Endpoint": "כתובת יעד של Bark",
+    "Bark Group": "קבוצת Bark",
+    "Bark Sound": "צליל Bark",
+    "WebHookUrl": "כתובת ל-WebHookUrl",
     "SecretKey": "מפתח סודי",
     "For safety, must use secret key": "לבטיחות, חייב להשתמש במפתח סודיy",
     "Device Token": "אסימון מכשיר",
@@ -451,7 +451,7 @@
     "High": "High",
     "Retry": "נסה שוב",
     "Topic": "נוֹשֵׂא",
-    "WeCom Bot Key": "WeCom Bot Key",
+    "WeCom Bot Key": "מפתח בוט ל-WeCom",
     "Setup Proxy": "הגדרת פרוקסי",
     "Proxy Protocol": "פרוטוקול פרוקסי",
     "Proxy Server": "שרת פרוקסי",
@@ -500,24 +500,24 @@
     "Proxy": "פרוקסי",
     "Date Created": "תאריך יצירה",
     "HomeAssistant": "Home Assistant",
-    "onebotHttpAddress": "כתובת HTTP של OneBot ",
+    "onebotHttpAddress": "כתובת HTTP של OneBot",
     "onebotMessageType": "סוג ההודעה OneBot",
     "onebotGroupMessage": "קְבוּצָה",
     "onebotPrivateMessage": "פְּרָטִי",
-    "onebotUserOrGroupId": "מזהה קבוצה/משתמש ",
-    "onebotSafetyTips": "לבטיחות, חייב לקבוע אסימון גישה ",
-    "PushDeer Key": "PushDeer Key",
-    "Footer Text": "טקסט כותרת תחתונה ",
-    "Show Powered By": "הצג מופעל על ידי ",
-    "Domain Names": "שמות דומיין ",
-    "signedInDisp": "חתום כ- {0} ",
+    "onebotUserOrGroupId": "מזהה קבוצה/משתמש",
+    "onebotSafetyTips": "לבטיחות, חובה לקבוע טוקן גישה",
+    "PushDeer Key": "מפתח PushDeer",
+    "Footer Text": "טקסט לתחתית האתר (פוטר)",
+    "Show Powered By": "הצגת \"מופעל ע\"י\"",
+    "Domain Names": "שמות דומיין",
+    "signedInDisp": "חתום כ- {0}",
     "signedInDispDisabled": "Auth מושבת.",
     "RadiusSecret": "רדיוס סוד",
     "RadiusSecretDescription": "סוד משותף בין לקוח לשרת",
     "RadiusCalledStationId": "נקרא מזהה תחנה",
-    "RadiusCalledStationIdDescription": "מזהה של המכשיר הנקרא ",
-    "RadiusCallingStationId": "מזהה תחנת שיחה ",
-    "RadiusCallingStationIdDescription": "מזהה של מכשיר השיחה ",
+    "RadiusCalledStationIdDescription": "מזהה המכשיר שנקרא",
+    "RadiusCallingStationId": "מזהה תחנת הקריאה",
+    "RadiusCallingStationIdDescription": "מזהה של מכשיר הנקרא",
     "Certificate Expiry Notification": "הודעת תפוגה של אישור",
     "API Username": "שם משתמש API",
     "API Key": "מפתח API",
@@ -525,7 +525,7 @@
     "From Name/Number": "משם/מספר",
     "Leave blank to use a shared sender number.": "השאר ריק כדי להשתמש במספר שולח משותף.",
     "Octopush API Version": "גרסת API של תמנון",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "Legacy Octopush-DM": "שיטת DM (מיושנת)",
     "endpoint": "נקודת קצה",
     "octopushAPIKey": "\"מפתח API \" מתוך תעודות API של HTTP בלוח הבקרה",
     "octopushLogin": "\"כניסה \" מתעודות API של HTTP בלוח הבקרה",
@@ -540,7 +540,7 @@
     "pushoversounds falling": "נופל",
     "pushoversounds gamelan": "gamelan",
     "pushoversounds incoming": "נִכנָס",
-    "pushoversounds intermission": "Intermission",
+    "pushoversounds intermission": "הפוגה",
     "pushoversounds magic": "קֶסֶם",
     "pushoversounds mechanical": "מֵכָנִי",
     "pushoversounds pianobar": "בר פסנתר",
@@ -575,7 +575,7 @@
     "certificationExpiryDescription": "HTTPS עוקב אחר התראה על התראה כאשר תעודת TLS פגה ב:",
     "Setup Docker Host": "הגדרת מארח Docker",
     "Connection Type": "סוג חיבור",
-    "Docker Daemon": "Docker Daemon",
+    "Docker Daemon": "שירות Docker",
     "deleteDockerHostMsg": "האם אתה בטוח רוצה למחוק את המארח של Docker לכל המוניטורים?",
     "socket": "Socket",
     "tcp": "TCP / HTTP",
@@ -583,7 +583,7 @@
     "Container Name / ID": "שם מכולה / מזהה",
     "Docker Host": "מארח דוקר",
     "Docker Hosts": "מארחי Docker",
-    "ntfy Topic": "ntfy Topic",
+    "ntfy Topic": "נושא ntfy",
     "Domain": "תְחוּם",
     "Workstation": "עמדת עבודה",
     "disableCloudflaredNoAuthMsg": "אתה לא נמצא במצב AUTH, אין צורך בסיסמה.",
@@ -594,7 +594,7 @@
     "Long-Lived Access Token": "אסימון גישה ארוכת שנים",
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "ניתן ליצור אסימון גישה לאורך זמן על ידי לחיצה על שם הפרופיל שלך (שמאל למטה) וגלילה לתחתית ואז לחץ על צור אסימון. ",
     "Notification Service": "Notification Service",
-    "default: notify all devices": "default: notify all devices",
+    "default: notify all devices": "ברירת מחדל: התראה לכלל המכשירים",
     "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "רשימה של שירותי הודעה ניתן למצוא בעוזר הבית תחת \"כלי מפתחים> שירותים \" חפש \"הודעה \" כדי למצוא את שם המכשיר/טלפון שלך.",
     "Automations can optionally be triggered in Home Assistant:": "אוטומציות יכולות להיות מופעלות באופן אופציונלי לעוזר הבית:",
     "Trigger type:": "סוג ההדק:",
@@ -603,7 +603,7 @@
     "Then choose an action, for example switch the scene to where an RGB light is red.": "ואז בחר פעולה, למשל העבר את הסצינה למקום בו אור RGB הוא אדום.",
     "Frontend Version": "גרסת Frontend",
     "Frontend Version do not match backend version!": "גרסת Frontend לא תואמת את גרסת Backend!",
-    "Base URL": "Base URL",
+    "Base URL": "כתובת בסיס",
     "goAlertInfo": "SAETRERT הוא יישום קוד פתוח לתזמון שיחה, הסלמות והודעות אוטומטיות (כמו SMS או שיחות קוליות).לעסוק אוטומטית את האדם הנכון, בדרך הנכונה ובזמן הנכון!{0}",
     "goAlertIntegrationKeyInfo": "קבל מפתח אינטגרציה של API גנרי לשירות בפורמט זה \"AAAAAAAA-BBB-CCCC-DDDD-EEEEEEEEEEE \" בדרך כלל הערך של פרמטר האסימון של URL שהועתק.",
     "goAlert": "GoAlert",
@@ -611,7 +611,7 @@
     "backupRecommend": "אנא גבה את עוצמת הקול או את תיקיית הנתונים (./data/) ישירות במקום.",
     "Optional": "אופציונאלי",
     "squadcast": "Squadcast",
-    "SendKey": "SendKey",
+    "SendKey": "מזהה SendKey",
     "SMSManager API Docs": "מסמכי API של SmsManager ",
     "Gateway Type": "סוג שער",
     "SMSManager": "SMSManager",
@@ -630,7 +630,7 @@
     "weekdayShortSun": "ראשון",
     "dayOfWeek": "יום בשבוע",
     "dayOfMonth": "יום בחודש",
-    "lastDay": "Last Day",
+    "lastDay": "יום אחרון",
     "lastDay1": "היום האחרון של החודש",
     "lastDay2": "יום שני האחרון של החודש",
     "lastDay3": "יום 3 האחרון של החודש",
@@ -666,8 +666,8 @@
     "Economy": "חיסכון",
     "Lowcost": "זול",
     "high": "גבוהה",
-    "General Monitor Type": "מוניטור כללי",
-    "Passive Monitor Type": "מוניטור פסיבי",
+    "General Monitor Type": "סוג מוניטור כללי",
+    "Passive Monitor Type": "סוג מוניטור פסיבי",
     "Specific Monitor Type": "סוג מוניטור ספציפי",
     "Custom Monitor Type": "סוג צג מותאם אישית",
     "Monitor": "מוניטור | מוניטרים",
@@ -682,7 +682,7 @@
     "Help": "עזרה",
     "Game": "משחק",
     "Packet Size": "גודל חבילה",
-    "markdownSupported": "תחביר סימון נתמך (Markdown )",
+    "markdownSupported": "תחביר Markdown נתמך",
     "Custom": "מותאם אישית",
     "ZohoCliq": "זוהו קליק",
     "wayToGetZohoCliqURL": "אתה יכול ללמוד כיצד ליצור כתובת אתר ל-webhook {0}.",
@@ -692,5 +692,37 @@
     "Kook": "קוק",
     "wayToGetKookBotToken": "צור יישום וקבל את אסימון הבוט שלך ב-{0}",
     "wayToGetKookGuildID": "הפעל את 'מצב מפתח' בהגדרת קוק, ולחץ לחיצה ימנית על הגילדה כדי לקבל את המזהה שלה",
-    "Guild ID": "מזהה גילד"
+    "Guild ID": "מזהה גילד",
+    "Body Encoding": "קידוד Body",
+    "API Keys": "מפתחות API",
+    "Expiry": "תפוגה",
+    "Don't expire": "תוקף שלא פג",
+    "Continue": "להמשיך",
+    "Add Another": "להוסיף עוד",
+    "Key Added": "המפתח נוסף",
+    "Add API Key": "הוספת מפתח API",
+    "No API Keys": "אין מפתחות API",
+    "apiKey-active": "פעיל",
+    "apiKey-expired": "פג תוקף",
+    "apiKey-inactive": "לא פעיל",
+    "Expires": "תוקף",
+    "deleteAPIKeyMsg": "האם אתם בטוחים שאתם רוצים למחוק מפתח API זה?",
+    "Generate": "ייצור",
+    "telegramMessageThreadID": "מזהה ID לאשכול (אופציונאלי)",
+    "telegramMessageThreadIDDescription": "מזהה ייחודי אופציונאלי להזנת ההודעה לאשכול (הנושא) המתאים. נועד לסופר-קבוצות בלבד",
+    "telegramProtectContentDescription": "אם מופעל , הודעות הבוט ב-Telegram יהיו מוגנים מהעברה ושמירה שלהם.",
+    "Clone Monitor": "שכפול של Monitor",
+    "Expiry date": "תאריך תפוגה",
+    "apiKeyAddedMsg": "מפתח ה-API שלך נוסף. בבקשה רשמו אותו עבורכם כיוון שהוא לא יופיע שנית.",
+    "disableAPIKeyMsg": "האם אתם בטוחים שאתם רוצים להשבית מפתח API זה?",
+    "Clone": "שכפול",
+    "cloneOf": "שכפול של {0}",
+    "Google Analytics ID": "מזהה ID של Google Analytics",
+    "telegramProtectContent": "הגנת העברה \\ שמירה",
+    "notificationRegional": "לפי איזור",
+    "Server Address": "כתובת השרת",
+    "Edit Tag": "עריכת תגית",
+    "Learn More": "לקריאה נוספת",
+    "telegramSendSilently": "שליחה שקטה",
+    "telegramSendSilentlyDescription": "שליחת הודעות שקטה. משתמשים יקבלו ההתראה ללא צליל."
 }

From 7bbfb640ba95bd3b62cd42a10b141f364ed74ac6 Mon Sep 17 00:00:00 2001
From: fuyuki <yuki627f@gmail.com>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 738/803] Translated using Weblate (Japanese)

Currently translated at 56.6% (399 of 704 strings)

Translated using Weblate (Japanese)

Currently translated at 42.6% (300 of 704 strings)

Translated using Weblate (Japanese)

Currently translated at 40.3% (280 of 694 strings)

Co-authored-by: fuyuki <yuki627f@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ja/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ja.json | 131 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 129 insertions(+), 2 deletions(-)

diff --git a/src/lang/ja.json b/src/lang/ja.json
index d0d2f51b..f29d9d5c 100644
--- a/src/lang/ja.json
+++ b/src/lang/ja.json
@@ -61,7 +61,7 @@
     "Advanced": "Advanced",
     "Upside Down Mode": "Upside Down Mode",
     "Max. Redirects": "最大リダイレクト数",
-    "Accepted Status Codes": "承認されたステータスコード",
+    "Accepted Status Codes": "正常なステータスコード",
     "Save": "保存",
     "Notifications": "通知",
     "Not available, please setup.": "利用できません。設定してください。",
@@ -273,5 +273,132 @@
     "Don't know how to get the token? Please read the guide:": "トークンの取得方法が分かりませんか?ガイドをお読みください。",
     "Custom": "カスタム",
     "Created": "作成日時",
-    "Resend Notification if Down X times consecutively": "X回連続でダウンしたら通知を再送する"
+    "Resend Notification if Down X times consecutively": "X回連続でダウンしたら通知を再送する",
+    "webhookJsonDesc": "{0}はExpress.jsのような最新のHTTPサーバに適しています。",
+    "webhookFormDataDesc": "{multipart}はPHPに適しています。このJSONは{decodeFunction}でデコードする必要があります。",
+    "appriseInstalled": "Appriseはインストール済みです。",
+    "emojiCheatSheet": "絵文字一覧: {0}",
+    "Inactive": "無効",
+    "defaultNotificationName": "{notification} 通知 ({number})",
+    "Post URL": "Post URL",
+    "Active": "有効",
+    "Pick a RR-Type...": "RR-Typeを選択…",
+    "Pick Accepted Status Codes...": "正常なステータスコードを選択…",
+    "appriseNotInstalled": "Apprise はインストールされていません。{0}",
+    "Method": "方式",
+    "Body": "ボディ",
+    "Headers": "ヘッダー",
+    "PushUrl": "Push URL",
+    "HeadersInvalidFormat": "リクエストヘッダーのJSONが無効です: ",
+    "BodyInvalidFormat": "リクエストボディのJSONが無効です: ",
+    "records": "レコード",
+    "One record": "レコード",
+    "topicExplanation": "監視するMQTTトピック",
+    "successMessage": "成功メッセージ",
+    "successMessageExplanation": "成功したとみなされるMQTTメッセージ",
+    "recent": "直近",
+    "Done": "完了",
+    "HTTP Options": "HTTPオプション",
+    "Style": "スタイル",
+    "info": "情報",
+    "warning": "警告",
+    "Valid To:": "有効期限:",
+    "Days Remaining:": "残りの有効日数:",
+    "Issuer:": "発行者:",
+    "Fingerprint:": "フィンガープリント:",
+    "Domain Name Expiry Notification": "ドメイン名有効期限通知",
+    "Footer Text": "フッター文章",
+    "Show Powered By": "Powered Byを表示",
+    "Domain Names": "ドメイン名",
+    "signedInDisp": "{0}としてログイン中",
+    "RadiusSecret": "Radius シークレット",
+    "RadiusSecretDescription": "クライアントとサーバー間の共有シークレット",
+    "RadiusCalledStationId": "Called Station Id",
+    "RadiusCallingStationId": "Calling Station Id",
+    "Subject:": "サブジェクト:",
+    "trustProxyDescription": "ヘッダー「X-Forwarded-*」を信頼します。Uptime Kumaがリバースプロキシの中にあり、正しいクライアントIPを取得する場合は、有効化してください。",
+    "Home Assistant URL": "ホームアシスタントURL",
+    "Examples": "例",
+    "telegramMessageThreadID": "(オプション) メッセージスレッドID",
+    "wayToGetLineNotifyToken": "{0}からアクセストークンを入手できます。",
+    "Packet Size": "パケットサイズ",
+    "Bot Token": "ボットトークン",
+    "Chat ID": "チャットID",
+    "critical": "致命的エラー",
+    "signedInDispDisabled": "認証が無効化されています。",
+    "RadiusCalledStationIdDescription": "着信側の識別子",
+    "telegramProtectContent": "転送や保存を制限",
+    "YOUR BOT TOKEN HERE": "入手したボットトークン",
+    "API Key": "APIキー",
+    "Show update if available": "アップデートがあれば表示する",
+    "Using a Reverse Proxy?": "リバースプロキシを使用中ですか?",
+    "Go back to the previous page.": "前のページに戻る",
+    "Coming Soon": "近日公開予定",
+    "Workstation": "ワークステーション",
+    "wayToGetTelegramToken": "{0}からトークンを入手できます。",
+    "telegramMessageThreadIDDescription": "オプションとしてフォーラムのスレッド(話題)のIDを指定してメッセージを送信することができます。スーパーグループでのみ利用できます。",
+    "telegramProtectContentDescription": "有効な場合、Telegram上のボットのメッセージの転送や保存が制限されます。",
+    "danger": "危険",
+    "error": "エラー",
+    "primary": "プライマリー",
+    "light": "ライト",
+    "dark": "ダーク",
+    "Post": "Post",
+    "No monitors available.": "監視対象がありません。",
+    "Add one": "追加",
+    "No Monitors": "監視対象なし",
+    "shrinkDatabaseDescription": "SQLiteデーターベースにVACUUMを実行します。データーベースがv1.10.0以降に作成されている場合、AUTO_VACUUMが既に有効なため実行する必要はありません。",
+    "enableProxyDescription": "このプロキシは有効化されない限り、監視リクエストには影響しません。無効化した場合、一時的にプロキシをすべての監視から無効化することができます。",
+    "Certificate Chain": "証明書チェーン",
+    "Valid": "有効",
+    "Invalid": "無効",
+    "User": "ユーザー",
+    "Installed": "インストール済み",
+    "Not installed": "未インストール",
+    "Running": "稼働中",
+    "Not running": "停止中",
+    "Slug": "スラッグ",
+    "Accept characters:": "使用可能な文字:",
+    "startOrEndWithOnly": "{0}のみ最初と最後の文字として使用可能",
+    "No consecutive dashes": "連続したダッシュ記号は使用不可",
+    "The slug is already taken. Please choose another slug.": "指定されたスラグは既に使用されています。別のスラグを使用してください。",
+    "wayToGetCloudflaredURL": "({0}からcloudflaredをダウンロード)",
+    "Message:": "メッセージ:",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Cloudflare Tunnelを経由した接続が遮断される可能性があります。停止してもよろしいですか? 確認のため、現在のパスワードを入力してください。",
+    "HTTP Headers": "HTTPヘッダー",
+    "Trust Proxy": "信頼できるプロキシ",
+    "Other Software": "その他のソフトウェア",
+    "For example: nginx, Apache and Traefik.": "例: nginxやApache、Traefikなど",
+    "RadiusCallingStationIdDescription": "発信側の識別子",
+    "Certificate Expiry Notification": "証明書有効期限通知",
+    "API Username": "APIユーザー名",
+    "Also check beta release": "ベータ版も表示する",
+    "Check how to config it for WebSocket": "WebSocketの設定方法について",
+    "Steam Game Server": "Steamゲームサーバー",
+    "Most likely causes:": "最も考えられる原因:",
+    "There might be a typing error in the address.": "アドレスの入力ミスの可能性があります。",
+    "What you can try:": "対応方法:",
+    "Retype the address.": "アドレスを入力し直してください。",
+    "The resource is no longer available.": "存在しないページです。",
+    "Connection String": "接続文字列",
+    "Query": "クエリ",
+    "settingsCertificateExpiry": "TLS証明書の有効期限",
+    "certificationExpiryDescription": "HTTPS監視のTLS証明書が以下の期限を迎えたときに通知を送信します。",
+    "Setup Docker Host": "Docker ホストを設定",
+    "Connection Type": "接続タイプ",
+    "Docker Daemon": "Docker デーモン",
+    "deleteDockerHostMsg": "すべての監視のDocker ホストを削除してもよろしいですか?",
+    "socket": "ソケット",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "Docker コンテナー",
+    "Container Name / ID": "コンテナ名 / ID",
+    "Docker Host": "Docker ホスト",
+    "Docker Hosts": "Docker ホスト",
+    "Domain": "ドメイン",
+    "telegramSendSilently": "通知せずに送信",
+    "telegramSendSilentlyDescription": "通知せずにメッセージを送信します。通知音がなりません。",
+    "supportTelegramChatID": "チャットやグループ、チャンネルのチャットIDに対応",
+    "wayToGetTelegramChatID": "ボットにメッセージを送信し、以下のURLを開くとチャットIDのchat_idを入手できます。",
+    "chatIDNotFound": "チャットIDが存在しません。最初にメッセージをボットに送信してください。",
+    "disableCloudflaredNoAuthMsg": "認証が無効化されているため、パスワードは必要ありません。"
 }

From 6af1306b89d8fcb9315e1ac4c183ab3dfd4a6df3 Mon Sep 17 00:00:00 2001
From: DevMirza <pzhafeez@gmail.com>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 739/803] Translated using Weblate (Urdu)

Currently translated at 57.6% (400 of 694 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: DevMirza <pzhafeez@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ur/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 19 ++++++++++++++++++-
 src/lang/ur.json    | 23 ++++++++++++++++++++++-
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 26283a84..9e5cffc6 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -707,5 +707,22 @@
     "Body Encoding": "JSON veya XML olabilen HTTP İstek Gövdesinin Kodlaması. İstek İçeriği Türü olarak da bilinir: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type",
     "Clone Monitor": "Klon Monitör",
     "Clone": "Klon",
-    "cloneOf": "{0} Monitörünün Klonu"
+    "cloneOf": "{0} Monitörünün Klonu",
+    "Expiry": "son kullanma tarihi",
+    "Expiry date": "Son kullanma tarihi",
+    "Don't expire": "sona erme",
+    "Continue": "Devam etmek",
+    "Key Added": "Anahtar Eklendi",
+    "Add API Key": "API Anahtarı Ekle",
+    "No API Keys": "API Anahtarı Yok",
+    "apiKey-active": "Aktif",
+    "apiKey-expired": "Günü geçmiş",
+    "apiKey-inactive": "etkin değil",
+    "Expires": "süresi doluyor",
+    "disableAPIKeyMsg": "Bu API anahtarını devre dışı bırakmak istediğinizden emin misiniz?",
+    "deleteAPIKeyMsg": "Bu API anahtarını silmek istediğinizden emin misiniz?",
+    "Generate": "oluştur",
+    "API Keys": "api anahtarları",
+    "Add Another": "Başka birtane ekle",
+    "apiKeyAddedMsg": "API anahtarınız eklendi. Bir daha gösterilmeyeceği için lütfen not edin."
 }
diff --git a/src/lang/ur.json b/src/lang/ur.json
index bb0c3667..40f17a85 100644
--- a/src/lang/ur.json
+++ b/src/lang/ur.json
@@ -382,5 +382,26 @@
     "Packet Size": "پیکٹ کا سائز",
     "Bot Token": "بوٹ ٹوکن",
     "wayToGetTelegramToken": "آپ {0} سے ٹوکن حاصل کر سکتے ہیں۔",
-    "Chat ID": "چیٹ آئی ڈی"
+    "Chat ID": "چیٹ آئی ڈی",
+    "default: notify all devices": "‏ڈیفالٹ: تمام آلات کو مطلع کریں",
+    "telegramSendSilently": "خاموشی سے بھیجیں",
+    "telegramSendSilentlyDescription": "خاموشی سے پیغام بھیجتا ہے۔ صارفین کو بغیر آواز کے ایک اطلاع موصول ہوگی۔",
+    "Long-Lived Access Token": "طویل المدت رسائی ٹوکن",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "آپ کے پروفائل کے نام (نیچے بائیں) پر کلک کرکے اور نیچے تک سکرول کرکے طویل المدت رسائی کا ٹوکن بنایا جاسکتا ہے پھر ٹوکن بنائیں پر کلک کریں۔ ",
+    "backupOutdatedWarning": "فرسودہ: چونکہ بہت ساری خصوصیات شامل کی گئی ہیں اور یہ بیک اپ خصوصیت تھوڑا سا غیر برقرار ہے، یہ مکمل بیک اپ پیدا یا بحال نہیں کر سکتا۔",
+    "telegramProtectContent": "فارورڈنگ/محفوظ کرنے کی حفاظت کریں",
+    "telegramProtectContentDescription": "فعال ہونے پر، ٹیلیگرام میں بوٹ پیغامات کو آگے بھیجنے اور محفوظ کرنے سے محفوظ رکھا جائے گا۔",
+    "Home Assistant URL": "ہوم اسسٹنٹ یو آر ایل",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "آپ کے آلے/فون کا نام تلاش کرنے کے لیے \"اطلاعات\" تلاش کرنے کے لیے \"ڈیولپر ٹولز > سروسز\" کے تحت ہوم اسسٹنٹ میں اطلاعاتی خدمات کی فہرست مل سکتی ہے۔",
+    "Automations can optionally be triggered in Home Assistant:": "ہوم اسسٹنٹ میں آٹومیشن کو اختیاری طور پر متحرک کیا جا سکتا ہے:",
+    "Trigger type:": "محرک کی قسم:",
+    "Event type:": "تقریب کی قسم:",
+    "Event data:": "ایونٹ کا ڈیٹا:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "پھر ایک عمل کا انتخاب کریں، مثال کے طور پر منظر کو اس طرف تبدیل کریں جہاں RGB لائٹ سرخ ہو۔",
+    "Frontend Version": "فرنٹ اینڈ ورژن",
+    "Frontend Version do not match backend version!": "فرنٹ اینڈ ورژن پسدید ورژن سے مماثل نہیں ہے!",
+    "backupRecommend": "براہ کرم اس کے بجائے براہ راست والیوم یا ڈیٹا فولڈر (./data/) کا بیک اپ لیں۔",
+    "Optional": "اختیاری",
+    "or": "یا",
+    "Notification Service": "نوٹیفکیشن سروس"
 }

From 06ec7f2b61660213bc0129ec49485cfe2e1e0d4e Mon Sep 17 00:00:00 2001
From: tim-wiegers <hallobello17@gmail.com>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 740/803] Translated using Weblate (German)

Currently translated at 100.0% (704 of 704 strings)

Co-authored-by: tim-wiegers <hallobello17@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/de-DE.json | 72 ++++++++++++++++++++++++++++++++++-----------
 1 file changed, 55 insertions(+), 17 deletions(-)

diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 8d20e094..68bf1de3 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -2,7 +2,7 @@
     "languageName": "Deutsch (Deutschland)",
     "Settings": "Einstellungen",
     "Dashboard": "Dashboard",
-    "New Update": "Update verfügbar",
+    "New Update": "Aktualisierung verfügbar",
     "Language": "Sprache",
     "Appearance": "Erscheinungsbild",
     "Theme": "Erscheinungsbild",
@@ -278,7 +278,7 @@
     "Access Token": "Zugriffstoken",
     "Channel access token": "Channel access token",
     "Line Developers Console": "Zeile Entwickler Konsole",
-    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "lineDevConsoleTo": "Line Entwicklerkonsole - {0}",
     "Basic Settings": "Grundeinstellungen",
     "User ID": "User ID",
     "Messaging API": "Messaging API",
@@ -348,7 +348,7 @@
     "Services": "Dienste",
     "Discard": "Verwerfen",
     "Cancel": "Abbrechen",
-    "Powered by": "Powered by",
+    "Powered by": "Erstellt mit",
     "shrinkDatabaseDescription": "Löse VACUUM für die SQLite Datenbank aus. Wenn die Datenbank nach 1.10.0 erstellt wurde, ist AUTO_VACUUM bereits aktiviert und diese Aktion ist nicht erforderlich.",
     "serwersms": "SerwerSMS.pl",
     "serwersmsAPIUser": "API Benutzername (inkl. webapi_ prefix)",
@@ -533,7 +533,7 @@
     "Also check beta release": "Auch nach Beta Versionen schauen",
     "Using a Reverse Proxy?": "Wird ein Reverse Proxy genutzt?",
     "Check how to config it for WebSocket": "Prüfen, wie er für die Nutzung mit WebSocket konfiguriert wird",
-    "Steam Game Server": "Steam Game Server",
+    "Steam Game Server": "Steam Spielserver",
     "Most likely causes:": "Wahrscheinliche Ursachen:",
     "The resource is no longer available.": "Die Quelle ist nicht mehr verfügbar.",
     "There might be a typing error in the address.": "Es gibt einen Tippfehler in der Adresse.",
@@ -599,7 +599,7 @@
     "squadcast": "Squadcast",
     "SendKey": "SendKey",
     "SMSManager API Docs": "SMSManager API Dokumente",
-    "Gateway Type": "Gateway Type",
+    "Gateway Type": "Gateway Typ",
     "SMSManager": "SMSManager",
     "You can divide numbers with": "Du kannst Zahlen teilen mit",
     "or": "oder",
@@ -659,7 +659,7 @@
     "dataRetentionTimeError": "Aufbewahrungszeit muss 0 oder größer sein",
     "infiniteRetention": "Für unendliche Aufbewahrung auf 0 setzen.",
     "confirmDeleteTagMsg": "Möchten Sie dieses Tag wirklich löschen? Mit diesem Tag verknüpfte Monitore werden nicht gelöscht.",
-    "enableGRPCTls": "Erlaube das Senden von gRPC-Anfragen mit TLS-Verbindung",
+    "enableGRPCTls": "Senden von gRPC-Anforderungen mit TLS-Verbindung zulassen",
     "ZohoCliq": "ZohoCliq",
     "Monitor": "Überwachung | Monitore",
     "plugin": "Plugin | Plugins",
@@ -668,18 +668,18 @@
     "uninstall": "Deinstallieren",
     "uninstalling": "Deinstallation",
     "markdownSupported": "Markdown-Syntax unterstützt",
-    "wayToGetKookBotToken": "Anwendung erstellen und den Bot-Token {0} abrufen",
-    "wayToGetKookGuildID": "Schalten Sie den \"Entwicklermodus\" in den Kook-Einstellungen ein und klicken Sie mit der rechten Maustaste auf die Gilde, um ihre ID zu erhalten.",
-    "Guild ID": "Gilden-ID",
+    "wayToGetKookBotToken": "Erstellen Sie eine Anwendung und erhalten Sie Ihren Bot-Token unter {0}",
+    "wayToGetKookGuildID": "Schalten Sie den „Entwicklermodus“ in den Kook-Einstellungen ein und klicken Sie mit der rechten Maustaste auf die Gilde, um ihre ID zu erhalten",
+    "Guild ID": "Guild-ID",
     "Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung",
     "Free Mobile API Key": "Kostenloser Mobile API-Schlüssel",
     "Enable TLS": "Aktiviere TLS",
-    "Proto Service Name": "Proto Service Name",
-    "Proto Method": "Proto Methode",
-    "Proto Content": "Proto Inhalt",
-    "Economy": "Economy",
-    "Lowcost": "Lowcost-Modus",
-    "high": "High-Modus",
+    "Proto Service Name": "Name des Proto-Dienstes",
+    "Proto Method": "Proto-Methode",
+    "Proto Content": "Proto-Inhalt",
+    "Economy": "Wirtschaft",
+    "Lowcost": "Kostengünstig",
+    "high": "hoch",
     "promosmsAllowLongSMS": "Erlaube lange SMS",
     "General Monitor Type": "Allgemeiner Monitortyp",
     "smseagle": "SMSEagle",
@@ -689,12 +689,50 @@
     "smseagleRecipientType": "Empfängertyp",
     "smseagleRecipient": "Empfänger (mehrere müssen mit Komma getrennt werden)",
     "smseagleToken": "API-Zugriffstoken",
-    "smseagleUrl": "Deine SMSEagle-Geräte-URL",
+    "smseagleUrl": "Ihre SMSEagle-Geräte-URL",
     "Kook": "Kook",
     "smseagleEncoding": "Als Unicode senden",
     "smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)",
     "Google Analytics ID": "Google Analytics ID",
     "Edit Tag": "bearbeite Tag",
     "Server Address": "Server Adresse",
-    "Learn More": "Erfahre mehr"
+    "Learn More": "Erfahre mehr",
+    "Body Encoding": "Körperkodierung",
+    "Add API Key": "API Schlüssel hinzufügen",
+    "apiKey-active": "Aktiv",
+    "apiKey-expired": "Abgelaufen",
+    "apiKey-inactive": "Inaktiv",
+    "Expires": "Läuft ab",
+    "deleteAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel löschen willst?",
+    "Generate": "Generieren",
+    "API Keys": "API Schlüssel",
+    "Expiry": "Ablauf",
+    "Expiry date": "Ablaufdatum",
+    "Don't expire": "Nicht ablaufen",
+    "Continue": "Weiter",
+    "Add Another": "Hinzufügen",
+    "Clone Monitor": "Duplikat von",
+    "Clone": "Duplizieren",
+    "cloneOf": "Duplikat von {0}",
+    "pagertreeIntegrationUrl": "Integrations URL",
+    "pagertreeUrgency": "Dringlichkeit",
+    "pagertreeSilent": "Leise",
+    "pagertreeLow": "Niedrig",
+    "pagertreeMedium": "Medium",
+    "pagertreeHigh": "Hoch",
+    "pagertreeCritical": "Kritisch",
+    "pagertreeResolve": "Automatisch Auflösen",
+    "No API Keys": "Keine API Schlüssel",
+    "disableAPIKeyMsg": "Bist du sicher, dass du diesen API Schlüssel deaktivieren willst?",
+    "pagertreeDoNothing": "Nichts tun",
+    "wayToGetPagerTreeIntegrationURL": "Nachdem du die Uptime Kuma Integration in PagerTree erstellt hast, kopiere den Endpunkt. Siehe details {0}",
+    "telegramProtectContent": "Schütze gegen Weiterleiten/Speichern der Nachricht",
+    "telegramProtectContentDescription": "Die Bot-Nachrichten in Telegram sind gegen Weiterleitung und Speichern geschützt.",
+    "notificationRegional": "Regional",
+    "Key Added": "Schlüssel hinzugefügt",
+    "apiKeyAddedMsg": "Ihr API Schlüssel wurde hinzugefügt. Bitte notieren Sie Ihn, da er nicht erneut angezeigt wird.",
+    "telegramMessageThreadID": "(Optional) Nachrichten Thread ID",
+    "telegramMessageThreadIDDescription": "Optionale eindeutige Kennung für den Ziel-Thread (Thema) des Forums; nur für Forum-Supergroups",
+    "telegramSendSilently": "Stumm Senden",
+    "telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton."
 }

From 917f406f302bab84ed0d61bf2a17ecdad2143084 Mon Sep 17 00:00:00 2001
From: Justricity <social@justricity.de>
Date: Fri, 3 Mar 2023 08:50:55 +0000
Subject: [PATCH 741/803] Translated using Weblate (German)

Currently translated at 100.0% (704 of 704 strings)

Co-authored-by: Justricity <social@justricity.de>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/de-DE.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 68bf1de3..07fd82e4 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -388,7 +388,7 @@
     "Valid": "Gültig",
     "Invalid": "Ungültig",
     "AccessKeyId": "AccessKey ID",
-    "SecretAccessKey": "AccessKey Secret",
+    "SecretAccessKey": "Geheimer Zugangsschlüssel",
     "PhoneNumbers": "Telefonnummern",
     "TemplateCode": "Vorlagencode",
     "SignName": "Signaturname",

From 9fb190cc3c00ce5ef6071173980d100132fab767 Mon Sep 17 00:00:00 2001
From: ilya12077 <mr.ilya.1207@gmail.com>
Date: Fri, 3 Mar 2023 08:50:56 +0000
Subject: [PATCH 742/803] Translated using Weblate (Russian)

Currently translated at 93.1% (656 of 704 strings)

Translated using Weblate (Russian)

Currently translated at 92.1% (649 of 704 strings)

Co-authored-by: ilya12077 <mr.ilya.1207@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ru-RU.json | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index ec8f8008..4281fb42 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -233,7 +233,7 @@
     "smtpCC": "Копия",
     "smtpBCC": "Скрытая копия",
     "Discord Webhook URL": "Discord вебхук URL",
-    "wayToGetDiscordURL": "Вы можете создать его в  настройках канала \"Настройки -> Интеграции -> Создать Вебхук\"",
+    "wayToGetDiscordURL": "Вы можете создать его в настройках канала \"Настройки -> Интеграции -> Создать Вебхук\"",
     "Bot Display Name": "Отображаемое имя бота",
     "Prefix Custom Message": "Свой префикс сообщения",
     "Hello @everyone is...": "Привет {'@'}everyone это…",
@@ -669,7 +669,7 @@
     "smseagle": "SMSEagle",
     "Google Analytics ID": "ID Google Аналитики",
     "wayToGetZohoCliqURL": "Вы можете узнать как создать webhook URL тут {0}.",
-    "Effective Date Range": "Эффективный период",
+    "Effective Date Range": "Даты действия",
     "wayToGetKookGuildID": "Включите \"Developer mode\" в настройках Kook, а затем нажмите правой кнопкой по гильдии чтобы скопировать её ID.",
     "Enable TLS": "Включить TLS",
     "Integration Key": "Ключ интеграции",
@@ -694,5 +694,10 @@
     "telegramProtectContent": "Запретить пересылку/сохранение",
     "telegramProtectContentDescription": "Если включено, сообщения бота в Telegram будут запрещены для пересылки и сохранения.",
     "telegramSendSilently": "Отправить без звука",
-    "telegramSendSilentlyDescription": "Пользователи получат уведомление без звука."
+    "telegramSendSilentlyDescription": "Пользователи получат уведомление без звука.",
+    "Maintenance Time Window of a Day": "Суточный интервал для обслуживания",
+    "Clone Monitor": "Копия",
+    "Clone": "Копия",
+    "cloneOf": "Копия {0}",
+    "notificationRegional": "Региональный"
 }

From b433a8fe5a64d5e6f898d234e22088f109c581aa Mon Sep 17 00:00:00 2001
From: 401Unauthorized <hi@4o1.to>
Date: Fri, 3 Mar 2023 08:50:56 +0000
Subject: [PATCH 743/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (704 of 704 strings)

Co-authored-by: 401Unauthorized <hi@4o1.to>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index 3a46e96d..e26b64c7 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -726,5 +726,15 @@
     "API Keys": "API 密钥",
     "Don't expire": "从不过期",
     "Key Added": "API 密钥已生成",
-    "apiKeyAddedMsg": "你的 API 密钥已生成。此页只会显示一次,请妥当保存。"
+    "apiKeyAddedMsg": "你的 API 密钥已生成。此页只会显示一次,请妥当保存。",
+    "pagertreeUrgency": "紧急程度",
+    "pagertreeLow": "低",
+    "pagertreeCritical": "严重",
+    "pagertreeIntegrationUrl": "集成URL",
+    "pagertreeSilent": "静默",
+    "pagertreeMedium": "中",
+    "pagertreeHigh": "高",
+    "pagertreeResolve": "自动解除",
+    "pagertreeDoNothing": "什么都不做",
+    "wayToGetPagerTreeIntegrationURL": "在 PagerTree 中创建 Uptime Kuma 集成后,复制 Endpoint。在 {0} 查看详情"
 }

From ce767d23507ff3fe15f0c50d4620aacb4f745ca9 Mon Sep 17 00:00:00 2001
From: Oleg Logvinov <oleglogwinow@gmail.com>
Date: Fri, 3 Mar 2023 08:50:56 +0000
Subject: [PATCH 744/803] Translated using Weblate (Russian)

Currently translated at 93.1% (656 of 704 strings)

Co-authored-by: Oleg Logvinov <oleglogwinow@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ru-RU.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 4281fb42..5c403f69 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -670,7 +670,7 @@
     "Google Analytics ID": "ID Google Аналитики",
     "wayToGetZohoCliqURL": "Вы можете узнать как создать webhook URL тут {0}.",
     "Effective Date Range": "Даты действия",
-    "wayToGetKookGuildID": "Включите \"Developer mode\" в настройках Kook, а затем нажмите правой кнопкой по гильдии чтобы скопировать её ID.",
+    "wayToGetKookGuildID": "Включите \"Режим разработчика\" в настройках Kook, а затем нажмите правой кнопкой по гильдии чтобы скопировать её ID.",
     "Enable TLS": "Включить TLS",
     "Integration Key": "Ключ интеграции",
     "Integration URL": "URL интеграции",

From 7c1cca38dcbce11363c37cf4e088e23eec0fb6ab Mon Sep 17 00:00:00 2001
From: AnnAngela <naganjue@vip.qq.com>
Date: Fri, 3 Mar 2023 08:50:56 +0000
Subject: [PATCH 745/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (704 of 704 strings)

Co-authored-by: AnnAngela <naganjue@vip.qq.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index e26b64c7..5ec4e972 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -730,11 +730,11 @@
     "pagertreeUrgency": "紧急程度",
     "pagertreeLow": "低",
     "pagertreeCritical": "严重",
-    "pagertreeIntegrationUrl": "集成URL",
+    "pagertreeIntegrationUrl": "集成 URL 地址",
     "pagertreeSilent": "静默",
     "pagertreeMedium": "中",
     "pagertreeHigh": "高",
     "pagertreeResolve": "自动解除",
     "pagertreeDoNothing": "什么都不做",
-    "wayToGetPagerTreeIntegrationURL": "在 PagerTree 中创建 Uptime Kuma 集成后,复制 Endpoint。在 {0} 查看详情"
+    "wayToGetPagerTreeIntegrationURL": "在 PagerTree 中创建 Uptime Kuma 集成后,复制端点 URL 到此处。在 {0} 查看详情"
 }

From 901795729b579dbe1bad5e15ade3515621445a91 Mon Sep 17 00:00:00 2001
From: ilya12077 <mr.ilya.1207@gmail.com>
Date: Fri, 3 Mar 2023 08:50:56 +0000
Subject: [PATCH 746/803] Translated using Weblate (Russian)

Currently translated at 93.3% (657 of 704 strings)

Co-authored-by: ilya12077 <mr.ilya.1207@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ru-RU.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 5c403f69..0cefb55b 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -670,7 +670,7 @@
     "Google Analytics ID": "ID Google Аналитики",
     "wayToGetZohoCliqURL": "Вы можете узнать как создать webhook URL тут {0}.",
     "Effective Date Range": "Даты действия",
-    "wayToGetKookGuildID": "Включите \"Режим разработчика\" в настройках Kook, а затем нажмите правой кнопкой по гильдии чтобы скопировать её ID.",
+    "wayToGetKookGuildID": "Включите \"Режим разработчика\" в настройках Kook, а затем нажмите правой кнопкой по гильдии чтобы скопировать её ID",
     "Enable TLS": "Включить TLS",
     "Integration Key": "Ключ интеграции",
     "Integration URL": "URL интеграции",
@@ -687,7 +687,7 @@
     "Server Address": "Адрес сервера",
     "Learn More": "Узнать больше",
     "topicExplanation": "MQTT топик для мониторинга",
-    "Guild ID": "ID гильдии",
+    "Guild ID": "Guild ID",
     "Kook": "Kook",
     "wayToGetKookBotToken": "Создайте приложение и получите токен вашего бота тут {0}.",
     "Resend Notification if Down X times consecutively": "Повторная отправка уведомления при падении несколько раз",

From db5641c4bfae42b256b98420019eaaa8a187025e Mon Sep 17 00:00:00 2001
From: Cyril59310 <archas.cyril@hotmail.fr>
Date: Fri, 3 Mar 2023 08:50:56 +0000
Subject: [PATCH 747/803] Translated using Weblate (French)

Currently translated at 100.0% (704 of 704 strings)

Co-authored-by: Cyril59310 <archas.cyril@hotmail.fr>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 0552c298..1317da34 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -724,5 +724,15 @@
     "Generate": "Générer",
     "API Keys": "Clés API",
     "apiKeyAddedMsg": "Votre clé API a été ajoutée. Veuillez la noter car elle ne pourra plus être affichée.",
-    "Don't expire": "N'expire pas"
+    "Don't expire": "N'expire pas",
+    "pagertreeUrgency": "Urgence",
+    "pagertreeSilent": "Silencieux",
+    "pagertreeLow": "Faible",
+    "pagertreeMedium": "Moyen",
+    "pagertreeHigh": "Haut",
+    "pagertreeResolve": "Résolution automatique",
+    "pagertreeDoNothing": "Ne fais rien",
+    "pagertreeIntegrationUrl": "URL d'intégration",
+    "pagertreeCritical": "Critique",
+    "wayToGetPagerTreeIntegrationURL": "Après avoir créé l'intégration Uptime Kuma dans PagerTree, copiez le fichier Endpoint. Voir tous les détails {0}"
 }

From 010c7d681f7f052fe0f83edf36b941ca2da0d92a Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 4 Mar 2023 19:12:11 +0800
Subject: [PATCH 748/803] Fix ipv6 issue for ping

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

diff --git a/server/util-server.js b/server/util-server.js
index 129e1526..3d4314d6 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -87,11 +87,8 @@ exports.ping = async (hostname, size = 56) => {
         return await exports.pingAsync(hostname, false, size);
     } catch (e) {
         // If the host cannot be resolved, try again with ipv6
-        if (e.message.includes("service not known")) {
-            return await exports.pingAsync(hostname, true, size);
-        } else {
-            throw e;
-        }
+        // As node-ping does not report a specific error for this, try again with ipv6 no matter what.
+        return await exports.pingAsync(hostname, true, size);
     }
 };
 

From 92c9b8bb63b563c7a7700929b6f9c42de1f9cbab Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 4 Mar 2023 20:29:52 +0800
Subject: [PATCH 749/803] Fix ipv6 issue for ping

---
 server/util-server.js | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/server/util-server.js b/server/util-server.js
index 3d4314d6..9f7805cf 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -88,7 +88,14 @@ exports.ping = async (hostname, size = 56) => {
     } catch (e) {
         // If the host cannot be resolved, try again with ipv6
         // As node-ping does not report a specific error for this, try again with ipv6 no matter what.
-        return await exports.pingAsync(hostname, true, size);
+        console.debug("ping", "IPv6 error message: " + e.message);
+
+        if (!e.message) {
+            // TODO: Problem, the error message is always from the ipv6 ping! Misleading!
+            return await exports.pingAsync(hostname, true, size);
+        } else {
+            throw e;
+        }
     }
 };
 

From 7ec09d01185bbf35ff9fa2543167376aa0f2d44b Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 4 Mar 2023 20:41:08 +0800
Subject: [PATCH 750/803] Fix ipv6 issue for ping

---
 server/util-server.js | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/server/util-server.js b/server/util-server.js
index 9f7805cf..2cf81f6a 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -87,11 +87,10 @@ exports.ping = async (hostname, size = 56) => {
         return await exports.pingAsync(hostname, false, size);
     } catch (e) {
         // If the host cannot be resolved, try again with ipv6
-        // As node-ping does not report a specific error for this, try again with ipv6 no matter what.
         console.debug("ping", "IPv6 error message: " + e.message);
 
+        // As node-ping does not report a specific error for this, try again if it is an empty message with ipv6 no matter what.
         if (!e.message) {
-            // TODO: Problem, the error message is always from the ipv6 ping! Misleading!
             return await exports.pingAsync(hostname, true, size);
         } else {
             throw e;

From f17d23f5d8855bbe5fb0b242d9240427ca7b1238 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 4 Mar 2023 21:03:46 +0800
Subject: [PATCH 751/803] A script for sorting contributors from weblate

---
 extra/sort-contributors.js | 22 ++++++++++++++++++++++
 package.json               |  3 ++-
 2 files changed, 24 insertions(+), 1 deletion(-)
 create mode 100644 extra/sort-contributors.js

diff --git a/extra/sort-contributors.js b/extra/sort-contributors.js
new file mode 100644
index 00000000..418bc233
--- /dev/null
+++ b/extra/sort-contributors.js
@@ -0,0 +1,22 @@
+const fs = require("fs");
+
+// Read the file from private/sort-contributors.txt
+const file = fs.readFileSync("private/sort-contributors.txt", "utf8");
+
+// Convert to an array of lines
+let lines = file.split("\n");
+
+// Remove empty lines
+lines = lines.filter((line) => line !== "");
+
+// Remove duplicates
+lines = [ ...new Set(lines) ];
+
+// Remove @weblate and @UptimeKumaBot
+lines = lines.filter((line) => line !== "@weblate" && line !== "@UptimeKumaBot");
+
+// Sort the lines
+lines = lines.sort();
+
+// Output the lines, concat with " "
+console.log(lines.join(" "));
diff --git a/package.json b/package.json
index 8f808687..f413309a 100644
--- a/package.json
+++ b/package.json
@@ -64,7 +64,8 @@
         "cy:run:unit": "npx cypress run --browser chrome --headless --config-file ./config/cypress.frontend.config.js",
         "cypress-open": "concurrently -k -r \"node test/prepare-test-server.js && node server/server.js --port=3002 --data-dir=./data/test/\" \"cypress open --config-file ./config/cypress.config.js\"",
         "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go",
-        "depoly-demo-server": "node extra/deploy-demo-server.js"
+        "depoly-demo-server": "node extra/deploy-demo-server.js",
+        "sort-contributors": "node extra/sort-contributors.js"
     },
     "dependencies": {
         "@grpc/grpc-js": "~1.7.3",

From 3e6091299206e71afc9c217be652a75fa022a305 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 4 Mar 2023 21:08:21 +0800
Subject: [PATCH 752/803] Update node-ping

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 9d636ba9..52f27055 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
-                "@louislam/ping": "~0.4.2-mod.1",
+                "@louislam/ping": "~0.4.2-mod.2",
                 "@louislam/sqlite3": "15.1.2",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
@@ -4213,9 +4213,9 @@
             "integrity": "sha512-retLUN4TwCJ0QJDi9OCJwYVaXAz93NeOkEtEQL98M2bykBOxmURlP0YlfsuE46kItOOVZIWRYC3KsSLhQ1R2Qw=="
         },
         "node_modules/@louislam/ping": {
-            "version": "0.4.2-mod.1",
-            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.1.tgz",
-            "integrity": "sha512-KkRDo8qcF9kzzR0Hh8Iqz+XNnzKOdobUquP7UyBYrjxAB1jNT3qO0gvAZeDUknF28LXBPSzkiVlf1NG+tb/iyQ==",
+            "version": "0.4.2-mod.2",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.2.tgz",
+            "integrity": "sha512-4krrRGohYdhQOD+Mt0Q8e1Z05DEKntZ7TgiY1jYaqWrMz0H2XJyRh+mLPOUVPL5zSymiHsZiK2ZACXtp/d9Wxg==",
             "dependencies": {
                 "command-exists": "~1.2.9",
                 "q": "1.x",
@@ -22231,9 +22231,9 @@
             "integrity": "sha512-retLUN4TwCJ0QJDi9OCJwYVaXAz93NeOkEtEQL98M2bykBOxmURlP0YlfsuE46kItOOVZIWRYC3KsSLhQ1R2Qw=="
         },
         "@louislam/ping": {
-            "version": "0.4.2-mod.1",
-            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.1.tgz",
-            "integrity": "sha512-KkRDo8qcF9kzzR0Hh8Iqz+XNnzKOdobUquP7UyBYrjxAB1jNT3qO0gvAZeDUknF28LXBPSzkiVlf1NG+tb/iyQ==",
+            "version": "0.4.2-mod.2",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.2.tgz",
+            "integrity": "sha512-4krrRGohYdhQOD+Mt0Q8e1Z05DEKntZ7TgiY1jYaqWrMz0H2XJyRh+mLPOUVPL5zSymiHsZiK2ZACXtp/d9Wxg==",
             "requires": {
                 "command-exists": "~1.2.9",
                 "q": "1.x",
diff --git a/package.json b/package.json
index f413309a..2b96e103 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,7 @@
     },
     "dependencies": {
         "@grpc/grpc-js": "~1.7.3",
-        "@louislam/ping": "~0.4.2-mod.1",
+        "@louislam/ping": "~0.4.2-mod.2",
         "@louislam/sqlite3": "15.1.2",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",

From 0dce492226b58da0c3e20b6a4a3a04a4660b358c Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sat, 4 Mar 2023 21:08:39 +0800
Subject: [PATCH 753/803] Update to 1.21.0-beta.0

---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 52f27055..d568f5d3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.20.2",
+    "version": "1.21.0-beta.0",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.20.2",
+            "version": "1.21.0-beta.0",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
diff --git a/package.json b/package.json
index 2b96e103..5b2bda4a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.20.2",
+    "version": "1.21.0-beta.0",
     "license": "MIT",
     "repository": {
         "type": "git",

From 6de57f328336103ee15a0c65c77a209406c996ea Mon Sep 17 00:00:00 2001
From: Cyril59310 <70776486+cyril59310@users.noreply.github.com>
Date: Sat, 4 Mar 2023 15:08:14 +0100
Subject: [PATCH 754/803] Delete empty

---
 empty | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 empty

diff --git a/empty b/empty
deleted file mode 100644
index e69de29b..00000000

From 70bb69fc73257df6da80b1278d7bfc8f0f449fc1 Mon Sep 17 00:00:00 2001
From: cyril59310 <archas.cyril@hotmail.fr>
Date: Sat, 4 Mar 2023 15:17:20 +0100
Subject: [PATCH 755/803] add keys for translation

---
 src/components/notifications/LunaSea.vue | 4 ++--
 src/lang/en.json                         | 6 ++++--
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/components/notifications/LunaSea.vue b/src/components/notifications/LunaSea.vue
index 1ee4a8a5..ca21efcb 100644
--- a/src/components/notifications/LunaSea.vue
+++ b/src/components/notifications/LunaSea.vue
@@ -4,8 +4,8 @@
         <div class="form-text">
             <p>
                 <select id="lunasea-notification-target" v-model="$parent.notification.lunaseaTarget" class="form-select" required>
-                    <option value="device">Device</option>
-                    <option value="user">User</option>
+                    <option value="device">{{ $t("Device") }}</option>
+                    <option value="user">{{ $t("User") }}</option>
                 </select>
             </p>
         </div>
diff --git a/src/lang/en.json b/src/lang/en.json
index 8f28c8e3..22985318 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -442,7 +442,6 @@
     "Clone Monitor": "Clone Monitor",
     "Clone": "Clone",
     "cloneOf": "Clone of {0}",
-    "Description": "Description",
     "smtp": "Email (SMTP)",
     "secureOptionNone": "None / STARTTLS (25, 587)",
     "secureOptionTLS": "TLS (465)",
@@ -703,5 +702,8 @@
     "pagertreeCritical": "Critical",
     "pagertreeResolve": "Auto Resolve",
     "pagertreeDoNothing": "Do Nothing",
-    "wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}"
+    "wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}",
+    "Add New Tag": "Add new tag",
+    "Target": "target",
+    "Device ID": "Device ID"
 }

From ae5a683af84f30d7a3dfa8c177c0f89fe754142a Mon Sep 17 00:00:00 2001
From: stanol <stanol777@gmail.com>
Date: Sat, 4 Mar 2023 20:49:47 +0200
Subject: [PATCH 756/803] Fix typo

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

diff --git a/src/i18n.js b/src/i18n.js
index 8caf2f1c..8a8ba3d3 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -36,7 +36,7 @@ const languageList = {
     "et-EE": "eesti",
     "vi-VN": "Tiếng Việt",
     "zh-TW": "繁體中文 (台灣)",
-    "uk-UA": "Український",
+    "uk-UA": "Українська",
     "th-TH": "ไทย",
     "el-GR": "Ελληνικά",
     "yue": "繁體中文 (廣東話 / 粵語)",

From ce8eebc838ba3fff5fb36c87c1d93d831c88b7b1 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 5 Mar 2023 15:59:43 +0800
Subject: [PATCH 757/803] Fix #2880

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

diff --git a/server/server.js b/server/server.js
index b7308a5a..d7fd1398 100644
--- a/server/server.js
+++ b/server/server.js
@@ -143,6 +143,7 @@ const { generalSocketHandler } = require("./socket-handlers/general-socket-handl
 const { Settings } = require("./settings");
 const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent");
 const { pluginsHandler } = require("./socket-handlers/plugins-handler");
+const apicache = require("./modules/apicache");
 
 app.use(express.json());
 
@@ -884,6 +885,9 @@ let needSetup = false;
                     socket.userID,
                 ]);
 
+                // Fix #2880
+                apicache.clear();
+
                 callback({
                     ok: true,
                     msg: "Deleted Successfully.",

From 2dedc1cfbd2eab61ebcc5793ee4a949532d19405 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 7 Mar 2023 20:47:57 +0800
Subject: [PATCH 758/803] Fix #2776

---
 data/.gitkeep                        | 0
 server/model/maintenance_timeslot.js | 2 ++
 server/uptime-kuma-server.js         | 4 ++++
 3 files changed, 6 insertions(+)
 delete mode 100644 data/.gitkeep

diff --git a/data/.gitkeep b/data/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index 77643c2c..3e7076d8 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -41,6 +41,8 @@ class MaintenanceTimeslot extends BeanModel {
      * @returns {Promise<MaintenanceTimeslot>}
      */
     static async generateTimeslot(maintenance, minDate = null, removeExist = false) {
+        log.info("maintenance", "Generate Timeslot for maintenance id: " + maintenance.id);
+
         if (removeExist) {
             await R.exec("DELETE FROM maintenance_timeslot WHERE maintenance_id = ? ", [
                 maintenance.id
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index 0573f0d8..a9c2289e 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -272,6 +272,10 @@ class UptimeKumaServer {
     /** Load the timeslots for maintenance */
     async generateMaintenanceTimeslots() {
 
+        // Prevent #2776
+        // Remove duplicate maintenance_timeslot with same start_date, end_date and maintenance_id
+        await R.exec("DELETE FROM maintenance_timeslot WHERE id NOT IN (SELECT MIN(id) FROM maintenance_timeslot GROUP BY start_date, end_date, maintenance_id)");
+
         let list = await R.find("maintenance_timeslot", " generated_next = 0 AND start_date <= DATETIME('now') ");
 
         for (let maintenanceTimeslot of list) {

From 230de63460d957e0f04f8b02f37e37059ed0846e Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Wed, 8 Mar 2023 21:47:52 +0800
Subject: [PATCH 759/803] Fix: Disconnect redis after ping

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

diff --git a/server/util-server.js b/server/util-server.js
index 129e1526..5b29d284 100644
--- a/server/util-server.js
+++ b/server/util-server.js
@@ -405,6 +405,9 @@ exports.redisPingAsync = function (dsn) {
         });
         client.connect().then(() => {
             client.ping().then((res, err) => {
+                if (client.isOpen) {
+                    client.disconnect();
+                }
                 if (err) {
                     reject(err);
                 } else {

From 533bc1505b78297a4a9be86a95aafbdecc8db7e3 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 9 Mar 2023 22:03:23 +0800
Subject: [PATCH 760/803] Prevent generating duplicated timeslots

---
 server/model/maintenance_timeslot.js | 29 +++++++++++++++++++++++++---
 server/uptime-kuma-server.js         |  1 +
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/server/model/maintenance_timeslot.js b/server/model/maintenance_timeslot.js
index 3e7076d8..dad719c7 100644
--- a/server/model/maintenance_timeslot.js
+++ b/server/model/maintenance_timeslot.js
@@ -58,7 +58,14 @@ class MaintenanceTimeslot extends BeanModel {
             bean.start_date = maintenance.start_date;
             bean.end_date = maintenance.end_date;
             bean.generated_next = true;
-            return await R.store(bean);
+
+            if (!await this.isDuplicateTimeslot(bean)) {
+                await R.store(bean);
+                return bean;
+            } else {
+                log.debug("maintenance", "Duplicate timeslot, skip");
+                return null;
+            }
 
         } else if (maintenance.strategy === "recurring-interval") {
             // Prevent dead loop, in case interval_day is not set
@@ -144,6 +151,15 @@ class MaintenanceTimeslot extends BeanModel {
         }
     }
 
+    static async isDuplicateTimeslot(timeslot) {
+        let bean = await R.findOne("maintenance_timeslot", "maintenance_id = ? AND start_date = ? AND end_date = ?", [
+            timeslot.maintenance_id,
+            timeslot.start_date,
+            timeslot.end_date
+        ]);
+        return bean !== null;
+    }
+
     /**
      * Generate a next timeslot for all recurring types
      * @param maintenance
@@ -161,7 +177,7 @@ class MaintenanceTimeslot extends BeanModel {
 
         // Keep generating from the first possible date, until it is ok
         while (true) {
-            log.debug("timeslot", "startDateTime: " + startDateTime.format());
+            //log.debug("timeslot", "startDateTime: " + startDateTime.format());
 
             // Handling out of effective date range
             if (startDateTime.diff(dayjs.utc(maintenance.end_date)) > 0) {
@@ -193,7 +209,14 @@ class MaintenanceTimeslot extends BeanModel {
         bean.start_date = localToUTC(startDateTime);
         bean.end_date = localToUTC(endDateTime);
         bean.generated_next = false;
-        return await R.store(bean);
+
+        if (!await this.isDuplicateTimeslot(bean)) {
+            await R.store(bean);
+            return bean;
+        } else {
+            log.debug("maintenance", "Duplicate timeslot, skip");
+            return null;
+        }
     }
 }
 
diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js
index a9c2289e..3dd7ba93 100644
--- a/server/uptime-kuma-server.js
+++ b/server/uptime-kuma-server.js
@@ -271,6 +271,7 @@ class UptimeKumaServer {
 
     /** Load the timeslots for maintenance */
     async generateMaintenanceTimeslots() {
+        log.debug("maintenance", "Routine: Generating Maintenance Timeslots");
 
         // Prevent #2776
         // Remove duplicate maintenance_timeslot with same start_date, end_date and maintenance_id

From 6e0aa109bc335d8cf04c350923203bc57baa057d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 10 Mar 2023 15:36:23 +0800
Subject: [PATCH 761/803] Uppercase and improve language keys

---
 src/components/notifications/LunaSea.vue | 8 ++++----
 src/lang/en.json                         | 7 ++++---
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/components/notifications/LunaSea.vue b/src/components/notifications/LunaSea.vue
index ca21efcb..f87205d4 100644
--- a/src/components/notifications/LunaSea.vue
+++ b/src/components/notifications/LunaSea.vue
@@ -4,17 +4,17 @@
         <div class="form-text">
             <p>
                 <select id="lunasea-notification-target" v-model="$parent.notification.lunaseaTarget" class="form-select" required>
-                    <option value="device">{{ $t("Device") }}</option>
-                    <option value="user">{{ $t("User") }}</option>
+                    <option value="device">{{ $t("lunaseaDeviceID") }}</option>
+                    <option value="user">{{ $t("lunaseaUserID") }}</option>
                 </select>
             </p>
         </div>
         <div v-if="$parent.notification.lunaseaTarget === 'device'">
-            <label for="lunasea-device" class="form-label">{{ $t("Device ID") }}<span style="color: red;"><sup>*</sup></span></label>
+            <label for="lunasea-device" class="form-label">{{ $t("lunaseaDeviceID") }}<span style="color: red;"><sup>*</sup></span></label>
             <input id="lunasea-device" v-model="$parent.notification.lunaseaDevice" type="text" class="form-control">
         </div>
         <div v-if="$parent.notification.lunaseaTarget === 'user'">
-            <label for="lunasea-device" class="form-label">{{ $t("User ID") }}<span style="color: red;"><sup>*</sup></span></label>
+            <label for="lunasea-device" class="form-label">{{ $t("lunaseaUserID") }}<span style="color: red;"><sup>*</sup></span></label>
             <input id="lunasea-device" v-model="$parent.notification.lunaseaUserID" type="text" class="form-control">
         </div>
     </div>
diff --git a/src/lang/en.json b/src/lang/en.json
index 22985318..382ad229 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -154,6 +154,7 @@
     "Token": "Token",
     "Show URI": "Show URI",
     "Tags": "Tags",
+    "Add New Tag": "Add New Tag",
     "Add New below or Select...": "Add New below or Select…",
     "Tag with this name already exist.": "Tag with this name already exists.",
     "Tag with this value already exist.": "Tag with this value already exists.",
@@ -703,7 +704,7 @@
     "pagertreeResolve": "Auto Resolve",
     "pagertreeDoNothing": "Do Nothing",
     "wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}",
-    "Add New Tag": "Add new tag",
-    "Target": "target",
-    "Device ID": "Device ID"
+    "lunaseaTarget": "target",
+    "lunaseaDeviceID": "Device ID",
+    "lunaseaUserID": "User ID"
 }

From ba7af9b5696c8071200f2a492d34559a2cb0e798 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 10 Mar 2023 15:55:39 +0800
Subject: [PATCH 762/803] Uppercase and improve language keys

---
 src/components/notifications/LunaSea.vue | 2 +-
 src/lang/en.json                         | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/components/notifications/LunaSea.vue b/src/components/notifications/LunaSea.vue
index f87205d4..4c55b3c2 100644
--- a/src/components/notifications/LunaSea.vue
+++ b/src/components/notifications/LunaSea.vue
@@ -1,6 +1,6 @@
 <template>
     <div class="mb-3">
-        <label for="lunasea-notification-target" class="form-label">{{ $t("Target") }}<span style="color: red;"><sup>*</sup></span></label>
+        <label for="lunasea-notification-target" class="form-label">{{ $t("lunaseaTarget") }}<span style="color: red;"><sup>*</sup></span></label>
         <div class="form-text">
             <p>
                 <select id="lunasea-notification-target" v-model="$parent.notification.lunaseaTarget" class="form-select" required>
diff --git a/src/lang/en.json b/src/lang/en.json
index 382ad229..17852d4e 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -704,7 +704,7 @@
     "pagertreeResolve": "Auto Resolve",
     "pagertreeDoNothing": "Do Nothing",
     "wayToGetPagerTreeIntegrationURL": "After creating the Uptime Kuma integration in PagerTree, copy the Endpoint. See full details {0}",
-    "lunaseaTarget": "target",
+    "lunaseaTarget": "Target",
     "lunaseaDeviceID": "Device ID",
     "lunaseaUserID": "User ID"
 }

From 6a37a2a05b43b8fce60949daff19bd8f01b37637 Mon Sep 17 00:00:00 2001
From: simonghpub <simonpmt@gmail.com>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 763/803] Translated using Weblate (Danish)

Currently translated at 79.4% (559 of 704 strings)

Co-authored-by: simonghpub <simonpmt@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/da/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/da-DK.json | 87 +++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 80 insertions(+), 7 deletions(-)

diff --git a/src/lang/da-DK.json b/src/lang/da-DK.json
index 4aaa666c..50200e30 100644
--- a/src/lang/da-DK.json
+++ b/src/lang/da-DK.json
@@ -23,7 +23,7 @@
     "Status": "Status",
     "DateTime": "Dato / Tid",
     "Message": "Beskeder",
-    "No important events": "Inden vigtige begivenheder",
+    "No important events": "Ingen vigtige begivenheder",
     "Resume": "Fortsæt",
     "Edit": "Rediger",
     "Delete": "Slet",
@@ -43,7 +43,7 @@
     "URL": "URL",
     "Hostname": "Hostname",
     "Port": "Port",
-    "Heartbeat Interval": "Taktinterval",
+    "Heartbeat Interval": "Hjerteslag interval",
     "Retries": "Gentagelser",
     "retriesDescription": "Maksimalt antal gentagelser, før tjenesten markeres som inaktiv og sender en meddelelse.",
     "Advanced": "Avanceret",
@@ -152,7 +152,7 @@
     "Options": "Valgmuligheder",
     "Keep both": "Behold begge",
     "Tags": "Etiketter",
-    "Add New below or Select...": "Tilføj Nyt nedenfor eller Vælg ...",
+    "Add New below or Select...": "Tilføj Ny nedenfor eller Vælg…",
     "Tag with this name already exist.": "Et Tag med dette navn findes allerede.",
     "Tag with this value already exist.": "Et Tag med denne værdi findes allerede.",
     "color": "farve",
@@ -165,7 +165,7 @@
     "Indigo": "Indigo",
     "Purple": "Lilla",
     "Pink": "Pink",
-    "Search...": "Søg...",
+    "Search...": "Søg…",
     "Avg. Ping": "Gns. Ping",
     "Avg. Response": "Gns. Respons",
     "Entry Page": "Entry Side",
@@ -225,7 +225,7 @@
     "smtpCC": "CC",
     "smtpBCC": "BCC",
     "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "Du kan få dette ved at gå til Serverindstillinger -> Integrationer -> Opret webhook ",
+    "wayToGetDiscordURL": "Du kan få dette ved at gå til Serverindstillinger -> Integrationer -> Opret webhook",
     "Bot Display Name": "Bot Visningsnavn",
     "Prefix Custom Message": "Præfiks Brugerdefineret Besked",
     "Hello @everyone is...": "Hello {'@'}everyone is...",
@@ -313,7 +313,7 @@
     "Security": "Sikkerhed",
     "Steam API Key": "Steam API-nøgle",
     "Shrink Database": "Krymp Database",
-    "Pick a RR-Type...": "Vælg en RR-Type...",
+    "Pick a RR-Type...": "Vælg en RR-Type…",
     "Pick Accepted Status Codes...": "Vælg Accepterede Statuskoder...",
     "Default": "Standard",
     "HTTP Options": "HTTP Valgmuligheder",
@@ -507,5 +507,78 @@
     "weekdayShortTue": "Tir",
     "dnsPortDescription": "DNS server port. Standardværdien er 53. Du kan altid ændre porten.",
     "Valid To:": "Gyldig til:",
-    "Domain Name Expiry Notification": "Notifikation om udløb af domænenavn"
+    "Domain Name Expiry Notification": "Notifikation om udløb af domænenavn",
+    "Custom Monitor Type": "Brugerdefineret overvågningstype",
+    "API Keys": "API Nøgler",
+    "Don't expire": "Udløb aldrig",
+    "Continue": "Fortsæt",
+    "Add Another": "Tilføj en mere",
+    "Key Added": "Nøgle tilføjet",
+    "Add API Key": "Tilføj API Nøgle",
+    "No API Keys": "Ingen API nøgler",
+    "apiKey-active": "Aktiv",
+    "apiKey-expired": "Udløbet",
+    "apiKey-inactive": "Inaktiv",
+    "disableAPIKeyMsg": "Er du sikker på du vil deaktivere denne API nøgle?",
+    "Generate": "Generér",
+    "Game": "Spil",
+    "General Monitor Type": "Generel Overvågningstype",
+    "Clone Monitor": "Duplikér overvågning",
+    "Clone": "Duplikér",
+    "cloneOf": "Kopi af {0}",
+    "promosmsLogin": "API Login Navn",
+    "pushoversounds siren": "Sirene",
+    "pushoversounds none": "Ingen (lydløs)",
+    "smtpDkimSettings": "DKIM Indstillinger",
+    "documentation": "dokumentation",
+    "smtpDkimDomain": "Domænenavn",
+    "smtpDkimPrivateKey": "Privat nøgle",
+    "alertaApiEndpoint": "API Slutpunkt",
+    "alertaApiKey": "API Nøgle",
+    "smseagleEncoding": "Send som Unicode",
+    "onebotHttpAddress": "OneBot HTTP Adresse",
+    "onebotMessageType": "OneBot Meddelelse Type",
+    "onebotGroupMessage": "Gruppe",
+    "onebotPrivateMessage": "Privat",
+    "onebotUserOrGroupId": "Gruppe/Bruger ID",
+    "promosmsPassword": "API Adgangskode",
+    "recurringIntervalMessage": "Kør hver dag | Kør hver {0}. dag",
+    "smseagleTo": "Telefon numre",
+    "pagertreeIntegrationUrl": "Integration URL",
+    "pagertreeSilent": "Lydløs",
+    "pagertreeLow": "Lav",
+    "pagertreeMedium": "Mellem",
+    "pagertreeHigh": "Høj",
+    "pagertreeCritical": "Kritisk",
+    "pushoversounds vibrate": "Kun Vibration",
+    "Server Address": "Server Adresse",
+    "pauseMaintenanceMsg": "Er du sikker på du vil pause?",
+    "Recurring": "Tilbagevendende",
+    "Enable TLS": "Aktivér TLS",
+    "high": "høj",
+    "Base URL": "Base URL",
+    "Platform": "Platform",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "Retry": "Forsøg igen",
+    "Topic": "Emne",
+    "Setup Proxy": "Opsæt Proxy",
+    "Proxy Server": "Proxy Server",
+    "wayToGetClickSendSMSToken": "Du kan få API brugernavn og API nøgle fra {0} .",
+    "PushDeer Key": "PushDeer Nøgle",
+    "The resource is no longer available.": "Denne ressource er ikke længere tilgængelig.",
+    "Proxy Protocol": "Proxy Protokol",
+    "Integration Key": "Integration Nøgle",
+    "Integration URL": "Integration URL",
+    "do nothing": "gør intet",
+    "Passive Monitor Type": "Passiv Overvågningstype",
+    "Most likely causes:": "Mest sandsynlige årsager:",
+    "statusPageMaintenanceEndDate": "Slut",
+    "pushoversounds magic": "Magisk",
+    "pushoversounds mechanical": "Mekanisk",
+    "pushyAPIKey": "Hemmelig API Nøgle",
+    "Expiry date": "Udløbsdato",
+    "Expires": "Udløber",
+    "deleteAPIKeyMsg": "Er du sikker på du vil slette denne API nøgle?",
+    "pagertreeDoNothing": "Gør intet"
 }

From 4608560b1dc3333dbeabdef2479edc7344db7778 Mon Sep 17 00:00:00 2001
From: Donker_Jumala <weareh0711@gmail.com>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 764/803] Translated using Weblate (Japanese)

Currently translated at 72.3% (509 of 704 strings)

Co-authored-by: Donker_Jumala <weareh0711@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ja/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ja.json | 120 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 115 insertions(+), 5 deletions(-)

diff --git a/src/lang/ja.json b/src/lang/ja.json
index f29d9d5c..3d586904 100644
--- a/src/lang/ja.json
+++ b/src/lang/ja.json
@@ -274,8 +274,8 @@
     "Custom": "カスタム",
     "Created": "作成日時",
     "Resend Notification if Down X times consecutively": "X回連続でダウンしたら通知を再送する",
-    "webhookJsonDesc": "{0}はExpress.jsのような最新のHTTPサーバに適しています。",
-    "webhookFormDataDesc": "{multipart}はPHPに適しています。このJSONは{decodeFunction}でデコードする必要があります。",
+    "webhookJsonDesc": "{0}はExpress.jsのような最新のHTTPサーバに適しています",
+    "webhookFormDataDesc": "{multipart}はPHPに適しています。このJSONは{decodeFunction}でデコードする必要があります",
     "appriseInstalled": "Appriseはインストール済みです。",
     "emojiCheatSheet": "絵文字一覧: {0}",
     "Inactive": "無効",
@@ -320,7 +320,7 @@
     "Home Assistant URL": "ホームアシスタントURL",
     "Examples": "例",
     "telegramMessageThreadID": "(オプション) メッセージスレッドID",
-    "wayToGetLineNotifyToken": "{0}からアクセストークンを入手できます。",
+    "wayToGetLineNotifyToken": "{0}からアクセストークンを入手できます",
     "Packet Size": "パケットサイズ",
     "Bot Token": "ボットトークン",
     "Chat ID": "チャットID",
@@ -399,6 +399,116 @@
     "telegramSendSilentlyDescription": "通知せずにメッセージを送信します。通知音がなりません。",
     "supportTelegramChatID": "チャットやグループ、チャンネルのチャットIDに対応",
     "wayToGetTelegramChatID": "ボットにメッセージを送信し、以下のURLを開くとチャットIDのchat_idを入手できます。",
-    "chatIDNotFound": "チャットIDが存在しません。最初にメッセージをボットに送信してください。",
-    "disableCloudflaredNoAuthMsg": "認証が無効化されているため、パスワードは必要ありません。"
+    "chatIDNotFound": "チャットIDが存在しません。最初にメッセージをボットに送信してください",
+    "disableCloudflaredNoAuthMsg": "認証が無効化されているため、パスワードは必要ありません。",
+    "API Keys": "APIキー管理",
+    "Expiry": "期限切れ",
+    "Expiry date": "有効期限",
+    "No API Keys": "API Keyがありません",
+    "deleteAPIKeyMsg": "本当にこのAPIキーを削除しますか?",
+    "Generate": "生成",
+    "pauseMaintenanceMsg": "本当に一時停止しますか?",
+    "maintenanceStatus-under-maintenance": "メンテナンス中",
+    "secureOptionNone": "None / STARTTLS (25, 587)",
+    "smtp": "Email (SMTP)",
+    "Bot Display Name": "BOTの表示名",
+    "Prefix Custom Message": "メッセージの先頭に送信する文章",
+    "endpoint": "エンドポイント",
+    "Proxy Protocol": "Proxy Protocol",
+    "Google Analytics ID": "Google アナリティクス ID",
+    "Frontend Version do not match backend version!": "フロントエンドとバックエンドのバージョンが一致しません!",
+    "or": "または",
+    "Frontend Version": "フロントエンドのバージョン",
+    "promosmsPassword": "APIパスワード",
+    "Notification Sound": "通知音",
+    "Clone Monitor": "監視の複製",
+    "Clone": "複製",
+    "cloneOf": "{0} の複製",
+    "Hello @everyone is...": "Hello {'@'}everyone is…",
+    "Icon URL": "アイコンURL",
+    "affectedStatusPages": "メンテナンスメッセージを選択したステータスページに表示する",
+    "GoogleChat": "Google Chat (Google Workspace 限定)",
+    "pushyToken": "デバイストークン",
+    "SMS Type": "SMSタイプ",
+    "Proxy Server": "Proxy Server",
+    "smtpDkimDomain": "ドメイン名",
+    "Uptime Kuma URL": "Uptime Kuma URL",
+    "Channel Name": "チャンネル名",
+    "smtpDkimSettings": "DKIM設定",
+    "Server Address": "サーバーアドレス",
+    "strategyManual": "手動で有効/無効を切り替える",
+    "warningTimezone": "サーバーのタイムゾーンを使用します",
+    "weekdayShortMon": "月",
+    "weekdayShortTue": "火",
+    "weekdayShortWed": "水",
+    "weekdayShortFri": "金",
+    "weekdayShortSat": "土",
+    "weekdayShortSun": "日",
+    "dayOfWeek": "曜日ごと",
+    "dayOfMonth": "日にちごと",
+    "maintenanceStatus-inactive": "無効",
+    "maintenanceStatus-scheduled": "スケジュール済み",
+    "maintenanceStatus-ended": "終了済み",
+    "maintenanceStatus-unknown": "不明",
+    "Server Timezone": "サーバータイムゾーン",
+    "IconUrl": "アイコンURL",
+    "Enable DNS Cache": "DNSキャッシュを有効にする",
+    "Enable": "有効",
+    "Disable": "無効",
+    "Schedule Maintenance": "スケジュールメンテナンス",
+    "loadingError": "データを取得できません。後でもう一度試してください。",
+    "uninstall": "アンインストール",
+    "installing": "インストール中",
+    "Ignore TLS Error": "TLSエラーを無視",
+    "smtpCC": "CC",
+    "secureOptionTLS": "TLS (465)",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord ウェブフック URL",
+    "wayToCheckSignalURL": "こちらから設定方法を確認できます:",
+    "Number": "Number",
+    "Line Developers Console": "Line Developers Console",
+    "Access Token": "アクセストークン",
+    "Channel access token": "チャンネルアクセストークン",
+    "enableGRPCTls": "TLS接続でgRPCリクエストを送信できるようにする",
+    "Messaging API": "Messaging API",
+    "dnsPortDescription": "DNSサーバーポートのデフォルトは53です。ポートはいつでも変更可能です。",
+    "Device": "デバイス",
+    "Event type:": "イベントタイプ:",
+    "here": "こちら",
+    "weekdayShortThu": "木",
+    "plugin": "プラグイン",
+    "No Maintenance": "メンテナンスはありません",
+    "dnsCacheDescription": "一部のIPv6環境では動作しない場合があります。問題が発生した場合は無効にしてください。",
+    "uninstalling": "アンインストール中",
+    "confirmUninstallPlugin": "本当にこのプラグインをアンインストールしていいですか?",
+    "wayToGetDiscordURL": "サーバー設定 -> 連携サービス -> ウェブフックを確認 -> 新しいウェブフック から新たに取得できます",
+    "wayToGetTeamsURL": "ウェブフックの作成方法は {0}",
+    "wayToGetZohoCliqURL": "ウェブフックの作成方法は {0}",
+    "confirmDeleteTagMsg": "このタグを本当に削除してよろしいですか?このタグが付けられたモニターは削除されません。",
+    "deleteMaintenanceMsg": "このメンテナンスを本当に削除していいですか?",
+    "promosmsLogin": "APIログイン名",
+    "pushyAPIKey": "シークレットAPI Key",
+    "Message Title": "メッセージタイトル",
+    "Setup Proxy": "プロキシを設定する",
+    "Proxy server has authentication": "プロキシサーバーは認証が必要",
+    "Edit Tag": "タグを編集",
+    "Add API Key": "API Keyを追加",
+    "Expires": "有効期限",
+    "disableAPIKeyMsg": "本当にこのAPIキーを無効化しますか?",
+    "install": "インストール",
+    "affectedMonitorsDescription": "メンテナンスによって影響を受けるモニターを選択してください",
+    "default: notify all devices": "デフォルト:すべてのデバイスに通知する",
+    "Trigger type:": "トリガータイプ:",
+    "Event data:": "イベントデータ:",
+    "backupOutdatedWarning": "非推奨:多くの機能が追加され、このバックアップ機能は少しメンテナンスされていないため、完全なバックアップの生成や復元はできません。",
+    "backupRecommend": "代わりにボリュームまたはデータフォルダ(./data/)を直接バックアップしてください。",
+    "recurringInterval": "インターバル",
+    "Recurring": "繰り返し",
+    "lineDevConsoleTo": "Line Developers Console - {0}",
+    "Basic Settings": "基本設定",
+    "User ID": "User ID",
+    "Android": "Android",
+    "Huawei": "Huawei",
+    "Device Token": "デバイストークン",
+    "recurringIntervalMessage": "毎日1回実行する|{0} 日に1回実行する"
 }

From 35cf31ced1be20e608cea31e5282b916cc68b004 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <saibamenppl@gmail.com>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 765/803] Translated using Weblate (Polish)

Currently translated at 99.0% (697 of 704 strings)

Co-authored-by: Adam Stachowicz <saibamenppl@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pl/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/pl.json | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/src/lang/pl.json b/src/lang/pl.json
index 472b595c..1b61bc6b 100644
--- a/src/lang/pl.json
+++ b/src/lang/pl.json
@@ -696,5 +696,36 @@
     "Google Analytics ID": "Identyfikator Google Analytics",
     "Edit Tag": "Edytuj Tag",
     "Server Address": "Adres Serwera",
-    "Learn More": "Dowiedz się więcej"
+    "Learn More": "Dowiedz się więcej",
+    "Body Encoding": "Kodowanie treści",
+    "Expiry": "Wygasa",
+    "Expiry date": "Data wygaśnięcia",
+    "Don't expire": "Nie wygaszaj",
+    "Continue": "Kontynuuj",
+    "Add Another": "Dodaj kolejne",
+    "Add API Key": "Dodaj klucz API",
+    "No API Keys": "Brak kluczy API",
+    "apiKey-active": "Aktywny",
+    "apiKey-expired": "Wygasły",
+    "apiKey-inactive": "Nieaktywny",
+    "Expires": "Wygasa",
+    "Generate": "Generuj",
+    "disableAPIKeyMsg": "Czy na pewno chcesz wyłączyć ten klucz API?",
+    "deleteAPIKeyMsg": "Czy na pewno chcesz usunąć ten klucz API?",
+    "pagertreeIntegrationUrl": "URL integracji",
+    "pagertreeUrgency": "Pilność",
+    "pagertreeSilent": "Cichy",
+    "pagertreeLow": "Niski",
+    "pagertreeMedium": "Średni",
+    "pagertreeHigh": "Wysoki",
+    "pagertreeCritical": "Krytyczny",
+    "pagertreeResolve": "Automatyczne rozwiązywanie",
+    "Clone Monitor": "Klonuj monitor",
+    "Clone": "Klonuj",
+    "cloneOf": "Klon {0}",
+    "API Keys": "Klucze API",
+    "Key Added": "Klucz dodany",
+    "pagertreeDoNothing": "Nie rób nic",
+    "wayToGetPagerTreeIntegrationURL": "Po utworzeniu integracji Uptime Kuma w PagerTree, należy skopiować Endpoint. Zobacz pełne szczegóły {0}",
+    "notificationRegional": "Regionalne"
 }

From 86e9c8ade9f7570e15c52571ec7ee364425805f7 Mon Sep 17 00:00:00 2001
From: Yoswaris Lawpaiboon <konglha19@outlook.co.th>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 766/803] Translated using Weblate (Thai)

Currently translated at 81.9% (577 of 704 strings)

Co-authored-by: Yoswaris Lawpaiboon <konglha19@outlook.co.th>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/th/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/th-TH.json | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
index 9f5c78a1..c0c24760 100644
--- a/src/lang/th-TH.json
+++ b/src/lang/th-TH.json
@@ -473,8 +473,8 @@
     "Recipient Number": "หมายเลขผู้รับ",
     "From Name/Number": "จาก ชื่อ / หมายเลข",
     "Leave blank to use a shared sender number.": "ไม่ต้องกรอกเพื่อใช้ชื่อผู้ส่งร่วมกัน",
-    "Octopush API Version": "Octopush API Version",
-    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "Octopush API Version": "เวอร์ชั่น API Octopush",
+    "Legacy Octopush-DM": "Octopush-DM  แบบเก่า",
     "endpoint": "endpoint",
     "octopushAPIKey": "\"API key\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
     "octopushLogin": "\"Login\" จากข้อมูลยืนยันตัวตน HTTP API ในแผงควบคุม",
@@ -558,7 +558,7 @@
     "Container Name / ID": "Container Name / ID",
     "Docker Host": "Docker Host",
     "Docker Hosts": "Docker Hosts",
-    "ntfy Topic": "ntfy Topic",
+    "ntfy Topic": "หัวข้อ ntfy",
     "Domain": "โดเมน",
     "Workstation": "Workstation",
     "disableCloudflaredNoAuthMsg": "คุณอยู่ในโหมดไม่มีการตรวจสอบสิทธิ์, ไม่จำเป็นต้องมีรหัสผ่าน",
@@ -601,5 +601,9 @@
     "or": "หรือ",
     "recurringInterval": "ช่วงเวลา",
     "Recurring": "ทำซ้ำ",
-    "General Monitor Type": "ชนิดมอนิเตอร์ทั่วไป"
+    "General Monitor Type": "ชนิดมอนิเตอร์ทั่วไป",
+    "pagertreeCritical": "วิกฤต",
+    "pagertreeDoNothing": "ไม่ต้องทำอะไร",
+    "pagertreeResolve": "แก้ไขอัตโนมัติ",
+    "wayToGetPagerTreeIntegrationURL": "หลังจากสร้างการรวม Uptime Kuma ใน PagerTree แล้ว ให้คัดลอก Endpoint, ดูรายละเอียดทั้งหมด {0}"
 }

From 062191d61f9c4d7ea289eb20b1f391a361a9edcc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=96mer=20Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 767/803] Translated using Weblate (Turkish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (704 of 704 strings)

Co-authored-by: Ömer Faruk Genç <omer@farukgenc.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 9e5cffc6..95db2507 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -724,5 +724,15 @@
     "Generate": "oluştur",
     "API Keys": "api anahtarları",
     "Add Another": "Başka birtane ekle",
-    "apiKeyAddedMsg": "API anahtarınız eklendi. Bir daha gösterilmeyeceği için lütfen not edin."
+    "apiKeyAddedMsg": "API anahtarınız eklendi. Bir daha gösterilmeyeceği için lütfen not edin.",
+    "pagertreeUrgency": "Önem",
+    "pagertreeSilent": "Sessiz",
+    "pagertreeLow": "Düşük",
+    "pagertreeMedium": "Orta",
+    "pagertreeHigh": "Yüksek",
+    "pagertreeCritical": "Kritik",
+    "pagertreeDoNothing": "Hiçbir şey yapma",
+    "wayToGetPagerTreeIntegrationURL": "PagerTree'de Uptime Kuma entegrasyonunu oluşturduktan sonra Endpoint'i kopyalayın. Tüm ayrıntıları görün {0}",
+    "pagertreeIntegrationUrl": "Entegrasyon URL",
+    "pagertreeResolve": "Otomatik Çöz"
 }

From 1777270bb7fc01cd58cec60eb9b6329ae0b17ec6 Mon Sep 17 00:00:00 2001
From: stanol <stanol777@gmail.com>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 768/803] Translated using Weblate (Ukrainian)

Currently translated at 100.0% (704 of 704 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (704 of 704 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (704 of 704 strings)

Co-authored-by: stanol <stanol777@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/uk/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/uk-UA.json | 203 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 190 insertions(+), 13 deletions(-)

diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
index 9a63cfe0..3715e561 100644
--- a/src/lang/uk-UA.json
+++ b/src/lang/uk-UA.json
@@ -8,7 +8,7 @@
     "acceptedStatusCodesDescription": "Виберіть коди статусів для визначення доступності сервісу.",
     "passwordNotMatchMsg": "Повторення паролю не збігається.",
     "notificationDescription": "Прив'яжіть сповіщення до моніторів.",
-    "keywordDescription": "Пошук слова в чистому HTML або JSON-відповіді (чутливо до регістру)",
+    "keywordDescription": "Пошук слова в чистому HTML або JSON-відповіді. Пошук чутливий до регістру.",
     "pauseDashboardHome": "Пауза",
     "deleteMonitorMsg": "Ви дійсно хочете видалити цей монітор?",
     "deleteNotificationMsg": "Ви дійсно хочете видалити це сповіщення для всіх моніторів?",
@@ -124,12 +124,12 @@
     "Also apply to existing monitors": "Застосувати до існуючих моніторів",
     "Export": "Експорт",
     "Import": "Імпорт",
-    "backupDescription": "Ви можете зберегти резервну копію всіх моніторів та повідомлень у вигляді JSON-файлу",
+    "backupDescription": "Ви можете зберегти резервну копію всіх моніторів та повідомлень у вигляді JSON-файлу.",
     "backupDescription2": "P.S.: Історія та події збережені не будуть",
-    "backupDescription3": "Важливі дані, такі як токени повідомлень, додаються під час експорту, тому зберігайте файли в безпечному місці",
+    "backupDescription3": "Важливі дані, такі як токени повідомлень, додаються під час експорту, тому зберігайте файли в безпечному місці.",
     "alertNoFile": "Виберіть файл для імпорту.",
     "alertWrongFileType": "Виберіть JSON-файл.",
-    "twoFAVerifyLabel": "Будь ласка, введіть свій токен, щоб перевірити роботу 2FA",
+    "twoFAVerifyLabel": "Будь ласка, введіть свій токен, щоб перевірити роботу 2FA:",
     "tokenValidSettingsMsg": "Токен дійсний! Тепер ви можете зберегти налаштування 2FA.",
     "confirmEnableTwoFAMsg": "Ви дійсно хочете увімкнути 2FA?",
     "confirmDisableTwoFAMsg": "Ви дійсно хочете вимкнути 2FA?",
@@ -208,7 +208,7 @@
     "mattermost": "Mattermost",
     "Primary Base URL": "Основна URL",
     "Push URL": "URL пуша",
-    "needPushEvery": "Цю URL необхідно викликати кожні {0} секунд",
+    "needPushEvery": "Цю URL необхідно викликати кожні {0} секунд.",
     "pushOptionalParams": "Додаткові параметри: {0}",
     "defaultNotificationName": "Моє сповіщення {notification} ({number})",
     "here": "тут",
@@ -233,10 +233,10 @@
     "smtpCC": "Копія",
     "smtpBCC": "Прихована копія",
     "Discord Webhook URL": "Discord Вебхук URL",
-    "wayToGetDiscordURL": "Ви можете створити його в Параметрах сервера -> Інтеграції -> Створити вебхук",
+    "wayToGetDiscordURL": "Ви можете отримати його, перейшовши до Налаштування сервера -> Інтеграції -> Перегляд веб-хуків -> Новий веб-хук",
     "Bot Display Name": "Ім'я бота, що відображається",
     "Prefix Custom Message": "Свій префікс повідомлення",
-    "Hello @everyone is...": "Привіт {'@'}everyone це...",
+    "Hello @everyone is...": "Привіт {'@'}everyone це…",
     "Webhook URL": "URL вебхука",
     "wayToGetTeamsURL": "Як створити URL вебхука ви можете дізнатися тут - {0}.",
     "Номер": "Номер",
@@ -315,8 +315,8 @@
     "Certificate Chain": "Ланцюжок сертифікатів",
     "Valid": "Дійсний",
     "Hide Tags": "Приховати теги",
-    "Title": "Назва інциденту:",
-    "Content": "Зміст інциденту:",
+    "Title": "Заголовок",
+    "Content": "Зміст",
     "Post": "Опублікувати",
     "Cancel": "Скасувати",
     "Created": "Створено",
@@ -327,7 +327,7 @@
     "6h": "6 годин",
     "24h": "24 години",
     "1w": "1 тиждень",
-    "No monitors available.": "Немає доступних моніторів",
+    "No monitors available.": "Немає доступних моніторів.",
     "Add one": "Додати новий",
     "Backup": "Резервна копія",
     "Security": "Безпека",
@@ -336,7 +336,7 @@
     "About": "Про програму",
     "Description": "Опис",
     "Powered by": "Працює на основі скрипту від",
-    "shrinkDatabaseDescription": "Включає VACUUM для бази даних SQLite. Якщо база даних була створена на версії 1.10.0 і більше, AUTO_VACUUM вже включений і ця дія не потрібна.",
+    "shrinkDatabaseDescription": "Включає VACUUM для бази даних SQLite. Якщо база даних була створена після версії 1.10.0, AUTO_VACUUM вже включений і ця дія не потрібна.",
     "Style": "Стиль",
     "info": "ІНФО",
     "warning": "УВАГА",
@@ -437,7 +437,7 @@
     "Accept characters:": "Прийняти символи:",
     "startOrEndWithOnly": "Починається або закінчується лише {0}",
     "No consecutive dashes": "Немає послідовних тире",
-    "The slug is already taken. Please choose another slug.": "The slug is already taken. Please choose another slug.",
+    "The slug is already taken. Please choose another slug.": "Slug вже зайнятий. Будь ласка, виберіть інший slug.",
     "No Proxy": "Без проксі",
     "Page Not Found": "Сторінку не знайдено",
     "Reverse Proxy": "Реверсивний проксі",
@@ -563,5 +563,182 @@
     "Custom": "Нестандартний",
     "successMessage": "Повідомлення про успіх",
     "Customize": "Налаштувати",
-    "topic": "Тема"
+    "topic": "Тема",
+    "Body Encoding": "Кодування тіла",
+    "Event type:": "Тип події:",
+    "Event data:": "Дані подій:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "Потім виберіть дію, наприклад, перемкнути сцену на червоне світло RGB.",
+    "backupRecommend": "Будь ласка, натомість створіть резервну копію тому або теки даних (./data/) напряму.",
+    "Optional": "Необов'язково",
+    "recurringInterval": "Інтервал",
+    "Recurring": "Повторюваний",
+    "strategyManual": "Активний/Неактивний вручну",
+    "telegramSendSilently": "Надіслати беззвучно",
+    "telegramSendSilentlyDescription": "Надсилає повідомлення беззвучно. Користувачі отримають сповіщення без звуку.",
+    "Trigger type:": "Тип тригера:",
+    "dayOfWeek": "День тижня",
+    "lastDay": "Останній день",
+    "warningTimezone": "Використовується часовий пояс сервера",
+    "weekdayShortMon": "Пн",
+    "weekdayShortTue": "Вт",
+    "weekdayShortWed": "Ср",
+    "weekdayShortThu": "Чт",
+    "weekdayShortFri": "Пт",
+    "weekdayShortSun": "Нд",
+    "Single Maintenance Window": "Разове технічне обслуговування",
+    "Maintenance Time Window of a Day": "Період доби для технічного обслуговування",
+    "Effective Date Range": "Діапазон дат вступу в силу",
+    "Schedule Maintenance": "Розклад обслуговування",
+    "DateTime Range": "Діапазон дат і часу",
+    "loadingError": "Не вдалося отримати дані, спробуйте пізніше.",
+    "install": "Встановити",
+    "installing": "Встановлення",
+    "uninstall": "Видалити",
+    "API Keys": "API-ключі",
+    "Expiry": "Закінчення терміну дії",
+    "Expiry date": "Дата закінчення терміну дії",
+    "Don't expire": "Не прострочувати термін дії",
+    "Continue": "Продовжити",
+    "Add Another": "Додати ще",
+    "Key Added": "Ключ додано",
+    "No API Keys": "Немає API-ключів",
+    "apiKey-active": "Активний",
+    "apiKey-inactive": "Неактивний",
+    "Expires": "Термін дії закінчується",
+    "deleteAPIKeyMsg": "Ви впевнені, що хочете видалити цей API-ключ?",
+    "Generate": "Згенерувати",
+    "pagertreeIntegrationUrl": "URL-адреса інтеграції",
+    "pagertreeSilent": "Тихо",
+    "pagertreeUrgency": "Терміновість",
+    "pagertreeLow": "Низька",
+    "pagertreeMedium": "Середня",
+    "pagertreeHigh": "Висока",
+    "pagertreeCritical": "Критична",
+    "pagertreeResolve": "Автоматичне вирішення",
+    "Edit Tag": "Редагувати тег",
+    "Server Address": "Адреса сервера",
+    "Learn More": "Дізнатися більше",
+    "or": "або",
+    "uninstalling": "Видалення",
+    "confirmUninstallPlugin": "Ви дійсно хочете видалити цей плагін?",
+    "notificationRegional": "Регіональні",
+    "Clone Monitor": "Копія",
+    "Clone": "Скопіювати",
+    "cloneOf": "Копія {0}",
+    "Custom Footer": "Користувацький Footer",
+    "Strategy": "Стратегія",
+    "Free Mobile User Identifier": "ID користувача Free Mobile",
+    "SendKey": "SendKey",
+    "Gateway Type": "Тип шлюзу",
+    "You can divide numbers with": "Числа можна ділити за допомогою",
+    "Bark Group": "Bark група",
+    "Bark Sound": "Bark звук",
+    "Custom CSS": "Користувацький CSS",
+    "promosmsAllowLongSMS": "Дозволити довгі SMS",
+    "Feishu WebHookUrl": "Feishu WebHookURL",
+    "auto resolve": "автоматичне вирішення",
+    "RadiusCallingStationIdDescription": "Ідентифікатор пристрою, який викликає",
+    "telegramMessageThreadID": "(Необов'язково) ID теми повідомлення",
+    "telegramMessageThreadIDDescription": "Необов'язковий ID для цільової гілки повідомлень (теми) форуму; тільки для форумів супергруп",
+    "backupOutdatedWarning": "Застаріло: Оскільки було додано багато функцій і ця функція резервного копіювання дещо застаріла, вона не може створити або відновити повну резервну копію.",
+    "dnsCacheDescription": "Це може не працювати в деяких середовищах IPv6, вимкніть це, якщо у вас виникнуть проблеми.",
+    "deleteMaintenanceMsg": "Ви дійсно хочете видалити це технічне обслуговування?",
+    "dnsPortDescription": "Порт DNS-сервера. За замовчуванням 53. Ви можете змінити порт у будь-який час.",
+    "recurringIntervalMessage": "Запускати раз на день | Запускати раз на {0} дні(в)",
+    "SMSManager API Docs": "SMSManager API документація ",
+    "Base URL": "Базова URL-адреса",
+    "goAlertInfo": "GoAlert - це програма з відкритим вихідним кодом для планування викликів, автоматичної ескалації та сповіщень (наприклад, SMS або голосових дзвінків). Автоматично залучайте потрібну людину, потрібним чином і в потрібний час! {0}",
+    "goAlertIntegrationKeyInfo": "Отримайте універсальний ключ інтеграції API для сервісу у форматі \"aaaaaaaa-bbbb-bbbb-cccc-dddd-eeeeeeeeeeee\", зазвичай це значення параметра токену скопійованої URL-адреси.",
+    "wayToGetPagerDutyKey": "Ви можете отримати його, перейшовши до Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тут ви можете шукати \"Events API V2\". Більше інформації {0}",
+    "Google Analytics ID": "Google Analytics ID",
+    "apiKeyAddedMsg": "Ваш API-ключ додано. Будь ласка, запам'ятайте його, оскільки він більше не буде показаний.",
+    "Add API Key": "Додати API-ключ",
+    "apiKey-expired": "Прострочений",
+    "disableAPIKeyMsg": "Ви впевнені, що хочете деактивувати цей API-ключ?",
+    "pagertreeDoNothing": "Нічого не робити",
+    "wayToGetPagerTreeIntegrationURL": "Після створення інтеграції Uptime Kuma в PagerTree скопіюйте Endpoint. Дивіться повну інформацію {0}",
+    "Automations can optionally be triggered in Home Assistant:": "За бажанням можна активувати автоматизацію в Home Assistant:",
+    "dayOfMonth": "День місяця",
+    "telegramProtectContent": "Захист від пересилання/збереження",
+    "telegramProtectContentDescription": "Якщо увімкнено, повідомлення бота в Telegram будуть захищені від пересилання та збереження.",
+    "Notification Service": "Сервіс сповіщень",
+    "default: notify all devices": "за замовчуванням: сповіщати всі пристрої",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Список сервісів сповіщень можна знайти в Home Assistant в розділі \"Інструменти для розробників > Служби\", виконавши пошук за словом \"notification\" і знайшовши назву свого пристрою/телефону.",
+    "weekdayShortSat": "Сб",
+    "lastDay1": "Останній день місяця",
+    "lastDay2": "2-й останній день місяця",
+    "lastDay3": "3-й останній день місяця",
+    "lastDay4": "4-й останній день місяця",
+    "No Maintenance": "Немає технічного обслуговування",
+    "pauseMaintenanceMsg": "Ви впевнені, що хочете поставити на паузу?",
+    "maintenanceStatus-under-maintenance": "Перебуває на технічному обслуговуванні",
+    "maintenanceStatus-inactive": "Неактивне",
+    "maintenanceStatus-scheduled": "Заплановане",
+    "maintenanceStatus-ended": "Завершене",
+    "maintenanceStatus-unknown": "Невідоме",
+    "Display Timezone": "Відображати часовий пояс",
+    "Server Timezone": "Часовий пояс сервера",
+    "statusPageMaintenanceEndDate": "Закінчення",
+    "IconUrl": "URL-адреса іконки",
+    "Enable DNS Cache": "Увімкнути DNS-кеш",
+    "Enable": "Увімкнути",
+    "confirmDeleteTagMsg": "Ви впевнені, що хочете видалити цей тег? Монітори, пов'язані з цим тегом, не будуть видалені.",
+    "Guild ID": "ID гільдії",
+    "Free Mobile API Key": "Free Mobile API ключ",
+    "Enable TLS": "Увімкнути TLS",
+    "Proto Service Name": "Назва Proto-сервісу",
+    "Proto Content": "Вміст Proto",
+    "Proto Method": "Метод Proto",
+    "Economy": "Економічний",
+    "Lowcost": "Дешевий",
+    "Custom Monitor Type": "Користувацький тип монітора",
+    "topicExplanation": "MQTT тема для моніторингу",
+    "successMessageExplanation": "MQTT-повідомлення, яке буде вважатися успішним",
+    "HTTP Headers": "HTTP заголовки",
+    "Trust Proxy": "Довірений проксі",
+    "RadiusSecret": "Секрет Radius",
+    "RadiusSecretDescription": "Спільний секрет між клієнтом і сервером",
+    "RadiusCalledStationId": "ID станції, що викликається",
+    "Frontend Version": "Версія інтерфейсу",
+    "Frontend Version do not match backend version!": "Версія інтерфейсу не збігається з версією бекенду!",
+    "Number": "Номер",
+    "dataRetentionTimeError": "Період зберігання повинен бути 0 або більше",
+    "infiniteRetention": "Встановіть 0 для нескінченного зберігання.",
+    "affectedMonitorsDescription": "Виберіть монітори, які зачепить поточне технічне обслуговування",
+    "affectedStatusPages": "Показувати це повідомлення про технічне обслуговування на вибраних сторінках стану",
+    "atLeastOneMonitor": "Виберіть принаймні один монітор, який зазнав впливу",
+    "wayToGetKookBotToken": "Створіть заявку та отримайте токен бота тут {0}",
+    "wayToGetKookGuildID": "Увімкніть \"Режим розробника\" в налаштуваннях Kook і клацніть правою кнопкою миші на гільдії, щоб отримати її ID",
+    "Date and Time": "Дата і час",
+    "Integration Key": "Ключ інтеграції",
+    "Integration URL": "URL-адреса інтеграції",
+    "Auto resolve or acknowledged": "Автоматично вирішено або підтверджено",
+    "do nothing": "нічого не робити",
+    "auto acknowledged": "автоматично підтверджено",
+    "plugin": "Плагін | Плагіни",
+    "RadiusCalledStationIdDescription": "Ідентифікатор пристрою, що викликається",
+    "RadiusCallingStationId": "ID станції, яка викликає",
+    "Setup Docker Host": "Налаштування Docker-хосту",
+    "Connection Type": "Тип підключення",
+    "Docker Daemon": "Docker Daemon",
+    "socket": "Сокет",
+    "tcp": "TCP / HTTP",
+    "Container Name / ID": "Назва / ID контейнера",
+    "deleteDockerHostMsg": "Ви дійсно хочете видалити цей Docker-хост для всіх моніторів?",
+    "Docker Container": "Docker-контейнер",
+    "Docker Host": "Docker-хост",
+    "Docker Hosts": "Docker-хости",
+    "wayToGetZohoCliqURL": "Ви можете дізнатися, як створити URL-адресу веб-хука {0}.",
+    "enableGRPCTls": "Дозволити надсилати gRPC-запити з TLS-з'єднанням",
+    "grpcMethodDescription": "Ім'я методу перетворюється у формат cammelCase, наприклад, sayHello, check тощо.",
+    "Packet Size": "Розмір пакету",
+    "trustProxyDescription": "Довіряти заголовкам 'X-Forwarded-*'. Якщо ви хочете отримати правильний клієнтський IP, а ваш Uptime Kuma знаходиться за проксі-сервером, таким як Nginx або Apache, вам слід увімкнути цю опцію.",
+    "wayToGetLineNotifyToken": "Ви можете отримати токен доступу з {0}",
+    "Examples": "Приклади",
+    "Home Assistant URL": "URL-адреса Home Assistant",
+    "Long-Lived Access Token": "Довготривалий токен доступу",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Довготривалий токен доступу можна створити, натиснувши на ім'я вашого профілю (внизу ліворуч), прокрутивши його донизу і натиснувши кнопку Створити токен. ",
+    "high": "високий",
+    "Disable": "Вимкнути",
+    "Resend Notification if Down X times consecutively": "Повторно надіслати сповіщення, якщо було падіння X разів поспіль"
 }

From 1f13db26ccf41c60a63700cc414f5e5dbb074c76 Mon Sep 17 00:00:00 2001
From: ButterflyOfFire <butterflyoffire+uptimekuma@protonmail.com>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 769/803] Translated using Weblate (Arabic)

Currently translated at 96.5% (680 of 704 strings)

Added translation using Weblate (Arabic)

Co-authored-by: ButterflyOfFire <butterflyoffire+uptimekuma@protonmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ar/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ar.json | 688 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 688 insertions(+)
 create mode 100644 src/lang/ar.json

diff --git a/src/lang/ar.json b/src/lang/ar.json
new file mode 100644
index 00000000..0f6ca4af
--- /dev/null
+++ b/src/lang/ar.json
@@ -0,0 +1,688 @@
+{
+    "Edit": "تعديل",
+    "Delete": "حذف",
+    "Current": "حالي",
+    "Uptime": "مدة التشغيل",
+    "Monitor": "مراقب | مراقبات",
+    "day": "يوم | أيام",
+    "-day": "-يوم",
+    "hour": "ساعة",
+    "-hour": "-ساعة",
+    "Response": "استجاية",
+    "Ping": "بينغ",
+    "Monitor Type": "نوع المراقب",
+    "Cert Exp.": "انتهاء صَلاحِيَة شهادة الأمان SSL",
+    "Theme - Heartbeat Bar": "موضوع - بار نبضات",
+    "Normal": "طبيعي",
+    "Bottom": "الأسفل",
+    "None": "لا أحد",
+    "Current Password": "كلمة المرور الحالي",
+    "New Password": "كلمة سر جديدة",
+    "Repeat New Password": "كرر كلمة المرور الجديدة",
+    "Update Password": "تطوير كلمة السر",
+    "Disable Auth": "تعطيل المصادقة",
+    "Enable Auth": "تمكين المصادقة",
+    "disableauth.message1": "هل أنت متأكد من أن <strong> تعطيل المصادقة </strong>؟",
+    "disableauth.message2": "تم تصميمه للسيناريوهات <strong> حيث تنوي تنفيذ مصادقة الطرف الثالث </strong> أمام كوما في وقت التشغيل مثل CloudFlare Access Authelia أو آليات المصادقة الأخرى.",
+    "Please use this option carefully!": "الرجاء استخدام هذا الخيار بعناية!",
+    "Logout": "تسجيل خروج",
+    "Leave": "غادر",
+    "I understand, please disable": "أنا أفهم من فضلك تعطيل",
+    "Confirm": "يتأكد",
+    "Yes": "نعم",
+    "No": "رقم",
+    "Username": "اسم المستخدم",
+    "Password": "كلمة المرور",
+    "Remember me": "تذكرنى",
+    "Login": "تسجيل الدخول",
+    "No Monitors, please": "لا شاشات من فضلك",
+    "alertNoFile": "الرجاء تحديد ملف للاستيراد.",
+    "Skip existing": "تخطي الموجود",
+    "Search...": "يبحث…",
+    "Avg. Ping": "متوسط. بينغ",
+    "Avg. Response": "متوسط. إجابة",
+    "Entry Page": "صفحة الدخول",
+    "statusPageNothing": "لا شيء هنا الرجاء إضافة مجموعة أو شاشة.",
+    "No Services": "لا توجد خدمات",
+    "All Systems Operational": "جميع الأنظمة التشغيلية",
+    "Partially Degraded Service": "الخدمة المتدهورة جزئيا",
+    "Degraded Service": "خدمة متدهورة",
+    "Add Group": "أضف مجموعة",
+    "Add a monitor": "إضافة شاشة",
+    "Edit Status Page": "تحرير صفحة الحالة",
+    "Go to Dashboard": "الذهاب إلى لوحة القيادة",
+    "Status Page": "صفحة الحالة",
+    "Application Token": "رمز التطبيق",
+    "Server URL": "عنوان URL الخادم",
+    "Priority": "أولوية",
+    "Read more": "قراءة المزيد",
+    "topic": "عنوان",
+    "Last Updated": "التحديث الاخير",
+    "Unpin": "إلغاء",
+    "Show Tags": "أضهر العلامات",
+    "Add one": "أضف واحدا",
+    "wayToGetCloudflaredURL": "(قم بتنزيل CloudFlared من {0})",
+    "cloudflareWebsite": "موقع CloudFlare",
+    "Message:": ":رسالة",
+    "Don't know how to get the token? Please read the guide:": "لا أعرف كيفية الحصول على الرمز المميز؟ يرجى قراءة الدليل:",
+    "telegramSendSilently": "أرسل بصمت",
+    "telegramSendSilentlyDescription": "ترسل الرسالة بصمت ويتلقى المستخدمون إشعارا بدون صوت.",
+    "Enable": "يُمكَِن",
+    "notificationRegional": "إقليمي",
+    "Clone": "استنسخ",
+    "cloneOf": "مُستنسَخ من {0}",
+    "grpcMethodDescription": "يتم تحويل اسم الطريقة إلى تنسيق Cammelcase مثل Sayhello Check وما إلى ذلك.",
+    "acceptedStatusCodesDescription": "حدد رموز الحالة التي تعتبر استجابة ناجحة.",
+    "deleteNotificationMsg": "هل أنت متأكد من حذف هذا الإشعار لجميع الشاشات؟",
+    "dnsPortDescription": "منفذ خادم DNS. الافتراضيات إلى 53. يمكنك تغيير المنفذ في أي وقت.",
+    "pauseMonitorMsg": "هل أنت متأكد من أن تتوقف مؤقتًا؟",
+    "API Keys": "مفاتيح API",
+    "Expiry": "نهاية الصلاحية",
+    "Expiry date": "تاريخ نهاية الصلاحية",
+    "Continue": "مواصلة",
+    "Add Another": "إضافة آخر",
+    "Add API Key": "أضف مفتاح API",
+    "apiKey-active": "نشط",
+    "apiKey-expired": "منتهي الصلاحية",
+    "Generate": "توليد",
+    "Settings": "الإعدادات",
+    "Dashboard": "لوح التحكم",
+    "Help": "المساعدة",
+    "New Update": "تحديث جديد متوفر",
+    "Language": "اللغة",
+    "Appearance": "المظهر",
+    "Theme": "الحُلة",
+    "General": "العامة",
+    "Version": "الإصدار",
+    "Primary Base URL": "الرابط التشعبي الأساسي",
+    "Check Update On GitHub": "التحقق من التحديث على GitHub",
+    "Add New Monitor": "أضف شاشة جديدة",
+    "Quick Stats": "إحصائيات سريعة",
+    "Pending": "قيد الانتظار",
+    "General Monitor Type": "نوع الشاشة العامة",
+    "Passive Monitor Type": "نوع الشاشة السلبي",
+    "Specific Monitor Type": "نوع شاشة محدد",
+    "markdownSupported": "دعم صيغة Markdown",
+    "pauseDashboardHome": "وقفة",
+    "Pause": "إيقاف مؤقت",
+    "Name": "الاسم",
+    "Status": "الحالة",
+    "DateTime": "الوقت والتاريخ",
+    "Message": "الرسالة",
+    "No important events": "لا توجد أحداث مهمة",
+    "Resume": "استمرار",
+    "Keyword": "كلمة مفتاحية",
+    "Friendly Name": "اسم معروف",
+    "URL": "عنوان URL",
+    "Hostname": "اسم المضيف",
+    "Port": "المنفذ",
+    "Heartbeat Interval": "فاصل نبضات القلب",
+    "Add": "إضافة",
+    "Up": "متصل",
+    "Down": "غير متصل",
+    "Maintenance": "الصيانة",
+    "Unknown": "مجهول",
+    "Retries": "يحاول مجدداً",
+    "Heartbeat Retry Interval": "الفاصل الزمني لإعادة محاكمة نبضات القلب",
+    "Resend Notification if Down X times consecutively": "إعادة تقديم الإخطار إذا انخفض x مرات بالتالي",
+    "Advanced": "متقدم",
+    "checkEverySecond": "تحقق من كل {0} ثانية",
+    "retryCheckEverySecond": "أعد محاولة كل {0} ثانية",
+    "resendEveryXTimes": "إعادة تقديم كل {0} مرات",
+    "resendDisabled": "إعادة الالتزام بالتعطيل",
+    "retriesDescription": "الحد الأقصى لإعادة المحاولة قبل تمييز الخدمة على أنها لأسفل وإرسال إشعار",
+    "ignoreTLSError": "تجاهل خطأ TLS/SSL لمواقع HTTPS",
+    "upsideDownModeDescription": "اقلب الحالة رأسًا على عقب. إذا كانت الخدمة قابلة للوصول إلى أسفل.",
+    "maxRedirectDescription": "الحد الأقصى لعدد إعادة التوجيه لمتابعة. ضبط على 0 لتعطيل إعادة التوجيه.",
+    "Upside Down Mode": "وضع أسفل أسفل",
+    "Max. Redirects": "الأعلى. إعادة التوجيه",
+    "Accepted Status Codes": "رموز الحالة المقبولة",
+    "Push URL": "دفع عنوان URL",
+    "needPushEvery": "يجب عليك استدعاء عنوان URL هذا كل ثانية.",
+    "pushOptionalParams": "المعلمات الاختيارية",
+    "Save": "يحفظ",
+    "Notifications": "إشعارات",
+    "Not available, please setup.": "غير متوفر من فضلك الإعداد.",
+    "Setup Notification": "إشعار الإعداد",
+    "Light": "نور",
+    "Dark": "داكن",
+    "Auto": "آلي",
+    "Timezone": "وحدة زمنية",
+    "Search Engine Visibility": "محرك بحث الرؤية",
+    "Allow indexing": "السماح الفهرسة",
+    "Discourage search engines from indexing site": "تثبيط محركات البحث من موقع الفهرسة",
+    "Change Password": "غير كلمة السر",
+    "add one": "أضف واحدا",
+    "Notification Type": "نوع إعلام",
+    "Email": "بريد إلكتروني",
+    "Test": "امتحان",
+    "Certificate Info": "معلومات الشهادة",
+    "Resolver Server": "خادم Resolver",
+    "Resource Record Type": "نوع سجل الموارد",
+    "Last Result": "اخر نتيجة",
+    "Create your admin account": "إنشاء حساب المسؤول الخاص بك",
+    "Repeat Password": "اعد كلمة السر",
+    "Import Backup": "استيراد النسخ الاحتياطي",
+    "Export Backup": "النسخ الاحتياطي تصدير",
+    "Export": "يصدّر",
+    "Import": "يستورد",
+    "respTime": "resp. الوقت (MS)",
+    "notAvailableShort": "ن/أ",
+    "Default enabled": "التمكين الافتراضي",
+    "Apply on all existing monitors": "تنطبق على جميع الشاشات الحالية",
+    "Create": "خلق",
+    "Clear Data": "امسح البيانات",
+    "Events": "الأحداث",
+    "Heartbeats": "نبضات القلب",
+    "Schedule maintenance": "جدولة الصيانة",
+    "Affected Monitors": "الشاشات المتأثرة",
+    "Pick Affected Monitors...": "اختر الشاشات المتأثرة …",
+    "Start of maintenance": "بداية الصيانة",
+    "All Status Pages": "جميع صفحات الحالة",
+    "Select status pages...": "حدد صفحات الحالة …",
+    "alertWrongFileType": "الرجاء تحديد ملف JSON.",
+    "Clear all statistics": "مسح جميع الإحصاءات",
+    "Overwrite": "الكتابة فوق",
+    "Options": "خيارات",
+    "Keep both": "احتفظ بكليهما",
+    "Verify Token": "تحقق من الرمز المميز",
+    "Setup 2FA": "الإعداد 2FA",
+    "Enable 2FA": "تمكين 2FA",
+    "Disable 2FA": "تعطيل 2FA",
+    "2FA Settings": "2FA إعدادات",
+    "Two Factor Authentication": "توثيق ذو عاملين",
+    "Active": "نشيط",
+    "Inactive": "غير نشط",
+    "Token": "رمز",
+    "Show URI": "أظهر URI",
+    "Tags": "العلامات",
+    "Add New below or Select...": "إضافة جديد أدناه أو تحديد …",
+    "Tag with this name already exist.": "علامة مع هذا الاسم موجود بالفعل.",
+    "Tag with this value already exist.": "علامة مع هذه القيمة موجودة بالفعل.",
+    "color": "اللون",
+    "value (optional)": "القيمة (اختياري)",
+    "Gray": "رمادي",
+    "Red": "أحمر",
+    "Orange": "البرتقالي",
+    "Green": "لون أخضر",
+    "Blue": "أزرق",
+    "Indigo": "النيلي",
+    "Purple": "نفسجي",
+    "webhookAdditionalHeadersDesc": "يحدد رؤوس إضافية مرسلة مع webhook.",
+    "Webhook URL": "Webhook URL",
+    "Pink": "لون القرنفل",
+    "Custom": "العادة",
+    "Status Pages": "صفحات الحالة",
+    "defaultNotificationName": "تنبيه {الإخطار} ({number})",
+    "here": "هنا",
+    "Required": "مطلوب",
+    "Post URL": "بعد عنوان URL",
+    "Content Type": "نوع المحتوى",
+    "webhookJsonDesc": "{0} مفيد لأي خوادم HTTP الحديثة مثل Express.js",
+    "webhookFormDataDesc": "{multipart} مفيد لـ PHP. سيحتاج JSON إلى تحليل {decodefunction}",
+    "webhookAdditionalHeadersTitle": "رؤوس إضافية",
+    "emojiCheatSheet": "ورقة الغش في الرموز التعبيرية",
+    "appriseInstalled": "تم تثبيت Prosise.",
+    "appriseNotInstalled": "الإبرام غير مثبت. {0}",
+    "Method": "طريقة",
+    "Body": "الجسم",
+    "Headers": "الرؤوس",
+    "PushUrl": "دفع عنوان URL",
+    "HeadersInvalidFormat": "رؤوس الطلبات غير صالحة JSON ",
+    "BodyInvalidFormat": "هيئة الطلب غير صالحة JSON ",
+    "Monitor History": "مراقبة التاريخ",
+    "clearDataOlderThan": "الحفاظ على بيانات سجل المراقبة للأيام {0}.",
+    "PasswordsDoNotMatch": "كلمة المرور غير مطابقة.",
+    "records": "السجلات",
+    "One record": "سجل واحد",
+    "steamApiKeyDescription": "لمراقبة خادم لعبة Steam ، تحتاج إلى مفتاح Steam Web-API. يمكنك تسجيل مفتاح API الخاص بك هنا ",
+    "Current User": "المستخدم الحالي",
+    "topicExplanation": "موضوع MQTT لرصد",
+    "successMessage": "نجاح رسالة",
+    "successMessageExplanation": "رسالة MQTT التي ستعتبر نجاحًا",
+    "recent": "الأخيرة",
+    "Done": "فعله",
+    "Info": "معلومات",
+    "Security": "حماية",
+    "Steam API Key": "مفتاح API Steam",
+    "Shrink Database": "تقلص قاعدة البيانات",
+    "Pick a RR-Type...": "اختر نوع RR …",
+    "Pick Accepted Status Codes...": "اختر أكواد الحالة المقبولة …",
+    "Default": "تقصير",
+    "HTTP Options": "خيارات HTTP",
+    "Create Incident": "إنشاء حادث",
+    "Title": "لقب",
+    "Content": "المحتوى",
+    "Style": "أسلوب",
+    "info": "معلومات",
+    "warning": "تحذير",
+    "danger": "خطر",
+    "error": "خطأ",
+    "critical": "شديد الأهمية",
+    "primary": "الأولية",
+    "light": "نور",
+    "dark": "ظلام",
+    "Post": "بريد",
+    "Please input title and content": "الرجاء إدخال العنوان والمحتوى",
+    "Created": "مخلوق",
+    "Switch to Light Theme": "التبديل إلى موضوع الضوء",
+    "Switch to Dark Theme": "التبديل إلى موضوع الظلام",
+    "Hide Tags": "إخفاء العلامات",
+    "Description": "وصف",
+    "No monitors available.": "لا شاشات المتاحة.",
+    "No Monitors": "لا شاشات",
+    "Untitled Group": "مجموعة بلا عنوان",
+    "Services": "خدمات",
+    "Discard": "تجاهل",
+    "Cancel": "يلغي",
+    "Powered by": "مشغل بواسطة",
+    "shrinkDatabaseDescription": "تشغيل فراغ قاعدة البيانات لـ SQLite. إذا تم إنشاء قاعدة البيانات الخاصة بك بعد تمكين 1.10.0 AUTO_VACUUM بالفعل ولا يلزم هذا الإجراء.",
+    "Customize": "يعدل أو يكيف",
+    "Custom Footer": "تذييل مخصص",
+    "Custom CSS": "لغة تنسيق ويب حسب الطلب",
+    "deleteStatusPageMsg": "هل أنت متأكد من حذف صفحة الحالة هذه؟",
+    "Proxies": "وكلاء",
+    "default": "تقصير",
+    "enabled": "تمكين",
+    "setAsDefault": "تعيين كافتراضي",
+    "deleteProxyMsg": "هل أنت متأكد من حذف هذا الوكيل لجميع الشاشات؟",
+    "proxyDescription": "يجب تعيين الوكلاء إلى شاشة للعمل.",
+    "enableProxyDescription": "لن يؤثر هذا الوكيل على طلبات الشاشة حتى يتم تنشيطه. يمكنك التحكم مؤقتًا في تعطيل الوكيل من جميع الشاشات حسب حالة التنشيط.",
+    "setAsDefaultProxyDescription": "سيتم تمكين هذا الوكيل افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الوكيل بشكل منفصل لكل شاشة.",
+    "Certificate Chain": "سلسلة الشهادة",
+    "Valid": "صالح",
+    "Invalid": "غير صالح",
+    "User": "المستعمل",
+    "Installed": "المثبتة",
+    "Not installed": "غير مثبت",
+    "Running": "جري",
+    "Not running": "لا يعمل",
+    "Remove Token": "إزالة الرمز المميز",
+    "Start": "بداية",
+    "Stop": "قف",
+    "Add New Status Page": "أضف صفحة حالة جديدة",
+    "Slug": "سبيكة",
+    "Accept characters:": "قبول الأحرف:",
+    "startOrEndWithOnly": "ابدأ أو ينتهي بـ {0} فقط",
+    "No consecutive dashes": "لا شرطات متتالية",
+    "Next": "التالي",
+    "The slug is already taken. Please choose another slug.": "تم أخذ سبيكة بالفعل. الرجاء اختيار سبيكة أخرى.",
+    "No Proxy": "لا الوكيل",
+    "Authentication": "المصادقة",
+    "HTTP Basic Auth": "HTTP الأساسي Auth",
+    "New Status Page": "صفحة حالة جديدة",
+    "Page Not Found": "الصفحة غير موجودة",
+    "Reverse Proxy": "وكيل عكسي",
+    "Backup": "دعم",
+    "About": "عن",
+    "The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "قد يضيع الاتصال الحالي إذا كنت تتصل حاليًا عبر نفق CloudFlare. هل أنت متأكد تريد إيقافها؟ اكتب كلمة المرور الحالية لتأكيدها.",
+    "HTTP Headers": "رؤوس HTTP",
+    "Trust Proxy": "الوكيل الثقة",
+    "Other Software": "برامج أخرى",
+    "For example: nginx, Apache and Traefik.": "على سبيل المثال: nginx و Apache و Traefik.",
+    "Please read": "يرجى القراءة",
+    "Subject:": "موضوع:",
+    "Valid To:": "صالحة ل:",
+    "Days Remaining:": "الأيام المتبقية:",
+    "Issuer:": "المُصدر:",
+    "Fingerprint:": "بصمة:",
+    "No status pages": "لا صفحات الحالة",
+    "Domain Name Expiry Notification": "اسم النطاق إشعار انتهاء الصلاحية",
+    "Proxy": "الوكيل",
+    "Date Created": "تاريخ الإنشاء",
+    "Footer Text": "نص تذييل",
+    "Show Powered By": "عرض مدعوم من قبل",
+    "Domain Names": "أسماء المجال",
+    "signedInDisp": "وقعت في {0}",
+    "signedInDispDisabled": "معاق المصادقة.",
+    "RadiusSecret": "سر نصف القطر",
+    "RadiusSecretDescription": "السر المشترك بين العميل والخادم",
+    "RadiusCalledStationId": "يسمى معرف المحطة",
+    "RadiusCalledStationIdDescription": "معرف الجهاز المتصل",
+    "RadiusCallingStationId": "معرف محطة الاتصال",
+    "RadiusCallingStationIdDescription": "معرف جهاز الاتصال",
+    "Certificate Expiry Notification": "إشعار انتهاء الصلاحية",
+    "API Username": "اسم المستخدم API",
+    "API Key": "مفتاح API",
+    "Show update if available": "عرض التحديث إذا كان ذلك متاحًا",
+    "Also check beta release": "تحقق أيضًا من الإصدار التجريبي",
+    "Using a Reverse Proxy?": "باستخدام وكيل عكسي؟",
+    "Check how to config it for WebSocket": "تحقق من كيفية تكوينه لـ WebSocket",
+    "Steam Game Server": "خادم لعبة البخار",
+    "Most likely causes:": "الأسباب المرجحة:",
+    "The resource is no longer available.": "لم يعد المورد متاحًا.",
+    "There might be a typing error in the address.": "قد يكون هناك خطأ مطبعي في العنوان.",
+    "What you can try:": "ماذا تستطيع أن تجرب:",
+    "Retype the address.": "اعد كتابة العنوان.",
+    "Go back to the previous page.": "عد للصفحة السابقة.",
+    "Coming Soon": "قريبا",
+    "Connection String": "سلسلة الاتصال",
+    "Query": "استفسار",
+    "settingsCertificateExpiry": "شهادة TLS انتهاء الصلاحية",
+    "certificationExpiryDescription": "شاشات HTTPS تضيء عندما تنتهي شهادة TLS في",
+    "Setup Docker Host": "إعداد مضيف Docker",
+    "Connection Type": "نوع الاتصال",
+    "Docker Daemon": "Docker Daemon",
+    "deleteDockerHostMsg": "هل أنت متأكد من حذف مضيف Docker لجميع الشاشات؟",
+    "socket": "قابس كهرباء",
+    "tcp": "TCP / HTTP",
+    "Docker Container": "حاوية Docker",
+    "Container Name / ID": "اسم الحاوية / معرف",
+    "Docker Host": "مضيف Docker",
+    "Docker Hosts": "مضيفي Docker",
+    "Domain": "اِختِصاص",
+    "Workstation": "محطة العمل",
+    "Packet Size": "حجم الحزمة",
+    "Bot Token": "رمز الروبوت",
+    "wayToGetTelegramToken": "يمكنك الحصول على رمز من {0}.",
+    "Chat ID": "معرف الدردشة",
+    "telegramMessageThreadID": "معرف المواضيع",
+    "supportTelegramChatID": "دعم الدردشة المباشرة / معرف الدردشة للقناة",
+    "wayToGetTelegramChatID": "يمكنك الحصول على معرف الدردشة الخاص بك عن طريق إرسال رسالة إلى الروبوت والانتقال إلى عنوان URL هذا لعرض Chat_id",
+    "YOUR BOT TOKEN HERE": "رمز الروبوت الخاص بك هنا",
+    "chatIDNotFound": "لم يتم العثور على معرف الدردشة ؛ الرجاء إرسال رسالة إلى هذا الروبوت أولاً",
+    "disableCloudflaredNoAuthMsg": "أنت في وضع مصادقة لا توجد كلمة مرور غير مطلوبة.",
+    "trustProxyDescription": "ثق في رؤوس \"X-Forwarded- *\". إذا كنت ترغب في الحصول على عنوان IP الصحيح للعميل وكان Uptime Kuma خلف وكيل مثل Nginx أو Apache ، فيجب عليك تمكين هذا.",
+    "wayToGetLineNotifyToken": "يمكنك الحصول على رمز الوصول من {0}",
+    "Examples": "أمثلة",
+    "Home Assistant URL": "Home Assistant URL",
+    "Long-Lived Access Token": "الرمز المميز للوصول منذ فترة طويلة",
+    "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "يمكن إنشاء رمز الوصول منذ فترة طويلة عن طريق النقر على اسم ملف التعريف الخاص بك (أسفل اليسار) والتمرير إلى الأسفل ثم انقر فوق إنشاء الرمز المميز. ",
+    "Notification Service": "خدمة الإخطار",
+    "default: notify all devices": "الافتراضي: إخطار جميع الأجهزة",
+    "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "يمكن العثور على قائمة بخدمات الإخطار في المساعد المنزلي ضمن \"Developer Tools > Services\" ابحث عن \"notification\" للعثور على اسم جهازك/هاتفك.",
+    "Automations can optionally be triggered in Home Assistant:": "يمكن تشغيل الأتمتة اختياريًا في Home Assistant:",
+    "Trigger type:": "نوع الزناد:",
+    "Event type:": "نوع الحدث:",
+    "Event data:": "بيانات الحدث:",
+    "Then choose an action, for example switch the scene to where an RGB light is red.": "ثم اختر إجراءً على سبيل المثال قم بتبديل المشهد إلى حيث يكون ضوء RGB أحمر.",
+    "Frontend Version": "إصدار الواجهة الأمامية",
+    "Frontend Version do not match backend version!": "إصدار Frontend لا يتطابق مع الإصدار الخلفي!",
+    "backupOutdatedWarning": "مهمل: نظرًا لأنه تمت إضافة الكثير من الميزات وأن ميزة النسخ الاحتياطي هذه لم يتم الحفاظ عليها قليلاً ، فلا يمكنها إنشاء نسخة احتياطية كاملة أو استعادتها.",
+    "backupRecommend": "يرجى النسخ الاحتياطي لحجم الصوت أو مجلد البيانات (./data/) مباشرة بدلاً من ذلك.",
+    "Optional": "اختياري",
+    "or": "أو",
+    "recurringInterval": "فترة",
+    "Recurring": "يتكرر",
+    "strategyManual": "نشط/غير نشط يدويًا",
+    "warningTimezone": "إنه يستخدم المنطقة الزمنية للخادم",
+    "weekdayShortMon": "الاثنين",
+    "weekdayShortTue": "الثلاثاء",
+    "weekdayShortWed": "تزوج",
+    "weekdayShortThu": "الخميس",
+    "weekdayShortFri": "الجمعة",
+    "No Maintenance": "لا صيانة",
+    "weekdayShortSat": "جلس",
+    "weekdayShortSun": "شمس",
+    "dayOfWeek": "يوم من الأسبوع",
+    "dayOfMonth": "يوم من الشهر",
+    "lastDay": "بالأمس",
+    "lastDay1": "آخر يوم من الشهر",
+    "lastDay2": "الثاني في اليوم الأخير من الشهر",
+    "lastDay3": "الثالث في اليوم الأخير من الشهر",
+    "lastDay4": "الرابع في اليوم الأخير من الشهر",
+    "pauseMaintenanceMsg": "هل أنت متأكد من أن تتوقف مؤقتًا؟",
+    "maintenanceStatus-under-maintenance": "تحت الصيانة",
+    "maintenanceStatus-inactive": "غير نشط",
+    "maintenanceStatus-scheduled": "المقرر",
+    "maintenanceStatus-ended": "انتهى",
+    "maintenanceStatus-unknown": "مجهول",
+    "Display Timezone": "عرض المنطقة الزمنية",
+    "Server Timezone": "المنطقة الزمنية الخادم",
+    "statusPageMaintenanceEndDate": "نهاية",
+    "IconUrl": "url url icon",
+    "Enable DNS Cache": "تمكين ذاكرة التخزين المؤقت DNS",
+    "Disable": "إبطال",
+    "dnsCacheDescription": "قد لا يعمل في بعض بيئات IPv6 تعطيله إذا واجهت أي مشكلات.",
+    "Single Maintenance Window": "نافذة صيانة واحدة",
+    "Maintenance Time Window of a Day": "نافذة وقت الصيانة لليوم",
+    "Effective Date Range": "نطاق التاريخ السريع",
+    "Schedule Maintenance": "جدولة الصيانة",
+    "Date and Time": "التاريخ و الوقت",
+    "DateTime Range": "نطاق DateTime",
+    "loadingError": "لا يمكن جلب البيانات ، يرجى المحاولة مرة أخرى في وقت لاحق.",
+    "plugin": "البرنامج المساعد | الإضافات",
+    "install": "ثَبَّتَ",
+    "installing": "التثبيت",
+    "uninstall": "الغاء التثبيت",
+    "uninstalling": "إلغاء التثبيت",
+    "confirmUninstallPlugin": "هل أنت متأكد من أنك تريد إلغاء تثبيت هذا المكون الإضافي؟",
+    "smtp": "البريد الإلكتروني (SMTP)",
+    "secureOptionNone": "لا شيء / startTls (25 587)",
+    "secureOptionTLS": "TLS (465)",
+    "Ignore TLS Error": "تجاهل خطأ TLS",
+    "From Email": "من البريد الإلكترونى",
+    "emailCustomSubject": "موضوع مخصص",
+    "To Email": "للبريد الإلكتروني",
+    "smtpCC": "نسخة",
+    "smtpBCC": "BCC",
+    "Discord Webhook URL": "Discord Webhook URL",
+    "wayToGetDiscordURL": "يمكنك الحصول على هذا بالانتقال إلى إعدادات الخادم -> عمليات التكامل -> عرض الخطافات على الويب -> خطاف ويب جديد",
+    "Bot Display Name": "اسم عرض الروبوت",
+    "Prefix Custom Message": "بادئة رسالة مخصصة",
+    "Hello @everyone is...": "مرحبًا {'@'} الجميع…",
+    "wayToGetTeamsURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
+    "wayToGetZohoCliqURL": "يمكنك معرفة كيفية إنشاء عنوان URL webhook {0}.",
+    "needSignalAPI": "تحتاج إلى وجود عميل إشارة مع REST API.",
+    "wayToCheckSignalURL": "يمكنك التحقق من عنوان URL هذا لعرض كيفية إعداد واحد",
+    "Number": "رقم",
+    "Recipients": "المستلمين",
+    "Access Token": "رمز وصول",
+    "Channel access token": "قناة الوصول إلى الرمز",
+    "Line Developers Console": "تحكم المطورين",
+    "lineDevConsoleTo": "وحدة المطورين Line Console - {0}",
+    "Basic Settings": "الإعدادات الأساسية",
+    "confirmClearStatisticsMsg": "هل أنت متأكد من أنك تريد حذف جميع الإحصائيات؟",
+    "importHandleDescription": "اختر 'تخطي موجود' إذا كنت تريد تخطي كل شاشة أو إشعار بنفس الاسم. 'الكتابة فوق' سوف يحذف كل شاشة وإخطار موجود.",
+    "User ID": "معرف المستخدم",
+    "Messaging API": "واجهة برمجة تطبيقات المراسلة",
+    "wayToGetLineChannelToken": "قم أولاً بالوصول إلى {0} إنشاء مزود وقناة (واجهة برمجة تطبيقات المراسلة) ، ثم يمكنك الحصول على رمز الوصول إلى القناة ومعرف المستخدم من عناصر القائمة المذكورة أعلاه.",
+    "Icon URL": "url url icon",
+    "aboutIconURL": "يمكنك توفير رابط لصورة في \"Icon URL\" لتجاوز صورة الملف الشخصي الافتراضي. لن يتم استخدامه إذا تم تعيين رمز رمز رمز.",
+    "aboutMattermostChannelName": "يمكنك تجاوز القناة الافتراضية التي تنشرها WebHook من خلال إدخال اسم القناة في \"Channel Name\" الحقل. يجب تمكين هذا في إعدادات Webhook Mattern. السابق",
+    "dataRetentionTimeError": "يجب أن تكون فترة الاستبقاء 0 أو أكبر",
+    "infiniteRetention": "ضبط على 0 للاحتفاظ لا نهائي.",
+    "confirmDeleteTagMsg": "هل أنت متأكد من أنك تريد حذف هذه العلامة؟ لن يتم حذف الشاشات المرتبطة بهذه العلامة.",
+    "enableGRPCTls": "السماح لإرسال طلب GRPC مع اتصال TLS",
+    "deleteMonitorMsg": "هل أنت متأكد من حذف هذا الشاشة؟",
+    "deleteMaintenanceMsg": "هل أنت متأكد من حذف هذه الصيانة؟",
+    "resolverserverDescription": "CloudFlare هو الخادم الافتراضي. يمكنك تغيير خادم المحوّل في أي وقت.",
+    "rrtypeDescription": "حدد نوع RR الذي تريد مراقبته",
+    "enableDefaultNotificationDescription": "سيتم تمكين هذا الإشعار افتراضيًا للشاشات الجديدة. لا يزال بإمكانك تعطيل الإخطار بشكل منفصل لكل شاشة.",
+    "clearEventsMsg": "هل أنت متأكد من حذف جميع الأحداث لهذا الشاشة؟",
+    "clearHeartbeatsMsg": "هل أنت متأكد من حذف جميع دقات القلب لهذا الشاشة؟",
+    "confirmImportMsg": "هل أنت متأكد من أنك تريد استيراد النسخ الاحتياطي؟ يرجى التحقق من أنك حددت خيار الاستيراد الصحيح.",
+    "twoFAVerifyLabel": "الرجاء إدخال الرمز المميز الخاص بك للتحقق من 2FA",
+    "pushoversounds pushover": "سداد (افتراضي)",
+    "pushoversounds bike": "دراجة هوائية",
+    "pushoversounds bugle": "بوق",
+    "tokenValidSettingsMsg": "الرمز المميز صالح! يمكنك الآن حفظ إعدادات 2FA.",
+    "confirmEnableTwoFAMsg": "هل أنت متأكد من أنك تريد تمكين 2FA؟",
+    "confirmDisableTwoFAMsg": "هل أنت متأكد من أنك تريد تعطيل 2FA؟",
+    "recurringIntervalMessage": "ركض مرة واحدة كل يوم | قم بالتشغيل مرة واحدة كل يوم {0}",
+    "affectedMonitorsDescription": "حدد المراقبين المتأثرة بالصيانة الحالية",
+    "affectedStatusPages": "إظهار رسالة الصيانة هذه على صفحات الحالة المحددة",
+    "atLeastOneMonitor": "حدد شاشة واحدة على الأقل من المتأثرين",
+    "passwordNotMatchMsg": "كلمة المرور المتكررة لا تتطابق.",
+    "notificationDescription": "يجب تعيين الإخطارات إلى شاشة للعمل.",
+    "keywordDescription": "ابحث في الكلمة الرئيسية في استجابة HTML العادية أو JSON. البحث حساس للحالة.",
+    "backupDescription": "يمكنك النسخ الاحتياطي لجميع الشاشات والإشعارات في ملف JSON.",
+    "backupDescription3": "يتم تضمين البيانات الحساسة مثل الرموز الإخطار في ملف التصدير ؛ يرجى تخزين التصدير بشكل آمن.",
+    "endpoint": "نقطة النهاية",
+    "octopushAPIKey": "\"API key\" from HTTP API بيانات اعتماد في لوحة التحكم",
+    "octopushLogin": "\"Login\" من بيانات اعتماد API HTTP في لوحة التحكم",
+    "promosmsLogin": "اسم تسجيل الدخول API",
+    "promosmsPassword": "كلمة مرور API",
+    "pushoversounds cashregister": "ماكينة تسجيل المدفوعات النقدية",
+    "pushoversounds classical": "كلاسيكي",
+    "pushoversounds cosmic": "كونية",
+    "pushoversounds falling": "هبوط",
+    "pushoversounds gamelan": "Gamelan",
+    "pushoversounds incoming": "واردة",
+    "pushoversounds intermission": "استراحة",
+    "pushoversounds magic": "سحر",
+    "pushoversounds mechanical": "ميكانيكي",
+    "pushoversounds pianobar": "شريط البيانو",
+    "pushoversounds siren": "صفارة إنذار",
+    "pushoversounds spacealarm": "إنذار الفضاء",
+    "pushoversounds tugboat": "قارب السحب",
+    "pushoversounds alien": "إنذار أجنبي (طويل)",
+    "pushoversounds climb": "تسلق (طويل)",
+    "pushoversounds persistent": "مستمر (طويل)",
+    "pushoversounds echo": "صدى مهووس (طويل)",
+    "pushoversounds updown": "صعودا (طويلة)",
+    "pushoversounds vibrate": "يهتز فقط",
+    "pushoversounds none": "لا شيء (صامت)",
+    "pushyAPIKey": "مفتاح API السري",
+    "pushyToken": "رمز الجهاز",
+    "apprise": "إبلاغ (دعم 50+ خدمات الإخطار)",
+    "GoogleChat": "دردشة Google",
+    "wayToGetKookBotToken": "قم بإنشاء تطبيق واحصل على رمز الروبوت الخاص بك على {0}",
+    "wayToGetKookGuildID": "قم بتشغيل 'وضع المطور' في إعداد Kook وانقر بزر الماوس الأيمن على النقابة للحصول على معرفه",
+    "Guild ID": "معرف النقابة",
+    "User Key": "مفتاح المستخدم",
+    "Device": "جهاز",
+    "Message Title": "عنوان الرسالة",
+    "Notification Sound": "صوت الإشعار",
+    "More info on:": "مزيد من المعلومات حول: {0}",
+    "pushoverDesc1": "أولوية الطوارئ (2) لها مهلة افتراضية 30 ثانية بين إعادة المحاولة وستنتهي صلاحيتها بعد ساعة واحدة.",
+    "pushoverDesc2": "إذا كنت ترغب في إرسال إشعارات إلى أجهزة مختلفة ، قم بملء حقل الجهاز.",
+    "SMS Type": "نوع الرسائل القصيرة",
+    "octopushTypePremium": "قسط (سريع - موصى به للتنبيه)",
+    "octopushTypeLowCost": "التكلفة المنخفضة (بطيئة - تم حظرها أحيانًا بواسطة المشغل)",
+    "checkPrice": "تحقق من الأسعار {0}",
+    "apiCredentials": "بيانات اعتماد API",
+    "octopushLegacyHint": "هل تستخدم الإصدار القديم من Octopush (2011-2020) أو الإصدار الجديد؟",
+    "Check octopush prices": "تحقق من أسعار Octopush {0}.",
+    "AccessKeyId": "معرف AccessKey",
+    "SecretAccessKey": "Accesskey Secret",
+    "PhoneNumbers": "أرقام الهواتف",
+    "octopushPhoneNumber": "رقم الهاتف (تنسيق intl على سبيل المثال ",
+    "octopushSMSSender": "اسم مرسل الرسائل القصيرة",
+    "LunaSea Device ID": "معرف جهاز Lunasea",
+    "Apprise URL": "إبلاغ عنوان URL",
+    "Example:": "مثال: {0}",
+    "Read more:": "{0} :قراءة المزيد",
+    "Status:": "{0} :حالة",
+    "Strategy": "إستراتيجية",
+    "Free Mobile User Identifier": "معرف مستخدم الهاتف المحمول المجاني",
+    "Free Mobile API Key": "مفتاح واجهة برمجة تطبيقات مجانية للهاتف المحمول",
+    "Enable TLS": "تمكين TLS",
+    "Proto Service Name": "اسم خدمة البروتو",
+    "Proto Method": "طريقة البروتو",
+    "Proto Content": "محتوى proto",
+    "Economy": "اقتصاد",
+    "Lowcost": "تكلفة منخفضة",
+    "high": "عالي",
+    "SendKey": "Sendkey",
+    "SMSManager API Docs": "مستندات SMSManager API ",
+    "Gateway Type": "نوع البوابة",
+    "You can divide numbers with": "يمكنك تقسيم الأرقام مع",
+    "Base URL": "عنوان URL الأساسي",
+    "goAlertInfo": "الهدف هو تطبيق مفتوح المصدر لجدولة الجدولة التلقائية والإشعارات (مثل الرسائل القصيرة أو المكالمات الصوتية). إشراك الشخص المناسب تلقائيًا بالطريقة الصحيحة وفي الوقت المناسب! {0}",
+    "goAlertIntegrationKeyInfo": "احصل على مفتاح تكامل API العام للخدمة في هذا التنسيق \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" عادةً قيمة المعلمة الرمزية لعنوان url المنسق.",
+    "TemplateCode": "TemplateCode",
+    "SignName": "اسم تسجيل الدخول",
+    "Sms template must contain parameters: ": "يجب أن يحتوي قالب الرسائل القصيرة على معلمات: ",
+    "Bark Endpoint": "نقطة نهاية اللحاء",
+    "Bark Group": "مجموعة اللحاء",
+    "Bark Sound": "صوت اللحاء",
+    "WebHookUrl": "webhookurl",
+    "SecretKey": "Secretkey",
+    "For safety, must use secret key": "للسلامة يجب استخدام المفتاح السري",
+    "Device Token": "رمز الجهاز",
+    "Platform": "منصة",
+    "Android": "ذكري المظهر",
+    "Huawei": "هواوي",
+    "High": "عالٍ",
+    "Retry": "إعادة المحاولة",
+    "Topic": "عنوان",
+    "WeCom Bot Key": "WECOM BOT KEY",
+    "Setup Proxy": "وكيل الإعداد",
+    "Proxy Protocol": "بروتوكول الوكيل",
+    "Proxy Server": "مخدم بروكسي",
+    "Proxy server has authentication": "خادم الوكيل لديه مصادقة",
+    "promosmsTypeEco": "SMS Eco - رخيصة ولكن بطيئة وغالبًا ما تكون محملة. يقتصر فقط على المستفيدين البولنديين.",
+    "promosmsTypeFlash": "SMS Flash - سيتم عرض الرسالة تلقائيًا على جهاز المستلم. يقتصر فقط على المستفيدين البولنديين.",
+    "promosmsTypeFull": "SMS Full - Tier Premium SMS يمكنك استخدام اسم المرسل الخاص بك (تحتاج إلى تسجيل الاسم أولاً). موثوقة للتنبيهات.",
+    "promosmsTypeSpeed": "سرعة الرسائل القصيرة - أولوية قصوى في النظام. سريع وموثوق للغاية ولكنه مكلف (حوالي مرتين من الرسائل القصيرة السعر الكامل).",
+    "promosmsPhoneNumber": "رقم الهاتف (للمستلم البولندي ، يمكنك تخطي رموز المنطقة)",
+    "matrixDesc2": "يوصى بشدة بإنشاء مستخدم جديد ولا تستخدم رمز الوصول إلى مستخدم Matrix الخاص بك لأنه سيتيح الوصول الكامل إلى حسابك وجميع الغرف التي انضمت إليها. بدلاً من ذلك ، قم بإنشاء مستخدم جديد ودعوته فقط إلى الغرفة التي تريد تلقيها الإشعار فيها. يمكنك الحصول على رمز الوصول عن طريق تشغيل {0}",
+    "Channel Name": "اسم القناة",
+    "promosmsSMSSender": "اسم مرسل الرسائل القصيرة",
+    "promosmsAllowLongSMS": "السماح الرسائل القصيرة الطويلة",
+    "Feishu WebHookUrl": "Feishu Webhookurl",
+    "matrixHomeserverURL": "عنوان URL HomeServer (مع HTTP (S)",
+    "Internal Room Id": "معرف الغرفة الداخلية",
+    "matrixDesc1": "يمكنك العثور على معرف الغرفة الداخلي من خلال البحث في القسم المتقدم من إعدادات الغرفة في عميل Matrix الخاص بك. يجب أن تبدو مثل! QMDRCPUIFLWSFJXYE6",
+    "Uptime Kuma URL": "UPTIME KUMA URL",
+    "Icon Emoji": "أيقونة الرموز التعبيرية",
+    "signalImportant": "مهم",
+    "aboutWebhooks": "مزيد من المعلومات حول Webhooks ON",
+    "aboutChannelName": "أدخل اسم القناة في حقل اسم القناة {0} إذا كنت تريد تجاوز قناة WebHook. السابق",
+    "aboutKumaURL": "إذا تركت حقل URL في وقت التشغيل KUMA فارغًا ، فسيتم افتراضيًا إلى صفحة GitHub Project.",
+    "smtpDkimSettings": "إعدادات DKIM",
+    "smtpDkimDesc": "يرجى الرجوع إلى Nodemailer dkim {0} للاستخدام.",
+    "documentation": "توثيق",
+    "smtpDkimDomain": "اسم النطاق",
+    "smtpDkimKeySelector": "المحدد الرئيسي",
+    "smtpDkimPrivateKey": "مفتاح سري",
+    "smtpDkimHashAlgo": "خوارزمية التجزئة (اختياري)",
+    "smtpDkimheaderFieldNames": "مفاتيح الرأس للتوقيع (اختياري)",
+    "smtpDkimskipFields": "مفاتيح الرأس لا توقيع (اختياري)",
+    "wayToGetPagerDutyKey": "يمكنك الحصول على هذا عن طريق الانتقال إلى الخدمة -> دليل الخدمة -> (حدد خدمة) -> تكامل -> إضافة التكامل. هنا يمكنك البحث عن \"Events API V2\". مزيد من المعلومات {0}",
+    "Integration Key": "مفتاح التكامل",
+    "Integration URL": "URL تكامل",
+    "do nothing": "لا تفعل شيئا",
+    "alertaApiEndpoint": "نقطة نهاية API",
+    "alertaEnvironment": "بيئة",
+    "alertaApiKey": "مفتاح API",
+    "alertaAlertState": "حالة التنبيه",
+    "alertaRecoverState": "استعادة الدولة",
+    "auto acknowledged": "",
+    "auto resolve": "",
+    "serwersmsAPIUser": "اسم مستخدم API (بما في ذلك بادئة WebAPI_)",
+    "serwersmsAPIPassword": "كلمة مرور API",
+    "serwersmsPhoneNumber": "رقم الهاتف",
+    "serwersmsSenderName": "اسم مرسل الرسائل القصيرة (مسجل عبر بوابة العملاء)",
+    "smseagleTo": "أرقام الهواتف)",
+    "smseagleGroup": "اسم مجموعة كتب الهاتف (S)",
+    "smseagleContact": "كتاب الاتصال اسم (S)",
+    "smseagleRecipientType": "نوع المستلم",
+    "smseagleRecipient": "المتلقي (المتلقيين) (يجب فصل المتعددة مع فاصلة)",
+    "smseagleToken": "API وصول الرمز المميز",
+    "smseagleUrl": "عنوان URL لجهاز SMSEGLE الخاص بك",
+    "smseagleEncoding": "إرسال Unicode",
+    "smseaglePriority": "أولوية الرسالة (0-9 افتراضي = 0)",
+    "Recipient Number": "رقم المستلم",
+    "From Name/Number": "من الاسم/الرقم",
+    "Leave blank to use a shared sender number.": "اترك فارغًا لاستخدام رقم المرسل المشترك.",
+    "Octopush API Version": "إصدار Octopush API",
+    "Legacy Octopush-DM": "Legacy Octopush-DM",
+    "ntfy Topic": "موضوع ntfy",
+    "onebotHttpAddress": "OneBot HTTP عنوان",
+    "onebotMessageType": "نوع رسالة OneBot",
+    "onebotGroupMessage": "مجموعة",
+    "onebotPrivateMessage": "خاص",
+    "onebotUserOrGroupId": "معرف المجموعة/المستخدم",
+    "onebotSafetyTips": "للسلامة يجب ضبط الرمز المميز للوصول",
+    "PushDeer Key": "مفتاح PushDeer",
+    "wayToGetClickSendSMSToken": "يمكنك الحصول على اسم مستخدم API ومفتاح API من {0}.",
+    "Custom Monitor Type": "نوع الشاشة المخصص",
+    "Google Analytics ID": "معرف Google Analytics",
+    "Edit Tag": "تحرير العلامة",
+    "Server Address": "عنوان المستقبل",
+    "Learn More": "يتعلم أكثر",
+    "apiKeyAddedMsg": "تمت إضافة مفتاح API خاص بك. يرجى تدوين ذلك لأنه لن يتم عرضه مرة أخرى.",
+    "No API Keys": "لا توجد مفاتيح API",
+    "apiKey-inactive": "غير نشط",
+    "disableAPIKeyMsg": "هل أنت متأكد أنك تريد تعطيل مفتاح API هذا؟",
+    "deleteAPIKeyMsg": "هل أنت متأكد أنك تريد حذف مفتاح API هذا؟",
+    "Auto Get": "الحصول التلقائي",
+    "Auto resolve or acknowledged": "",
+    "backupDescription2": "ملحوظة",
+    "languageName": "العربية",
+    "Game": "الألعاب",
+    "List": "قائمة",
+    "statusMaintenance": "الصيانة"
+}

From e8a81379bbe2c3c280378fd9e5d7243b37d02fa6 Mon Sep 17 00:00:00 2001
From: Alexandr Loskutov <alex_connor@icloud.com>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 770/803] Translated using Weblate (Ukrainian)

Currently translated at 100.0% (704 of 704 strings)

Co-authored-by: Alexandr Loskutov <alex_connor@icloud.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/uk/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/uk-UA.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
index 3715e561..e464e683 100644
--- a/src/lang/uk-UA.json
+++ b/src/lang/uk-UA.json
@@ -125,7 +125,7 @@
     "Export": "Експорт",
     "Import": "Імпорт",
     "backupDescription": "Ви можете зберегти резервну копію всіх моніторів та повідомлень у вигляді JSON-файлу.",
-    "backupDescription2": "P.S.: Історія та події збережені не будуть",
+    "backupDescription2": "P.S.: Історія та події збережені не будуть.",
     "backupDescription3": "Важливі дані, такі як токени повідомлень, додаються під час експорту, тому зберігайте файли в безпечному місці.",
     "alertNoFile": "Виберіть файл для імпорту.",
     "alertWrongFileType": "Виберіть JSON-файл.",
@@ -267,7 +267,7 @@
     "checkPrice": "Тарифи {0}:",
     "octopushLegacyHint": "Ви використовуєте стару версію Octopush (2011-2020) або нову?",
     "Check octopush prices": "Тарифи Octopush {0}.",
-    "octopushPhoneNumber": "Номер телефону (між. формат, наприклад: +380123456789)",
+    "octopushPhoneNumber": "Номер телефону (між. формат, наприклад: +380123456789) ",
     "octopushSMSSender": "Ім'я відправника SMS: 3-11 символів алвафіту, цифр та пробілів (a-zA-Z0-9)",
     "LunaSea Device ID": "ID пристрою LunaSea",
     "Apprise URL": "Apprise URL",

From f1c3604ab0b88df67de53a3aa54cab4adf88a58d Mon Sep 17 00:00:00 2001
From: Marco <marco@nanoweb.ch>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 771/803] Translated using Weblate (German (Switzerland))

Currently translated at 100.0% (704 of 704 strings)

Translated using Weblate (German (Switzerland))

Currently translated at 90.6% (638 of 704 strings)

Co-authored-by: Marco <marco@nanoweb.ch>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de_CH/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/de-CH.json | 114 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 108 insertions(+), 6 deletions(-)

diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
index d8a46562..f303a6f9 100644
--- a/src/lang/de-CH.json
+++ b/src/lang/de-CH.json
@@ -135,7 +135,7 @@
     "Options": "Optionen",
     "confirmImportMsg": "Möchtest du das Backup wirklich importieren? Bitte stelle sicher, dass die richtige Import-Option ausgewählt ist.",
     "Keep both": "Beide behalten",
-    "twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert",
+    "twoFAVerifyLabel": "Bitte trage deinen Token ein, um zu verifizieren, dass 2FA funktioniert:",
     "Verify Token": "Token verifizieren",
     "Setup 2FA": "2FA einrichten",
     "Enable 2FA": "2FA aktivieren",
@@ -231,7 +231,7 @@
     "smtpCC": "CC",
     "smtpBCC": "BCC",
     "Discord Webhook URL": "Discord Webhook URL",
-    "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Integrationen -> Neuer Webhook",
+    "wayToGetDiscordURL": "Du kannst diese erhalten, indem du zu den Servereinstellungen gehst -> Notifikationen -> Webhooks -> Neuer Webhook",
     "Bot Display Name": "Bot-Anzeigename",
     "Prefix Custom Message": "Benutzerdefinierter Nachrichten Präfix",
     "Hello @everyone is...": "Hallo {'@'}everyone ist…",
@@ -560,7 +560,7 @@
     "Domain": "Domain",
     "Workstation": "Workstation",
     "disableCloudflaredNoAuthMsg": "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
-    "trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
+    "trustProxyDescription": "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige Client IP erhalten möchte und Uptime Kuma hinter einem Proxy wie Nginx oder Apache läuft, sollte dies aktiviert werden.",
     "wayToGetLineNotifyToken": "Du kannst hier ein Token erhalten: {0}",
     "Examples": "Beispiele",
     "Home Assistant URL": "Home Assistant URL",
@@ -593,12 +593,12 @@
     "goAlertInfo": "GoAlert ist eine Open-Source Applikation für Rufbereitschaftsplanung, automatische Eskalation und Benachrichtigung (z.B. SMS oder Telefonanrufe). Beauftragen Sie automatisch die richtige Person, auf die richtige Art und Weise und zum richtigen Zeitpunkt. {0}",
     "goAlertIntegrationKeyInfo": "Bekommt einen generischen API Schlüssel in folgenden Format \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\". Normalerweise entspricht dies dem Wert des Token aus der URL.",
     "goAlert": "GoAlert",
-    "backupOutdatedWarning": "Veraltet: Eine menge Neuerungen sind eingeflossen und diese Funktion wurde etwas vernachlässigt worden. Es kann kein vollständiges Backup erstellt oder eingespielt werden.",
+    "backupOutdatedWarning": "Veraltet: Da viele Funktionen hinzugefügt wurden und die Backupfunktion nicht mehr gepflegt wird, kann keine vollständige Sicherung erstellt oder wiederhergestellt werden.",
     "backupRecommend": "Bitte Backup das Volume oder den Ordner (./ data /) selbst.",
     "Optional": "Optional",
     "squadcast": "Squadcast",
     "SendKey": "SendKey",
-    "SMSManager API Docs": "SMSManager API Dokumente",
+    "SMSManager API Docs": "SMSManager API Dokumente ",
     "Gateway Type": "Gateway Type",
     "SMSManager": "SMSManager",
     "You can divide numbers with": "Du kannst Zahlen teilen mit",
@@ -629,5 +629,107 @@
     "maintenanceStatus-ended": "Ende",
     "maintenanceStatus-unknown": "Unbekannt",
     "Display Timezone": "Zeitzone anzeigen",
-    "Server Timezone": "Server Zeitzone"
+    "Server Timezone": "Server Zeitzone",
+    "telegramMessageThreadID": "(Optional) Nachrichten Thread ID",
+    "telegramMessageThreadIDDescription": "Optionale eindeutige Kennung für den Ziel-Thread (Thema) des Forums; nur für Forum-Supergroups",
+    "Enable": "Aktivieren",
+    "telegramProtectContent": "Schütze gegen Weiterleiten/Speichern der Nachricht",
+    "telegramProtectContentDescription": "Die Bot-Nachrichten in Telegram sind gegen Weiterleitung und Speichern geschützt.",
+    "Disable": "Deaktivieren",
+    "plugin": "Plugin | Plugins",
+    "installing": "Installiere",
+    "uninstall": "Deinstallieren",
+    "uninstalling": "Deinstalliere",
+    "confirmUninstallPlugin": "Möchten Sie dieses Plugin wirklich deinstallieren?",
+    "notificationRegional": "Regional",
+    "Single Maintenance Window": "Einmaliges Wartungsfenster",
+    "dnsCacheDescription": "In einigen IPv6-Umgebungen funktioniert es möglicherweise nicht. Deaktivieren Sie es, wenn Sie auf Probleme stossen.",
+    "Maintenance Time Window of a Day": "Wartungszeitfenster eines Tages",
+    "Effective Date Range": "Gültigkeitsbereich",
+    "Schedule Maintenance": "Wartung planen",
+    "Date and Time": "Datum und Uhrzeit",
+    "DateTime Range": "Datums- und Zeitbereich",
+    "telegramSendSilently": "Stumm senden",
+    "telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton.",
+    "markdownSupported": "Markdown-Syntax unterstützt",
+    "webhookAdditionalHeadersTitle": "Zusätzliche Header",
+    "webhookAdditionalHeadersDesc": "Legt zusätzliche Kopfzeilen fest, die mit dem Webhook gesendet werden.",
+    "Packet Size": "Paketgrösse",
+    "IconUrl": "Symbol URL",
+    "Enable DNS Cache": "DNS Cache aktivieren",
+    "Help": "Hilfe",
+    "Game": "Spiel",
+    "General Monitor Type": "Allgemeiner Monitortyp",
+    "Passive Monitor Type": "Passiver Monitortyp",
+    "Specific Monitor Type": "Spezifischer Monitortyp",
+    "Monitor": "Überwachung | Monitore",
+    "Custom": "Benutzerdefiniert",
+    "statusPageMaintenanceEndDate": "Ende",
+    "loadingError": "Die Daten konnten nicht abgerufen werden, bitte später noch einmal versuchen.",
+    "install": "Installieren",
+    "Body Encoding": "Body Encoding",
+    "Custom Monitor Type": "Benutzerdefinierter Monitortyp",
+    "Expiry": "Ablauf",
+    "Expiry date": "Ablaufdatum",
+    "Don't expire": "Nicht ablaufen",
+    "Add Another": "Hinzufügen",
+    "Key Added": "Schlüssel hinzugefügt",
+    "apiKeyAddedMsg": "Ihr API Schlüssel wurde hinzugefügt. Bitte notieren Sie Ihn, da er nicht erneut angezeigt wird.",
+    "Add API Key": "API Schlüssel hinzufügen",
+    "No API Keys": "Kein API Schlüssel",
+    "apiKey-active": "Aktiv",
+    "apiKey-expired": "Abgelaufen",
+    "apiKey-inactive": "Inaktiv",
+    "Expires": "Läuft ab",
+    "disableAPIKeyMsg": "Sind Sie sicher, dass Sie diesen API Schlüssel deaktivieren möchten?",
+    "deleteAPIKeyMsg": "Sind Sie sicher, dass Sie diesen API Schlüssel löschen möchten?",
+    "Generate": "Generieren",
+    "infiniteRetention": "Für unendliche Speicherung auf 0 setzen.",
+    "dataRetentionTimeError": "Aufbewahrungsfrist muss grösser oder gleich 0 sein",
+    "Clone Monitor": "Monitor klonen",
+    "Clone": "Klonen",
+    "cloneOf": "Klon von {0}",
+    "wayToGetZohoCliqURL": "Wie eine Webhook URL erstellt werden kann, erfährst du {0}.",
+    "enableGRPCTls": "Senden von gRPC Anforderungen mit TLS Verbindung zulassen",
+    "grpcMethodDescription": "Der Name der Methode wird in das \"cammelCase \"-Format konvertiert (z.B. sayHello, check, etc.)",
+    "wayToGetKookGuildID": "Schalten Sie den „Entwicklermodus“ in den Kook-Einstellungen ein und klicken Sie mit der rechten Maustaste auf die Gilde, um ihre ID zu erhalten",
+    "Guild ID": "Gilde ID",
+    "Lowcost": "Kostengünstig",
+    "high": "hoch",
+    "Google Analytics ID": "Google Analytics ID",
+    "Enable TLS": "TLS aktivieren",
+    "Free Mobile API Key": "Kostenloser Mobile API Schlüssel",
+    "Proto Service Name": "Proto Dienst Name",
+    "Proto Method": "Proto Methode",
+    "Proto Content": "Proto Inhalt",
+    "Economy": "Economy",
+    "pagertreeIntegrationUrl": "Integrations-URL",
+    "pagertreeUrgency": "Dringlichkeit",
+    "pagertreeSilent": "Stumm",
+    "pagertreeLow": "Niedrig",
+    "pagertreeMedium": "Mittel",
+    "pagertreeHigh": "Hoch",
+    "pagertreeCritical": "Kritisch",
+    "pagertreeResolve": "Automatisch auflösen",
+    "pagertreeDoNothing": "Nichts tun",
+    "wayToGetPagerTreeIntegrationURL": "Nachdem Sie die Uptime Kuma Integration in PagerTree erstellt haben, kopieren Sie den Endpunkt. Siehe vollständige Details {0}",
+    "Server Address": "Serveradresse",
+    "Learn More": "Erfahre mehr",
+    "Edit Tag": "Tag editieren",
+    "promosmsAllowLongSMS": "Lange SMS erlauben",
+    "smseagleRecipientType": "Empfängertyp",
+    "smseagleToken": "API Zugriffstoken",
+    "smseagleTo": "Telefonnummer(n)",
+    "smseagleUrl": "Ihre SMSEagle Geräte URL",
+    "smseagleEncoding": "Als Unicode senden",
+    "smseaglePriority": "Nachrichtenpriorität (0-9, Standard = 0)",
+    "smseagleContact": "Telefonbuch Kontaktname(n)",
+    "confirmDeleteTagMsg": "Sind Sie sicher, dass Sie diesen Tag löschen möchten? Monitore, die mit diesem Tag verknüpft sind, werden nicht gelöscht.",
+    "wayToGetKookBotToken": "Erstellen Sie eine Anwendung und erhalten Sie Ihren Bot-Token unter {0}",
+    "Strategy": "Strategie",
+    "Free Mobile User Identifier": "Kostenlose mobile Benutzerkennung",
+    "smseagleGroup": "Telefonbuch Gruppenname(n)",
+    "smseagleRecipient": "Empfänger (mehrere müssen durch Komma getrennt werden)",
+    "API Keys": "API Schlüssel",
+    "Continue": "Weiter"
 }

From 66e80aa6c3881a93b4b4d4c7b213206078a7240b Mon Sep 17 00:00:00 2001
From: Mathias <mathias.talo@outlook.com>
Date: Fri, 10 Mar 2023 08:00:35 +0000
Subject: [PATCH 772/803] Translated using Weblate (Estonian)

Currently translated at 42.0% (296 of 704 strings)

Co-authored-by: Mathias <mathias.talo@outlook.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/et/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/et-EE.json | 153 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 131 insertions(+), 22 deletions(-)

diff --git a/src/lang/et-EE.json b/src/lang/et-EE.json
index f7a23a6c..c9304743 100644
--- a/src/lang/et-EE.json
+++ b/src/lang/et-EE.json
@@ -1,10 +1,10 @@
 {
     "languageName": "eesti",
-    "retryCheckEverySecond": "Kontrolli {0} sekundilise vahega.",
-    "retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus.",
-    "ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel.",
+    "retryCheckEverySecond": "Kontrolli {0} sekundilise vahega",
+    "retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus",
+    "ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel",
     "upsideDownModeDescription": "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.",
-    "maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi ",
+    "maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi.",
     "acceptedStatusCodesDescription": "Vali välja HTTP koodid, mida arvestada kõlblikuks.",
     "passwordNotMatchMsg": "Salasõnad ei kattu.",
     "notificationDescription": "Teavitusteenuse kasutamiseks seo see seirega.",
@@ -19,7 +19,7 @@
     "Status Page": "Ülevaade",
     "Status Pages": "Ülevaated",
     "Dashboard": "Töölaud",
-    "New Update": "Uuem tarkvara versioon on saadaval.",
+    "New Update": "Uuem tarkvara versioon on saadaval",
     "Language": "Keel",
     "Appearance": "Välimus",
     "Theme": "Teema",
@@ -40,7 +40,7 @@
     "Status": "Olek",
     "DateTime": "Kuupäev",
     "Message": "Tulemus",
-    "No important events": "Märkimisväärsed juhtumid puuduvad.",
+    "No important events": "Märkimisväärsed juhtumid puuduvad",
     "Resume": "Taasta",
     "Edit": "Muuda",
     "Delete": "Eemalda",
@@ -81,26 +81,26 @@
     "Allow indexing": "Luba indekseerimine",
     "Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt",
     "Change Password": "Muuda parooli",
-    "Current Password": "praegune parool",
-    "New Password": "uus parool",
-    "Repeat New Password": "korda salasõna",
-    "Update Password": "Uuenda salasõna",
+    "Current Password": "Praegune parool",
+    "New Password": "Uus parool",
+    "Repeat New Password": "Korda uut parooli",
+    "Update Password": "Uuenda parooli",
     "Disable Auth": "Lülita autentimine välja",
     "Enable Auth": "Lülita autentimine sisse",
     "disableauth.message1": "Kas soovid <strong>lülitada autentimise välja</strong>?",
     "disableauth.message2": "Kastuamiseks <strong>välise autentimispakkujaga</strong>, näiteks Cloudflare Access.",
-    "Please use this option carefully!": "Palun kasuta vastutustundlikult.",
+    "Please use this option carefully!": "Palun kasuta seda valikut vastutustundlikult!",
     "Logout": "Logi välja",
     "Leave": "Lahku",
     "I understand, please disable": "Olen tutvunud riskidega, lülita välja",
     "Confirm": "Kinnita",
     "Yes": "Jah",
     "No": "Ei",
-    "Username": "kasutajanimi",
-    "Password": "parool",
+    "Username": "Kasutajanimi",
+    "Password": "Parool",
     "Remember me": "Mäleta mind",
     "Login": "Logi sisse",
-    "No Monitors, please": "Seired puuduvad.",
+    "No Monitors, please": "Seired puuduvad, palun",
     "add one": "Lisa esimene",
     "Notification Type": "Teavituse tüüp",
     "Email": "e-posti aadress",
@@ -141,9 +141,9 @@
     "Disable 2FA": "Lülita 2FA välja",
     "2FA Settings": "2FA seaded",
     "Two Factor Authentication": "Kaksikautentimine",
-    "Active": "kasutusel",
-    "Inactive": "seadistamata",
-    "Token": "kaksikautentimise kood",
+    "Active": "Aktiivne",
+    "Inactive": "Mitteaktiivne",
+    "Token": "Kaksikautentimise kood",
     "Show URI": "Näita URId",
     "Clear all statistics": "Tühjenda ajalugu",
     "importHandleDescription": "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.",
@@ -152,9 +152,9 @@
     "Import Backup": "Varukoopia importimine",
     "Export Backup": "Varukoopia eksportimine",
     "Skip existing": "lisa praegustele",
-    "Overwrite": "asenda",
+    "Overwrite": "Asenda",
     "Options": "Mestimisviis",
-    "Keep both": "kombineeri",
+    "Keep both": "Kombineeri",
     "Tags": "Sildid",
     "Add New below or Select...": "Leia või lisa all uus…",
     "Tag with this name already exist.": "Selle nimega silt on juba olemas.",
@@ -174,14 +174,14 @@
     "Avg. Response": "Keskmine reaktsiooniaeg",
     "Entry Page": "Avaleht",
     "statusPageNothing": "Kippu ega kõppu; siia saab lisada seireid või -gruppe.",
-    "No Services": "Teenused puuduvad.",
+    "No Services": "Teenused puuduvad",
     "All Systems Operational": "Kõik töökorras",
     "Partially Degraded Service": "Teenuse töö osaliselt häiritud",
     "Degraded Service": "Teenuse töö häiritud",
     "Add Group": "Lisa grupp",
     "Edit Status Page": "Muuda lehte",
     "Go to Dashboard": "Töölauale",
-    "checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega.",
+    "checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega",
     "telegram": "Telegram",
     "webhook": "Webhook",
     "smtp": "elektronpost (SMTP)",
@@ -205,5 +205,114 @@
     "alertaEnvironment": "Keskkond",
     "alertaApiKey": "API võti",
     "alertaAlertState": "Häireseisund",
-    "alertaRecoverState": "Taasta algolek"
+    "alertaRecoverState": "Taasta algolek",
+    "Game": "Mäng",
+    "Primary Base URL": "Peamine baas URL",
+    "Passive Monitor Type": "Passiivne monitori tüüp",
+    "Specific Monitor Type": "Spetsiifiline monitori tüüp",
+    "resendDisabled": "Uuesti saatmine keelatud",
+    "Push URL": "Lükka URL",
+    "needPushEvery": "Sa peaksid kutsuma seda URL-i iga {0} sekundi tagant.",
+    "pushOptionalParams": "Valikulised parameetrid: {0}",
+    "Schedule maintenance": "Planeeri hooldus",
+    "All Status Pages": "Kõik staatuse lehed",
+    "Select status pages...": "Vali staatuse lehed…",
+    "Custom": "Kohandatud",
+    "here": "siin",
+    "Required": "Nõutud",
+    "Post URL": "Postita URL",
+    "Affected Monitors": "Mõjutatud monitorid",
+    "Pick Affected Monitors...": "Vali mõjutatud monitorid…",
+    "Start of maintenance": "Hoolduse algus",
+    "Content Type": "Sisu tüüp",
+    "webhookJsonDesc": "{0} on hea iga modernse HTTP serveri jaoks nagu Express.js",
+    "webhookAdditionalHeadersTitle": "Täiendavad päised",
+    "setAsDefault": "Lisa vaikimisi",
+    "deleteProxyMsg": "Kas Sa oled kindel, et soovid kustutada seda puhverserverit kõkidel monitoridel?",
+    "proxyDescription": "Puhverserverid tuleb lisada monitorile selle töötamiseks.",
+    "setAsDefaultProxyDescription": "See puhverserver aktiveeritakse vaikimisi uutel monitoridel. Sa saad keelata seda puhverserverit igal monitoril eraldi.",
+    "Certificate Chain": "Sertifikaadi kett",
+    "Valid": "Kehtiv",
+    "Invalid": "Kehtetu",
+    "User": "Kasutaja",
+    "Installed": "Paigaldatud",
+    "Not installed": "Ei ole installeeritud",
+    "Running": "Töötab",
+    "resendEveryXTimes": "Saada uuesti {0} korda",
+    "statusMaintenance": "Hooldus",
+    "Webhook URL": "",
+    "Server URL": "Serveri URL",
+    "Priority": "Tähtsus",
+    "emojiCheatSheet": "Emotikoni spikker: {0}",
+    "appriseInstalled": "Apprise on installitud.",
+    "appriseNotInstalled": "Apprise ei ole installitud. {0}",
+    "Method": "Meetod",
+    "Body": "Keha",
+    "Headers": "Päis",
+    "PushUrl": "Lükka URL",
+    "Monitor History": "Monitori ajalugu",
+    "PasswordsDoNotMatch": "Paroolid ei ühti.",
+    "records": "",
+    "Current User": "Praegune kasutaja",
+    "topic": "Teema",
+    "successMessage": "Edukas sõnum",
+    "recent": "Hiljutine",
+    "Info": "Info",
+    "Security": "Turvalisus",
+    "Steam API Key": "Steam API võti",
+    "Pick a RR-Type...": "Vali RR-tüüp…",
+    "Default": "Vaikimisi",
+    "HTTP Options": "HTTP valikud",
+    "Create Incident": "Loo intsident",
+    "Title": "Pealkiri",
+    "Content": "Sisu",
+    "Style": "Stiil",
+    "info": "info",
+    "warning": "hoiatus",
+    "danger": "oht",
+    "error": "viga",
+    "critical": "kriitiline",
+    "primary": "peamine",
+    "dark": "tume",
+    "light": "hele",
+    "Post": "Postita",
+    "Please input title and content": "Palun lisa pealkiri ja sisu",
+    "Created": "Loodud",
+    "Last Updated": "Viimati uuendatud",
+    "Unpin": "Vabastada",
+    "Switch to Dark Theme": "Vaheta tumedale teemale",
+    "Hide Tags": "Peida tagid",
+    "Show Tags": "Näita tagid",
+    "Description": "Kirjeldus",
+    "No monitors available.": "Ühtegi monitori ei ole saadaval.",
+    "Add one": "Lisa üks",
+    "No Monitors": "Ei ole monitore",
+    "Untitled Group": "Nimetamata grupp",
+    "Services": "Teenused",
+    "Cancel": "Tühista",
+    "Customize": "Kohanda",
+    "Custom Footer": "Kohandatud jalus",
+    "Custom CSS": "Kohandatud CSS",
+    "Proxies": "Puhverserverid",
+    "default": "Vaikimisi",
+    "enabled": "Lubatud",
+    "Not running": "Ei tööta",
+    "Start": "Alusta",
+    "Stop": "Peata",
+    "Add New Status Page": "Lisa uus staatuse leht",
+    "Shrink Database": "Vähenda andmebaasi",
+    "Help": "Abi",
+    "Maintenance": "Hooldus",
+    "General Monitor Type": "Üldine monitori tüüp",
+    "webhookAdditionalHeadersDesc": "Lisab täiendavad päised saadetud webhookiga.",
+    "Read more": "Loe rohkem",
+    "HeadersInvalidFormat": "",
+    "clearDataOlderThan": "Hoia monitori ajalugu alles {0} päeva.",
+    "steamApiKeyDescription": "Steam Game Serveri monitoorimiseks on vaja sul Steam Web-API võtit. Sa saad registreerida enda API võtme siin: ",
+    "Done": "Tehtud",
+    "Pick Accepted Status Codes...": "Vali vastu võetud staatuse koodid…",
+    "Switch to Light Theme": "Vaheta heledale teemale",
+    "Discard": "Loobu",
+    "deleteStatusPageMsg": "Kas Sa oled kindel, et soovid kustutada seda staatuse lehte?",
+    "Resend Notification if Down X times consecutively": "Saada teavitus uuesti kui monitor on rikkis X korda järjest"
 }

From 7447a6570f77f844d069463da50a7232800ce571 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 10 Mar 2023 08:00:36 +0000
Subject: [PATCH 773/803] Translated using Weblate (Chinese (Traditional, Hong
 Kong))

Currently translated at 95.5% (673 of 704 strings)

Translated using Weblate (Chinese (Traditional, Hong Kong))

Currently translated at 95.5% (673 of 704 strings)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-HK.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index de226c98..434c3147 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -669,7 +669,7 @@
     "apiKey-inactive": "已停用",
     "apiKey-active": "有效",
     "No API Keys": "沒有 API Keys",
-    "Add API Key": "新 API Key",
+    "Add API Key": "新增 API Key",
     "Expiry date": "失效時間",
     "Don't expire": "不會失效",
     "apiKey-expired": "已失效",
@@ -681,9 +681,9 @@
     "apiKeyAddedMsg": "你的 API Key 已被產生。此頁只會顯示一次,請適當保存。",
     "Expiry": "過期",
     "telegramSendSilentlyDescription": "選擇以靜音發送。用戶會收到無聲通知。",
-    "Clone Monitor": "復製監察器",
-    "Clone": "復製",
-    "cloneOf": "復製的 {0}",
+    "Clone Monitor": "複製監察器",
+    "Clone": "複製",
+    "cloneOf": "複製的 {0}",
     "Proxy server has authentication": "Proxy 伺服器啟用了驗證功能",
     "Proxy Server": "Proxy 伺服器",
     "Proxy Protocol": "Proxy 通訊協定",

From d3a3dcbde231fc59911216c59f39653e242b0dcc Mon Sep 17 00:00:00 2001
From: DevMirza <pzhafeez@gmail.com>
Date: Fri, 10 Mar 2023 08:00:36 +0000
Subject: [PATCH 774/803] Translated using Weblate (Urdu)

Currently translated at 60.0% (423 of 704 strings)

Co-authored-by: DevMirza <pzhafeez@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ur/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ur.json | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/lang/ur.json b/src/lang/ur.json
index 40f17a85..7d591a59 100644
--- a/src/lang/ur.json
+++ b/src/lang/ur.json
@@ -403,5 +403,29 @@
     "backupRecommend": "براہ کرم اس کے بجائے براہ راست والیوم یا ڈیٹا فولڈر (./data/) کا بیک اپ لیں۔",
     "Optional": "اختیاری",
     "or": "یا",
-    "Notification Service": "نوٹیفکیشن سروس"
+    "Notification Service": "نوٹیفکیشن سروس",
+    "maintenanceStatus-inactive": "غیر فعال",
+    "maintenanceStatus-under-maintenance": "دیکھ بھال کے تحت",
+    "maintenanceStatus-scheduled": "طے شدہ",
+    "maintenanceStatus-ended": "ختم ہوا",
+    "recurringInterval": "وقفہ",
+    "Recurring": "بار بار چلنے والا",
+    "strategyManual": "دستی طور پر فعال/غیر فعال",
+    "warningTimezone": "یہ سرور کا ٹائم زون استعمال کر رہا ہے",
+    "weekdayShortMon": "پیر",
+    "weekdayShortWed": "بدھ",
+    "weekdayShortThu": "جمعرات",
+    "weekdayShortFri": "جمعہ",
+    "weekdayShortSat": "سات",
+    "weekdayShortSun": "سورج",
+    "dayOfWeek": "ہفتہ کا دن",
+    "dayOfMonth": "مہینے کا دن",
+    "lastDay": "آخری دن",
+    "lastDay1": "مہینے کا آخری دن",
+    "lastDay2": "مہینے کا دوسرا آخری دن",
+    "lastDay3": "مہینے کا تیسرا آخری دن",
+    "lastDay4": "مہینے کا چوتھا آخری دن",
+    "pauseMaintenanceMsg": "کیا آپ واقعی روکنا چاہتے ہیں؟",
+    "No Maintenance": "کوئی دیکھ بھال نہیں",
+    "weekdayShortTue": "منگل"
 }

From 09aa7be4f5b69066698593d4fa8cafdd98bb558c Mon Sep 17 00:00:00 2001
From: Michal <black23@gmail.com>
Date: Fri, 10 Mar 2023 08:00:36 +0000
Subject: [PATCH 775/803] Translated using Weblate (Czech)

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: Michal <black23@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/cs-CZ.json | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index 5680f4eb..0144bcad 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -734,5 +734,9 @@
     "pagertreeIntegrationUrl": "Integrační URL",
     "pagertreeMedium": "Středně",
     "pagertreeHigh": "Nahlas",
-    "wayToGetPagerTreeIntegrationURL": "Po vytvoření integrace Uptime Kuma v aplikaci PagerTree zkopírujte koncový bod. Zobrazit všechny podrobnosti {0}"
+    "wayToGetPagerTreeIntegrationURL": "Po vytvoření integrace Uptime Kuma v aplikaci PagerTree zkopírujte koncový bod. Zobrazit všechny podrobnosti {0}",
+    "Add New Tag": "Přidat nový štítek",
+    "lunaseaTarget": "cíl",
+    "lunaseaDeviceID": "ID zařízení",
+    "lunaseaUserID": "ID uživatele"
 }

From 0a9ebf7fa44ce8ecbc75707802762c5bc4b931ef Mon Sep 17 00:00:00 2001
From: 401Unauthorized <hi@4o1.to>
Date: Fri, 10 Mar 2023 08:00:36 +0000
Subject: [PATCH 776/803] Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: 401Unauthorized <hi@4o1.to>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-CN.json | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json
index 5ec4e972..feb8af84 100644
--- a/src/lang/zh-CN.json
+++ b/src/lang/zh-CN.json
@@ -736,5 +736,9 @@
     "pagertreeHigh": "高",
     "pagertreeResolve": "自动解除",
     "pagertreeDoNothing": "什么都不做",
-    "wayToGetPagerTreeIntegrationURL": "在 PagerTree 中创建 Uptime Kuma 集成后,复制端点 URL 到此处。在 {0} 查看详情"
+    "wayToGetPagerTreeIntegrationURL": "在 PagerTree 中创建 Uptime Kuma 集成后,复制端点 URL 到此处。在 {0} 查看详情",
+    "Add New Tag": "添加新标签",
+    "lunaseaDeviceID": "设备ID",
+    "lunaseaTarget": "目标",
+    "lunaseaUserID": "用户ID"
 }

From 0efabb4e3933cedcd327499e519ea1cfd9bd4d8d Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 10 Mar 2023 16:16:00 +0800
Subject: [PATCH 777/803] Update to 1.21.0-beta.1

---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d568f5d3..9774f5b4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.21.0-beta.0",
+    "version": "1.21.0-beta.1",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.21.0-beta.0",
+            "version": "1.21.0-beta.1",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
diff --git a/package.json b/package.json
index 5b2bda4a..48495b1a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.21.0-beta.0",
+    "version": "1.21.0-beta.1",
     "license": "MIT",
     "repository": {
         "type": "git",

From 1e80365b739a83192c55701fa2f30454666e9907 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Sun, 12 Mar 2023 20:44:30 +0800
Subject: [PATCH 778/803] Update node-ping to 0.4.4

---
 package-lock.json | 46 +++++++++-------------------------------------
 package.json      |  2 +-
 2 files changed, 10 insertions(+), 38 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 9774f5b4..9c68def0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
-                "@louislam/ping": "~0.4.2-mod.2",
+                "@louislam/ping": "~0.4.4-mod.0",
                 "@louislam/sqlite3": "15.1.2",
                 "args-parser": "~1.3.0",
                 "axios": "~0.27.0",
@@ -4213,13 +4213,11 @@
             "integrity": "sha512-retLUN4TwCJ0QJDi9OCJwYVaXAz93NeOkEtEQL98M2bykBOxmURlP0YlfsuE46kItOOVZIWRYC3KsSLhQ1R2Qw=="
         },
         "node_modules/@louislam/ping": {
-            "version": "0.4.2-mod.2",
-            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.2.tgz",
-            "integrity": "sha512-4krrRGohYdhQOD+Mt0Q8e1Z05DEKntZ7TgiY1jYaqWrMz0H2XJyRh+mLPOUVPL5zSymiHsZiK2ZACXtp/d9Wxg==",
+            "version": "0.4.4-mod.0",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.4-mod.0.tgz",
+            "integrity": "sha512-U2ZXcgFRPmZYd/ooA8KILG4aCMBsDrGP9NDWseHriZSsKlu5Y1lf/LbenN6tnqQ9JjAsbJjqwSi3xtAcWqU+1w==",
             "dependencies": {
-                "command-exists": "~1.2.9",
-                "q": "1.x",
-                "underscore": "^1.12.0"
+                "command-exists": "~1.2.9"
             },
             "engines": {
                 "node": ">=4.0.0"
@@ -15570,15 +15568,6 @@
                 "node": ">=6"
             }
         },
-        "node_modules/q": {
-            "version": "1.5.1",
-            "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-            "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
-            "engines": {
-                "node": ">=0.6.0",
-                "teleport": ">=0.2.0"
-            }
-        },
         "node_modules/qlobber": {
             "version": "5.0.3",
             "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
@@ -17977,11 +17966,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/underscore": {
-            "version": "1.13.6",
-            "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
-            "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
-        },
         "node_modules/unicode-canonical-property-names-ecmascript": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -22231,13 +22215,11 @@
             "integrity": "sha512-retLUN4TwCJ0QJDi9OCJwYVaXAz93NeOkEtEQL98M2bykBOxmURlP0YlfsuE46kItOOVZIWRYC3KsSLhQ1R2Qw=="
         },
         "@louislam/ping": {
-            "version": "0.4.2-mod.2",
-            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.2-mod.2.tgz",
-            "integrity": "sha512-4krrRGohYdhQOD+Mt0Q8e1Z05DEKntZ7TgiY1jYaqWrMz0H2XJyRh+mLPOUVPL5zSymiHsZiK2ZACXtp/d9Wxg==",
+            "version": "0.4.4-mod.0",
+            "resolved": "https://registry.npmjs.org/@louislam/ping/-/ping-0.4.4-mod.0.tgz",
+            "integrity": "sha512-U2ZXcgFRPmZYd/ooA8KILG4aCMBsDrGP9NDWseHriZSsKlu5Y1lf/LbenN6tnqQ9JjAsbJjqwSi3xtAcWqU+1w==",
             "requires": {
-                "command-exists": "~1.2.9",
-                "q": "1.x",
-                "underscore": "^1.12.0"
+                "command-exists": "~1.2.9"
             }
         },
         "@louislam/sqlite3": {
@@ -30817,11 +30799,6 @@
             "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
             "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
         },
-        "q": {
-            "version": "1.5.1",
-            "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-            "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="
-        },
         "qlobber": {
             "version": "5.0.3",
             "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-5.0.3.tgz",
@@ -32679,11 +32656,6 @@
                 "which-boxed-primitive": "^1.0.2"
             }
         },
-        "underscore": {
-            "version": "1.13.6",
-            "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
-            "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
-        },
         "unicode-canonical-property-names-ecmascript": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
diff --git a/package.json b/package.json
index 48495b1a..5ad7876c 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,7 @@
     },
     "dependencies": {
         "@grpc/grpc-js": "~1.7.3",
-        "@louislam/ping": "~0.4.2-mod.2",
+        "@louislam/ping": "~0.4.4-mod.0",
         "@louislam/sqlite3": "15.1.2",
         "args-parser": "~1.3.0",
         "axios": "~0.27.0",

From 0778549a6d8418118075c33a81e8adcc75669542 Mon Sep 17 00:00:00 2001
From: Ghvinerias <Ghvinerias@gmail.com>
Date: Wed, 15 Mar 2023 10:57:47 +0400
Subject: [PATCH 779/803] Update i18n.js (#2927)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

I want to commit to this project by translating it to Georgian,
I added "ge" : "ქართული", "ქართული" means Georgian in Georgian language
---
 src/i18n.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/i18n.js b/src/i18n.js
index 8a8ba3d3..c33b523e 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -41,7 +41,8 @@ const languageList = {
     "el-GR": "Ελληνικά",
     "yue": "繁體中文 (廣東話 / 粵語)",
     "ro": "Limba română",
-    "ur": "Urdu"
+    "ur": "Urdu",
+    "ge": "ქართული"
 };
 
 let messages = {

From dbe73bd6ae7b2227be6573330c51d358abb0ee7f Mon Sep 17 00:00:00 2001
From: tombii <tombii@users.noreply.github.com>
Date: Wed, 15 Mar 2023 08:00:28 +0100
Subject: [PATCH 780/803] Update monitor.js (#2929)

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

diff --git a/server/model/monitor.js b/server/model/monitor.js
index 40c2e152..1e011c5a 100644
--- a/server/model/monitor.js
+++ b/server/model/monitor.js
@@ -1265,7 +1265,7 @@ class Monitor extends BeanModel {
             for (let notification of notificationList) {
                 try {
                     log.debug("monitor", "Sending to " + notification.name);
-                    await Notification.send(JSON.parse(notification.config), `[${this.name}][${this.url}] Certificate will be expired in ${daysRemaining} days`);
+                    await Notification.send(JSON.parse(notification.config), `[${this.name}][${this.url}] Certificate will expire in ${daysRemaining} days`);
                     sent = true;
                 } catch (e) {
                     log.error("monitor", "Cannot send cert notification to " + notification.name);

From 61506b1af23061efe30c9d687f50d71f197de7e6 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Tue, 14 Mar 2023 21:05:33 +0800
Subject: [PATCH 781/803] [Deploy to demo] No need to restart demo-kuma

---
 extra/deploy-demo-server.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/extra/deploy-demo-server.js b/extra/deploy-demo-server.js
index d5a517f9..2cc196b3 100644
--- a/extra/deploy-demo-server.js
+++ b/extra/deploy-demo-server.js
@@ -43,10 +43,11 @@ const prompt = (query) => new Promise((resolve) => rl.question(query, resolve));
         });
         console.log(result.stdout + result.stderr);
 
+        /*
         result = await ssh.execCommand("pm2 restart 1", {
             cwd,
         });
-        console.log(result.stdout + result.stderr);
+        console.log(result.stdout + result.stderr);*/
 
     } catch (e) {
         console.log(e);

From e5a6238cde7f56d6646a5c8b4df9c9244902cd04 Mon Sep 17 00:00:00 2001
From: 401Unauthorized <hi@4o1.to>
Date: Sun, 19 Mar 2023 20:12:25 +0800
Subject: [PATCH 782/803] chore: remove invalid template

---
 src/components/notifications/SMTP.vue | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/components/notifications/SMTP.vue b/src/components/notifications/SMTP.vue
index 54470796..1c48313c 100644
--- a/src/components/notifications/SMTP.vue
+++ b/src/components/notifications/SMTP.vue
@@ -97,7 +97,6 @@
                 (leave blank for default one)<br />
                 {{NAME}}: Service Name<br />
                 {{HOSTNAME_OR_URL}}: Hostname or URL<br />
-                {{URL}}: URL<br />
                 {{STATUS}}: Status<br />
             </div>
         </div>

From f2323b012b44c3c6f27ac4df3d153e2945919253 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 783/803] Deleted translation using Weblate (Chinese
 (Literary))

Deleted translation using Weblate (Mongolian)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
---
 src/lang/lzh.json | 1 -
 src/lang/mn.json  | 1 -
 2 files changed, 2 deletions(-)
 delete mode 100644 src/lang/lzh.json
 delete mode 100644 src/lang/mn.json

diff --git a/src/lang/lzh.json b/src/lang/lzh.json
deleted file mode 100644
index 0967ef42..00000000
--- a/src/lang/lzh.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/src/lang/mn.json b/src/lang/mn.json
deleted file mode 100644
index 0967ef42..00000000
--- a/src/lang/mn.json
+++ /dev/null
@@ -1 +0,0 @@
-{}

From 2ebbcc25a9ae6e07aae89237143a63f6370fedfa Mon Sep 17 00:00:00 2001
From: MrEddX <mreddx@chatrix.one>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 784/803] Translated using Weblate (Bulgarian)

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: MrEddX <mreddx@chatrix.one>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/bg/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/bg-BG.json | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/lang/bg-BG.json b/src/lang/bg-BG.json
index d60620a2..48b02707 100644
--- a/src/lang/bg-BG.json
+++ b/src/lang/bg-BG.json
@@ -681,7 +681,7 @@
     "infiniteRetention": "Задайте стойност 0 за безкрайно съхранение.",
     "Monitor": "Монитор | Монитори",
     "dataRetentionTimeError": "Периодът на съхранение трябва да е 0 или по-голям",
-    "confirmDeleteTagMsg": "Сигурни ли сте, че желаете да изтриете този таг? Мониторите, свързани с него, няма да бъдат изтрити.",
+    "confirmDeleteTagMsg": "Сигурни ли сте, че желаете да изтриете този етикет? Мониторите, свързани с него, няма да бъдат изтрити.",
     "promosmsAllowLongSMS": "Позволи дълъг SMS",
     "Packet Size": "Размер на пакет",
     "Custom Monitor Type": "Потребителски тип монитор",
@@ -694,7 +694,7 @@
     "confirmUninstallPlugin": "Сигурни ли сте, че желаете да деинсталирате този плъгин?",
     "markdownSupported": "Поддържа се Markdown синтаксис",
     "Google Analytics ID": "Google Analytics ID",
-    "Edit Tag": "Редактиране на таг",
+    "Edit Tag": "Редактиране на етикет",
     "Learn More": "Научете повече",
     "Server Address": "Сървър адрес",
     "notificationRegional": "Регионални",
@@ -734,5 +734,9 @@
     "wayToGetPagerTreeIntegrationURL": "След като създадете интеграция на Uptime Kuma в PagerTree, копирайте крайната точка. За пълни подробности вижте {0}",
     "pagertreeIntegrationUrl": "URL Адрес за интеграция",
     "pagertreeMedium": "Средна",
-    "pagertreeCritical": "Критична"
+    "pagertreeCritical": "Критична",
+    "Add New Tag": "Добави нов етикет",
+    "lunaseaTarget": "Цел",
+    "lunaseaDeviceID": "ID на устройството",
+    "lunaseaUserID": "ID на потребител"
 }

From 82975f8d7b3070565d85a42134bcc6465d7bcd42 Mon Sep 17 00:00:00 2001
From: Michal <black23@gmail.com>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 785/803] Translated using Weblate (Czech)

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: Michal <black23@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/cs-CZ.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/cs-CZ.json b/src/lang/cs-CZ.json
index 0144bcad..2b995328 100644
--- a/src/lang/cs-CZ.json
+++ b/src/lang/cs-CZ.json
@@ -736,7 +736,7 @@
     "pagertreeHigh": "Nahlas",
     "wayToGetPagerTreeIntegrationURL": "Po vytvoření integrace Uptime Kuma v aplikaci PagerTree zkopírujte koncový bod. Zobrazit všechny podrobnosti {0}",
     "Add New Tag": "Přidat nový štítek",
-    "lunaseaTarget": "cíl",
+    "lunaseaTarget": "Cíl",
     "lunaseaDeviceID": "ID zařízení",
     "lunaseaUserID": "ID uživatele"
 }

From c6cd0d931294894c442f4b3a69b1a94a3335f6cb Mon Sep 17 00:00:00 2001
From: Cyril59310 <archas.cyril@hotmail.fr>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 786/803] Translated using Weblate (French)

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: Cyril59310 <archas.cyril@hotmail.fr>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 1317da34..45e45876 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -734,5 +734,7 @@
     "pagertreeDoNothing": "Ne fais rien",
     "pagertreeIntegrationUrl": "URL d'intégration",
     "pagertreeCritical": "Critique",
-    "wayToGetPagerTreeIntegrationURL": "Après avoir créé l'intégration Uptime Kuma dans PagerTree, copiez le fichier Endpoint. Voir tous les détails {0}"
+    "wayToGetPagerTreeIntegrationURL": "Après avoir créé l'intégration Uptime Kuma dans PagerTree, copiez le fichier Endpoint. Voir tous les détails {0}",
+    "lunaseaDeviceID": "Identifiant de l'appareil",
+    "lunaseaUserID": "Identifiant de l'utilisateur"
 }

From 3825dd9f4283e3108e476e64b6639b8acc89840c Mon Sep 17 00:00:00 2001
From: Deathart <deathart@hotmail.fr>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 787/803] Translated using Weblate (French)

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: Deathart <deathart@hotmail.fr>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index 45e45876..ae3a75f4 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -736,5 +736,7 @@
     "pagertreeCritical": "Critique",
     "wayToGetPagerTreeIntegrationURL": "Après avoir créé l'intégration Uptime Kuma dans PagerTree, copiez le fichier Endpoint. Voir tous les détails {0}",
     "lunaseaDeviceID": "Identifiant de l'appareil",
-    "lunaseaUserID": "Identifiant de l'utilisateur"
+    "lunaseaUserID": "Identifiant de l'utilisateur",
+    "Add New Tag": "Ajouter une étiquette",
+    "lunaseaTarget": "Cible"
 }

From 0fe98de25653d42369963914931443d7e4b0ff79 Mon Sep 17 00:00:00 2001
From: Donker_Jumala <weareh0711@gmail.com>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 788/803] Translated using Weblate (Japanese)

Currently translated at 72.1% (511 of 708 strings)

Co-authored-by: Donker_Jumala <weareh0711@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ja/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ja.json | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/lang/ja.json b/src/lang/ja.json
index 3d586904..f885c175 100644
--- a/src/lang/ja.json
+++ b/src/lang/ja.json
@@ -510,5 +510,7 @@
     "Android": "Android",
     "Huawei": "Huawei",
     "Device Token": "デバイストークン",
-    "recurringIntervalMessage": "毎日1回実行する|{0} 日に1回実行する"
+    "recurringIntervalMessage": "毎日1回実行する|{0} 日に1回実行する",
+    "Add New Tag": "新しいタグを追加",
+    "statusPageMaintenanceEndDate": "終了日"
 }

From 836e1252567a7c38d87dcaae9e066d6277b05a8c Mon Sep 17 00:00:00 2001
From: Alexey <aosmirnov@gmail.com>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 789/803] Translated using Weblate (Russian)

Currently translated at 92.9% (658 of 708 strings)

Co-authored-by: Alexey <aosmirnov@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ru/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ru-RU.json | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lang/ru-RU.json b/src/lang/ru-RU.json
index 0cefb55b..3299d5ae 100644
--- a/src/lang/ru-RU.json
+++ b/src/lang/ru-RU.json
@@ -699,5 +699,6 @@
     "Clone Monitor": "Копия",
     "Clone": "Копия",
     "cloneOf": "Копия {0}",
-    "notificationRegional": "Региональный"
+    "notificationRegional": "Региональный",
+    "Add New Tag": "Добавить тег"
 }

From 4329fc675115e7425d7672cb7f81185f52f35421 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=96mer=20Faruk=20Gen=C3=A7?= <omer@farukgenc.com>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 790/803] Translated using Weblate (Turkish)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: Ömer Faruk Genç <omer@farukgenc.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/tr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/tr-TR.json | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/lang/tr-TR.json b/src/lang/tr-TR.json
index 95db2507..78f1e08e 100644
--- a/src/lang/tr-TR.json
+++ b/src/lang/tr-TR.json
@@ -734,5 +734,9 @@
     "pagertreeDoNothing": "Hiçbir şey yapma",
     "wayToGetPagerTreeIntegrationURL": "PagerTree'de Uptime Kuma entegrasyonunu oluşturduktan sonra Endpoint'i kopyalayın. Tüm ayrıntıları görün {0}",
     "pagertreeIntegrationUrl": "Entegrasyon URL",
-    "pagertreeResolve": "Otomatik Çöz"
+    "pagertreeResolve": "Otomatik Çöz",
+    "lunaseaTarget": "Hedef",
+    "Add New Tag": "Yeni Etiket Ekle",
+    "lunaseaDeviceID": "Cihaz ID",
+    "lunaseaUserID": "Kullanıcı ID"
 }

From 9ecb890f56a0e2ef021b5c4671074b29f9fc0e35 Mon Sep 17 00:00:00 2001
From: stanol <stanol777@gmail.com>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 791/803] Translated using Weblate (Ukrainian)

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: stanol <stanol777@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/uk/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/uk-UA.json | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/lang/uk-UA.json b/src/lang/uk-UA.json
index e464e683..125dec44 100644
--- a/src/lang/uk-UA.json
+++ b/src/lang/uk-UA.json
@@ -740,5 +740,9 @@
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Довготривалий токен доступу можна створити, натиснувши на ім'я вашого профілю (внизу ліворуч), прокрутивши його донизу і натиснувши кнопку Створити токен. ",
     "high": "високий",
     "Disable": "Вимкнути",
-    "Resend Notification if Down X times consecutively": "Повторно надіслати сповіщення, якщо було падіння X разів поспіль"
+    "Resend Notification if Down X times consecutively": "Повторно надіслати сповіщення, якщо було падіння X разів поспіль",
+    "lunaseaTarget": "Ціль",
+    "Add New Tag": "Додати новий тег",
+    "lunaseaDeviceID": "ID пристрою",
+    "lunaseaUserID": "ID користувача"
 }

From b4b2ae55c0f7fef65387b0208fa0046f8e827662 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Mon, 20 Mar 2023 09:57:48 +0000
Subject: [PATCH 792/803] Translated using Weblate (Chinese (Traditional, Hong
 Kong))

Currently translated at 95.6% (677 of 708 strings)

Co-authored-by: Nelson Chan <chakflying@hotmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hant_HK/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/zh-HK.json | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/lang/zh-HK.json b/src/lang/zh-HK.json
index 434c3147..e3a8d5ba 100644
--- a/src/lang/zh-HK.json
+++ b/src/lang/zh-HK.json
@@ -376,10 +376,10 @@
     "default": "預設",
     "enabled": "啟用",
     "setAsDefault": "設為預設",
-    "deleteProxyMsg": "您確定要為所有監測器刪除此代理伺服器嗎?",
-    "proxyDescription": "必須將代理伺服器指派給監測器才能運作。",
-    "enableProxyDescription": "此代理伺服器在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用代理伺服器。",
-    "setAsDefaultProxyDescription": "預設情況下,新監測器將啟用此代理伺服器。您仍可分別停用各監測器的代理伺服器。",
+    "deleteProxyMsg": "您確定要為所有監測器刪除此 Proxy 嗎?",
+    "proxyDescription": "必須將 Proxy 指派給監測器才能運作。",
+    "enableProxyDescription": "此 Proxy 在啟用前不會在監測器上生效,您可以藉由控制啟用狀態來暫時對所有的監測器停用 Proxy。",
+    "setAsDefaultProxyDescription": "預設情況下,新監測器將啟用此 Proxy。您仍可分別停用各監測器的 Proxy。",
     "Maintenance": "維護",
     "statusMaintenance": "維護中",
     "Enable DNS Cache": "啟用 DNS 快取",
@@ -430,8 +430,8 @@
     "Remove Token": "移除 Token",
     "Start": "開始",
     "User": "使用者",
-    "trustProxyDescription": "信任 'X-Forwarded-*' 的 Header。如果您想取得正確的 Client IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache 之後,您應啟用此選項。",
-    "Reverse Proxy": "Reverse Proxy",
+    "trustProxyDescription": "信任 'X-Forwarded-*' 的 Header。如果您想取得正確的 Client IP,且您的 Uptime Kuma 架設於 Nginx 或 Apache Proxy 之後,您應啟用此選項。",
+    "Reverse Proxy": "反向 Proxy",
     "Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "若要取得長期有效 Access Token,請按您的個人檔案名稱 (左下角),捲動至最下方,然後按建立 Token。 ",
     "A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "您可以在 Home Assistant 中查看通知服務的列表,在\"開發者工具 > 服務\"下搜尋\"通知\"來找到您的裝置/手機的名稱。",
     "loadingError": "未能取得數據,請重新再試。",
@@ -483,7 +483,7 @@
     "API Key": "API Key",
     "Show update if available": "有更新時顯示",
     "Also check beta release": "檢查 Beta 版本",
-    "Using a Reverse Proxy?": "正在使用 Reverse Proxy?",
+    "Using a Reverse Proxy?": "正在使用反向代理 (Reverse Proxy)?",
     "Check how to config it for WebSocket": "查看如何加入 WebSocket 設定",
     "Steam Game Server": "Steam 遊戲 Server",
     "Most likely causes:": "最可能原因:",
@@ -702,5 +702,9 @@
     "Platform": "平台",
     "Device Token": "裝置 Token",
     "telegramProtectContent": "禁止轉發/儲存",
-    "telegramProtectContentDescription": "如果選擇,用戶將不能轉發/儲存收到的信息。"
+    "telegramProtectContentDescription": "如果選擇,用戶將不能轉發/儲存收到的信息。",
+    "Add New Tag": "加新標籤",
+    "Economy": "經濟",
+    "Lowcost": "平價",
+    "high": "高價"
 }

From 350451edc80058436d4cf15d9d50df176f7de715 Mon Sep 17 00:00:00 2001
From: DoyunShin <doyun.shin@gmail.com>
Date: Mon, 20 Mar 2023 09:57:49 +0000
Subject: [PATCH 793/803] Translated using Weblate (Korean)

Currently translated at 95.6% (677 of 708 strings)

Translated using Weblate (Korean)

Currently translated at 95.0% (673 of 708 strings)

Co-authored-by: DoyunShin <doyun.shin@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ko/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ko-KR.json | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
index 079c9f58..01b19eb6 100644
--- a/src/lang/ko-KR.json
+++ b/src/lang/ko-KR.json
@@ -208,7 +208,7 @@
     "smtpBCC": "숨은 참조",
     "discord": "Discord",
     "Discord Webhook URL": "Discord 웹훅 URL",
-    "wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹후크 보기 -> 새 웹후크에서 얻을 수 있어요",
+    "wayToGetDiscordURL": "서버 설정 -> 연동 -> 웹훅 보기 -> 새 웹훅 에서 얻을 수 있어요",
     "Bot Display Name": "표시 이름",
     "Prefix Custom Message": "접두사 메시지",
     "Hello @everyone is...": "{'@'}everyone 서버 상태 알림이에요…",
@@ -691,5 +691,25 @@
     "webhookAdditionalHeadersTitle": "추가 헤더",
     "webhookAdditionalHeadersDesc": "웹훅과 함께 전송될 추가 헤더를 설정해요.",
     "HTTP Headers": "HTTP 헤더",
-    "Trust Proxy": "프록시 신뢰"
+    "Trust Proxy": "프록시 신뢰",
+    "API Keys": "API 키",
+    "markdownSupported": "Markdown 문법이 지원됨",
+    "telegramMessageThreadID": "(선택) 메시지 쓰레드 ID",
+    "Clone": "복제",
+    "cloneOf": "{0}의 복제본",
+    "Clone Monitor": "모니터링 복제",
+    "telegramProtectContent": "포워딩/저장 보호",
+    "telegramProtectContentDescription": "활성화 시, 텔레그램 봇 메시지는 포워딩 및 저장으로부터 보호됩니다.",
+    "telegramSendSilentlyDescription": "조용히 메시지를 보냅니다. 사용자들은 무음으로 알림을 받습니다.",
+    "telegramSendSilently": "무음 알림",
+    "Add New Tag": "태그 추가",
+    "Edit Tag": "태그 수정",
+    "Server Address": "서버 주소",
+    "Learn More": "자세히 알아보기",
+    "Continue": "계속",
+    "Key Added": "API 키 추가됨",
+    "No API Keys": "API키 없음",
+    "disableAPIKeyMsg": "이 API키를 정말로 비활성화하시겠습니까?",
+    "deleteAPIKeyMsg": "이 API키를 정말로 삭제하시겠습니까?",
+    "Generate": "생성"
 }

From abcbc3c55ec9d3a5760acf24521a311372ac914d Mon Sep 17 00:00:00 2001
From: Tomasz Bielinski <tomasz@bielinski.sk>
Date: Mon, 20 Mar 2023 09:57:49 +0000
Subject: [PATCH 794/803] Translated using Weblate (Slovak)

Currently translated at 11.7% (83 of 708 strings)

Added translation using Weblate (Slovak)

Co-authored-by: Tomasz Bielinski <tomasz@bielinski.sk>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/sk/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/sk.json | 85 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)
 create mode 100644 src/lang/sk.json

diff --git a/src/lang/sk.json b/src/lang/sk.json
new file mode 100644
index 00000000..3d4b886a
--- /dev/null
+++ b/src/lang/sk.json
@@ -0,0 +1,85 @@
+{
+    "Settings": "Nastavenia",
+    "Help": "Nápoveda",
+    "New Update": "Nová aktualizácia",
+    "Language": "Jazyk",
+    "Appearance": "Vzhľad",
+    "Theme": "Téma",
+    "General": "Základné",
+    "Primary Base URL": "Základná URL",
+    "Version": "Verzia",
+    "List": "Zoznam",
+    "Add": "Pridať",
+    "Add New Monitor": "Pridať nové Sledovanie",
+    "Quick Stats": "Rýchly prehľad",
+    "Pending": "Čaká sa",
+    "statusMaintenance": "Údržba",
+    "Maintenance": "Údržba",
+    "General Monitor Type": "Základný typ Sledovania",
+    "Passive Monitor Type": "Pasívny typ Sledovania",
+    "Specific Monitor Type": "Špecifický typ Sledovania",
+    "pauseDashboardHome": "Pauza",
+    "Pause": "Pauza",
+    "Status": "Stav",
+    "Message": "Správa",
+    "No important events": "Žiadne dôležité udalosti",
+    "Edit": "Upraviť",
+    "Delete": "Odstrániť",
+    "Current": "Aktuálne",
+    "Cert Exp.": "Platnosť cert.",
+    "day": "deň | dni",
+    "hour": "hodina",
+    "Response": "Odpoveď",
+    "Ping": "Ping",
+    "Keyword": "Kľúčové slovo",
+    "Friendly Name": "Názov",
+    "Port": "Port",
+    "Retries": "Opakovania",
+    "Resend Notification if Down X times consecutively": "Poslať oznámenie znovu, ak je nedostupné X-krát za sebou",
+    "Advanced": "Pokročilé",
+    "checkEverySecond": "Skontrolovať každých {0} sekúnd",
+    "retryCheckEverySecond": "Zopakovať každých {0} sekúnd",
+    "resendEveryXTimes": "Znovu poslať každých {0} krát",
+    "resendDisabled": "Opakované odoslanie vypnuté",
+    "ignoreTLSError": "Ignorovať TLS/SSL chyby pre HTTPS stránky",
+    "upsideDownModeDescription": "Obrátiť stav. Pokiaľ je služba dostupná, zobrazuje sa ako NEDOSTUPNÁ.",
+    "Upside Down Mode": "Obrátený režim",
+    "Max. Redirects": "Max. počet presmerovaní",
+    "Accepted Status Codes": "Akceptované stavové kódy",
+    "Push URL": "Push URL",
+    "Save": "Uložiť",
+    "Notifications": "Notifikácie",
+    "Not available, please setup.": "Nedostupné, prosím nastavte.",
+    "Setup Notification": "Nastavenie notifikácií",
+    "Dark": "Tmavá",
+    "Light": "Svetlá",
+    "Auto": "Automaticky",
+    "Normal": "Normálna",
+    "Bottom": "Dole",
+    "None": "Žiadne",
+    "Timezone": "Časová zóna",
+    "languageName": "Slovenčina",
+    "Dashboard": "Dashboard",
+    "Check Update On GitHub": "Skontrolovať aktualizáciu na GitHub-e",
+    "Up": "Dostupné",
+    "Down": "Nedostupné",
+    "Unknown": "Neznáme",
+    "markdownSupported": "Podpora Markdown syntaxe",
+    "Name": "Názov",
+    "DateTime": "Dátum a čas",
+    "Resume": "Pokračovať",
+    "Uptime": "Doba prevádzky",
+    "Monitor": "Sledovanie | Sledovania",
+    "-day": "-dní",
+    "-hour": "-hodín",
+    "Monitor Type": "Typ Sledovania",
+    "URL": "URL",
+    "Hostname": "Adresa",
+    "Heartbeat Interval": "Heartbeat Interval",
+    "Heartbeat Retry Interval": "Interval opakovania pre Heartbeat",
+    "retriesDescription": "Maximálny počet opakovaní pred tým, ako je služba označená ako nedostupná a je zaslaná notifikácia",
+    "maxRedirectDescription": "Maximálny počet presmerovaní. Hodnota 0 vypne presmerovania.",
+    "needPushEvery": "Tuto adresu by ste mali volať každých {0} sekúnd.",
+    "pushOptionalParams": "Voliteľné parametre: {0}",
+    "Theme - Heartbeat Bar": "Téma - Heartbeat riadok"
+}

From c238508060008979a113918ff698cd53ea1e2681 Mon Sep 17 00:00:00 2001
From: Ghvinerias <Ghvinerias@gmail.com>
Date: Mon, 20 Mar 2023 09:57:49 +0000
Subject: [PATCH 795/803] Translated using Weblate (Georgian)

Currently translated at 1.6% (12 of 708 strings)

Added translation using Weblate (Georgian)

Co-authored-by: Ghvinerias <Ghvinerias@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ka/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ka.json | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 src/lang/ka.json

diff --git a/src/lang/ka.json b/src/lang/ka.json
new file mode 100644
index 00000000..8fe285d3
--- /dev/null
+++ b/src/lang/ka.json
@@ -0,0 +1,21 @@
+{
+    "Dashboard": "დაფა",
+    "Help": "დახმარება",
+    "New Update": "განახლება",
+    "Language": "ენა",
+    "Appearance": "ვიზუალი",
+    "Theme": "სტილი",
+    "Game": "თამაში",
+    "Version": "ვერსია",
+    "Quick Stats": "თვალის გადავლება",
+    "Up": "მაღლა",
+    "Pending": "მოლოდინი",
+    "languageName": "English",
+    "Settings": "კონფიგურაცია",
+    "General": "ძირითადი",
+    "Check Update On GitHub": "GitHub_ზე განახლების შემოწმება",
+    "List": "სია",
+    "Add": "დამატება",
+    "Add New Monitor": "ახალი მონიტორის დამატება",
+    "Down": "დაბლა"
+}

From a40c03f6f371ee8ac35c81e28659c0879bd8d296 Mon Sep 17 00:00:00 2001
From: Marco <marco@nanoweb.ch>
Date: Mon, 20 Mar 2023 09:57:49 +0000
Subject: [PATCH 796/803] Translated using Weblate (German)

Currently translated at 100.0% (708 of 708 strings)

Translated using Weblate (German (Switzerland))

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: Marco <marco@nanoweb.ch>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de/
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/de_CH/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/de-CH.json | 6 +++++-
 src/lang/de-DE.json | 6 +++++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/lang/de-CH.json b/src/lang/de-CH.json
index f303a6f9..db221745 100644
--- a/src/lang/de-CH.json
+++ b/src/lang/de-CH.json
@@ -731,5 +731,9 @@
     "smseagleGroup": "Telefonbuch Gruppenname(n)",
     "smseagleRecipient": "Empfänger (mehrere müssen durch Komma getrennt werden)",
     "API Keys": "API Schlüssel",
-    "Continue": "Weiter"
+    "Continue": "Weiter",
+    "Add New Tag": "Neuen Tag hinzufügen",
+    "lunaseaTarget": "Ziel",
+    "lunaseaDeviceID": "Geräte-ID",
+    "lunaseaUserID": "Benutzer-ID"
 }
diff --git a/src/lang/de-DE.json b/src/lang/de-DE.json
index 07fd82e4..8b337607 100644
--- a/src/lang/de-DE.json
+++ b/src/lang/de-DE.json
@@ -734,5 +734,9 @@
     "telegramMessageThreadID": "(Optional) Nachrichten Thread ID",
     "telegramMessageThreadIDDescription": "Optionale eindeutige Kennung für den Ziel-Thread (Thema) des Forums; nur für Forum-Supergroups",
     "telegramSendSilently": "Stumm Senden",
-    "telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton."
+    "telegramSendSilentlyDescription": "Sende die Nachricht stumm. Nutzer bekommen eine Benachrichtigung ohne Ton.",
+    "Add New Tag": "Neuen Tag hinzufügen",
+    "lunaseaDeviceID": "Geräte-ID",
+    "lunaseaTarget": "Ziel",
+    "lunaseaUserID": "Benutzer-ID"
 }

From da225a225fad31c0f391eb0d3ef4e87fd2231b7d Mon Sep 17 00:00:00 2001
From: Mikolajek <weblate-1530@npk.pm>
Date: Mon, 20 Mar 2023 09:57:49 +0000
Subject: [PATCH 797/803] Translated using Weblate (French)

Currently translated at 100.0% (708 of 708 strings)

Co-authored-by: Mikolajek <weblate-1530@npk.pm>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fr/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/fr-FR.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/lang/fr-FR.json b/src/lang/fr-FR.json
index ae3a75f4..47f3ee25 100644
--- a/src/lang/fr-FR.json
+++ b/src/lang/fr-FR.json
@@ -73,11 +73,11 @@
     "Delete": "Supprimer",
     "Current": "Actuellement",
     "Uptime": "Disponibilité",
-    "Cert Exp.": "Expiration SSL.",
+    "Cert Exp.": "Expiration SSL",
     "day": "jour | jours",
     "-day": "-jour",
     "hour": "heure",
-    "-hour": "-heure",
+    "-hour": "heures",
     "Response": "Temps de réponse",
     "Ping": "Ping",
     "Monitor Type": "Type de sonde",

From 02fde56aec67e51341be65a543b0353f71299dff Mon Sep 17 00:00:00 2001
From: Bart Callant <bart@callant.net>
Date: Mon, 20 Mar 2023 09:57:49 +0000
Subject: [PATCH 798/803] Translated using Weblate (Dutch)

Currently translated at 94.7% (671 of 708 strings)

Co-authored-by: Bart Callant <bart@callant.net>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/nl/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/nl-NL.json | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/lang/nl-NL.json b/src/lang/nl-NL.json
index ddd313e3..09f97e85 100644
--- a/src/lang/nl-NL.json
+++ b/src/lang/nl-NL.json
@@ -696,5 +696,12 @@
     "markdownSupported": "Markdown syntax ondersteund",
     "Resend Notification if Down X times consecutively": "Melding x keer opnieuw sturen als monitor offline is",
     "loadingError": "Kan de data niet ophalen, probeer het later opnieuw.",
-    "smseagleContact": "Telefoonboek contact namen"
+    "smseagleContact": "Telefoonboek contact namen",
+    "apiKey-active": "Actief",
+    "apiKey-expired": "Verlopen",
+    "pagertreeLow": "Laag",
+    "pagertreeHigh": "Hoog",
+    "Clone": "Dupliceer",
+    "cloneOf": "Duplicaat van {0}",
+    "Add New Tag": "Voeg nieuw label toe"
 }

From 0b91391cedaf5cbda06cb94030e3cba9518c1434 Mon Sep 17 00:00:00 2001
From: Yoswaris Lawpaiboon <konglha19@outlook.co.th>
Date: Mon, 20 Mar 2023 09:57:49 +0000
Subject: [PATCH 799/803] Translated using Weblate (Thai)

Currently translated at 81.3% (576 of 708 strings)

Co-authored-by: Yoswaris Lawpaiboon <konglha19@outlook.co.th>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/th/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/th-TH.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/lang/th-TH.json b/src/lang/th-TH.json
index c0c24760..f43dc63b 100644
--- a/src/lang/th-TH.json
+++ b/src/lang/th-TH.json
@@ -4,7 +4,7 @@
     "retryCheckEverySecond": "ลองใหม่ทุก {0} วินาที",
     "retriesDescription": "จำนวนครั้งสูงสุดที่จะลองก่อนบริการถูกระบุว่าไม่สามารถใช้งานได้และส่งการแจ้งเตือน",
     "ignoreTLSError": "ไม่สนใจข้อผิดพลาด TLS/SSL สำหรับเว็บไซต์ HTTPS",
-    "upsideDownModeDescription": "กลับด้านสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
+    "upsideDownModeDescription": "สลับสถานะ เช่น ถ้าบริการสามารถใช้งานได้จะถูกเปลี่ยนเป็นใช้งานไม่ได้",
     "maxRedirectDescription": "จำนวนครั้งสูงสุดที่จะเปลี่ยนเส้นทาง, ตั้งเป็น 0 เพื่อปิดการเปลี่ยนเส้นทาง",
     "acceptedStatusCodesDescription": "เลือกรหัสสถานะที่ถือว่าการตอบกลับสำเร็จ",
     "passwordNotMatchMsg": "รหัสผ่านไม่ตรงกัน",
@@ -30,7 +30,7 @@
     "Dashboard": "แผงควบคุม",
     "New Update": "อัพเดทใหม่",
     "Language": "ภาษา",
-    "Appearance": "รูปร่าง",
+    "Appearance": "หน้าตา",
     "Theme": "หน้าตา",
     "General": "ทั่วไป",
     "Primary Base URL": "URL หลัก",
@@ -73,7 +73,7 @@
     "Retries": "จำนวนครั้งที่จะลองใหม่",
     "Heartbeat Retry Interval": "ระยะห่างระหว่างการทดสอบใหม่หลังจากไม่สำเร็จ",
     "Advanced": "ขั้นสูง",
-    "Upside Down Mode": "โหมดกลับด้าน",
+    "Upside Down Mode": "โหมดสลับ",
     "Max. Redirects": "จำนวนการเปลี่ยนเส้นทางสูงสุด",
     "Accepted Status Codes": "รหัสสถานะที่ยอมรับ",
     "Push URL": "URL เป้าหมาย",

From 0cfd3fa642b5afccc54af727a5d2945d44b7396a Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 20 Mar 2023 09:57:49 +0000
Subject: [PATCH 800/803] Translated using Weblate (Georgian)

Currently translated at 1.5% (11 of 708 strings)

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ka/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ka.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/lang/ka.json b/src/lang/ka.json
index 8fe285d3..2617e17c 100644
--- a/src/lang/ka.json
+++ b/src/lang/ka.json
@@ -10,7 +10,7 @@
     "Quick Stats": "თვალის გადავლება",
     "Up": "მაღლა",
     "Pending": "მოლოდინი",
-    "languageName": "English",
+    "languageName": "Georgian",
     "Settings": "კონფიგურაცია",
     "General": "ძირითადი",
     "Check Update On GitHub": "GitHub_ზე განახლების შემოწმება",

From df975c2750794eb92bf53cf57f1478038f7778f1 Mon Sep 17 00:00:00 2001
From: Alanimdeo <alan@imdeo.kr>
Date: Mon, 20 Mar 2023 09:57:49 +0000
Subject: [PATCH 801/803] Translated using Weblate (Korean)

Currently translated at 97.1% (688 of 708 strings)

Co-authored-by: Alanimdeo <alan@imdeo.kr>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ko/
Translation: Uptime Kuma/Uptime Kuma
---
 src/lang/ko-KR.json | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/lang/ko-KR.json b/src/lang/ko-KR.json
index 01b19eb6..801ea1a5 100644
--- a/src/lang/ko-KR.json
+++ b/src/lang/ko-KR.json
@@ -694,7 +694,7 @@
     "Trust Proxy": "프록시 신뢰",
     "API Keys": "API 키",
     "markdownSupported": "Markdown 문법이 지원됨",
-    "telegramMessageThreadID": "(선택) 메시지 쓰레드 ID",
+    "telegramMessageThreadID": "(선택) 메시지 스레드 ID",
     "Clone": "복제",
     "cloneOf": "{0}의 복제본",
     "Clone Monitor": "모니터링 복제",
@@ -707,9 +707,17 @@
     "Server Address": "서버 주소",
     "Learn More": "자세히 알아보기",
     "Continue": "계속",
-    "Key Added": "API 키 추가됨",
-    "No API Keys": "API키 없음",
+    "Key Added": "키 추가됨",
+    "No API Keys": "API 키 없음",
     "disableAPIKeyMsg": "이 API키를 정말로 비활성화하시겠습니까?",
     "deleteAPIKeyMsg": "이 API키를 정말로 삭제하시겠습니까?",
-    "Generate": "생성"
+    "Generate": "생성",
+    "Body Encoding": "Body 인코딩",
+    "Expiry": "만료",
+    "Expiry date": "만료 날짜",
+    "Don't expire": "만료되지 않음",
+    "notificationRegional": "지역별",
+    "Google Analytics ID": "Google Analytics ID",
+    "Add API Key": "API 키 추가",
+    "apiKeyAddedMsg": "API 키가 추가되었습니다. 다시 표시되지 않을 것이므로 메모해 두세요."
 }

From 1973db28bfd8f2d1ef5aeef9683cef4089a3736e Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 20 Mar 2023 18:02:24 +0800
Subject: [PATCH 802/803] minor

---
 extra/sort-contributors.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/extra/sort-contributors.js b/extra/sort-contributors.js
index 418bc233..b60d191f 100644
--- a/extra/sort-contributors.js
+++ b/extra/sort-contributors.js
@@ -13,7 +13,7 @@ lines = lines.filter((line) => line !== "");
 lines = [ ...new Set(lines) ];
 
 // Remove @weblate and @UptimeKumaBot
-lines = lines.filter((line) => line !== "@weblate" && line !== "@UptimeKumaBot");
+lines = lines.filter((line) => line !== "@weblate" && line !== "@UptimeKumaBot" && line !== "@louislam");
 
 // Sort the lines
 lines = lines.sort();

From 72317633d982a111f74c23c6b675bdba93e8f6aa Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Mon, 20 Mar 2023 18:07:54 +0800
Subject: [PATCH 803/803] Update to 1.21.0

---
 package-lock.json | 4 ++--
 package.json      | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 9c68def0..060a42fb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.21.0-beta.1",
+    "version": "1.21.0",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.21.0-beta.1",
+            "version": "1.21.0",
             "license": "MIT",
             "dependencies": {
                 "@grpc/grpc-js": "~1.7.3",
diff --git a/package.json b/package.json
index 5ad7876c..3ef2f0c0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.21.0-beta.1",
+    "version": "1.21.0",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -39,7 +39,7 @@
         "build-docker-nightly-amd64": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test --target pr-test . --push",
         "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
-        "setup": "git checkout 1.20.2 && npm ci --production && npm run download-dist",
+        "setup": "git checkout 1.21.0 && npm ci --production && npm run download-dist",
         "download-dist": "node extra/download-dist.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",